Compare commits

...

238 Commits

Author SHA1 Message Date
sdanthinne ad5e72aaf1 added .jpeg to support photo viewing from iOS uploads 2023-05-12 21:09:30 +01:00
renovate e2c9e83c2a chore(deps): update dependency @vitejs/plugin-vue to v4.2.3 2023-05-12 11:04:45 +00:00
renovate cd434a0e3e chore(deps): update dependency @types/node to v18.16.8 2023-05-12 07:06:52 +00:00
renovate 9f293af804 chore(deps): update dependency @vue/tsconfig to v0.4.0 2023-05-12 07:06:24 +00:00
renovate b175e00cfe chore(deps): update dependency @tsconfig/node18 to v2.0.1 2023-05-12 05:04:41 +00:00
Frederick [Bot] 19dd82d62a [skip ci] Updated translations via Crowdin 2023-05-12 00:29:44 +00:00
renovate b3ddc9465a chore(deps): update dependency @vitejs/plugin-vue to v4.2.2 2023-05-11 19:57:40 +00:00
renovate 6b38f17d32 fix(deps): update dependency vue-router to v4.2.0 2023-05-11 19:57:25 +00:00
renovate 86449d4912 fix(deps): update dependency marked to v5.0.2 2023-05-11 19:57:07 +00:00
renovate 145d756251 chore(deps): update dependency @faker-js/faker to v8 2023-05-11 18:05:10 +00:00
renovate 838a11a2f6 chore(deps): update dependency eslint-plugin-vue to v9.12.0 2023-05-10 14:04:39 +00:00
renovate 3bfd3210b0 chore(deps): update dependency @types/node to v18.16.7 2023-05-10 09:46:06 +00:00
renovate e933bfa99e fix(deps): update sentry-javascript monorepo to v7.51.2 2023-05-10 09:14:43 +00:00
renovate f6a37a54d0 fix(deps): update dependency pinia to v2.0.36 2023-05-10 09:14:33 +00:00
primeapple e00c9bb1af feat: add hotkeys for priority, delete and favorite on the `TaskDetailView` (#3400)
Reviewed-on: vikunja/frontend#3400
Reviewed-by: konrad <k@knt.li>
Co-authored-by: primeapple <toni.mueller.web@mailbox.org>
Co-committed-by: primeapple <toni.mueller.web@mailbox.org>
2023-05-10 09:14:07 +00:00
kolaente 018707c3d5
fix(ci): disable puppeteer chrome download 2023-05-10 10:42:44 +02:00
renovate 386727f6c5 chore(deps): update dependency @types/node to v18.16.6 2023-05-10 08:09:35 +00:00
renovate a29ce36d6c chore(deps): update typescript-eslint monorepo to v5.59.5 2023-05-10 07:05:09 +00:00
renovate 7aed16bd6f chore(deps): update dependency rollup to v3.21.6 2023-05-10 06:03:37 +00:00
renovate b1f3ca6e59 chore(deps): update pnpm to v8.5.0 2023-05-10 06:03:09 +00:00
renovate 4c0b8a06c5 chore(deps): update dependency cypress to v12.12.0 2023-05-09 23:05:25 +00:00
renovate 60647c50ac chore(deps): update dependency caniuse-lite to v1.0.30001486 2023-05-08 07:11:25 +00:00
renovate 59eaf1849e chore(deps): update dependency happy-dom to v9.10.9 2023-05-08 00:05:41 +00:00
renovate fb57339050 chore(deps): update dependency eslint-plugin-vue to v9.11.1 2023-05-07 17:04:47 +00:00
renovate f9831a6ad8 fix(deps): update dependency marked to v5.0.1 2023-05-06 21:04:51 +00:00
renovate f25c67f80a chore(deps): update dependency eslint to v8.40.0 2023-05-06 15:26:02 +00:00
renovate d3b0b97192 chore(deps): update dependency @types/node to v18.16.5 2023-05-06 15:25:42 +00:00
renovate fa3be219a8 fix(deps): update dependency dompurify to v3.0.3 2023-05-06 13:04:56 +00:00
renovate c22702d911 chore(deps): update dependency @types/node to v18.16.4 2023-05-05 14:04:43 +00:00
renovate b25c5ff547 chore(deps): update dependency vite to v4.3.5 2023-05-05 11:04:43 +00:00
renovate 2e0a097806 chore(deps): update dependency rollup to v3.21.5 2023-05-05 05:04:46 +00:00
renovate c2083f7924 fix(deps): update sentry-javascript monorepo to v7.51.0 2023-05-04 16:05:24 +00:00
renovate 8923261e5b fix(deps): update dependency ufo to v1.1.2 2023-05-04 07:35:00 +00:00
renovate 5391df56b0 chore(deps): update dependency vue-tsc to v1.6.4 2023-05-04 01:04:54 +00:00
renovate d2b1f5780e chore(deps): update dependency vitest to v0.31.0 2023-05-03 19:52:49 +00:00
renovate 1717e968e1 chore(deps): update dependency rollup to v3.21.4 2023-05-03 19:04:31 +00:00
renovate 2c29bb3971 chore(deps): update pnpm to v8.4.0 2023-05-02 14:04:09 +00:00
renovate 37b8218a0a chore(deps): update node.js to v20 (#3411)
Reviewed-on: vikunja/frontend#3411
Co-authored-by: renovate <renovatebot@kolaente.de>
Co-committed-by: renovate <renovatebot@kolaente.de>
2023-05-02 13:35:04 +00:00
konrad ca7bbb5b91 chore(ci): remove netlify dependency (#3459)
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#3459
2023-05-02 10:10:14 +00:00
renovate 2f3c008d2b chore(deps): update dependency vite to v4.3.4 2023-05-02 08:04:40 +00:00
renovate c2722b7c3d fix(deps): update dependency @vueuse/core to v10.1.2 2023-05-02 07:18:12 +00:00
renovate 312abd907f chore(deps): update dependency rollup to v3.21.3 2023-05-02 07:18:02 +00:00
renovate 1b73c1ed64 chore(deps): update dependency vue-tsc to v1.6.3 2023-05-02 07:17:43 +00:00
renovate d442d6653b fix(deps): update dependency marked to v5 2023-05-02 05:05:40 +00:00
renovate 758b8d6e2b chore(deps): update typescript-eslint monorepo to v5.59.2 2023-05-01 18:04:39 +00:00
renovate 416fd2e2a7 chore(deps): update dependency @types/marked to v4.3.0 2023-05-01 16:45:51 +00:00
renovate 15a8335f1a chore(deps): update dependency vue-tsc to v1.6.2 2023-05-01 14:04:42 +00:00
renovate c689583669 chore(deps): update dependency netlify-cli to v14.3.1 2023-05-01 10:44:11 +00:00
renovate 7a43a7acc9 chore(deps): update dependency happy-dom to v9.10.1 2023-05-01 00:04:51 +00:00
renovate 8843418161 fix(deps): update dependency date-fns to v2.30.0 2023-04-30 06:57:42 +00:00
renovate 7c1eab13ae chore(deps): update dependency rollup to v3.21.2 2023-04-30 06:04:44 +00:00
renovate 5a69036da7 fix(deps): update dependency highlight.js to v11.8.0 2023-04-29 14:04:50 +00:00
renovate 2ad3458873 chore(deps): update dependency @types/node to v18.16.3 2023-04-29 07:04:40 +00:00
renovate eb464343e8 chore(deps): update dependency rollup to v3.21.1 2023-04-29 06:04:42 +00:00
kolaente 2f18d0cbad
fix(docker): don't set nginx worker rlimit
Resolves https://community.vikunja.io/t/helm-chart-frontend-pod-does-not-start-because-of-permission-issues-in-raspberry-pie-4-k3s/1286
2023-04-28 10:31:15 +02:00
renovate 6cd463a514 chore(deps): pin dependency @tsconfig/node18 to 2.0.0 2023-04-28 08:04:35 +00:00
kolaente 05b70632c5
fix: tsconfig as per https://github.com/vuejs/tsconfig#configuration-for-node-environments 2023-04-28 09:30:45 +02:00
kolaente ca9fe6ff21
fix: tsconfig as per https://github.com/vuejs/tsconfig#configuration-for-node-environments 2023-04-28 09:16:54 +02:00
renovate e5754300de chore(deps): update dependency @vue/tsconfig to v0.3.2 2023-04-28 07:04:31 +00:00
renovate 65134048bf chore(deps): update dependency @vitejs/plugin-vue to v4.2.1 2023-04-28 06:04:35 +00:00
renovate 8339a99747 chore(deps): update dependency @types/node to v18.16.2 2023-04-28 05:17:36 +00:00
renovate 3e1ae41e70 fix(deps): update dependency axios to v1.4.0 2023-04-28 00:04:55 +00:00
renovate f757ba3441 chore(deps): update dependency vue-tsc to v1.6.1 2023-04-27 19:04:37 +00:00
renovate 6499c9cb5b fix(deps): update sentry-javascript monorepo to v7.50.0 2023-04-27 09:39:32 +00:00
renovate 28e5440d8b fix(deps): update dependency codemirror to v5.65.13 2023-04-27 09:04:38 +00:00
renovate fef8c4d0f4 chore(deps): update dependency vue-tsc to v1.6.0 2023-04-26 21:06:27 +00:00
renovate 99e5059c64 chore(deps): update dependency cypress to v12.11.0 2023-04-26 18:04:42 +00:00
renovate 5df4f39d95 chore(deps): update dependency vite to v4.3.3 2023-04-26 15:04:55 +00:00
renovate 7ec5a70ccb chore(deps): update dependency sass to v1.62.1 2023-04-26 10:05:07 +00:00
renovate 72fcab6e78 chore(deps): update dependency @types/node to v18.16.1 2023-04-26 09:04:23 +00:00
kolaente 292c90425e
fix: lint 2023-04-26 10:19:49 +02:00
kolaente b80f070431
feat: show avatar and full name in team overview 2023-04-25 18:32:36 +02:00
renovate 03936c0403 chore(deps): update dependency vite to v4.3.2 2023-04-25 16:04:40 +00:00
kolaente 62825d2e64
fix: add spacing between checkbox and title of related task
Related to https://github.com/go-vikunja/frontend/issues/111
2023-04-25 17:33:47 +02:00
renovate 5cd5caef45 chore(deps): update dependency @vue/eslint-config-typescript to v11.0.3 2023-04-25 15:17:58 +00:00
renovate 798e8b529d chore(deps): update dependency @vitejs/plugin-legacy to v4.0.3 2023-04-25 15:04:36 +00:00
renovate 0e3766c5a5 chore(deps): update typescript-eslint monorepo to v5.59.1 2023-04-25 13:05:07 +00:00
renovate 90207a4427 chore(deps): update dependency @vitejs/plugin-vue to v4.2.0 2023-04-25 10:05:12 +00:00
renovate 60993a886a chore(deps): update dependency caniuse-lite to v1.0.30001481 2023-04-24 06:16:59 +00:00
renovate a6b42f9181 chore(deps): update dependency happy-dom to v9.9.2 2023-04-24 06:16:43 +00:00
renovate 98fbd7c53c chore(deps): update dependency netlify-cli to v14 2023-04-24 01:05:19 +00:00
renovate 8d533f50e8 chore(deps): update dependency rollup to v3.21.0 2023-04-23 20:04:46 +00:00
renovate 707459ec77 chore(deps): update dependency @types/node to v18.16.0 2023-04-23 06:04:51 +00:00
renovate faf7db649e chore(deps): update dependency esbuild to v0.17.18 2023-04-22 21:04:36 +00:00
renovate 202e71be48 chore(deps): update dependency vue-tsc to v1.4.4 2023-04-22 20:04:41 +00:00
renovate d6e8b418d3 chore(deps): update dependency vue-tsc to v1.4.3 2023-04-22 16:04:50 +00:00
renovate a9f41f6114 chore(deps): update dependency eslint to v8.39.0 2023-04-22 15:45:11 +00:00
renovate f6f0d52518 fix(deps): update dependency @vueuse/core to v10.1.0 2023-04-22 10:04:50 +00:00
renovate ccb9be42c2 chore(deps): update dependency vue-tsc to v1.4.2 2023-04-21 11:04:30 +00:00
renovate 179009bfe3 chore(deps): update dependency @types/node to v18.15.13 2023-04-21 07:04:39 +00:00
renovate 8c2bd94a9f chore(deps): update dependency vue-tsc to v1.4.1 2023-04-21 06:13:48 +00:00
renovate 7757166d75 chore(deps): update dependency rollup to v3.20.7 2023-04-21 05:04:36 +00:00
renovate 7f03002972 chore(deps): update dependency vite to v4.3.1 2023-04-20 20:04:26 +00:00
renovate 8555006d9e chore(deps): update dependency vue-tsc to v1.4.0 2023-04-20 18:04:40 +00:00
renovate 713ad64658 fix(deps): update sentry-javascript monorepo to v7.49.0 2023-04-20 16:04:46 +00:00
renovate 0713d481e3 fix(deps): update dependency pinia to v2.0.35 2023-04-20 11:04:28 +00:00
renovate ace0cf3588 chore(deps): update dependency vite to v4.3.0 2023-04-20 09:04:31 +00:00
renovate bba3bbfe89 chore(deps): update dependency @types/dompurify to v3.0.2 2023-04-20 08:04:42 +00:00
renovate 754afc5496 chore(deps): update dependency @types/node to v18.15.12 2023-04-20 00:05:04 +00:00
renovate f1e8892ab5 chore(deps): update dependency postcss to v8.4.23 2023-04-19 20:32:32 +00:00
renovate c11e192c4e fix(deps): update dependency axios to v1.3.6 2023-04-19 20:05:18 +00:00
renovate e9c704075d chore(deps): update pnpm to v8.3.1 2023-04-19 13:04:16 +00:00
renovate 35edcb5672 chore(deps): update dependency rollup to v3.20.6 2023-04-18 12:05:05 +00:00
renovate 4695798176 chore(deps): update dependency vite to v4.2.2 2023-04-18 10:05:15 +00:00
renovate 7a323fd170 chore(deps): update dependency rollup to v3.20.5 2023-04-18 06:04:54 +00:00
renovate 1d6e4b6e32 chore(deps): update pnpm to v8.3.0 2023-04-18 01:04:56 +00:00
renovate 5524aa7998 chore(deps): update dependency cypress to v12.10.0 2023-04-17 19:04:51 +00:00
renovate 15ff2008e3 chore(deps): update typescript-eslint monorepo to v5.59.0 2023-04-17 18:05:11 +00:00
renovate 9bc2e6e165 chore(deps): update dependency postcss-preset-env to v8.3.2 2023-04-17 07:04:46 +00:00
renovate 344001856c chore(deps): update dependency rollup to v3.20.4 2023-04-17 06:04:41 +00:00
renovate ad261fcc2f chore(deps): update dependency esbuild to v0.17.17 2023-04-17 05:29:14 +00:00
renovate 5142a0ae72 chore(deps): update dependency caniuse-lite to v1.0.30001479 2023-04-17 05:27:04 +00:00
renovate 6d195f96c9 chore(deps): update dependency happy-dom to v9.7.1 2023-04-17 01:05:56 +00:00
Frederick [Bot] 1917b217a8 [skip ci] Updated translations via Crowdin 2023-04-17 00:25:34 +00:00
renovate 1f6b01bc73 chore(deps): update dependency rollup to v3.20.3 2023-04-16 17:19:59 +00:00
renovate d47a16aa8e chore(deps): update dependency postcss to v8.4.22 2023-04-16 14:04:37 +00:00
renovate c57d00a74b chore(deps): update dependency eslint-plugin-vue to v9.11.0 2023-04-15 01:04:45 +00:00
renovate 77ea7fa0ee fix(deps): update dependency @vueuse/core to v10.0.2 2023-04-14 22:04:52 +00:00
kolaente b92d780cda chore: formatting 2023-04-14 21:53:04 +00:00
kolaente f14e721caf fix: rename resolveRef 2023-04-14 21:53:04 +00:00
renovate 1ff6399112 fix(deps): update dependency @vueuse/core to v10 2023-04-14 21:53:04 +00:00
renovate 503fb8da76 fix(deps): update dependency dompurify to v3.0.2 2023-04-14 18:04:56 +00:00
renovate f050cb7015 chore(deps): update histoire to v0.16.1 2023-04-14 11:04:40 +00:00
renovate 3670916f36 fix(deps): update sentry-javascript monorepo to v7.48.0 2023-04-14 10:04:35 +00:00
Frederick [Bot] 838a063eaa [skip ci] Updated translations via Crowdin 2023-04-14 00:26:31 +00:00
renovate e1b16b11d6 chore(deps): update node.js to v18.16.0 2023-04-13 01:04:28 +00:00
Dominik Pschenitschni 314cbf471f feat: better vscode vitest integration 2023-04-12 15:39:49 +00:00
Dominik Pschenitschni a416d26f7c
chore: better function naming in password components 2023-04-12 16:15:40 +02:00
Dominik Pschenitschni 795b26e1dd feat: improve datemathHelp.vue 2023-04-12 07:33:45 +00:00
renovate 14666cf9d8 chore(deps): update dependency sass to v1.62.0 2023-04-12 05:57:33 +00:00
renovate c938f31935 chore(deps): update pnpm to v8 2023-04-11 23:05:49 +00:00
kolaente 35a52ef01b
fix(quick add magic): date parsing with a date at the beginning
Resolves https://github.com/go-vikunja/frontend/issues/110
2023-04-11 18:12:08 +02:00
renovate 3b05ce3f10 chore(deps): update histoire to v0.16.0 2023-04-11 14:04:49 +00:00
renovate aec4fd7a2d chore(deps): update dependency vitest to v0.30.1 2023-04-11 12:04:57 +00:00
renovate 2661af3a17 fix(deps): update sentry-javascript monorepo to v7.47.0 2023-04-11 12:01:30 +00:00
renovate 56f43bae3f chore(deps): update typescript-eslint monorepo to v5.58.0 2023-04-10 18:04:41 +00:00
renovate 84472d2e9c chore(deps): update dependency happy-dom to v9.1.9 2023-04-10 13:17:25 +00:00
renovate c5afcd63b0 chore(deps): update dependency postcss-preset-env to v8.3.1 2023-04-10 12:05:14 +00:00
renovate 9bdb257814 chore(deps): update dependency caniuse-lite to v1.0.30001477 2023-04-10 11:14:22 +00:00
renovate 5ad9891b16 chore(deps): update pnpm to v7.32.0 2023-04-10 11:13:57 +00:00
renovate 7c04064917 chore(deps): update dependency vitest to v0.30.0 2023-04-10 11:13:43 +00:00
renovate fb5383d86b chore(deps): update dependency esbuild to v0.17.16 2023-04-10 05:04:46 +00:00
renovate 68af314ec0 chore(deps): update dependency eslint to v8.38.0 2023-04-08 00:04:43 +00:00
renovate 8b1de5ce09 fix(deps): update dependency pinia to v2.0.34 2023-04-07 20:04:46 +00:00
renovate 724b6fe091 chore(deps): update dependency typescript to v5.0.4 2023-04-07 18:04:25 +00:00
renovate 6648cd30c3 chore(deps): update dependency sass to v1.61.0 2023-04-06 22:04:45 +00:00
kolaente 8b90b45739
fix: make sure the unread notifications indicator is correctly positioned
Resolves vikunja/frontend#3358
2023-04-06 16:11:12 +02:00
renovate 39be67eecf fix(deps): update dependency axios to v1.3.5 2023-04-06 09:06:06 +00:00
Frederick [Bot] 750f0ddeab [skip ci] Updated translations via Crowdin 2023-04-05 00:06:16 +00:00
renovate 6a5ece2f24 chore(deps): update pnpm to v7.31.0 2023-04-04 01:04:32 +00:00
Frederick [Bot] 4ce33abfe6 [skip ci] Updated translations via Crowdin 2023-04-04 00:06:21 +00:00
renovate 5b7e1af87d chore(deps): update dependency @types/dompurify to v3.0.1 2023-04-03 20:04:51 +00:00
renovate 59c6605b14 chore(deps): update typescript-eslint monorepo to v5.57.1 2023-04-03 18:05:29 +00:00
Dominik Pschenitschni 820d598ecd fix(i18n): orderedList translationid 2023-04-03 09:48:03 +00:00
Dominik Pschenitschni a263ec1273
fix(Expandable): spelling ⛈ 2023-04-03 11:31:39 +02:00
renovate b68892492c chore(deps): update dependency happy-dom to v9 2023-04-03 05:18:07 +00:00
renovate 7c97695cec chore(deps): update dependency netlify-cli to v13.2.2 2023-04-03 05:17:16 +00:00
renovate e764f34a2d chore(deps): update dependency caniuse-lite to v1.0.30001473 2023-04-03 00:05:10 +00:00
renovate 6892a28bb6 chore(deps): update dependency esbuild to v0.17.15 2023-04-01 23:04:45 +00:00
renovate 74d688b8d2 chore(deps): update dependency csstype to v3.1.2 2023-04-01 21:04:41 +00:00
renovate ed84651046 chore(deps): update dependency postcss-preset-env to v8.3.0 2023-03-31 17:04:54 +00:00
renovate 7468ed21fa chore(deps): update dependency typescript to v5.0.3 2023-03-30 21:05:23 +00:00
renovate d8015913c3 fix(deps): update sentry-javascript monorepo to v7.46.0 2023-03-30 14:04:41 +00:00
Frederick [Bot] 78789834f0 [skip ci] Updated translations via Crowdin 2023-03-30 00:06:17 +00:00
Dominik Pschenitschni 739fe0caa1
fix: move types to dev dependencies 2023-03-29 22:23:40 +02:00
Dominik Pschenitschni 4703f9c4d5
fix: has-pseudo-class polyfill 2023-03-29 17:22:06 +02:00
Dominik Pschenitschni fd699ad777
fix: checkbox label size based on icon 2023-03-29 17:17:51 +02:00
Dominik Pschenitschni 0acf44778d
fix: undo further nesting of interactive items
This is really bad for UX and accessability
2023-03-29 17:17:50 +02:00
Dominik Pschenitschni 8fc254d2db
feat: abstract BaseCheckbox 2023-03-29 17:17:49 +02:00
Dominik Pschenitschni 7d3b97d422 feat: prepare for pnpm 8 (#3331)
Related: vikunja/frontend#3317

Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#3331
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2023-03-29 12:02:34 +00:00
kolaente 4a34f245db
chore(deps): update flake 2023-03-29 13:41:52 +02:00
renovate 973ea39a64 chore(deps): update dependency eslint to v8.37.0 2023-03-29 07:56:52 +00:00
renovate f94a65ce7a chore(deps): update dependency @types/node to v18.15.11 2023-03-28 22:05:12 +00:00
renovate 432fbbea78 chore(deps): update dependency cypress to v12.9.0 2023-03-28 19:05:20 +00:00
renovate e483f1cd2e chore(deps): update dependency vitest to v0.29.8 2023-03-28 14:05:19 +00:00
renovate eb34f6e136 chore(deps): update dependency postcss-preset-env to v8.2.0 2023-03-28 12:05:42 +00:00
Dominik Pschenitschni 91e9eef582 fix: use strict comparison 2023-03-28 10:49:34 +00:00
Dominik Pschenitschni dea1789a00
feat: type i18n improvements 2023-03-28 12:35:19 +02:00
WofWca 30adad5ae6 feat: mark undone if task moved from isDoneBucket (#3291)
Addresses #545 (not completely)

Reviewed-on: vikunja/frontend#3291
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Reviewed-by: konrad <k@knt.li>
Co-authored-by: WofWca <wofwca@protonmail.com>
Co-committed-by: WofWca <wofwca@protonmail.com>
2023-03-28 10:21:19 +00:00
renovate 3ed6f939e5 chore(deps): update dependency vite-plugin-pwa to v0.14.7 2023-03-28 10:05:08 +00:00
renovate a337d22c1f fix(deps): update font awesome to v6.4.0 2023-03-27 18:27:34 +00:00
renovate addfcf2510 chore(deps): update typescript-eslint monorepo to v5.57.0 2023-03-27 18:05:13 +00:00
renovate 303034f02c chore(deps): update pnpm to v7.30.5 2023-03-27 14:04:54 +00:00
renovate 0fd44e9484 chore(deps): update dependency caniuse-lite to v1.0.30001470 2023-03-27 06:06:31 +00:00
renovate 04040f20ba chore(deps): update dependency netlify-cli to v13.2.1 2023-03-27 00:06:51 +00:00
konrad 6c999ad148 fix: ensure same protocol for configured api url (#3303)
Resolves https://github.com/go-vikunja/frontend/issues/109

Vikunja would save the api url with `http` instead of `https` when the frontend was accessed via https. This was fine in most cases when the server would redirect all requests made to http to the secure https variant. However, in newer Firefox versions (and soon, Chrome probably as well) the browser would not follow that redirect anymore. Hence, we need to make sure to only make api requests to the same protocol. Doing API requests from an https hosted fronted to an http hosted api would probably fail already anyway.

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: vikunja/frontend#3303
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-authored-by: konrad <k@knt.li>
Co-committed-by: konrad <k@knt.li>
2023-03-26 19:18:47 +00:00
renovate cc519e6773 chore(deps): update dependency esbuild to v0.17.14 2023-03-26 03:05:27 +00:00
renovate f9dcae4f65 chore(deps): update dependency @types/node to v18.15.10 2023-03-25 23:05:50 +00:00
renovate ade6c2cb18 chore(deps): update dependency postcss-preset-env to v8.1.0 2023-03-25 09:05:19 +00:00
renovate 4566b62a93 chore(deps): update dependency @types/node to v18.15.9 2023-03-25 08:05:10 +00:00
renovate 37d3ef24d2 chore(deps): update dependency @types/node to v18.15.8 2023-03-25 00:05:22 +00:00
kolaente 71265769ce fix: update logo change only every hour 2023-03-24 23:30:26 +00:00
kolaente a13c16ca03 fix: use time constant 2023-03-24 23:30:26 +00:00
kolaente a33fb72ef8 fix: use onActivated 2023-03-24 23:30:26 +00:00
kolaente c5776264c0 fix: only update daytime salutation when switching to home view 2023-03-24 23:30:26 +00:00
kolaente 078d8b39a9 fix(gantt): only update today value when changing to the gantt chart view 2023-03-24 23:30:26 +00:00
kolaente b77c7c2f45 fix: add interval to uses of useNow so that it uses less resources 2023-03-24 23:30:26 +00:00
renovate e369473dd0 chore(deps): update dependency esbuild to v0.17.13 2023-03-24 19:05:04 +00:00
renovate 70501f9da1 chore(deps): update pnpm to v7.30.3 2023-03-24 14:04:24 +00:00
renovate 9bb7019b09 chore(deps): update dependency rollup to v3.20.2 2023-03-24 13:21:24 +00:00
renovate df4fe7a644 fix(deps): update sentry-javascript monorepo to v7.45.0 2023-03-24 10:06:38 +00:00
renovate 2f009d0b27 chore(deps): update dependency @types/node to v18.15.7 2023-03-24 09:05:25 +00:00
renovate 70d7def7d7 chore(deps): update dependency sass to v1.60.0 2023-03-24 07:11:01 +00:00
renovate 0033407f96 chore(deps): update pnpm to v7.30.2 2023-03-24 02:04:25 +00:00
renovate b10a2329ca chore(deps): update dependency @types/node to v18.15.6 2023-03-23 22:05:08 +00:00
WofWca 6870db4a72 fix: list view: don't sort tasks after marking one "done" (#3285)
See https://community.vikunja.io/t/list-view-tasks-being-sorted-after-marking-one-done-throws-you-off/1257/2

Reviewed-on: vikunja/frontend#3285
Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-authored-by: WofWca <wofwca@protonmail.com>
Co-committed-by: WofWca <wofwca@protonmail.com>
2023-03-23 20:50:17 +00:00
WofWca 3643ffe0d0 fix: improve the "pop" sound a bit
Trim the (noisy) silence (especially at the start, because
that delay from making a change and playing a sound is a little
annoying), with fade-in and fade-out

Edited with Audacity

File(s) history:
7f5140bbb4
955bd73feccefe8e8ca54d946d6223b43a0836ed
2023-03-23 23:38:52 +04:00
renovate 02971f6ff9 chore(deps): update dependency vite-plugin-pwa to v0.14.6 2023-03-23 12:05:31 +00:00
renovate 7d3c34b004 chore(deps): update pnpm to v7.30.1 2023-03-23 11:48:32 +00:00
renovate f3ea6fd4dc chore(deps): update dependency eslint-plugin-vue to v9.10.0 2023-03-23 11:05:38 +00:00
renovate bed6b81a58 chore(deps): update dependency rollup to v3.20.1 2023-03-23 09:05:02 +00:00
renovate f9bf9139b8 fix(deps): update dependency @intlify/unplugin-vue-i18n to v0.10.0 2023-03-22 18:05:17 +00:00
Dominik Pschenitschni 96e2c81b7e
fix: ignore ts deprecations for now
see https://github.com/vuejs/tsconfig/issues/6
2023-03-22 15:47:21 +01:00
renovate e62c00a187 chore(deps): update dependency typescript to v5 2023-03-22 13:05:25 +00:00
renovate 611419888a chore(deps): update dependency vite-plugin-pwa to v0.14.5 2023-03-22 12:05:18 +00:00
renovate 5cc7e282bf fix(deps): update dependency marked to v4.3.0 2023-03-22 06:05:26 +00:00
renovate de0b71103c chore(deps): update dependency @vue/test-utils to v2.3.2 2023-03-21 16:05:20 +00:00
renovate 537e9e8044 fix(deps): update sentry-javascript monorepo to v7.44.2 2023-03-21 11:05:19 +00:00
renovate ac95c1fdc8 chore(deps): update dependency @types/node to v18.15.5 2023-03-20 22:44:25 +00:00
renovate b36da9e4d9 chore(deps): update dependency @cypress/vite-dev-server to v5.0.5 2023-03-20 22:05:07 +00:00
renovate e11ee3c136 chore(deps): update dependency vitest to v0.29.7 2023-03-20 21:05:16 +00:00
renovate 887719ea24 chore(deps): update dependency @cypress/vue to v5.0.5 2023-03-20 19:08:09 +00:00
renovate 14f1c3b26e fix(deps): update sentry-javascript monorepo to v7.44.1 2023-03-20 19:04:28 +00:00
renovate 2142729d38 chore(deps): update typescript-eslint monorepo to v5.56.0 2023-03-20 18:06:42 +00:00
renovate 9dcc2baae2 fix(deps): update sentry-javascript monorepo to v7.44.0 2023-03-20 16:50:06 +00:00
renovate 37c88d2974 chore(deps): update dependency vitest to v0.29.5 2023-03-20 15:05:22 +00:00
renovate 36fd0deec4 chore(deps): update dependency vitest to v0.29.4 2023-03-20 14:05:04 +00:00
renovate 4a4438d431 chore(deps): update dependency vite to v4.2.1 2023-03-20 12:05:22 +00:00
renovate 28a6745346 fix(deps): update dependency @intlify/unplugin-vue-i18n to v0.9.3 2023-03-20 10:05:21 +00:00
renovate 9ae0470879 chore(deps): update pnpm to v7.30.0 2023-03-20 08:10:09 +00:00
renovate 927aed1161 chore(deps): update dependency netlify-cli to v13.1.6 2023-03-20 08:09:18 +00:00
renovate 7f3d7a656d chore(deps): update dependency caniuse-lite to v1.0.30001468 2023-03-20 08:08:31 +00:00
renovate 040a8ce095 chore(deps): update dependency rollup to v3.20.0 2023-03-20 07:05:16 +00:00
Frederick [Bot] 8974939bf2 [skip ci] Updated translations via Crowdin 2023-03-19 00:05:55 +00:00
Dominik Pschenitschni 846de369f2 chore(parseSubtasksViaIndention): fix comment (#3259)
Co-authored-by: Dominik Pschenitschni <mail@celement.de>
Reviewed-on: vikunja/frontend#3259
Co-authored-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
Co-committed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de>
2023-03-18 07:41:36 +00:00
Frederick [Bot] 4d865af423 [skip ci] Updated translations via Crowdin 2023-03-18 00:06:08 +00:00
renovate 62ad01fc8f chore(deps): update dependency esbuild to v0.17.12 2023-03-17 07:05:23 +00:00
renovate da0164b97d chore(deps): update histoire to v0.15.9 2023-03-16 23:05:16 +00:00
82 changed files with 4750 additions and 9355 deletions

View File

@ -42,11 +42,12 @@ steps:
# - .cache
- name: dependencies
image: node:18-alpine
image: node:20-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
CYPRESS_CACHE_FOLDER: .cache/cypress
PUPPETEER_SKIP_DOWNLOAD: true
commands:
- corepack enable && pnpm config set store-dir .cache/pnpm
- pnpm install --fetch-timeout 100000
@ -54,7 +55,7 @@ steps:
# - restore-cache
- name: lint
image: node:18-alpine
image: node:20-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -65,7 +66,7 @@ steps:
- dependencies
- name: build-prod
image: node:18-alpine
image: node:20-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -76,7 +77,7 @@ steps:
- dependencies
- name: test-unit
image: node:18-alpine
image: node:20-alpine
pull: always
commands:
- corepack enable && pnpm config set store-dir .cache/pnpm
@ -86,7 +87,7 @@ steps:
- name: typecheck
failure: ignore
image: node:18-alpine
image: node:20-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -136,8 +137,9 @@ steps:
# - dependencies
- name: deploy-preview
image: node:18-alpine
image: williamjackson/netlify-cli
pull: always
user: root # The rest runs as root and thus the permissions wouldn't work
environment:
NETLIFY_AUTH_TOKEN:
from_secret: netlify_auth_token
@ -200,7 +202,7 @@ steps:
# - .cache
- name: build
image: node:18-alpine
image: node:20-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -277,7 +279,7 @@ steps:
# - .cache
- name: build
image: node:18-alpine
image: node:20-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -522,6 +524,6 @@ steps:
from_secret: crowdin_key
---
kind: signature
hmac: 303afeb09b75a57ba88720b45dc06c8bf2c7320e19d738d8299f325438246f75
hmac: 511c2a090e9efd4c942980d971204adb6321540bb01c92409dd9bf8463b7f6f4
...

14
.npmrc
View File

@ -1,2 +1,14 @@
fetch-timeout=100000
# pnpm settings
# The following settings prepare for the new default value of pnpm 8
# they can be removed directly after having moved to pnpm 8
auto-install-peers=true
fetch-timeout=100000
dedupe-peer-dependents=true
resolve-peers-from-workspace-root=true
save-workspace-protocol=rolling
resolution-mode=lowest-direct
publishConfig.linkDirectory=true
# remove some time after having moved to pnpm 8
use-lockfile-v6=true

2
.nvmrc
View File

@ -1 +1 @@
18.15.0
18.16.0

View File

@ -8,6 +8,7 @@
"lokalise.i18n-ally",
"mgmcdermott.vscode-language-babel",
"mikestead.dotenv",
"Syler.sass-indented"
"Syler.sass-indented",
"zixuanchen.vitest-explorer"
]
}

View File

@ -3,7 +3,7 @@
# │─││ │││ │ │
# ┘─┘┘─┘┘┘─┘┘─┘
FROM --platform=$BUILDPLATFORM node:18-alpine AS builder
FROM --platform=$BUILDPLATFORM node:20-alpine AS builder
WORKDIR /build
@ -13,6 +13,7 @@ ENV PNPM_CACHE_FOLDER .cache/pnpm/
COPY package.json ./
COPY pnpm-lock.yaml ./
COPY patches /build/patches
RUN if [ "$USE_RELEASE" != true ]; then \
# https://pnpm.io/installation#using-corepack

View File

@ -120,7 +120,7 @@ describe('Namepaces', () => {
.should('not.contain', 'Archived')
// Show archived
cy.get('[data-cy="show-archived-check"] label.check span')
cy.get('[data-cy="show-archived-check"] .fancycheckbox__content')
.should('be.visible')
.click()
cy.get('[data-cy="show-archived-check"] input')
@ -129,7 +129,7 @@ describe('Namepaces', () => {
.should('contain', 'Archived')
// Don't show archived
cy.get('[data-cy="show-archived-check"] label.check span')
cy.get('[data-cy="show-archived-check"] .fancycheckbox__content')
.should('be.visible')
.click()
cy.get('[data-cy="show-archived-check"] input')

View File

@ -22,10 +22,10 @@ describe('Project View Table', () => {
cy.get('.project-table .filter-container .items .button')
.contains('Columns')
.click()
cy.get('.project-table .filter-container .card.columns-filter .card-content .fancycheckbox .check')
cy.get('.project-table .filter-container .card.columns-filter .card-content .fancycheckbox')
.contains('Priority')
.click()
cy.get('.project-table .filter-container .card.columns-filter .card-content .fancycheckbox .check')
cy.get('.project-table .filter-container .card.columns-filter .card-content .fancycheckbox')
.contains('Done')
.click()

View File

@ -96,7 +96,7 @@ describe('Task', () => {
TaskFactory.create(1)
cy.visit('/projects/1/list')
cy.get('.tasks .task .fancycheckbox label.check')
cy.get('.tasks .task .fancycheckbox')
.first()
.click()
cy.get('.global-notification')

View File

@ -1,11 +1,12 @@
{
"extends": "@vue/tsconfig/tsconfig.web.json",
"extends": "@vue/tsconfig/tsconfig.dom.json",
"include": ["./**/*", "../support/**/*", "../factories/**/*"],
"compilerOptions": {
"baseUrl": ".",
"isolatedModules": false,
"target": "ES2015",
"lib": ["ESNext", "dom"],
"types": ["cypress"]
"types": ["cypress"],
"ignoreDeprecations": "5.0"
}
}

0
docker/injector.sh Normal file → Executable file
View File

0
docker/ipv6-disable.sh Normal file → Executable file
View File

View File

@ -4,7 +4,6 @@
pid /tmp/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 65535;
events {
multi_accept on;

10
env.d.ts vendored
View File

@ -3,6 +3,16 @@
/// <reference types="cypress" />
/// <reference types="@histoire/plugin-vue/components" />
declare module 'postcss-focus-within/browser' {
import focusWithinInit from 'postcss-focus-within/browser'
export default focusWithinInit
}
declare module 'css-has-pseudo/browser' {
import cssHasPseudo from 'css-has-pseudo/browser'
export default cssHasPseudo
}
interface ImportMetaEnv {
readonly VITE_IS_ONLINE: boolean
}

View File

@ -2,11 +2,11 @@
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1664753041,
"narHash": "sha256-0ogaD8PaGHluARFeupofvk1Nq9gpVeZdlFM0Kcwguys=",
"lastModified": 1680030621,
"narHash": "sha256-qQa1NeS5Rvk2lgK5lSk986PC6I72yIHejzM8PFu+dHs=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "a62844b302507c7531ad68a86cb7aa54704c9cb4",
"rev": "402cc3633cc60dfc50378197305c984518b30773",
"type": "github"
},
"original": {

Binary file not shown.

Binary file not shown.

View File

@ -13,7 +13,7 @@
},
"homepage": "https://vikunja.io/",
"funding": "https://opencollective.com/vikunja",
"packageManager": "pnpm@7.29.3",
"packageManager": "pnpm@8.5.0",
"keywords": [
"todo",
"productivity",
@ -45,101 +45,100 @@
"story:preview": "histoire preview"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "6.3.0",
"@fortawesome/free-regular-svg-icons": "6.3.0",
"@fortawesome/free-solid-svg-icons": "6.3.0",
"@fortawesome/fontawesome-svg-core": "6.4.0",
"@fortawesome/free-regular-svg-icons": "6.4.0",
"@fortawesome/free-solid-svg-icons": "6.4.0",
"@fortawesome/vue-fontawesome": "3.0.3",
"@github/hotkey": "2.0.1",
"@infectoone/vue-ganttastic": "2.1.4",
"@intlify/unplugin-vue-i18n": "0.9.2",
"@intlify/unplugin-vue-i18n": "0.10.0",
"@kyvg/vue3-notification": "2.9.0",
"@sentry/tracing": "7.43.0",
"@sentry/vue": "7.43.0",
"@types/is-touch-device": "1.0.0",
"@types/lodash.clonedeep": "4.5.7",
"@types/sortablejs": "1.15.1",
"@vueuse/core": "9.13.0",
"axios": "1.3.4",
"@sentry/tracing": "7.51.2",
"@sentry/vue": "7.51.2",
"@vueuse/core": "10.1.2",
"axios": "1.4.0",
"blurhash": "2.0.5",
"bulma-css-variables": "0.9.33",
"camel-case": "4.1.2",
"codemirror": "5.65.12",
"date-fns": "2.29.3",
"codemirror": "5.65.13",
"date-fns": "2.30.0",
"dayjs": "1.11.7",
"dompurify": "3.0.1",
"dompurify": "3.0.3",
"easymde": "2.18.0",
"fast-deep-equal": "3.1.3",
"flatpickr": "4.6.13",
"flexsearch": "0.7.31",
"floating-vue": "2.0.0-beta.20",
"focus-within": "3.0.2",
"highlight.js": "11.7.0",
"highlight.js": "11.8.0",
"is-touch-device": "1.0.1",
"klona": "2.0.6",
"lodash.debounce": "4.0.8",
"marked": "4.2.12",
"pinia": "2.0.33",
"marked": "5.0.2",
"pinia": "2.0.36",
"register-service-worker": "1.7.2",
"snake-case": "3.0.4",
"sortablejs": "1.15.0",
"ufo": "1.1.1",
"ufo": "1.1.2",
"vue": "3.2.47",
"vue-advanced-cropper": "2.8.8",
"vue-flatpickr-component": "11.0.3",
"vue-i18n": "9.2.2",
"vue-router": "4.1.6",
"vue-router": "4.2.0",
"workbox-precaching": "6.5.4",
"zhyswan-vuedraggable": "4.1.3"
},
"devDependencies": {
"@4tw/cypress-drag-drop": "2.2.3",
"@cypress/vite-dev-server": "5.0.4",
"@cypress/vue": "5.0.4",
"@faker-js/faker": "7.6.0",
"@histoire/plugin-screenshot": "0.15.8",
"@histoire/plugin-vue": "0.15.8",
"@cypress/vite-dev-server": "5.0.5",
"@cypress/vue": "5.0.5",
"@faker-js/faker": "8.0.0",
"@histoire/plugin-screenshot": "0.16.1",
"@histoire/plugin-vue": "0.16.1",
"@rushstack/eslint-patch": "1.2.0",
"@tsconfig/node18": "2.0.1",
"@types/codemirror": "5.60.7",
"@types/dompurify": "3.0.0",
"@types/dompurify": "3.0.2",
"@types/flexsearch": "0.7.3",
"@types/focus-within": "1.0.1",
"@types/is-touch-device": "1.0.0",
"@types/lodash.debounce": "4.0.7",
"@types/marked": "4.0.8",
"@types/node": "18.15.3",
"@types/marked": "4.3.0",
"@types/node": "18.16.8",
"@types/postcss-preset-env": "7.7.0",
"@typescript-eslint/eslint-plugin": "5.55.0",
"@typescript-eslint/parser": "5.55.0",
"@vitejs/plugin-legacy": "4.0.2",
"@vitejs/plugin-vue": "4.1.0",
"@vue/eslint-config-typescript": "11.0.2",
"@vue/test-utils": "2.3.1",
"@vue/tsconfig": "0.1.3",
"@types/sortablejs": "1.15.1",
"@typescript-eslint/eslint-plugin": "5.59.5",
"@typescript-eslint/parser": "5.59.5",
"@vitejs/plugin-legacy": "4.0.3",
"@vitejs/plugin-vue": "4.2.3",
"@vue/eslint-config-typescript": "11.0.3",
"@vue/test-utils": "2.3.2",
"@vue/tsconfig": "0.4.0",
"autoprefixer": "10.4.14",
"browserslist": "4.21.5",
"caniuse-lite": "1.0.30001465",
"csstype": "3.1.1",
"cypress": "12.8.1",
"esbuild": "0.17.11",
"eslint": "8.36.0",
"eslint-plugin-vue": "9.9.0",
"happy-dom": "8.9.0",
"histoire": "0.15.8",
"netlify-cli": "13.1.2",
"postcss": "8.4.21",
"caniuse-lite": "1.0.30001486",
"css-has-pseudo": "5.0.2",
"csstype": "3.1.2",
"cypress": "12.12.0",
"esbuild": "0.17.18",
"eslint": "8.40.0",
"eslint-plugin-vue": "9.12.0",
"happy-dom": "9.10.9",
"histoire": "0.16.1",
"postcss": "8.4.23",
"postcss-easing-gradients": "3.0.1",
"postcss-easings": "3.0.1",
"postcss-preset-env": "8.0.1",
"rollup": "3.19.1",
"postcss-focus-within": "7.0.2",
"postcss-preset-env": "8.3.2",
"rollup": "3.21.6",
"rollup-plugin-visualizer": "5.9.0",
"sass": "1.59.3",
"sass": "1.62.1",
"start-server-and-test": "2.0.0",
"typescript": "4.9.5",
"vite": "4.2.0",
"typescript": "5.0.4",
"vite": "4.3.5",
"vite-plugin-inject-preload": "1.3.1",
"vite-plugin-pwa": "0.14.4",
"vite-plugin-pwa": "0.14.7",
"vite-svg-loader": "4.0.0",
"vitest": "0.29.3",
"vue-tsc": "1.2.0",
"vitest": "0.31.0",
"vue-tsc": "1.6.4",
"wait-on": "7.0.1",
"workbox-cli": "6.5.4"
},

File diff suppressed because it is too large Load Diff

View File

@ -6,7 +6,7 @@
],
"packageRules": [
{
"matchPackageNames": ["netlify-cli", "happy-dom"],
"matchPackageNames": ["happy-dom"],
"extends": ["schedule:weekly"]
},
{

View File

@ -33,9 +33,9 @@ const promiseExec = cmd => {
}
(async function () {
let stdout = await promiseExec(`./node_modules/.bin/netlify link --id ${siteId}`)
let stdout = await promiseExec(`/home/node/docker-netlify-cli/node_modules/.bin/netlify link --id ${siteId}`)
console.log(stdout)
stdout = await promiseExec(`./node_modules/.bin/netlify deploy --alias ${alias}`)
stdout = await promiseExec(`/home/node/docker-netlify-cli/node_modules/.bin/netlify deploy --alias ${alias}`)
console.log(stdout)
const data = await fetch(prIssueCommentsUrl).then(response => response.json())

View File

@ -1 +1 @@
57af69409e66bc87f4f2fc5822dd8d3c2eb47c601f81af1ac4a56f3e2d80837b1a2de06f4ff57695ec379b7c15b881e3 ./scripts/deploy-preview-netlify.mjs
4a7c1293c7b12e9ab476cdf35251a407c6a1cd005d22c06df994222cccfb25cde5f47d15866a098c9d739778fee4dc19 ./scripts/deploy-preview-netlify.mjs

Binary file not shown.

4
src/assets/checkbox.svg Normal file
View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="18px" height="18px" viewBox="0 0 18 18" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5">
<path d="M1,9 L1,3.5 C1,2 2,1 3.5,1 L14.5,1 C16,1 17,2 17,3.5 L17,14.5 C17,16 16,17 14.5,17 L3.5,17 C2,17 1,16 1,14.5 L1,9 Z" stroke-dasharray="60"></path>
<polyline points="1 9 7 14 15 4" stroke-dasharray="22" stroke-dashoffset="66"></polyline>
</svg>

After

Width:  |  Height:  |  Size: 420 B

View File

@ -0,0 +1,54 @@
<template>
<div class="base-checkbox" v-cy="'checkbox'">
<input
type="checkbox"
:id="checkboxId"
class="is-sr-only"
:checked="modelValue"
@change="(event) => emit('update:modelValue', (event.target as HTMLInputElement).checked)"
:disabled="disabled || undefined"
/>
<slot name="label" :checkboxId="checkboxId">
<label :for="checkboxId" class="base-checkbox__label">
<slot/>
</label>
</slot>
</div>
</template>
<script setup lang="ts">
import {ref} from 'vue'
import {createRandomID} from '@/helpers/randomId'
defineProps({
modelValue: {
type: Boolean,
default: false,
},
disabled: {
type: Boolean,
default: false,
},
})
const emit = defineEmits<{
(event: 'update:modelValue', value: boolean): void
}>()
const checkboxId = ref(`fancycheckbox_${createRandomID()}`)
</script>
<style lang="scss" scoped>
.base-checkbox__label {
cursor: pointer;
user-select: none;
-webkit-tap-highlight-color: transparent;
display: inline-flex;
}
.base-checkbox:has(input:disabled) .base-checkbox__label {
cursor:not-allowed;
pointer-events: none;
}
</style>

View File

@ -32,7 +32,7 @@ import {computed, ref} from 'vue'
import {getInheritedBackgroundColor} from '@/helpers/getInheritedBackgroundColor'
const props = defineProps({
/** Wheather the Expandable is open or not */
/** Whether the Expandable is open or not */
open: {
type: Boolean,
default: false,

View File

@ -0,0 +1,11 @@
<script setup lang="ts">
import datemathHelp from './datemathHelp.vue'
</script>
<template>
<Story>
<Variant title="Default">
<datemathHelp />
</Variant>
</Story>
</template>

View File

@ -1,7 +1,8 @@
<template>
<card
class="has-no-shadow how-it-works-modal"
:title="$t('input.datemathHelp.title')">
:title="$t('input.datemathHelp.title')"
>
<p>
{{ $t('input.datemathHelp.intro') }}
</p>
@ -27,11 +28,11 @@
</p>
<p>{{ $t('misc.forExample') }}</p>
<ul>
<li><code>+1d</code>{{ $t('input.datemathHelp.add1Day') }}</li>
<li><code>-1d</code>{{ $t('input.datemathHelp.minus1Day') }}</li>
<li><code>/d</code>{{ $t('input.datemathHelp.roundDay') }}</li>
<li><code>+1d</code> {{ $t('input.datemathHelp.add1Day') }}</li>
<li><code>-1d</code> {{ $t('input.datemathHelp.minus1Day') }}</li>
<li><code>/d</code> {{ $t('input.datemathHelp.roundDay') }}</li>
</ul>
<p>{{ $t('input.datemathHelp.supportedUnits') }}</p>
<h3>{{ $t('input.datemathHelp.supportedUnits') }}</h3>
<table class="table">
<tbody>
<tr>
@ -69,7 +70,7 @@
</tbody>
</table>
<p>{{ $t('input.datemathHelp.someExamples') }}</p>
<h3>{{ $t('input.datemathHelp.someExamples') }}</h3>
<table class="table">
<tbody>
<tr>
@ -100,7 +101,7 @@
<td><code>{{ exampleDate }}||+1M/d</code></td>
<td>
<i18n-t keypath="input.datemathHelp.examples.datePlusMonth" scope="global">
<code>{{ exampleDate }}</code>
<strong>{{ exampleDate }}</strong>
</i18n-t>
</td>
</tr>
@ -110,13 +111,15 @@
</template>
<script lang="ts" setup>
import {formatDate} from '@/helpers/time/formatDate'
import {formatDateShort} from '@/helpers/time/formatDate'
import BaseButton from '@/components/base/BaseButton.vue'
const exampleDate = formatDate(new Date(), 'yyyy-MM-dd')
const exampleDate = formatDateShort(new Date())
</script>
<style scoped lang="scss">
// FIXME: Remove style overwrites
.how-it-works-modal {
font-size: 1rem;
}

View File

@ -4,8 +4,11 @@ import { useNow } from '@vueuse/core'
import LogoFull from '@/assets/logo-full.svg?component'
import LogoFullPride from '@/assets/logo-full-pride.svg?component'
import {MILLISECONDS_A_HOUR} from '@/constants/date'
const now = useNow()
const now = useNow({
interval: MILLISECONDS_A_HOUR,
})
const Logo = computed(() => now.value.getMonth() === 5 ? LogoFullPride : LogoFull)
</script>

View File

@ -0,0 +1,71 @@
<script lang="ts" setup>
import {ref} from 'vue'
import {logEvent} from 'histoire/client'
import FancyCheckbox from './fancycheckbox.vue'
const isDisabled = ref<boolean | undefined>()
const isChecked = ref(false)
const isCheckedInitiallyEnabled = ref(true)
const isCheckedDisabled = ref(false)
const withoutInitialState = ref<boolean | undefined>()
</script>
<template>
<Story :layout="{ type: 'grid', width: '200px' }">
<Variant title="Default">
<FancyCheckbox
v-model="isChecked"
:disabled="isDisabled"
>
This is probably not important
</FancyCheckbox>
Visualisation
<input type="checkbox" v-model="isChecked">
{{ isChecked }}
</Variant>
<Variant title="Enabled Initially">
<FancyCheckbox
:disabled="isDisabled"
v-model="isCheckedInitiallyEnabled"
>
We want you to use this option
</FancyCheckbox>
Visualisation
<input type="checkbox" v-model="isCheckedInitiallyEnabled">
{{ isCheckedInitiallyEnabled }}
</Variant>
<Variant title="Disabled">
<FancyCheckbox
disabled
:modelValue="isCheckedDisabled"
@update:model-value="logEvent('Setting disabled: This should never happen', $event)"
>
You can't change this
</FancyCheckbox>
Visualisation
<input type="checkbox" v-model="isCheckedDisabled" disabled>
{{ isCheckedDisabled }}
</Variant>
<Variant title="Undefined initial State">
<FancyCheckbox
v-model="withoutInitialState"
:disabled="isDisabled"
>
Not sure what the value should be
</FancyCheckbox>
Visualisation
<input type="checkbox" v-model="withoutInitialState" disabled>
{{ withoutInitialState }}
</Variant>
</Story>
</template>

View File

@ -1,66 +1,42 @@
<template>
<div :class="{'is-disabled': disabled}" class="fancycheckbox">
<input
:checked="checked"
:disabled="disabled || undefined"
:id="checkBoxId"
@change="(event: Event) => updateData((event.target as HTMLInputElement).checked)"
type="checkbox"
/>
<label :for="checkBoxId" class="check" @click.prevent="check">
<svg height="18px" viewBox="0 0 18 18" width="18px">
<path
d="M1,9 L1,3.5 C1,2 2,1 3.5,1 L14.5,1 C16,1 17,2 17,3.5 L17,14.5 C17,16 16,17 14.5,17 L3.5,17 C2,17 1,16 1,14.5 L1,9 Z"></path>
<polyline points="1 9 7 14 15 4"></polyline>
</svg>
<span>
<slot></slot>
</span>
</label>
</div>
<BaseCheckbox
class="fancycheckbox"
:class="{
'is-disabled': disabled,
'is-block': isBlock,
}"
:disabled="disabled"
:model-value="modelValue"
@update:model-value="value => emit('update:modelValue', value)"
>
<CheckboxIcon class="fancycheckbox__icon" />
<span v-if="$slots.default" class="fancycheckbox__content">
<slot/>
</span>
</BaseCheckbox>
</template>
<script setup lang="ts">
import {ref, toRef, watch} from 'vue'
import CheckboxIcon from '@/assets/checkbox.svg?component'
import {createRandomID} from '@/helpers/randomId'
import BaseCheckbox from '@/components/base/BaseCheckbox.vue'
const checked = ref(false)
const checkBoxId = `fancycheckbox_${createRandomID()}`
const props = defineProps({
defineProps({
modelValue: {
type: Boolean,
required: false,
},
disabled: {
type: Boolean,
required: false,
},
isBlock: {
type: Boolean,
default: false,
},
})
const emit = defineEmits(['update:modelValue', 'change'])
const modelValue = toRef(props, 'modelValue')
watch(
modelValue,
newValue => {
checked.value = newValue
},
{immediate: true},
)
function updateData(newChecked: boolean) {
checked.value = newChecked
emit('update:modelValue', newChecked)
emit('change', newChecked)
}
function check() {
checked.value = !checked.value
updateData(checked.value)
}
const emit = defineEmits<{
(event: 'update:modelValue', value: boolean): void
}>()
</script>
@ -70,75 +46,54 @@ function check() {
padding-right: 5px;
padding-top: 3px;
// FIXME: should be a prop
&.is-block {
display: block;
margin: .5rem .2rem;
}
}
input[type=checkbox] {
display: none;
}
.check {
cursor: pointer;
position: relative;
margin: auto;
width: 18px;
height: 18px;
-webkit-tap-highlight-color: transparent;
transform: translate3d(0, 0, 0);
}
span {
.fancycheckbox__content {
font-size: 0.8rem;
vertical-align: top;
padding-left: .5rem;
}
svg {
.fancycheckbox__icon:deep() {
position: relative;
z-index: 1;
fill: none;
stroke-linecap: round;
stroke-linejoin: round;
stroke: #c8ccd4;
stroke-width: 1.5;
stroke: var(--stroke-color, #c8ccd4);
transform: translate3d(0, 0, 0);
transition: all 0.2s ease;
}
.check:hover svg {
stroke: var(--primary);
}
.is-disabled .check:hover svg {
stroke: #c8ccd4;
}
path {
stroke-dasharray: 60;
stroke-dashoffset: 0;
}
polyline {
stroke-dasharray: 22;
stroke-dashoffset: 66;
}
input[type=checkbox]:checked + .check {
svg {
stroke: var(--primary);
path,
polyline {
transition: all 0.2s linear, color 0.2s ease;
}
}
.fancycheckbox:not(:has(input:disabled)):hover .fancycheckbox__icon,
.fancycheckbox:has(input:checked) .fancycheckbox__icon {
--stroke-color: var(--primary);
}
</style>
<style lang="scss">
// Since css-has-pseudo doesn't work with deep classes,
// the following rules can't be scoped
.fancycheckbox:has(:not(input:checked)) .fancycheckbox__icon {
path {
transition-delay: 0.05s;
}
}
.fancycheckbox:has(input:checked) .fancycheckbox__icon {
path {
stroke-dashoffset: 60;
transition: all 0.3s linear;
}
polyline {
stroke-dashoffset: 42;
transition: all 0.2s linear;
transition-delay: 0.15s;
}
}

View File

@ -140,6 +140,18 @@ export const KEYBOARD_SHORTCUTS : ShortcutGroup[] = [
title: 'keyboardShortcuts.task.description',
keys: ['e'],
},
{
title: 'keyboardShortcuts.task.priority',
keys: ['p'],
},
{
title: 'keyboardShortcuts.task.delete',
keys: ['shift', 'delete'],
},
{
title: 'keyboardShortcuts.task.favorite',
keys: ['s'],
},
],
},
]
]

View File

@ -49,9 +49,11 @@ const displayName = computed(() => getDisplayName(props.user))
<style lang="scss" scoped>
.user {
margin: .5rem;
display: flex;
justify-items: center;
&.is-inline {
display: inline;
display: inline-flex;
}
}

View File

@ -145,12 +145,13 @@ function to(n, index) {
.trigger-button {
width: 100%;
position: relative;
}
.unread-indicator {
position: absolute;
top: .75rem;
right: 1.15rem;
top: 1rem;
right: .5rem;
width: .75rem;
height: .75rem;

View File

@ -38,9 +38,8 @@
</template>
<script setup lang="ts">
import {computed, ref, watch, toRefs} from 'vue'
import {computed, ref, watch, toRefs, onActivated} from 'vue'
import {useRouter} from 'vue-router'
import {useNow} from '@vueuse/core'
import {getHexColor} from '@/models/task'
@ -157,7 +156,8 @@ function openTask(e: {
const weekDayFromDate = useWeekDayFromDate()
const today = useNow()
const today = ref(new Date())
onActivated(() => today.value = new Date())
const dateIsToday = computed(() => (date: Date) => {
return (
date.getDate() === today.value.getDate() &&

View File

@ -442,5 +442,6 @@ async function toggleTaskDone(task: ITask) {
.task-done-checkbox {
padding: 0;
height: 18px; // The exact height of the checkbox in the container
margin-right: .75rem;
}
</style>

View File

@ -1,12 +1,8 @@
<template>
<router-link
:to="taskDetailRoute"
:class="{'is-loading': taskService.loading}"
class="task loader-container"
>
<div :class="{'is-loading': taskService.loading}" class="task loader-container">
<fancycheckbox
:disabled="(isArchived || disabled) && !canMarkAsDone"
@change="markAsDone"
@update:model-value="markAsDone"
v-model="task.done"
/>
@ -16,7 +12,8 @@
class="mr-1"
/>
<div
<router-link
:to="taskDetailRoute"
:class="{ 'done': task.done, 'show-project': showProject && project !== null}"
class="tasktext"
>
@ -96,7 +93,7 @@
</span>
<checklist-summary :task="task"/>
</div>
</router-link>
<progress
class="progress is-small"
@ -117,14 +114,14 @@
<BaseButton
:class="{'is-favorite': task.isFavorite}"
@click.prevent="toggleFavorite"
@click="toggleFavorite"
class="favorite"
>
<icon icon="star" v-if="task.isFavorite"/>
<icon :icon="['far', 'star']" v-else/>
</BaseButton>
<slot />
</router-link>
</div>
</template>
<script setup lang="ts">
@ -288,11 +285,7 @@ function hideDeferDueDatePopup(e) {
border-radius: $radius;
border: 2px solid transparent;
color: var(--text);
transition: color ease $transition-duration;
&:hover {
color: var(--grey-900);
background-color: var(--grey-100);
}
@ -338,6 +331,15 @@ function hideDeferDueDatePopup(e) {
}
a {
color: var(--text);
transition: color ease $transition-duration;
&:hover {
color: var(--grey-900);
}
}
.favorite {
opacity: 1;
text-align: center;

View File

@ -1,6 +1,5 @@
import {computed} from 'vue'
import {computed, onActivated, ref} from 'vue'
import {useI18n} from 'vue-i18n'
import {useNow} from '@vueuse/core'
import {useAuthStore} from '@/stores/auth'
import {hourToDaytime} from '@/helpers/hourToDaytime'
@ -9,7 +8,8 @@ export type Daytime = 'night' | 'morning' | 'day' | 'evening'
export function useDaytimeSalutation() {
const {t} = useI18n({useScope: 'global'})
const now = useNow()
const now = ref(new Date())
onActivated(() => now.value = new Date())
const authStore = useAuthStore()
const name = computed(() => authStore.userDisplayName)

View File

@ -1,7 +1,7 @@
import { computed } from 'vue'
import type { Ref } from 'vue'
import {computed} from 'vue'
import type {Ref} from 'vue'
import {useTitle as useTitleVueUse, resolveRef} from '@vueuse/core'
import {useTitle as useTitleVueUse, toRef} from '@vueuse/core'
type UseTitleParameters = Parameters<typeof useTitleVueUse>
@ -9,12 +9,12 @@ export function useTitle(...args: UseTitleParameters) {
const [newTitle, ...restArgs] = args
const pageTitle = resolveRef(newTitle) as Ref<string>
const pageTitle = toRef(newTitle) as Ref<string>
const completeTitle = computed(() =>
const completeTitle = computed(() =>
(typeof pageTitle.value === 'undefined' || pageTitle.value === '')
? 'Vikunja'
: `${pageTitle.value} | Vikunja`,
? 'Vikunja'
: `${pageTitle.value} | Vikunja`,
)
return useTitleVueUse(completeTitle, ...restArgs)

View File

@ -6,13 +6,11 @@ declare global {
}
}
const cypressDirective: Directive = {
mounted(el, {value}) {
if (
(window.Cypress || import.meta.env.DEV) &&
value
) {
el.setAttribute('data-cy', value)
const cypressDirective = <Directive<HTMLElement,string>>{
mounted(el, {arg, value}) {
const testingId = arg || value
if ((window.Cypress || import.meta.env.DEV) && testingId) {
el.setAttribute('data-cy', testingId)
}
},
beforeUnmount(el) {

View File

@ -6,16 +6,16 @@ export const ERROR_NO_API_URL = 'noApiUrlProvided'
export const checkAndSetApiUrl = (url: string): Promise<string> => {
if(url.startsWith('/')) {
if (url.startsWith('/')) {
url = window.location.host + url
}
// Check if the url has an http prefix
// Check if the url has a http prefix
if (
!url.startsWith('http://') &&
!url.startsWith('https://')
) {
url = `http://${url}`
url = `${window.location.protocol}//${url}`
}
const urlToCheck: URL = new URL(url)
@ -41,15 +41,6 @@ export const checkAndSetApiUrl = (url: string): Promise<string> => {
}
throw e
})
.catch(e => {
// Check if it has a port and if not check if it is reachable at https
if (urlToCheck.protocol === 'http:') {
urlToCheck.protocol = 'https:'
window.API_URL = urlToCheck.toString()
return updateConfig()
}
throw e
})
.catch(e => {
// Check if it is reachable at /api/v1 and https
urlToCheck.pathname = origUrlToCheck.pathname
@ -66,7 +57,6 @@ export const checkAndSetApiUrl = (url: string): Promise<string> => {
.catch(e => {
// Check if it is reachable at port API_DEFAULT_PORT and https
if (urlToCheck.port !== API_DEFAULT_PORT) {
urlToCheck.protocol = 'https:'
urlToCheck.port = API_DEFAULT_PORT
window.API_URL = urlToCheck.toString()
return updateConfig()
@ -74,30 +64,7 @@ export const checkAndSetApiUrl = (url: string): Promise<string> => {
throw e
})
.catch(e => {
// Check if it is reachable at :API_DEFAULT_PORT and /api/v1 and https
urlToCheck.pathname = origUrlToCheck.pathname
if (
!urlToCheck.pathname.endsWith('/api/v1') &&
!urlToCheck.pathname.endsWith('/api/v1/')
) {
urlToCheck.pathname = `${urlToCheck.pathname}api/v1`
window.API_URL = urlToCheck.toString()
return updateConfig()
}
throw e
})
.catch(e => {
// Check if it is reachable at port API_DEFAULT_PORT and http
if (urlToCheck.port !== API_DEFAULT_PORT) {
urlToCheck.protocol = 'http:'
urlToCheck.port = API_DEFAULT_PORT
window.API_URL = urlToCheck.toString()
return updateConfig()
}
throw e
})
.catch(e => {
// Check if it is reachable at :API_DEFAULT_PORT and /api/v1 and http
// Check if it is reachable at :API_DEFAULT_PORT and /api/v1
urlToCheck.pathname = origUrlToCheck.pathname
if (
!urlToCheck.pathname.endsWith('/api/v1') &&
@ -118,7 +85,7 @@ export const checkAndSetApiUrl = (url: string): Promise<string> => {
localStorage.setItem('API_URL', window.API_URL)
return window.API_URL
}
throw new Error(ERROR_NO_API_URL)
})
}

View File

@ -48,7 +48,7 @@ export function parseSubtasksViaIndention(taskTitles: string): TaskWithParent[]
task.title = cleanupTitle(title.replace(spaceRegex, ''))
task.parent = task.parent.replace(spaceRegex, '')
if (task.project === null) {
// This allows to specify a list once for the parent task and inherit it to all subtasks
// This allows to specify a project once for the parent task and inherit it to all subtasks
task.project = getProjectFromPrefix(task.parent)
}
}

View File

@ -129,7 +129,7 @@ const addTimeToDate = (text: string, date: Date, previousMatch: string | null):
}
export const getDateFromText = (text: string, now: Date = new Date()) => {
const fullDateRegex = / ([0-9][0-9]?\/[0-9][0-9]?\/[0-9][0-9]([0-9][0-9])?|[0-9][0-9][0-9][0-9]\/[0-9][0-9]?\/[0-9][0-9]?|[0-9][0-9][0-9][0-9]-[0-9][0-9]?-[0-9][0-9]?)/ig
const fullDateRegex = /(^| )([0-9][0-9]?\/[0-9][0-9]?\/[0-9][0-9]([0-9][0-9])?|[0-9][0-9][0-9][0-9]\/[0-9][0-9]?\/[0-9][0-9]?|[0-9][0-9][0-9][0-9]-[0-9][0-9]?-[0-9][0-9]?)/ig
// 1. Try parsing the text as a "usual" date, like 2021-06-24 or 06/24/2021
let results: string[] | null = fullDateRegex.exec(text)
@ -138,7 +138,7 @@ export const getDateFromText = (text: string, now: Date = new Date()) => {
let containsYear = true
if (result === null) {
// 2. Try parsing the date as something like "jan 21" or "21 jan"
const monthRegex = new RegExp(` (${monthsRegexGroup} [0-9][0-9]?|[0-9][0-9]? ${monthsRegexGroup})`, 'ig')
const monthRegex = new RegExp(`(^| )(${monthsRegexGroup} [0-9][0-9]?|[0-9][0-9]? ${monthsRegexGroup})`, 'ig')
results = monthRegex.exec(text)
result = results === null ? null : `${results[0]} ${now.getFullYear()}`.trim()
foundText = results === null ? '' : results[0].trim()
@ -146,7 +146,7 @@ export const getDateFromText = (text: string, now: Date = new Date()) => {
if (result === null) {
// 3. Try parsing the date as "27/01" or "01/27"
const monthNumericRegex = / ([0-9][0-9]?\/[0-9][0-9]?)/ig
const monthNumericRegex = /(^| )([0-9][0-9]?\/[0-9][0-9]?)/ig
results = monthNumericRegex.exec(text)
// Put the year before or after the date, depending on what works
@ -299,7 +299,7 @@ const getDateFromWeekday = (text: string): dateFoundResult => {
}
const getDayFromText = (text: string) => {
const matcher = /($| )(([1-2][0-9])|(3[01])|(0?[1-9]))(st|nd|rd|th|\.)($| )/ig
const matcher = /(^| )(([1-2][0-9])|(3[01])|(0?[1-9]))(st|nd|rd|th|\.)($| )/ig
const results = matcher.exec(text)
if (results === null) {
return {

View File

@ -1,4 +1,5 @@
import { defineSetupVue3 } from '@histoire/plugin-vue'
import './polyfills'
import {defineSetupVue3} from '@histoire/plugin-vue'
import {i18n} from './i18n'
// import './histoire.css' // Import global CSS
@ -6,18 +7,21 @@ import './styles/global.scss'
import {createPinia} from 'pinia'
import cypress from '@/directives/cypress'
import FontAwesomeIcon from '@/components/misc/Icon'
import XButton from '@/components/input/button.vue'
import Modal from '@/components/misc/modal.vue'
import Card from '@/components/misc/card.vue'
export const setupVue3 = defineSetupVue3(({ app }) => {
// Add Pinia store
const pinia = createPinia()
app.use(pinia)
app.use(i18n)
app.directive('cy', cypress)
app.component('icon', FontAwesomeIcon)
app.component('XButton', XButton)
app.component('modal', Modal)

View File

@ -15,7 +15,7 @@ export const SUPPORTED_LOCALES = {
'pt-PT': 'Português',
'zh-CN': 'Chinese',
'no-NO': 'Norsk Bokmål',
} as Record<string, string>
} as const
export type SupportedLocale = keyof typeof SUPPORTED_LOCALES
@ -23,12 +23,12 @@ export const DEFAULT_LANGUAGE: SupportedLocale= 'en'
export type ISOLanguage = string
// we load all messsages async
// we load all messages async
export const i18n = createI18n({
fallbackLocale: DEFAULT_LANGUAGE,
legacy: false,
messages: {
en: langEN,
[DEFAULT_LANGUAGE]: langEN,
} as Record<SupportedLocale, any>,
})
@ -54,16 +54,16 @@ export async function setLanguage(lang: SupportedLocale = getCurrentLanguage()):
}
export function getCurrentLanguage(): SupportedLocale {
const savedLanguage = localStorage.getItem('language')
const savedLanguage = localStorage.getItem('language') as SupportedLocale | null
if (savedLanguage !== null) {
return savedLanguage
}
const browserLanguage = navigator.language
const language: SupportedLocale | undefined = Object.keys(SUPPORTED_LOCALES).find(langKey => {
const language = Object.keys(SUPPORTED_LOCALES).find(langKey => {
return langKey === browserLanguage || langKey.startsWith(browserLanguage + '-')
})
}) as SupportedLocale | undefined
return language || DEFAULT_LANGUAGE
}

View File

@ -529,7 +529,7 @@
"code": "Code",
"quote": "Quote",
"unorderedList": "Unordered List",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Image",
@ -566,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -894,7 +894,10 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description"
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Kód",
"quote": "Citace",
"unorderedList": "Seznam s odrážkami",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Čistý blok",
"link": "Odkaz",
"image": "Obrázek",
@ -566,14 +566,14 @@
"canuse": "Můžete použít vzorec pro filtrování podle relativních datumů.",
"learnhow": "Podívejte se, jak to funguje",
"title": "Datumový vzorec",
"intro": "Datumový vzorec umožňuje určit relativní data, která jsou při použití filtru vyřešena za běhu Vikunjou.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Každý datumový matematický výraz začíná datem ukotvení, které může být buď {0}, nebo datový řetězec končící {1}. Po tomto ukotvení může volitelně následovat jeden nebo více matematických výrazů.",
"similar": "Tyto výrazy jsou podobné výrazům poskytnutým {0} a {1}.",
"add1Day": "Přidat jeden den",
"minus1Day": "Odečíst jeden den",
"roundDay": "Zaokrouhlit dolů na nejbližší den",
"supportedUnits": "Podporované časové jednotky jsou:",
"someExamples": "Některé příklady časových výrazů:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Sekundy",
"minutes": "Minuty",
@ -894,7 +894,10 @@
"color": "Změnit barvu tohoto úkolu",
"move": "Move this task to another project",
"reminder": "Spravovat připomenutí této úlohy",
"description": "Přepnout úpravy popisu úkolu"
"description": "Přepnout úpravy popisu úkolu",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Verze frontendu: {version}",
"apiVersion": "Verze API: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Kode",
"quote": "Citat",
"unorderedList": "Usorteret liste",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Ryd Blok",
"link": "Link",
"image": "Billede",
@ -566,14 +566,14 @@
"canuse": "Du kan bruge datomatematik til at filtrere for relative datoer.",
"learnhow": "Se hvordan det virker",
"title": "Datomatematik",
"intro": "Dato Matematik giver dig mulighed for at angive relative datoer, som er løst løbende af Vikunja, når du anvender filteret.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Hver Datomatematik udtryk starter med en ankerdato, som enten kan være {0} eller en datostreng, der slutter med {1}. Denneanker dato kan eventuelt efterfølges af en eller flere matematik udtryk.",
"similar": "Disse udtryk ligner dem fra {0} og {1}.",
"add1Day": "Læg en dag til",
"minus1Day": "Træk en dag fra",
"roundDay": "Rund ned til nærmeste dag",
"supportedUnits": "Understøttede tidsenheder er:",
"someExamples": "Eksempler på tidsudtryk:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Sekunder",
"minutes": "Minutter",
@ -894,7 +894,10 @@
"color": "Skift farven på denne opgave",
"move": "Move this task to another project",
"reminder": "Administrer påmindelser om denne opgave",
"description": "Slå redigering af opgavebeskrivelse til/fra"
"description": "Slå redigering af opgavebeskrivelse til/fra",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Code",
"quote": "Zitat",
"unorderedList": "Ungeordnete Liste",
"orderedList ": "Ordered List",
"orderedList": "Geordnete Liste",
"cleanBlock": "Formatierung löschen",
"link": "Link",
"image": "Bild",
@ -566,14 +566,14 @@
"canuse": "Du kannst Datumsberechnung verwenden, um nach relativen Daten zu filtern.",
"learnhow": "Sieh dir an, wie es funktioniert",
"title": "Datumsberechnung",
"intro": "Die Datumsberechnung erlaubt es, relative Daten anzugeben, die bei der Anwendung des Filters von Vikunja aufgelöst werden.",
"intro": "Du kannst relative Daten angeben, die bei der Anwendung des Filters von Vikunja aufgelöst werden.",
"expression": "Jeder Ausdruck der Datumsberechnung beginnt mit einem Datumswert, welcher entweder {0} sein kann oder mit {1} endet. Auf diesen Datumswert kann optional ein oder mehrere mathematische Ausdrücke folgen.",
"similar": "Diese Ausdrücke ähneln denen von {0} und {1}.",
"add1Day": "Einen Tag hinzufügen",
"minus1Day": "Einen Tag abziehen",
"roundDay": "Auf den nächsten Tag abrunden",
"supportedUnits": "Unterstützte Zeiteinheiten sind:",
"someExamples": "Einige Beispiele für Zeitausdrücke:",
"supportedUnits": "Unterstützte Zeiteinheiten",
"someExamples": "Beispiele für Zeitausdrücke",
"units": {
"seconds": "Sekunden",
"minutes": "Minuten",
@ -894,7 +894,10 @@
"color": "Die Farbe dieser Aufgabe ändern",
"move": "Move this task to another project",
"reminder": "Erinnerungen für diese Aufgabe verwalten",
"description": "Aufgabenbeschreibung bearbeiten"
"description": "Aufgabenbeschreibung bearbeiten",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend-Version: {version}",
"apiVersion": "API-Version: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Code",
"quote": "Zitaat",
"unorderedList": "Ungordnedi Listä",
"orderedList ": "Ordered List",
"orderedList": "Geordnete Liste",
"cleanBlock": "Formatierig Lösche",
"link": "Link",
"image": "Bild",
@ -566,14 +566,14 @@
"canuse": "Du kannst Datumsberechnung verwenden, um nach relativen Daten zu filtern.",
"learnhow": "Sieh dir an, wie es funktioniert",
"title": "Datumsberechnung",
"intro": "Die Datumsberechnung erlaubt es, relative Daten anzugeben, die bei der Anwendung des Filters von Vikunja aufgelöst werden.",
"intro": "Du kannst relative Daten angeben, die bei der Anwendung des Filters von Vikunja aufgelöst werden.",
"expression": "Jeder Ausdruck der Datumsberechnung beginnt mit einem Datumswert, welcher entweder {0} sein kann oder mit {1} endet. Auf diesen Datumswert kann optional ein oder mehrere mathematische Ausdrücke folgen.",
"similar": "Diese Ausdrücke ähneln denen von {0} und {1}.",
"add1Day": "Einen Tag hinzufügen",
"minus1Day": "Einen Tag abziehen",
"roundDay": "Auf den nächsten Tag abrunden",
"supportedUnits": "Unterstützte Zeiteinheiten sind:",
"someExamples": "Einige Beispiele für Zeitausdrücke:",
"supportedUnits": "Unterstützte Zeiteinheiten",
"someExamples": "Beispiele für Zeitausdrücke",
"units": {
"seconds": "Sekunden",
"minutes": "Minuten",
@ -894,7 +894,10 @@
"color": "Die Farbe dieser Aufgabe ändern",
"move": "Move this task to another project",
"reminder": "Erinnerungen für diese Aufgabe verwalten",
"description": "Aufgabenbeschreibung bearbeiten"
"description": "Aufgabenbeschreibung bearbeiten",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Code",
"quote": "Quote",
"unorderedList": "Unordered List",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Image",
@ -569,14 +569,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -897,7 +897,10 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description"
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1056,4 +1059,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Código",
"quote": "Cita",
"unorderedList": "Lista no ordenada",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Borrar Bloque",
"link": "Enlace",
"image": "Imagen",
@ -566,14 +566,14 @@
"canuse": "Puedes usar ecuaciones para filtrar por fechas relacionadas.",
"learnhow": "Mira cómo funciona",
"title": "Ecuaciones",
"intro": "Las Ecuaciones permiten determinar qué fechas relacionadas te mostrará Vikunja al aplicar este filtro.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Cada expresión matemática empieza con una fecha ancla, que puede ser {0}, o una cadena de texto que acabe en {1}. Opcionalmente, esta fecha puede estar seguida de una o más expresiones.",
"similar": "Estas expresiones son similares a las definidas en {0} y {1}.",
"add1Day": "Añadir un día",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -894,7 +894,10 @@
"color": "Cambia el color de esta tarea",
"move": "Move this task to another project",
"reminder": "Administrar recordatorios de esta tarea",
"description": "Editar la descripción de la tarea"
"description": "Editar la descripción de la tarea",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "Versión de la API: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Code",
"quote": "Citation",
"unorderedList": "Liste non ordonnée",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Bloc propre",
"link": "Lien",
"image": "Image",
@ -566,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -894,7 +894,10 @@
"color": "Changer la couleur de cette tâche",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description"
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Version : {version}",
"apiVersion": "Version de lAPI : {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Codice",
"quote": "Citazione",
"unorderedList": "Elenco puntato",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Pulisci Blocco",
"link": "Link",
"image": "Immagine",
@ -566,14 +566,14 @@
"canuse": "Puoi usare le date calcolate per filtrare per date relative.",
"learnhow": "Scopri come funziona",
"title": "Date Calcolate",
"intro": "Le Date Calcolate ti permettono di specificare date relative che vengono calcolate al volo da Vikunja quando viene applicato il filtro.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Ogni Data Calcolata inizia con una data base, che può essere {0}, o una data con {1} alla fine. Questa data base può essere seguita da una o più espressioni matematiche.",
"similar": "Queste espressioni sono simili a quelle fornite da {0} e {1}.",
"add1Day": "Aggiungi un giorno",
"minus1Day": "Sottrai un giorno",
"roundDay": "Arrotonda per difetto al giorno più vicino",
"supportedUnits": "Le unità di tempo supportate sono:",
"someExamples": "Alcuni esempi di espressione temporale:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Secondi",
"minutes": "Minuti",
@ -894,7 +894,10 @@
"color": "Cambia il colore di questa attività",
"move": "Move this task to another project",
"reminder": "Gestisci i promemoria di questa attività",
"description": "Attiva/Disattiva modifica della descrizione dell'attività"
"description": "Attiva/Disattiva modifica della descrizione dell'attività",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Versione Frontend: {version}",
"apiVersion": "Versione API: {version}"
}
}
}

1059
src/i18n/lang/ja-JP.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -529,7 +529,7 @@
"code": "Code",
"quote": "Citaat",
"unorderedList": "Ongesorteerde lijst",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Afbeelding",
@ -566,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -894,7 +894,10 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description"
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend versie: {version}",
"apiVersion": "API Versie: {version}"
}
}
}

View File

@ -6,10 +6,10 @@
"welcomeEvening": "God Morgen {username}!",
"lastViewed": "Sist sett",
"project": {
"newText": "You can create a new project for your new tasks:",
"new": "New project",
"importText": "Or import your projects and tasks from other services into Vikunja:",
"import": "Import your data into Vikunja"
"newText": "Du kan opprette en ny liste for dine nye oppgaver:",
"new": "Nytt prosjekt",
"importText": "Eller importer lister og oppgaver fra andre tjenester til Vikunja:",
"import": "Importer dine data til Vikunja"
}
},
"404": {
@ -85,7 +85,7 @@
"weekStartSunday": "Søndag",
"weekStartMonday": "Mandag",
"language": "Språk",
"defaultProject": "Default Project",
"defaultProject": "Standard prosjekt",
"timezone": "Tidssone",
"overdueTasksRemindersTime": "Utløpte påminnelses-tid for oppgaver"
},
@ -143,7 +143,7 @@
},
"deletion": {
"title": "Slett kontoen din",
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
"text1": "Sletting av din konto er permanent og kan ikke angres. Vi vil slette alle dine navneområder og prosjekter, oppgaver og alt forbundet med den.",
"text2": "For å fortsette, skriv inn passordet ditt. Du vil motta en e-post med ytterligere instruksjoner.",
"confirm": "Slett min konto",
"requestSuccess": "Forespørselen var vellykket. Du vil motta en e-post med ytterligere instruksjoner.",
@ -157,7 +157,7 @@
},
"export": {
"title": "Eksporter dine kontodata",
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"description": "Du kan be om en kopi av alle Vikunja dataene dine. Dette inkluderer navneområder, lister, oppgaver og alt tilknyttet dem.",
"descriptionPasswordRequired": "Skriv inn passordet for å fortsette:",
"request": "Be om kopi av mine Vikunja Data",
"success": "Du har spurt om dine Vikunja data! Vi sender deg en e-post når den er klar til å laste ned.",
@ -165,193 +165,193 @@
}
},
"project": {
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
"title": "Project Title",
"color": "Color",
"projects": "Projects",
"search": "Type to search for a project…",
"searchSelect": "Click or press enter to select this project",
"shared": "Shared Projects",
"noDescriptionAvailable": "No project description is available.",
"archived": "Dette prosjektet er arkivert. Det er ikke mulig å opprette nye eller redigere oppgaver for det.",
"title": "Prosjekt tittel",
"color": "Farger",
"projects": "Prosjekter",
"search": "Tast for å søke etter et prosjekt…",
"searchSelect": "Klikk eller trykk enter for å velge dette prosjektet",
"shared": "Delte prosjekter",
"noDescriptionAvailable": "Ingen prosjektbeskrivelse er tilgjengelig.",
"create": {
"header": "New project",
"titlePlaceholder": "The project's title goes here…",
"addTitleRequired": "Please specify a title.",
"createdSuccess": "The project was successfully created.",
"addProjectRequired": "Please specify a project or set a default project in the settings."
"header": "Nytt prosjekt",
"titlePlaceholder": "Prosjektets tittel er her…",
"addTitleRequired": "Angi den nye tittelen.",
"createdSuccess": "Prosjektet ble opprettet.",
"addProjectRequired": "Vennligst spesifiser et prosjekt eller angi et standardprosjekt i innstillingene."
},
"archive": {
"title": "Archive \"{project}\"",
"archive": "Archive this project",
"unarchive": "Un-Archive this project",
"unarchiveText": "You will be able to create new tasks or edit it.",
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
"success": "The project was successfully archived."
"title": "Arkiver{project}\"",
"archive": "Arkiver dette prosjektet",
"unarchive": "Av-arkivere dette prosjektet",
"unarchiveText": "Du vil kunne opprette nye oppgaver eller redigere den.",
"archiveText": "Du vil ikke være i stand til å redigere denne listen eller opprette nye oppgaver før du fjerner arkiveringen.",
"success": "Prosjektet ble vellykket arkivert."
},
"background": {
"title": "Set project background",
"remove": "Remove Background",
"upload": "Choose a background from your pc",
"searchPlaceholder": "Search for a background…",
"poweredByUnsplash": "Powered by Unsplash",
"loadMore": "Load more photos",
"success": "The background has been set successfully!",
"removeSuccess": "The background has been removed successfully!"
"title": "Angi prosjektbakgrunn",
"remove": "Fjern bakgrunn",
"upload": "Velg en bakgrunn fra din pc",
"searchPlaceholder": "Søk etter en bakgrunn…",
"poweredByUnsplash": "Drevet av Unsplash",
"loadMore": "Laste inn flere bilder",
"success": "Bakgrunnen er satt vellykket!",
"removeSuccess": "Bakgrunnen har blitt fjernet!"
},
"delete": {
"title": "Delete \"{project}\"",
"header": "Delete this project",
"text1": "Are you sure you want to delete this project and all of its contents?",
"text2": "This includes all tasks and CANNOT BE UNDONE!",
"success": "The project was successfully deleted.",
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
"title": "Slett \"{project}",
"header": "Slett dette prosjektet",
"text1": "Er du sikker på at du vil slette dette prosjektet og alle relaterte data?",
"text2": "Dette inkluderer alle oppgaver og KAN IKKE ANGRES!",
"success": "Prosjektet ble slettet.",
"tasksToDelete": "Dette vil ugjenkallelig fjerne ca. {count} oppgaver.",
"noTasksToDelete": "Dette prosjektet inneholder ingen oppgaver, det bør være trygt å slette."
},
"duplicate": {
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
"title": "Dupliser dette prosjektet",
"label": "Dupliser",
"text": "Velg et navneområde som skal holde det dupliserte prosjektet:",
"success": "Prosjektet ble duplisert."
},
"edit": {
"header": "Edit This Project",
"title": "Edit \"{project}\"",
"titlePlaceholder": "The project title goes here…",
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
"identifier": "Project Identifier",
"identifierPlaceholder": "The project identifier goes here…",
"description": "Description",
"descriptionPlaceholder": "The projects description goes here…",
"color": "Color",
"success": "The project was successfully updated."
"header": "Rediger prosjekt",
"title": "Rediger \"{project}",
"titlePlaceholder": "Prosjekttittelen går her…",
"identifierTooltip": "Prosjektidentifikatoren kan brukes til å identifisere en oppgave på tvers av prosjekter. Du kan sette den til tom for å deaktivere den.",
"identifier": "Prosjekt identifikator",
"identifierPlaceholder": "Prosjektidentifikatoren kommer her…",
"description": "Beskrivelse",
"descriptionPlaceholder": "Beskrivelsen gis her…",
"color": "Farger",
"success": "Prosjektet ble opprettet."
},
"share": {
"header": "Share this project",
"title": "Share \"{project}\"",
"share": "Share",
"header": "Del dette prosjektet",
"title": "Del \"{project}\"",
"share": "Del",
"links": {
"title": "Share Links",
"what": "What is a share link?",
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
"create": "Create a new link share",
"name": "Name (optional)",
"title": "Del link",
"what": "Hva er en lenke for deling?",
"explanation": "Lenker lar deg enkelt dele et prosjekt med andre brukere som ikke har en konto på Vikunja.",
"create": "Opprett en ny lenkedeling",
"name": "Navn (valgfritt)",
"namePlaceholder": "e.g. Lorem Ipsum",
"nameExplanation": "All actions done by this link share will show up with the name.",
"password": "Password (optional)",
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
"noName": "No name set",
"remove": "Remove a link share",
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
"createSuccess": "The link share was successfully created.",
"deleteSuccess": "The link share was successfully deleted",
"view": "View",
"sharedBy": "Shared by {0}"
"nameExplanation": "Alle handlinger utført av denne koblingsdelingen vises med navnet.",
"password": "Passord (valgfritt)",
"passwordExplanation": "Når brukeren autentiseres, må vedkommende angi dette passordet.",
"noName": "Ingen navn satt",
"remove": "Fjern en link deling",
"removeText": "Er du sikker på at du vil fjerne denne lenkedelen? Det vil ikke lenger være mulig å åpne dette prosjektet med denne lenkedelingen. Dette kan ikke angres!",
"createSuccess": "Delingen ble opprettet.",
"deleteSuccess": "Delingen ble slettet",
"view": "Vis",
"sharedBy": "Delt av {0}"
},
"userTeam": {
"typeUser": "user | users",
"typeUser": "bruker | brukere",
"typeTeam": "team | teams",
"shared": "Shared with these {type}",
"you": "You",
"notShared": "Not shared with any {type} yet.",
"removeHeader": "Remove a {type} from the {sharable}",
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
"addedSuccess": "The {type} was successfully added.",
"updatedSuccess": "The {type} was successfully added."
"shared": "Delt med disse {type}",
"you": "Du",
"notShared": "Ikke delt med noen {type} ennå.",
"removeHeader": "Fjern en {type} fra {sharable}",
"removeText": "Er du sikker på at du vil fjerne denne {sharable} fra {type}? Dette kan ikke angres!",
"removeSuccess": "{sharable} ble fjernet fra {type}.",
"addedSuccess": "{type} ble lagt til.",
"updatedSuccess": "{type} ble lagt til."
},
"right": {
"title": "Permission",
"read": "Read only",
"readWrite": "Read & write",
"admin": "Admin"
"title": "Rettighet",
"read": "Kun lese",
"readWrite": "Lese og skrive",
"admin": "Administrator"
},
"attributes": {
"link": "Link",
"delete": "Delete"
"delete": "Slett"
}
},
"list": {
"title": "List",
"add": "Add",
"addPlaceholder": "Add a new task…",
"empty": "This project is currently empty.",
"newTaskCta": "Create a new task.",
"editTask": "Edit Task"
"title": "Liste",
"add": "Legg til",
"addPlaceholder": "Legg til ny oppgave…",
"empty": "Dette prosjektet er for øyeblikket tomt.",
"newTaskCta": "Lage en ny oppgave.",
"editTask": "Endre oppgave"
},
"gantt": {
"title": "Gantt",
"showTasksWithoutDates": "Show tasks which don't have dates set",
"size": "Size",
"default": "Default",
"month": "Month",
"day": "Day",
"hour": "Hour",
"range": "Date Range",
"noDates": "This task has no dates set."
"showTasksWithoutDates": "Vis oppgaver som ikke har datoer angitt",
"size": "Størrelse",
"default": "Standard",
"month": "Måned",
"day": "Dag",
"hour": "Time",
"range": "Datointervall",
"noDates": "Denne oppgaven har ingen datoer satt."
},
"table": {
"title": "Table",
"columns": "Columns"
"title": "Tabell",
"columns": "Kolonner"
},
"kanban": {
"title": "Kanban",
"limit": "Limit: {limit}",
"noLimit": "Not Set",
"doneBucket": "Done bucket",
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
"deleteLast": "You cannot remove the last bucket.",
"addTaskPlaceholder": "Enter the new task title…",
"addTask": "Add a task",
"addAnotherTask": "Add another task",
"addBucket": "Create a new bucket",
"addBucketPlaceholder": "Enter the new bucket title…",
"deleteHeaderBucket": "Delete the bucket",
"deleteBucketText1": "Are you sure you want to delete this bucket?",
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
"deleteBucketSuccess": "The bucket has been deleted successfully.",
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
"collapse": "Collapse this bucket"
"limit": "Grense: {limit}",
"noLimit": "Ikke Angitt",
"doneBucket": "Ferdig bøtte",
"doneBucketHint": "Alle oppgaver som flyttet til denne bøtte vil automatisk bli markert som ferdig.",
"doneBucketHintExtended": "Alle oppgaver som er flyttet inn i den utførte bøtten, vil bli merket som utført automatisk. Alle oppgaver merket som gjort fra andre steder vil også bli flyttet.",
"doneBucketSavedSuccess": "Bøtten er lagret.",
"deleteLast": "Du kan ikke fjerne den siste bøtten.",
"addTaskPlaceholder": "Angi den nye oppgavens tittel…",
"addTask": "Legg til oppgave",
"addAnotherTask": "Legg til en annen oppgave",
"addBucket": "Lag en ny bøtte",
"addBucketPlaceholder": "Angi den nye bøtte tittelen…",
"deleteHeaderBucket": "Slett bøtte",
"deleteBucketText1": "Er du sikker på at du vil slette denne bøtte?",
"deleteBucketText2": "Dette vil ikke slette noen oppgaver, men flytte dem til standard bøtte.",
"deleteBucketSuccess": "Bøtten er slettet.",
"bucketTitleSavedSuccess": "Bøtten er lagret.",
"bucketLimitSavedSuccess": "Grensen på bøtte er lagret.",
"collapse": "Skjul denne bøtten"
},
"pseudo": {
"favorites": {
"title": "Favorites"
"title": "Favoritter"
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"title": "Navneområder & lister",
"namespace": "Navneområde",
"showArchived": "Vis arkiverte",
"noneAvailable": "Du har ingen navneområder akkurat nå.",
"unarchive": "Av-arkiver",
"archived": "Arkivert",
"noProjects": "This namespace does not contain any projects.",
"createProject": "Create a new project in this namespace.",
"noProjects": "Dette navneområdet inneholder ikke noen prosjekter.",
"createProject": "Opprett et nytt prosjekt i dette navneområdet.",
"namespaces": "Navnerom",
"search": "Skriv for å søke etter en etikett…",
"create": {
"title": "Nytt navneområde",
"titleRequired": "Angi den nye tittelen.",
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
"explanation": "Et navneområde er en samling av lister du kan dele og bruke til å organisere listene dine med. I realiteten hører hver liste til et navneområde.",
"tooltip": "Hva er et navneområde?",
"success": "Navneområdet ble opprettet."
},
"archive": {
"titleArchive": "Arkiv \"{namespace}\"",
"titleUnarchive": "Av-Arkiv \"{namespace}\"",
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
"unarchiveText": "You will be able to create new projects or edit it.",
"archiveText": "Du vil ikke kunne redigere dette navneområdet eller opprette nye lister før du avlaster arkivet. Dette vil også arkivere alle lister i dette navneområdet.",
"unarchiveText": "Du vil kunne opprette nye oppgaver eller redigere den.",
"success": "Navnerommet ble arkivert.",
"unarchiveSuccess": "Navnerommet ble vellykket fjernet fra arkivet.",
"description": "If a namespace is archived, you cannot create new projects or edit it."
"description": "Hvis navneområdet er arkivert, kan du ikke opprette nye lister eller redigere det."
},
"delete": {
"title": "Slett \"{namespace}",
"text1": "Er du sikker på at du vil slette dette navneområdet og alt innholdet?",
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
"text2": "Dette inkluderer alle oppgaver og KAN IKKE ANGRES!",
"success": "Navnområdet ble slettet."
},
"edit": {
@ -372,7 +372,7 @@
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
"title": "Delte prosjekter"
},
"favorites": {
"title": "Favoritter"
@ -403,9 +403,9 @@
},
"create": {
"title": "Nytt lagret filter",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"description": "Et lagret filter er en virtuell liste som beregnes fra et sett med filtre hver gang det åpnes. Når du er opprettet, vil det vises i et eget navneområde.",
"action": "Opprett nytt filter",
"titleRequired": "Please provide a title for the filter."
"titleRequired": "Skriv inn en tittel for filteret."
},
"delete": {
"header": "Slett dette lagrede filteret",
@ -435,7 +435,7 @@
"label": {
"title": "Etiketter",
"manage": "Behandle etiketter",
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
"description": "Klikk på en etikett for å redigere den. Du kan redigere alle etikettene du lagde, du kan bruke alle etikettene som er tilknyttet en oppgave som du har tilgang til.",
"newCTA": "Du har ingen etiketter for øyeblikket.",
"search": "Skriv for å søke etter en etikett…",
"create": {
@ -460,7 +460,7 @@
},
"sharing": {
"authenticating": "Autentiserer…",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"passwordRequired": "Denne delte listen krever et passord. Vennligst skriv det nedenfor:",
"error": "En feil oppsto.",
"invalidPassword": "Det oppgitte passordet er ugyldig."
},
@ -529,7 +529,7 @@
"code": "Kode",
"quote": "Sitat",
"unorderedList": "Uordnet liste",
"orderedList ": "Ordered List",
"orderedList": "Sortert liste",
"cleanBlock": "Tøm blokk",
"link": "Link",
"image": "Bilde",
@ -572,8 +572,8 @@
"add1Day": "Legg til en dag",
"minus1Day": "Trekk fra en dag",
"roundDay": "Rund ned til nærmeste verdi",
"supportedUnits": "Støttede tidsenheter er:",
"someExamples": "Noen eksempler på tidsuttrykk:",
"supportedUnits": "Støttede tidsenheter",
"someExamples": "Noen eksempler på tidsuttrykk",
"units": {
"seconds": "Sekunder",
"minutes": "Minutter",
@ -602,7 +602,7 @@
"addReminder": "Legg til en ny påminnelse…",
"doneSuccess": "Oppgaven ble markert som ferdig.",
"undoneSuccess": "Oppgaven ble fjernet som ferdig.",
"undo": "Undo",
"undo": "Angre",
"openDetail": "Åpne detaljvisning",
"checklistTotal": "{checked} av {total} oppgaver",
"checklistAllDone": "{total} oppgaver",
@ -619,7 +619,7 @@
"chooseDueDate": "Klikk her for å angi en forfallsdato",
"chooseStartDate": "Klikk her for å angi en startdato",
"chooseEndDate": "Klikk her for å angi en sluttdato",
"move": "Move task to a different project",
"move": "Flytt oppgaven til en annen liste",
"done": "Marker som utført!",
"undone": "Merk som uferdig",
"created": "Opprettet {0} av {1}",
@ -627,7 +627,7 @@
"doneAt": "Ferdig {0}",
"updateSuccess": "Oppgaven ble lagret.",
"deleteSuccess": "Oppgaven har blitt slettet.",
"belongsToProject": "This task belongs to project '{project}'",
"belongsToProject": "Denne oppgaven tilhører listen '{project}'",
"due": "Forfallsdato {at}",
"closePopup": "Lukk popup",
"delete": {
@ -647,7 +647,7 @@
"percentDone": "Angi fremdrift",
"attachments": "Legg til vedlegg",
"relatedTasks": "Legg til relasjon",
"moveProject": "Move",
"moveProject": "Flytt",
"color": "Sett Farge",
"delete": "Slett",
"favorite": "Legg til i favoritter",
@ -674,21 +674,21 @@
"updated": "Oppdatert"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedProjectThroughParentNamespace": "Du kan ikke slutte å abonnere her fordi du abonnerer på denne listen gjennom dens navneområde.",
"subscribedTaskThroughParentNamespace": "Du kan ikke slutte å abonnere her fordi du abonnerer på denne oppgaven gjennom navneområdet.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedTaskThroughParentProject": "Du kan ikke melde deg ut her fordi du abonnerer på denne oppgaven gjennom prosjektet.",
"subscribedNamespace": "Du abonnerer for øyeblikket på dette navneområdet og vil motta varsler for endringer.",
"notSubscribedNamespace": "Du abonnerer ikke på dette navneområdet og vil ikke motta varsler for endringer.",
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
"subscribedProject": "Du abonnerer for øyeblikket på dette prosjektet og vil motta varsler for endringer.",
"notSubscribedProject": "Du abonnerer ikke på dette prosjektet og vil ikke motta varsler for endringer.",
"subscribedTask": "Du abonnerer for øyeblikket på denne oppgaven og vil motta varsler for endringer.",
"notSubscribedTask": "Du abonnerer ikke på denne oppgaven og vil ikke motta varsler for endringer.",
"subscribe": "Abonnerer",
"unsubscribe": "Avslutt abonnement",
"subscribeSuccessNamespace": "Du abonnerer nå på dette navneområdet",
"unsubscribeSuccessNamespace": "Du blir nå avmeldt dette navneområdet",
"subscribeSuccessProject": "You are now subscribed to this project",
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
"subscribeSuccessProject": "Du abonnerer nå på dette prosjektet",
"unsubscribeSuccessProject": "Du har nå avsluttet abonnementet for dette prosjektet",
"subscribeSuccessTask": "Du abonnerer nå på denne oppgaven",
"unsubscribeSuccessTask": "Du har nå avsluttet abonnementet for denne oppgaven"
},
@ -762,7 +762,7 @@
"new": "Ny oppgaveforbindelse",
"searchPlaceholder": "Skriv søk etter en ny oppgave å legge til som relatert…",
"createPlaceholder": "Legg til denne som ny relatert oppgave",
"differentProject": "This task belongs to a different project.",
"differentProject": "Denne oppgaven tilhører et annet prosjekt.",
"differentNamespace": "Denne oppgaven tilhører en annen navneområde.",
"noneYet": "Ingen arbeidsrelasjoner ennå.",
"delete": "Slett relasjon",
@ -812,10 +812,10 @@
"priority1": "For å angi en oppgaves prioritet, legg til et nummer 1-5, med en {prefix} som prefiks.",
"priority2": "Jo høyere tallet er, desto høyere prioritet.",
"assignees": "For å direkte tilordne oppgaven til en bruker må du legge til brukernavnet deres med {prefix} som er prefikset på oppgaven.",
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
"project2": "This will return an error if the project does not exist.",
"project3": "To use spaces, simply add a \" or ' around the project name.",
"project4": "For example: {prefix}\"Project with spaces\".",
"project1": "For å angi et prosjekt for oppgaven som skal vises i, angi dets navn med {prefix}.",
"project2": "Dette vil returnere en feil dersom prosjektet ikke finnes.",
"project3": "For å bruke mellomrom, legg bare til en \" eller ' rundt navnet på prosjektet.",
"project4": "For eksempel: {prefix}\"Prosjekt med mellomrom\".",
"dateAndTime": "Dato og tid",
"date": "Hvilken som helst dato vil bli brukt som forfallsdato for den nye oppgaven. Du kan bruke datoer i hvilket som helst format:",
"dateWeekday": "hver ukedag vil bruke neste dato med den datoen",
@ -848,19 +848,19 @@
"delete": {
"header": "Slett gruppen",
"text1": "Er du sikker på at du vil slette denne gruppen og alle dets medlemmer?",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"text2": "Alle teammedlemmer vil miste tilgang til prosjekter og navneområder som deles med dette teamet. KAN IKKE ANGRES!",
"success": "Gruppen ble slettet."
},
"deleteUser": {
"header": "Fjerne en bruker fra gruppen",
"text1": "Er du sikker på at du vil fjerne bruker fra denne gruppen?",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"text2": "De vil miste tilgang til alle prosjekter og namespaces dette teamet har tilgang til. Dette KAN IKKE ANGRES!",
"success": "Brukeren ble slettet fra gruppen."
},
"leave": {
"title": "Forlat gruppen",
"text1": "Er du sikker på at du vil forlate denne gruppen?",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "Du vil miste tilgang til alle prosjekter og namespaces dette teamet har tilgang til. Hvis du ombestemmer deg, må du ha en lagadministrator for å legge deg til igjen.",
"success": "Du har forlatt gruppen."
}
},
@ -892,22 +892,25 @@
"attachment": "Legg til et vedlegg til denne oppgaven",
"related": "Endre relaterte oppgaver for denne oppgaven",
"color": "Endre fargen på denne oppgaven",
"move": "Move this task to another project",
"move": "Flytt denne oppgaven til et annet prosjekt",
"reminder": "Behandle påminnelser om denne oppgaven",
"description": "Veksle redigering av oppgavebeskrivelsen"
"description": "Veksle redigering av oppgavebeskrivelsen",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
"switchToListView": "Switch to list view",
"switchToGanttView": "Switch to gantt view",
"switchToKanbanView": "Switch to kanban view",
"switchToTableView": "Switch to table view"
"title": "Prosjektvisning",
"switchToListView": "Byttet til listevisning",
"switchToGanttView": "Bytt til gantt-visning",
"switchToKanbanView": "Bytt til kanban visning",
"switchToTableView": "Bytt til tabellvisning"
},
"navigation": {
"title": "Navigasjon",
"overview": "Naviger til oversikt",
"upcoming": "Gå til kommende oppgaver",
"namespaces": "Navigate to namespaces & projects",
"namespaces": "Gå til navneområder & prosjekter",
"labels": "Naviger til etiketter",
"teams": "Naviger til gruppe"
}
@ -924,7 +927,7 @@
"unarchive": "Av-arkiver",
"setBackground": "Bruk som bakgrunn",
"share": "Del",
"newProject": "New project"
"newProject": "Nytt prosjekt"
},
"apiConfig": {
"url": "Vikunja URL",
@ -943,24 +946,24 @@
"notification": {
"title": "Varsler",
"none": "Du har ingen varsler på dette tidspunktet!",
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
"explainer": "Varsler vil vises her når handlinger på navneområder, prosjekter, lister eller oppgaver du abonnerer på."
},
"quickActions": {
"commands": "Kommandoer",
"placeholder": "Skriv en kommando eller søk…",
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
"hint": "Du kan bruke {project} for å begrense søket til en liste. Kombiner {project} eller {label} (etiketter) med et søk for å søke etter en oppgave med disse etikettene eller på den listen. Bruk {assignee} for bare å søke etter lag.",
"tasks": "Oppgaver",
"projects": "Projects",
"projects": "Prosjekter",
"teams": "Grupper",
"newProject": "Enter the title of the new project…",
"newProject": "Skriv tittelen på det nye prosjektet…",
"newTask": "Skriv tittelen på den nye oppgaven…",
"newNamespace": "Skriv inn tittelen på det nye navneområdet…",
"newTeam": "Skriv inn navnet på den nye gruppen…",
"createTask": "Create a task in the current project ({title})",
"createProject": "Create a project in the current namespace ({title})",
"createTask": "Opprett en oppgave i det gjeldende prosjektet ({title})",
"createProject": "Opprett et prosjekt i gjeldende navneområde ({title})",
"cmds": {
"newTask": "Ny oppgave",
"newProject": "New project",
"newProject": "Nytt prosjekt",
"newNamespace": "Nytt navneområde",
"newTeam": "Ny gruppe"
}
@ -992,15 +995,15 @@
"1018": "Innstillingen av brukerens avatartype er ugyldig.",
"2001": "ID kan ikke være tom eller 0.",
"2002": "Noen av forespørselsdataene var ugyldig.",
"3001": "The project does not exist.",
"3004": "You need to have read permissions on that project to perform that action.",
"3005": "The project title cannot be empty.",
"3006": "The project share does not exist.",
"3007": "A project with this identifier already exists.",
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
"4001": "The project task text cannot be empty.",
"4002": "The project task does not exist.",
"4003": "All bulk editing tasks must belong to the same project.",
"3001": "Prosjektet finnes ikke.",
"3004": "Du må ha lesetilgang til prosjektet for å utføre den handlingen.",
"3005": "Tittelen kan ikke være tom.",
"3006": "Prosjektdeling finnes ikke.",
"3007": "Et prosjekt med denne identifikatoren eksisterer allerede.",
"3008": "Prosjektet er arkivert og kan derfor bare leses inn. Dette gjelder også for alle oppgaver som er tilknyttet dette prosjektet.",
"4001": "Prosjektets oppgavetekst kan ikke være tom.",
"4002": "Prosjektoppgaven finnes ikke.",
"4003": "Alle bulkredigering oppgaver må tilhøre samme prosjekt.",
"4004": "Trenger minst én oppgave når masseredigeringsoppgaver skal utføres.",
"4005": "Du har ikke rettigheter til å redigere denne siden.",
"4006": "Du kan ikke sette en overordnet oppgave som oppgaven selv.",
@ -1026,21 +1029,21 @@
"5012": "Navneområdet er arkivert og kan derfor kun leses på.",
"6001": "Gruppe nanvet kan ikke være tomt.",
"6002": "Gruppen finnes ikke.",
"6004": "The team already has access to that namespace or project.",
"6004": "Teamet har allerede tilgang til det navneområdet eller prosjektet.",
"6005": "Brukeren er allerede medlem av gruppen.",
"6006": "Kan ikke slette siste gruppemedlem.",
"6007": "The team does not have access to the project to perform that action.",
"7002": "The user already has access to that project.",
"7003": "You do not have access to that project.",
"6007": "Gruppen har ikke tilgang til prosjektet for å utføre den handlingen.",
"7002": "Brukeren har allerede tilgang til det prosjektet.",
"7003": "Du har ikke tilgang til det prosjektet.",
"8001": "Denne etiketten finnes allerede på den oppgaven.",
"8002": "Etiketten finnes ikke.",
"8003": "Du har ikke tilgang til denne etiketten.",
"9001": "Linken er ugyldig.",
"10001": "Bøtten finnes ikke.",
"10002": "The bucket does not belong to that project.",
"10003": "You cannot remove the last bucket on a project.",
"10002": "Denne bøtte tilhører ikke det prosjektet.",
"10003": "Du kan ikke fjerne den siste bøtten på et prosjekt.",
"10004": "Du kan ikke legge til oppgaven i denne bøtte fordi den allerede overskrider grensen på oppgaver som den kan holde.",
"10005": "There can be only one done bucket per project.",
"10005": "Det kan bare finnes én ferdigstilt bøtte per prosjekt.",
"11001": "Det lagrede filteret finnes ikke.",
"11002": "Lagrede filtre er ikke tilgjengelige for lenke delinger.",
"12001": "Abonnement enhetstypen er ugyldig.",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend versjon: {version}",
"apiVersion": "API versjon: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Kod",
"quote": "Cytat",
"unorderedList": "Lista nieuporządkowana",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Wyczyść blok",
"link": "Link",
"image": "Obraz",
@ -566,14 +566,14 @@
"canuse": "Możesz użyć kalkulacji dat do względnego filtrowania dat.",
"learnhow": "Sprawdź jak to działa",
"title": "Kalkulacja daty",
"intro": "Kalkulacja daty pozwala względnie określić daty, które są przetwarzane przez Vikunję w locie, w czasie stosowania filtra.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Każde wyrażenie kalkulacji daty rozpoczyna się datą zakotwiczenia, którą może być {0} lub wyrażeniem daty zakończonym {1}. Po tej dacie zakotwiczenia opcjonalnie może następować jedno lub więcej wyrażeń matematycznych.",
"similar": "Te wyrażenia są podobne do tych dostarczonych przez {0} i {1}.",
"add1Day": "Dodaj jeden dzień",
"minus1Day": "Odejmij jeden dzień",
"roundDay": "Zaokrąglij w dół do najbliższego dnia",
"supportedUnits": "Obsługiwane jednostki czasu to:",
"someExamples": "Kilka przykładów wyrażeń czasowych:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Sekundy",
"minutes": "Minuty",
@ -894,7 +894,10 @@
"color": "Zmień kolor tego zadania",
"move": "Move this task to another project",
"reminder": "Zarządzaj przypomnieniami o tym zadaniu",
"description": "Toggle editing of the task description"
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Wersja frontendu: {version}",
"apiVersion": "Wersja API: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Código",
"quote": "Citação",
"unorderedList": "Lista não ordenada",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Imagem",
@ -566,14 +566,14 @@
"canuse": "Você pode usar matemática de data para filtrar datas relativas.",
"learnhow": "Veja como funciona",
"title": "Matemática de Data",
"intro": "A matemática de data permite que você especifique datas relativas que são resolvidas em tempo real pelo Vikunja ao aplicar o filtro.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Adicionar um dia",
"minus1Day": "Subtrair um dia",
"roundDay": "Round down to the nearest day",
"supportedUnits": "As unidades de tempo suportadas são:",
"someExamples": "Alguns exemplos de expressões temporais:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Segundos",
"minutes": "Minutos",
@ -894,7 +894,10 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description"
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -6,10 +6,10 @@
"welcomeEvening": "Boa Tarde {username}!",
"lastViewed": "Visto recentemente",
"project": {
"newText": "You can create a new project for your new tasks:",
"new": "New project",
"importText": "Or import your projects and tasks from other services into Vikunja:",
"import": "Import your data into Vikunja"
"newText": "Podes criar um novo projeto para as tuas novas tarefas:",
"new": "Novo projeto",
"importText": "Ou importar os teus projetos e tarefas de outros serviços para o Vikunja:",
"import": "Importar os teus dados para o Vikunja"
}
},
"404": {
@ -85,7 +85,7 @@
"weekStartSunday": "Domingo",
"weekStartMonday": "Segunda-Feira",
"language": "Idioma",
"defaultProject": "Default Project",
"defaultProject": "Projeto Padrão",
"timezone": "Fuso Horário",
"overdueTasksRemindersTime": "Horário do e-mail de lembrete de tarefas pendentes"
},
@ -143,7 +143,7 @@
},
"deletion": {
"title": "Eliminar a tua conta Vikunja",
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
"text1": "A eliminação da tua conta é permanente e não pode ser revertida. Vão ser eliminados todos os teus espaços, projetos, tarefas e tudo o que lhes está associado.",
"text2": "Para prosseguires, introduz por favor a tua palavra-passe. Receberás um e-mail com mais instruções.",
"confirm": "Eliminar a minha conta",
"requestSuccess": "A solicitação foi bem sucedida. Receberás um e-mail com mais instruções.",
@ -157,7 +157,7 @@
},
"export": {
"title": "Exportar os teus dados do Vikunja",
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"description": "Podes solicitar uma cópia de todos os teus dados do Vikunja. Isso inclui Espaços, Projetos, Tarefas e tudo o que lhes está associado. Podes importar esses dados em qualquer instância do Vikunja através da função de migração.",
"descriptionPasswordRequired": "Por favor, introduz a tua palavra-passe para continuar:",
"request": "Solicitar uma cópia dos meus dados do Vikunja",
"success": "Solicitaste com sucesso os teus dados do Vikunja! Enviaremos um e-mail assim que estiverem prontos para download.",
@ -165,193 +165,193 @@
}
},
"project": {
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
"title": "Project Title",
"color": "Color",
"projects": "Projects",
"search": "Type to search for a project…",
"searchSelect": "Click or press enter to select this project",
"shared": "Shared Projects",
"noDescriptionAvailable": "No project description is available.",
"archived": "Este projeto está arquivado. Não é possível editar ou criar novas tarefas para ele.",
"title": "Título do Projeto",
"color": "Cor",
"projects": "Projetos",
"search": "Escreve para pesquisar por um projeto…",
"searchSelect": "Clica ou pressiona Enter para selecionar este projeto",
"shared": "Projetos Partilhados",
"noDescriptionAvailable": "Não está disponível nenhuma descrição do projeto.",
"create": {
"header": "New project",
"titlePlaceholder": "The project's title goes here…",
"addTitleRequired": "Please specify a title.",
"createdSuccess": "The project was successfully created.",
"addProjectRequired": "Please specify a project or set a default project in the settings."
"header": "Novo projeto",
"titlePlaceholder": "O título do projeto será aqui…",
"addTitleRequired": "Por favor, especifica um título.",
"createdSuccess": "O projeto foi criado com sucesso.",
"addProjectRequired": "Por favor, especifica um projeto ou define um projeto padrão nas configurações."
},
"archive": {
"title": "Archive \"{project}\"",
"archive": "Archive this project",
"unarchive": "Un-Archive this project",
"unarchiveText": "You will be able to create new tasks or edit it.",
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
"success": "The project was successfully archived."
"title": "Arquivar \"{project}\"",
"archive": "Arquivar este projeto",
"unarchive": "Desarquivar este projeto",
"unarchiveText": "Vais ser capaz de criar novas tarefas ou editá-las.",
"archiveText": "Não poderás editar este projeto ou criar novas tarefas até o desarquivares.",
"success": "Este projeto foi arquivado com sucesso."
},
"background": {
"title": "Set project background",
"remove": "Remove Background",
"upload": "Choose a background from your pc",
"searchPlaceholder": "Search for a background…",
"poweredByUnsplash": "Powered by Unsplash",
"loadMore": "Load more photos",
"success": "The background has been set successfully!",
"removeSuccess": "The background has been removed successfully!"
"title": "Definir a imagem de fundo do projeto",
"remove": "Remover Imagem de Fundo",
"upload": "Escolhe uma imagem de fundo do teu pc",
"searchPlaceholder": "Procura por uma imagem de fundo…",
"poweredByUnsplash": "Fornecido por Unsplash",
"loadMore": "Carregar mais fotos",
"success": "A imagem de fundo foi definida com sucesso!",
"removeSuccess": "A imagem de fundo foi removida com sucesso!"
},
"delete": {
"title": "Delete \"{project}\"",
"header": "Delete this project",
"text1": "Are you sure you want to delete this project and all of its contents?",
"text2": "This includes all tasks and CANNOT BE UNDONE!",
"success": "The project was successfully deleted.",
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
"title": "Eliminar \"{project}\"",
"header": "Eliminar este projeto",
"text1": "Tens a certeza que prentedes apagar este projeto e todo o seu conteúdo?",
"text2": "Isto inclui todas as tarefas e NÃO PODE SER REVERTIDO!",
"success": "O projeto foi eliminado com sucesso.",
"tasksToDelete": "Isto irá remover irrevogavelmente aprox. {count} tarefas.",
"noTasksToDelete": "Este projeto não contém tarefas, deve ser seguro eliminá-lo."
},
"duplicate": {
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
"title": "Duplicar este projeto",
"label": "Duplicar",
"text": "Selecione um espaço para colocar o projeto duplicado:",
"success": "O projeto foi duplicado com sucesso."
},
"edit": {
"header": "Edit This Project",
"title": "Edit \"{project}\"",
"titlePlaceholder": "The project title goes here…",
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
"identifier": "Project Identifier",
"identifierPlaceholder": "The project identifier goes here…",
"description": "Description",
"descriptionPlaceholder": "The projects description goes here…",
"color": "Color",
"success": "The project was successfully updated."
"header": "Editar Este Projeto",
"title": "Editar \"{project}\"",
"titlePlaceholder": "O título do projeto será aqui…",
"identifierTooltip": "O identificador do projeto pode ser utilizado para identificar de forma única uma tarefa entre diferentes projetos. Pode defini-lo como vazio para o desativar.",
"identifier": "Identificador do Projeto",
"identifierPlaceholder": "O identificador do porjeto será aqui…",
"description": "Descrição",
"descriptionPlaceholder": "A descrição do projeto será aqui…",
"color": "Cor",
"success": "O projeto foi atualizado com sucesso."
},
"share": {
"header": "Share this project",
"title": "Share \"{project}\"",
"share": "Share",
"header": "Partilhar este projeto",
"title": "Partilhar \"{project}\"",
"share": "Partilhar",
"links": {
"title": "Share Links",
"what": "What is a share link?",
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
"create": "Create a new link share",
"name": "Name (optional)",
"namePlaceholder": "e.g. Lorem Ipsum",
"nameExplanation": "All actions done by this link share will show up with the name.",
"password": "Password (optional)",
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
"noName": "No name set",
"remove": "Remove a link share",
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
"createSuccess": "The link share was successfully created.",
"deleteSuccess": "The link share was successfully deleted",
"view": "View",
"sharedBy": "Shared by {0}"
"title": "Links Partilhados",
"what": "Como funcionam os links partilhados?",
"explanation": "Links Partilhados permite-lhe partilhar facilmente um projeto com outros utilizadores que não têm uma conta no Vikunja.",
"create": "Criar um novo link partilhado",
"name": "Nome (opcional)",
"namePlaceholder": "ex.: Lorem Ipsum",
"nameExplanation": "Todas as ações realizadas através deste link partilhado vão aparecer com este nome.",
"password": "Palavra-passe (opcional)",
"passwordExplanation": "Ao autenticar-se, ao utilizador vai ser requerido introduzir esta palavra-passe.",
"noName": "Nenhum nome definido",
"remove": "Remover um link partilhado",
"removeText": "Tens a certeza que queres remover este link partilhado? Não será mais possível aceder a este projeto utilizando este link partilhado. Isto não pode ser revertido!",
"createSuccess": "O link partilhado foi criado com sucesso.",
"deleteSuccess": "O link partilhado foi eliminado com sucesso",
"view": "Visualizar",
"sharedBy": "Partilhado por {0}"
},
"userTeam": {
"typeUser": "user | users",
"typeTeam": "team | teams",
"shared": "Shared with these {type}",
"you": "You",
"notShared": "Not shared with any {type} yet.",
"removeHeader": "Remove a {type} from the {sharable}",
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
"addedSuccess": "The {type} was successfully added.",
"updatedSuccess": "The {type} was successfully added."
"typeUser": "utilizador | utilizadores",
"typeTeam": "equipa | equipas",
"shared": "Partilhado com seguintes {type}",
"you": "Tu",
"notShared": "Ainda não partilhado com {type}.",
"removeHeader": "Remover {type} de {sharable}",
"removeText": "Tens a certeza que prentendes remover {sharable} de {type}? Isto não pode ser revertido!",
"removeSuccess": "{sharable} foi removido com sucesso de {type}.",
"addedSuccess": "{type} foi adicionado com sucesso.",
"updatedSuccess": "{type} foi adicionado com sucesso."
},
"right": {
"title": "Permission",
"read": "Read only",
"readWrite": "Read & write",
"admin": "Admin"
"title": "Permissão",
"read": "Apenas de leitura",
"readWrite": "Leitura e escrita",
"admin": "Administrador"
},
"attributes": {
"link": "Link",
"delete": "Delete"
"delete": "Eliminar"
}
},
"list": {
"title": "List",
"add": "Add",
"addPlaceholder": "Add a new task…",
"empty": "This project is currently empty.",
"newTaskCta": "Create a new task.",
"editTask": "Edit Task"
"title": "Lista",
"add": "Adicionar",
"addPlaceholder": "Adicionar uma nova tarefa…",
"empty": "Este projeto está atualmente vazio.",
"newTaskCta": "Cria uma nova tarefa.",
"editTask": "Editar Tarefa"
},
"gantt": {
"title": "Gantt",
"showTasksWithoutDates": "Show tasks which don't have dates set",
"size": "Size",
"default": "Default",
"month": "Month",
"day": "Day",
"hour": "Hour",
"range": "Date Range",
"noDates": "This task has no dates set."
"showTasksWithoutDates": "Mostrar tarefas que não têm datas atríbuidas",
"size": "Tamanho",
"default": "Padrão",
"month": "Mês",
"day": "Dia",
"hour": "Hora",
"range": "Intervalo de Datas",
"noDates": "Esta tarefa não tem datas definidas."
},
"table": {
"title": "Table",
"columns": "Columns"
"title": "Tabela",
"columns": "Colunas"
},
"kanban": {
"title": "Kanban",
"limit": "Limit: {limit}",
"noLimit": "Not Set",
"doneBucket": "Done bucket",
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
"deleteLast": "You cannot remove the last bucket.",
"addTaskPlaceholder": "Enter the new task title…",
"addTask": "Add a task",
"addAnotherTask": "Add another task",
"addBucket": "Create a new bucket",
"addBucketPlaceholder": "Enter the new bucket title…",
"deleteHeaderBucket": "Delete the bucket",
"deleteBucketText1": "Are you sure you want to delete this bucket?",
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
"deleteBucketSuccess": "The bucket has been deleted successfully.",
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
"collapse": "Collapse this bucket"
"limit": "Limite: {limit}",
"noLimit": "Não Definido",
"doneBucket": "Conjunto concluído",
"doneBucketHint": "Todas as tarefas movidas para este conjunto serão automaticamente marcadas como concluídas.",
"doneBucketHintExtended": "Todas as tarefas movidas para o conjunto concluído serão marcadas automaticamente como concluídas. Todas as tarefas marcadas como concluídas em outro lugar também serão movidas.",
"doneBucketSavedSuccess": "O conjunto concluído foi salvo com sucesso.",
"deleteLast": "Não podes remover o ultimo conjunto.",
"addTaskPlaceholder": "Introduz o título da nova tarefa…",
"addTask": "Adicionar uma tarefa",
"addAnotherTask": "Adicionar outra tarefa",
"addBucket": "Criar um novo conjunto",
"addBucketPlaceholder": "Introduz o título do novo conjunto…",
"deleteHeaderBucket": "Eliminar o conjunto",
"deleteBucketText1": "Tens a certeza que pretendes eliminar este conjunto?",
"deleteBucketText2": "Isto não vai eliminar nenhuma tarefa, mas sim movê-la para o conjunto padrão.",
"deleteBucketSuccess": "O conjunto foi eliminado com sucesso.",
"bucketTitleSavedSuccess": "O título do conjunto foi salvo com sucesso.",
"bucketLimitSavedSuccess": "O limite do conjunto foi salvo com sucesso.",
"collapse": "Encolher este conjunto"
},
"pseudo": {
"favorites": {
"title": "Favorites"
"title": "Favoritos"
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"title": "Espaços e Projetos",
"namespace": "Espaço",
"showArchived": "Mostrar Arquivados",
"noneAvailable": "Por enquanto não tens nenhum espaço.",
"unarchive": "Desarquivar",
"archived": "Arquivado",
"noProjects": "This namespace does not contain any projects.",
"createProject": "Create a new project in this namespace.",
"noProjects": "Este espaço não contém qualquer projeto.",
"createProject": "Criar uma novo projeto neste espaço.",
"namespaces": "Espaços",
"search": "Escreva para pesquisar por um espaço…",
"create": {
"title": "Novo espaço",
"titleRequired": "Por favor, especifica um título.",
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
"explanation": "Um espaço é uma coleção de projetos que podes partilhar e utilizar para organizar as tuas listas. De facto, cada projeto pertence a um espaço.",
"tooltip": "O que é um espaço?",
"success": "O espaço foi criado com sucesso."
},
"archive": {
"titleArchive": "Arquivar \"{namespace}\"",
"titleUnarchive": "Desarquivar \"{namespace}\"",
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
"unarchiveText": "You will be able to create new projects or edit it.",
"archiveText": "Não será possível editar este espaço nem criar novos projetos enquanto não o desarquivares. Isto também irá arquivar todas os projetos existentes neste espaço.",
"unarchiveText": "Poderás criar novos projetos ou editá-los.",
"success": "O espaço foi arquivado com sucesso.",
"unarchiveSuccess": "O espaço foi desarquivado com sucesso.",
"description": "If a namespace is archived, you cannot create new projects or edit it."
"description": "Se um espaço estiver arquivado, não poderás criar novos projetos ou editá-los."
},
"delete": {
"title": "Eliminar \"{namespace}\"",
"text1": "Tens a certeza que pretendes eliminar este espaço e todo o seu conteúdo?",
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
"text2": "Isto inclui todas os projetos e tarefas, e NÃO PODE SER REVERTIDO!",
"success": "O espaço foi eliminado com sucesso."
},
"edit": {
@ -372,7 +372,7 @@
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
"title": "Projetos Partilhados"
},
"favorites": {
"title": "Favoritos"
@ -403,7 +403,7 @@
},
"create": {
"title": "Novo Filtro Memorizado",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"description": "Um filtro memorizado é uma lista virtual que é compilada a partir de um conjunto de filtros de cada vez que é acedido. Uma vez criado, irá aparecer num espaço especial.",
"action": "Criar novo filtro memorizado",
"titleRequired": "Por favor, insere um título para o filtro."
},
@ -435,7 +435,7 @@
"label": {
"title": "Etiquetas",
"manage": "Gerir etiquetas",
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
"description": "Clica numa etiqueta para a editares. Podes editar todas as etiquetas que criaste, podes utilizar todas as etiquetas que estão associadas a uma tarefa a cujo projeto tens acesso.",
"newCTA": "Atualmente não tens quaisquer etiquetas.",
"search": "Escreve para pesquisar uma etiqueta…",
"create": {
@ -460,7 +460,7 @@
},
"sharing": {
"authenticating": "A autenticar…",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"passwordRequired": "Este projeto partilhado requer uma palavra-passe. Por favor, introduz-a abaixo:",
"error": "Ocorreu um erro.",
"invalidPassword": "A palavra-passe é inválida."
},
@ -529,7 +529,7 @@
"code": "Código",
"quote": "Citação",
"unorderedList": "Lista Não Ordenada",
"orderedList ": "Ordered List",
"orderedList": "Lista Ordenada",
"cleanBlock": "Limpar Formatação",
"link": "Link",
"image": "Imagem",
@ -566,14 +566,14 @@
"canuse": "Podes utilizar cálculo de data para filtrar por datas relativas.",
"learnhow": "Vê como funciona",
"title": "Cálculo de Data",
"intro": "O cálculo de data permite especificar datas relativas resolvidas em tempo real pelo Vikunja na aplicação do filtro.",
"intro": "Especifica datas relativas que serão resolvidas em tempo real pela Vikunja ao aplicar o filtro.",
"expression": "Cada expressão de Cálculo de Data inicia com uma data âncora, que tanto pode ser {0}, como uma expressão de data terminada com {1}. Esta data âncora pode ser opcionalmente seguida de uma ou mais expressões matemáticas.",
"similar": "Essas expressões são semelhantes às fornecidas por {0} e {1}.",
"add1Day": "Adicionar um dia",
"minus1Day": "Subtrair um dia",
"roundDay": "Arredondar para baixo para o dia mais próximo",
"supportedUnits": "As unidades de tempo suportadas são:",
"someExamples": "Alguns exemplos de expressões de tempo:",
"supportedUnits": "Unidades de tempo suportadas",
"someExamples": "Exemplos de expressões de tempo",
"units": {
"seconds": "Segundos",
"minutes": "Minutos",
@ -619,7 +619,7 @@
"chooseDueDate": "Clica aqui para definir uma data de vencimento",
"chooseStartDate": "Clica aqui para definir uma data de início",
"chooseEndDate": "Clica aqui para definir uma data de fim",
"move": "Move task to a different project",
"move": "Mover tarefa para outro projeto",
"done": "Marcar como concluída!",
"undone": "Marcar como não concluída",
"created": "Criada {0} por {1}",
@ -627,7 +627,7 @@
"doneAt": "Concluído {0}",
"updateSuccess": "A tarefa foi salva com sucesso.",
"deleteSuccess": "A tarefa foi eliminada com sucesso.",
"belongsToProject": "This task belongs to project '{project}'",
"belongsToProject": "Esta tarefa pertence ao projeto '{project}'",
"due": "Vence {at}",
"closePopup": "Fechar janela",
"delete": {
@ -647,7 +647,7 @@
"percentDone": "Definir Progresso",
"attachments": "Adicionar Anexos",
"relatedTasks": "Adicionar Relação",
"moveProject": "Move",
"moveProject": "Mover",
"color": "Definir Cor",
"delete": "Eliminar",
"favorite": "Adicionar aos Favoritos",
@ -674,21 +674,21 @@
"updated": "Atualizado"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedProjectThroughParentNamespace": "Não podes cancelar a tua subscrição aqui porque estás subscrito neste projeto através do seu espaço.",
"subscribedTaskThroughParentNamespace": "Não podes cancelar a tua subscrição aqui porque estás subscrito nesta tarefa através do seu espaço.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedTaskThroughParentProject": "Não podes cancelar a tua subscrição aqui porque estás subscrito nesta tarefa através do seu projeto.",
"subscribedNamespace": "Estás atualmente subscrito a este espaço e serás notificado de alterações.",
"notSubscribedNamespace": "Não estás subscrito a este espaço e não serás notificado de alterações.",
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
"subscribedProject": "Estás atualmente subscrito a este projeto e serás notificado de alterações.",
"notSubscribedProject": "Não estás subscrito a este projeto e não serás notificado de alterações.",
"subscribedTask": "Estás atualmente subscrito a esta tarefa e serás notificado de alterações.",
"notSubscribedTask": "Não estás subscrito a esta tarefa e não serás notificado de alterações.",
"subscribe": "Subscrever",
"unsubscribe": "Remover Subscrição",
"subscribeSuccessNamespace": "Estás agora subscrito a este espaço",
"unsubscribeSuccessNamespace": "Não estás mais subcrito a este espaço",
"subscribeSuccessProject": "You are now subscribed to this project",
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
"subscribeSuccessProject": "Estás agora subscrito a este projeto",
"unsubscribeSuccessProject": "Não estás mais subcrito a este projeto",
"subscribeSuccessTask": "Estás agora subscrito a esta tarefa",
"unsubscribeSuccessTask": "Não estás mais subcrito a esta tarefa"
},
@ -762,7 +762,7 @@
"new": "Nova Relação Entre Tarefas",
"searchPlaceholder": "Escreve para pesquisar uma tarefa a adicionar como relacionada…",
"createPlaceholder": "Adicionar como nova tarefa relacionada",
"differentProject": "This task belongs to a different project.",
"differentProject": "Esta tarefa pertence a um projeto diferente.",
"differentNamespace": "Esta tarefa pertence a um espaço diferente.",
"noneYet": "Ainda sem tarefas relacionadas.",
"delete": "Eliminar Relação Entre Tarefas",
@ -812,10 +812,10 @@
"priority1": "Para definir a prioridade de uma tarefa, adiciona um número entre 1 a 5, prefixado com um {prefix}.",
"priority2": "Quanto maior o número, maior a prioridade.",
"assignees": "Para atribuires uma tarefa diretamente a um utilizador, adiciona à tarefa os seus nomes de utilizador prefixados com {prefix}.",
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
"project2": "This will return an error if the project does not exist.",
"project3": "To use spaces, simply add a \" or ' around the project name.",
"project4": "For example: {prefix}\"Project with spaces\".",
"project1": "Para definir um projeto onde a tarefa deve aparecer, adiciona o seu nome prefixado com {prefix}.",
"project2": "Isto vai retornar um erro se o projeto não existir.",
"project3": "Para utilizares espaços, basta adicionares um \" ou ' no início e fim do nome do projeto.",
"project4": "Por exemplo: {prefix}\"Projeto com espaços\".",
"dateAndTime": "Data e hora",
"date": "Qualquer data será utilizada como data de vencimento da nova tarefa. Podes utilizar datas em qualquer dos seguintes formatos:",
"dateWeekday": "qualquer dia de semana, usará a próxima data com essa data",
@ -848,19 +848,19 @@
"delete": {
"header": "Eliminar equipa",
"text1": "Tens a certeza que pretendes eliminar esta equipa e todos os seus membros?",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"text2": "Todos os membros da equipa perderão acesso aos projetos e espaços partilhados com esta equipa. Isto NÃO PODE SER REVERTIDO!",
"success": "A equipa foi eliminada com sucesso."
},
"deleteUser": {
"header": "Remover utilizador da equipa",
"text1": "Tens a certeza que pretendes remover este utilizador da equipa?",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"text2": "Eles perderão o acesso a todos os projetos e espaços a que esta equipa tem acesso. Isto NÃO PODER SER REVERTIDO!",
"success": "O utilizador foi removido da equipa com sucesso."
},
"leave": {
"title": "Sair da equipa",
"text1": "Tens a certeza de que queres sair desta equipa?",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "Vais perder o acesso a todos os projetos e espaços a que esta equipa tem acesso. Se mudares de ideias, vais necessitar que um administrador da equipa te adicione novamente.",
"success": "Saíste da equipa com sucesso."
}
},
@ -892,22 +892,25 @@
"attachment": "Adicionar um anexo a esta tarefa",
"related": "Modificar as tarefas relacionadas desta tarefa",
"color": "Alterar a cor desta tarefa",
"move": "Move this task to another project",
"move": "Mover esta tarefa para outro projeto",
"reminder": "Gerir lembretes desta tarefa",
"description": "Alternar edição da descrição da tarefa"
"description": "Alternar edição da descrição da tarefa",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
"switchToListView": "Switch to list view",
"switchToGanttView": "Switch to gantt view",
"switchToKanbanView": "Switch to kanban view",
"switchToTableView": "Switch to table view"
"title": "Vista do Projeto",
"switchToListView": "Alternar para visualização em lista",
"switchToGanttView": "Alternar para visualização em gráfico de Gantt",
"switchToKanbanView": "Alternar para visualização em método de Kanban",
"switchToTableView": "Alternar para visualização em tabela"
},
"navigation": {
"title": "Navegação",
"overview": "Ir para a vista geral",
"upcoming": "Ir para próximas tarefas",
"namespaces": "Navigate to namespaces & projects",
"namespaces": "Ir para espaços e projetos",
"labels": "Navegar para etiquetas",
"teams": "Navegar para equipas"
}
@ -924,7 +927,7 @@
"unarchive": "Desarquivar",
"setBackground": "Definir Fundo",
"share": "Partilhar",
"newProject": "New project"
"newProject": "Novo projeto"
},
"apiConfig": {
"url": "URL do Vikunja",
@ -943,24 +946,24 @@
"notification": {
"title": "Notificações",
"none": "Não tens nenhuma notificação. Tem um bom dia!",
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
"explainer": "As notificações aparecerão aqui quando ocorrem ações em espaços, projetos ou tarefas às quais estejas subscrito."
},
"quickActions": {
"commands": "Comandos",
"placeholder": "Escreve um comando ou pesquisa…",
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
"hint": "Podes utilizar {project} para limitar a pesquisa a um projeto. Combina {project} ou {label} (etiquetas) com uma pesquisa para procurar uma tarefa com essas etiquetas ou nesse projeto. Utiliza {assignee} para pesquisares apenas por equipas.",
"tasks": "Tarefas",
"projects": "Projects",
"projects": "Projetos",
"teams": "Equipas",
"newProject": "Enter the title of the new project…",
"newProject": "Insere o título do novo espaço…",
"newTask": "Insere o título da nova tarefa…",
"newNamespace": "Insere o título do novo espaço…",
"newTeam": "Insere o nome da nova equipa…",
"createTask": "Create a task in the current project ({title})",
"createProject": "Create a project in the current namespace ({title})",
"createTask": "Cria uma tarefa no projeto atual ({title})",
"createProject": "Cria um projeto no espaço atual ({title})",
"cmds": {
"newTask": "Nova tarefa",
"newProject": "New project",
"newProject": "Novo projeto",
"newNamespace": "Novo espaço",
"newTeam": "Nova equipa"
}
@ -992,15 +995,15 @@
"1018": "A definição do tipo de avatar do utilizador é inválida.",
"2001": "O ID não pode ser 0 ou estar vazio.",
"2002": "Alguns dos dados solicitados eram inválidos.",
"3001": "The project does not exist.",
"3004": "You need to have read permissions on that project to perform that action.",
"3005": "The project title cannot be empty.",
"3006": "The project share does not exist.",
"3007": "A project with this identifier already exists.",
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
"4001": "The project task text cannot be empty.",
"4002": "The project task does not exist.",
"4003": "All bulk editing tasks must belong to the same project.",
"3001": "O projeto não existe.",
"3004": "Precisas ter permissão de leitura nesse projeto para executar essa ação.",
"3005": "O nome do projeto não pode estar em branco.",
"3006": "O projeto partiilhado não existe.",
"3007": "Já existe um projeto com este identificador.",
"3008": "O projeto está arquivado, portanto, só pode ser acedido para leitura. Isto é também verdade para todas as tarefas associadas a este projeto.",
"4001": "O texto da tarefa não pode estar vazio.",
"4002": "A tarefa não existe.",
"4003": "Todas as tarefas para edição em massa devem pertencer ao mesmo projeto.",
"4004": "Precisas selecionar pelo menos uma tarefa para realizar uma edição em massa.",
"4005": "Não possuis permissão para ver esta tarefa.",
"4006": "Não podes definir uma tarefa principal como a tarefa em si.",
@ -1026,21 +1029,21 @@
"5012": "O espaço está arquivado, portanto, só pode ser acedido para leitura.",
"6001": "O nome da equipa não pode estar vazio.",
"6002": "A equipa não existe.",
"6004": "The team already has access to that namespace or project.",
"6004": "A equipa tem já acesso a esse espaço ou projeto.",
"6005": "O utilizador é já membro dessa equipa.",
"6006": "Não podes eliminar o último membro da equipa.",
"6007": "The team does not have access to the project to perform that action.",
"7002": "The user already has access to that project.",
"7003": "You do not have access to that project.",
"6007": "A equipa não tem acesso ao projeto para executar essa ação.",
"7002": "O utilizador tem já acesso a esse projeto.",
"7003": "Não tens acesso a esse projeto.",
"8001": "Esta etiqueta já existe nessa lista.",
"8002": "A etiqueta não existe.",
"8003": "Não tens acesso a esta etiqueta.",
"9001": "A permissão é inválida.",
"10001": "O conjunto não existe.",
"10002": "The bucket does not belong to that project.",
"10003": "You cannot remove the last bucket on a project.",
"10002": "O conjunto não pertence a esse projeto.",
"10003": "Não podes eliminar o último conjunto num projeto.",
"10004": "Não podes adicionar a tarefa a este conjunto, pois dessa forma excede-se o seu limite de tarefas.",
"10005": "There can be only one done bucket per project.",
"10005": "Só pode existir um conjunto concluído por projeto.",
"11001": "O filtro memorizado não existe.",
"11002": "Filtros memorizados não estão disponíveis para links partilhados.",
"12001": "O tipo de entidade da subscrição é inválido.",
@ -1053,4 +1056,4 @@
"frontendVersion": "Versão Atual: {version}",
"apiVersion": "Versão da API: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Code",
"quote": "Quote",
"unorderedList": "Unordered List",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Image",
@ -566,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -894,7 +894,10 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description"
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -6,10 +6,10 @@
"welcomeEvening": "Добрый вечер, {username}!",
"lastViewed": "Последние просмотренные",
"project": {
"newText": "You can create a new project for your new tasks:",
"new": "New project",
"importText": "Or import your projects and tasks from other services into Vikunja:",
"import": "Import your data into Vikunja"
"newText": "Вы можете создать новый проект для своих задач:",
"new": "Создать проект",
"importText": "Или импортировать проекты и задачи из других сервисов в Vikunja:",
"import": "Импорт данных в Vikunja"
}
},
"404": {
@ -31,7 +31,7 @@
"username": "Имя пользователя",
"usernameEmail": "Имя пользователя или Email",
"usernamePlaceholder": "напр. frederick",
"email": "Email address",
"email": "Email адрес",
"emailPlaceholder": "напр. frederic{'@'}vikunja.io",
"password": "Пароль",
"passwordPlaceholder": "напр. •••••••••••",
@ -48,7 +48,7 @@
"loginWith": "Войти через {provider}",
"authenticating": "Аутентификация…",
"openIdStateError": "State does not match, refusing to continue!",
"openIdGeneralError": "An error occured while authenticating against the third party.",
"openIdGeneralError": "Произошла ошибка при аутентификации с помощью третьей стороны.",
"logout": "Выйти",
"emailInvalid": "Введите корректный email адрес.",
"usernameRequired": "Введите имя пользователя.",
@ -85,9 +85,9 @@
"weekStartSunday": "Воскресенье",
"weekStartMonday": "Понедельник",
"language": "Язык",
"defaultProject": "Default Project",
"defaultProject": "Проект по умолчанию",
"timezone": "Часовой пояс",
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
"overdueTasksRemindersTime": "Время напоминания о невыполненных задачах"
},
"totp": {
"title": "Двухфакторная аутентификация",
@ -143,7 +143,7 @@
},
"deletion": {
"title": "Удалить свой аккаунт VIkunja",
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
"text1": "Удаление аккаунта необратимо. Мы удалим все ваши пространства имён, проекты, задачи и всё связанное с ними.",
"text2": "Для продолжения введите свой пароль. На почту будет отправлено письмо с дальнейшими инструкциями.",
"confirm": "Удалить мой аккаунт",
"requestSuccess": "Запрос успешно выполнен. На почту будет отправлено письмо с дальнейшими инструкциями.",
@ -157,7 +157,7 @@
},
"export": {
"title": "Экспорт данных Vikunja",
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"description": "Вы можете запросить копию всех своих данных Vikunja. Это включает в себя пространства имён, проекты, задачи и всё связанное с ними. Эти данные можно будет импортировать на любом экземпляре Vikunja через функцию миграции.",
"descriptionPasswordRequired": "Для продолжения введите свой пароль:",
"request": "Запросить копию моих данных Vikunja",
"success": "Данные Vikunja успешно запрошены! На почту придёт письмо, когда они будут готовы для скачивания.",
@ -165,193 +165,193 @@
}
},
"project": {
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
"title": "Project Title",
"color": "Color",
"projects": "Projects",
"search": "Type to search for a project…",
"searchSelect": "Click or press enter to select this project",
"archived": "Этот проект архивирован. В нём нельзя создавать или изменять задачи.",
"title": "Название проекта",
"color": "Цвет",
"projects": "Проекты",
"search": "Введите запрос для поиска проекта…",
"searchSelect": "Кликните или нажмите Enter для выбора этого проекта",
"shared": "Shared Projects",
"noDescriptionAvailable": "No project description is available.",
"noDescriptionAvailable": "Описание проекта отсутствует.",
"create": {
"header": "New project",
"titlePlaceholder": "The project's title goes here…",
"addTitleRequired": "Please specify a title.",
"createdSuccess": "The project was successfully created.",
"addProjectRequired": "Please specify a project or set a default project in the settings."
"header": "Создать проект",
"titlePlaceholder": "Введите название проекта…",
"addTitleRequired": "Пожалуйста, укажите название.",
"createdSuccess": "Проект успешно создан.",
"addProjectRequired": "Пожалуйста, укажите проект или выберите проект по умолчанию в настройках."
},
"archive": {
"title": "Archive \"{project}\"",
"archive": "Archive this project",
"unarchive": "Un-Archive this project",
"unarchiveText": "You will be able to create new tasks or edit it.",
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
"success": "The project was successfully archived."
"title": "Архивирование «{project}»",
"archive": "Архивирование проекта",
"unarchive": "Возвращение проекта из архива",
"unarchiveText": "Вы сможете создавать новые задачи или изменять их.",
"archiveText": "Вы не сможете изменять этот проект или создавать в нём новые задачи, пока не вернёте его из архива.",
"success": "Проект архивирован."
},
"background": {
"title": "Set project background",
"remove": "Remove Background",
"upload": "Choose a background from your pc",
"searchPlaceholder": "Search for a background…",
"poweredByUnsplash": "Powered by Unsplash",
"loadMore": "Load more photos",
"success": "The background has been set successfully!",
"removeSuccess": "The background has been removed successfully!"
"title": "Установить фон проекта",
"remove": "Удалить фон",
"upload": "Выбрать фон со своего ПК",
"searchPlaceholder": "Введите запрос для поиска фона…",
"poweredByUnsplash": "Изображения с Unsplash",
"loadMore": "Загрузить больше фотографий",
"success": "Фон установлен!",
"removeSuccess": "Фон удалён!"
},
"delete": {
"title": "Delete \"{project}\"",
"header": "Delete this project",
"text1": "Are you sure you want to delete this project and all of its contents?",
"text2": "This includes all tasks and CANNOT BE UNDONE!",
"success": "The project was successfully deleted.",
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
"title": "Удаление «{project}»",
"header": "Удаление проекта",
"text1": "Удалить этот проект вместе со всем содержимым?",
"text2": "Это включает в себя все задачи, и отменить это будет нельзя!",
"success": "Проект успешно удалён.",
"tasksToDelete": "Это безвозвратно удалит примерно {count} задач.",
"noTasksToDelete": "В этом проекте нет никаких задач, можно спокойно удалять."
},
"duplicate": {
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
"title": "Создание копии проекта",
"label": "Создать копию",
"text": "Пространство имён, в которое поместить копию проекта:",
"success": "Копия проекта создана."
},
"edit": {
"header": "Edit This Project",
"title": "Edit \"{project}\"",
"titlePlaceholder": "The project title goes here…",
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
"identifier": "Project Identifier",
"identifierPlaceholder": "The project identifier goes here…",
"description": "Description",
"descriptionPlaceholder": "The projects description goes here…",
"header": "Изменение проекта",
"title": "Изменить «{project}»",
"titlePlaceholder": "Введите название проекта…",
"identifierTooltip": "Идентификатор проекта используется для однозначной идентификации задачи среди разных проектов. Можно оставить пустым для отключения этого.",
"identifier": "Идентификатор проекта",
"identifierPlaceholder": "Введите идентификатор проекта…",
"description": "Описание",
"descriptionPlaceholder": "Введите описание проекта…",
"color": "Color",
"success": "The project was successfully updated."
"success": "Проект успешно обновлён."
},
"share": {
"header": "Share this project",
"title": "Share \"{project}\"",
"share": "Share",
"header": "Поделиться проектом",
"title": "Поделиться проектом «{project}»",
"share": "Поделиться",
"links": {
"title": "Share Links",
"what": "What is a share link?",
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
"create": "Create a new link share",
"name": "Name (optional)",
"namePlaceholder": "e.g. Lorem Ipsum",
"nameExplanation": "All actions done by this link share will show up with the name.",
"password": "Password (optional)",
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
"noName": "No name set",
"remove": "Remove a link share",
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
"createSuccess": "The link share was successfully created.",
"deleteSuccess": "The link share was successfully deleted",
"view": "View",
"sharedBy": "Shared by {0}"
"title": "Ссылки для обмена",
"what": "Что такое ссылка для обмена?",
"explanation": "Ссылка для обмена позволяет поделиться проектом с теми, у кого нет аккаунта в Vikunja.",
"create": "Создать новую ссылку для обмена",
"name": "Имя (необязательно)",
"namePlaceholder": "напр. Lorem Ipsum",
"nameExplanation": "Все действия, выполненные через эту ссылку, будут подписаны этим именем.",
"password": "Пароль (необязательно)",
"passwordExplanation": "Пользователь будет должен ввести пароль для входа.",
"noName": "Без имени",
"remove": "Удалить ссылку для обмена",
"removeText": "Удалить эту ссылку для обмена? Больше не удастся получить доступ к проекту через эту ссылку. Это действие отменить нельзя!",
"createSuccess": "Ссылка создана.",
"deleteSuccess": "Ссылка удалена",
"view": "Режим просмотра",
"sharedBy": "Создатель: {0}"
},
"userTeam": {
"typeUser": "user | users",
"typeTeam": "team | teams",
"shared": "Shared with these {type}",
"you": "You",
"notShared": "Not shared with any {type} yet.",
"removeHeader": "Remove a {type} from the {sharable}",
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
"addedSuccess": "The {type} was successfully added.",
"updatedSuccess": "The {type} was successfully added."
"typeUser": "пользователь | пользователи",
"typeTeam": "группа | группы",
"shared": "Поделились с {type}",
"you": "Вы",
"notShared": "Не поделились ни с кем из {type}.",
"removeHeader": "Удалить {type} из {sharable}",
"removeText": "Удалить {sharable} из {type}? Это действие отменить нельзя!",
"removeSuccess": "{sharable} успешно удалён из {type}.",
"addedSuccess": "{type} успешно добавлен.",
"updatedSuccess": "{type} успешно добавлен."
},
"right": {
"title": "Permission",
"read": "Read only",
"readWrite": "Read & write",
"admin": "Admin"
"title": "Права",
"read": "Только чтение",
"readWrite": "Чтение и запись",
"admin": "Админ"
},
"attributes": {
"link": "Link",
"delete": "Delete"
"link": "Ссылка",
"delete": "Удалить"
}
},
"list": {
"title": "List",
"add": "Add",
"addPlaceholder": "Add a new task…",
"empty": "This project is currently empty.",
"newTaskCta": "Create a new task.",
"editTask": "Edit Task"
"title": "Список",
"add": "Добавить",
"addPlaceholder": "Добавить новую задачу…",
"empty": "Проект сейчас пуст.",
"newTaskCta": "Создать новую задачу.",
"editTask": "Изменить задачу"
},
"gantt": {
"title": "Gantt",
"showTasksWithoutDates": "Show tasks which don't have dates set",
"size": "Size",
"default": "Default",
"month": "Month",
"day": "Day",
"hour": "Hour",
"range": "Date Range",
"noDates": "This task has no dates set."
"title": "Гант",
"showTasksWithoutDates": "Показать задачи без установленной даты",
"size": "Размер",
"default": "По умолчанию",
"month": "Месяц",
"day": "День",
"hour": "Час",
"range": "Диапазон",
"noDates": "В этой задаче нет установленной даты."
},
"table": {
"title": "Table",
"columns": "Columns"
"title": "Таблица",
"columns": "Столбцы"
},
"kanban": {
"title": "Kanban",
"limit": "Limit: {limit}",
"noLimit": "Not Set",
"doneBucket": "Done bucket",
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
"deleteLast": "You cannot remove the last bucket.",
"addTaskPlaceholder": "Enter the new task title…",
"addTask": "Add a task",
"addAnotherTask": "Add another task",
"addBucket": "Create a new bucket",
"addBucketPlaceholder": "Enter the new bucket title…",
"deleteHeaderBucket": "Delete the bucket",
"deleteBucketText1": "Are you sure you want to delete this bucket?",
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
"deleteBucketSuccess": "The bucket has been deleted successfully.",
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
"collapse": "Collapse this bucket"
"title": "Канбан",
"limit": "Лимит: {limit}",
"noLimit": "не установлен",
"doneBucket": "Колонка завершённых",
"doneBucketHint": "Все задачи, помещённые в эту колонку, автоматически отмечаются как завершённые.",
"doneBucketHintExtended": "Все задачи, перенесённые в колонку завершённых, будут помечены как завершённые. Все задачи, помеченные как завершённые, также будут перемещены в эту колонку.",
"doneBucketSavedSuccess": "Колонка завершённых была успешно сохранена.",
"deleteLast": "Нельзя удалить последнюю колонку.",
"addTaskPlaceholder": "Введите название задачи…",
"addTask": "Добавить задачу",
"addAnotherTask": "Добавить ещё задачу",
"addBucket": "Создать новую колонку",
"addBucketPlaceholder": "Введите название новой колонки…",
"deleteHeaderBucket": "Удаление колонки",
"deleteBucketText1": "Удалить эту колонку?",
"deleteBucketText2": "Это не удалит задачи, а переместит их в колонку по умолчанию.",
"deleteBucketSuccess": "Колонка удалена.",
"bucketTitleSavedSuccess": "Название колонки сохранено.",
"bucketLimitSavedSuccess": "Лимит колонки сохранён.",
"collapse": "Свернуть эту колонку"
},
"pseudo": {
"favorites": {
"title": "Favorites"
"title": "Избранное"
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"title": "Пространства имён и проекты",
"namespace": "Пространство имён",
"showArchived": "Показать архив",
"noneAvailable": "Пространств имён сейчас нет.",
"unarchive": "Вернуть из архива",
"archived": "Архивировано",
"noProjects": "This namespace does not contain any projects.",
"createProject": "Create a new project in this namespace.",
"noProjects": "В этом пространстве имён нет ни одного проекта.",
"createProject": "Создать новый проект в этом пространстве имён.",
"namespaces": "Пространства имён",
"search": "Введите запрос для поиска пространства имён…",
"create": {
"title": "New namespace",
"title": "Создать пространство имён",
"titleRequired": "Пожалуйста, укажите название.",
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
"explanation": "Это коллекция проектов, которым можно поделиться и который можно использовать для упорядочивания проектов. Фактически, каждый проект принадлежит какому-нибудь пространству имён.",
"tooltip": "Что такое пространство имён?",
"success": "Пространство имён создано."
},
"archive": {
"titleArchive": "Архивировать «{namespace}»",
"titleUnarchive": "Вернуть «{namespace}» из архива",
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
"unarchiveText": "You will be able to create new projects or edit it.",
"archiveText": "Вы не сможете изменять это пространство имён, пока не вернёте его из архива. Это также касается всех проектов в этом пространстве имён.",
"unarchiveText": "Вы сможете создавать новые проекты или изменять их.",
"success": "Пространство имён архивировано.",
"unarchiveSuccess": "Пространство имён разархивировано.",
"description": "If a namespace is archived, you cannot create new projects or edit it."
"description": "Архивирование пространства имён означает, что вы не сможете создавать в нём новые проекты или изменять их."
},
"delete": {
"title": "Удалить «{namespace}»",
"text1": "Удалить это пространство имён вместе со всем содержимым?",
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
"text2": "Это включает в себя все проекты и задачи, и отменить это будет нельзя!",
"success": "Пространство имён удалено."
},
"edit": {
@ -403,7 +403,7 @@
},
"create": {
"title": "Создать сохранённый фильтр",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"description": "Сохранённый фильтр — это виртуальный проект, построенный из набора фильтров. При создании отображается в специальном пространстве имён.",
"action": "Создать новый сохранённый фильтр",
"titleRequired": "Укажите название фильтра."
},
@ -435,7 +435,7 @@
"label": {
"title": "Метки",
"manage": "Управление метками",
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
"description": "Нажмите на метку, чтобы изменить её. Вы сможете редактировать все созданные вами метки, сможете использовать все метки, связанные с задачей, к проекту которой у вас есть доступ.",
"newCTA": "Меток сейчас нет.",
"search": "Введите запрос для поиска метки…",
"create": {
@ -460,7 +460,7 @@
},
"sharing": {
"authenticating": "Аутентификация…",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"passwordRequired": "Для доступа к этому проекту нужен пароль. Введите его сюда:",
"error": "Случилась ошибка.",
"invalidPassword": "Неверный пароль."
},
@ -498,10 +498,10 @@
"hideMenu": "Скрыть меню",
"forExample": "Например:",
"welcomeBack": "С возвращением!",
"custom": "Custom",
"custom": "Настраиваемый",
"id": "ID",
"created": "Created at",
"actions": "Actions",
"created": "Дата создания",
"actions": "Действия",
"cannotBeUndone": "Это действие отменить нельзя!"
},
"input": {
@ -529,7 +529,7 @@
"code": "Код",
"quote": "Цитата",
"unorderedList": "Маркированный список",
"orderedList ": "Ordered List",
"orderedList": "Нумерованный список",
"cleanBlock": "Очистить блок",
"link": "Ссылка",
"image": "Изображение",
@ -566,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Как это работает",
"title": "Date Math",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "Это похоже на выражения, которые используются в {0} и {1}.",
"add1Day": "Добавить один день",
"minus1Day": "Вычесть один день",
"roundDay": "Округление вниз до начала дня",
"supportedUnits": "Поддерживаемые единицы времени:",
"someExamples": "Примеры выражений:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Секунды",
"minutes": "Минуты",
@ -602,10 +602,10 @@
"addReminder": "Добавить напоминание…",
"doneSuccess": "Задача отмечена как завершённая.",
"undoneSuccess": "Задача отмечена как незавершённая.",
"undo": "Undo",
"undo": "Отменить",
"openDetail": "Открыть подробный просмотр задачи",
"checklistTotal": "{checked} of {total} tasks",
"checklistAllDone": "{total} tasks",
"checklistTotal": "{checked} из {total} задач",
"checklistAllDone": "{total} задач",
"show": {
"titleCurrent": "Текущие задачи",
"titleDates": "Задачи с {from} по {to}",
@ -619,7 +619,7 @@
"chooseDueDate": "Нажмите для выбора срока",
"chooseStartDate": "Нажмите для выбора даты начала",
"chooseEndDate": "Нажмите для выбора даты завершения",
"move": "Move task to a different project",
"move": "Переместить задачу в другой проект",
"done": "Завершено!",
"undone": "Не завершено",
"created": "Создана {0} пользователем {1}",
@ -627,7 +627,7 @@
"doneAt": "Завершено {0}",
"updateSuccess": "Задача сохранена.",
"deleteSuccess": "Задача удалена.",
"belongsToProject": "This task belongs to project '{project}'",
"belongsToProject": "Задача принадлежит проекту «{project}»",
"due": "Истекает {at}",
"closePopup": "Закрыть всплывающее окно",
"delete": {
@ -647,7 +647,7 @@
"percentDone": "Задать прогресс",
"attachments": "Добавить вложения",
"relatedTasks": "Добавить связь",
"moveProject": "Move",
"moveProject": "Переместить",
"color": "Выбрать цвет",
"delete": "Удалить",
"favorite": "Добавить в избранное",
@ -674,21 +674,21 @@
"updated": "Дата изменения"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
"subscribedProjectThroughParentNamespace": "Вы не можете отписаться здесь, потому что вы подписаны на проект через его пространство имён.",
"subscribedTaskThroughParentNamespace": "Вы не можете отписаться здесь, потому что вы подписаны на эту задачу через её пространство имён.",
"subscribedTaskThroughParentProject": "Вы не можете отписаться здесь, потому что вы подписаны эту задачу через её проект.",
"subscribedNamespace": "Вы подписаны на это пространство имён и будете получать уведомления об изменениях.",
"notSubscribedNamespace": "Вы не подписаны на это пространство имён и не будете получать уведомления об изменениях.",
"subscribedProject": "Вы подписаны на этот проект и будете получать уведомления об изменениях.",
"notSubscribedProject": "Вы не подписаны на этот проект и не будете получать уведомления об изменениях.",
"subscribedTask": "Вы подписаны на эту задачу и будете получать уведомления об изменениях.",
"notSubscribedTask": "Вы не подписаны на эту задачу и не будете получать уведомления об изменениях.",
"subscribe": "Подписаться",
"unsubscribe": "Отписаться",
"subscribeSuccessNamespace": "Подписка на пространство имён оформлена",
"unsubscribeSuccessNamespace": "Подписка на пространство имён удалена",
"subscribeSuccessProject": "You are now subscribed to this project",
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
"subscribeSuccessProject": "Подписка на проект оформлена",
"unsubscribeSuccessProject": "Подписка на проект удалена",
"subscribeSuccessTask": "Подписка на задачу оформлена",
"unsubscribeSuccessTask": "Подписка на задачу удалена"
},
@ -762,13 +762,13 @@
"new": "Новая связанная задача",
"searchPlaceholder": "Введи запрос для поиска задачи, чтобы добавить связь…",
"createPlaceholder": "Добавить как связанную задачу",
"differentProject": "This task belongs to a different project.",
"differentProject": "Эта задача принадлежит другому проекту.",
"differentNamespace": "Эта задача принадлежит другому пространству имён.",
"noneYet": "Ещё нет связанных задач.",
"delete": "Удалить связь",
"deleteText1": "Удалить эту связь с задачей?",
"select": "Выберите вид связи",
"taskRequired": "Please select a task or enter a new task title.",
"taskRequired": "Выберите задачу или введите название новой задачи.",
"kinds": {
"subtask": "Подзадача | Подзадачи",
"parenttask": "Родительская задача | Родительские задачи",
@ -797,7 +797,7 @@
"weeks": "Недель",
"months": "Месяцев",
"years": "Лет",
"invalidAmount": "Please enter more than 0."
"invalidAmount": "Введите больше чем 0."
},
"quickAddMagic": {
"hint": "Вы можете использовать Волшебное Быстрое Добавление",
@ -807,15 +807,15 @@
"multiple": "Вы можете использовать это несколько раз.",
"label1": "Чтобы добавить метку, просто добавьте к названию метки префикс {prefix}.",
"label2": "Vikunja проверит, существует ли такая метка, и создаст её, если ещё нет.",
"label3": "To use spaces, simply add a \" or ' around the label name.",
"label3": "Чтобы использовать пробелы, оберните метку в \"двойные\" или 'одинарные' кавычки.",
"label4": "Например: {prefix}\"Метка с пробелами\".",
"priority1": "Чтобы установить задаче приоритет, добавьте число 1-5 с префиксом {prefix}.",
"priority2": "Чем больше число, тем выше приоритет.",
"assignees": "Чтобы назначить задачу пользователю, добавьте к задаче его имя с префиксом {prefix}.",
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
"project2": "This will return an error if the project does not exist.",
"project3": "To use spaces, simply add a \" or ' around the project name.",
"project4": "For example: {prefix}\"Project with spaces\".",
"project1": "Чтобы выбрать проект, в который будет помещена создаваемая задача, введите его имя с префиксом {prefix}.",
"project2": "Если проект не существует, будет возвращена ошибка.",
"project3": "Чтобы использовать пробелы, оберните название проекта в \"двойные\" или 'одинарные' кавычки.",
"project4": "Например: {prefix}\"Проект с пробелами\".",
"dateAndTime": "Дата и время",
"date": "Любая дата будет использоваться как срок выполнения новой задачи. Вы можете использовать даты в любом из этих форматов:",
"dateWeekday": "любой день недели, будет использовать следующую дату",
@ -848,19 +848,19 @@
"delete": {
"header": "Удалить команду",
"text1": "Удалить эту команду вместе с участниками?",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"text2": "Все участники команды потеряют доступ к проектам и пространствам имён, которыми поделились с этой командой. Это действие отменить НЕЛЬЗЯ!",
"success": "Команда удалена."
},
"deleteUser": {
"header": "Удалить пользователя из команды",
"text1": "Удалить этого пользователя из команды?",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"text2": "Пользователь потеряет доступ ко всем проектам и пространствам имён, к которым есть доступ у команды. Это действие отменить нельзя!",
"success": "Пользователь удалён из команды."
},
"leave": {
"title": "Покинуть команду",
"text1": "Покинуть эту команду?",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "Вы потеряете доступ ко всем проектам и пространствам имён, к которым есть доступ у команды. Если вы передумаете, придётся просить администратора команды добавить вас снова.",
"success": "Вы покинули команду."
}
},
@ -892,22 +892,25 @@
"attachment": "Добавить вложение к задаче",
"related": "Изменить связанные задачи",
"color": "Изменить цвет этой задачи",
"move": "Move this task to another project",
"move": "Переместить эту задачу в другой проект",
"reminder": "Управление напоминаниями об этой задаче",
"description": "Toggle editing of the task description"
"description": "Включить изменение описания задачи",
"delete": "Удалить задачу",
"priority": "Изменить приоритет задачи",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
"switchToListView": "Switch to list view",
"switchToGanttView": "Switch to gantt view",
"switchToKanbanView": "Switch to kanban view",
"switchToTableView": "Switch to table view"
"title": "Просмотр проекта",
"switchToListView": "Переключиться на список",
"switchToGanttView": "Переключиться на гант",
"switchToKanbanView": "Переключиться на канбан",
"switchToTableView": "Переключиться на таблицу"
},
"navigation": {
"title": "Навигация",
"overview": "Перейти к странице обзора",
"upcoming": "Перейти к предстоящим задачам",
"namespaces": "Navigate to namespaces & projects",
"namespaces": "Перейти к пространствам имён и проектам",
"labels": "Перейти к меткам",
"teams": "Перейти к командам"
}
@ -924,7 +927,7 @@
"unarchive": "Вернуть из архива",
"setBackground": "Задать фон",
"share": "Поделиться",
"newProject": "New project"
"newProject": "Создать проект"
},
"apiConfig": {
"url": "Vikunja URL",
@ -943,24 +946,24 @@
"notification": {
"title": "Уведомления",
"none": "Уведомлений нет. Хорошего дня!",
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
"explainer": "Здесь появятся уведомления, когда что-нибудь произойдёт с пространствами имён, проектами или задачами, на которые вы подписаны."
},
"quickActions": {
"commands": "Команды",
"placeholder": "Введите команду или поисковый запрос…",
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
"hint": "Используйте {project}, чтобы ограничить поиск проектом. Комбинируйте {project} и {label} (метки) с поисковым запросом для поиска задачи с этими метками или на этом проекте. Используйте {assignee} для поиска команд.",
"tasks": "Задачи",
"projects": "Projects",
"projects": "Проекты",
"teams": "Команды",
"newProject": "Enter the title of the new project…",
"newProject": "Введите название проекта…",
"newTask": "Введите название задачи…",
"newNamespace": "Введите название пространства имён…",
"newTeam": "Введите название новой команды…",
"createTask": "Create a task in the current project ({title})",
"createProject": "Create a project in the current namespace ({title})",
"createTask": "Создать задачу в текущем проекте ({title})",
"createProject": "Создать проект в текущем пространстве имён ({title})",
"cmds": {
"newTask": "Новая задача",
"newProject": "New project",
"newProject": "Создать проект",
"newNamespace": "Новое пространство имён",
"newTeam": "Новая команда"
}
@ -992,15 +995,15 @@
"1018": "Тип аватара пользователя неверный.",
"2001": "ID не может быть пустой или 0.",
"2002": "Некоторые данные запроса неверны.",
"3001": "The project does not exist.",
"3004": "You need to have read permissions on that project to perform that action.",
"3005": "The project title cannot be empty.",
"3001": "Проект не существует.",
"3004": "У вас должны быть права на чтение этого проекта, чтобы выполнить это действие.",
"3005": "Нужно ввести название проекта.",
"3006": "The project share does not exist.",
"3007": "A project with this identifier already exists.",
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
"4001": "The project task text cannot be empty.",
"4002": "The project task does not exist.",
"4003": "All bulk editing tasks must belong to the same project.",
"3007": "Проект с таким идентификатором уже существует.",
"3008": "Этот проект архивирован и поэтому доступен только для чтения. Это также касается всех задач в этом проекте.",
"4001": "Текст задачи не может быть пустым.",
"4002": "Задача не существует.",
"4003": "Все задачи для массового редактирования должны принадлежать одному проекту.",
"4004": "Необходима хотя бы одна задача для массового редактирования.",
"4005": "У вас нет прав для просмотра задачи.",
"4006": "Нельзя установить родительскую задачу этой же задачей.",
@ -1026,21 +1029,21 @@
"5012": "Это пространство имён архивировано и поэтому доступно только для чтения.",
"6001": "Имя команды не может быть пустым.",
"6002": "Команда не существует.",
"6004": "The team already has access to that namespace or project.",
"6004": "Эта команда уже имеет доступ к этому пространству имён или проекту.",
"6005": "Пользователь уже является участником этой команды.",
"6006": "Нельзя удалить последнего участника команды.",
"6007": "The team does not have access to the project to perform that action.",
"7002": "The user already has access to that project.",
"7003": "You do not have access to that project.",
"6007": "У команды нет доступа к проекту, чтобы выполнить это действие.",
"7002": "У пользователя уже есть доступ к этому проекту.",
"7003": "У вас нет доступа к этому проекту.",
"8001": "Эта метка уже существует в этой задаче.",
"8002": "Эта метка не существует.",
"8003": "У вас нет доступа к этой метке.",
"9001": "Некорректные права.",
"10001": "Эта колонка не существует.",
"10002": "The bucket does not belong to that project.",
"10003": "You cannot remove the last bucket on a project.",
"10002": "Эта колонка не принадлежит этому проекту.",
"10003": "Вы не можете удалить последнюю колонку проекта.",
"10004": "Вы не можете добавить задачу в эту колонку, так как достигнуто ограничение на число задач в ней.",
"10005": "There can be only one done bucket per project.",
"10005": "В проекте может быть только одна колонка завершённых.",
"11001": "Сохранённый фильтр не существует.",
"11002": "Saved filters are not available for link shares.",
"12001": "Некорректный тип подписки.",
@ -1053,4 +1056,4 @@
"frontendVersion": "Версия фронтенда: {version}",
"apiVersion": "Версия API: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Code",
"quote": "Quote",
"unorderedList": "Unordered List",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Image",
@ -566,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -894,7 +894,10 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description"
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Code",
"quote": "Quote",
"unorderedList": "Unordered List",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Image",
@ -566,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -894,7 +894,10 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description"
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Code",
"quote": "Quote",
"unorderedList": "Unordered List",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Image",
@ -566,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -894,7 +894,10 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description"
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Code",
"quote": "Quote",
"unorderedList": "Unordered List",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Image",
@ -566,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -894,7 +894,10 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description"
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Code",
"quote": "Trích dẫn",
"unorderedList": "Gạch đầu dòng",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Làm sạch Khối",
"link": "Liên kết",
"image": "Ảnh",
@ -566,14 +566,14 @@
"canuse": "Bạn có thể sử dụng biểu thức tính ngày để lọc những ngày liên quan.",
"learnhow": "Xem cách hoạt động",
"title": "Tính Ngày",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Mỗi Biểu thức tính ngày bắt đầu bằng một ngày cố định, có thể là {0}, hoặc kết thúc bằng {1}. Ngày cố định này có thể được theo sau bởi một hoặc nhiều biểu thức toán học.",
"similar": "Những biểu thức này tương tự như những biểu thức được cung cấp bởi {0} và {1}.",
"add1Day": "Thêm một ngày",
"minus1Day": "Bớt đi một ngày",
"roundDay": "Làm tròn đến ngày gần nhất",
"supportedUnits": "Các đơn vị thời gian hỗ trợ là:",
"someExamples": "Một vài ví dụ về cách hiển thị thời gian:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Giây",
"minutes": "Phút",
@ -894,7 +894,10 @@
"color": "Thay đổi màu công việc này",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description"
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Phiên bản giao diện người dùng: {version}",
"apiVersion": "Phiên bản API: {version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "代码",
"quote": "引用",
"unorderedList": "无序列表",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "清除格式",
"link": "链接",
"image": "图片",
@ -566,14 +566,14 @@
"canuse": "你可以使用 Date Math 来筛选相对日期。",
"learnhow": "查看它如何工作",
"title": "Date Math",
"intro": "Date Math 允许你在使用过滤器时由 Vikunja 动态解析相对日期。",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "每个 Date Math 表达式以锚点日期开头,可以是 {0},也可以是以 {1} 结尾的日期文本。 这个锚点日期后可以跟一个或多个数学表达式。",
"similar": "这些表达式类似于 {0} 和 {1} 提供的表达式。",
"add1Day": "加一天",
"minus1Day": "减一天",
"roundDay": "往最近的那天舍入",
"supportedUnits": "支持的时间单位是:",
"someExamples": "时间表达式的一些例子:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "秒数。",
"minutes": "分钟",
@ -894,7 +894,10 @@
"color": "更改此任务的颜色",
"move": "Move this task to another project",
"reminder": "管理此任务的提醒",
"description": "切换编辑时的任务描述"
"description": "切换编辑时的任务描述",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "前端版本:{version}",
"apiVersion": "API 版本:{version}"
}
}
}

View File

@ -529,7 +529,7 @@
"code": "Code",
"quote": "Quote",
"unorderedList": "Unordered List",
"orderedList ": "Ordered List",
"orderedList": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Image",
@ -566,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -894,7 +894,10 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description"
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
@ -1053,4 +1056,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -5,7 +5,7 @@ import type { IUser } from '@/modelTypes/IUser'
import type { IFile } from '@/modelTypes/IFile'
import type { IAttachment } from '@/modelTypes/IAttachment'
export const SUPPORTED_IMAGE_SUFFIX = ['.jpg', '.png', '.bmp', '.gif']
export const SUPPORTED_IMAGE_SUFFIX = ['.jpg','.jpeg', '.png', '.bmp', '.gif']
export default class AttachmentModel extends AbstractModel<IAttachment> implements IAttachment {
id = 0

View File

@ -438,41 +438,50 @@ describe('Parse Task Text', () => {
now.setFullYear(2021, 5, 24)
const cases = {
'Lorem Ipsum 06/08/2021 ad': '2021-6-8',
'Lorem Ipsum 6/7/21 ad': '2021-6-7',
'dolor sit amet 27/07/2021,': null,
'dolor sit amet 2021/07/06,': '2021-7-6',
'dolor sit amet 2021-07-06': '2021-7-6',
'dolor sit amet 27 jan': '2022-1-27',
'dolor sit amet 27/1': '2022-1-27',
'dolor sit amet 27/01': '2022-1-27',
'dolor sit amet 16/12': '2021-12-16',
'dolor sit amet 01/27': '2022-1-27',
'dolor sit amet 1/27': '2022-1-27',
'dolor sit amet Jan 27': '2022-1-27',
'dolor sit amet jan 27': '2022-1-27',
'dolor sit amet feb 21': '2022-2-21',
'dolor sit amet mar 21': '2022-3-21',
'dolor sit amet apr 21': '2022-4-21',
'dolor sit amet may 21': '2022-5-21',
'dolor sit amet jun 21': '2022-6-21',
'dolor sit amet jul 21': '2021-7-21',
'dolor sit amet aug 21': '2021-8-21',
'dolor sit amet sep 21': '2021-9-21',
'dolor sit amet oct 21': '2021-10-21',
'dolor sit amet nov 21': '2021-11-21',
'dolor sit amet dec 21': '2021-12-21',
'06/08/2021': '2021-6-8',
'6/7/21': '2021-6-7',
'27/07/2021,': null,
'2021/07/06,': '2021-7-6',
'2021-07-06': '2021-7-6',
'27 jan': '2022-1-27',
'27/1': '2022-1-27',
'27/01': '2022-1-27',
'16/12': '2021-12-16',
'01/27': '2022-1-27',
'1/27': '2022-1-27',
'Jan 27': '2022-1-27',
'jan 27': '2022-1-27',
'feb 21': '2022-2-21',
'mar 21': '2022-3-21',
'apr 21': '2022-4-21',
'may 21': '2022-5-21',
'jun 21': '2022-6-21',
'jul 21': '2021-7-21',
'aug 21': '2021-8-21',
'sep 21': '2021-9-21',
'oct 21': '2021-10-21',
'nov 21': '2021-11-21',
'dec 21': '2021-12-21',
} as Record<string, string | null>
for (const c in cases) {
it(`should parse '${c}' as '${cases[c]}'`, () => {
const {date} = getDateFromText(c, now)
it(`should parse '${c}' as '${cases[c]}' with the date at the end`, () => {
const {date} = getDateFromText(`Lorem Ipsum ${c}`, now)
if (date === null && cases[c] === null) {
expect(date).toBeNull()
return
}
expect(`${date?.getFullYear()}-${date.getMonth() + 1}-${date?.getDate()}`).toBe(cases[c])
expect(`${date?.getFullYear()}-${date?.getMonth() + 1}-${date?.getDate()}`).toBe(cases[c])
})
it(`should parse '${c}' as '${cases[c]}' with the date at the beginning`, () => {
const {date} = getDateFromText(`${c} Lorem Ipsum`, now)
if (date === null && cases[c] === null) {
expect(date).toBeNull()
return
}
expect(`${date?.getFullYear()}-${date?.getMonth() + 1}-${date?.getDate()}`).toBe(cases[c])
})
}
})

View File

@ -1,4 +1,6 @@
// in order to use postcss-preset-env correctly we need some client side plugins
import focusWithin from 'focus-within'
import focusWithinInit from 'postcss-focus-within/browser'
import cssHasPseudo from 'css-has-pseudo/browser'
focusWithin(document)
focusWithinInit()
cssHasPseudo(document)

View File

@ -22,7 +22,7 @@
<x-button @click="setDefaultFilters">Reset</x-button>
</div>
</div>
<fancycheckbox class="is-block" v-model="filters.showTasksWithoutDates">
<fancycheckbox is-block v-model="filters.showTasksWithoutDates">
{{ $t('project.gantt.showTasksWithoutDates') }}
</fancycheckbox>
</div>

View File

@ -415,6 +415,7 @@ async function updateTaskPosition(e) {
: e.newIndex
const task = newBucket.tasks[newTaskIndex]
const oldBucket = buckets.value.find(b => b.id === task.bucketId)
const taskBefore = newBucket.tasks[newTaskIndex - 1] ?? null
const taskAfter = newBucket.tasks[newTaskIndex + 1] ?? null
taskUpdating.value[task.id] = true
@ -425,6 +426,13 @@ async function updateTaskPosition(e) {
taskBefore !== null ? taskBefore.kanbanPosition : null,
taskAfter !== null ? taskAfter.kanbanPosition : null,
)
if (
oldBucket !== undefined && // This shouldn't actually be `undefined`, but let's play it safe.
newBucket.id !== oldBucket.id &&
newBucket.isDoneBucket !== oldBucket.isDoneBucket
) {
newTask.done = newBucket.isDoneBucket
}
try {
await taskStore.update(newTask)

View File

@ -144,24 +144,6 @@ import {useTaskStore} from '@/stores/tasks'
import type {IProject} from '@/modelTypes/IProject'
function sortTasks(tasks: ITask[]) {
if (tasks === null || Array.isArray(tasks) && tasks.length === 0) {
return
}
return tasks.sort((a, b) => {
if (a.done < b.done)
return -1
if (a.done > b.done)
return 1
if (a.position < b.position)
return -1
if (a.position > b.position)
return 1
return 0
})
}
const props = defineProps({
projectId: {
type: Number as PropType<IProject['id']>,
@ -268,8 +250,6 @@ function updateTasks(updatedTask: ITask) {
break
}
}
// FIXME: Use computed
sortTasks(tasks.value)
}
async function saveTaskPosition(e) {

View File

@ -11,10 +11,10 @@
</x-button>
</template>
</datepicker-with-range>
<fancycheckbox @change="setShowNulls" class="mr-2">
<fancycheckbox @update:model-value="setShowNulls" class="mr-2">
{{ $t('task.show.noDates') }}
</fancycheckbox>
<fancycheckbox @change="setShowOverdue">
<fancycheckbox @update:model-value="setShowOverdue">
{{ $t('task.show.overdue') }}
</fancycheckbox>
</p>

View File

@ -322,6 +322,7 @@
@click="setFieldActive('priority')"
variant="secondary"
icon="exclamation"
v-shortcut="'p'"
>
{{ $t('task.detail.actions.priority') }}
</x-button>
@ -406,6 +407,7 @@
@click="toggleFavorite"
variant="secondary"
:icon="task.isFavorite ? 'star' : ['far', 'star']"
v-shortcut="'s'"
>
{{
task.isFavorite ? $t('task.detail.actions.unfavorite') : $t('task.detail.actions.favorite')
@ -416,6 +418,7 @@
icon="trash-alt"
:shadow="false"
class="is-danger is-outlined has-no-border"
v-shortcut="'Shift+Delete'"
>
{{ $t('task.detail.actions.delete') }}
</x-button>

View File

@ -73,7 +73,11 @@
:search-results="foundUsers"
label="username"
v-model="newMember"
/>
>
<template #searchResult="{option: user}">
<User :avatar-size="24" :user="user" class="m-0"/>
</template>
</multiselect>
</div>
<div class="control">
<x-button @click="addUser" icon="plus">
@ -88,7 +92,9 @@
<table class="table has-actions is-striped is-hoverable is-fullwidth">
<tbody>
<tr :key="m.id" v-for="m in team?.members">
<td>{{ getDisplayName(m) }}</td>
<td>
<User :avatar-size="24" :user="m" class="m-0"/>
</td>
<td>
<template v-if="m.id === userInfo.id">
<b class="is-success">You</b>
@ -185,6 +191,7 @@ import {useRoute, useRouter} from 'vue-router'
import Editor from '@/components/input/AsyncEditor'
import Multiselect from '@/components/input/multiselect.vue'
import User from '@/components/misc/user.vue'
import TeamService from '@/services/team'
import TeamMemberService from '@/services/teamMember'
@ -194,7 +201,6 @@ import {RIGHTS as Rights} from '@/constants/rights'
import {useTitle} from '@/composables/useTitle'
import {success} from '@/message'
import {getDisplayName} from '@/models/user'
import {useAuthStore} from '@/stores/auth'
import type {ITeam} from '@/modelTypes/ITeam'

View File

@ -11,17 +11,17 @@
{{ $t('user.auth.login') }}
</x-button>
</div>
<form @submit.prevent="submit" id="form" v-if="!successMessage">
<form @submit.prevent="resetPassword" id="form" v-if="!successMessage">
<div class="field">
<label class="label" for="password">{{ $t('user.auth.password') }}</label>
<Password @submit="submit" @update:modelValue="v => credentials.password = v"/>
<Password @submit="resetPassword" @update:modelValue="v => credentials.password = v"/>
</div>
<div class="field is-grouped">
<div class="control">
<x-button
:loading="passwordResetService.loading"
@click="submit"
@click="resetPassword"
>
{{ $t('user.auth.resetPassword') }}
</x-button>
@ -47,7 +47,7 @@ const passwordResetService = reactive(new PasswordResetService())
const errorMsg = ref('')
const successMessage = ref('')
async function submit() {
async function resetPassword() {
errorMsg.value = ''
if(credentials.password === '') {

View File

@ -11,7 +11,7 @@
{{ $t('user.auth.login') }}
</x-button>
</div>
<form @submit.prevent="submit" v-if="!isSuccess">
<form @submit.prevent="requestPasswordReset" v-if="!isSuccess">
<div class="field">
<label class="label" for="email">{{ $t('user.auth.email') }}</label>
<div class="control">
@ -30,7 +30,7 @@
<div class="field is-grouped">
<div class="control">
<x-button
@click="submit"
type="submit"
:loading="passwordResetService.loading"
>
{{ $t('user.auth.resetPasswordAction') }}
@ -45,19 +45,18 @@
</template>
<script setup lang="ts">
import {ref, reactive} from 'vue'
import {ref, shallowReactive} from 'vue'
import PasswordResetModel from '@/models/passwordReset'
import PasswordResetService from '@/services/passwordReset'
import Message from '@/components/misc/message.vue'
// Not sure if this instance needs a shalloRef at all
const passwordResetService = reactive(new PasswordResetService())
const passwordResetService = shallowReactive(new PasswordResetService())
const passwordReset = ref(new PasswordResetModel())
const errorMsg = ref('')
const isSuccess = ref(false)
async function submit() {
async function requestPasswordReset() {
errorMsg.value = ''
try {
await passwordResetService.requestResetPassword(passwordReset.value)

View File

@ -1,5 +1,5 @@
{
"extends": "@vue/tsconfig/tsconfig.web.json",
"extends": "@vue/tsconfig/tsconfig.dom.json",
"include": ["env.d.ts", "src/**/*.d.ts", "src/**/*", "src/**/*.vue", "src/**/*.json"],
"exclude": ["src/**/__tests__/*"],
"compilerOptions": {
@ -13,7 +13,8 @@
"paths": {
"@/*": ["./src/*"]
}
},
"ignoreDeprecations": "5.0"
},
"vueCompilerOptions": {
// "strictTemplates": true

View File

@ -1,5 +1,8 @@
{
"extends": "@vue/tsconfig/tsconfig.node.json",
"extends": [
"@tsconfig/node18/tsconfig.json",
"@vue/tsconfig/tsconfig.json"
],
"include": ["vite.config.*", "vitest.config.*", "cypress.config.*", "env.config.d.ts"],
"compilerOptions": {
"composite": true,

View File

@ -60,6 +60,7 @@ export default defineConfig(({mode}) => {
// https://vitest.dev/config/
test: {
environment: 'happy-dom',
'vitest.commandLine': 'pnpm test:unit',
},
css: {
preprocessorOptions: {
@ -81,6 +82,7 @@ export default defineConfig(({mode}) => {
// See also './src/polyfills.ts'
features: {
'focus-within-pseudo-class': true,
'has-pseudo-class': true,
},
}),
],