forked from vikunja/frontend
Compare commits
166 Commits
main
...
webxdc-pro
Author | SHA1 | Date |
---|---|---|
WofWca | e285fa9e84 | |
WofWca | 4ee8ceb1c0 | |
WofWca | 080fc489d7 | |
WofWca | e2e743708c | |
WofWca | d88126d366 | |
WofWca | ac8c9c7924 | |
WofWca | 0e72842668 | |
WofWca | bcd1528faa | |
WofWca | 1352a82c8c | |
WofWca | 19f99af023 | |
WofWca | 80ba017a74 | |
WofWca | 90ef2b13a9 | |
WofWca | f4890f00d7 | |
WofWca | 724daee7da | |
WofWca | 6b47f1ba47 | |
Dominik Pschenitschni | 91e9eef582 | |
Dominik Pschenitschni | dea1789a00 | |
WofWca | 30adad5ae6 | |
renovate | 3ed6f939e5 | |
renovate | a337d22c1f | |
renovate | addfcf2510 | |
renovate | 303034f02c | |
renovate | 0fd44e9484 | |
renovate | 04040f20ba | |
konrad | 6c999ad148 | |
renovate | cc519e6773 | |
renovate | f9dcae4f65 | |
renovate | ade6c2cb18 | |
renovate | 4566b62a93 | |
renovate | 37d3ef24d2 | |
kolaente | 71265769ce | |
kolaente | a13c16ca03 | |
kolaente | a33fb72ef8 | |
kolaente | c5776264c0 | |
kolaente | 078d8b39a9 | |
kolaente | b77c7c2f45 | |
renovate | e369473dd0 | |
renovate | 70501f9da1 | |
renovate | 9bb7019b09 | |
renovate | df4fe7a644 | |
renovate | 2f009d0b27 | |
renovate | 70d7def7d7 | |
renovate | 0033407f96 | |
renovate | b10a2329ca | |
WofWca | 6870db4a72 | |
WofWca | 3643ffe0d0 | |
renovate | 02971f6ff9 | |
renovate | 7d3c34b004 | |
renovate | f3ea6fd4dc | |
renovate | bed6b81a58 | |
renovate | f9bf9139b8 | |
Dominik Pschenitschni | 96e2c81b7e | |
renovate | e62c00a187 | |
renovate | 611419888a | |
renovate | 5cc7e282bf | |
renovate | de0b71103c | |
renovate | 537e9e8044 | |
renovate | ac95c1fdc8 | |
renovate | b36da9e4d9 | |
renovate | e11ee3c136 | |
renovate | 887719ea24 | |
renovate | 14f1c3b26e | |
renovate | 2142729d38 | |
renovate | 9dcc2baae2 | |
renovate | 37c88d2974 | |
renovate | 36fd0deec4 | |
renovate | 4a4438d431 | |
renovate | 28a6745346 | |
renovate | 9ae0470879 | |
renovate | 927aed1161 | |
renovate | 7f3d7a656d | |
renovate | 040a8ce095 | |
Frederick [Bot] | 8974939bf2 | |
Dominik Pschenitschni | 846de369f2 | |
Frederick [Bot] | 4d865af423 | |
renovate | 62ad01fc8f | |
renovate | da0164b97d | |
kolaente | fc8711d6d8 | |
renovate | 03cef1f831 | |
WofWca | ee4974a494 | |
WofWca | bfbfd6a421 | |
renovate | 49954abbbe | |
renovate | 2f618512cb | |
Frederick [Bot] | 0086ebed0d | |
renovate | 1523ed9a47 | |
renovate | 79c7cbedcc | |
renovate | 3e128f3966 | |
renovate | fb45483ffc | |
renovate | a9bc7d7a38 | |
renovate | 78f032d678 | |
Dominik Pschenitschni | d73b71a097 | |
renovate | 2bdc6155d7 | |
Dominik Pschenitschni | f60cebf42c | |
renovate | 2e4c6673d4 | |
kolaente | 6e3d64d6ef | |
kolaente | 2deb66855b | |
kolaente | a64c0c19e5 | |
kolaente | 24b4576c00 | |
kolaente | 34ad889d90 | |
Dominik Pschenitschni | af523cfcd7 | |
Dominik Pschenitschni | 842f204123 | |
Dominik Pschenitschni | 9162002e55 | |
Dominik Pschenitschni | 985f998a82 | |
Dominik Pschenitschni | b93639e14e | |
Dominik Pschenitschni | a4be973e29 | |
Dominik Pschenitschni | 060a573fe9 | |
Dominik Pschenitschni | 7c43b7385d | |
kolaente | befa6f27bb | |
Dominik Pschenitschni | b9d3b5c756 | |
renovate | ee732684bc | |
renovate | 360b530dd5 | |
renovate | 713c3a1a08 | |
renovate | 81b1e4035d | |
renovate | 2cde9341d4 | |
renovate | cdf0690da6 | |
renovate | 80335e7b95 | |
renovate | dbc2de14c9 | |
renovate | c0f711d27f | |
kolaente | df24522490 | |
kolaente | 6cf2e574bf | |
kolaente | e7b89ae44f | |
renovate | 72a1aaa654 | |
renovate | c70c3b6080 | |
kolaente | 401f2cdd7e | |
konrad | 013472e899 | |
renovate | e9d48c442d | |
renovate | 6837038922 | |
renovate | 6cf7c75954 | |
Frederick [Bot] | 52d6677d93 | |
renovate | f8f8c8ac6e | |
renovate | 97bd5d77b6 | |
renovate | 5278bcbac2 | |
renovate | 194fef0dab | |
renovate | 97b6ba06dd | |
Frederick [Bot] | 559cfde8da | |
WofWca | 9db3aedde9 | |
WofWca | 0eb78e32f9 | |
WofWca | b4dd23b85d | |
renovate | 2262b49aaf | |
renovate | c887990bad | |
renovate | 37c5a88744 | |
Dominik Pschenitschni | 9b7770ade4 | |
Dominik Pschenitschni | af4a039502 | |
Dan Stewart | 1b06112db4 | |
renovate | 0952f059c0 | |
WofWca | 0f97ba6ec9 | |
renovate | d4c9edb55d | |
renovate | 394f056cf4 | |
renovate | 7672676b6e | |
renovate | 51b33fd67e | |
renovate | 0ed3ebda94 | |
danstewart | 7b6f76d1b4 | |
renovate | ad0029789d | |
renovate | e13f57c30a | |
WofWca | 6a3518dace | |
renovate | f1ec554d09 | |
WofWca | 6aa02e29b1 | |
WofWca | 5f9485414b | |
WofWca | 149ceaf2e5 | |
renovate | 9b3e185dd4 | |
renovate | 779fe3e323 | |
renovate | a27b77f24e | |
renovate | 41f22a1035 | |
renovate | 28d01c5ba0 | |
Frederick [Bot] | e272dd8e64 | |
kolaente | c002275e7f |
|
@ -15,6 +15,7 @@ trigger:
|
||||||
services:
|
services:
|
||||||
- name: api
|
- name: api
|
||||||
image: vikunja/api:unstable
|
image: vikunja/api:unstable
|
||||||
|
pull: always
|
||||||
environment:
|
environment:
|
||||||
VIKUNJA_SERVICE_TESTINGTOKEN: averyLongSecretToSe33dtheDB
|
VIKUNJA_SERVICE_TESTINGTOKEN: averyLongSecretToSe33dtheDB
|
||||||
VIKUNJA_LOG_LEVEL: DEBUG
|
VIKUNJA_LOG_LEVEL: DEBUG
|
||||||
|
@ -521,6 +522,6 @@ steps:
|
||||||
from_secret: crowdin_key
|
from_secret: crowdin_key
|
||||||
---
|
---
|
||||||
kind: signature
|
kind: signature
|
||||||
hmac: 971875b90c7bb1649d1b00d022d0b594ba9b68f927bf8f0dbe840190816d676b
|
hmac: 303afeb09b75a57ba88720b45dc06c8bf2c7320e19d738d8299f325438246f75
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
# How the file was made: template used: GitHub's suggested "deploy Nuxt app to GitHub pages"
|
||||||
|
# Since it's a Vite project, better refer to https://vitejs.dev/guide/static-deploy.html#github-pages
|
||||||
|
name: Deploy and release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- webxdc*
|
||||||
|
# branches: ["webxdc-prototype"]
|
||||||
|
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
||||||
|
permissions:
|
||||||
|
# Need `contents: write` to make a release.
|
||||||
|
contents: write
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
|
||||||
|
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
|
||||||
|
concurrency:
|
||||||
|
group: "pages"
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release-webxdc:
|
||||||
|
# Only make a release on tags
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
# TODO refactor: steps are duplicated for both jobs. I think
|
||||||
|
# YAML can help here.
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
# https://pnpm.io/continuous-integration
|
||||||
|
- name: Set up pnpm
|
||||||
|
uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 7
|
||||||
|
- name: Setup Node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: "16"
|
||||||
|
cache: "pnpm"
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pnpm install
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: pnpm run build-webxdc
|
||||||
|
- name: Release
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
# prerelease: ${{ contains(github.event.ref, '-beta') }}
|
||||||
|
prerelease: true
|
||||||
|
fail_on_unmatched_files: true
|
||||||
|
files: dist/*.xdc
|
||||||
|
|
||||||
|
# Deploy to GitHub Pages.
|
||||||
|
deploy-gh-pages:
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
# https://pnpm.io/continuous-integration
|
||||||
|
- name: Set up pnpm
|
||||||
|
uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 7
|
||||||
|
- name: Setup Node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: "16"
|
||||||
|
cache: "pnpm"
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pnpm install
|
||||||
|
|
||||||
|
- name: Setup Pages
|
||||||
|
uses: actions/configure-pages@v3
|
||||||
|
- name: Build
|
||||||
|
env:
|
||||||
|
REPO_OWNER_AND_NAME: ${{ github.repository }}
|
||||||
|
#VIKUNJA_FRONTEND_BASE: /${{ github.repository }}/
|
||||||
|
# Set VIKUNJA_FRONTEND_BASE to the repo name
|
||||||
|
run: VIKUNJA_FRONTEND_BASE=$(echo "$REPO_OWNER_AND_NAME" | cut -d / -f 2) pnpm run build
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-pages-artifact@v1
|
||||||
|
with:
|
||||||
|
path: ./dist
|
||||||
|
- name: Deploy to GitHub Pages
|
||||||
|
id: deployment
|
||||||
|
uses: actions/deploy-pages@v1
|
273
CHANGELOG.md
273
CHANGELOG.md
|
@ -9,6 +9,279 @@ All releases can be found on https://code.vikunja.io/frontend/releases.
|
||||||
|
|
||||||
The releases aim at the api versions which is why there are missing versions.
|
The releases aim at the api versions which is why there are missing versions.
|
||||||
|
|
||||||
|
## [0.20.5] - 2023-03-12
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* *(docker)* Add cap_net_bind to the nginx binary in the docker container
|
||||||
|
* *(docker)* Revert unprivileged user
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
|
||||||
|
* *(deps)* Update dependency sass to v1.59.2
|
||||||
|
* *(deps)* Update dependency eslint to v8.36.0
|
||||||
|
|
||||||
|
## [0.20.4] - 2023-03-10
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* *(base)* Use Build Time Base Path
|
||||||
|
* *(docker)* Cross compilation with buildx
|
||||||
|
* *(docker)* Default api url
|
||||||
|
* *(docker)* Make sure the service worker and webmanifest are never cached
|
||||||
|
* *(filter)* Validate title before creating or editing a filter
|
||||||
|
* *(filter)* Don't allow marking a filter as favorite
|
||||||
|
* *(i18n)* Load language files before doing anything else (#3218)
|
||||||
|
* *(keyboard-shortcuts)* Use card prop
|
||||||
|
* *(list)* Make sure favorite lists are not duplicated in the menu when renaming them
|
||||||
|
* *(menu)* Don't show drag handle for not draggable menu items
|
||||||
|
* *(postcss-preset-env)* Client side polyfills (#3051)
|
||||||
|
* *(quick actions)* Don't throw an error message when selecting the last items with the arrow keys
|
||||||
|
* *(quick actions)* Hide edges of last entry on hover
|
||||||
|
* *(quick add magic)* Correctly parse "next {weekday}" on the beginning of the text
|
||||||
|
* *(quick-actions)* Nothing happening on team click (#3186)
|
||||||
|
* *(table view)* Correctly load sort order from local storage
|
||||||
|
* *(task)* Allow clicking on the whole task to open the task detail view
|
||||||
|
* *(tests)* Only look in src for tests
|
||||||
|
* Make sure global error handler handles unrejected promises correctly ([4576da0](4576da0dd394ee68801b1dc424c9550896d63737))
|
||||||
|
* Use Build Time Base Path (#2964) ([6572f75](6572f75e5d111f7f2dd06e8c2ad0e0d16091fca6))
|
||||||
|
* Always show update popup on top ([7cbf0ac](7cbf0acac503c508a44e0491ae51e6d5749dfa04))
|
||||||
|
* Button styles ([d40729c](d40729cbe70b760bcc64d56130a410b05ef9d3dc))
|
||||||
|
* Stop revealing elements on hover if hover is not supported (#3191) ([7b6f76d](7b6f76d1b4698d0d6c6889aaab3f1cdad80469f8))
|
||||||
|
* Sync sidebar transition with `<main>` (#3200) ([0f97ba6](0f97ba6ec904226ed91cd3ade8223e2959e9207a))
|
||||||
|
* Collapse menu on mobile when path changes ([1b06112](1b06112db4ba5ad4144b5868dd04e954be1d77f7))
|
||||||
|
* I18ze a string (#3210) ([b4dd23b](b4dd23b85d909f7e629e953f1d8543ccbf963a1c))
|
||||||
|
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
|
||||||
|
* *(deps)* Update sentry-javascript monorepo to v7.33.0 (#3004)
|
||||||
|
* *(deps)* Update dependency axios to v1.2.4 (#3005)
|
||||||
|
* *(deps)* Update pnpm to v7.26.0 (#3002)
|
||||||
|
* *(deps)* Update dependency cypress to v12.4.0 (#3006)
|
||||||
|
* *(deps)* Update dependency @infectoone/vue-ganttastic to v2.1.4 (#3009)
|
||||||
|
* *(deps)* Update dependency vitest to v0.28.2 (#3008)
|
||||||
|
* *(deps)* Update dependency rollup to v3.11.0 (#3013)
|
||||||
|
* *(deps)* Update dependency @vitejs/plugin-legacy to v3.0.2 (#3012)
|
||||||
|
* *(deps)* Update dependency axios to v1.2.5
|
||||||
|
* *(deps)* Update sentry-javascript monorepo to v7.34.0
|
||||||
|
* *(deps)* Update pnpm to v7.26.1
|
||||||
|
* *(deps)* Update dependency @vue/test-utils to v2.2.8
|
||||||
|
* *(deps)* Update dependency vitest to v0.28.3 (#3019)
|
||||||
|
* *(deps)* Update dependency cypress to v12.4.1
|
||||||
|
* *(deps)* Update dependency rollup to v3.12.0
|
||||||
|
* *(deps)* Update dependency esbuild to v0.17.5
|
||||||
|
* *(deps)* Update dependency axios to v1.2.6
|
||||||
|
* *(deps)* Update dependency @vueuse/core to v9.12.0
|
||||||
|
* *(deps)* Update pnpm to v7.26.2
|
||||||
|
* *(deps)* Update dependency eslint to v8.33.0
|
||||||
|
* *(deps)* Update dependency netlify-cli to v12.10.0
|
||||||
|
* *(deps)* Update dependency happy-dom to v8.2.0
|
||||||
|
* *(deps)* Update dependency caniuse-lite to v1.0.30001449
|
||||||
|
* *(deps)* Update dependency typescript to v4.9.5
|
||||||
|
* *(deps)* Update typescript-eslint monorepo to v5.50.0
|
||||||
|
* *(deps)* Update dependency axios to v1.3.0 (#3036)
|
||||||
|
* *(deps)* Update dependency sass to v1.58.0
|
||||||
|
* *(deps)* Update dependency cypress to v12.5.0
|
||||||
|
* *(deps)* Update pnpm to v7.26.3
|
||||||
|
* *(deps)* Update dependency rollup to v3.12.1
|
||||||
|
* *(deps)* Update sentry-javascript monorepo to v7.35.0 (#3041)
|
||||||
|
* *(deps)* Update dependency pinia to v2.0.30 (#3042)
|
||||||
|
* *(deps)* Update dependency @vue/test-utils to v2.2.9
|
||||||
|
* *(deps)* Update dependency axios to v1.3.1
|
||||||
|
* *(deps)* Update dependency vue to v3.2.47
|
||||||
|
* *(deps)* Update dependency vite to v4.1.0
|
||||||
|
* *(deps)* Update dependency postcss-preset-env to v8 (#3000)
|
||||||
|
* *(deps)* Update dependency @vitejs/plugin-legacy to v4
|
||||||
|
* *(deps)* Update dependency @vitejs/plugin-legacy to v4.0.1
|
||||||
|
* *(deps)* Update sentry-javascript monorepo to v7.36.0
|
||||||
|
* *(deps)* Update dependency vite to v4.1.1
|
||||||
|
* *(deps)* Update dependency cypress to v12.5.1
|
||||||
|
* *(deps)* Update dependency @vue/test-utils to v2.2.10
|
||||||
|
* *(deps)* Update dependency vitest to v0.28.4
|
||||||
|
* *(deps)* Update dependency rollup to v3.13.0
|
||||||
|
* *(deps)* Update dependency axios to v1.3.2
|
||||||
|
* *(deps)* Update dependency rollup to v3.14.0
|
||||||
|
* *(deps)* Update dependency @types/node to v18.11.19
|
||||||
|
* *(deps)* Update dependency @histoire/plugin-screenshot to v0.13.0
|
||||||
|
* *(deps)* Update dependency histoire to v0.13.0
|
||||||
|
* *(deps)* Update caniuse-and-related
|
||||||
|
* *(deps)* Update dependency @histoire/plugin-vue to v0.13.0
|
||||||
|
* *(deps)* Update dependency happy-dom to v8.2.6
|
||||||
|
* *(deps)* Update typescript-eslint monorepo to v5.51.0
|
||||||
|
* *(deps)* Update dependency esbuild to v0.17.6
|
||||||
|
* *(deps)* Update dependency @cypress/vue to v5.0.4
|
||||||
|
* *(deps)* Update dependency @types/node to v18.13.0
|
||||||
|
* *(deps)* Update dependency vite-plugin-pwa to v0.14.2
|
||||||
|
* *(deps)* Update font awesome to v6.3.0
|
||||||
|
* *(deps)* Update pnpm to v7.27.0
|
||||||
|
* *(deps)* Update dependency @histoire/plugin-screenshot to v0.13.1
|
||||||
|
* *(deps)* Update dependency @histoire/plugin-vue to v0.13.1
|
||||||
|
* *(deps)* Update dependency vite-plugin-pwa to v0.14.3
|
||||||
|
* *(deps)* Update dependency histoire to v0.13.1
|
||||||
|
* *(deps)* Update dependency @histoire/plugin-screenshot to v0.13.2
|
||||||
|
* *(deps)* Update dependency @histoire/plugin-vue to v0.13.2
|
||||||
|
* *(deps)* Update dependency histoire to v0.13.2
|
||||||
|
* *(deps)* Update dependency @intlify/unplugin-vue-i18n to v0.8.2
|
||||||
|
* *(deps)* Update sentry-javascript monorepo to v7.37.0
|
||||||
|
* *(deps)* Update dependency esbuild to v0.17.7
|
||||||
|
* *(deps)* Update dependency rollup to v3.15.0
|
||||||
|
* *(deps)* Create a group for all histoire dependencies
|
||||||
|
* *(deps)* Update dependency @histoire/plugin-vue to v0.14.0
|
||||||
|
* *(deps)* Update dependency @histoire/plugin-screenshot to v0.14.0
|
||||||
|
* *(deps)* Update dependency @histoire/plugin-vue to v0.14.0
|
||||||
|
* *(deps)* Update dependency histoire to v0.14.0
|
||||||
|
* *(deps)* Update sentry-javascript monorepo to v7.37.1
|
||||||
|
* *(deps)* Update dependency histoire to v0.14.2
|
||||||
|
* *(deps)* Include histoire main package in histoire renovate group
|
||||||
|
* *(deps)* Histoire renovate group
|
||||||
|
* *(deps)* Update dependency eslint to v8.34.0
|
||||||
|
* *(deps)* Update histoire to v0.14.2
|
||||||
|
* *(deps)* Update dependency vite-plugin-pwa to v0.14.4
|
||||||
|
* *(deps)* Update dependency esbuild to v0.17.8
|
||||||
|
* *(deps)* Update dependency netlify-cli to v12.12.0
|
||||||
|
* *(deps)* Update dependency caniuse-lite to v1.0.30001451
|
||||||
|
* *(deps)* Update dependency vite-plugin-inject-preload to v1.3.0
|
||||||
|
* *(deps)* Update dependency vitest to v0.28.5
|
||||||
|
* *(deps)* Update sentry-javascript monorepo to v7.37.2
|
||||||
|
* *(deps)* Update dependency dompurify to v3 (#3107)
|
||||||
|
* *(deps)* Update typescript-eslint monorepo to v5.52.0
|
||||||
|
* *(deps)* Update dependency axios to v1.3.3
|
||||||
|
* *(deps)* Update dependency start-server-and-test to v1.15.4 (#3109)
|
||||||
|
* *(deps)* Update dependency sass to v1.58.1
|
||||||
|
* *(deps)* Update dependency vue-flatpickr-component to v11.0.2 (#3112)
|
||||||
|
* *(deps)* Update dependency @kyvg/vue3-notification to v2.9.0 (#3113)
|
||||||
|
* *(deps)* Update histoire to v0.15.1
|
||||||
|
* *(deps)* Update histoire to v0.15.3
|
||||||
|
* *(deps)* Update dependency vue-tsc to v1.1.0
|
||||||
|
* *(deps)* Pin node.js to 18.14.0
|
||||||
|
* *(deps)* Update dependency cypress to v12.6.0 (#3115)
|
||||||
|
* *(deps)* Update histoire to v0.15.4
|
||||||
|
* *(deps)* Update dependency vue-tsc to v1.1.2
|
||||||
|
* *(deps)* Update dependency sass to v1.58.2
|
||||||
|
* *(deps)* Update dependency ufo to v1.1.0
|
||||||
|
* *(deps)* Update node.js to v18.14.1
|
||||||
|
* *(deps)* Update dependency vite to v4.1.2
|
||||||
|
* *(deps)* Update sentry-javascript monorepo to v7.38.0
|
||||||
|
* *(deps)* Update dependency rollup to v3.16.0
|
||||||
|
* *(deps)* Update histoire to v0.15.7
|
||||||
|
* *(deps)* Update dependency blurhash to v2.0.5
|
||||||
|
* *(deps)* Update dependency @cypress/vite-dev-server to v5.0.3
|
||||||
|
* *(deps)* Update dependency @types/node to v18.14.0
|
||||||
|
* *(deps)* Update histoire to v0.15.8
|
||||||
|
* *(deps)* Update dependency @vueuse/core to v9.13.0
|
||||||
|
* *(deps)* Update dependency rollup to v3.17.0
|
||||||
|
* *(deps)* Update pnpm to v7.27.1
|
||||||
|
* *(deps)* Update dependency vue-tsc to v1.1.3
|
||||||
|
* *(deps)* Update dependency sass to v1.58.3
|
||||||
|
* *(deps)* Update dependency rollup to v3.17.1
|
||||||
|
* *(deps)* Update dependency esbuild to v0.17.9
|
||||||
|
* *(deps)* Update dependency vite to v4.1.3
|
||||||
|
* *(deps)* Update dependency @vue/test-utils to v2.3.0
|
||||||
|
* *(deps)* Update dependency caniuse-lite to v1.0.30001457
|
||||||
|
* *(deps)* Update dependency codemirror to v5.65.12
|
||||||
|
* *(deps)* Update dependency pinia to v2.0.31
|
||||||
|
* *(deps)* Update dependency vue-tsc to v1.1.4
|
||||||
|
* *(deps)* Update dependency rollup to v3.17.2
|
||||||
|
* *(deps)* Update dependency happy-dom to v8.6.0
|
||||||
|
* *(deps)* Update dependency netlify-cli to v12.13.2
|
||||||
|
* *(deps)* Update dependency esbuild to v0.17.10
|
||||||
|
* *(deps)* Update typescript-eslint monorepo to v5.53.0
|
||||||
|
* *(deps)* Update dependency vue-tsc to v1.1.5
|
||||||
|
* *(deps)* Update dependency pinia to v2.0.32
|
||||||
|
* *(deps)* Update node.js to v18.14.2
|
||||||
|
* *(deps)* Update dependency vite to v4.1.4
|
||||||
|
* *(deps)* Update dependency vue-tsc to v1.1.7
|
||||||
|
* *(deps)* Update dependency axios to v1.3.4
|
||||||
|
* *(deps)* Update dependency @types/node to v18.14.1
|
||||||
|
* *(deps)* Update dependency @cypress/vite-dev-server to v5.0.4
|
||||||
|
* *(deps)* Update dependency cypress to v12.7.0
|
||||||
|
* *(deps)* Update dependency vue-tsc to v1.2.0
|
||||||
|
* *(deps)* Update dependency vitest to v0.29.1
|
||||||
|
* *(deps)* Update pnpm to v7.28.0
|
||||||
|
* *(deps)* Update dependency eslint to v8.35.0
|
||||||
|
* *(deps)* Update dependency rollup to v3.17.3
|
||||||
|
* *(deps)* Update dependency netlify-cli to v13
|
||||||
|
* *(deps)* Update dependency happy-dom to v8.9.0
|
||||||
|
* *(deps)* Update dependency caniuse-lite to v1.0.30001458
|
||||||
|
* *(deps)* Update dependency start-server-and-test to v1.15.5
|
||||||
|
* *(deps)* Update dependency start-server-and-test to v2
|
||||||
|
* *(deps)* Update dependency @types/node to v18.14.2
|
||||||
|
* *(deps)* Update sentry-javascript monorepo to v7.39.0
|
||||||
|
* *(deps)* Update typescript-eslint monorepo to v5.54.0
|
||||||
|
* *(deps)* Update dependency ufo to v1.1.1
|
||||||
|
* *(deps)* Update dependency vitest to v0.29.2
|
||||||
|
* *(deps)* Update dependency rollup to v3.18.0
|
||||||
|
* *(deps)* Update dependency dompurify to v3.0.1
|
||||||
|
* *(deps)* Update sentry-javascript monorepo to v7.40.0
|
||||||
|
* *(deps)* Update dependency @types/node to v18.14.4
|
||||||
|
* *(deps)* Update dependency @types/node to v18.14.5
|
||||||
|
* *(deps)* Update dependency @types/node to v18.14.6
|
||||||
|
* *(deps)* Update dependency esbuild to v0.17.11
|
||||||
|
* *(deps)* Update dependency netlify-cli to v13.0.1
|
||||||
|
* *(deps)* Update dependency caniuse-lite to v1.0.30001460
|
||||||
|
* *(deps)* Update pnpm to v7.29.0
|
||||||
|
* *(deps)* Update sentry-javascript monorepo to v7.41.0
|
||||||
|
* *(deps)* Update typescript-eslint monorepo to v5.54.1
|
||||||
|
* *(deps)* Update dependency pinia to v2.0.33
|
||||||
|
* *(deps)* Update node.js to v18.15.0
|
||||||
|
* *(deps)* Update dependency @intlify/unplugin-vue-i18n to v0.9.0
|
||||||
|
* *(deps)* Update pnpm to v7.29.1
|
||||||
|
* *(deps)* Update dependency @vue/test-utils to v2.3.1
|
||||||
|
* *(deps)* Update dependency @intlify/unplugin-vue-i18n to v0.9.1
|
||||||
|
* *(deps)* Update sentry-javascript monorepo to v7.42.0
|
||||||
|
* *(deps)* Update dependency rollup to v3.19.0
|
||||||
|
* *(deps)* Update dependency vite-plugin-inject-preload to v1.3.1
|
||||||
|
* *(deps)* Update dependency @types/node to v18.15.0
|
||||||
|
* *(deps)* Update dependency autoprefixer to v10.4.14
|
||||||
|
* *(deps)* Update dependency rollup to v3.19.1
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* *(config)* Support Setting Base Path in .env
|
||||||
|
* Use v-show for navigation buttons ([7ed1a37](7ed1a37de53cb8c15994e9524a52080170db5950))
|
||||||
|
* Unindent settings page (#2996) ([13a39be](13a39be3de4d0f7e0f6be9c20e0464e86b87c676))
|
||||||
|
* Small content auth improvements (#2998) ([2be7847](2be784766f54810f8969e48291ce9181f2854a5b))
|
||||||
|
* Move update from navigation to app ([3db5ea4](3db5ea45d768d10458eaab0f5ee9dad0df2996e4))
|
||||||
|
* Improve naming and styles ([eaeddda](eaeddda4e468c2040862d18c9b2d37a1c0ba099e))
|
||||||
|
* Use klona instead of lodash.clonedeep (#3073) ([7b96397](7b96397e3bfa43a393ca84439069290bc4c8a5c8))
|
||||||
|
* Refactor to composable ([c502f9b](c502f9b840ee2d65193aa4ef29c7f260b49db0d2))
|
||||||
|
* Header improvements ([e8db2c2](e8db2c2b458bcae592609d5a5bc3f1b333651b25))
|
||||||
|
* Persistent menuActive state with Local Storage (#3011) ([e3dd4ef](e3dd4ef78ac818add138d0323bf65abe8a4caa29))
|
||||||
|
* Fix calculation of token invalidation (#3077) ([d6b55c7](d6b55c757067413bbc34acd48af9fb553f36db8a))
|
||||||
|
* Use renovate js-app as preset (#3087) ([97c8970](97c8970dd60b2ba1e894ca0039524c8f6a5cd5df))
|
||||||
|
* Improve recommended vscode settings ([e0f0699](e0f06999beb0a9fb5da817323744307401e85e47))
|
||||||
|
|
||||||
|
|
||||||
|
### Miscellaneous Tasks
|
||||||
|
|
||||||
|
* *(refactor)* Improve `stores/config` types (#3190)
|
||||||
|
* *(services)* Add examples for some functions
|
||||||
|
* *(services)* Let `getAll`: always return `Model[]`
|
||||||
|
* Move class name to top ([c6ed925](c6ed9254247efeb43e0763e095b145d6ec1965e1))
|
||||||
|
* Simplify error handling for login and OpenId Auth ([e67088f](e67088fdb7bd3b24cea6ee37851ef45f1fb7bdad))
|
||||||
|
* Simplify getting the error text from an exception ([9adf1ab](9adf1aba895a02f416148ddf8b6925689d6e2687))
|
||||||
|
* Typo ([81a4f2d](81a4f2d9775716bc0056348664fc24185af040d4))
|
||||||
|
* Update funding links ([7cb0cd2](7cb0cd293d6d277172eccf2558a62427bc86dfe6))
|
||||||
|
* Update funding links ([b26ea45](b26ea45fe0d1d6f5f070ef42a5d68aa6db8e6b70))
|
||||||
|
* Remove minimist dependency (not used anywhere) ([f697640](f697640636466e8f035c7d31597ee589379fa017))
|
||||||
|
* Remove sponsor ([fa0e46a](fa0e46a3991ab423c9364b65439d9e8e5a28cb7b))
|
||||||
|
* Histoire add logo link ([af4a039](af4a039502b29e9e7e21cf30d44715c7af056c15))
|
||||||
|
* Improve `@/message` `action` type (#3209) ([0eb78e3](0eb78e32f994e7032725e38d564320a5a04cbf2a))
|
||||||
|
* Remove an unused duplicate key ([9db3aed](9db3aedde9566fb94717e1dd66a21abdbda6e84a))
|
||||||
|
|
||||||
|
|
||||||
|
### Other
|
||||||
|
|
||||||
|
* *(other)* Add Ipv6 support to nginx (#100)
|
||||||
|
* *(other)* Added ipv6 control script
|
||||||
|
* *(other)* Disable listening on IPv6 ports when IPv6 is not supported (#102)
|
||||||
|
* *(other)* Docker refactoring (#3018)
|
||||||
|
* *(other)* Persist menuActive state in Local Storage
|
||||||
|
* *(other)* Refactor to only used local storage value when on desktop viewport widths
|
||||||
|
* *(other)* Solve for resize()
|
||||||
|
* *(other)* [skip ci] Updated translations via Crowdin
|
||||||
|
|
||||||
## [0.20.3] - 2023-01-24
|
## [0.20.3] - 2023-01-24
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
|
@ -66,5 +66,3 @@ RUN chmod 0755 /docker-entrypoint.d/*.sh /etc/nginx/templates && \
|
||||||
chmod -R 0644 /etc/nginx/nginx.conf && \
|
chmod -R 0644 /etc/nginx/nginx.conf && \
|
||||||
chown -R nginx:nginx ./ /etc/nginx/conf.d /etc/nginx/templates && \
|
chown -R nginx:nginx ./ /etc/nginx/conf.d /etc/nginx/templates && \
|
||||||
rm -f /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
|
rm -f /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
|
||||||
# unprivileged user
|
|
||||||
USER nginx
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
[![Build Status](https://drone.kolaente.de/api/badges/vikunja/frontend/status.svg)](https://drone.kolaente.de/vikunja/frontend)
|
[![Build Status](https://drone.kolaente.de/api/badges/vikunja/frontend/status.svg)](https://drone.kolaente.de/vikunja/frontend)
|
||||||
[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE)
|
[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE)
|
||||||
[![Download](https://img.shields.io/badge/download-v0.20.3-brightgreen.svg)](https://dl.vikunja.io)
|
[![Download](https://img.shields.io/badge/download-v0.20.5-brightgreen.svg)](https://dl.vikunja.io)
|
||||||
[![Translation](https://badges.crowdin.net/vikunja/localized.svg)](https://crowdin.com/project/vikunja)
|
[![Translation](https://badges.crowdin.net/vikunja/localized.svg)](https://crowdin.com/project/vikunja)
|
||||||
|
|
||||||
This is the web frontend for Vikunja, written in Vue.js.
|
This is the web frontend for Vikunja, written in Vue.js.
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
"-h" | "--help")
|
||||||
|
echo "usage: ${0##*/} [PACKAGE_NAME]"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
"")
|
||||||
|
PACKAGE_NAME=${PWD##*/} # '##*/' removes everything before the last slash and the last slash
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
PACKAGE_NAME=${1%.xdc} # '%.xdc' removes the extension and allows PACKAGE_NAME to be given with or without extension
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
rm "$PACKAGE_NAME.xdc" 2> /dev/null
|
||||||
|
zip -9 --recurse-paths "$PACKAGE_NAME.xdc" --exclude LICENSE README.md webxdc.js webxdc.d.ts "./*.sh" "./*.xdc" -- *
|
||||||
|
|
||||||
|
echo "success, archive contents:"
|
||||||
|
unzip -l "$PACKAGE_NAME.xdc"
|
||||||
|
|
||||||
|
# check package size
|
||||||
|
MAXSIZE=655360
|
||||||
|
size=$(wc -c < "$PACKAGE_NAME.xdc")
|
||||||
|
if [ "$size" -ge $MAXSIZE ]; then
|
||||||
|
echo "WARNING: package size exceeded the limit ($size > $MAXSIZE)"
|
||||||
|
fi
|
|
@ -1,57 +0,0 @@
|
||||||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
|
||||||
|
|
||||||
import {ListFactory} from '../../factories/list'
|
|
||||||
import {prepareLists} from './prepareLists'
|
|
||||||
|
|
||||||
describe('List History', () => {
|
|
||||||
createFakeUserAndLogin()
|
|
||||||
prepareLists()
|
|
||||||
|
|
||||||
it('should show a list history on the home page', () => {
|
|
||||||
cy.intercept(Cypress.env('API_URL') + '/namespaces*').as('loadNamespaces')
|
|
||||||
cy.intercept(Cypress.env('API_URL') + '/lists/*').as('loadList')
|
|
||||||
|
|
||||||
const lists = ListFactory.create(6)
|
|
||||||
|
|
||||||
cy.visit('/')
|
|
||||||
cy.wait('@loadNamespaces')
|
|
||||||
cy.get('body')
|
|
||||||
.should('not.contain', 'Last viewed')
|
|
||||||
|
|
||||||
cy.visit(`/lists/${lists[0].id}`)
|
|
||||||
cy.wait('@loadNamespaces')
|
|
||||||
cy.wait('@loadList')
|
|
||||||
cy.visit(`/lists/${lists[1].id}`)
|
|
||||||
cy.wait('@loadNamespaces')
|
|
||||||
cy.wait('@loadList')
|
|
||||||
cy.visit(`/lists/${lists[2].id}`)
|
|
||||||
cy.wait('@loadNamespaces')
|
|
||||||
cy.wait('@loadList')
|
|
||||||
cy.visit(`/lists/${lists[3].id}`)
|
|
||||||
cy.wait('@loadNamespaces')
|
|
||||||
cy.wait('@loadList')
|
|
||||||
cy.visit(`/lists/${lists[4].id}`)
|
|
||||||
cy.wait('@loadNamespaces')
|
|
||||||
cy.wait('@loadList')
|
|
||||||
cy.visit(`/lists/${lists[5].id}`)
|
|
||||||
cy.wait('@loadNamespaces')
|
|
||||||
cy.wait('@loadList')
|
|
||||||
|
|
||||||
// cy.visit('/')
|
|
||||||
// cy.wait('@loadNamespaces')
|
|
||||||
// Not using cy.visit here to work around the redirect issue fixed in #1337
|
|
||||||
cy.get('nav.menu.top-menu a')
|
|
||||||
.contains('Overview')
|
|
||||||
.click()
|
|
||||||
|
|
||||||
cy.get('body')
|
|
||||||
.should('contain', 'Last viewed')
|
|
||||||
cy.get('[data-cy="listCardGrid"]')
|
|
||||||
.should('not.contain', lists[0].title)
|
|
||||||
.should('contain', lists[1].title)
|
|
||||||
.should('contain', lists[2].title)
|
|
||||||
.should('contain', lists[3].title)
|
|
||||||
.should('contain', lists[4].title)
|
|
||||||
.should('contain', lists[5].title)
|
|
||||||
})
|
|
||||||
})
|
|
|
@ -1,19 +0,0 @@
|
||||||
import {ListFactory} from '../../factories/list'
|
|
||||||
import {NamespaceFactory} from '../../factories/namespace'
|
|
||||||
import {TaskFactory} from '../../factories/task'
|
|
||||||
|
|
||||||
export function createLists() {
|
|
||||||
NamespaceFactory.create(1)
|
|
||||||
const lists = ListFactory.create(1, {
|
|
||||||
title: 'First List'
|
|
||||||
})
|
|
||||||
TaskFactory.truncate()
|
|
||||||
return lists
|
|
||||||
}
|
|
||||||
|
|
||||||
export function prepareLists(setLists = (...args: any[]) => {}) {
|
|
||||||
beforeEach(() => {
|
|
||||||
const lists = createLists()
|
|
||||||
setLists(lists)
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -1,18 +1,20 @@
|
||||||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||||
|
|
||||||
import {TaskFactory} from '../../factories/task'
|
import {TaskFactory} from '../../factories/task'
|
||||||
import {ListFactory} from '../../factories/list'
|
import {ProjectFactory} from '../../factories/project'
|
||||||
import {NamespaceFactory} from '../../factories/namespace'
|
import {NamespaceFactory} from '../../factories/namespace'
|
||||||
import {UserListFactory} from '../../factories/users_list'
|
import {UserProjectFactory} from '../../factories/users_project'
|
||||||
|
import {BucketFactory} from '../../factories/bucket'
|
||||||
|
|
||||||
describe('Editor', () => {
|
describe('Editor', () => {
|
||||||
createFakeUserAndLogin()
|
createFakeUserAndLogin()
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
NamespaceFactory.create(1)
|
NamespaceFactory.create(1)
|
||||||
ListFactory.create(1)
|
ProjectFactory.create(1)
|
||||||
|
BucketFactory.create(1)
|
||||||
TaskFactory.truncate()
|
TaskFactory.truncate()
|
||||||
UserListFactory.truncate()
|
UserProjectFactory.truncate()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Has a preview with checkable checkboxes', () => {
|
it('Has a preview with checkable checkboxes', () => {
|
||||||
|
@ -24,6 +26,7 @@ describe('Editor', () => {
|
||||||
* [ ] Checklist
|
* [ ] Checklist
|
||||||
* [x] Checklist checked
|
* [x] Checklist checked
|
||||||
`,
|
`,
|
||||||
|
bucket_id: 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
cy.visit(`/tasks/${tasks[0].id}`)
|
cy.visit(`/tasks/${tasks[0].id}`)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||||
|
|
||||||
import {ListFactory} from '../../factories/list'
|
import {ProjectFactory} from '../../factories/project'
|
||||||
import {NamespaceFactory} from '../../factories/namespace'
|
import {NamespaceFactory} from '../../factories/namespace'
|
||||||
|
|
||||||
describe('Namepaces', () => {
|
describe('Namepaces', () => {
|
||||||
|
@ -10,7 +10,7 @@ describe('Namepaces', () => {
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
namespaces = NamespaceFactory.create(1)
|
namespaces = NamespaceFactory.create(1)
|
||||||
ListFactory.create(1)
|
ProjectFactory.create(1)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should be all there', () => {
|
it('Should be all there', () => {
|
||||||
|
@ -99,17 +99,17 @@ describe('Namepaces', () => {
|
||||||
.should('not.contain', newNamespaces[0].title)
|
.should('not.contain', newNamespaces[0].title)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should not show archived lists & namespaces if the filter is not checked', () => {
|
it('Should not show archived projects & namespaces if the filter is not checked', () => {
|
||||||
const n = NamespaceFactory.create(1, {
|
const n = NamespaceFactory.create(1, {
|
||||||
id: 2,
|
id: 2,
|
||||||
is_archived: true,
|
is_archived: true,
|
||||||
}, false)
|
}, false)
|
||||||
ListFactory.create(1, {
|
ProjectFactory.create(1, {
|
||||||
id: 2,
|
id: 2,
|
||||||
namespace_id: n[0].id,
|
namespace_id: n[0].id,
|
||||||
}, false)
|
}, false)
|
||||||
|
|
||||||
ListFactory.create(1, {
|
ProjectFactory.create(1, {
|
||||||
id: 3,
|
id: 3,
|
||||||
is_archived: true,
|
is_archived: true,
|
||||||
}, false)
|
}, false)
|
|
@ -0,0 +1,19 @@
|
||||||
|
import {ProjectFactory} from '../../factories/project'
|
||||||
|
import {NamespaceFactory} from '../../factories/namespace'
|
||||||
|
import {TaskFactory} from '../../factories/task'
|
||||||
|
|
||||||
|
export function createProjects() {
|
||||||
|
NamespaceFactory.create(1)
|
||||||
|
const projects = ProjectFactory.create(1, {
|
||||||
|
title: 'First Project'
|
||||||
|
})
|
||||||
|
TaskFactory.truncate()
|
||||||
|
return projects
|
||||||
|
}
|
||||||
|
|
||||||
|
export function prepareProjects(setProjects = (...args: any[]) => {}) {
|
||||||
|
beforeEach(() => {
|
||||||
|
const projects = createProjects()
|
||||||
|
setProjects(projects)
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||||
|
|
||||||
|
import {ProjectFactory} from '../../factories/project'
|
||||||
|
import {prepareProjects} from './prepareProjects'
|
||||||
|
|
||||||
|
describe('Project History', () => {
|
||||||
|
createFakeUserAndLogin()
|
||||||
|
prepareProjects()
|
||||||
|
|
||||||
|
it('should show a project history on the home page', () => {
|
||||||
|
cy.intercept(Cypress.env('API_URL') + '/namespaces*').as('loadNamespaces')
|
||||||
|
cy.intercept(Cypress.env('API_URL') + '/projects/*').as('loadProject')
|
||||||
|
|
||||||
|
const projects = ProjectFactory.create(6)
|
||||||
|
|
||||||
|
cy.visit('/')
|
||||||
|
cy.wait('@loadNamespaces')
|
||||||
|
cy.get('body')
|
||||||
|
.should('not.contain', 'Last viewed')
|
||||||
|
|
||||||
|
cy.visit(`/projects/${projects[0].id}`)
|
||||||
|
cy.wait('@loadNamespaces')
|
||||||
|
cy.wait('@loadProject')
|
||||||
|
cy.visit(`/projects/${projects[1].id}`)
|
||||||
|
cy.wait('@loadNamespaces')
|
||||||
|
cy.wait('@loadProject')
|
||||||
|
cy.visit(`/projects/${projects[2].id}`)
|
||||||
|
cy.wait('@loadNamespaces')
|
||||||
|
cy.wait('@loadProject')
|
||||||
|
cy.visit(`/projects/${projects[3].id}`)
|
||||||
|
cy.wait('@loadNamespaces')
|
||||||
|
cy.wait('@loadProject')
|
||||||
|
cy.visit(`/projects/${projects[4].id}`)
|
||||||
|
cy.wait('@loadNamespaces')
|
||||||
|
cy.wait('@loadProject')
|
||||||
|
cy.visit(`/projects/${projects[5].id}`)
|
||||||
|
cy.wait('@loadNamespaces')
|
||||||
|
cy.wait('@loadProject')
|
||||||
|
|
||||||
|
// cy.visit('/')
|
||||||
|
// cy.wait('@loadNamespaces')
|
||||||
|
// Not using cy.visit here to work around the redirect issue fixed in #1337
|
||||||
|
cy.get('nav.menu.top-menu a')
|
||||||
|
.contains('Overview')
|
||||||
|
.click()
|
||||||
|
|
||||||
|
cy.get('body')
|
||||||
|
.should('contain', 'Last viewed')
|
||||||
|
cy.get('[data-cy="projectCardGrid"]')
|
||||||
|
.should('not.contain', projects[0].title)
|
||||||
|
.should('contain', projects[1].title)
|
||||||
|
.should('contain', projects[2].title)
|
||||||
|
.should('contain', projects[3].title)
|
||||||
|
.should('contain', projects[4].title)
|
||||||
|
.should('contain', projects[5].title)
|
||||||
|
})
|
||||||
|
})
|
|
@ -3,15 +3,15 @@ import {formatISO, format} from 'date-fns'
|
||||||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||||
|
|
||||||
import {TaskFactory} from '../../factories/task'
|
import {TaskFactory} from '../../factories/task'
|
||||||
import {prepareLists} from './prepareLists'
|
import {prepareProjects} from './prepareProjects'
|
||||||
|
|
||||||
describe('List View Gantt', () => {
|
describe('Project View Gantt', () => {
|
||||||
createFakeUserAndLogin()
|
createFakeUserAndLogin()
|
||||||
prepareLists()
|
prepareProjects()
|
||||||
|
|
||||||
it('Hides tasks with no dates', () => {
|
it('Hides tasks with no dates', () => {
|
||||||
const tasks = TaskFactory.create(1)
|
const tasks = TaskFactory.create(1)
|
||||||
cy.visit('/lists/1/gantt')
|
cy.visit('/projects/1/gantt')
|
||||||
|
|
||||||
cy.get('.g-gantt-rows-container')
|
cy.get('.g-gantt-rows-container')
|
||||||
.should('not.contain', tasks[0].title)
|
.should('not.contain', tasks[0].title)
|
||||||
|
@ -25,7 +25,7 @@ describe('List View Gantt', () => {
|
||||||
nextMonth.setDate(1)
|
nextMonth.setDate(1)
|
||||||
nextMonth.setMonth(9)
|
nextMonth.setMonth(9)
|
||||||
|
|
||||||
cy.visit('/lists/1/gantt')
|
cy.visit('/projects/1/gantt')
|
||||||
|
|
||||||
cy.get('.g-timeunits-container')
|
cy.get('.g-timeunits-container')
|
||||||
.should('contain', format(now, 'MMMM'))
|
.should('contain', format(now, 'MMMM'))
|
||||||
|
@ -38,7 +38,7 @@ describe('List View Gantt', () => {
|
||||||
start_date: now.toISOString(),
|
start_date: now.toISOString(),
|
||||||
end_date: new Date(new Date(now).setDate(now.getDate() + 4)).toISOString(),
|
end_date: new Date(new Date(now).setDate(now.getDate() + 4)).toISOString(),
|
||||||
})
|
})
|
||||||
cy.visit('/lists/1/gantt')
|
cy.visit('/projects/1/gantt')
|
||||||
|
|
||||||
cy.get('.g-gantt-rows-container')
|
cy.get('.g-gantt-rows-container')
|
||||||
.should('not.be.empty')
|
.should('not.be.empty')
|
||||||
|
@ -50,7 +50,7 @@ describe('List View Gantt', () => {
|
||||||
start_date: null,
|
start_date: null,
|
||||||
end_date: null,
|
end_date: null,
|
||||||
})
|
})
|
||||||
cy.visit('/lists/1/gantt')
|
cy.visit('/projects/1/gantt')
|
||||||
|
|
||||||
cy.get('.gantt-options .fancycheckbox')
|
cy.get('.gantt-options .fancycheckbox')
|
||||||
.contains('Show tasks which don\'t have dates set')
|
.contains('Show tasks which don\'t have dates set')
|
||||||
|
@ -69,7 +69,7 @@ describe('List View Gantt', () => {
|
||||||
start_date: now.toISOString(),
|
start_date: now.toISOString(),
|
||||||
end_date: new Date(new Date(now).setDate(now.getDate() + 4)).toISOString(),
|
end_date: new Date(new Date(now).setDate(now.getDate() + 4)).toISOString(),
|
||||||
})
|
})
|
||||||
cy.visit('/lists/1/gantt')
|
cy.visit('/projects/1/gantt')
|
||||||
|
|
||||||
cy.get('.g-gantt-rows-container .g-gantt-row .g-gantt-row-bars-container div .g-gantt-bar')
|
cy.get('.g-gantt-rows-container .g-gantt-row .g-gantt-row-bars-container div .g-gantt-bar')
|
||||||
.first()
|
.first()
|
||||||
|
@ -83,9 +83,9 @@ describe('List View Gantt', () => {
|
||||||
const now = Date.UTC(2022, 10, 9)
|
const now = Date.UTC(2022, 10, 9)
|
||||||
cy.clock(now, ['Date'])
|
cy.clock(now, ['Date'])
|
||||||
|
|
||||||
cy.visit('/lists/1/gantt')
|
cy.visit('/projects/1/gantt')
|
||||||
|
|
||||||
cy.get('.list-gantt .gantt-options .field .control input.input.form-control')
|
cy.get('.project-gantt .gantt-options .field .control input.input.form-control')
|
||||||
.click()
|
.click()
|
||||||
cy.get('.flatpickr-calendar .flatpickr-innerContainer .dayContainer .flatpickr-day')
|
cy.get('.flatpickr-calendar .flatpickr-innerContainer .dayContainer .flatpickr-day')
|
||||||
.first()
|
.first()
|
||||||
|
@ -99,13 +99,13 @@ describe('List View Gantt', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should change the date range based on date query parameters', () => {
|
it('Should change the date range based on date query parameters', () => {
|
||||||
cy.visit('/lists/1/gantt?dateFrom=2022-09-25&dateTo=2022-11-05')
|
cy.visit('/projects/1/gantt?dateFrom=2022-09-25&dateTo=2022-11-05')
|
||||||
|
|
||||||
cy.get('.g-timeunits-container')
|
cy.get('.g-timeunits-container')
|
||||||
.should('contain', 'September 2022')
|
.should('contain', 'September 2022')
|
||||||
.should('contain', 'October 2022')
|
.should('contain', 'October 2022')
|
||||||
.should('contain', 'November 2022')
|
.should('contain', 'November 2022')
|
||||||
cy.get('.list-gantt .gantt-options .field .control input.input.form-control')
|
cy.get('.project-gantt .gantt-options .field .control input.input.form-control')
|
||||||
.should('have.value', '25 Sep 2022 to 5 Nov 2022')
|
.should('have.value', '25 Sep 2022 to 5 Nov 2022')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ describe('List View Gantt', () => {
|
||||||
start_date: formatISO(now),
|
start_date: formatISO(now),
|
||||||
end_date: formatISO(now.setDate(now.getDate() + 4)),
|
end_date: formatISO(now.setDate(now.getDate() + 4)),
|
||||||
})
|
})
|
||||||
cy.visit('/lists/1/gantt')
|
cy.visit('/projects/1/gantt')
|
||||||
|
|
||||||
cy.get('.gantt-container .g-gantt-chart .g-gantt-row-bars-container .g-gantt-bar')
|
cy.get('.gantt-container .g-gantt-chart .g-gantt-row-bars-container .g-gantt-bar')
|
||||||
.dblclick()
|
.dblclick()
|
|
@ -1,13 +1,13 @@
|
||||||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||||
|
|
||||||
import {BucketFactory} from '../../factories/bucket'
|
import {BucketFactory} from '../../factories/bucket'
|
||||||
import {ListFactory} from '../../factories/list'
|
import {ProjectFactory} from '../../factories/project'
|
||||||
import {TaskFactory} from '../../factories/task'
|
import {TaskFactory} from '../../factories/task'
|
||||||
import {prepareLists} from './prepareLists'
|
import {prepareProjects} from './prepareProjects'
|
||||||
|
|
||||||
describe('List View Kanban', () => {
|
describe('Project View Kanban', () => {
|
||||||
createFakeUserAndLogin()
|
createFakeUserAndLogin()
|
||||||
prepareLists()
|
prepareProjects()
|
||||||
|
|
||||||
let buckets
|
let buckets
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
@ -16,10 +16,10 @@ describe('List View Kanban', () => {
|
||||||
|
|
||||||
it('Shows all buckets with their tasks', () => {
|
it('Shows all buckets with their tasks', () => {
|
||||||
const data = TaskFactory.create(10, {
|
const data = TaskFactory.create(10, {
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
bucket_id: 1,
|
bucket_id: 1,
|
||||||
})
|
})
|
||||||
cy.visit('/lists/1/kanban')
|
cy.visit('/projects/1/kanban')
|
||||||
|
|
||||||
cy.get('.kanban .bucket .title')
|
cy.get('.kanban .bucket .title')
|
||||||
.contains(buckets[0].title)
|
.contains(buckets[0].title)
|
||||||
|
@ -34,10 +34,10 @@ describe('List View Kanban', () => {
|
||||||
|
|
||||||
it('Can add a new task to a bucket', () => {
|
it('Can add a new task to a bucket', () => {
|
||||||
TaskFactory.create(2, {
|
TaskFactory.create(2, {
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
bucket_id: 1,
|
bucket_id: 1,
|
||||||
})
|
})
|
||||||
cy.visit('/lists/1/kanban')
|
cy.visit('/projects/1/kanban')
|
||||||
|
|
||||||
cy.get('.kanban .bucket')
|
cy.get('.kanban .bucket')
|
||||||
.contains(buckets[0].title)
|
.contains(buckets[0].title)
|
||||||
|
@ -55,7 +55,7 @@ describe('List View Kanban', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Can create a new bucket', () => {
|
it('Can create a new bucket', () => {
|
||||||
cy.visit('/lists/1/kanban')
|
cy.visit('/projects/1/kanban')
|
||||||
|
|
||||||
cy.get('.kanban .bucket.new-bucket .button')
|
cy.get('.kanban .bucket.new-bucket .button')
|
||||||
.click()
|
.click()
|
||||||
|
@ -69,7 +69,7 @@ describe('List View Kanban', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Can set a bucket limit', () => {
|
it('Can set a bucket limit', () => {
|
||||||
cy.visit('/lists/1/kanban')
|
cy.visit('/projects/1/kanban')
|
||||||
|
|
||||||
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-trigger')
|
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-trigger')
|
||||||
.first()
|
.first()
|
||||||
|
@ -90,7 +90,7 @@ describe('List View Kanban', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Can rename a bucket', () => {
|
it('Can rename a bucket', () => {
|
||||||
cy.visit('/lists/1/kanban')
|
cy.visit('/projects/1/kanban')
|
||||||
|
|
||||||
cy.get('.kanban .bucket .bucket-header .title')
|
cy.get('.kanban .bucket .bucket-header .title')
|
||||||
.first()
|
.first()
|
||||||
|
@ -101,7 +101,7 @@ describe('List View Kanban', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Can delete a bucket', () => {
|
it('Can delete a bucket', () => {
|
||||||
cy.visit('/lists/1/kanban')
|
cy.visit('/projects/1/kanban')
|
||||||
|
|
||||||
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-trigger')
|
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-trigger')
|
||||||
.first()
|
.first()
|
||||||
|
@ -125,10 +125,10 @@ describe('List View Kanban', () => {
|
||||||
|
|
||||||
it('Can drag tasks around', () => {
|
it('Can drag tasks around', () => {
|
||||||
const tasks = TaskFactory.create(2, {
|
const tasks = TaskFactory.create(2, {
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
bucket_id: 1,
|
bucket_id: 1,
|
||||||
})
|
})
|
||||||
cy.visit('/lists/1/kanban')
|
cy.visit('/projects/1/kanban')
|
||||||
|
|
||||||
cy.get('.kanban .bucket .tasks .task')
|
cy.get('.kanban .bucket .tasks .task')
|
||||||
.contains(tasks[0].title)
|
.contains(tasks[0].title)
|
||||||
|
@ -144,10 +144,10 @@ describe('List View Kanban', () => {
|
||||||
it('Should navigate to the task when the task card is clicked', () => {
|
it('Should navigate to the task when the task card is clicked', () => {
|
||||||
const tasks = TaskFactory.create(5, {
|
const tasks = TaskFactory.create(5, {
|
||||||
id: '{increment}',
|
id: '{increment}',
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
bucket_id: 1,
|
bucket_id: 1,
|
||||||
})
|
})
|
||||||
cy.visit('/lists/1/kanban')
|
cy.visit('/projects/1/kanban')
|
||||||
|
|
||||||
cy.get('.kanban .bucket .tasks .task')
|
cy.get('.kanban .bucket .tasks .task')
|
||||||
.contains(tasks[0].title)
|
.contains(tasks[0].title)
|
||||||
|
@ -158,18 +158,18 @@ describe('List View Kanban', () => {
|
||||||
.should('contain', `/tasks/${tasks[0].id}`, { timeout: 1000 })
|
.should('contain', `/tasks/${tasks[0].id}`, { timeout: 1000 })
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should remove a task from the kanban board when moving it to another list', () => {
|
it('Should remove a task from the kanban board when moving it to another project', () => {
|
||||||
const lists = ListFactory.create(2)
|
const projects = ProjectFactory.create(2)
|
||||||
BucketFactory.create(2, {
|
BucketFactory.create(2, {
|
||||||
list_id: '{increment}',
|
project_id: '{increment}',
|
||||||
})
|
})
|
||||||
const tasks = TaskFactory.create(5, {
|
const tasks = TaskFactory.create(5, {
|
||||||
id: '{increment}',
|
id: '{increment}',
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
bucket_id: 1,
|
bucket_id: 1,
|
||||||
})
|
})
|
||||||
const task = tasks[0]
|
const task = tasks[0]
|
||||||
cy.visit('/lists/1/kanban')
|
cy.visit('/projects/1/kanban')
|
||||||
|
|
||||||
cy.get('.kanban .bucket .tasks .task')
|
cy.get('.kanban .bucket .tasks .task')
|
||||||
.contains(task.title)
|
.contains(task.title)
|
||||||
|
@ -180,7 +180,7 @@ describe('List View Kanban', () => {
|
||||||
.contains('Move')
|
.contains('Move')
|
||||||
.click()
|
.click()
|
||||||
cy.get('.task-view .content.details .field .multiselect.control .input-wrapper input')
|
cy.get('.task-view .content.details .field .multiselect.control .input-wrapper input')
|
||||||
.type(`${lists[1].title}{enter}`)
|
.type(`${projects[1].title}{enter}`)
|
||||||
// The requests happen with a 200ms timeout. Because of that, the results are not yet there when cypress
|
// The requests happen with a 200ms timeout. Because of that, the results are not yet there when cypress
|
||||||
// presses enter and we can't simulate pressing on enter to select the item.
|
// presses enter and we can't simulate pressing on enter to select the item.
|
||||||
cy.get('.task-view .content.details .field .multiselect.control .search-results')
|
cy.get('.task-view .content.details .field .multiselect.control .search-results')
|
||||||
|
@ -197,26 +197,26 @@ describe('List View Kanban', () => {
|
||||||
|
|
||||||
it('Shows a button to filter the kanban board', () => {
|
it('Shows a button to filter the kanban board', () => {
|
||||||
const data = TaskFactory.create(10, {
|
const data = TaskFactory.create(10, {
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
bucket_id: 1,
|
bucket_id: 1,
|
||||||
})
|
})
|
||||||
cy.visit('/lists/1/kanban')
|
cy.visit('/projects/1/kanban')
|
||||||
|
|
||||||
cy.get('.list-kanban .filter-container .base-button')
|
cy.get('.project-kanban .filter-container .base-button')
|
||||||
.should('exist')
|
.should('exist')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should remove a task from the board when deleting it', () => {
|
it('Should remove a task from the board when deleting it', () => {
|
||||||
const lists = ListFactory.create(1)
|
const projects = ProjectFactory.create(1)
|
||||||
const buckets = BucketFactory.create(2, {
|
const buckets = BucketFactory.create(2, {
|
||||||
list_id: lists[0].id,
|
project_id: projects[0].id,
|
||||||
})
|
})
|
||||||
const tasks = TaskFactory.create(5, {
|
const tasks = TaskFactory.create(5, {
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
bucket_id: buckets[0].id,
|
bucket_id: buckets[0].id,
|
||||||
})
|
})
|
||||||
const task = tasks[0]
|
const task = tasks[0]
|
||||||
cy.visit('/lists/1/kanban')
|
cy.visit('/projects/1/kanban')
|
||||||
|
|
||||||
cy.get('.kanban .bucket .tasks .task')
|
cy.get('.kanban .bucket .tasks .task')
|
||||||
.contains(task.title)
|
.contains(task.title)
|
|
@ -1,32 +1,32 @@
|
||||||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||||
|
|
||||||
import {UserListFactory} from '../../factories/users_list'
|
import {UserProjectFactory} from '../../factories/users_project'
|
||||||
import {TaskFactory} from '../../factories/task'
|
import {TaskFactory} from '../../factories/task'
|
||||||
import {UserFactory} from '../../factories/user'
|
import {UserFactory} from '../../factories/user'
|
||||||
import {ListFactory} from '../../factories/list'
|
import {ProjectFactory} from '../../factories/project'
|
||||||
import {prepareLists} from './prepareLists'
|
import {prepareProjects} from './prepareProjects'
|
||||||
|
|
||||||
describe('List View List', () => {
|
describe('Project View Project', () => {
|
||||||
createFakeUserAndLogin()
|
createFakeUserAndLogin()
|
||||||
prepareLists()
|
prepareProjects()
|
||||||
|
|
||||||
it('Should be an empty list', () => {
|
it('Should be an empty project', () => {
|
||||||
cy.visit('/lists/1')
|
cy.visit('/projects/1')
|
||||||
cy.url()
|
cy.url()
|
||||||
.should('contain', '/lists/1/list')
|
.should('contain', '/projects/1/list')
|
||||||
cy.get('.list-title')
|
cy.get('.project-title')
|
||||||
.should('contain', 'First List')
|
.should('contain', 'First Project')
|
||||||
cy.get('.list-title-dropdown')
|
cy.get('.project-title-dropdown')
|
||||||
.should('exist')
|
.should('exist')
|
||||||
cy.get('p')
|
cy.get('p')
|
||||||
.contains('This list is currently empty.')
|
.contains('This project is currently empty.')
|
||||||
.should('exist')
|
.should('exist')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should create a new task', () => {
|
it('Should create a new task', () => {
|
||||||
const newTaskTitle = 'New task'
|
const newTaskTitle = 'New task'
|
||||||
|
|
||||||
cy.visit('/lists/1')
|
cy.visit('/projects/1')
|
||||||
cy.get('.task-add textarea')
|
cy.get('.task-add textarea')
|
||||||
.type(newTaskTitle+'{enter}')
|
.type(newTaskTitle+'{enter}')
|
||||||
cy.get('.tasks')
|
cy.get('.tasks')
|
||||||
|
@ -36,9 +36,9 @@ describe('List View List', () => {
|
||||||
it('Should navigate to the task when the title is clicked', () => {
|
it('Should navigate to the task when the title is clicked', () => {
|
||||||
const tasks = TaskFactory.create(5, {
|
const tasks = TaskFactory.create(5, {
|
||||||
id: '{increment}',
|
id: '{increment}',
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
})
|
})
|
||||||
cy.visit('/lists/1/list')
|
cy.visit('/projects/1/list')
|
||||||
|
|
||||||
cy.get('.tasks .task .tasktext')
|
cy.get('.tasks .task .tasktext')
|
||||||
.contains(tasks[0].title)
|
.contains(tasks[0].title)
|
||||||
|
@ -49,33 +49,33 @@ describe('List View List', () => {
|
||||||
.should('contain', `/tasks/${tasks[0].id}`)
|
.should('contain', `/tasks/${tasks[0].id}`)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should not see any elements for a list which is shared read only', () => {
|
it('Should not see any elements for a project which is shared read only', () => {
|
||||||
UserFactory.create(2)
|
UserFactory.create(2)
|
||||||
UserListFactory.create(1, {
|
UserProjectFactory.create(1, {
|
||||||
list_id: 2,
|
project_id: 2,
|
||||||
user_id: 1,
|
user_id: 1,
|
||||||
right: 0,
|
right: 0,
|
||||||
})
|
})
|
||||||
const lists = ListFactory.create(2, {
|
const projects = ProjectFactory.create(2, {
|
||||||
owner_id: '{increment}',
|
owner_id: '{increment}',
|
||||||
namespace_id: '{increment}',
|
namespace_id: '{increment}',
|
||||||
})
|
})
|
||||||
cy.visit(`/lists/${lists[1].id}/`)
|
cy.visit(`/projects/${projects[1].id}/`)
|
||||||
|
|
||||||
cy.get('.list-title-wrapper .icon')
|
cy.get('.project-title-wrapper .icon')
|
||||||
.should('not.exist')
|
.should('not.exist')
|
||||||
cy.get('input.input[placeholder="Add a new task..."')
|
cy.get('input.input[placeholder="Add a new task..."')
|
||||||
.should('not.exist')
|
.should('not.exist')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should only show the color of a list in the navigation and not in the list view', () => {
|
it('Should only show the color of a project in the navigation and not in the list view', () => {
|
||||||
const lists = ListFactory.create(1, {
|
const projects = ProjectFactory.create(1, {
|
||||||
hex_color: '00db60',
|
hex_color: '00db60',
|
||||||
})
|
})
|
||||||
TaskFactory.create(10, {
|
TaskFactory.create(10, {
|
||||||
list_id: lists[0].id,
|
project_id: projects[0].id,
|
||||||
})
|
})
|
||||||
cy.visit(`/lists/${lists[0].id}/`)
|
cy.visit(`/projects/${projects[0].id}/`)
|
||||||
|
|
||||||
cy.get('.menu-list li .list-menu-link .color-bubble')
|
cy.get('.menu-list li .list-menu-link .color-bubble')
|
||||||
.should('have.css', 'background-color', 'rgb(0, 219, 96)')
|
.should('have.css', 'background-color', 'rgb(0, 219, 96)')
|
||||||
|
@ -87,9 +87,9 @@ describe('List View List', () => {
|
||||||
const tasks = TaskFactory.create(100, {
|
const tasks = TaskFactory.create(100, {
|
||||||
id: '{increment}',
|
id: '{increment}',
|
||||||
title: i => `task${i}`,
|
title: i => `task${i}`,
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
})
|
})
|
||||||
cy.visit('/lists/1/list')
|
cy.visit('/projects/1/list')
|
||||||
|
|
||||||
cy.get('.tasks')
|
cy.get('.tasks')
|
||||||
.should('contain', tasks[1].title)
|
.should('contain', tasks[1].title)
|
|
@ -2,37 +2,37 @@ import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||||
|
|
||||||
import {TaskFactory} from '../../factories/task'
|
import {TaskFactory} from '../../factories/task'
|
||||||
|
|
||||||
describe('List View Table', () => {
|
describe('Project View Table', () => {
|
||||||
createFakeUserAndLogin()
|
createFakeUserAndLogin()
|
||||||
|
|
||||||
it('Should show a table with tasks', () => {
|
it('Should show a table with tasks', () => {
|
||||||
const tasks = TaskFactory.create(1)
|
const tasks = TaskFactory.create(1)
|
||||||
cy.visit('/lists/1/table')
|
cy.visit('/projects/1/table')
|
||||||
|
|
||||||
cy.get('.list-table table.table')
|
cy.get('.project-table table.table')
|
||||||
.should('exist')
|
.should('exist')
|
||||||
cy.get('.list-table table.table')
|
cy.get('.project-table table.table')
|
||||||
.should('contain', tasks[0].title)
|
.should('contain', tasks[0].title)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should have working column switches', () => {
|
it('Should have working column switches', () => {
|
||||||
TaskFactory.create(1)
|
TaskFactory.create(1)
|
||||||
cy.visit('/lists/1/table')
|
cy.visit('/projects/1/table')
|
||||||
|
|
||||||
cy.get('.list-table .filter-container .items .button')
|
cy.get('.project-table .filter-container .items .button')
|
||||||
.contains('Columns')
|
.contains('Columns')
|
||||||
.click()
|
.click()
|
||||||
cy.get('.list-table .filter-container .card.columns-filter .card-content .fancycheckbox .check')
|
cy.get('.project-table .filter-container .card.columns-filter .card-content .fancycheckbox .check')
|
||||||
.contains('Priority')
|
.contains('Priority')
|
||||||
.click()
|
.click()
|
||||||
cy.get('.list-table .filter-container .card.columns-filter .card-content .fancycheckbox .check')
|
cy.get('.project-table .filter-container .card.columns-filter .card-content .fancycheckbox .check')
|
||||||
.contains('Done')
|
.contains('Done')
|
||||||
.click()
|
.click()
|
||||||
|
|
||||||
cy.get('.list-table table.table th')
|
cy.get('.project-table table.table th')
|
||||||
.contains('Priority')
|
.contains('Priority')
|
||||||
.should('exist')
|
.should('exist')
|
||||||
cy.get('.list-table table.table th')
|
cy.get('.project-table table.table th')
|
||||||
.contains('Done')
|
.contains('Done')
|
||||||
.should('not.exist')
|
.should('not.exist')
|
||||||
})
|
})
|
||||||
|
@ -40,11 +40,11 @@ describe('List View Table', () => {
|
||||||
it('Should navigate to the task when the title is clicked', () => {
|
it('Should navigate to the task when the title is clicked', () => {
|
||||||
const tasks = TaskFactory.create(5, {
|
const tasks = TaskFactory.create(5, {
|
||||||
id: '{increment}',
|
id: '{increment}',
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
})
|
})
|
||||||
cy.visit('/lists/1/table')
|
cy.visit('/projects/1/table')
|
||||||
|
|
||||||
cy.get('.list-table table.table')
|
cy.get('.project-table table.table')
|
||||||
.contains(tasks[0].title)
|
.contains(tasks[0].title)
|
||||||
.click()
|
.click()
|
||||||
|
|
|
@ -1,58 +1,60 @@
|
||||||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||||
|
|
||||||
import {TaskFactory} from '../../factories/task'
|
import {TaskFactory} from '../../factories/task'
|
||||||
import {prepareLists} from './prepareLists'
|
import {prepareProjects} from './prepareProjects'
|
||||||
|
|
||||||
describe('Lists', () => {
|
describe('Projects', () => {
|
||||||
createFakeUserAndLogin()
|
createFakeUserAndLogin()
|
||||||
|
|
||||||
let lists
|
let projects
|
||||||
prepareLists((newLists) => (lists = newLists))
|
prepareProjects((newProjects) => (projects = newProjects))
|
||||||
|
|
||||||
it('Should create a new list', () => {
|
it('Should create a new project', () => {
|
||||||
cy.visit('/')
|
cy.visit('/')
|
||||||
cy.get('.namespace-title .dropdown-trigger')
|
cy.get('.namespace-title .dropdown-trigger')
|
||||||
.click()
|
.click()
|
||||||
cy.get('.namespace-title .dropdown .dropdown-item')
|
cy.get('.namespace-title .dropdown .dropdown-item')
|
||||||
.contains('New list')
|
.contains('New project')
|
||||||
.click()
|
.click()
|
||||||
cy.url()
|
cy.url()
|
||||||
.should('contain', '/lists/new/1')
|
.should('contain', '/projects/new/1')
|
||||||
cy.get('.card-header-title')
|
cy.get('.card-header-title')
|
||||||
.contains('New list')
|
.contains('New project')
|
||||||
cy.get('input.input')
|
cy.get('input.input')
|
||||||
.type('New List')
|
.type('New Project')
|
||||||
cy.get('.button')
|
cy.get('.button')
|
||||||
.contains('Create')
|
.contains('Create')
|
||||||
.click()
|
.click()
|
||||||
|
|
||||||
cy.get('.global-notification', { timeout: 1000 }) // Waiting until the request to create the new list is done
|
cy.get('.global-notification', { timeout: 1000 }) // Waiting until the request to create the new project is done
|
||||||
.should('contain', 'Success')
|
.should('contain', 'Success')
|
||||||
cy.url()
|
cy.url()
|
||||||
.should('contain', '/lists/')
|
.should('contain', '/projects/')
|
||||||
cy.get('.list-title')
|
cy.get('.project-title')
|
||||||
.should('contain', 'New List')
|
.should('contain', 'New Project')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should redirect to a specific list view after visited', () => {
|
it('Should redirect to a specific project view after visited', () => {
|
||||||
cy.visit('/lists/1/kanban')
|
cy.intercept(Cypress.env('API_URL') + '/projects/*/buckets*').as('loadBuckets')
|
||||||
|
cy.visit('/projects/1/kanban')
|
||||||
cy.url()
|
cy.url()
|
||||||
.should('contain', '/lists/1/kanban')
|
.should('contain', '/projects/1/kanban')
|
||||||
cy.visit('/lists/1')
|
cy.wait('@loadBuckets')
|
||||||
|
cy.visit('/projects/1')
|
||||||
cy.url()
|
cy.url()
|
||||||
.should('contain', '/lists/1/kanban')
|
.should('contain', '/projects/1/kanban')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should rename the list in all places', () => {
|
it('Should rename the project in all places', () => {
|
||||||
TaskFactory.create(5, {
|
TaskFactory.create(5, {
|
||||||
id: '{increment}',
|
id: '{increment}',
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
})
|
})
|
||||||
const newListName = 'New list name'
|
const newProjectName = 'New project name'
|
||||||
|
|
||||||
cy.visit('/lists/1')
|
cy.visit('/projects/1')
|
||||||
cy.get('.list-title')
|
cy.get('.project-title')
|
||||||
.should('contain', 'First List')
|
.should('contain', 'First Project')
|
||||||
|
|
||||||
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child .dropdown .menu-list-dropdown-trigger')
|
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child .dropdown .menu-list-dropdown-trigger')
|
||||||
.click()
|
.click()
|
||||||
|
@ -60,27 +62,27 @@ describe('Lists', () => {
|
||||||
.contains('Edit')
|
.contains('Edit')
|
||||||
.click()
|
.click()
|
||||||
cy.get('#title')
|
cy.get('#title')
|
||||||
.type(`{selectall}${newListName}`)
|
.type(`{selectall}${newProjectName}`)
|
||||||
cy.get('footer.card-footer .button')
|
cy.get('footer.card-footer .button')
|
||||||
.contains('Save')
|
.contains('Save')
|
||||||
.click()
|
.click()
|
||||||
|
|
||||||
cy.get('.global-notification')
|
cy.get('.global-notification')
|
||||||
.should('contain', 'Success')
|
.should('contain', 'Success')
|
||||||
cy.get('.list-title')
|
cy.get('.project-title')
|
||||||
.should('contain', newListName)
|
.should('contain', newProjectName)
|
||||||
.should('not.contain', lists[0].title)
|
.should('not.contain', projects[0].title)
|
||||||
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child')
|
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child')
|
||||||
.should('contain', newListName)
|
.should('contain', newProjectName)
|
||||||
.should('not.contain', lists[0].title)
|
.should('not.contain', projects[0].title)
|
||||||
cy.visit('/')
|
cy.visit('/')
|
||||||
cy.get('.card-content')
|
cy.get('.card-content')
|
||||||
.should('contain', newListName)
|
.should('contain', newProjectName)
|
||||||
.should('not.contain', lists[0].title)
|
.should('not.contain', projects[0].title)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should remove a list', () => {
|
it('Should remove a project', () => {
|
||||||
cy.visit(`/lists/${lists[0].id}`)
|
cy.visit(`/projects/${projects[0].id}`)
|
||||||
|
|
||||||
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child .dropdown .menu-list-dropdown-trigger')
|
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child .dropdown .menu-list-dropdown-trigger')
|
||||||
.click()
|
.click()
|
||||||
|
@ -96,27 +98,27 @@ describe('Lists', () => {
|
||||||
cy.get('.global-notification')
|
cy.get('.global-notification')
|
||||||
.should('contain', 'Success')
|
.should('contain', 'Success')
|
||||||
cy.get('.namespace-container .menu.namespaces-lists .menu-list')
|
cy.get('.namespace-container .menu.namespaces-lists .menu-list')
|
||||||
.should('not.contain', lists[0].title)
|
.should('not.contain', projects[0].title)
|
||||||
cy.location('pathname')
|
cy.location('pathname')
|
||||||
.should('equal', '/')
|
.should('equal', '/')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should archive a list', () => {
|
it('Should archive a project', () => {
|
||||||
cy.visit(`/lists/${lists[0].id}`)
|
cy.visit(`/projects/${projects[0].id}`)
|
||||||
|
|
||||||
cy.get('.list-title-dropdown')
|
cy.get('.project-title-dropdown')
|
||||||
.click()
|
.click()
|
||||||
cy.get('.list-title-dropdown .dropdown-menu .dropdown-item')
|
cy.get('.project-title-dropdown .dropdown-menu .dropdown-item')
|
||||||
.contains('Archive')
|
.contains('Archive')
|
||||||
.click()
|
.click()
|
||||||
cy.get('.modal-content')
|
cy.get('.modal-content')
|
||||||
.should('contain.text', 'Archive this list')
|
.should('contain.text', 'Archive this project')
|
||||||
cy.get('.modal-content [data-cy=modalPrimary]')
|
cy.get('.modal-content [data-cy=modalPrimary]')
|
||||||
.click()
|
.click()
|
||||||
|
|
||||||
cy.get('.namespace-container .menu.namespaces-lists .menu-list')
|
cy.get('.namespace-container .menu.namespaces-lists .menu-list')
|
||||||
.should('not.contain', lists[0].title)
|
.should('not.contain', projects[0].title)
|
||||||
cy.get('main.app-content')
|
cy.get('main.app-content')
|
||||||
.should('contain.text', 'This list is archived. It is not possible to create new or edit tasks for it.')
|
.should('contain.text', 'This project is archived. It is not possible to create new or edit tasks for it.')
|
||||||
})
|
})
|
||||||
})
|
})
|
|
@ -1,22 +1,22 @@
|
||||||
import {LinkShareFactory} from '../../factories/link_sharing'
|
import {LinkShareFactory} from '../../factories/link_sharing'
|
||||||
import {ListFactory} from '../../factories/list'
|
import {ProjectFactory} from '../../factories/project'
|
||||||
import {TaskFactory} from '../../factories/task'
|
import {TaskFactory} from '../../factories/task'
|
||||||
|
|
||||||
describe('Link shares', () => {
|
describe('Link shares', () => {
|
||||||
it('Can view a link share', () => {
|
it('Can view a link share', () => {
|
||||||
const lists = ListFactory.create(1)
|
const projects = ProjectFactory.create(1)
|
||||||
const tasks = TaskFactory.create(10, {
|
const tasks = TaskFactory.create(10, {
|
||||||
list_id: lists[0].id
|
project_id: projects[0].id
|
||||||
})
|
})
|
||||||
const linkShares = LinkShareFactory.create(1, {
|
const linkShares = LinkShareFactory.create(1, {
|
||||||
list_id: lists[0].id,
|
project_id: projects[0].id,
|
||||||
right: 0,
|
right: 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
cy.visit(`/share/${linkShares[0].hash}/auth`)
|
cy.visit(`/share/${linkShares[0].hash}/auth`)
|
||||||
|
|
||||||
cy.get('h1.title')
|
cy.get('h1.title')
|
||||||
.should('contain', lists[0].title)
|
.should('contain', projects[0].title)
|
||||||
cy.get('input.input[placeholder="Add a new task..."')
|
cy.get('input.input[placeholder="Add a new task..."')
|
||||||
.should('not.exist')
|
.should('not.exist')
|
||||||
cy.get('.tasks')
|
cy.get('.tasks')
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||||
|
|
||||||
import {ListFactory} from '../../factories/list'
|
import {ProjectFactory} from '../../factories/project'
|
||||||
import {seed} from '../../support/seed'
|
import {seed} from '../../support/seed'
|
||||||
import {TaskFactory} from '../../factories/task'
|
import {TaskFactory} from '../../factories/task'
|
||||||
import {NamespaceFactory} from '../../factories/namespace'
|
import {NamespaceFactory} from '../../factories/namespace'
|
||||||
|
@ -9,9 +9,9 @@ import {updateUserSettings} from '../../support/updateUserSettings'
|
||||||
|
|
||||||
function seedTasks(numberOfTasks = 50, startDueDate = new Date()) {
|
function seedTasks(numberOfTasks = 50, startDueDate = new Date()) {
|
||||||
NamespaceFactory.create(1)
|
NamespaceFactory.create(1)
|
||||||
const list = ListFactory.create()[0]
|
const project = ProjectFactory.create()[0]
|
||||||
BucketFactory.create(1, {
|
BucketFactory.create(1, {
|
||||||
list_id: list.id,
|
project_id: project.id,
|
||||||
})
|
})
|
||||||
const tasks = []
|
const tasks = []
|
||||||
let dueDate = startDueDate
|
let dueDate = startDueDate
|
||||||
|
@ -20,7 +20,7 @@ function seedTasks(numberOfTasks = 50, startDueDate = new Date()) {
|
||||||
dueDate = new Date(new Date(dueDate).setDate(dueDate.getDate() + 2))
|
dueDate = new Date(new Date(dueDate).setDate(dueDate.getDate() + 2))
|
||||||
tasks.push({
|
tasks.push({
|
||||||
id: i + 1,
|
id: i + 1,
|
||||||
list_id: list.id,
|
project_id: project.id,
|
||||||
done: false,
|
done: false,
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
title: 'Test Task ' + i,
|
title: 'Test Task ' + i,
|
||||||
|
@ -31,7 +31,7 @@ function seedTasks(numberOfTasks = 50, startDueDate = new Date()) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
seed(TaskFactory.table, tasks)
|
seed(TaskFactory.table, tasks)
|
||||||
return {tasks, list}
|
return {tasks, project}
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('Home Page Task Overview', () => {
|
describe('Home Page Task Overview', () => {
|
||||||
|
@ -73,7 +73,7 @@ describe('Home Page Task Overview', () => {
|
||||||
due_date: new Date().toISOString(),
|
due_date: new Date().toISOString(),
|
||||||
}, false)
|
}, false)
|
||||||
|
|
||||||
cy.visit(`/lists/${tasks[0].list_id}/list`)
|
cy.visit(`/projects/${tasks[0].project_id}/list`)
|
||||||
cy.get('.tasks .task')
|
cy.get('.tasks .task')
|
||||||
.first()
|
.first()
|
||||||
.should('contain.text', newTaskTitle)
|
.should('contain.text', newTaskTitle)
|
||||||
|
@ -90,7 +90,7 @@ describe('Home Page Task Overview', () => {
|
||||||
|
|
||||||
cy.visit('/')
|
cy.visit('/')
|
||||||
|
|
||||||
cy.visit(`/lists/${tasks[0].list_id}/list`)
|
cy.visit(`/projects/${tasks[0].project_id}/list`)
|
||||||
cy.get('.task-add textarea')
|
cy.get('.task-add textarea')
|
||||||
.type(newTaskTitle+'{enter}')
|
.type(newTaskTitle+'{enter}')
|
||||||
cy.visit('/')
|
cy.visit('/')
|
||||||
|
@ -113,10 +113,10 @@ describe('Home Page Task Overview', () => {
|
||||||
.should('contain.text', newTaskTitle)
|
.should('contain.text', newTaskTitle)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should show a task without a due date added via default list at the bottom', () => {
|
it('Should show a task without a due date added via default project at the bottom', () => {
|
||||||
const {list} = seedTasks(40)
|
const {project} = seedTasks(40)
|
||||||
updateUserSettings({
|
updateUserSettings({
|
||||||
default_list_id: list.id,
|
default_project_id: project.id,
|
||||||
overdue_tasks_reminders_time: '9:00',
|
overdue_tasks_reminders_time: '9:00',
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -131,23 +131,23 @@ describe('Home Page Task Overview', () => {
|
||||||
.should('contain.text', newTaskTitle)
|
.should('contain.text', newTaskTitle)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should show the cta buttons for new list when there are no tasks', () => {
|
it('Should show the cta buttons for new project when there are no tasks', () => {
|
||||||
TaskFactory.truncate()
|
TaskFactory.truncate()
|
||||||
|
|
||||||
cy.visit('/')
|
cy.visit('/')
|
||||||
|
|
||||||
cy.get('.home.app-content .content')
|
cy.get('.home.app-content .content')
|
||||||
.should('contain.text', 'You can create a new list for your new tasks:')
|
.should('contain.text', 'You can create a new project for your new tasks:')
|
||||||
.should('contain.text', 'Or import your lists and tasks from other services into Vikunja:')
|
.should('contain.text', 'Or import your projects and tasks from other services into Vikunja:')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should not show the cta buttons for new list when there are tasks', () => {
|
it('Should not show the cta buttons for new project when there are tasks', () => {
|
||||||
seedTasks()
|
seedTasks()
|
||||||
|
|
||||||
cy.visit('/')
|
cy.visit('/')
|
||||||
|
|
||||||
cy.get('.home.app-content .content')
|
cy.get('.home.app-content .content')
|
||||||
.should('not.contain.text', 'You can create a new list for your new tasks:')
|
.should('not.contain.text', 'You can create a new project for your new tasks:')
|
||||||
.should('not.contain.text', 'Or import your lists and tasks from other services into Vikunja:')
|
.should('not.contain.text', 'Or import your projects and tasks from other services into Vikunja:')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||||
|
|
||||||
import {TaskFactory} from '../../factories/task'
|
import {TaskFactory} from '../../factories/task'
|
||||||
import {ListFactory} from '../../factories/list'
|
import {ProjectFactory} from '../../factories/project'
|
||||||
import {TaskCommentFactory} from '../../factories/task_comment'
|
import {TaskCommentFactory} from '../../factories/task_comment'
|
||||||
import {UserFactory} from '../../factories/user'
|
import {UserFactory} from '../../factories/user'
|
||||||
import {NamespaceFactory} from '../../factories/namespace'
|
import {NamespaceFactory} from '../../factories/namespace'
|
||||||
import {UserListFactory} from '../../factories/users_list'
|
import {UserProjectFactory} from '../../factories/users_project'
|
||||||
import {TaskAssigneeFactory} from '../../factories/task_assignee'
|
import {TaskAssigneeFactory} from '../../factories/task_assignee'
|
||||||
import {LabelFactory} from '../../factories/labels'
|
import {LabelFactory} from '../../factories/labels'
|
||||||
import {LabelTaskFactory} from '../../factories/label_task'
|
import {LabelTaskFactory} from '../../factories/label_task'
|
||||||
|
@ -48,22 +48,22 @@ describe('Task', () => {
|
||||||
createFakeUserAndLogin()
|
createFakeUserAndLogin()
|
||||||
|
|
||||||
let namespaces
|
let namespaces
|
||||||
let lists
|
let projects
|
||||||
let buckets
|
let buckets
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
// UserFactory.create(1)
|
// UserFactory.create(1)
|
||||||
namespaces = NamespaceFactory.create(1)
|
namespaces = NamespaceFactory.create(1)
|
||||||
lists = ListFactory.create(1)
|
projects = ProjectFactory.create(1)
|
||||||
buckets = BucketFactory.create(1, {
|
buckets = BucketFactory.create(1, {
|
||||||
list_id: lists[0].id,
|
project_id: projects[0].id,
|
||||||
})
|
})
|
||||||
TaskFactory.truncate()
|
TaskFactory.truncate()
|
||||||
UserListFactory.truncate()
|
UserProjectFactory.truncate()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should be created new', () => {
|
it('Should be created new', () => {
|
||||||
cy.visit('/lists/1/list')
|
cy.visit('/projects/1/list')
|
||||||
cy.get('.input[placeholder="Add a new task…"')
|
cy.get('.input[placeholder="Add a new task…"')
|
||||||
.type('New Task')
|
.type('New Task')
|
||||||
cy.get('.button')
|
cy.get('.button')
|
||||||
|
@ -74,11 +74,11 @@ describe('Task', () => {
|
||||||
.should('contain', 'New Task')
|
.should('contain', 'New Task')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Inserts new tasks at the top of the list', () => {
|
it('Inserts new tasks at the top of the project', () => {
|
||||||
TaskFactory.create(1)
|
TaskFactory.create(1)
|
||||||
|
|
||||||
cy.visit('/lists/1/list')
|
cy.visit('/projects/1/list')
|
||||||
cy.get('.list-is-empty-notice')
|
cy.get('.project-is-empty-notice')
|
||||||
.should('not.exist')
|
.should('not.exist')
|
||||||
cy.get('.input[placeholder="Add a new task…"')
|
cy.get('.input[placeholder="Add a new task…"')
|
||||||
.type('New Task')
|
.type('New Task')
|
||||||
|
@ -95,7 +95,7 @@ describe('Task', () => {
|
||||||
it('Marks a task as done', () => {
|
it('Marks a task as done', () => {
|
||||||
TaskFactory.create(1)
|
TaskFactory.create(1)
|
||||||
|
|
||||||
cy.visit('/lists/1/list')
|
cy.visit('/projects/1/list')
|
||||||
cy.get('.tasks .task .fancycheckbox label.check')
|
cy.get('.tasks .task .fancycheckbox label.check')
|
||||||
.first()
|
.first()
|
||||||
.click()
|
.click()
|
||||||
|
@ -106,7 +106,7 @@ describe('Task', () => {
|
||||||
it('Can add a task to favorites', () => {
|
it('Can add a task to favorites', () => {
|
||||||
TaskFactory.create(1)
|
TaskFactory.create(1)
|
||||||
|
|
||||||
cy.visit('/lists/1/list')
|
cy.visit('/projects/1/list')
|
||||||
cy.get('.tasks .task .favorite')
|
cy.get('.tasks .task .favorite')
|
||||||
.first()
|
.first()
|
||||||
.click()
|
.click()
|
||||||
|
@ -134,7 +134,7 @@ describe('Task', () => {
|
||||||
.should('contain', '#1')
|
.should('contain', '#1')
|
||||||
cy.get('.task-view h6.subtitle')
|
cy.get('.task-view h6.subtitle')
|
||||||
.should('contain', namespaces[0].title)
|
.should('contain', namespaces[0].title)
|
||||||
.should('contain', lists[0].title)
|
.should('contain', projects[0].title)
|
||||||
cy.get('.task-view .details.content.description')
|
cy.get('.task-view .details.content.description')
|
||||||
.should('contain', tasks[0].description)
|
.should('contain', tasks[0].description)
|
||||||
cy.get('.task-view .action-buttons p.created')
|
cy.get('.task-view .action-buttons p.created')
|
||||||
|
@ -179,21 +179,21 @@ describe('Task', () => {
|
||||||
.should('contain', 'Mark as undone')
|
.should('contain', 'Mark as undone')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Shows a task identifier since the list has one', () => {
|
it('Shows a task identifier since the project has one', () => {
|
||||||
const lists = ListFactory.create(1, {
|
const projects = ProjectFactory.create(1, {
|
||||||
id: 1,
|
id: 1,
|
||||||
identifier: 'TEST',
|
identifier: 'TEST',
|
||||||
})
|
})
|
||||||
const tasks = TaskFactory.create(1, {
|
const tasks = TaskFactory.create(1, {
|
||||||
id: 1,
|
id: 1,
|
||||||
list_id: lists[0].id,
|
project_id: projects[0].id,
|
||||||
index: 1,
|
index: 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
cy.visit(`/tasks/${tasks[0].id}`)
|
cy.visit(`/tasks/${tasks[0].id}`)
|
||||||
|
|
||||||
cy.get('.task-view h1.title.task-id')
|
cy.get('.task-view h1.title.task-id')
|
||||||
.should('contain', `${lists[0].identifier}-${tasks[0].index}`)
|
.should('contain', `${projects[0].identifier}-${tasks[0].index}`)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Can edit the description', () => {
|
it('Can edit the description', () => {
|
||||||
|
@ -236,14 +236,14 @@ describe('Task', () => {
|
||||||
.should('contain', 'Success')
|
.should('contain', 'Success')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Can move a task to another list', () => {
|
it('Can move a task to another project', () => {
|
||||||
const lists = ListFactory.create(2)
|
const projects = ProjectFactory.create(2)
|
||||||
BucketFactory.create(2, {
|
BucketFactory.create(2, {
|
||||||
list_id: '{increment}'
|
project_id: '{increment}'
|
||||||
})
|
})
|
||||||
const tasks = TaskFactory.create(1, {
|
const tasks = TaskFactory.create(1, {
|
||||||
id: 1,
|
id: 1,
|
||||||
list_id: lists[0].id,
|
project_id: projects[0].id,
|
||||||
})
|
})
|
||||||
cy.visit(`/tasks/${tasks[0].id}`)
|
cy.visit(`/tasks/${tasks[0].id}`)
|
||||||
|
|
||||||
|
@ -251,7 +251,7 @@ describe('Task', () => {
|
||||||
.contains('Move')
|
.contains('Move')
|
||||||
.click()
|
.click()
|
||||||
cy.get('.task-view .content.details .field .multiselect.control .input-wrapper input')
|
cy.get('.task-view .content.details .field .multiselect.control .input-wrapper input')
|
||||||
.type(`${lists[1].title}{enter}`)
|
.type(`${projects[1].title}{enter}`)
|
||||||
// The requests happen with a 200ms timeout. Because of that, the results are not yet there when cypress
|
// The requests happen with a 200ms timeout. Because of that, the results are not yet there when cypress
|
||||||
// presses enter and we can't simulate pressing on enter to select the item.
|
// presses enter and we can't simulate pressing on enter to select the item.
|
||||||
cy.get('.task-view .content.details .field .multiselect.control .search-results')
|
cy.get('.task-view .content.details .field .multiselect.control .search-results')
|
||||||
|
@ -261,7 +261,7 @@ describe('Task', () => {
|
||||||
|
|
||||||
cy.get('.task-view h6.subtitle')
|
cy.get('.task-view h6.subtitle')
|
||||||
.should('contain', namespaces[0].title)
|
.should('contain', namespaces[0].title)
|
||||||
.should('contain', lists[1].title)
|
.should('contain', projects[1].title)
|
||||||
cy.get('.global-notification')
|
cy.get('.global-notification')
|
||||||
.should('contain', 'Success')
|
.should('contain', 'Success')
|
||||||
})
|
})
|
||||||
|
@ -269,7 +269,7 @@ describe('Task', () => {
|
||||||
it('Can delete a task', () => {
|
it('Can delete a task', () => {
|
||||||
const tasks = TaskFactory.create(1, {
|
const tasks = TaskFactory.create(1, {
|
||||||
id: 1,
|
id: 1,
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
})
|
})
|
||||||
cy.visit(`/tasks/${tasks[0].id}`)
|
cy.visit(`/tasks/${tasks[0].id}`)
|
||||||
|
|
||||||
|
@ -286,17 +286,17 @@ describe('Task', () => {
|
||||||
cy.get('.global-notification')
|
cy.get('.global-notification')
|
||||||
.should('contain', 'Success')
|
.should('contain', 'Success')
|
||||||
cy.url()
|
cy.url()
|
||||||
.should('contain', `/lists/${tasks[0].list_id}/`)
|
.should('contain', `/projects/${tasks[0].project_id}/`)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Can add an assignee to a task', () => {
|
it('Can add an assignee to a task', () => {
|
||||||
const users = UserFactory.create(5)
|
const users = UserFactory.create(5)
|
||||||
const tasks = TaskFactory.create(1, {
|
const tasks = TaskFactory.create(1, {
|
||||||
id: 1,
|
id: 1,
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
})
|
})
|
||||||
UserListFactory.create(5, {
|
UserProjectFactory.create(5, {
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
user_id: '{increment}',
|
user_id: '{increment}',
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -321,10 +321,10 @@ describe('Task', () => {
|
||||||
const users = UserFactory.create(2)
|
const users = UserFactory.create(2)
|
||||||
const tasks = TaskFactory.create(1, {
|
const tasks = TaskFactory.create(1, {
|
||||||
id: 1,
|
id: 1,
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
})
|
})
|
||||||
UserListFactory.create(5, {
|
UserProjectFactory.create(5, {
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
user_id: '{increment}',
|
user_id: '{increment}',
|
||||||
})
|
})
|
||||||
TaskAssigneeFactory.create(1, {
|
TaskAssigneeFactory.create(1, {
|
||||||
|
@ -347,7 +347,7 @@ describe('Task', () => {
|
||||||
it('Can add a new label to a task', () => {
|
it('Can add a new label to a task', () => {
|
||||||
const tasks = TaskFactory.create(1, {
|
const tasks = TaskFactory.create(1, {
|
||||||
id: 1,
|
id: 1,
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
})
|
})
|
||||||
LabelFactory.truncate()
|
LabelFactory.truncate()
|
||||||
const newLabelText = 'some new label'
|
const newLabelText = 'some new label'
|
||||||
|
@ -375,7 +375,7 @@ describe('Task', () => {
|
||||||
it('Can add an existing label to a task', () => {
|
it('Can add an existing label to a task', () => {
|
||||||
const tasks = TaskFactory.create(1, {
|
const tasks = TaskFactory.create(1, {
|
||||||
id: 1,
|
id: 1,
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
})
|
})
|
||||||
const labels = LabelFactory.create(1)
|
const labels = LabelFactory.create(1)
|
||||||
LabelTaskFactory.truncate()
|
LabelTaskFactory.truncate()
|
||||||
|
@ -388,13 +388,13 @@ describe('Task', () => {
|
||||||
it('Can add a label to a task and it shows up on the kanban board afterwards', () => {
|
it('Can add a label to a task and it shows up on the kanban board afterwards', () => {
|
||||||
const tasks = TaskFactory.create(1, {
|
const tasks = TaskFactory.create(1, {
|
||||||
id: 1,
|
id: 1,
|
||||||
list_id: lists[0].id,
|
project_id: projects[0].id,
|
||||||
bucket_id: buckets[0].id,
|
bucket_id: buckets[0].id,
|
||||||
})
|
})
|
||||||
const labels = LabelFactory.create(1)
|
const labels = LabelFactory.create(1)
|
||||||
LabelTaskFactory.truncate()
|
LabelTaskFactory.truncate()
|
||||||
|
|
||||||
cy.visit(`/lists/${lists[0].id}/kanban`)
|
cy.visit(`/projects/${projects[0].id}/kanban`)
|
||||||
|
|
||||||
cy.get('.bucket .task')
|
cy.get('.bucket .task')
|
||||||
.contains(tasks[0].title)
|
.contains(tasks[0].title)
|
||||||
|
@ -412,7 +412,7 @@ describe('Task', () => {
|
||||||
it('Can remove a label from a task', () => {
|
it('Can remove a label from a task', () => {
|
||||||
const tasks = TaskFactory.create(1, {
|
const tasks = TaskFactory.create(1, {
|
||||||
id: 1,
|
id: 1,
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
})
|
})
|
||||||
const labels = LabelFactory.create(1)
|
const labels = LabelFactory.create(1)
|
||||||
LabelTaskFactory.create(1, {
|
LabelTaskFactory.create(1, {
|
||||||
|
@ -527,13 +527,13 @@ describe('Task', () => {
|
||||||
TaskAttachmentFactory.truncate()
|
TaskAttachmentFactory.truncate()
|
||||||
const tasks = TaskFactory.create(1, {
|
const tasks = TaskFactory.create(1, {
|
||||||
id: 1,
|
id: 1,
|
||||||
list_id: lists[0].id,
|
project_id: projects[0].id,
|
||||||
bucket_id: buckets[0].id,
|
bucket_id: buckets[0].id,
|
||||||
})
|
})
|
||||||
const labels = LabelFactory.create(1)
|
const labels = LabelFactory.create(1)
|
||||||
LabelTaskFactory.truncate()
|
LabelTaskFactory.truncate()
|
||||||
|
|
||||||
cy.visit(`/lists/${lists[0].id}/kanban`)
|
cy.visit(`/projects/${projects[0].id}/kanban`)
|
||||||
|
|
||||||
cy.get('.bucket .task')
|
cy.get('.bucket .task')
|
||||||
.contains(tasks[0].title)
|
.contains(tasks[0].title)
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
"isolatedModules": false,
|
"isolatedModules": false,
|
||||||
"target": "ES2015",
|
"target": "ES2015",
|
||||||
"lib": ["ESNext", "dom"],
|
"lib": ["ESNext", "dom"],
|
||||||
"types": ["cypress"]
|
"types": ["cypress"],
|
||||||
|
"ignoreDeprecations": "5.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
import {UserFactory} from '../../factories/user'
|
import {UserFactory} from '../../factories/user'
|
||||||
|
|
||||||
const testAndAssertFailed = fixture => {
|
const testAndAssertFailed = fixture => {
|
||||||
|
cy.intercept(Cypress.env('API_URL') + '/login*').as('login')
|
||||||
|
|
||||||
cy.visit('/login')
|
cy.visit('/login')
|
||||||
cy.get('input[id=username]').type(fixture.username)
|
cy.get('input[id=username]').type(fixture.username)
|
||||||
cy.get('input[id=password]').type(fixture.password)
|
cy.get('input[id=password]').type(fixture.password)
|
||||||
cy.get('.button').contains('Login').click()
|
cy.get('.button').contains('Login').click()
|
||||||
|
|
||||||
cy.wait(5000) // It can take waaaayy too long to log the user in
|
cy.wait('@login')
|
||||||
cy.url().should('include', '/')
|
cy.url().should('include', '/')
|
||||||
cy.get('div.message.danger').contains('Wrong username or password.')
|
cy.get('div.message.danger').contains('Wrong username or password.')
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||||
import {createLists} from '../list/prepareLists'
|
import {createProjects} from '../project/prepareProjects'
|
||||||
|
|
||||||
function logout() {
|
function logout() {
|
||||||
cy.get('.navbar .username-dropdown-trigger')
|
cy.get('.navbar .username-dropdown-trigger')
|
||||||
|
@ -26,21 +26,21 @@ describe('Log out', () => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
it.skip('Should clear the list history after logging the user out', () => {
|
it.skip('Should clear the project history after logging the user out', () => {
|
||||||
const lists = createLists()
|
const projects = createProjects()
|
||||||
cy.visit(`/lists/${lists[0].id}`)
|
cy.visit(`/projects/${projects[0].id}`)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
expect(localStorage.getItem('listHistory')).to.not.eq(null)
|
expect(localStorage.getItem('projectHistory')).to.not.eq(null)
|
||||||
})
|
})
|
||||||
|
|
||||||
logout()
|
logout()
|
||||||
|
|
||||||
cy.wait(1000) // This makes re-loading of the list and associated entities (and the resulting error) visible
|
cy.wait(1000) // This makes re-loading of the project and associated entities (and the resulting error) visible
|
||||||
|
|
||||||
cy.url()
|
cy.url()
|
||||||
.should('contain', '/login')
|
.should('contain', '/login')
|
||||||
.then(() => {
|
.then(() => {
|
||||||
expect(localStorage.getItem('listHistory')).to.eq(null)
|
expect(localStorage.getItem('projectHistory')).to.eq(null)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -10,7 +10,7 @@ export class BucketFactory extends Factory {
|
||||||
return {
|
return {
|
||||||
id: '{increment}',
|
id: '{increment}',
|
||||||
title: faker.lorem.words(3),
|
title: faker.lorem.words(3),
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
created: now.toISOString(),
|
created: now.toISOString(),
|
||||||
updated: now.toISOString(),
|
updated: now.toISOString(),
|
||||||
|
|
|
@ -10,7 +10,7 @@ export class LinkShareFactory extends Factory {
|
||||||
return {
|
return {
|
||||||
id: '{increment}',
|
id: '{increment}',
|
||||||
hash: faker.random.word(32),
|
hash: faker.random.word(32),
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
right: 0,
|
right: 0,
|
||||||
sharing_type: 0,
|
sharing_type: 0,
|
||||||
shared_by_id: 1,
|
shared_by_id: 1,
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import {Factory} from '../support/factory'
|
import {Factory} from '../support/factory'
|
||||||
import {faker} from '@faker-js/faker'
|
import {faker} from '@faker-js/faker'
|
||||||
|
|
||||||
export class ListFactory extends Factory {
|
export class ProjectFactory extends Factory {
|
||||||
static table = 'lists'
|
static table = 'projects'
|
||||||
|
|
||||||
static factory() {
|
static factory() {
|
||||||
const now = new Date()
|
const now = new Date()
|
|
@ -11,7 +11,7 @@ export class TaskFactory extends Factory {
|
||||||
id: '{increment}',
|
id: '{increment}',
|
||||||
title: faker.lorem.words(3),
|
title: faker.lorem.words(3),
|
||||||
done: false,
|
done: false,
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
index: '{increment}',
|
index: '{increment}',
|
||||||
position: '{increment}',
|
position: '{increment}',
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
import {Factory} from '../support/factory'
|
import {Factory} from '../support/factory'
|
||||||
|
|
||||||
export class UserListFactory extends Factory {
|
export class UserProjectFactory extends Factory {
|
||||||
static table = 'users_lists'
|
static table = 'users_projects'
|
||||||
|
|
||||||
static factory() {
|
static factory() {
|
||||||
const now = new Date()
|
const now = new Date()
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: '{increment}',
|
id: '{increment}',
|
||||||
list_id: 1,
|
project_id: 1,
|
||||||
user_id: 1,
|
user_id: 1,
|
||||||
right: 0,
|
right: 0,
|
||||||
created: now.toISOString(),
|
created: now.toISOString(),
|
|
@ -30,21 +30,21 @@ A basic service can look like this:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
import ListModel from '../models/list'
|
import ProjectModel from '../models/project'
|
||||||
|
|
||||||
export default class ListService extends AbstractService {
|
export default class ProjectService extends AbstractService {
|
||||||
constructor() {
|
constructor() {
|
||||||
super({
|
super({
|
||||||
getAll: '/lists',
|
getAll: '/projects',
|
||||||
get: '/lists/{id}',
|
get: '/projects/{id}',
|
||||||
create: '/namespaces/{namespaceID}/lists',
|
create: '/namespaces/{namespaceID}/projects',
|
||||||
update: '/lists/{id}',
|
update: '/projects/{id}',
|
||||||
delete: '/lists/{id}',
|
delete: '/projects/{id}',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
modelFactory(data) {
|
modelFactory(data) {
|
||||||
return new ListModel(data)
|
return new ProjectModel(data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -132,7 +132,7 @@ import AbstractModel from './abstractModel'
|
||||||
import TaskModel from './task'
|
import TaskModel from './task'
|
||||||
import UserModel from './user'
|
import UserModel from './user'
|
||||||
|
|
||||||
export default class ListModel extends AbstractModel {
|
export default class ProjectModel extends AbstractModel {
|
||||||
|
|
||||||
constructor(data) {
|
constructor(data) {
|
||||||
// The constructor of AbstractModel handles all the default parsing.
|
// The constructor of AbstractModel handles all the default parsing.
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
echo -n 'name = "'
|
||||||
|
# Get the contents of the `<title>` element of `index.html`
|
||||||
|
grep -oP "(?<=<title>).*?(?=</title>)" index.html | tr -d '\n' \
|
||||||
|
&& echo '"' \
|
||||||
|
&& echo -n 'source_code_url = "https://github.com/WofWca/vikunja-frontend"'
|
|
@ -28,7 +28,7 @@ export default defineConfig({
|
||||||
// light: './img/light.png',
|
// light: './img/light.png',
|
||||||
// dark: './img/dark.png',
|
// dark: './img/dark.png',
|
||||||
// },
|
// },
|
||||||
// logoHref: 'https://acme.com',
|
logoHref: 'https://vikunja.io',
|
||||||
// favicon: './favicon.ico',
|
// favicon: './favicon.ico',
|
||||||
},
|
},
|
||||||
})
|
})
|
|
@ -16,6 +16,7 @@
|
||||||
<strong>We're sorry but Vikunja doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
<strong>We're sorry but Vikunja doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
||||||
</noscript>
|
</noscript>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
|
<!--WEBXDC_SCRIPT_PLACEHOLDER-->
|
||||||
<script type="module" src="/src/main.ts"></script>
|
<script type="module" src="/src/main.ts"></script>
|
||||||
<script>
|
<script>
|
||||||
//
|
//
|
||||||
|
|
Binary file not shown.
Binary file not shown.
88
package.json
88
package.json
|
@ -13,7 +13,7 @@
|
||||||
},
|
},
|
||||||
"homepage": "https://vikunja.io/",
|
"homepage": "https://vikunja.io/",
|
||||||
"funding": "https://opencollective.com/vikunja",
|
"funding": "https://opencollective.com/vikunja",
|
||||||
"packageManager": "pnpm@7.28.0",
|
"packageManager": "pnpm@7.30.5",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"todo",
|
"todo",
|
||||||
"productivity",
|
"productivity",
|
||||||
|
@ -27,6 +27,8 @@
|
||||||
"preview": "vite preview --port 4173",
|
"preview": "vite preview --port 4173",
|
||||||
"preview:dev": "vite preview --outDir dist-dev --mode development --port 4173",
|
"preview:dev": "vite preview --outDir dist-dev --mode development --port 4173",
|
||||||
"build": "vite build && workbox copyLibraries dist/",
|
"build": "vite build && workbox copyLibraries dist/",
|
||||||
|
"build-webxdc": "pnpm run build && pnpm run pack-webxdc",
|
||||||
|
"pack-webxdc": "./generate-webxdc-manifest.sh > dist/manifest.toml && cd dist && cp images/icons/icon-maskable.png icon.png && ../create-xdc.sh vikunja.xdc",
|
||||||
"build:modern-only": "BUILD_MODERN_ONLY=true vite build && workbox copyLibraries dist/",
|
"build:modern-only": "BUILD_MODERN_ONLY=true vite build && workbox copyLibraries dist/",
|
||||||
"build:dev": "vite build --mode development --outDir dist-dev/",
|
"build:dev": "vite build --mode development --outDir dist-dev/",
|
||||||
"lint": "eslint --ignore-pattern '*.test.*' ./src --ext .vue,.js,.ts",
|
"lint": "eslint --ignore-pattern '*.test.*' ./src --ext .vue,.js,.ts",
|
||||||
|
@ -45,19 +47,19 @@
|
||||||
"story:preview": "histoire preview"
|
"story:preview": "histoire preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-svg-core": "6.3.0",
|
"@fortawesome/fontawesome-svg-core": "6.4.0",
|
||||||
"@fortawesome/free-regular-svg-icons": "6.3.0",
|
"@fortawesome/free-regular-svg-icons": "6.4.0",
|
||||||
"@fortawesome/free-solid-svg-icons": "6.3.0",
|
"@fortawesome/free-solid-svg-icons": "6.4.0",
|
||||||
"@fortawesome/vue-fontawesome": "3.0.3",
|
"@fortawesome/vue-fontawesome": "3.0.3",
|
||||||
"@github/hotkey": "2.0.1",
|
"@github/hotkey": "2.0.1",
|
||||||
"@infectoone/vue-ganttastic": "2.1.4",
|
"@infectoone/vue-ganttastic": "2.1.4",
|
||||||
"@intlify/unplugin-vue-i18n": "0.8.2",
|
"@intlify/unplugin-vue-i18n": "0.10.0",
|
||||||
"@kyvg/vue3-notification": "2.9.0",
|
"@kyvg/vue3-notification": "2.9.0",
|
||||||
"@sentry/tracing": "7.39.0",
|
"@sentry/tracing": "7.45.0",
|
||||||
"@sentry/vue": "7.39.0",
|
"@sentry/vue": "7.45.0",
|
||||||
"@types/is-touch-device": "1.0.0",
|
"@types/is-touch-device": "1.0.0",
|
||||||
"@types/lodash.clonedeep": "4.5.7",
|
"@types/lodash.clonedeep": "4.5.7",
|
||||||
"@types/sortablejs": "1.15.0",
|
"@types/sortablejs": "1.15.1",
|
||||||
"@vueuse/core": "9.13.0",
|
"@vueuse/core": "9.13.0",
|
||||||
"axios": "1.3.4",
|
"axios": "1.3.4",
|
||||||
"blurhash": "2.0.5",
|
"blurhash": "2.0.5",
|
||||||
|
@ -66,81 +68,89 @@
|
||||||
"codemirror": "5.65.12",
|
"codemirror": "5.65.12",
|
||||||
"date-fns": "2.29.3",
|
"date-fns": "2.29.3",
|
||||||
"dayjs": "1.11.7",
|
"dayjs": "1.11.7",
|
||||||
"dompurify": "3.0.0",
|
"dompurify": "3.0.1",
|
||||||
"easymde": "2.18.0",
|
"easymde": "2.18.0",
|
||||||
"fast-deep-equal": "3.1.3",
|
"fast-deep-equal": "3.1.3",
|
||||||
"flatpickr": "4.6.13",
|
"flatpickr": "4.6.13",
|
||||||
"flexsearch": "0.7.21",
|
"flexsearch": "0.7.31",
|
||||||
"floating-vue": "2.0.0-beta.20",
|
"floating-vue": "2.0.0-beta.20",
|
||||||
"focus-within": "3.0.2",
|
"focus-within": "3.0.2",
|
||||||
"highlight.js": "11.7.0",
|
"highlight.js": "11.7.0",
|
||||||
"is-touch-device": "1.0.1",
|
"is-touch-device": "1.0.1",
|
||||||
"klona": "2.0.6",
|
"klona": "2.0.6",
|
||||||
"lodash.debounce": "4.0.8",
|
"lodash.debounce": "4.0.8",
|
||||||
"marked": "4.2.12",
|
"marked": "4.3.0",
|
||||||
"pinia": "2.0.32",
|
"pinia": "2.0.33",
|
||||||
"register-service-worker": "1.7.2",
|
"register-service-worker": "1.7.2",
|
||||||
"snake-case": "3.0.4",
|
"snake-case": "3.0.4",
|
||||||
"sortablejs": "1.15.0",
|
"sortablejs": "1.15.0",
|
||||||
"ufo": "1.1.1",
|
"ufo": "1.1.1",
|
||||||
"vue": "3.2.47",
|
"vue": "3.2.47",
|
||||||
"vue-advanced-cropper": "2.8.8",
|
"vue-advanced-cropper": "2.8.8",
|
||||||
"vue-flatpickr-component": "11.0.2",
|
"vue-flatpickr-component": "11.0.3",
|
||||||
"vue-i18n": "9.2.2",
|
"vue-i18n": "9.2.2",
|
||||||
"vue-router": "4.1.6",
|
"vue-router": "4.1.6",
|
||||||
"workbox-precaching": "6.5.4",
|
"workbox-precaching": "6.5.4",
|
||||||
|
"y-indexeddb": "^9.0.10",
|
||||||
|
"y-webrtc": "^10.2.5",
|
||||||
|
"yjs": "^13.5.51",
|
||||||
"zhyswan-vuedraggable": "4.1.3"
|
"zhyswan-vuedraggable": "4.1.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@4tw/cypress-drag-drop": "2.2.3",
|
"@4tw/cypress-drag-drop": "2.2.3",
|
||||||
"@cypress/vite-dev-server": "5.0.4",
|
"@cypress/vite-dev-server": "5.0.5",
|
||||||
"@cypress/vue": "5.0.4",
|
"@cypress/vue": "5.0.5",
|
||||||
"@faker-js/faker": "7.6.0",
|
"@faker-js/faker": "7.6.0",
|
||||||
"@histoire/plugin-screenshot": "0.15.8",
|
"@histoire/plugin-screenshot": "0.15.9",
|
||||||
"@histoire/plugin-vue": "0.15.8",
|
"@histoire/plugin-vue": "0.15.8",
|
||||||
"@rushstack/eslint-patch": "1.2.0",
|
"@rushstack/eslint-patch": "1.2.0",
|
||||||
"@types/codemirror": "5.60.7",
|
"@types/codemirror": "5.60.7",
|
||||||
"@types/dompurify": "2.4.0",
|
"@types/dompurify": "3.0.0",
|
||||||
"@types/flexsearch": "0.7.3",
|
"@types/flexsearch": "0.7.3",
|
||||||
"@types/focus-within": "1.0.1",
|
"@types/focus-within": "1.0.1",
|
||||||
"@types/lodash.debounce": "4.0.7",
|
"@types/lodash.debounce": "4.0.7",
|
||||||
"@types/marked": "4.0.8",
|
"@types/marked": "4.0.8",
|
||||||
"@types/node": "18.14.2",
|
"@types/node": "18.15.10",
|
||||||
"@types/postcss-preset-env": "7.7.0",
|
"@types/postcss-preset-env": "7.7.0",
|
||||||
"@typescript-eslint/eslint-plugin": "5.54.0",
|
"@typescript-eslint/eslint-plugin": "5.57.0",
|
||||||
"@typescript-eslint/parser": "5.54.0",
|
"@typescript-eslint/parser": "5.57.0",
|
||||||
"@vitejs/plugin-legacy": "4.0.1",
|
"@vitejs/plugin-legacy": "4.0.2",
|
||||||
"@vitejs/plugin-vue": "4.0.0",
|
"@vitejs/plugin-vue": "4.1.0",
|
||||||
"@vue/eslint-config-typescript": "11.0.2",
|
"@vue/eslint-config-typescript": "11.0.2",
|
||||||
"@vue/test-utils": "2.3.0",
|
"@vue/test-utils": "2.3.2",
|
||||||
"@vue/tsconfig": "0.1.3",
|
"@vue/tsconfig": "0.1.3",
|
||||||
"autoprefixer": "10.4.13",
|
"autoprefixer": "10.4.14",
|
||||||
"browserslist": "4.21.5",
|
"browserslist": "4.21.5",
|
||||||
"caniuse-lite": "1.0.30001458",
|
"caniuse-lite": "1.0.30001470",
|
||||||
"csstype": "3.1.1",
|
"csstype": "3.1.1",
|
||||||
"cypress": "12.7.0",
|
"cypress": "12.8.1",
|
||||||
"esbuild": "0.17.10",
|
"esbuild": "0.17.14",
|
||||||
"eslint": "8.35.0",
|
"eslint": "8.36.0",
|
||||||
"eslint-plugin-vue": "9.9.0",
|
"eslint-plugin-vue": "9.10.0",
|
||||||
"happy-dom": "8.9.0",
|
"happy-dom": "8.9.0",
|
||||||
"histoire": "0.15.8",
|
"histoire": "0.15.9",
|
||||||
"netlify-cli": "13.0.0",
|
"netlify-cli": "13.2.1",
|
||||||
"postcss": "8.4.21",
|
"postcss": "8.4.21",
|
||||||
"postcss-easing-gradients": "3.0.1",
|
"postcss-easing-gradients": "3.0.1",
|
||||||
"postcss-easings": "3.0.1",
|
"postcss-easings": "3.0.1",
|
||||||
"postcss-preset-env": "8.0.1",
|
"postcss-preset-env": "8.1.0",
|
||||||
"rollup": "3.17.3",
|
"rollup": "3.20.2",
|
||||||
"rollup-plugin-visualizer": "5.9.0",
|
"rollup-plugin-visualizer": "5.9.0",
|
||||||
"sass": "1.58.3",
|
"sass": "1.60.0",
|
||||||
"start-server-and-test": "2.0.0",
|
"start-server-and-test": "2.0.0",
|
||||||
"typescript": "4.9.5",
|
"typescript": "5.0.2",
|
||||||
"vite": "4.1.4",
|
"vite": "4.2.1",
|
||||||
"vite-plugin-inject-preload": "1.3.0",
|
"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",
|
"vite-svg-loader": "4.0.0",
|
||||||
"vitest": "0.29.1",
|
"vitest": "0.29.7",
|
||||||
"vue-tsc": "1.2.0",
|
"vue-tsc": "1.2.0",
|
||||||
"wait-on": "7.0.1",
|
"wait-on": "7.0.1",
|
||||||
"workbox-cli": "6.5.4"
|
"workbox-cli": "6.5.4"
|
||||||
|
},
|
||||||
|
"pnpm": {
|
||||||
|
"patchedDependencies": {
|
||||||
|
"flexsearch@0.7.31": "patches/flexsearch@0.7.31.patch"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
diff --git a/index.d.ts b/index.d.ts
|
||||||
|
deleted file mode 100644
|
||||||
|
index 9f39f41073864b83968bdaa242ac4e3c3149685a..0000000000000000000000000000000000000000
|
||||||
|
diff --git a/package.json b/package.json
|
||||||
|
index 8968f5bf8010ff194240591c8b83299f7328e79d..6d84b6f590a841b129ed8b3860cb786df5a185c0 100644
|
||||||
|
--- a/package.json
|
||||||
|
+++ b/package.json
|
||||||
|
@@ -22,8 +22,6 @@
|
||||||
|
},
|
||||||
|
"main": "dist/flexsearch.bundle.js",
|
||||||
|
"browser": "dist/flexsearch.bundle.js",
|
||||||
|
- "module": "dist/module/index.js",
|
||||||
|
- "types": "./index.d.ts",
|
||||||
|
"preferGlobal": false,
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
2699
pnpm-lock.yaml
2699
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
36
src/App.vue
36
src/App.vue
|
@ -35,7 +35,6 @@ import NoAuthWrapper from '@/components/misc/no-auth-wrapper.vue'
|
||||||
import Ready from '@/components/misc/ready.vue'
|
import Ready from '@/components/misc/ready.vue'
|
||||||
|
|
||||||
import {setLanguage} from '@/i18n'
|
import {setLanguage} from '@/i18n'
|
||||||
import AccountDeleteService from '@/services/accountDelete'
|
|
||||||
import {success} from '@/message'
|
import {success} from '@/message'
|
||||||
|
|
||||||
import {useAuthStore} from '@/stores/auth'
|
import {useAuthStore} from '@/stores/auth'
|
||||||
|
@ -57,41 +56,6 @@ const authLinkShare = computed(() => authStore.authLinkShare)
|
||||||
|
|
||||||
const {t} = useI18n({useScope: 'global'})
|
const {t} = useI18n({useScope: 'global'})
|
||||||
|
|
||||||
// setup account deletion verification
|
|
||||||
const accountDeletionConfirm = computed(() => route.query?.accountDeletionConfirm as (string | undefined))
|
|
||||||
watch(accountDeletionConfirm, async (accountDeletionConfirm) => {
|
|
||||||
if (accountDeletionConfirm === undefined) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const accountDeletionService = new AccountDeleteService()
|
|
||||||
await accountDeletionService.confirm(accountDeletionConfirm)
|
|
||||||
success({message: t('user.deletion.confirmSuccess')})
|
|
||||||
authStore.refreshUserInfo()
|
|
||||||
}, { immediate: true })
|
|
||||||
|
|
||||||
// setup password reset redirect
|
|
||||||
const userPasswordReset = computed(() => route.query?.userPasswordReset as (string | undefined))
|
|
||||||
watch(userPasswordReset, (userPasswordReset) => {
|
|
||||||
if (userPasswordReset === undefined) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
localStorage.setItem('passwordResetToken', userPasswordReset)
|
|
||||||
router.push({name: 'user.password-reset.reset'})
|
|
||||||
}, { immediate: true })
|
|
||||||
|
|
||||||
// setup email verification redirect
|
|
||||||
const userEmailConfirm = computed(() => route.query?.userEmailConfirm as (string | undefined))
|
|
||||||
watch(userEmailConfirm, (userEmailConfirm) => {
|
|
||||||
if (userEmailConfirm === undefined) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
localStorage.setItem('emailConfirmToken', userEmailConfirm)
|
|
||||||
router.push({name: 'user.login'})
|
|
||||||
}, { immediate: true })
|
|
||||||
|
|
||||||
setLanguage()
|
setLanguage()
|
||||||
useColorScheme()
|
useColorScheme()
|
||||||
</script>
|
</script>
|
||||||
|
|
Binary file not shown.
|
@ -4,8 +4,11 @@ import { useNow } from '@vueuse/core'
|
||||||
|
|
||||||
import LogoFull from '@/assets/logo-full.svg?component'
|
import LogoFull from '@/assets/logo-full.svg?component'
|
||||||
import LogoFullPride from '@/assets/logo-full-pride.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)
|
const Logo = computed(() => now.value.getMonth() === 5 ? LogoFullPride : LogoFull)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -1,67 +1,31 @@
|
||||||
<template>
|
<template>
|
||||||
<header
|
<header :class="{ 'has-background': background, 'menu-active': menuActive }" aria-label="main navigation"
|
||||||
:class="{'has-background': background, 'menu-active': menuActive}"
|
class="navbar d-print-none">
|
||||||
aria-label="main navigation"
|
<router-link :to="{ name: 'home' }" class="logo-link">
|
||||||
class="navbar d-print-none"
|
<Logo width="164" height="48" />
|
||||||
>
|
|
||||||
<router-link :to="{name: 'home'}" class="logo-link">
|
|
||||||
<Logo width="164" height="48"/>
|
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
||||||
<MenuButton class="menu-button"/>
|
<!-- <MenuButton class="menu-button" /> -->
|
||||||
|
|
||||||
<div
|
|
||||||
v-if="currentList.id"
|
|
||||||
class="list-title-wrapper"
|
|
||||||
>
|
|
||||||
<h1 class="list-title">{{ currentList.title === '' ? $t('misc.loading') : getListTitle(currentList) }}</h1>
|
|
||||||
|
|
||||||
<BaseButton :to="{name: 'list.info', params: {listId: currentList.id}}" class="list-title-button">
|
|
||||||
<icon icon="circle-info"/>
|
|
||||||
</BaseButton>
|
|
||||||
|
|
||||||
<list-settings-dropdown
|
|
||||||
v-if="canWriteCurrentList && currentList.id !== -1"
|
|
||||||
class="list-title-dropdown"
|
|
||||||
:list="currentList"
|
|
||||||
>
|
|
||||||
<template #trigger="{toggleOpen}">
|
|
||||||
<BaseButton class="list-title-button" @click="toggleOpen">
|
|
||||||
<icon icon="ellipsis-h" class="icon"/>
|
|
||||||
</BaseButton>
|
|
||||||
</template>
|
|
||||||
</list-settings-dropdown>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="navbar-end">
|
<div class="navbar-end">
|
||||||
<BaseButton
|
<BaseButton @click="openQuickActions" class="trigger-button" v-shortcut="'Control+k'"
|
||||||
@click="openQuickActions"
|
:title="$t('keyboardShortcuts.quickSearch')">
|
||||||
class="trigger-button"
|
<icon icon="search" />
|
||||||
v-shortcut="'Control+k'"
|
|
||||||
:title="$t('keyboardShortcuts.quickSearch')"
|
|
||||||
>
|
|
||||||
<icon icon="search"/>
|
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
<Notifications />
|
|
||||||
<dropdown>
|
<dropdown>
|
||||||
<template #trigger="{toggleOpen, open}">
|
<template #trigger="{ toggleOpen, open }">
|
||||||
<BaseButton
|
<BaseButton class="username-dropdown-trigger" @click="toggleOpen" variant="secondary" :shadow="false">
|
||||||
class="username-dropdown-trigger"
|
<img :src="authStore.avatarUrl" alt="" class="avatar" width="40" height="40" />
|
||||||
@click="toggleOpen"
|
|
||||||
variant="secondary"
|
|
||||||
:shadow="false"
|
|
||||||
>
|
|
||||||
<img :src="authStore.avatarUrl" alt="" class="avatar" width="40" height="40"/>
|
|
||||||
<span class="username">{{ authStore.userDisplayName }}</span>
|
<span class="username">{{ authStore.userDisplayName }}</span>
|
||||||
<span class="icon is-small" :style="{
|
<span class="icon is-small" :style="{
|
||||||
transform: open ? 'rotate(180deg)' : 'rotate(0)',
|
transform: open ? 'rotate(180deg)' : 'rotate(0)',
|
||||||
}">
|
}">
|
||||||
<icon icon="chevron-down"/>
|
<icon icon="chevron-down" />
|
||||||
</span>
|
</span>
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<dropdown-item :to="{name: 'user.settings'}">
|
<dropdown-item :to="{ name: 'user.settings' }">
|
||||||
{{ $t('user.settings.title') }}
|
{{ $t('user.settings.title') }}
|
||||||
</dropdown-item>
|
</dropdown-item>
|
||||||
<dropdown-item v-if="imprintUrl" :href="imprintUrl">
|
<dropdown-item v-if="imprintUrl" :href="imprintUrl">
|
||||||
|
@ -73,23 +37,20 @@
|
||||||
<dropdown-item @click="baseStore.setKeyboardShortcutsActive(true)">
|
<dropdown-item @click="baseStore.setKeyboardShortcutsActive(true)">
|
||||||
{{ $t('keyboardShortcuts.title') }}
|
{{ $t('keyboardShortcuts.title') }}
|
||||||
</dropdown-item>
|
</dropdown-item>
|
||||||
<dropdown-item :to="{name: 'about'}">
|
<dropdown-item :to="{ name: 'about' }">
|
||||||
{{ $t('about.title') }}
|
{{ $t('about.title') }}
|
||||||
</dropdown-item>
|
</dropdown-item>
|
||||||
<dropdown-item @click="authStore.logout()">
|
|
||||||
{{ $t('user.auth.logout') }}
|
|
||||||
</dropdown-item>
|
|
||||||
</dropdown>
|
</dropdown>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import {computed} from 'vue'
|
import { computed } from 'vue'
|
||||||
|
|
||||||
import {RIGHTS as Rights} from '@/constants/rights'
|
import { RIGHTS as Rights } from '@/constants/rights'
|
||||||
|
|
||||||
import ListSettingsDropdown from '@/components/list/list-settings-dropdown.vue'
|
import ProjectSettingsDropdown from '@/components/project/project-settings-dropdown.vue'
|
||||||
import Dropdown from '@/components/misc/dropdown.vue'
|
import Dropdown from '@/components/misc/dropdown.vue'
|
||||||
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
||||||
import Notifications from '@/components/notifications/notifications.vue'
|
import Notifications from '@/components/notifications/notifications.vue'
|
||||||
|
@ -97,16 +58,16 @@ import Logo from '@/components/home/Logo.vue'
|
||||||
import BaseButton from '@/components/base/BaseButton.vue'
|
import BaseButton from '@/components/base/BaseButton.vue'
|
||||||
import MenuButton from '@/components/home/MenuButton.vue'
|
import MenuButton from '@/components/home/MenuButton.vue'
|
||||||
|
|
||||||
import {getListTitle} from '@/helpers/getListTitle'
|
import { getProjectTitle } from '@/helpers/getProjectTitle'
|
||||||
|
|
||||||
import {useBaseStore} from '@/stores/base'
|
import { useBaseStore } from '@/stores/base'
|
||||||
import {useConfigStore} from '@/stores/config'
|
import { useConfigStore } from '@/stores/config'
|
||||||
import {useAuthStore} from '@/stores/auth'
|
import { useAuthStore } from '@/stores/auth'
|
||||||
|
|
||||||
const baseStore = useBaseStore()
|
const baseStore = useBaseStore()
|
||||||
const currentList = computed(() => baseStore.currentList)
|
const currentProject = computed(() => baseStore.currentProject)
|
||||||
const background = computed(() => baseStore.background)
|
const background = computed(() => baseStore.background)
|
||||||
const canWriteCurrentList = computed(() => baseStore.currentList.maxRight > Rights.READ)
|
const canWriteCurrentProject = computed(() => baseStore.currentProject.maxRight > Rights.READ)
|
||||||
const menuActive = computed(() => baseStore.menuActive)
|
const menuActive = computed(() => baseStore.menuActive)
|
||||||
|
|
||||||
const authStore = useAuthStore()
|
const authStore = useAuthStore()
|
||||||
|
@ -166,7 +127,7 @@ $user-dropdown-width-mobile: 5rem;
|
||||||
|
|
||||||
.logo-link {
|
.logo-link {
|
||||||
display: none;
|
display: none;
|
||||||
|
|
||||||
@media screen and (min-width: $tablet) {
|
@media screen and (min-width: $tablet) {
|
||||||
align-self: stretch;
|
align-self: stretch;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -185,12 +146,12 @@ $user-dropdown-width-mobile: 5rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-title-wrapper {
|
.project-title-wrapper {
|
||||||
margin-inline: auto;
|
margin-inline: auto;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
||||||
// this makes the truncated text of the list title work
|
// this makes the truncated text of the project title work
|
||||||
// inside the flexbox parent
|
// inside the flexbox parent
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
|
|
||||||
|
@ -199,7 +160,7 @@ $user-dropdown-width-mobile: 5rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-title {
|
.project-title {
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
// We need the following for overflowing ellipsis to work
|
// We need the following for overflowing ellipsis to work
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
|
@ -211,15 +172,15 @@ $user-dropdown-width-mobile: 5rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-title-dropdown {
|
.project-title-dropdown {
|
||||||
align-self: stretch;
|
align-self: stretch;
|
||||||
|
|
||||||
.list-title-button {
|
.project-title-button {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-title-button {
|
.project-title-button {
|
||||||
align-self: stretch;
|
align-self: stretch;
|
||||||
min-width: var(--navbar-button-min-width);
|
min-width: var(--navbar-button-min-width);
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -235,7 +196,7 @@ $user-dropdown-width-mobile: 5rem;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
|
|
||||||
> * {
|
>* {
|
||||||
min-width: var(--navbar-button-min-width);
|
min-width: var(--navbar-button-min-width);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
:class="{'is-visible': background}"
|
:class="{'is-visible': background}"
|
||||||
class="app-container-background background-fade-in d-print-none"
|
class="app-container-background background-fade-in d-print-none"
|
||||||
:style="{'background-image': background && `url(${background})`}"></div>
|
:style="{'background-image': background && `url(${background})`}"></div>
|
||||||
|
<!-- Can't remove <navigation> because otherwise namespaces would not get loaded. -->
|
||||||
<navigation class="d-print-none"/>
|
<navigation class="d-print-none"/>
|
||||||
<main
|
<main
|
||||||
class="app-content"
|
class="app-content"
|
||||||
|
@ -33,7 +34,7 @@
|
||||||
<quick-actions/>
|
<quick-actions/>
|
||||||
|
|
||||||
<router-view :route="routeWithModal" v-slot="{ Component }">
|
<router-view :route="routeWithModal" v-slot="{ Component }">
|
||||||
<keep-alive :include="['list.list', 'list.gantt', 'list.table', 'list.kanban']">
|
<keep-alive :include="['project.list', 'project.gantt', 'project.table', 'project.kanban']">
|
||||||
<component :is="Component"/>
|
<component :is="Component"/>
|
||||||
</keep-alive>
|
</keep-alive>
|
||||||
</router-view>
|
</router-view>
|
||||||
|
@ -71,7 +72,6 @@ import {useBaseStore} from '@/stores/base'
|
||||||
import {useLabelStore} from '@/stores/labels'
|
import {useLabelStore} from '@/stores/labels'
|
||||||
|
|
||||||
import {useRouteWithModal} from '@/composables/useRouteWithModal'
|
import {useRouteWithModal} from '@/composables/useRouteWithModal'
|
||||||
import {useRenewTokenOnFocus} from '@/composables/useRenewTokenOnFocus'
|
|
||||||
|
|
||||||
const {routeWithModal, currentModal, closeModal} = useRouteWithModal()
|
const {routeWithModal, currentModal, closeModal} = useRouteWithModal()
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ function showKeyboardShortcuts() {
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
|
||||||
// FIXME: this is really error prone
|
// FIXME: this is really error prone
|
||||||
// Reset the current list highlight in menu if the current route is not list related.
|
// Reset the current project highlight in menu if the current route is not project related.
|
||||||
watch(() => route.name as string, (routeName) => {
|
watch(() => route.name as string, (routeName) => {
|
||||||
if (
|
if (
|
||||||
routeName &&
|
routeName &&
|
||||||
|
@ -106,14 +106,12 @@ watch(() => route.name as string, (routeName) => {
|
||||||
routeName.startsWith('user.settings')
|
routeName.startsWith('user.settings')
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
baseStore.handleSetCurrentList({list: null})
|
baseStore.handleSetCurrentProject({project: null})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// TODO: Reset the title if the page component does not set one itself
|
// TODO: Reset the title if the page component does not set one itself
|
||||||
|
|
||||||
useRenewTokenOnFocus()
|
|
||||||
|
|
||||||
const labelStore = useLabelStore()
|
const labelStore = useLabelStore()
|
||||||
labelStore.loadAllLabels()
|
labelStore.loadAllLabels()
|
||||||
</script>
|
</script>
|
||||||
|
@ -156,6 +154,8 @@ labelStore.loadAllLabels()
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
position: relative;
|
position: relative;
|
||||||
padding: 1.5rem 0.5rem 1rem;
|
padding: 1.5rem 0.5rem 1rem;
|
||||||
|
// TODO refactor: DRY `transition-timing-function` with `./navigation.vue`.
|
||||||
|
transition: margin-left $transition-duration;
|
||||||
|
|
||||||
@media screen and (max-width: $tablet) {
|
@media screen and (max-width: $tablet) {
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
|
|
|
@ -9,9 +9,9 @@
|
||||||
<Logo class="logo" v-if="logoVisible"/>
|
<Logo class="logo" v-if="logoVisible"/>
|
||||||
<h1
|
<h1
|
||||||
:class="{'m-0': !logoVisible}"
|
:class="{'m-0': !logoVisible}"
|
||||||
:style="{ 'opacity': currentList.title === '' ? '0': '1' }"
|
:style="{ 'opacity': currentProject.title === '' ? '0': '1' }"
|
||||||
class="title">
|
class="title">
|
||||||
{{ currentList.title === '' ? $t('misc.loading') : currentList.title }}
|
{{ currentProject.title === '' ? $t('misc.loading') : currentProject.title }}
|
||||||
</h1>
|
</h1>
|
||||||
<div class="box has-text-left view">
|
<div class="box has-text-left view">
|
||||||
<router-view/>
|
<router-view/>
|
||||||
|
@ -31,7 +31,7 @@ import Logo from '@/components/home/Logo.vue'
|
||||||
import PoweredByLink from './PoweredByLink.vue'
|
import PoweredByLink from './PoweredByLink.vue'
|
||||||
|
|
||||||
const baseStore = useBaseStore()
|
const baseStore = useBaseStore()
|
||||||
const currentList = computed(() => baseStore.currentList)
|
const currentProject = computed(() => baseStore.currentProject)
|
||||||
const background = computed(() => baseStore.background)
|
const background = computed(() => baseStore.background)
|
||||||
const logoVisible = computed(() => baseStore.logoVisible)
|
const logoVisible = computed(() => baseStore.logoVisible)
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -52,37 +52,37 @@
|
||||||
<template v-for="(n, nk) in namespaces" :key="n.id">
|
<template v-for="(n, nk) in namespaces" :key="n.id">
|
||||||
<div class="namespace-title" :class="{'has-menu': n.id > 0}">
|
<div class="namespace-title" :class="{'has-menu': n.id > 0}">
|
||||||
<BaseButton
|
<BaseButton
|
||||||
@click="toggleLists(n.id)"
|
@click="toggleProjects(n.id)"
|
||||||
class="menu-label"
|
class="menu-label"
|
||||||
v-tooltip="namespaceTitles[nk]"
|
v-tooltip="namespaceTitles[nk]"
|
||||||
>
|
>
|
||||||
<ColorBubble
|
<ColorBubble
|
||||||
v-if="n.hexColor !== ''"
|
v-if="n.hexColor !== ''"
|
||||||
:color="n.hexColor"
|
:color="n.hexColor"
|
||||||
class="mr-1"
|
class="mr-1"
|
||||||
/>
|
/>
|
||||||
<span class="name">{{ namespaceTitles[nk] }}</span>
|
<span class="name">{{ namespaceTitles[nk] }}</span>
|
||||||
<div
|
<div
|
||||||
class="icon menu-item-icon is-small toggle-lists-icon pl-2"
|
class="icon menu-item-icon is-small toggle-lists-icon pl-2"
|
||||||
:class="{'active': typeof listsVisible[n.id] !== 'undefined' ? listsVisible[n.id] : true}"
|
:class="{'active': typeof projectsVisible[n.id] !== 'undefined' ? projectsVisible[n.id] : true}"
|
||||||
>
|
>
|
||||||
<icon icon="chevron-down"/>
|
<icon icon="chevron-down"/>
|
||||||
</div>
|
</div>
|
||||||
<span class="count" :class="{'ml-2 mr-0': n.id > 0}">
|
<span class="count" :class="{'ml-2 mr-0': n.id > 0}">
|
||||||
({{ namespaceListsCount[nk] }})
|
({{ namespaceProjectsCount[nk] }})
|
||||||
</span>
|
</span>
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
<namespace-settings-dropdown class="menu-list-dropdown" :namespace="n" v-if="n.id > 0"/>
|
<namespace-settings-dropdown class="menu-list-dropdown" :namespace="n" v-if="n.id > 0"/>
|
||||||
</div>
|
</div>
|
||||||
<!--
|
<!--
|
||||||
NOTE: a v-model / computed setter is not possible, since the updateActiveLists function
|
NOTE: a v-model / computed setter is not possible, since the updateActiveProjects function
|
||||||
triggered by the change needs to have access to the current namespace
|
triggered by the change needs to have access to the current namespace
|
||||||
-->
|
-->
|
||||||
<draggable
|
<draggable
|
||||||
v-if="listsVisible[n.id] ?? true"
|
v-if="projectsVisible[n.id] ?? true"
|
||||||
v-bind="dragOptions"
|
v-bind="dragOptions"
|
||||||
:modelValue="activeLists[nk]"
|
:modelValue="activeProjects[nk]"
|
||||||
@update:modelValue="(lists) => updateActiveLists(n, lists)"
|
@update:modelValue="(projects) => updateActiveProjects(n, projects)"
|
||||||
group="namespace-lists"
|
group="namespace-lists"
|
||||||
@start="() => drag = true"
|
@start="() => drag = true"
|
||||||
@end="saveListPosition"
|
@end="saveListPosition"
|
||||||
|
@ -100,46 +100,46 @@
|
||||||
{ 'dragging-disabled': n.id < 0 }
|
{ 'dragging-disabled': n.id < 0 }
|
||||||
]
|
]
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<template #item="{element: l}">
|
<template #item="{element: l}">
|
||||||
<li
|
<li
|
||||||
class="list-menu loader-container is-loading-small"
|
class="list-menu loader-container is-loading-small"
|
||||||
:class="{'is-loading': listUpdating[l.id]}"
|
:class="{'is-loading': projectUpdating[l.id]}"
|
||||||
|
>
|
||||||
|
<BaseButton
|
||||||
|
:to="{ name: 'project.index', params: { projectId: l.id} }"
|
||||||
|
class="list-menu-link"
|
||||||
|
:class="{'router-link-exact-active': currentProject.id === l.id}"
|
||||||
>
|
>
|
||||||
<BaseButton
|
<span class="icon menu-item-icon handle">
|
||||||
:to="{ name: 'list.index', params: { listId: l.id} }"
|
<icon icon="grip-lines"/>
|
||||||
class="list-menu-link"
|
</span>
|
||||||
:class="{'router-link-exact-active': currentList.id === l.id}"
|
<ColorBubble
|
||||||
>
|
|
||||||
<span class="icon menu-item-icon handle">
|
|
||||||
<icon icon="grip-lines"/>
|
|
||||||
</span>
|
|
||||||
<ColorBubble
|
|
||||||
v-if="l.hexColor !== ''"
|
v-if="l.hexColor !== ''"
|
||||||
:color="l.hexColor"
|
:color="l.hexColor"
|
||||||
class="mr-1"
|
class="mr-1"
|
||||||
/>
|
/>
|
||||||
<span class="list-menu-title">{{ getListTitle(l) }}</span>
|
<span class="list-menu-title">{{ getProjectTitle(l) }}</span>
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
v-if="l.id > 0"
|
v-if="l.id > 0"
|
||||||
class="favorite"
|
class="favorite"
|
||||||
:class="{'is-favorite': l.isFavorite}"
|
:class="{'is-favorite': l.isFavorite}"
|
||||||
@click="listStore.toggleListFavorite(l)"
|
@click="projectStore.toggleProjectFavorite(l)"
|
||||||
>
|
>
|
||||||
<icon :icon="l.isFavorite ? 'star' : ['far', 'star']"/>
|
<icon :icon="l.isFavorite ? 'star' : ['far', 'star']"/>
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
<list-settings-dropdown class="menu-list-dropdown" :list="l" v-if="l.id > 0">
|
<ProjectSettingsDropdown class="menu-list-dropdown" :project="l" v-if="l.id > 0">
|
||||||
<template #trigger="{toggleOpen}">
|
<template #trigger="{toggleOpen}">
|
||||||
<BaseButton class="menu-list-dropdown-trigger" @click="toggleOpen">
|
<BaseButton class="menu-list-dropdown-trigger" @click="toggleOpen">
|
||||||
<icon icon="ellipsis-h" class="icon"/>
|
<icon icon="ellipsis-h" class="icon"/>
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</template>
|
</template>
|
||||||
</list-settings-dropdown>
|
</ProjectSettingsDropdown>
|
||||||
<span class="list-setting-spacer" v-else></span>
|
<span class="list-setting-spacer" v-else></span>
|
||||||
</li>
|
</li>
|
||||||
</template>
|
</template>
|
||||||
</draggable>
|
</draggable>
|
||||||
</template>
|
</template>
|
||||||
</nav>
|
</nav>
|
||||||
<PoweredByLink/>
|
<PoweredByLink/>
|
||||||
|
@ -152,20 +152,20 @@ import draggable from 'zhyswan-vuedraggable'
|
||||||
import type {SortableEvent} from 'sortablejs'
|
import type {SortableEvent} from 'sortablejs'
|
||||||
|
|
||||||
import BaseButton from '@/components/base/BaseButton.vue'
|
import BaseButton from '@/components/base/BaseButton.vue'
|
||||||
import ListSettingsDropdown from '@/components/list/list-settings-dropdown.vue'
|
import ProjectSettingsDropdown from '@/components/project/project-settings-dropdown.vue'
|
||||||
import NamespaceSettingsDropdown from '@/components/namespace/namespace-settings-dropdown.vue'
|
import NamespaceSettingsDropdown from '@/components/namespace/namespace-settings-dropdown.vue'
|
||||||
import PoweredByLink from '@/components/home/PoweredByLink.vue'
|
import PoweredByLink from '@/components/home/PoweredByLink.vue'
|
||||||
import Logo from '@/components/home/Logo.vue'
|
import Logo from '@/components/home/Logo.vue'
|
||||||
|
|
||||||
import {calculateItemPosition} from '@/helpers/calculateItemPosition'
|
import {calculateItemPosition} from '@/helpers/calculateItemPosition'
|
||||||
import {getNamespaceTitle} from '@/helpers/getNamespaceTitle'
|
import {getNamespaceTitle} from '@/helpers/getNamespaceTitle'
|
||||||
import {getListTitle} from '@/helpers/getListTitle'
|
import {getProjectTitle} from '@/helpers/getProjectTitle'
|
||||||
import type {IList} from '@/modelTypes/IList'
|
import type {IProject} from '@/modelTypes/IProject'
|
||||||
import type {INamespace} from '@/modelTypes/INamespace'
|
import type {INamespace} from '@/modelTypes/INamespace'
|
||||||
import ColorBubble from '@/components/misc/colorBubble.vue'
|
import ColorBubble from '@/components/misc/colorBubble.vue'
|
||||||
|
|
||||||
import {useBaseStore} from '@/stores/base'
|
import {useBaseStore} from '@/stores/base'
|
||||||
import {useListStore} from '@/stores/lists'
|
import {useProjectStore} from '@/stores/projects'
|
||||||
import {useNamespaceStore} from '@/stores/namespaces'
|
import {useNamespaceStore} from '@/stores/namespaces'
|
||||||
|
|
||||||
const drag = ref(false)
|
const drag = ref(false)
|
||||||
|
@ -176,7 +176,7 @@ const dragOptions = {
|
||||||
|
|
||||||
const baseStore = useBaseStore()
|
const baseStore = useBaseStore()
|
||||||
const namespaceStore = useNamespaceStore()
|
const namespaceStore = useNamespaceStore()
|
||||||
const currentList = computed(() => baseStore.currentList)
|
const currentProject = computed(() => baseStore.currentProject)
|
||||||
const menuActive = computed(() => baseStore.menuActive)
|
const menuActive = computed(() => baseStore.menuActive)
|
||||||
const loading = computed(() => namespaceStore.isLoading)
|
const loading = computed(() => namespaceStore.isLoading)
|
||||||
|
|
||||||
|
@ -184,9 +184,9 @@ const loading = computed(() => namespaceStore.isLoading)
|
||||||
const namespaces = computed(() => {
|
const namespaces = computed(() => {
|
||||||
return namespaceStore.namespaces.filter(n => !n.isArchived)
|
return namespaceStore.namespaces.filter(n => !n.isArchived)
|
||||||
})
|
})
|
||||||
const activeLists = computed(() => {
|
const activeProjects = computed(() => {
|
||||||
return namespaces.value.map(({lists}) => {
|
return namespaces.value.map(({projects}) => {
|
||||||
return lists?.filter(item => {
|
return projects?.filter(item => {
|
||||||
return typeof item !== 'undefined' && !item.isArchived
|
return typeof item !== 'undefined' && !item.isArchived
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -196,45 +196,45 @@ const namespaceTitles = computed(() => {
|
||||||
return namespaces.value.map((namespace) => getNamespaceTitle(namespace))
|
return namespaces.value.map((namespace) => getNamespaceTitle(namespace))
|
||||||
})
|
})
|
||||||
|
|
||||||
const namespaceListsCount = computed(() => {
|
const namespaceProjectsCount = computed(() => {
|
||||||
return namespaces.value.map((_, index) => activeLists.value[index]?.length ?? 0)
|
return namespaces.value.map((_, index) => activeProjects.value[index]?.length ?? 0)
|
||||||
})
|
})
|
||||||
|
|
||||||
const listStore = useListStore()
|
const projectStore = useProjectStore()
|
||||||
|
|
||||||
function toggleLists(namespaceId: INamespace['id']) {
|
function toggleProjects(namespaceId: INamespace['id']) {
|
||||||
listsVisible.value[namespaceId] = !listsVisible.value[namespaceId]
|
projectsVisible.value[namespaceId] = !projectsVisible.value[namespaceId]
|
||||||
}
|
}
|
||||||
|
|
||||||
const listsVisible = ref<{ [id: INamespace['id']]: boolean }>({})
|
const projectsVisible = ref<{ [id: INamespace['id']]: boolean }>({})
|
||||||
// FIXME: async action will be unfinished when component mounts
|
// FIXME: async action will be unfinished when component mounts
|
||||||
onBeforeMount(async () => {
|
onBeforeMount(async () => {
|
||||||
const namespaces = await namespaceStore.loadNamespaces()
|
const namespaces = await namespaceStore.loadNamespaces()
|
||||||
namespaces.forEach(n => {
|
namespaces.forEach(n => {
|
||||||
if (typeof listsVisible.value[n.id] === 'undefined') {
|
if (typeof projectsVisible.value[n.id] === 'undefined') {
|
||||||
listsVisible.value[n.id] = true
|
projectsVisible.value[n.id] = true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
function updateActiveLists(namespace: INamespace, activeLists: IList[]) {
|
function updateActiveProjects(namespace: INamespace, activeProjects: IProject[]) {
|
||||||
// This is a bit hacky: since we do have to filter out the archived items from the list
|
// This is a bit hacky: since we do have to filter out the archived items from the list
|
||||||
// for vue draggable updating it is not as simple as replacing it.
|
// for vue draggable updating it is not as simple as replacing it.
|
||||||
// To work around this, we merge the active lists with the archived ones. Doing so breaks the order
|
// To work around this, we merge the active projects with the archived ones. Doing so breaks the order
|
||||||
// because now all archived lists are sorted after the active ones. This is fine because they are sorted
|
// because now all archived projects are sorted after the active ones. This is fine because they are sorted
|
||||||
// later when showing them anyway, and it makes the merging happening here a lot easier.
|
// later when showing them anyway, and it makes the merging happening here a lot easier.
|
||||||
const lists = [
|
const projects = [
|
||||||
...activeLists,
|
...activeProjects,
|
||||||
...namespace.lists.filter(l => l.isArchived),
|
...namespace.projects.filter(l => l.isArchived),
|
||||||
]
|
]
|
||||||
|
|
||||||
namespaceStore.setNamespaceById({
|
namespaceStore.setNamespaceById({
|
||||||
...namespace,
|
...namespace,
|
||||||
lists,
|
projects,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const listUpdating = ref<{ [id: INamespace['id']]: boolean }>({})
|
const projectUpdating = ref<{ [id: INamespace['id']]: boolean }>({})
|
||||||
|
|
||||||
async function saveListPosition(e: SortableEvent) {
|
async function saveListPosition(e: SortableEvent) {
|
||||||
if (!e.newIndex && e.newIndex !== 0) return
|
if (!e.newIndex && e.newIndex !== 0) return
|
||||||
|
@ -242,31 +242,31 @@ async function saveListPosition(e: SortableEvent) {
|
||||||
const namespaceId = parseInt(e.to.dataset.namespaceId as string)
|
const namespaceId = parseInt(e.to.dataset.namespaceId as string)
|
||||||
const newNamespaceIndex = parseInt(e.to.dataset.namespaceIndex as string)
|
const newNamespaceIndex = parseInt(e.to.dataset.namespaceIndex as string)
|
||||||
|
|
||||||
const listsActive = activeLists.value[newNamespaceIndex]
|
const projectsActive = activeProjects.value[newNamespaceIndex]
|
||||||
// If the list was dragged to the last position, Safari will report e.newIndex as the size of the listsActive
|
// If the project was dragged to the last position, Safari will report e.newIndex as the size of the projectsActive
|
||||||
// array instead of using the position. Because the index is wrong in that case, dragging the list will fail.
|
// array instead of using the position. Because the index is wrong in that case, dragging the project will fail.
|
||||||
// To work around that we're explicitly checking that case here and decrease the index.
|
// To work around that we're explicitly checking that case here and decrease the index.
|
||||||
const newIndex = e.newIndex === listsActive.length ? e.newIndex - 1 : e.newIndex
|
const newIndex = e.newIndex === projectsActive.length ? e.newIndex - 1 : e.newIndex
|
||||||
|
|
||||||
const list = listsActive[newIndex]
|
const project = projectsActive[newIndex]
|
||||||
const listBefore = listsActive[newIndex - 1] ?? null
|
const projectBefore = projectsActive[newIndex - 1] ?? null
|
||||||
const listAfter = listsActive[newIndex + 1] ?? null
|
const projectAfter = projectsActive[newIndex + 1] ?? null
|
||||||
listUpdating.value[list.id] = true
|
projectUpdating.value[project.id] = true
|
||||||
|
|
||||||
const position = calculateItemPosition(
|
const position = calculateItemPosition(
|
||||||
listBefore !== null ? listBefore.position : null,
|
projectBefore !== null ? projectBefore.position : null,
|
||||||
listAfter !== null ? listAfter.position : null,
|
projectAfter !== null ? projectAfter.position : null,
|
||||||
)
|
)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// create a copy of the list in order to not violate pinia manipulation
|
// create a copy of the project in order to not violate pinia manipulation
|
||||||
await listStore.updateList({
|
await projectStore.updateProject({
|
||||||
...list,
|
...project,
|
||||||
position,
|
position,
|
||||||
namespaceId,
|
namespaceId,
|
||||||
})
|
})
|
||||||
} finally {
|
} finally {
|
||||||
listUpdating.value[list.id] = false
|
projectUpdating.value[project.id] = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -342,13 +342,20 @@ $vikunja-nav-selected-width: 0.4rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.menu-list-dropdown {
|
.menu-list-dropdown {
|
||||||
opacity: 0;
|
opacity: 1;
|
||||||
transition: $transition;
|
transition: $transition;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover .menu-list-dropdown {
|
@media(hover: hover) and (pointer: fine) {
|
||||||
opacity: 1;
|
.menu-list-dropdown {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover .menu-list-dropdown {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.menu-item-icon {
|
.menu-item-icon {
|
||||||
|
@ -418,7 +425,6 @@ $vikunja-nav-selected-width: 0.4rem;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&:not(.dragging-disabled) .handle {
|
&:not(.dragging-disabled) .handle {
|
||||||
cursor: grab;
|
cursor: grab;
|
||||||
}
|
}
|
||||||
|
@ -427,7 +433,7 @@ $vikunja-nav-selected-width: 0.4rem;
|
||||||
|
|
||||||
.top-menu {
|
.top-menu {
|
||||||
margin-top: math.div($navbar-padding, 2);
|
margin-top: math.div($navbar-padding, 2);
|
||||||
|
|
||||||
.menu-list {
|
.menu-list {
|
||||||
li {
|
li {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
@ -482,17 +488,24 @@ $vikunja-nav-selected-width: 0.4rem;
|
||||||
.favorite {
|
.favorite {
|
||||||
margin-left: .25rem;
|
margin-left: .25rem;
|
||||||
transition: opacity $transition, color $transition;
|
transition: opacity $transition, color $transition;
|
||||||
opacity: 0;
|
opacity: 1;
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&.is-favorite {
|
&.is-favorite {
|
||||||
color: var(--warning);
|
color: var(--warning);
|
||||||
|
opacity: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.favorite.is-favorite,
|
|
||||||
.list-menu:hover .favorite {
|
@media(hover: hover) and (pointer: fine) {
|
||||||
opacity: 1;
|
.list-menu .favorite {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-menu:hover .favorite,
|
||||||
|
.favorite.is-favorite {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-menu-title {
|
.list-menu-title {
|
||||||
|
|
|
@ -1,63 +0,0 @@
|
||||||
<template>
|
|
||||||
<multiselect
|
|
||||||
v-model="selectedLists"
|
|
||||||
:search-results="foundLists"
|
|
||||||
:loading="listService.loading"
|
|
||||||
:multiple="true"
|
|
||||||
:placeholder="$t('list.search')"
|
|
||||||
label="title"
|
|
||||||
@search="findLists"
|
|
||||||
/>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
import {computed, ref, shallowReactive, watchEffect, type PropType} from 'vue'
|
|
||||||
|
|
||||||
import Multiselect from '@/components/input/multiselect.vue'
|
|
||||||
|
|
||||||
import type {IList} from '@/modelTypes/IList'
|
|
||||||
|
|
||||||
import ListService from '@/services/list'
|
|
||||||
import {includesById} from '@/helpers/utils'
|
|
||||||
|
|
||||||
const props = defineProps({
|
|
||||||
modelValue: {
|
|
||||||
type: Array as PropType<IList[]>,
|
|
||||||
default: () => [],
|
|
||||||
},
|
|
||||||
})
|
|
||||||
const emit = defineEmits<{
|
|
||||||
(e: 'update:modelValue', value: IList[]): void
|
|
||||||
}>()
|
|
||||||
|
|
||||||
const lists = ref<IList[]>([])
|
|
||||||
|
|
||||||
watchEffect(() => {
|
|
||||||
lists.value = props.modelValue
|
|
||||||
})
|
|
||||||
|
|
||||||
const selectedLists = computed({
|
|
||||||
get() {
|
|
||||||
return lists.value
|
|
||||||
},
|
|
||||||
set: (value) => {
|
|
||||||
lists.value = value
|
|
||||||
emit('update:modelValue', value)
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const listService = shallowReactive(new ListService())
|
|
||||||
const foundLists = ref<IList[]>([])
|
|
||||||
|
|
||||||
async function findLists(query: string) {
|
|
||||||
if (query === '') {
|
|
||||||
foundLists.value = []
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const response = await listService.getAll({}, {s: query}) as IList[]
|
|
||||||
|
|
||||||
// Filter selected items from the results
|
|
||||||
foundLists.value = response.filter(({id}) => !includesById(lists.value, id))
|
|
||||||
}
|
|
||||||
</script>
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
<template>
|
||||||
|
<multiselect
|
||||||
|
v-model="selectedProjects"
|
||||||
|
:search-results="foundProjects"
|
||||||
|
:loading="projectService.loading"
|
||||||
|
:multiple="true"
|
||||||
|
:placeholder="$t('project.search')"
|
||||||
|
label="title"
|
||||||
|
@search="findProjects"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import {computed, ref, shallowReactive, watchEffect, type PropType} from 'vue'
|
||||||
|
|
||||||
|
import Multiselect from '@/components/input/multiselect.vue'
|
||||||
|
|
||||||
|
import type {IProject} from '@/modelTypes/IProject'
|
||||||
|
|
||||||
|
import ProjectService from '@/services/project'
|
||||||
|
import {includesById} from '@/helpers/utils'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
modelValue: {
|
||||||
|
type: Array as PropType<IProject[]>,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
const emit = defineEmits<{
|
||||||
|
(e: 'update:modelValue', value: IProject[]): void
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const projects = ref<IProject[]>([])
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
projects.value = props.modelValue
|
||||||
|
})
|
||||||
|
|
||||||
|
const selectedProjects = computed({
|
||||||
|
get() {
|
||||||
|
return projects.value
|
||||||
|
},
|
||||||
|
set: (value) => {
|
||||||
|
projects.value = value
|
||||||
|
emit('update:modelValue', value)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const projectService = shallowReactive(new ProjectService())
|
||||||
|
const foundProjects = ref<IProject[]>([])
|
||||||
|
|
||||||
|
async function findProjects(query: string) {
|
||||||
|
if (query === '') {
|
||||||
|
foundProjects.value = []
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await projectService.getAll({}, {s: query}) as IProject[]
|
||||||
|
|
||||||
|
// Filter selected items from the results
|
||||||
|
foundProjects.value = response.filter(({id}) => !includesById(projects.value, id))
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -286,11 +286,11 @@ function handleCheckboxClick(e: Event) {
|
||||||
console.debug('no index found')
|
console.debug('no index found')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const listPrefix = text.value.substring(index, index + 1)
|
const projectPrefix = text.value.substring(index, index + 1)
|
||||||
|
|
||||||
console.debug({index, listPrefix, checked, text: text.value})
|
console.debug({index, projectPrefix, checked, text: text.value})
|
||||||
|
|
||||||
text.value = replaceAt(text.value, index, `${listPrefix} ${checked ? '[x]' : '[ ]'} `)
|
text.value = replaceAt(text.value, index, `${projectPrefix} ${checked ? '[x]' : '[ ]'} `)
|
||||||
bubble()
|
bubble()
|
||||||
renderPreview()
|
renderPreview()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,200 +0,0 @@
|
||||||
<template>
|
|
||||||
<div
|
|
||||||
:class="{ 'is-loading': listService.loading, 'is-archived': currentList.isArchived}"
|
|
||||||
class="loader-container"
|
|
||||||
>
|
|
||||||
<div class="switch-view-container">
|
|
||||||
<div class="switch-view">
|
|
||||||
<BaseButton
|
|
||||||
v-shortcut="'g l'"
|
|
||||||
:title="$t('keyboardShortcuts.list.switchToListView')"
|
|
||||||
class="switch-view-button"
|
|
||||||
:class="{'is-active': viewName === 'list'}"
|
|
||||||
:to="{ name: 'list.list', params: { listId } }"
|
|
||||||
>
|
|
||||||
{{ $t('list.list.title') }}
|
|
||||||
</BaseButton>
|
|
||||||
<BaseButton
|
|
||||||
v-shortcut="'g g'"
|
|
||||||
:title="$t('keyboardShortcuts.list.switchToGanttView')"
|
|
||||||
class="switch-view-button"
|
|
||||||
:class="{'is-active': viewName === 'gantt'}"
|
|
||||||
:to="{ name: 'list.gantt', params: { listId } }"
|
|
||||||
>
|
|
||||||
{{ $t('list.gantt.title') }}
|
|
||||||
</BaseButton>
|
|
||||||
<BaseButton
|
|
||||||
v-shortcut="'g t'"
|
|
||||||
:title="$t('keyboardShortcuts.list.switchToTableView')"
|
|
||||||
class="switch-view-button"
|
|
||||||
:class="{'is-active': viewName === 'table'}"
|
|
||||||
:to="{ name: 'list.table', params: { listId } }"
|
|
||||||
>
|
|
||||||
{{ $t('list.table.title') }}
|
|
||||||
</BaseButton>
|
|
||||||
<BaseButton
|
|
||||||
v-shortcut="'g k'"
|
|
||||||
:title="$t('keyboardShortcuts.list.switchToKanbanView')"
|
|
||||||
class="switch-view-button"
|
|
||||||
:class="{'is-active': viewName === 'kanban'}"
|
|
||||||
:to="{ name: 'list.kanban', params: { listId } }"
|
|
||||||
>
|
|
||||||
{{ $t('list.kanban.title') }}
|
|
||||||
</BaseButton>
|
|
||||||
</div>
|
|
||||||
<slot name="header" />
|
|
||||||
</div>
|
|
||||||
<CustomTransition name="fade">
|
|
||||||
<Message variant="warning" v-if="currentList.isArchived" class="mb-4">
|
|
||||||
{{ $t('list.archived') }}
|
|
||||||
</Message>
|
|
||||||
</CustomTransition>
|
|
||||||
|
|
||||||
<slot v-if="loadedListId"/>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
import {ref, computed, watch} from 'vue'
|
|
||||||
import {useRoute} from 'vue-router'
|
|
||||||
|
|
||||||
import BaseButton from '@/components/base/BaseButton.vue'
|
|
||||||
import Message from '@/components/misc/message.vue'
|
|
||||||
import CustomTransition from '@/components/misc/CustomTransition.vue'
|
|
||||||
|
|
||||||
import ListModel from '@/models/list'
|
|
||||||
import ListService from '@/services/list'
|
|
||||||
|
|
||||||
import {getListTitle} from '@/helpers/getListTitle'
|
|
||||||
import {saveListToHistory} from '@/modules/listHistory'
|
|
||||||
import {useTitle} from '@/composables/useTitle'
|
|
||||||
|
|
||||||
import {useBaseStore} from '@/stores/base'
|
|
||||||
import {useListStore} from '@/stores/lists'
|
|
||||||
|
|
||||||
const props = defineProps({
|
|
||||||
listId: {
|
|
||||||
type: Number,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
viewName: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const route = useRoute()
|
|
||||||
|
|
||||||
const baseStore = useBaseStore()
|
|
||||||
const listStore = useListStore()
|
|
||||||
const listService = ref(new ListService())
|
|
||||||
const loadedListId = ref(0)
|
|
||||||
|
|
||||||
const currentList = computed(() => {
|
|
||||||
return typeof baseStore.currentList === 'undefined' ? {
|
|
||||||
id: 0,
|
|
||||||
title: '',
|
|
||||||
isArchived: false,
|
|
||||||
maxRight: null,
|
|
||||||
} : baseStore.currentList
|
|
||||||
})
|
|
||||||
useTitle(() => currentList.value.id ? getListTitle(currentList.value) : '')
|
|
||||||
|
|
||||||
// watchEffect would be called every time the prop would get a value assigned, even if that value was the same as before.
|
|
||||||
// This resulted in loading and setting the list multiple times, even when navigating away from it.
|
|
||||||
// This caused wired bugs where the list background would be set on the home page but only right after setting a new
|
|
||||||
// list background and then navigating to home. It also highlighted the list in the menu and didn't allow changing any
|
|
||||||
// of it, most likely due to the rights not being properly populated.
|
|
||||||
watch(
|
|
||||||
() => props.listId,
|
|
||||||
// loadList
|
|
||||||
async (listIdToLoad: number) => {
|
|
||||||
const listData = {id: listIdToLoad}
|
|
||||||
saveListToHistory(listData)
|
|
||||||
|
|
||||||
// Don't load the list if we either already loaded it or aren't dealing with a list at all currently and
|
|
||||||
// the currently loaded list has the right set.
|
|
||||||
if (
|
|
||||||
(
|
|
||||||
listIdToLoad === loadedListId.value ||
|
|
||||||
typeof listIdToLoad === 'undefined' ||
|
|
||||||
listIdToLoad === currentList.value.id
|
|
||||||
)
|
|
||||||
&& typeof currentList.value !== 'undefined' && currentList.value.maxRight !== null
|
|
||||||
) {
|
|
||||||
loadedListId.value = props.listId
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
console.debug(`Loading list, props.viewName = ${props.viewName}, $route.params =`, route.params, `, loadedListId = ${loadedListId.value}, currentList = `, currentList.value)
|
|
||||||
|
|
||||||
// Set the current list to the one we're about to load so that the title is already shown at the top
|
|
||||||
loadedListId.value = 0
|
|
||||||
const listFromStore = listStore.getListById(listData.id)
|
|
||||||
if (listFromStore !== null) {
|
|
||||||
baseStore.setBackground(null)
|
|
||||||
baseStore.setBlurHash(null)
|
|
||||||
baseStore.handleSetCurrentList({list: listFromStore})
|
|
||||||
}
|
|
||||||
|
|
||||||
// We create an extra list object instead of creating it in list.value because that would trigger a ui update which would result in bad ux.
|
|
||||||
const list = new ListModel(listData)
|
|
||||||
try {
|
|
||||||
const loadedList = await listService.value.get(list)
|
|
||||||
baseStore.handleSetCurrentList({list: loadedList})
|
|
||||||
} finally {
|
|
||||||
loadedListId.value = props.listId
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{immediate: true},
|
|
||||||
)
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.switch-view-container {
|
|
||||||
@media screen and (max-width: $tablet) {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.switch-view {
|
|
||||||
background: var(--white);
|
|
||||||
display: inline-flex;
|
|
||||||
border-radius: $radius;
|
|
||||||
font-size: .75rem;
|
|
||||||
box-shadow: var(--shadow-sm);
|
|
||||||
height: $switch-view-height;
|
|
||||||
margin: 0 auto 1rem;
|
|
||||||
padding: .5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.switch-view-button {
|
|
||||||
padding: .25rem .5rem;
|
|
||||||
display: block;
|
|
||||||
border-radius: $radius;
|
|
||||||
transition: all 100ms;
|
|
||||||
|
|
||||||
&:not(:last-child) {
|
|
||||||
margin-right: .5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: var(--switch-view-color);
|
|
||||||
background: var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.is-active {
|
|
||||||
color: var(--switch-view-color);
|
|
||||||
background: var(--primary);
|
|
||||||
font-weight: bold;
|
|
||||||
box-shadow: var(--shadow-xs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: this should be in notification and set via a prop
|
|
||||||
.is-archived .notification.is-warning {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,77 +0,0 @@
|
||||||
<template>
|
|
||||||
<ul class="list-grid">
|
|
||||||
<li
|
|
||||||
v-for="(item, index) in filteredLists"
|
|
||||||
:key="`list_${item.id}_${index}`"
|
|
||||||
class="list-grid-item"
|
|
||||||
>
|
|
||||||
<ListCard :list="item" />
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts" setup>
|
|
||||||
import {computed, type PropType} from 'vue'
|
|
||||||
import type {IList} from '@/modelTypes/IList'
|
|
||||||
|
|
||||||
import ListCard from './ListCard.vue'
|
|
||||||
|
|
||||||
const props = defineProps({
|
|
||||||
lists: {
|
|
||||||
type: Array as PropType<IList[]>,
|
|
||||||
default: () => [],
|
|
||||||
},
|
|
||||||
showArchived: {
|
|
||||||
default: false,
|
|
||||||
type: Boolean,
|
|
||||||
},
|
|
||||||
itemLimit: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const filteredLists = computed(() => {
|
|
||||||
return props.showArchived
|
|
||||||
? props.lists
|
|
||||||
: props.lists.filter(l => !l.isArchived)
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
$list-height: 150px;
|
|
||||||
$list-spacing: 1rem;
|
|
||||||
|
|
||||||
.list-grid {
|
|
||||||
margin: 0; // reset li
|
|
||||||
list-style-type: none;
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(var(--list-columns), 1fr);
|
|
||||||
grid-auto-rows: $list-height;
|
|
||||||
gap: $list-spacing;
|
|
||||||
|
|
||||||
@media screen and (min-width: $mobile) {
|
|
||||||
--list-rows: 4;
|
|
||||||
--list-columns: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: $mobile) and (max-width: $tablet) {
|
|
||||||
--list-columns: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: $tablet) and (max-width: $widescreen) {
|
|
||||||
--list-columns: 3;
|
|
||||||
--list-rows: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: $widescreen) {
|
|
||||||
--list-columns: 5;
|
|
||||||
--list-rows: 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.list-grid-item {
|
|
||||||
display: grid;
|
|
||||||
margin-top: 0; // remove padding coming form .content li + li
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<modal @close="close()">
|
<modal @close="close()">
|
||||||
<card class="has-background-white has-no-shadow keyboard-shortcuts" :title="$t('keyboardShortcuts.title')">
|
<card class="has-background-white keyboard-shortcuts" :shadow="false" :title="$t('keyboardShortcuts.title')">
|
||||||
<template v-for="(s, i) in shortcuts" :key="i">
|
<template v-for="(s, i) in shortcuts" :key="i">
|
||||||
<h3>{{ $t(s.title) }}</h3>
|
<h3>{{ $t(s.title) }}</h3>
|
||||||
|
|
||||||
|
|
|
@ -61,8 +61,8 @@ export const KEYBOARD_SHORTCUTS : ShortcutGroup[] = [
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'list.kanban.title',
|
title: 'project.kanban.title',
|
||||||
available: (route) => route.name === 'list.kanban',
|
available: (route) => route.name === 'project.kanban',
|
||||||
shortcuts: [
|
shortcuts: [
|
||||||
{
|
{
|
||||||
title: 'keyboardShortcuts.task.done',
|
title: 'keyboardShortcuts.task.done',
|
||||||
|
@ -71,26 +71,26 @@ export const KEYBOARD_SHORTCUTS : ShortcutGroup[] = [
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'keyboardShortcuts.list.title',
|
title: 'keyboardShortcuts.project.title',
|
||||||
available: (route) => (route.name as string)?.startsWith('list.'),
|
available: (route) => (route.name as string)?.startsWith('project.'),
|
||||||
shortcuts: [
|
shortcuts: [
|
||||||
{
|
{
|
||||||
title: 'keyboardShortcuts.list.switchToListView',
|
title: 'keyboardShortcuts.project.switchToListView',
|
||||||
keys: ['g', 'l'],
|
keys: ['g', 'l'],
|
||||||
combination: 'then',
|
combination: 'then',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'keyboardShortcuts.list.switchToGanttView',
|
title: 'keyboardShortcuts.project.switchToGanttView',
|
||||||
keys: ['g', 'g'],
|
keys: ['g', 'g'],
|
||||||
combination: 'then',
|
combination: 'then',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'keyboardShortcuts.list.switchToTableView',
|
title: 'keyboardShortcuts.project.switchToTableView',
|
||||||
keys: ['g', 't'],
|
keys: ['g', 't'],
|
||||||
combination: 'then',
|
combination: 'then',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'keyboardShortcuts.list.switchToKanbanView',
|
title: 'keyboardShortcuts.project.switchToKanbanView',
|
||||||
keys: ['g', 'k'],
|
keys: ['g', 'k'],
|
||||||
combination: 'then',
|
combination: 'then',
|
||||||
},
|
},
|
||||||
|
|
|
@ -63,7 +63,7 @@ const route = useRoute()
|
||||||
const baseStore = useBaseStore()
|
const baseStore = useBaseStore()
|
||||||
|
|
||||||
const ready = computed(() => baseStore.ready)
|
const ready = computed(() => baseStore.ready)
|
||||||
const online = useOnline()
|
const online = true
|
||||||
|
|
||||||
const error = ref('')
|
const error = ref('')
|
||||||
const showLoading = computed(() => !ready.value && error.value === '')
|
const showLoading = computed(() => !ready.value && error.value === '')
|
||||||
|
|
|
@ -73,14 +73,14 @@ const {t} = useI18n({useScope: 'global'})
|
||||||
|
|
||||||
const tooltipText = computed(() => {
|
const tooltipText = computed(() => {
|
||||||
if (disabled.value) {
|
if (disabled.value) {
|
||||||
if (props.entity === 'list' && subscriptionEntity.value === 'namespace') {
|
if (props.entity === 'project' && subscriptionEntity.value === 'namespace') {
|
||||||
return t('task.subscription.subscribedListThroughParentNamespace')
|
return t('task.subscription.subscribedProjectThroughParentNamespace')
|
||||||
}
|
}
|
||||||
if (props.entity === 'task' && subscriptionEntity.value === 'namespace') {
|
if (props.entity === 'task' && subscriptionEntity.value === 'namespace') {
|
||||||
return t('task.subscription.subscribedTaskThroughParentNamespace')
|
return t('task.subscription.subscribedTaskThroughParentNamespace')
|
||||||
}
|
}
|
||||||
if (props.entity === 'task' && subscriptionEntity.value === 'list') {
|
if (props.entity === 'task' && subscriptionEntity.value === 'project') {
|
||||||
return t('task.subscription.subscribedTaskThroughParentList')
|
return t('task.subscription.subscribedTaskThroughParentProject')
|
||||||
}
|
}
|
||||||
|
|
||||||
return ''
|
return ''
|
||||||
|
@ -91,10 +91,10 @@ const tooltipText = computed(() => {
|
||||||
return props.modelValue !== null ?
|
return props.modelValue !== null ?
|
||||||
t('task.subscription.subscribedNamespace') :
|
t('task.subscription.subscribedNamespace') :
|
||||||
t('task.subscription.notSubscribedNamespace')
|
t('task.subscription.notSubscribedNamespace')
|
||||||
case 'list':
|
case 'project':
|
||||||
return props.modelValue !== null ?
|
return props.modelValue !== null ?
|
||||||
t('task.subscription.subscribedList') :
|
t('task.subscription.subscribedProject') :
|
||||||
t('task.subscription.notSubscribedList')
|
t('task.subscription.notSubscribedProject')
|
||||||
case 'task':
|
case 'task':
|
||||||
return props.modelValue !== null ?
|
return props.modelValue !== null ?
|
||||||
t('task.subscription.subscribedTask') :
|
t('task.subscription.subscribedTask') :
|
||||||
|
@ -133,8 +133,8 @@ async function subscribe() {
|
||||||
case 'namespace':
|
case 'namespace':
|
||||||
message = t('task.subscription.subscribeSuccessNamespace')
|
message = t('task.subscription.subscribeSuccessNamespace')
|
||||||
break
|
break
|
||||||
case 'list':
|
case 'project':
|
||||||
message = t('task.subscription.subscribeSuccessList')
|
message = t('task.subscription.subscribeSuccessProject')
|
||||||
break
|
break
|
||||||
case 'task':
|
case 'task':
|
||||||
message = t('task.subscription.subscribeSuccessTask')
|
message = t('task.subscription.subscribeSuccessTask')
|
||||||
|
@ -156,8 +156,8 @@ async function unsubscribe() {
|
||||||
case 'namespace':
|
case 'namespace':
|
||||||
message = t('task.subscription.unsubscribeSuccessNamespace')
|
message = t('task.subscription.unsubscribeSuccessNamespace')
|
||||||
break
|
break
|
||||||
case 'list':
|
case 'project':
|
||||||
message = t('task.subscription.unsubscribeSuccessList')
|
message = t('task.subscription.unsubscribeSuccessProject')
|
||||||
break
|
break
|
||||||
case 'task':
|
case 'task':
|
||||||
message = t('task.subscription.unsubscribeSuccessTask')
|
message = t('task.subscription.unsubscribeSuccessTask')
|
||||||
|
|
|
@ -30,10 +30,10 @@
|
||||||
{{ $t('menu.share') }}
|
{{ $t('menu.share') }}
|
||||||
</dropdown-item>
|
</dropdown-item>
|
||||||
<dropdown-item
|
<dropdown-item
|
||||||
:to="{ name: 'list.create', params: { namespaceId: namespace.id } }"
|
:to="{ name: 'project.create', params: { namespaceId: namespace.id } }"
|
||||||
icon="plus"
|
icon="plus"
|
||||||
>
|
>
|
||||||
{{ $t('menu.newList') }}
|
{{ $t('menu.newProject') }}
|
||||||
</dropdown-item>
|
</dropdown-item>
|
||||||
<dropdown-item
|
<dropdown-item
|
||||||
:to="{ name: 'namespace.settings.archive', params: { id: namespace.id } }"
|
:to="{ name: 'namespace.settings.archive', params: { id: namespace.id } }"
|
||||||
|
|
|
@ -80,9 +80,9 @@ const userInfo = computed(() => authStore.info)
|
||||||
let interval: ReturnType<typeof setInterval>
|
let interval: ReturnType<typeof setInterval>
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
loadNotifications()
|
// loadNotifications()
|
||||||
document.addEventListener('click', hidePopup)
|
document.addEventListener('click', hidePopup)
|
||||||
interval = setInterval(loadNotifications, LOAD_NOTIFICATIONS_INTERVAL)
|
// interval = setInterval(loadNotifications, LOAD_NOTIFICATIONS_INTERVAL)
|
||||||
})
|
})
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
|
@ -117,9 +117,9 @@ function to(n, index) {
|
||||||
case names.TASK_DELETED:
|
case names.TASK_DELETED:
|
||||||
// Nothing
|
// Nothing
|
||||||
break
|
break
|
||||||
case names.LIST_CREATED:
|
case names.PROJECT_CREATED:
|
||||||
to.name = 'task.index'
|
to.name = 'task.index'
|
||||||
to.params.listId = n.notification.list.id
|
to.params.projectId = n.notification.project.id
|
||||||
break
|
break
|
||||||
case names.TEAM_MEMBER_ADDED:
|
case names.TEAM_MEMBER_ADDED:
|
||||||
to.name = 'teams.edit'
|
to.name = 'teams.edit'
|
||||||
|
|
|
@ -0,0 +1,200 @@
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
:class="{ 'is-loading': projectService.loading, 'is-archived': currentProject.isArchived}"
|
||||||
|
class="loader-container"
|
||||||
|
>
|
||||||
|
<div class="switch-view-container">
|
||||||
|
<div class="switch-view">
|
||||||
|
<BaseButton
|
||||||
|
v-shortcut="'g l'"
|
||||||
|
:title="$t('keyboardShortcuts.project.switchToListView')"
|
||||||
|
class="switch-view-button"
|
||||||
|
:class="{'is-active': viewName === 'project'}"
|
||||||
|
:to="{ name: 'project.list', params: { projectId } }"
|
||||||
|
>
|
||||||
|
{{ $t('project.list.title') }}
|
||||||
|
</BaseButton>
|
||||||
|
<BaseButton
|
||||||
|
v-shortcut="'g g'"
|
||||||
|
:title="$t('keyboardShortcuts.project.switchToGanttView')"
|
||||||
|
class="switch-view-button"
|
||||||
|
:class="{'is-active': viewName === 'gantt'}"
|
||||||
|
:to="{ name: 'project.gantt', params: { projectId } }"
|
||||||
|
>
|
||||||
|
{{ $t('project.gantt.title') }}
|
||||||
|
</BaseButton>
|
||||||
|
<BaseButton
|
||||||
|
v-shortcut="'g t'"
|
||||||
|
:title="$t('keyboardShortcuts.project.switchToTableView')"
|
||||||
|
class="switch-view-button"
|
||||||
|
:class="{'is-active': viewName === 'table'}"
|
||||||
|
:to="{ name: 'project.table', params: { projectId } }"
|
||||||
|
>
|
||||||
|
{{ $t('project.table.title') }}
|
||||||
|
</BaseButton>
|
||||||
|
<BaseButton
|
||||||
|
v-shortcut="'g k'"
|
||||||
|
:title="$t('keyboardShortcuts.project.switchToKanbanView')"
|
||||||
|
class="switch-view-button"
|
||||||
|
:class="{'is-active': viewName === 'kanban'}"
|
||||||
|
:to="{ name: 'project.kanban', params: { projectId } }"
|
||||||
|
>
|
||||||
|
{{ $t('project.kanban.title') }}
|
||||||
|
</BaseButton>
|
||||||
|
</div>
|
||||||
|
<slot name="header" />
|
||||||
|
</div>
|
||||||
|
<CustomTransition name="fade">
|
||||||
|
<Message variant="warning" v-if="currentProject.isArchived" class="mb-4">
|
||||||
|
{{ $t('project.archived') }}
|
||||||
|
</Message>
|
||||||
|
</CustomTransition>
|
||||||
|
|
||||||
|
<slot v-if="loadedProjectId"/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import {ref, computed, watch} from 'vue'
|
||||||
|
import {useRoute} from 'vue-router'
|
||||||
|
|
||||||
|
import BaseButton from '@/components/base/BaseButton.vue'
|
||||||
|
import Message from '@/components/misc/message.vue'
|
||||||
|
import CustomTransition from '@/components/misc/CustomTransition.vue'
|
||||||
|
|
||||||
|
import ProjectModel from '@/models/project'
|
||||||
|
import ProjectService from '@/services/project'
|
||||||
|
|
||||||
|
import {getProjectTitle} from '@/helpers/getProjectTitle'
|
||||||
|
import {saveProjectToHistory} from '@/modules/projectHistory'
|
||||||
|
import {useTitle} from '@/composables/useTitle'
|
||||||
|
|
||||||
|
import {useBaseStore} from '@/stores/base'
|
||||||
|
import {useProjectStore} from '@/stores/projects'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
projectId: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
viewName: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
|
const baseStore = useBaseStore()
|
||||||
|
const projectStore = useProjectStore()
|
||||||
|
const projectService = ref(new ProjectService())
|
||||||
|
const loadedProjectId = ref(0)
|
||||||
|
|
||||||
|
const currentProject = computed(() => {
|
||||||
|
return typeof baseStore.currentProject === 'undefined' ? {
|
||||||
|
id: 0,
|
||||||
|
title: '',
|
||||||
|
isArchived: false,
|
||||||
|
maxRight: null,
|
||||||
|
} : baseStore.currentProject
|
||||||
|
})
|
||||||
|
useTitle(() => currentProject.value.id ? getProjectTitle(currentProject.value) : '')
|
||||||
|
|
||||||
|
// watchEffect would be called every time the prop would get a value assigned, even if that value was the same as before.
|
||||||
|
// This resulted in loading and setting the project multiple times, even when navigating away from it.
|
||||||
|
// This caused wired bugs where the project background would be set on the home page but only right after setting a new
|
||||||
|
// project background and then navigating to home. It also highlighted the project in the menu and didn't allow changing any
|
||||||
|
// of it, most likely due to the rights not being properly populated.
|
||||||
|
watch(
|
||||||
|
() => props.projectId,
|
||||||
|
// loadProject
|
||||||
|
async (projectIdToLoad: number) => {
|
||||||
|
const projectData = {id: projectIdToLoad}
|
||||||
|
saveProjectToHistory(projectData)
|
||||||
|
|
||||||
|
// Don't load the project if we either already loaded it or aren't dealing with a project at all currently and
|
||||||
|
// the currently loaded project has the right set.
|
||||||
|
if (
|
||||||
|
(
|
||||||
|
projectIdToLoad === loadedProjectId.value ||
|
||||||
|
typeof projectIdToLoad === 'undefined' ||
|
||||||
|
projectIdToLoad === currentProject.value.id
|
||||||
|
)
|
||||||
|
&& typeof currentProject.value !== 'undefined' && currentProject.value.maxRight !== null
|
||||||
|
) {
|
||||||
|
loadedProjectId.value = props.projectId
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
console.debug(`Loading project, props.viewName = ${props.viewName}, $route.params =`, route.params, `, loadedProjectId = ${loadedProjectId.value}, currentProject = `, currentProject.value)
|
||||||
|
|
||||||
|
// Set the current project to the one we're about to load so that the title is already shown at the top
|
||||||
|
loadedProjectId.value = 0
|
||||||
|
const projectFromStore = projectStore.getProjectById(projectData.id)
|
||||||
|
if (projectFromStore !== null) {
|
||||||
|
baseStore.setBackground(null)
|
||||||
|
baseStore.setBlurHash(null)
|
||||||
|
baseStore.handleSetCurrentProject({project: projectFromStore})
|
||||||
|
}
|
||||||
|
|
||||||
|
// We create an extra project object instead of creating it in project.value because that would trigger a ui update which would result in bad ux.
|
||||||
|
const project = new ProjectModel(projectData)
|
||||||
|
try {
|
||||||
|
const loadedProject = await projectService.value.get(project)
|
||||||
|
baseStore.handleSetCurrentProject({project: loadedProject})
|
||||||
|
} finally {
|
||||||
|
loadedProjectId.value = props.projectId
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{immediate: true},
|
||||||
|
)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.switch-view-container {
|
||||||
|
@media screen and (max-width: $tablet) {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.switch-view {
|
||||||
|
background: var(--white);
|
||||||
|
display: inline-flex;
|
||||||
|
border-radius: $radius;
|
||||||
|
font-size: .75rem;
|
||||||
|
box-shadow: var(--shadow-sm);
|
||||||
|
height: $switch-view-height;
|
||||||
|
margin: 0 auto 1rem;
|
||||||
|
padding: .5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.switch-view-button {
|
||||||
|
padding: .25rem .5rem;
|
||||||
|
display: block;
|
||||||
|
border-radius: $radius;
|
||||||
|
transition: all 100ms;
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
margin-right: .5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--switch-view-color);
|
||||||
|
background: var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.is-active {
|
||||||
|
color: var(--switch-view-color);
|
||||||
|
background: var(--primary);
|
||||||
|
font-weight: bold;
|
||||||
|
box-shadow: var(--shadow-xs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: this should be in notification and set via a prop
|
||||||
|
.is-archived .notification.is-warning {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,39 +1,39 @@
|
||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="list-card"
|
class="project-card"
|
||||||
:class="{
|
:class="{
|
||||||
'has-light-text': background !== null,
|
'has-light-text': background !== null,
|
||||||
'has-background': blurHashUrl !== '' || background !== null
|
'has-background': blurHashUrl !== '' || background !== null
|
||||||
}"
|
}"
|
||||||
:style="{
|
:style="{
|
||||||
'border-left': list.hexColor ? `0.25rem solid ${list.hexColor}` : undefined,
|
'border-left': project.hexColor ? `0.25rem solid ${project.hexColor}` : undefined,
|
||||||
'background-image': blurHashUrl !== '' ? `url(${blurHashUrl})` : undefined,
|
'background-image': blurHashUrl !== '' ? `url(${blurHashUrl})` : undefined,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="list-background background-fade-in"
|
class="project-background background-fade-in"
|
||||||
:class="{'is-visible': background}"
|
:class="{'is-visible': background}"
|
||||||
:style="{'background-image': background !== null ? `url(${background})` : undefined}"
|
:style="{'background-image': background !== null ? `url(${background})` : undefined}"
|
||||||
/>
|
/>
|
||||||
<span v-if="list.isArchived" class="is-archived" >{{ $t('namespace.archived') }}</span>
|
<span v-if="project.isArchived" class="is-archived" >{{ $t('namespace.archived') }}</span>
|
||||||
|
|
||||||
<div class="list-title" aria-hidden="true">{{ list.title }}</div>
|
<div class="project-title" aria-hidden="true">{{ project.title }}</div>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="list-button"
|
class="project-button"
|
||||||
:aria-label="list.title"
|
:aria-label="project.title"
|
||||||
:title="list.description"
|
:title="project.description"
|
||||||
:to="{
|
:to="{
|
||||||
name: 'list.index',
|
name: 'project.index',
|
||||||
params: { listId: list.id}
|
params: { projectId: project.id}
|
||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
v-if="!list.isArchived"
|
v-if="!project.isArchived"
|
||||||
class="favorite"
|
class="favorite"
|
||||||
:class="{'is-favorite': list.isFavorite}"
|
:class="{'is-favorite': project.isFavorite}"
|
||||||
@click.prevent.stop="listStore.toggleListFavorite(list)"
|
@click.prevent.stop="projectStore.toggleProjectFavorite(project)"
|
||||||
>
|
>
|
||||||
<icon :icon="list.isFavorite ? 'star' : ['far', 'star']" />
|
<icon :icon="project.isFavorite ? 'star' : ['far', 'star']" />
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -41,30 +41,30 @@
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import {toRef, type PropType} from 'vue'
|
import {toRef, type PropType} from 'vue'
|
||||||
|
|
||||||
import type {IList} from '@/modelTypes/IList'
|
import type {IProject} from '@/modelTypes/IProject'
|
||||||
|
|
||||||
import BaseButton from '@/components/base/BaseButton.vue'
|
import BaseButton from '@/components/base/BaseButton.vue'
|
||||||
|
|
||||||
import {useListBackground} from './useListBackground'
|
import {useProjectBackground} from './useProjectBackground'
|
||||||
import {useListStore} from '@/stores/lists'
|
import {useProjectStore} from '@/stores/projects'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
list: {
|
project: {
|
||||||
type: Object as PropType<IList>,
|
type: Object as PropType<IProject>,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const {background, blurHashUrl} = useListBackground(toRef(props, 'list'))
|
const {background, blurHashUrl} = useProjectBackground(toRef(props, 'project'))
|
||||||
|
|
||||||
const listStore = useListStore()
|
const projectStore = useProjectStore()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.list-card {
|
.project-card {
|
||||||
--list-card-padding: 1rem;
|
--project-card-padding: 1rem;
|
||||||
background: var(--white);
|
background: var(--white);
|
||||||
padding: var(--list-card-padding);
|
padding: var(--project-card-padding);
|
||||||
border-radius: $radius;
|
border-radius: $radius;
|
||||||
box-shadow: var(--shadow-sm);
|
box-shadow: var(--shadow-sm);
|
||||||
transition: box-shadow $transition;
|
transition: box-shadow $transition;
|
||||||
|
@ -91,14 +91,14 @@ const listStore = useListStore()
|
||||||
}
|
}
|
||||||
|
|
||||||
.has-background,
|
.has-background,
|
||||||
.list-background {
|
.project-background {
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-background,
|
.project-background,
|
||||||
.list-button {
|
.project-button {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
|
@ -111,7 +111,7 @@ const listStore = useListStore()
|
||||||
float: left;
|
float: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-title {
|
.project-title {
|
||||||
align-self: flex-end;
|
align-self: flex-end;
|
||||||
font-family: $vikunja-font;
|
font-family: $vikunja-font;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
|
@ -120,7 +120,7 @@ const listStore = useListStore()
|
||||||
color: var(--text);
|
color: var(--text);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
max-height: calc(100% - (var(--list-card-padding) + 1rem)); // padding & height of the "is archived" badge
|
max-height: calc(100% - (var(--project-card-padding) + 1rem)); // padding & height of the "is archived" badge
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
|
@ -130,11 +130,11 @@ const listStore = useListStore()
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
}
|
}
|
||||||
|
|
||||||
.has-light-text .list-title {
|
.has-light-text .project-title {
|
||||||
color: var(--grey-100);
|
color: var(--grey-100);
|
||||||
}
|
}
|
||||||
|
|
||||||
.has-background .list-title {
|
.has-background .project-title {
|
||||||
text-shadow:
|
text-shadow:
|
||||||
0 0 10px var(--black),
|
0 0 10px var(--black),
|
||||||
1px 1px 5px var(--grey-700),
|
1px 1px 5px var(--grey-700),
|
||||||
|
@ -144,10 +144,10 @@ const listStore = useListStore()
|
||||||
|
|
||||||
.favorite {
|
.favorite {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: var(--list-card-padding);
|
top: var(--project-card-padding);
|
||||||
right: var(--list-card-padding);
|
right: var(--project-card-padding);
|
||||||
transition: opacity $transition, color $transition;
|
transition: opacity $transition, color $transition;
|
||||||
opacity: 0;
|
opacity: 1;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: var(--warning);
|
color: var(--warning);
|
||||||
|
@ -160,8 +160,14 @@ const listStore = useListStore()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-card:hover .favorite {
|
@media(hover: hover) and (pointer: fine) {
|
||||||
opacity: 1;
|
.project-card .favorite {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-card:hover .favorite {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.background-fade-in {
|
.background-fade-in {
|
||||||
|
@ -173,4 +179,4 @@ const listStore = useListStore()
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
|
@ -0,0 +1,73 @@
|
||||||
|
<template>
|
||||||
|
<ul class="project-grid">
|
||||||
|
<li
|
||||||
|
v-for="(item, index) in filteredProjects"
|
||||||
|
:key="`project_${item.id}_${index}`"
|
||||||
|
class="project-grid-item"
|
||||||
|
>
|
||||||
|
<ProjectCard :project="item" />
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import {computed, type PropType} from 'vue'
|
||||||
|
import type {IProject} from '@/modelTypes/IProject'
|
||||||
|
|
||||||
|
import ProjectCard from './ProjectCard.vue'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
projects: {
|
||||||
|
type: Array as PropType<IProject[]>,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
showArchived: {
|
||||||
|
default: false,
|
||||||
|
type: Boolean,
|
||||||
|
},
|
||||||
|
itemLimit: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const filteredProjects = computed(() => {
|
||||||
|
return props.showArchived
|
||||||
|
? props.projects
|
||||||
|
: props.projects.filter(l => !l.isArchived)
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.project-grid {
|
||||||
|
--project-grid-item-height: 150px;
|
||||||
|
--project-grid-gap: 1rem;
|
||||||
|
margin: 0; // reset li
|
||||||
|
list-style-type: none;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(var(--project-grid-columns), 1fr);
|
||||||
|
grid-auto-rows: var(--project-grid-item-height);
|
||||||
|
gap: var(--project-grid-gap);
|
||||||
|
|
||||||
|
@media screen and (min-width: $mobile) {
|
||||||
|
--project-grid-columns: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: $mobile) and (max-width: $tablet) {
|
||||||
|
--project-grid-columns: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: $tablet) and (max-width: $widescreen) {
|
||||||
|
--project-grid-columns: 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: $widescreen) {
|
||||||
|
--project-grid-columns: 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-grid-item {
|
||||||
|
display: grid;
|
||||||
|
margin-top: 0; // remove padding coming form .content li + li
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -32,7 +32,7 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import {computed, ref, watch} from 'vue'
|
import {computed, ref, watch} from 'vue'
|
||||||
|
|
||||||
import Filters from '@/components/list/partials/filters.vue'
|
import Filters from '@/components/project/partials/filters.vue'
|
||||||
|
|
||||||
import {getDefaultParams} from '@/composables/useTaskList'
|
import {getDefaultParams} from '@/composables/useTaskList'
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
{{ $t('filters.attributes.showDoneTasks') }}
|
{{ $t('filters.attributes.showDoneTasks') }}
|
||||||
</fancycheckbox>
|
</fancycheckbox>
|
||||||
<fancycheckbox
|
<fancycheckbox
|
||||||
v-if="!['list.kanban', 'list.table'].includes($route.name as string)"
|
v-if="!['project.kanban', 'project.table'].includes($route.name as string)"
|
||||||
v-model="sortAlphabetically"
|
v-model="sortAlphabetically"
|
||||||
@update:model-value="change()"
|
@update:model-value="change()"
|
||||||
>
|
>
|
||||||
|
@ -154,14 +154,14 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<template
|
<template
|
||||||
v-if="['filters.create', 'list.edit', 'filter.settings.edit'].includes($route.name as string)">
|
v-if="['filters.create', 'project.edit', 'filter.settings.edit'].includes($route.name as string)">
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label class="label">{{ $t('list.lists') }}</label>
|
<label class="label">{{ $t('project.lists') }}</label>
|
||||||
<div class="control">
|
<div class="control">
|
||||||
<SelectList
|
<SelectProject
|
||||||
v-model="entities.lists"
|
v-model="entities.projects"
|
||||||
@select="changeMultiselectFilter('lists', 'list_id')"
|
@select="changeMultiselectFilter('projects', 'project_id')"
|
||||||
@remove="changeMultiselectFilter('lists', 'list_id')"
|
@remove="changeMultiselectFilter('projects', 'project_id')"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -190,7 +190,7 @@ import {camelCase} from 'camel-case'
|
||||||
import type {ILabel} from '@/modelTypes/ILabel'
|
import type {ILabel} from '@/modelTypes/ILabel'
|
||||||
import type {IUser} from '@/modelTypes/IUser'
|
import type {IUser} from '@/modelTypes/IUser'
|
||||||
import type {INamespace} from '@/modelTypes/INamespace'
|
import type {INamespace} from '@/modelTypes/INamespace'
|
||||||
import type {IList} from '@/modelTypes/IList'
|
import type {IProject} from '@/modelTypes/IProject'
|
||||||
|
|
||||||
import {useLabelStore} from '@/stores/labels'
|
import {useLabelStore} from '@/stores/labels'
|
||||||
|
|
||||||
|
@ -200,7 +200,7 @@ import PercentDoneSelect from '@/components/tasks/partials/percentDoneSelect.vue
|
||||||
import EditLabels from '@/components/tasks/partials/editLabels.vue'
|
import EditLabels from '@/components/tasks/partials/editLabels.vue'
|
||||||
import Fancycheckbox from '@/components/input/fancycheckbox.vue'
|
import Fancycheckbox from '@/components/input/fancycheckbox.vue'
|
||||||
import SelectUser from '@/components/input/SelectUser.vue'
|
import SelectUser from '@/components/input/SelectUser.vue'
|
||||||
import SelectList from '@/components/input/SelectList.vue'
|
import SelectProject from '@/components/input/SelectProject.vue'
|
||||||
import SelectNamespace from '@/components/input/SelectNamespace.vue'
|
import SelectNamespace from '@/components/input/SelectNamespace.vue'
|
||||||
|
|
||||||
import {parseDateOrString} from '@/helpers/time/parseDateOrString'
|
import {parseDateOrString} from '@/helpers/time/parseDateOrString'
|
||||||
|
@ -208,13 +208,13 @@ import {dateIsValid, formatISO} from '@/helpers/time/formatDate'
|
||||||
import {objectToSnakeCase} from '@/helpers/case'
|
import {objectToSnakeCase} from '@/helpers/case'
|
||||||
|
|
||||||
import UserService from '@/services/user'
|
import UserService from '@/services/user'
|
||||||
import ListService from '@/services/list'
|
import ProjectService from '@/services/project'
|
||||||
import NamespaceService from '@/services/namespace'
|
import NamespaceService from '@/services/namespace'
|
||||||
|
|
||||||
// FIXME: do not use this here for now. instead create new version from DEFAULT_PARAMS
|
// FIXME: do not use this here for now. instead create new version from DEFAULT_PARAMS
|
||||||
import {getDefaultParams} from '@/composables/useTaskList'
|
import {getDefaultParams} from '@/composables/useTaskList'
|
||||||
|
|
||||||
// FIXME: merge with DEFAULT_PARAMS in taskList.js
|
// FIXME: merge with DEFAULT_PARAMS in taskProject.js
|
||||||
const DEFAULT_PARAMS = {
|
const DEFAULT_PARAMS = {
|
||||||
sort_by: [],
|
sort_by: [],
|
||||||
order_by: [],
|
order_by: [],
|
||||||
|
@ -239,7 +239,7 @@ const DEFAULT_FILTERS = {
|
||||||
reminders: '',
|
reminders: '',
|
||||||
assignees: '',
|
assignees: '',
|
||||||
labels: '',
|
labels: '',
|
||||||
list_id: '',
|
project_id: '',
|
||||||
namespace: '',
|
namespace: '',
|
||||||
} as const
|
} as const
|
||||||
|
|
||||||
|
@ -264,23 +264,23 @@ const filters = ref({...DEFAULT_FILTERS})
|
||||||
|
|
||||||
const services = {
|
const services = {
|
||||||
users: shallowReactive(new UserService()),
|
users: shallowReactive(new UserService()),
|
||||||
lists: shallowReactive(new ListService()),
|
projects: shallowReactive(new ProjectService()),
|
||||||
namespace: shallowReactive(new NamespaceService()),
|
namespace: shallowReactive(new NamespaceService()),
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Entities {
|
interface Entities {
|
||||||
users: IUser[]
|
users: IUser[]
|
||||||
labels: ILabel[]
|
labels: ILabel[]
|
||||||
lists: IList[]
|
projects: IProject[]
|
||||||
namespace: INamespace[]
|
namespace: INamespace[]
|
||||||
}
|
}
|
||||||
|
|
||||||
type EntityType = 'users' | 'labels' | 'lists' | 'namespace'
|
type EntityType = 'users' | 'labels' | 'projects' | 'namespace'
|
||||||
|
|
||||||
const entities: Entities = reactive({
|
const entities: Entities = reactive({
|
||||||
users: [],
|
users: [],
|
||||||
labels: [],
|
labels: [],
|
||||||
lists: [],
|
projects: [],
|
||||||
namespace: [],
|
namespace: [],
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -327,7 +327,7 @@ function prepareFilters() {
|
||||||
prepareSingleValue('percent_done', 'percentDone', 'usePercentDone', true)
|
prepareSingleValue('percent_done', 'percentDone', 'usePercentDone', true)
|
||||||
prepareDate('reminders')
|
prepareDate('reminders')
|
||||||
prepareRelatedObjectFilter('users', 'assignees')
|
prepareRelatedObjectFilter('users', 'assignees')
|
||||||
prepareRelatedObjectFilter('lists', 'list_id')
|
prepareRelatedObjectFilter('projects', 'project_id')
|
||||||
prepareRelatedObjectFilter('namespace')
|
prepareRelatedObjectFilter('namespace')
|
||||||
|
|
||||||
prepareSingleValue('labels')
|
prepareSingleValue('labels')
|
|
@ -1,30 +1,30 @@
|
||||||
import {ref, watch, type Ref} from 'vue'
|
import {ref, watch, type Ref} from 'vue'
|
||||||
import ListService from '@/services/list'
|
import ProjectService from '@/services/project'
|
||||||
import type {IList} from '@/modelTypes/IList'
|
import type {IProject} from '@/modelTypes/IProject'
|
||||||
import {getBlobFromBlurHash} from '@/helpers/getBlobFromBlurHash'
|
import {getBlobFromBlurHash} from '@/helpers/getBlobFromBlurHash'
|
||||||
|
|
||||||
export function useListBackground(list: Ref<IList>) {
|
export function useProjectBackground(project: Ref<IProject>) {
|
||||||
const background = ref<string | null>(null)
|
const background = ref<string | null>(null)
|
||||||
const backgroundLoading = ref(false)
|
const backgroundLoading = ref(false)
|
||||||
const blurHashUrl = ref('')
|
const blurHashUrl = ref('')
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => [list.value.id, list.value.backgroundBlurHash] as [IList['id'], IList['backgroundBlurHash']],
|
() => [project.value.id, project.value.backgroundBlurHash] as [IProject['id'], IProject['backgroundBlurHash']],
|
||||||
async ([listId, blurHash], oldValue) => {
|
async ([projectId, blurHash], oldValue) => {
|
||||||
if (
|
if (
|
||||||
list.value === null ||
|
project.value === null ||
|
||||||
!list.value.backgroundInformation ||
|
!project.value.backgroundInformation ||
|
||||||
backgroundLoading.value
|
backgroundLoading.value
|
||||||
) {
|
) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const [oldListId, oldBlurHash] = oldValue || []
|
const [oldProjectId, oldBlurHash] = oldValue || []
|
||||||
if (
|
if (
|
||||||
oldValue !== undefined &&
|
oldValue !== undefined &&
|
||||||
listId === oldListId && blurHash === oldBlurHash
|
projectId === oldProjectId && blurHash === oldBlurHash
|
||||||
) {
|
) {
|
||||||
// list hasn't changed
|
// project hasn't changed
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,8 +35,8 @@ export function useListBackground(list: Ref<IList>) {
|
||||||
blurHashUrl.value = blurHash ? window.URL.createObjectURL(blurHash) : ''
|
blurHashUrl.value = blurHash ? window.URL.createObjectURL(blurHash) : ''
|
||||||
})
|
})
|
||||||
|
|
||||||
const listService = new ListService()
|
const projectService = new ProjectService()
|
||||||
const backgroundPromise = listService.background(list.value).then((result) => {
|
const backgroundPromise = projectService.background(project.value).then((result) => {
|
||||||
background.value = result
|
background.value = result
|
||||||
})
|
})
|
||||||
await Promise.all([blurHashPromise, backgroundPromise])
|
await Promise.all([blurHashPromise, backgroundPromise])
|
||||||
|
@ -44,7 +44,7 @@ export function useListBackground(list: Ref<IList>) {
|
||||||
backgroundLoading.value = false
|
backgroundLoading.value = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ immediate: true },
|
{immediate: true},
|
||||||
)
|
)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -52,4 +52,4 @@ export function useListBackground(list: Ref<IList>) {
|
||||||
blurHashUrl,
|
blurHashUrl,
|
||||||
backgroundLoading,
|
backgroundLoading,
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -8,24 +8,24 @@
|
||||||
</slot>
|
</slot>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="isSavedFilter(list)">
|
<template v-if="isSavedFilter(project)">
|
||||||
<dropdown-item
|
<dropdown-item
|
||||||
:to="{ name: 'filter.settings.edit', params: { listId: list.id } }"
|
:to="{ name: 'filter.settings.edit', params: { projectId: project.id } }"
|
||||||
icon="pen"
|
icon="pen"
|
||||||
>
|
>
|
||||||
{{ $t('menu.edit') }}
|
{{ $t('menu.edit') }}
|
||||||
</dropdown-item>
|
</dropdown-item>
|
||||||
<dropdown-item
|
<dropdown-item
|
||||||
:to="{ name: 'filter.settings.delete', params: { listId: list.id } }"
|
:to="{ name: 'filter.settings.delete', params: { projectId: project.id } }"
|
||||||
icon="trash-alt"
|
icon="trash-alt"
|
||||||
>
|
>
|
||||||
{{ $t('misc.delete') }}
|
{{ $t('misc.delete') }}
|
||||||
</dropdown-item>
|
</dropdown-item>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-else-if="list.isArchived">
|
<template v-else-if="project.isArchived">
|
||||||
<dropdown-item
|
<dropdown-item
|
||||||
:to="{ name: 'list.settings.archive', params: { listId: list.id } }"
|
:to="{ name: 'project.settings.archive', params: { projectId: project.id } }"
|
||||||
icon="archive"
|
icon="archive"
|
||||||
>
|
>
|
||||||
{{ $t('menu.unarchive') }}
|
{{ $t('menu.unarchive') }}
|
||||||
|
@ -33,32 +33,32 @@
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<dropdown-item
|
<dropdown-item
|
||||||
:to="{ name: 'list.settings.edit', params: { listId: list.id } }"
|
:to="{ name: 'project.settings.edit', params: { projectId: project.id } }"
|
||||||
icon="pen"
|
icon="pen"
|
||||||
>
|
>
|
||||||
{{ $t('menu.edit') }}
|
{{ $t('menu.edit') }}
|
||||||
</dropdown-item>
|
</dropdown-item>
|
||||||
<dropdown-item
|
<dropdown-item
|
||||||
v-if="backgroundsEnabled"
|
v-if="backgroundsEnabled"
|
||||||
:to="{ name: 'list.settings.background', params: { listId: list.id } }"
|
:to="{ name: 'project.settings.background', params: { projectId: project.id } }"
|
||||||
icon="image"
|
icon="image"
|
||||||
>
|
>
|
||||||
{{ $t('menu.setBackground') }}
|
{{ $t('menu.setBackground') }}
|
||||||
</dropdown-item>
|
</dropdown-item>
|
||||||
<dropdown-item
|
<dropdown-item
|
||||||
:to="{ name: 'list.settings.share', params: { listId: list.id } }"
|
:to="{ name: 'project.settings.share', params: { projectId: project.id } }"
|
||||||
icon="share-alt"
|
icon="share-alt"
|
||||||
>
|
>
|
||||||
{{ $t('menu.share') }}
|
{{ $t('menu.share') }}
|
||||||
</dropdown-item>
|
</dropdown-item>
|
||||||
<dropdown-item
|
<dropdown-item
|
||||||
:to="{ name: 'list.settings.duplicate', params: { listId: list.id } }"
|
:to="{ name: 'project.settings.duplicate', params: { projectId: project.id } }"
|
||||||
icon="paste"
|
icon="paste"
|
||||||
>
|
>
|
||||||
{{ $t('menu.duplicate') }}
|
{{ $t('menu.duplicate') }}
|
||||||
</dropdown-item>
|
</dropdown-item>
|
||||||
<dropdown-item
|
<dropdown-item
|
||||||
:to="{ name: 'list.settings.archive', params: { listId: list.id } }"
|
:to="{ name: 'project.settings.archive', params: { projectId: project.id } }"
|
||||||
icon="archive"
|
icon="archive"
|
||||||
>
|
>
|
||||||
{{ $t('menu.archive') }}
|
{{ $t('menu.archive') }}
|
||||||
|
@ -66,14 +66,14 @@
|
||||||
<Subscription
|
<Subscription
|
||||||
class="has-no-shadow"
|
class="has-no-shadow"
|
||||||
:is-button="false"
|
:is-button="false"
|
||||||
entity="list"
|
entity="project"
|
||||||
:entity-id="list.id"
|
:entity-id="project.id"
|
||||||
:model-value="list.subscription"
|
:model-value="project.subscription"
|
||||||
@update:model-value="setSubscriptionInStore"
|
@update:model-value="setSubscriptionInStore"
|
||||||
type="dropdown"
|
type="dropdown"
|
||||||
/>
|
/>
|
||||||
<dropdown-item
|
<dropdown-item
|
||||||
:to="{ name: 'list.settings.delete', params: { listId: list.id } }"
|
:to="{ name: 'project.settings.delete', params: { projectId: project.id } }"
|
||||||
icon="trash-alt"
|
icon="trash-alt"
|
||||||
class="has-text-danger"
|
class="has-text-danger"
|
||||||
>
|
>
|
||||||
|
@ -90,26 +90,26 @@ import BaseButton from '@/components/base/BaseButton.vue'
|
||||||
import Dropdown from '@/components/misc/dropdown.vue'
|
import Dropdown from '@/components/misc/dropdown.vue'
|
||||||
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
||||||
import Subscription from '@/components/misc/subscription.vue'
|
import Subscription from '@/components/misc/subscription.vue'
|
||||||
import type {IList} from '@/modelTypes/IList'
|
import type {IProject} from '@/modelTypes/IProject'
|
||||||
import type {ISubscription} from '@/modelTypes/ISubscription'
|
import type {ISubscription} from '@/modelTypes/ISubscription'
|
||||||
|
|
||||||
import {isSavedFilter} from '@/services/savedFilter'
|
import {isSavedFilter} from '@/services/savedFilter'
|
||||||
import {useConfigStore} from '@/stores/config'
|
import {useConfigStore} from '@/stores/config'
|
||||||
import {useListStore} from '@/stores/lists'
|
import {useProjectStore} from '@/stores/projects'
|
||||||
import {useNamespaceStore} from '@/stores/namespaces'
|
import {useNamespaceStore} from '@/stores/namespaces'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
list: {
|
project: {
|
||||||
type: Object as PropType<IList>,
|
type: Object as PropType<IProject>,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const listStore = useListStore()
|
const projectStore = useProjectStore()
|
||||||
const namespaceStore = useNamespaceStore()
|
const namespaceStore = useNamespaceStore()
|
||||||
const subscription = ref<ISubscription | null>(null)
|
const subscription = ref<ISubscription | null>(null)
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
subscription.value = props.list.subscription ?? null
|
subscription.value = props.project.subscription ?? null
|
||||||
})
|
})
|
||||||
|
|
||||||
const configStore = useConfigStore()
|
const configStore = useConfigStore()
|
||||||
|
@ -117,11 +117,11 @@ const backgroundsEnabled = computed(() => configStore.enabledBackgroundProviders
|
||||||
|
|
||||||
function setSubscriptionInStore(sub: ISubscription) {
|
function setSubscriptionInStore(sub: ISubscription) {
|
||||||
subscription.value = sub
|
subscription.value = sub
|
||||||
const updatedList = {
|
const updatedProject = {
|
||||||
...props.list,
|
...props.project,
|
||||||
subscription: sub,
|
subscription: sub,
|
||||||
}
|
}
|
||||||
listStore.setList(updatedList)
|
projectStore.setProject(updatedProject)
|
||||||
namespaceStore.setListInNamespaceById(updatedList)
|
namespaceStore.setProjectInNamespaceById(updatedProject)
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
|
@ -63,18 +63,18 @@ import TeamService from '@/services/team'
|
||||||
|
|
||||||
import NamespaceModel from '@/models/namespace'
|
import NamespaceModel from '@/models/namespace'
|
||||||
import TeamModel from '@/models/team'
|
import TeamModel from '@/models/team'
|
||||||
import ListModel from '@/models/list'
|
import ProjectModel from '@/models/project'
|
||||||
|
|
||||||
import BaseButton from '@/components/base/BaseButton.vue'
|
import BaseButton from '@/components/base/BaseButton.vue'
|
||||||
import QuickAddMagic from '@/components/tasks/partials/quick-add-magic.vue'
|
import QuickAddMagic from '@/components/tasks/partials/quick-add-magic.vue'
|
||||||
|
|
||||||
import {useBaseStore} from '@/stores/base'
|
import {useBaseStore} from '@/stores/base'
|
||||||
import {useListStore} from '@/stores/lists'
|
import {useProjectStore} from '@/stores/projects'
|
||||||
import {useNamespaceStore} from '@/stores/namespaces'
|
import {useNamespaceStore} from '@/stores/namespaces'
|
||||||
import {useLabelStore} from '@/stores/labels'
|
import {useLabelStore} from '@/stores/labels'
|
||||||
import {useTaskStore} from '@/stores/tasks'
|
import {useTaskStore} from '@/stores/tasks'
|
||||||
|
|
||||||
import {getHistory} from '@/modules/listHistory'
|
import {getHistory} from '@/modules/projectHistory'
|
||||||
import {parseTaskText, PrefixMode, PREFIXES} from '@/modules/parseTaskText'
|
import {parseTaskText, PrefixMode, PREFIXES} from '@/modules/parseTaskText'
|
||||||
import {getQuickAddMagicMode} from '@/helpers/quickAddMagicMode'
|
import {getQuickAddMagicMode} from '@/helpers/quickAddMagicMode'
|
||||||
import {success} from '@/message'
|
import {success} from '@/message'
|
||||||
|
@ -82,13 +82,13 @@ import {success} from '@/message'
|
||||||
import type {ITeam} from '@/modelTypes/ITeam'
|
import type {ITeam} from '@/modelTypes/ITeam'
|
||||||
import type {ITask} from '@/modelTypes/ITask'
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
import type {INamespace} from '@/modelTypes/INamespace'
|
import type {INamespace} from '@/modelTypes/INamespace'
|
||||||
import type {IList} from '@/modelTypes/IList'
|
import type {IProject} from '@/modelTypes/IProject'
|
||||||
|
|
||||||
const {t} = useI18n({useScope: 'global'})
|
const {t} = useI18n({useScope: 'global'})
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
|
||||||
const baseStore = useBaseStore()
|
const baseStore = useBaseStore()
|
||||||
const listStore = useListStore()
|
const projectStore = useProjectStore()
|
||||||
const namespaceStore = useNamespaceStore()
|
const namespaceStore = useNamespaceStore()
|
||||||
const labelStore = useLabelStore()
|
const labelStore = useLabelStore()
|
||||||
const taskStore = useTaskStore()
|
const taskStore = useTaskStore()
|
||||||
|
@ -98,13 +98,13 @@ type DoAction<Type = any> = { type: ACTION_TYPE } & Type
|
||||||
enum ACTION_TYPE {
|
enum ACTION_TYPE {
|
||||||
CMD = 'cmd',
|
CMD = 'cmd',
|
||||||
TASK = 'task',
|
TASK = 'task',
|
||||||
LIST = 'list',
|
PROJECT = 'project',
|
||||||
TEAM = 'team',
|
TEAM = 'team',
|
||||||
}
|
}
|
||||||
|
|
||||||
enum COMMAND_TYPE {
|
enum COMMAND_TYPE {
|
||||||
NEW_TASK = 'newTask',
|
NEW_TASK = 'newTask',
|
||||||
NEW_LIST = 'newList',
|
NEW_PROJECT = 'newProject',
|
||||||
NEW_NAMESPACE = 'newNamespace',
|
NEW_NAMESPACE = 'newNamespace',
|
||||||
NEW_TEAM = 'newTeam',
|
NEW_TEAM = 'newTeam',
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,7 @@ enum COMMAND_TYPE {
|
||||||
enum SEARCH_MODE {
|
enum SEARCH_MODE {
|
||||||
ALL = 'all',
|
ALL = 'all',
|
||||||
TASKS = 'tasks',
|
TASKS = 'tasks',
|
||||||
LISTS = 'lists',
|
PROJECTS = 'projects',
|
||||||
TEAMS = 'teams',
|
TEAMS = 'teams',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,26 +137,26 @@ function closeQuickActions() {
|
||||||
baseStore.setQuickActionsActive(false)
|
baseStore.setQuickActionsActive(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
const foundLists = computed(() => {
|
const foundProjects = computed(() => {
|
||||||
const { list } = parsedQuery.value
|
const { project } = parsedQuery.value
|
||||||
if (
|
if (
|
||||||
searchMode.value === SEARCH_MODE.ALL ||
|
searchMode.value === SEARCH_MODE.ALL ||
|
||||||
searchMode.value === SEARCH_MODE.LISTS ||
|
searchMode.value === SEARCH_MODE.PROJECTS ||
|
||||||
list === null
|
project === null
|
||||||
) {
|
) {
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
|
|
||||||
const ncache: { [id: ListModel['id']]: INamespace } = {}
|
const ncache: { [id: ProjectModel['id']]: INamespace } = {}
|
||||||
const history = getHistory()
|
const history = getHistory()
|
||||||
const allLists = [
|
const allProjects = [
|
||||||
...new Set([
|
...new Set([
|
||||||
...history.map((l) => listStore.getListById(l.id)),
|
...history.map((l) => projectStore.getProjectById(l.id)),
|
||||||
...listStore.searchList(list),
|
...projectStore.searchProject(project),
|
||||||
]),
|
]),
|
||||||
]
|
]
|
||||||
|
|
||||||
return allLists.filter((l) => {
|
return allProjects.filter((l) => {
|
||||||
if (typeof l === 'undefined' || l === null) {
|
if (typeof l === 'undefined' || l === null) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -191,9 +191,9 @@ const results = computed<Result[]>(() => {
|
||||||
items: foundTasks.value,
|
items: foundTasks.value,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: ACTION_TYPE.LIST,
|
type: ACTION_TYPE.PROJECT,
|
||||||
title: t('quickActions.lists'),
|
title: t('quickActions.projects'),
|
||||||
items: foundLists.value,
|
items: foundProjects.value,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: ACTION_TYPE.TEAM,
|
type: ACTION_TYPE.TEAM,
|
||||||
|
@ -206,7 +206,7 @@ const results = computed<Result[]>(() => {
|
||||||
const loading = computed(() =>
|
const loading = computed(() =>
|
||||||
taskService.loading ||
|
taskService.loading ||
|
||||||
namespaceStore.isLoading ||
|
namespaceStore.isLoading ||
|
||||||
listStore.isLoading ||
|
projectStore.isLoading ||
|
||||||
teamService.loading,
|
teamService.loading,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -224,11 +224,11 @@ const commands = computed<{ [key in COMMAND_TYPE]: Command }>(() => ({
|
||||||
placeholder: t('quickActions.newTask'),
|
placeholder: t('quickActions.newTask'),
|
||||||
action: newTask,
|
action: newTask,
|
||||||
},
|
},
|
||||||
newList: {
|
newProject: {
|
||||||
type: COMMAND_TYPE.NEW_LIST,
|
type: COMMAND_TYPE.NEW_PROJECT,
|
||||||
title: t('quickActions.cmds.newList'),
|
title: t('quickActions.cmds.newProject'),
|
||||||
placeholder: t('quickActions.newList'),
|
placeholder: t('quickActions.newProject'),
|
||||||
action: newList,
|
action: newProject,
|
||||||
},
|
},
|
||||||
newNamespace: {
|
newNamespace: {
|
||||||
type: COMMAND_TYPE.NEW_NAMESPACE,
|
type: COMMAND_TYPE.NEW_NAMESPACE,
|
||||||
|
@ -246,24 +246,24 @@ const commands = computed<{ [key in COMMAND_TYPE]: Command }>(() => ({
|
||||||
|
|
||||||
const placeholder = computed(() => selectedCmd.value?.placeholder || t('quickActions.placeholder'))
|
const placeholder = computed(() => selectedCmd.value?.placeholder || t('quickActions.placeholder'))
|
||||||
|
|
||||||
const currentList = computed(() => Object.keys(baseStore.currentList).length === 0
|
const currentProject = computed(() => Object.keys(baseStore.currentProject).length === 0
|
||||||
? null
|
? null
|
||||||
: baseStore.currentList,
|
: baseStore.currentProject,
|
||||||
)
|
)
|
||||||
|
|
||||||
const hintText = computed(() => {
|
const hintText = computed(() => {
|
||||||
let namespace
|
let namespace
|
||||||
if (selectedCmd.value !== null && currentList.value !== null) {
|
if (selectedCmd.value !== null && currentProject.value !== null) {
|
||||||
switch (selectedCmd.value.type) {
|
switch (selectedCmd.value.type) {
|
||||||
case COMMAND_TYPE.NEW_TASK:
|
case COMMAND_TYPE.NEW_TASK:
|
||||||
return t('quickActions.createTask', {
|
return t('quickActions.createTask', {
|
||||||
title: currentList.value.title,
|
title: currentProject.value.title,
|
||||||
})
|
})
|
||||||
case COMMAND_TYPE.NEW_LIST:
|
case COMMAND_TYPE.NEW_PROJECT:
|
||||||
namespace = namespaceStore.getNamespaceById(
|
namespace = namespaceStore.getNamespaceById(
|
||||||
currentList.value.namespaceId,
|
currentProject.value.namespaceId,
|
||||||
)
|
)
|
||||||
return t('quickActions.createList', {
|
return t('quickActions.createProject', {
|
||||||
title: namespace?.title,
|
title: namespace?.title,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -275,8 +275,8 @@ const hintText = computed(() => {
|
||||||
|
|
||||||
const availableCmds = computed(() => {
|
const availableCmds = computed(() => {
|
||||||
const cmds = []
|
const cmds = []
|
||||||
if (currentList.value !== null) {
|
if (currentProject.value !== null) {
|
||||||
cmds.push(commands.value.newTask, commands.value.newList)
|
cmds.push(commands.value.newTask, commands.value.newProject)
|
||||||
}
|
}
|
||||||
cmds.push(commands.value.newNamespace, commands.value.newTeam)
|
cmds.push(commands.value.newNamespace, commands.value.newTeam)
|
||||||
return cmds
|
return cmds
|
||||||
|
@ -288,21 +288,21 @@ const searchMode = computed(() => {
|
||||||
if (query.value === '') {
|
if (query.value === '') {
|
||||||
return SEARCH_MODE.ALL
|
return SEARCH_MODE.ALL
|
||||||
}
|
}
|
||||||
const { text, list, labels, assignees } = parsedQuery.value
|
const { text, project, labels, assignees } = parsedQuery.value
|
||||||
if (assignees.length === 0 && text !== '') {
|
if (assignees.length === 0 && text !== '') {
|
||||||
return SEARCH_MODE.TASKS
|
return SEARCH_MODE.TASKS
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
assignees.length === 0 &&
|
assignees.length === 0 &&
|
||||||
list !== null &&
|
project !== null &&
|
||||||
text === '' &&
|
text === '' &&
|
||||||
labels.length === 0
|
labels.length === 0
|
||||||
) {
|
) {
|
||||||
return SEARCH_MODE.LISTS
|
return SEARCH_MODE.PROJECTS
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
assignees.length > 0 &&
|
assignees.length > 0 &&
|
||||||
list === null &&
|
project === null &&
|
||||||
text === '' &&
|
text === '' &&
|
||||||
labels.length === 0
|
labels.length === 0
|
||||||
) {
|
) {
|
||||||
|
@ -356,7 +356,7 @@ function searchTasks() {
|
||||||
taskSearchTimeout.value = null
|
taskSearchTimeout.value = null
|
||||||
}
|
}
|
||||||
|
|
||||||
const { text, list: listName, labels } = parsedQuery.value
|
const { text, project: projectName, labels } = parsedQuery.value
|
||||||
|
|
||||||
const filters: Filter[] = []
|
const filters: Filter[] = []
|
||||||
|
|
||||||
|
@ -373,10 +373,10 @@ function searchTasks() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (listName !== null) {
|
if (projectName !== null) {
|
||||||
const list = listStore.findListByExactname(listName)
|
const project = projectStore.findProjectByExactname(projectName)
|
||||||
if (list !== null) {
|
if (project !== null) {
|
||||||
addFilter('listId', list.id, 'equals')
|
addFilter('projectId', project.id, 'equals')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -396,9 +396,9 @@ function searchTasks() {
|
||||||
const r = await taskService.getAll({}, params) as DoAction<ITask>[]
|
const r = await taskService.getAll({}, params) as DoAction<ITask>[]
|
||||||
foundTasks.value = r.map((t) => {
|
foundTasks.value = r.map((t) => {
|
||||||
t.type = ACTION_TYPE.TASK
|
t.type = ACTION_TYPE.TASK
|
||||||
const list = listStore.getListById(t.listId)
|
const project = projectStore.getProjectById(t.projectId)
|
||||||
if (list !== null) {
|
if (project !== null) {
|
||||||
t.title = `${t.title} (${list.title})`
|
t.title = `${t.title} (${project.title})`
|
||||||
}
|
}
|
||||||
return t
|
return t
|
||||||
})
|
})
|
||||||
|
@ -428,7 +428,7 @@ function searchTeams() {
|
||||||
teamService.getAll({}, { s: t }),
|
teamService.getAll({}, { s: t }),
|
||||||
)
|
)
|
||||||
const teamsResult = await Promise.all(teamSearchPromises)
|
const teamsResult = await Promise.all(teamSearchPromises)
|
||||||
foundTeams.value = teamsResult.flatMap((team) => {
|
foundTeams.value = teamsResult.flat().map((team) => {
|
||||||
team.title = team.name
|
team.title = team.name
|
||||||
return team
|
return team
|
||||||
})
|
})
|
||||||
|
@ -444,11 +444,11 @@ const searchInput = ref<HTMLElement | null>(null)
|
||||||
|
|
||||||
async function doAction(type: ACTION_TYPE, item: DoAction) {
|
async function doAction(type: ACTION_TYPE, item: DoAction) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ACTION_TYPE.LIST:
|
case ACTION_TYPE.PROJECT:
|
||||||
closeQuickActions()
|
closeQuickActions()
|
||||||
await router.push({
|
await router.push({
|
||||||
name: 'list.index',
|
name: 'project.index',
|
||||||
params: { listId: (item as DoAction<IList>).id },
|
params: { projectId: (item as DoAction<IProject>).id },
|
||||||
})
|
})
|
||||||
break
|
break
|
||||||
case ACTION_TYPE.TASK:
|
case ACTION_TYPE.TASK:
|
||||||
|
@ -458,6 +458,13 @@ async function doAction(type: ACTION_TYPE, item: DoAction) {
|
||||||
params: { id: (item as DoAction<ITask>).id },
|
params: { id: (item as DoAction<ITask>).id },
|
||||||
})
|
})
|
||||||
break
|
break
|
||||||
|
case ACTION_TYPE.TEAM:
|
||||||
|
closeQuickActions()
|
||||||
|
await router.push({
|
||||||
|
name: 'teams.edit',
|
||||||
|
params: { id: (item as DoAction<ITeam>).id },
|
||||||
|
})
|
||||||
|
break
|
||||||
case ACTION_TYPE.CMD:
|
case ACTION_TYPE.CMD:
|
||||||
query.value = ''
|
query.value = ''
|
||||||
selectedCmd.value = item as DoAction<Command>
|
selectedCmd.value = item as DoAction<Command>
|
||||||
|
@ -482,29 +489,29 @@ async function doCmd() {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function newTask() {
|
async function newTask() {
|
||||||
if (currentList.value === null) {
|
if (currentProject.value === null) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const task = await taskStore.createNewTask({
|
const task = await taskStore.createNewTask({
|
||||||
title: query.value,
|
title: query.value,
|
||||||
listId: currentList.value.id,
|
projectId: currentProject.value.id,
|
||||||
})
|
})
|
||||||
success({ message: t('task.createSuccess') })
|
success({ message: t('task.createSuccess') })
|
||||||
await router.push({ name: 'task.detail', params: { id: task.id } })
|
await router.push({ name: 'task.detail', params: { id: task.id } })
|
||||||
}
|
}
|
||||||
|
|
||||||
async function newList() {
|
async function newProject() {
|
||||||
if (currentList.value === null) {
|
if (currentProject.value === null) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const newList = await listStore.createList(new ListModel({
|
const newProject = await projectStore.createProject(new ProjectModel({
|
||||||
title: query.value,
|
title: query.value,
|
||||||
namespaceId: currentList.value.namespaceId,
|
namespaceId: currentProject.value.namespaceId,
|
||||||
}))
|
}))
|
||||||
success({ message: t('list.create.createdSuccess')})
|
success({ message: t('project.create.createdSuccess')})
|
||||||
await router.push({
|
await router.push({
|
||||||
name: 'list.index',
|
name: 'project.index',
|
||||||
params: { listId: newList.id },
|
params: { projectId: newProject.id },
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,39 +1,39 @@
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<p class="has-text-weight-bold">
|
<p class="has-text-weight-bold">
|
||||||
{{ $t('list.share.links.title') }}
|
{{ $t('project.share.links.title') }}
|
||||||
<span
|
<span
|
||||||
class="is-size-7 has-text-grey is-italic ml-3"
|
class="is-size-7 has-text-grey is-italic ml-3"
|
||||||
v-tooltip="$t('list.share.links.explanation')">
|
v-tooltip="$t('project.share.links.explanation')">
|
||||||
{{ $t('list.share.links.what') }}
|
{{ $t('project.share.links.what') }}
|
||||||
</span>
|
</span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="sharables-list">
|
<div class="sharables-project">
|
||||||
<x-button
|
<x-button
|
||||||
v-if="!(linkShares.length === 0 || showNewForm)"
|
v-if="!(linkShares.length === 0 || showNewForm)"
|
||||||
@click="showNewForm = true"
|
@click="showNewForm = true"
|
||||||
icon="plus"
|
icon="plus"
|
||||||
class="mb-4">
|
class="mb-4">
|
||||||
{{ $t('list.share.links.create') }}
|
{{ $t('project.share.links.create') }}
|
||||||
</x-button>
|
</x-button>
|
||||||
|
|
||||||
<div class="p-4" v-if="linkShares.length === 0 || showNewForm">
|
<div class="p-4" v-if="linkShares.length === 0 || showNewForm">
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label class="label" for="linkShareRight">
|
<label class="label" for="linkShareRight">
|
||||||
{{ $t('list.share.right.title') }}
|
{{ $t('project.share.right.title') }}
|
||||||
</label>
|
</label>
|
||||||
<div class="control">
|
<div class="control">
|
||||||
<div class="select">
|
<div class="select">
|
||||||
<select v-model="selectedRight" id="linkShareRight">
|
<select v-model="selectedRight" id="linkShareRight">
|
||||||
<option :value="RIGHTS.READ">
|
<option :value="RIGHTS.READ">
|
||||||
{{ $t('list.share.right.read') }}
|
{{ $t('project.share.right.read') }}
|
||||||
</option>
|
</option>
|
||||||
<option :value="RIGHTS.READ_WRITE">
|
<option :value="RIGHTS.READ_WRITE">
|
||||||
{{ $t('list.share.right.readWrite') }}
|
{{ $t('project.share.right.readWrite') }}
|
||||||
</option>
|
</option>
|
||||||
<option :value="RIGHTS.ADMIN">
|
<option :value="RIGHTS.ADMIN">
|
||||||
{{ $t('list.share.right.admin') }}
|
{{ $t('project.share.right.admin') }}
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
@ -41,21 +41,21 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label class="label" for="linkShareName">
|
<label class="label" for="linkShareName">
|
||||||
{{ $t('list.share.links.name') }}
|
{{ $t('project.share.links.name') }}
|
||||||
</label>
|
</label>
|
||||||
<div class="control">
|
<div class="control">
|
||||||
<input
|
<input
|
||||||
id="linkShareName"
|
id="linkShareName"
|
||||||
class="input"
|
class="input"
|
||||||
:placeholder="$t('list.share.links.namePlaceholder')"
|
:placeholder="$t('project.share.links.namePlaceholder')"
|
||||||
v-tooltip="$t('list.share.links.nameExplanation')"
|
v-tooltip="$t('project.share.links.nameExplanation')"
|
||||||
v-model="name"
|
v-model="name"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label class="label" for="linkSharePassword">
|
<label class="label" for="linkSharePassword">
|
||||||
{{ $t('list.share.links.password') }}
|
{{ $t('project.share.links.password') }}
|
||||||
</label>
|
</label>
|
||||||
<div class="control">
|
<div class="control">
|
||||||
<input
|
<input
|
||||||
|
@ -63,25 +63,25 @@
|
||||||
type="password"
|
type="password"
|
||||||
class="input"
|
class="input"
|
||||||
:placeholder="$t('user.auth.passwordPlaceholder')"
|
:placeholder="$t('user.auth.passwordPlaceholder')"
|
||||||
v-tooltip="$t('list.share.links.passwordExplanation')"
|
v-tooltip="$t('project.share.links.passwordExplanation')"
|
||||||
v-model="password"
|
v-model="password"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<x-button @click="add(listId)" icon="plus">
|
<x-button @click="add(projectId)" icon="plus">
|
||||||
{{ $t('list.share.share') }}
|
{{ $t('project.share.share') }}
|
||||||
</x-button>
|
</x-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<table
|
<table
|
||||||
class="table has-actions is-striped is-hoverable is-fullwidth link-share-list"
|
class="table has-actions is-striped is-hoverable is-fullwidth"
|
||||||
v-if="linkShares.length > 0"
|
v-if="linkShares.length > 0"
|
||||||
>
|
>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th>{{ $t('list.share.links.view') }}</th>
|
<th>{{ $t('project.share.links.view') }}</th>
|
||||||
<th>{{ $t('list.share.attributes.delete') }}</th>
|
<th>{{ $t('project.share.attributes.delete') }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
@ -92,7 +92,7 @@
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="mb-2">
|
<p class="mb-2">
|
||||||
<i18n-t keypath="list.share.links.sharedBy" scope="global">
|
<i18n-t keypath="project.share.links.sharedBy" scope="global">
|
||||||
<strong>{{ getDisplayName(s.sharedBy) }}</strong>
|
<strong>{{ getDisplayName(s.sharedBy) }}</strong>
|
||||||
</i18n-t>
|
</i18n-t>
|
||||||
</p>
|
</p>
|
||||||
|
@ -102,19 +102,19 @@
|
||||||
<span class="icon is-small">
|
<span class="icon is-small">
|
||||||
<icon icon="lock"/>
|
<icon icon="lock"/>
|
||||||
</span>
|
</span>
|
||||||
{{ $t('list.share.right.admin') }}
|
{{ $t('project.share.right.admin') }}
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="s.right === RIGHTS.READ_WRITE">
|
<template v-else-if="s.right === RIGHTS.READ_WRITE">
|
||||||
<span class="icon is-small">
|
<span class="icon is-small">
|
||||||
<icon icon="pen"/>
|
<icon icon="pen"/>
|
||||||
</span>
|
</span>
|
||||||
{{ $t('list.share.right.readWrite') }}
|
{{ $t('project.share.right.readWrite') }}
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<span class="icon is-small">
|
<span class="icon is-small">
|
||||||
<icon icon="users"/>
|
<icon icon="users"/>
|
||||||
</span>
|
</span>
|
||||||
{{ $t('list.share.right.read') }}
|
{{ $t('project.share.right.read') }}
|
||||||
</template>
|
</template>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -172,14 +172,14 @@
|
||||||
<modal
|
<modal
|
||||||
:enabled="showDeleteModal"
|
:enabled="showDeleteModal"
|
||||||
@close="showDeleteModal = false"
|
@close="showDeleteModal = false"
|
||||||
@submit="remove(listId)"
|
@submit="remove(projectId)"
|
||||||
>
|
>
|
||||||
<template #header>
|
<template #header>
|
||||||
<span>{{ $t('list.share.links.remove') }}</span>
|
<span>{{ $t('project.share.links.remove') }}</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #text>
|
<template #text>
|
||||||
<p>{{ $t('list.share.links.removeText') }}</p>
|
<p>{{ $t('project.share.links.removeText') }}</p>
|
||||||
</template>
|
</template>
|
||||||
</modal>
|
</modal>
|
||||||
</div>
|
</div>
|
||||||
|
@ -193,19 +193,19 @@ import {RIGHTS} from '@/constants/rights'
|
||||||
import LinkShareModel from '@/models/linkShare'
|
import LinkShareModel from '@/models/linkShare'
|
||||||
|
|
||||||
import type {ILinkShare} from '@/modelTypes/ILinkShare'
|
import type {ILinkShare} from '@/modelTypes/ILinkShare'
|
||||||
import type {IList} from '@/modelTypes/IList'
|
import type {IProject} from '@/modelTypes/IProject'
|
||||||
|
|
||||||
import LinkShareService from '@/services/linkShare'
|
import LinkShareService from '@/services/linkShare'
|
||||||
|
|
||||||
import {useCopyToClipboard} from '@/composables/useCopyToClipboard'
|
import {useCopyToClipboard} from '@/composables/useCopyToClipboard'
|
||||||
import {success} from '@/message'
|
import {success} from '@/message'
|
||||||
import {getDisplayName} from '@/models/user'
|
import {getDisplayName} from '@/models/user'
|
||||||
import type {ListView} from '@/types/ListView'
|
import type {ProjectView} from '@/types/ProjectView'
|
||||||
import {LIST_VIEWS} from '@/types/ListView'
|
import {PROJECT_VIEWS} from '@/types/ProjectView'
|
||||||
import {useConfigStore} from '@/stores/config'
|
import {useConfigStore} from '@/stores/config'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
listId: {
|
projectId: {
|
||||||
default: 0,
|
default: 0,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
@ -222,20 +222,20 @@ const showDeleteModal = ref(false)
|
||||||
const linkIdToDelete = ref(0)
|
const linkIdToDelete = ref(0)
|
||||||
const showNewForm = ref(false)
|
const showNewForm = ref(false)
|
||||||
|
|
||||||
type SelectedViewMapper = Record<IList['id'], ListView>
|
type SelectedViewMapper = Record<IProject['id'], ProjectView>
|
||||||
|
|
||||||
const selectedView = ref<SelectedViewMapper>({})
|
const selectedView = ref<SelectedViewMapper>({})
|
||||||
|
|
||||||
const availableViews = computed<Record<ListView, string>>(() => ({
|
const availableViews = computed<Record<ProjectView, string>>(() => ({
|
||||||
list: t('list.list.title'),
|
list: t('project.list.title'),
|
||||||
gantt: t('list.gantt.title'),
|
gantt: t('project.gantt.title'),
|
||||||
table: t('list.table.title'),
|
table: t('project.table.title'),
|
||||||
kanban: t('list.kanban.title'),
|
kanban: t('project.kanban.title'),
|
||||||
}))
|
}))
|
||||||
|
|
||||||
const copy = useCopyToClipboard()
|
const copy = useCopyToClipboard()
|
||||||
watch(
|
watch(
|
||||||
() => props.listId,
|
() => props.projectId,
|
||||||
load,
|
load,
|
||||||
{immediate: true},
|
{immediate: true},
|
||||||
)
|
)
|
||||||
|
@ -243,23 +243,23 @@ watch(
|
||||||
const configStore = useConfigStore()
|
const configStore = useConfigStore()
|
||||||
const frontendUrl = computed(() => configStore.frontendUrl)
|
const frontendUrl = computed(() => configStore.frontendUrl)
|
||||||
|
|
||||||
async function load(listId: IList['id']) {
|
async function load(projectId: IProject['id']) {
|
||||||
// If listId == 0 the list on the calling component wasn't already loaded, so we just bail out here
|
// If projectId == 0 the project on the calling component wasn't already loaded, so we just bail out here
|
||||||
if (listId === 0) {
|
if (projectId === 0) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const links = await linkShareService.getAll({listId})
|
const links = await linkShareService.getAll({projectId})
|
||||||
links.forEach((l: ILinkShare) => {
|
links.forEach((l: ILinkShare) => {
|
||||||
selectedView.value[l.id] = 'list'
|
selectedView.value[l.id] = 'project'
|
||||||
})
|
})
|
||||||
linkShares.value = links
|
linkShares.value = links
|
||||||
}
|
}
|
||||||
|
|
||||||
async function add(listId: IList['id']) {
|
async function add(projectId: IProject['id']) {
|
||||||
const newLinkShare = new LinkShareModel({
|
const newLinkShare = new LinkShareModel({
|
||||||
right: selectedRight.value,
|
right: selectedRight.value,
|
||||||
listId,
|
projectId,
|
||||||
name: name.value,
|
name: name.value,
|
||||||
password: password.value,
|
password: password.value,
|
||||||
})
|
})
|
||||||
|
@ -268,31 +268,31 @@ async function add(listId: IList['id']) {
|
||||||
name.value = ''
|
name.value = ''
|
||||||
password.value = ''
|
password.value = ''
|
||||||
showNewForm.value = false
|
showNewForm.value = false
|
||||||
success({message: t('list.share.links.createSuccess')})
|
success({message: t('project.share.links.createSuccess')})
|
||||||
await load(listId)
|
await load(projectId)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function remove(listId: IList['id']) {
|
async function remove(projectId: IProject['id']) {
|
||||||
try {
|
try {
|
||||||
await linkShareService.delete(new LinkShareModel({
|
await linkShareService.delete(new LinkShareModel({
|
||||||
id: linkIdToDelete.value,
|
id: linkIdToDelete.value,
|
||||||
listId,
|
projectId,
|
||||||
}))
|
}))
|
||||||
success({message: t('list.share.links.deleteSuccess')})
|
success({message: t('project.share.links.deleteSuccess')})
|
||||||
await load(listId)
|
await load(projectId)
|
||||||
} finally {
|
} finally {
|
||||||
showDeleteModal.value = false
|
showDeleteModal.value = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getShareLink(hash: string, view: ListView = LIST_VIEWS.LIST) {
|
function getShareLink(hash: string, view: ProjectView = PROJECT_VIEWS.LIST) {
|
||||||
return frontendUrl.value + 'share/' + hash + '/auth?view=' + view
|
return frontendUrl.value + 'share/' + hash + '/auth?view=' + view
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
// FIXME: I think this is not needed
|
// FIXME: I think this is not needed
|
||||||
.sharables-list:not(.card-content) {
|
.sharables-project:not(.card-content) {
|
||||||
overflow-y: auto
|
overflow-y: auto
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<p class="has-text-weight-bold">
|
<p class="has-text-weight-bold">
|
||||||
{{ $t('list.share.userTeam.shared', {type: shareTypeNames}) }}
|
{{ $t('project.share.userTeam.shared', {type: shareTypeNames}) }}
|
||||||
</p>
|
</p>
|
||||||
<div v-if="userIsAdmin">
|
<div v-if="userIsAdmin">
|
||||||
<div class="field has-addons">
|
<div class="field has-addons">
|
||||||
|
@ -19,7 +19,7 @@
|
||||||
/>
|
/>
|
||||||
</p>
|
</p>
|
||||||
<p class="control">
|
<p class="control">
|
||||||
<x-button @click="add()">{{ $t('list.share.share') }}</x-button>
|
<x-button @click="add()">{{ $t('project.share.share') }}</x-button>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
<td>{{ getDisplayName(s) }}</td>
|
<td>{{ getDisplayName(s) }}</td>
|
||||||
<td>
|
<td>
|
||||||
<template v-if="s.id === userInfo.id">
|
<template v-if="s.id === userInfo.id">
|
||||||
<b class="is-success">{{ $t('list.share.userTeam.you') }}</b>
|
<b class="is-success">{{ $t('project.share.userTeam.you') }}</b>
|
||||||
</template>
|
</template>
|
||||||
</td>
|
</td>
|
||||||
</template>
|
</template>
|
||||||
|
@ -52,19 +52,19 @@
|
||||||
<span class="icon is-small">
|
<span class="icon is-small">
|
||||||
<icon icon="lock"/>
|
<icon icon="lock"/>
|
||||||
</span>
|
</span>
|
||||||
{{ $t('list.share.right.admin') }}
|
{{ $t('project.share.right.admin') }}
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="s.right === RIGHTS.READ_WRITE">
|
<template v-else-if="s.right === RIGHTS.READ_WRITE">
|
||||||
<span class="icon is-small">
|
<span class="icon is-small">
|
||||||
<icon icon="pen"/>
|
<icon icon="pen"/>
|
||||||
</span>
|
</span>
|
||||||
{{ $t('list.share.right.readWrite') }}
|
{{ $t('project.share.right.readWrite') }}
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<span class="icon is-small">
|
<span class="icon is-small">
|
||||||
<icon icon="users"/>
|
<icon icon="users"/>
|
||||||
</span>
|
</span>
|
||||||
{{ $t('list.share.right.read') }}
|
{{ $t('project.share.right.read') }}
|
||||||
</template>
|
</template>
|
||||||
</td>
|
</td>
|
||||||
<td class="actions" v-if="userIsAdmin">
|
<td class="actions" v-if="userIsAdmin">
|
||||||
|
@ -78,19 +78,19 @@
|
||||||
:selected="s.right === RIGHTS.READ"
|
:selected="s.right === RIGHTS.READ"
|
||||||
:value="RIGHTS.READ"
|
:value="RIGHTS.READ"
|
||||||
>
|
>
|
||||||
{{ $t('list.share.right.read') }}
|
{{ $t('project.share.right.read') }}
|
||||||
</option>
|
</option>
|
||||||
<option
|
<option
|
||||||
:selected="s.right === RIGHTS.READ_WRITE"
|
:selected="s.right === RIGHTS.READ_WRITE"
|
||||||
:value="RIGHTS.READ_WRITE"
|
:value="RIGHTS.READ_WRITE"
|
||||||
>
|
>
|
||||||
{{ $t('list.share.right.readWrite') }}
|
{{ $t('project.share.right.readWrite') }}
|
||||||
</option>
|
</option>
|
||||||
<option
|
<option
|
||||||
:selected="s.right === RIGHTS.ADMIN"
|
:selected="s.right === RIGHTS.ADMIN"
|
||||||
:value="RIGHTS.ADMIN"
|
:value="RIGHTS.ADMIN"
|
||||||
>
|
>
|
||||||
{{ $t('list.share.right.admin') }}
|
{{ $t('project.share.right.admin') }}
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
@ -110,7 +110,7 @@
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<nothing v-else>
|
<nothing v-else>
|
||||||
{{ $t('list.share.userTeam.notShared', {type: shareTypeNames}) }}
|
{{ $t('project.share.userTeam.notShared', {type: shareTypeNames}) }}
|
||||||
</nothing>
|
</nothing>
|
||||||
|
|
||||||
<modal
|
<modal
|
||||||
|
@ -120,11 +120,11 @@
|
||||||
>
|
>
|
||||||
<template #header>
|
<template #header>
|
||||||
<span>{{
|
<span>{{
|
||||||
$t('list.share.userTeam.removeHeader', {type: shareTypeName, sharable: sharableName})
|
$t('project.share.userTeam.removeHeader', {type: shareTypeName, sharable: sharableName})
|
||||||
}}</span>
|
}}</span>
|
||||||
</template>
|
</template>
|
||||||
<template #text>
|
<template #text>
|
||||||
<p>{{ $t('list.share.userTeam.removeText', {type: shareTypeName, sharable: sharableName}) }}</p>
|
<p>{{ $t('project.share.userTeam.removeText', {type: shareTypeName, sharable: sharableName}) }}</p>
|
||||||
</template>
|
</template>
|
||||||
</modal>
|
</modal>
|
||||||
</div>
|
</div>
|
||||||
|
@ -143,9 +143,9 @@ import UserNamespaceService from '@/services/userNamespace'
|
||||||
import UserNamespaceModel from '@/models/userNamespace'
|
import UserNamespaceModel from '@/models/userNamespace'
|
||||||
import type {IUserNamespace} from '@/modelTypes/IUserNamespace'
|
import type {IUserNamespace} from '@/modelTypes/IUserNamespace'
|
||||||
|
|
||||||
import UserListService from '@/services/userList'
|
import UserProjectService from '@/services/userProject'
|
||||||
import UserListModel from '@/models/userList'
|
import UserProjectModel from '@/models/userProject'
|
||||||
import type {IUserList} from '@/modelTypes/IUserList'
|
import type {IUserProject} from '@/modelTypes/IUserProject'
|
||||||
|
|
||||||
import UserService from '@/services/user'
|
import UserService from '@/services/user'
|
||||||
import UserModel, { getDisplayName } from '@/models/user'
|
import UserModel, { getDisplayName } from '@/models/user'
|
||||||
|
@ -155,9 +155,9 @@ import TeamNamespaceService from '@/services/teamNamespace'
|
||||||
import TeamNamespaceModel from '@/models/teamNamespace'
|
import TeamNamespaceModel from '@/models/teamNamespace'
|
||||||
import type { ITeamNamespace } from '@/modelTypes/ITeamNamespace'
|
import type { ITeamNamespace } from '@/modelTypes/ITeamNamespace'
|
||||||
|
|
||||||
import TeamListService from '@/services/teamList'
|
import TeamProjectService from '@/services/teamProject'
|
||||||
import TeamListModel from '@/models/teamList'
|
import TeamProjectModel from '@/models/teamProject'
|
||||||
import type { ITeamList } from '@/modelTypes/ITeamList'
|
import type { ITeamProject } from '@/modelTypes/ITeamProject'
|
||||||
|
|
||||||
import TeamService from '@/services/team'
|
import TeamService from '@/services/team'
|
||||||
import TeamModel from '@/models/team'
|
import TeamModel from '@/models/team'
|
||||||
|
@ -172,7 +172,7 @@ import {useAuthStore} from '@/stores/auth'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
type: {
|
type: {
|
||||||
type: String as PropType<'list' | 'namespace'>,
|
type: String as PropType<'project' | 'namespace'>,
|
||||||
default: '',
|
default: '',
|
||||||
},
|
},
|
||||||
shareType: {
|
shareType: {
|
||||||
|
@ -191,9 +191,9 @@ const props = defineProps({
|
||||||
|
|
||||||
const {t} = useI18n({useScope: 'global'})
|
const {t} = useI18n({useScope: 'global'})
|
||||||
|
|
||||||
// This user service is either a userNamespaceService or a userListService, depending on the type we are using
|
// This user service is either a userNamespaceService or a userProjectService, depending on the type we are using
|
||||||
let stuffService: UserNamespaceService | UserListService | TeamListService | TeamNamespaceService
|
let stuffService: UserNamespaceService | UserProjectService | TeamProjectService | TeamNamespaceService
|
||||||
let stuffModel: IUserNamespace | IUserList | ITeamList | ITeamNamespace
|
let stuffModel: IUserNamespace | IUserProject | ITeamProject | ITeamNamespace
|
||||||
let searchService: UserService | TeamService
|
let searchService: UserService | TeamService
|
||||||
let sharable: Ref<IUser | ITeam>
|
let sharable: Ref<IUser | ITeam>
|
||||||
|
|
||||||
|
@ -201,7 +201,7 @@ const searchLabel = ref('')
|
||||||
const selectedRight = ref({})
|
const selectedRight = ref({})
|
||||||
|
|
||||||
|
|
||||||
// This holds either teams or users who this namepace or list is shared with
|
// This holds either teams or users who this namepace or project is shared with
|
||||||
const sharables = ref([])
|
const sharables = ref([])
|
||||||
const showDeleteModal = ref(false)
|
const showDeleteModal = ref(false)
|
||||||
|
|
||||||
|
@ -212,11 +212,11 @@ const userInfo = computed(() => authStore.info)
|
||||||
function createShareTypeNameComputed(count: number) {
|
function createShareTypeNameComputed(count: number) {
|
||||||
return computed(() => {
|
return computed(() => {
|
||||||
if (props.shareType === 'user') {
|
if (props.shareType === 'user') {
|
||||||
return t('list.share.userTeam.typeUser', count)
|
return t('project.share.userTeam.typeUser', count)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (props.shareType === 'team') {
|
if (props.shareType === 'team') {
|
||||||
return t('list.share.userTeam.typeTeam', count)
|
return t('project.share.userTeam.typeTeam', count)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ''
|
return ''
|
||||||
|
@ -227,8 +227,8 @@ const shareTypeNames = createShareTypeNameComputed(2)
|
||||||
const shareTypeName = createShareTypeNameComputed(1)
|
const shareTypeName = createShareTypeNameComputed(1)
|
||||||
|
|
||||||
const sharableName = computed(() => {
|
const sharableName = computed(() => {
|
||||||
if (props.type === 'list') {
|
if (props.type === 'project') {
|
||||||
return t('list.list.title')
|
return t('project.list.title')
|
||||||
}
|
}
|
||||||
|
|
||||||
if (props.shareType === 'namespace') {
|
if (props.shareType === 'namespace') {
|
||||||
|
@ -244,9 +244,9 @@ if (props.shareType === 'user') {
|
||||||
sharable = ref(new UserModel())
|
sharable = ref(new UserModel())
|
||||||
searchLabel.value = 'username'
|
searchLabel.value = 'username'
|
||||||
|
|
||||||
if (props.type === 'list') {
|
if (props.type === 'project') {
|
||||||
stuffService = shallowReactive(new UserListService())
|
stuffService = shallowReactive(new UserProjectService())
|
||||||
stuffModel = reactive(new UserListModel({listId: props.id}))
|
stuffModel = reactive(new UserProjectModel({projectId: props.id}))
|
||||||
} else if (props.type === 'namespace') {
|
} else if (props.type === 'namespace') {
|
||||||
stuffService = shallowReactive(new UserNamespaceService())
|
stuffService = shallowReactive(new UserNamespaceService())
|
||||||
stuffModel = reactive(new UserNamespaceModel({
|
stuffModel = reactive(new UserNamespaceModel({
|
||||||
|
@ -261,9 +261,9 @@ if (props.shareType === 'user') {
|
||||||
sharable = ref(new TeamModel())
|
sharable = ref(new TeamModel())
|
||||||
searchLabel.value = 'name'
|
searchLabel.value = 'name'
|
||||||
|
|
||||||
if (props.type === 'list') {
|
if (props.type === 'project') {
|
||||||
stuffService = shallowReactive(new TeamListService())
|
stuffService = shallowReactive(new TeamProjectService())
|
||||||
stuffModel = reactive(new TeamListModel({listId: props.id}))
|
stuffModel = reactive(new TeamProjectModel({projectId: props.id}))
|
||||||
} else if (props.type === 'namespace') {
|
} else if (props.type === 'namespace') {
|
||||||
stuffService = shallowReactive(new TeamNamespaceService())
|
stuffService = shallowReactive(new TeamNamespaceService())
|
||||||
stuffModel = reactive(new TeamNamespaceModel({
|
stuffModel = reactive(new TeamNamespaceModel({
|
||||||
|
@ -303,7 +303,7 @@ async function deleteSharable() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
success({
|
success({
|
||||||
message: t('list.share.userTeam.removeSuccess', {
|
message: t('project.share.userTeam.removeSuccess', {
|
||||||
type: shareTypeName.value,
|
type: shareTypeName.value,
|
||||||
sharable: sharableName.value,
|
sharable: sharableName.value,
|
||||||
}),
|
}),
|
||||||
|
@ -326,7 +326,7 @@ async function add(admin) {
|
||||||
}
|
}
|
||||||
|
|
||||||
await stuffService.create(stuffModel)
|
await stuffService.create(stuffModel)
|
||||||
success({message: t('list.share.userTeam.addedSuccess', {type: shareTypeName.value})})
|
success({message: t('project.share.userTeam.addedSuccess', {type: shareTypeName.value})})
|
||||||
await load()
|
await load()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,7 +358,7 @@ async function toggleType(sharable) {
|
||||||
sharables.value[i].right = r.right
|
sharables.value[i].right = r.right
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
success({message: t('list.share.userTeam.updatedSuccess', {type: shareTypeName.value})})
|
success({message: t('project.share.userTeam.updatedSuccess', {type: shareTypeName.value})})
|
||||||
}
|
}
|
||||||
|
|
||||||
const found = ref([])
|
const found = ref([])
|
||||||
|
|
|
@ -38,9 +38,8 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<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 {useRouter} from 'vue-router'
|
||||||
import {useNow} from '@vueuse/core'
|
|
||||||
|
|
||||||
import {getHexColor} from '@/models/task'
|
import {getHexColor} from '@/models/task'
|
||||||
|
|
||||||
|
@ -50,7 +49,7 @@ import {parseKebabDate} from '@/helpers/time/parseKebabDate'
|
||||||
|
|
||||||
import type {ITask, ITaskPartialWithId} from '@/modelTypes/ITask'
|
import type {ITask, ITaskPartialWithId} from '@/modelTypes/ITask'
|
||||||
import type {DateISO} from '@/types/DateISO'
|
import type {DateISO} from '@/types/DateISO'
|
||||||
import type {GanttFilters} from '@/views/list/helpers/useGanttFilters'
|
import type {GanttFilters} from '@/views/project/helpers/useGanttFilters'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
extendDayjs,
|
extendDayjs,
|
||||||
|
@ -157,7 +156,8 @@ function openTask(e: {
|
||||||
|
|
||||||
const weekDayFromDate = useWeekDayFromDate()
|
const weekDayFromDate = useWeekDayFromDate()
|
||||||
|
|
||||||
const today = useNow()
|
const today = ref(new Date())
|
||||||
|
onActivated(() => today.value = new Date())
|
||||||
const dateIsToday = computed(() => (date: Date) => {
|
const dateIsToday = computed(() => (date: Date) => {
|
||||||
return (
|
return (
|
||||||
date.getDate() === today.value.getDate() &&
|
date.getDate() === today.value.getDate() &&
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<textarea
|
<textarea
|
||||||
class="add-task-textarea input"
|
class="add-task-textarea input"
|
||||||
:class="{'textarea-empty': newTaskTitle === ''}"
|
:class="{'textarea-empty': newTaskTitle === ''}"
|
||||||
:placeholder="$t('list.list.addPlaceholder')"
|
:placeholder="$t('project.list.addPlaceholder')"
|
||||||
rows="1"
|
rows="1"
|
||||||
v-focus
|
v-focus
|
||||||
v-model="newTaskTitle"
|
v-model="newTaskTitle"
|
||||||
|
@ -24,10 +24,10 @@
|
||||||
@click="addTask()"
|
@click="addTask()"
|
||||||
icon="plus"
|
icon="plus"
|
||||||
:loading="loading"
|
:loading="loading"
|
||||||
:aria-label="$t('list.list.add')"
|
:aria-label="$t('project.list.add')"
|
||||||
>
|
>
|
||||||
<span class="button-text">
|
<span class="button-text">
|
||||||
{{ $t('list.list.add') }}
|
{{ $t('project.list.add') }}
|
||||||
</span>
|
</span>
|
||||||
</x-button>
|
</x-button>
|
||||||
</p>
|
</p>
|
||||||
|
@ -107,7 +107,7 @@ const loading = computed(() => taskStore.isLoading)
|
||||||
|
|
||||||
async function addTask() {
|
async function addTask() {
|
||||||
if (newTaskTitle.value === '') {
|
if (newTaskTitle.value === '') {
|
||||||
errorMessage.value = t('list.create.addTitleRequired')
|
errorMessage.value = t('project.create.addTitleRequired')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
errorMessage.value = ''
|
errorMessage.value = ''
|
||||||
|
@ -128,20 +128,20 @@ async function addTask() {
|
||||||
const allLabels = tasksToCreate.map(({title}) => getLabelsFromPrefix(title) ?? [])
|
const allLabels = tasksToCreate.map(({title}) => getLabelsFromPrefix(title) ?? [])
|
||||||
await taskStore.ensureLabelsExist(allLabels.flat())
|
await taskStore.ensureLabelsExist(allLabels.flat())
|
||||||
|
|
||||||
const newTasks = tasksToCreate.map(async ({title, list}) => {
|
const newTasks = tasksToCreate.map(async ({title, project}) => {
|
||||||
if (title === '') {
|
if (title === '') {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the task has a list specified, make sure to use it
|
// If the task has a project specified, make sure to use it
|
||||||
let listId = null
|
let projectId = null
|
||||||
if (list !== null) {
|
if (project !== null) {
|
||||||
listId = await taskStore.findListId({list, listId: 0})
|
projectId = await taskStore.findProjectId({project, projectId: 0})
|
||||||
}
|
}
|
||||||
|
|
||||||
const task = await taskStore.createNewTask({
|
const task = await taskStore.createNewTask({
|
||||||
title,
|
title,
|
||||||
listId: listId || authStore.settings.defaultListId,
|
projectId: projectId || authStore.settings.defaultProjectId,
|
||||||
position: props.defaultPosition,
|
position: props.defaultPosition,
|
||||||
})
|
})
|
||||||
createdTasks[title] = task
|
createdTasks[title] = task
|
||||||
|
@ -176,7 +176,7 @@ async function addTask() {
|
||||||
}))
|
}))
|
||||||
|
|
||||||
createdTask.relatedTasks[RELATION_KIND.PARENTTASK] = [createdParentTask]
|
createdTask.relatedTasks[RELATION_KIND.PARENTTASK] = [createdParentTask]
|
||||||
// we're only emitting here so that the relation shows up in the task list
|
// we're only emitting here so that the relation shows up in the project
|
||||||
emit('taskAdded', createdTask)
|
emit('taskAdded', createdTask)
|
||||||
|
|
||||||
return rel
|
return rel
|
||||||
|
@ -184,8 +184,8 @@ async function addTask() {
|
||||||
await Promise.all(relations)
|
await Promise.all(relations)
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
newTaskTitle.value = taskTitleBackup
|
newTaskTitle.value = taskTitleBackup
|
||||||
if (e?.message === 'NO_LIST') {
|
if (e?.message === 'NO_PROJECT') {
|
||||||
errorMessage.value = t('list.create.addListRequired')
|
errorMessage.value = t('project.create.addProjectRequired')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
throw e
|
throw e
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<Multiselect
|
<Multiselect
|
||||||
:loading="listUserService.loading"
|
:loading="projectUserService.loading"
|
||||||
:placeholder="$t('task.assignee.placeholder')"
|
:placeholder="$t('task.assignee.placeholder')"
|
||||||
:multiple="true"
|
:multiple="true"
|
||||||
@search="findUser"
|
@search="findUser"
|
||||||
|
@ -30,7 +30,7 @@ import Multiselect from '@/components/input/multiselect.vue'
|
||||||
import BaseButton from '@/components/base/BaseButton.vue'
|
import BaseButton from '@/components/base/BaseButton.vue'
|
||||||
|
|
||||||
import {includesById} from '@/helpers/utils'
|
import {includesById} from '@/helpers/utils'
|
||||||
import ListUserService from '@/services/listUsers'
|
import ProjectUserService from '@/services/projectUsers'
|
||||||
import {success} from '@/message'
|
import {success} from '@/message'
|
||||||
import {useTaskStore} from '@/stores/tasks'
|
import {useTaskStore} from '@/stores/tasks'
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ const props = defineProps({
|
||||||
type: Number,
|
type: Number,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
listId: {
|
projectId: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
@ -59,7 +59,7 @@ const emit = defineEmits(['update:modelValue'])
|
||||||
const taskStore = useTaskStore()
|
const taskStore = useTaskStore()
|
||||||
const {t} = useI18n({useScope: 'global'})
|
const {t} = useI18n({useScope: 'global'})
|
||||||
|
|
||||||
const listUserService = shallowReactive(new ListUserService())
|
const projectUserService = shallowReactive(new ProjectUserService())
|
||||||
const foundUsers = ref<IUser[]>([])
|
const foundUsers = ref<IUser[]>([])
|
||||||
const assignees = ref<IUser[]>([])
|
const assignees = ref<IUser[]>([])
|
||||||
let isAdding = false
|
let isAdding = false
|
||||||
|
@ -94,7 +94,7 @@ async function addAssignee(user: IUser) {
|
||||||
async function removeAssignee(user: IUser) {
|
async function removeAssignee(user: IUser) {
|
||||||
await taskStore.removeAssignee({user: user, taskId: props.taskId})
|
await taskStore.removeAssignee({user: user, taskId: props.taskId})
|
||||||
|
|
||||||
// Remove the assignee from the list
|
// Remove the assignee from the project
|
||||||
for (const a in assignees.value) {
|
for (const a in assignees.value) {
|
||||||
if (assignees.value[a].id === user.id) {
|
if (assignees.value[a].id === user.id) {
|
||||||
assignees.value.splice(a, 1)
|
assignees.value.splice(a, 1)
|
||||||
|
@ -109,7 +109,7 @@ async function findUser(query: string) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await listUserService.getAll({listId: props.listId}, {s: query}) as IUser[]
|
const response = await projectUserService.getAll({projectId: props.projectId}, {s: query}) as IUser[]
|
||||||
|
|
||||||
// Filter the results to not include users who are already assigned
|
// Filter the results to not include users who are already assigned
|
||||||
foundUsers.value = response
|
foundUsers.value = response
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
<template>
|
<template>
|
||||||
<Multiselect
|
<Multiselect
|
||||||
class="control is-expanded"
|
class="control is-expanded"
|
||||||
:placeholder="$t('list.search')"
|
:placeholder="$t('project.search')"
|
||||||
:search-results="foundLists"
|
:search-results="foundProjects"
|
||||||
label="title"
|
label="title"
|
||||||
:select-placeholder="$t('list.searchSelect')"
|
:select-placeholder="$t('project.searchSelect')"
|
||||||
:model-value="list"
|
:model-value="project"
|
||||||
@update:model-value="Object.assign(list, $event)"
|
@update:model-value="Object.assign(project, $event)"
|
||||||
@select="select"
|
@select="select"
|
||||||
@search="findLists"
|
@search="findProjects"
|
||||||
>
|
>
|
||||||
<template #searchResult="{option}">
|
<template #searchResult="{option}">
|
||||||
<span class="list-namespace-title search-result">{{ namespace((option as IList).namespaceId) }} ></span>
|
<span class="project-namespace-title search-result">{{ namespace((option as IProject).namespaceId) }} ></span>
|
||||||
{{ (option as IList).title }}
|
{{ (option as IProject).title }}
|
||||||
</template>
|
</template>
|
||||||
</Multiselect>
|
</Multiselect>
|
||||||
</template>
|
</template>
|
||||||
|
@ -22,19 +22,19 @@ import {reactive, ref, watch} from 'vue'
|
||||||
import type {PropType} from 'vue'
|
import type {PropType} from 'vue'
|
||||||
import {useI18n} from 'vue-i18n'
|
import {useI18n} from 'vue-i18n'
|
||||||
|
|
||||||
import type {IList} from '@/modelTypes/IList'
|
import type {IProject} from '@/modelTypes/IProject'
|
||||||
import type {INamespace} from '@/modelTypes/INamespace'
|
import type {INamespace} from '@/modelTypes/INamespace'
|
||||||
|
|
||||||
import {useListStore} from '@/stores/lists'
|
import {useProjectStore} from '@/stores/projects'
|
||||||
import {useNamespaceStore} from '@/stores/namespaces'
|
import {useNamespaceStore} from '@/stores/namespaces'
|
||||||
|
|
||||||
import ListModel from '@/models/list'
|
import ProjectModel from '@/models/project'
|
||||||
|
|
||||||
import Multiselect from '@/components/input/multiselect.vue'
|
import Multiselect from '@/components/input/multiselect.vue'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: {
|
modelValue: {
|
||||||
type: Object as PropType<IList>,
|
type: Object as PropType<IProject>,
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -42,45 +42,45 @@ const emit = defineEmits(['update:modelValue'])
|
||||||
|
|
||||||
const {t} = useI18n({useScope: 'global'})
|
const {t} = useI18n({useScope: 'global'})
|
||||||
|
|
||||||
const list: IList = reactive(new ListModel())
|
const project: IProject = reactive(new ProjectModel())
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => props.modelValue,
|
() => props.modelValue,
|
||||||
(newList) => Object.assign(list, newList),
|
(newProject) => Object.assign(project, newProject),
|
||||||
{
|
{
|
||||||
immediate: true,
|
immediate: true,
|
||||||
deep: true,
|
deep: true,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
const listStore = useListStore()
|
const projectStore = useProjectStore()
|
||||||
const namespaceStore = useNamespaceStore()
|
const namespaceStore = useNamespaceStore()
|
||||||
const foundLists = ref<IList[]>([])
|
const foundProjects = ref<IProject[]>([])
|
||||||
function findLists(query: string) {
|
function findProjects(query: string) {
|
||||||
if (query === '') {
|
if (query === '') {
|
||||||
select(null)
|
select(null)
|
||||||
}
|
}
|
||||||
foundLists.value = listStore.searchList(query)
|
foundProjects.value = projectStore.searchProject(query)
|
||||||
}
|
}
|
||||||
|
|
||||||
function select(l: IList | null) {
|
function select(l: IProject | null) {
|
||||||
if (l === null) {
|
if (l === null) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
Object.assign(list, l)
|
Object.assign(project, l)
|
||||||
emit('update:modelValue', list)
|
emit('update:modelValue', project)
|
||||||
}
|
}
|
||||||
|
|
||||||
function namespace(namespaceId: INamespace['id']) {
|
function namespace(namespaceId: INamespace['id']) {
|
||||||
const namespace = namespaceStore.getNamespaceById(namespaceId)
|
const namespace = namespaceStore.getNamespaceById(namespaceId)
|
||||||
return namespace !== null
|
return namespace !== null
|
||||||
? namespace.title
|
? namespace.title
|
||||||
: t('list.shared')
|
: t('project.shared')
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.list-namespace-title {
|
.project-namespace-title {
|
||||||
color: var(--grey-500);
|
color: var(--grey-500);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
|
@ -37,14 +37,14 @@
|
||||||
{{ $t('task.quickAddMagic.multiple') }}
|
{{ $t('task.quickAddMagic.multiple') }}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3>{{ $t('list.list.title') }}</h3>
|
<h3>{{ $t('project.list.title') }}</h3>
|
||||||
<p>
|
<p>
|
||||||
{{ $t('task.quickAddMagic.list1', {prefix: prefixes.list}) }}
|
{{ $t('task.quickAddMagic.project1', {prefix: prefixes.project}) }}
|
||||||
{{ $t('task.quickAddMagic.list2') }}
|
{{ $t('task.quickAddMagic.project2') }}
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
{{ $t('task.quickAddMagic.list3') }}
|
{{ $t('task.quickAddMagic.project3') }}
|
||||||
{{ $t('task.quickAddMagic.list4', {prefix: prefixes.list}) }}
|
{{ $t('task.quickAddMagic.project4', {prefix: prefixes.project}) }}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3>{{ $t('task.quickAddMagic.dateAndTime') }}</h3>
|
<h3>{{ $t('task.quickAddMagic.dateAndTime') }}</h3>
|
||||||
|
|
|
@ -43,8 +43,8 @@
|
||||||
:class="{'is-strikethrough': task.done}"
|
:class="{'is-strikethrough': task.done}"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="different-list"
|
class="different-project"
|
||||||
v-if="task.listId !== listId"
|
v-if="task.projectId !== projectId"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
v-if="task.differentNamespace !== null"
|
v-if="task.differentNamespace !== null"
|
||||||
|
@ -52,9 +52,9 @@
|
||||||
{{ task.differentNamespace }} >
|
{{ task.differentNamespace }} >
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
v-if="task.differentList !== null"
|
v-if="task.differentProject !== null"
|
||||||
v-tooltip="$t('task.relation.differentList')">
|
v-tooltip="$t('task.relation.differentProject')">
|
||||||
{{ task.differentList }} >
|
{{ task.differentProject }} >
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
{{ task.title }}
|
{{ task.title }}
|
||||||
|
@ -98,8 +98,8 @@
|
||||||
:class="{ 'is-strikethrough': t.done}"
|
:class="{ 'is-strikethrough': t.done}"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="different-list"
|
class="different-project"
|
||||||
v-if="t.listId !== listId"
|
v-if="t.projectId !== projectId"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
v-if="t.differentNamespace !== null"
|
v-if="t.differentNamespace !== null"
|
||||||
|
@ -107,9 +107,9 @@
|
||||||
{{ t.differentNamespace }} >
|
{{ t.differentNamespace }} >
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
v-if="t.differentList !== null"
|
v-if="t.differentProject !== null"
|
||||||
v-tooltip="$t('task.relation.differentList')">
|
v-tooltip="$t('task.relation.differentProject')">
|
||||||
{{ t.differentList }} >
|
{{ t.differentProject }} >
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
{{ t.title }}
|
{{ t.title }}
|
||||||
|
@ -186,7 +186,7 @@ const props = defineProps({
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
listId: {
|
projectId: {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 0,
|
default: 0,
|
||||||
},
|
},
|
||||||
|
@ -230,17 +230,17 @@ async function findTasks(newQuery: string) {
|
||||||
foundTasks.value = await taskService.getAll({}, {s: newQuery})
|
foundTasks.value = await taskService.getAll({}, {s: newQuery})
|
||||||
}
|
}
|
||||||
|
|
||||||
const getListAndNamespaceById = (listId: number) => namespaceStore.getListAndNamespaceById(listId, true)
|
const getProjectAndNamespaceById = (projectId: number) => namespaceStore.getProjectAndNamespaceById(projectId, true)
|
||||||
|
|
||||||
const namespace = computed(() => getListAndNamespaceById(props.listId)?.namespace)
|
const namespace = computed(() => getProjectAndNamespaceById(props.projectId)?.namespace)
|
||||||
|
|
||||||
function mapRelatedTasks(tasks: ITask[]) {
|
function mapRelatedTasks(tasks: ITask[]) {
|
||||||
return tasks.map(task => {
|
return tasks.map(task => {
|
||||||
// by doing this here once we can save a lot of duplicate calls in the template
|
// by doing this here once we can save a lot of duplicate calls in the template
|
||||||
const {
|
const {
|
||||||
list,
|
project,
|
||||||
namespace: taskNamespace,
|
namespace: taskNamespace,
|
||||||
} = getListAndNamespaceById(task.listId) || {list: null, namespace: null}
|
} = getProjectAndNamespaceById(task.projectId) || {project: null, namespace: null}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...task,
|
...task,
|
||||||
|
@ -248,10 +248,10 @@ function mapRelatedTasks(tasks: ITask[]) {
|
||||||
(taskNamespace !== null &&
|
(taskNamespace !== null &&
|
||||||
taskNamespace.id !== namespace.value.id &&
|
taskNamespace.id !== namespace.value.id &&
|
||||||
taskNamespace?.title) || null,
|
taskNamespace?.title) || null,
|
||||||
differentList:
|
differentProject:
|
||||||
(list !== null &&
|
(project !== null &&
|
||||||
task.listId !== props.listId &&
|
task.projectId !== props.projectId &&
|
||||||
list?.title) || null,
|
project?.title) || null,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -343,7 +343,7 @@ async function removeTaskRelation() {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function createAndRelateTask(title: string) {
|
async function createAndRelateTask(title: string) {
|
||||||
const newTask = await taskService.create(new TaskModel({title, listId: props.listId}))
|
const newTask = await taskService.create(new TaskModel({title, projectId: props.projectId}))
|
||||||
newTaskRelation.task = newTask
|
newTaskRelation.task = newTask
|
||||||
await addTaskRelation()
|
await addTaskRelation()
|
||||||
}
|
}
|
||||||
|
@ -351,7 +351,7 @@ async function createAndRelateTask(title: string) {
|
||||||
async function toggleTaskDone(task: ITask) {
|
async function toggleTaskDone(task: ITask) {
|
||||||
await taskStore.update(task)
|
await taskStore.update(task)
|
||||||
|
|
||||||
// Find the task in the list and update it so that it is correctly strike through
|
// Find the task in the project and update it so that it is correctly strike through
|
||||||
Object.entries(relatedTasks.value).some(([kind, tasks]) => {
|
Object.entries(relatedTasks.value).some(([kind, tasks]) => {
|
||||||
return (tasks as ITask[]).some((t, key) => {
|
return (tasks as ITask[]).some((t, key) => {
|
||||||
const found = t.id === task.id
|
const found = t.id === task.id
|
||||||
|
@ -379,7 +379,7 @@ async function toggleTaskDone(task: ITask) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.different-list {
|
.different-project {
|
||||||
color: var(--grey-500);
|
color: var(--grey-500);
|
||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,25 +9,25 @@
|
||||||
@change="markAsDone"
|
@change="markAsDone"
|
||||||
v-model="task.done"
|
v-model="task.done"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<ColorBubble
|
<ColorBubble
|
||||||
v-if="showListColor && listColor !== '' && currentList.id !== task.listId"
|
v-if="showProjectColor && projectColor !== '' && currentProject.id !== task.projectId"
|
||||||
:color="listColor"
|
:color="projectColor"
|
||||||
class="mr-1"
|
class="mr-1"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
:class="{ 'done': task.done, 'show-list': showList && taskList !== null}"
|
:class="{ 'done': task.done, 'show-project': showProject && project !== null}"
|
||||||
class="tasktext"
|
class="tasktext"
|
||||||
>
|
>
|
||||||
<span>
|
<span>
|
||||||
<router-link
|
<router-link
|
||||||
v-if="showList && taskList !== null"
|
v-if="showProject && project !== null"
|
||||||
:to="{ name: 'list.list', params: { listId: task.listId } }"
|
:to="{ name: 'project.list', params: { projectId: task.projectId } }"
|
||||||
class="task-list"
|
class="task-project"
|
||||||
:class="{'mr-2': task.hexColor !== ''}"
|
:class="{'mr-2': task.hexColor !== ''}"
|
||||||
v-tooltip="$t('task.detail.belongsToList', {list: taskList.title})">
|
v-tooltip="$t('task.detail.belongsToProject', {project: project.title})">
|
||||||
{{ taskList.title }}
|
{{ project.title }}
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
||||||
<ColorBubble
|
<ColorBubble
|
||||||
|
@ -84,13 +84,13 @@
|
||||||
<priority-label :priority="task.priority" :done="task.done"/>
|
<priority-label :priority="task.priority" :done="task.done"/>
|
||||||
|
|
||||||
<span>
|
<span>
|
||||||
<span class="list-task-icon" v-if="task.attachments.length > 0">
|
<span class="project-task-icon" v-if="task.attachments.length > 0">
|
||||||
<icon icon="paperclip"/>
|
<icon icon="paperclip"/>
|
||||||
</span>
|
</span>
|
||||||
<span class="list-task-icon" v-if="task.description">
|
<span class="project-task-icon" v-if="task.description">
|
||||||
<icon icon="align-left"/>
|
<icon icon="align-left"/>
|
||||||
</span>
|
</span>
|
||||||
<span class="list-task-icon" v-if="task.repeatAfter.amount > 0">
|
<span class="project-task-icon" v-if="task.repeatAfter.amount > 0">
|
||||||
<icon icon="history"/>
|
<icon icon="history"/>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
|
@ -107,12 +107,12 @@
|
||||||
</progress>
|
</progress>
|
||||||
|
|
||||||
<router-link
|
<router-link
|
||||||
v-if="!showList && currentList.id !== task.listId && taskList !== null"
|
v-if="!showProject && currentProject.id !== task.projectId && project !== null"
|
||||||
:to="{ name: 'list.list', params: { listId: task.listId } }"
|
:to="{ name: 'project.list', params: { projectId: task.projectId } }"
|
||||||
class="task-list"
|
class="task-project"
|
||||||
v-tooltip="$t('task.detail.belongsToList', {list: taskList.title})"
|
v-tooltip="$t('task.detail.belongsToProject', {project: project.title})"
|
||||||
>
|
>
|
||||||
{{ taskList.title }}
|
{{ project.title }}
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
||||||
<BaseButton
|
<BaseButton
|
||||||
|
@ -151,7 +151,7 @@ import {closeWhenClickedOutside} from '@/helpers/closeWhenClickedOutside'
|
||||||
import {formatDateSince, formatISO, formatDateLong} from '@/helpers/time/formatDate'
|
import {formatDateSince, formatISO, formatDateLong} from '@/helpers/time/formatDate'
|
||||||
import {success} from '@/message'
|
import {success} from '@/message'
|
||||||
|
|
||||||
import {useListStore} from '@/stores/lists'
|
import {useProjectStore} from '@/stores/projects'
|
||||||
import {useNamespaceStore} from '@/stores/namespaces'
|
import {useNamespaceStore} from '@/stores/namespaces'
|
||||||
import {useBaseStore} from '@/stores/base'
|
import {useBaseStore} from '@/stores/base'
|
||||||
import {useTaskStore} from '@/stores/tasks'
|
import {useTaskStore} from '@/stores/tasks'
|
||||||
|
@ -165,7 +165,7 @@ const props = defineProps({
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
showList: {
|
showProject: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
@ -173,7 +173,7 @@ const props = defineProps({
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
showListColor: {
|
showProjectColor: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true,
|
default: true,
|
||||||
},
|
},
|
||||||
|
@ -210,18 +210,18 @@ onBeforeUnmount(() => {
|
||||||
})
|
})
|
||||||
|
|
||||||
const baseStore = useBaseStore()
|
const baseStore = useBaseStore()
|
||||||
const listStore = useListStore()
|
const projectStore = useProjectStore()
|
||||||
const taskStore = useTaskStore()
|
const taskStore = useTaskStore()
|
||||||
const namespaceStore = useNamespaceStore()
|
const namespaceStore = useNamespaceStore()
|
||||||
|
|
||||||
const taskList = computed(() => listStore.getListById(task.value.listId))
|
const project = computed(() => projectStore.getProjectById(task.value.projectId))
|
||||||
const listColor = computed(() => taskList.value !== null ? taskList.value.hexColor : '')
|
const projectColor = computed(() => project.value !== null ? project.value.hexColor : '')
|
||||||
|
|
||||||
const currentList = computed(() => {
|
const currentProject = computed(() => {
|
||||||
return typeof baseStore.currentList === 'undefined' ? {
|
return typeof baseStore.currentProject === 'undefined' ? {
|
||||||
id: 0,
|
id: 0,
|
||||||
title: '',
|
title: '',
|
||||||
} : baseStore.currentList
|
} : baseStore.currentProject
|
||||||
})
|
})
|
||||||
|
|
||||||
const taskDetailRoute = computed(() => ({
|
const taskDetailRoute = computed(() => ({
|
||||||
|
@ -242,7 +242,7 @@ async function markAsDone(checked: boolean) {
|
||||||
t('task.doneSuccess') :
|
t('task.doneSuccess') :
|
||||||
t('task.undoneSuccess'),
|
t('task.undoneSuccess'),
|
||||||
}, [{
|
}, [{
|
||||||
title: 'Undo',
|
title: t('task.undo'),
|
||||||
callback: () => undoDone(checked),
|
callback: () => undoDone(checked),
|
||||||
}])
|
}])
|
||||||
}
|
}
|
||||||
|
@ -287,7 +287,7 @@ function hideDeferDueDatePopup(e) {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
border-radius: $radius;
|
border-radius: $radius;
|
||||||
border: 2px solid transparent;
|
border: 2px solid transparent;
|
||||||
|
|
||||||
color: var(--text);
|
color: var(--text);
|
||||||
transition: color ease $transition-duration;
|
transition: color ease $transition-duration;
|
||||||
|
|
||||||
|
@ -314,7 +314,7 @@ function hideDeferDueDatePopup(e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.task-list {
|
.task-project {
|
||||||
width: auto;
|
width: auto;
|
||||||
color: var(--grey-400);
|
color: var(--grey-400);
|
||||||
font-size: .9rem;
|
font-size: .9rem;
|
||||||
|
@ -329,7 +329,7 @@ function hideDeferDueDatePopup(e) {
|
||||||
width: 27px;
|
width: 27px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-task-icon {
|
.project-task-icon {
|
||||||
margin-left: 6px;
|
margin-left: 6px;
|
||||||
|
|
||||||
&:not(:first-of-type) {
|
&:not(:first-of-type) {
|
||||||
|
@ -339,7 +339,7 @@ function hideDeferDueDatePopup(e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
.favorite {
|
.favorite {
|
||||||
opacity: 0;
|
opacity: 1;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
width: 27px;
|
width: 27px;
|
||||||
transition: opacity $transition, color $transition;
|
transition: opacity $transition, color $transition;
|
||||||
|
@ -354,21 +354,26 @@ function hideDeferDueDatePopup(e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover .favorite {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.handle {
|
.handle {
|
||||||
opacity: 0;
|
opacity: 1;
|
||||||
transition: opacity $transition;
|
transition: opacity $transition;
|
||||||
margin-right: .25rem;
|
margin-right: .25rem;
|
||||||
cursor: grab;
|
cursor: grab;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover .handle {
|
@media(hover: hover) and (pointer: fine) {
|
||||||
opacity: 1;
|
& .favorite,
|
||||||
|
& .handle {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover .favorite,
|
||||||
|
&:hover .handle {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
:deep(.fancycheckbox) {
|
:deep(.fancycheckbox) {
|
||||||
height: 18px;
|
height: 18px;
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
|
@ -389,7 +394,7 @@ function hideDeferDueDatePopup(e) {
|
||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.show-list .parent-tasks {
|
.show-project .parent-tasks {
|
||||||
padding-left: .25rem;
|
padding-left: .25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -420,4 +425,4 @@ function hideDeferDueDatePopup(e) {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
|
@ -1,6 +1,5 @@
|
||||||
import {computed} from 'vue'
|
import {computed, onActivated, ref} from 'vue'
|
||||||
import {useI18n} from 'vue-i18n'
|
import {useI18n} from 'vue-i18n'
|
||||||
import {useNow} from '@vueuse/core'
|
|
||||||
|
|
||||||
import {useAuthStore} from '@/stores/auth'
|
import {useAuthStore} from '@/stores/auth'
|
||||||
import {hourToDaytime} from '@/helpers/hourToDaytime'
|
import {hourToDaytime} from '@/helpers/hourToDaytime'
|
||||||
|
@ -9,7 +8,8 @@ export type Daytime = 'night' | 'morning' | 'day' | 'evening'
|
||||||
|
|
||||||
export function useDaytimeSalutation() {
|
export function useDaytimeSalutation() {
|
||||||
const {t} = useI18n({useScope: 'global'})
|
const {t} = useI18n({useScope: 'global'})
|
||||||
const now = useNow()
|
const now = ref(new Date())
|
||||||
|
onActivated(() => now.value = new Date())
|
||||||
const authStore = useAuthStore()
|
const authStore = useAuthStore()
|
||||||
|
|
||||||
const name = computed(() => authStore.userDisplayName)
|
const name = computed(() => authStore.userDisplayName)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import {ref, watch, readonly} from 'vue'
|
import {ref, watch, readonly} from 'vue'
|
||||||
import {useLocalStorage, useMediaQuery} from '@vueuse/core'
|
import {useLocalStorage, useMediaQuery} from '@vueuse/core'
|
||||||
|
import {useRoute} from 'vue-router'
|
||||||
|
|
||||||
const BULMA_MOBILE_BREAKPOINT = 768
|
const BULMA_MOBILE_BREAKPOINT = 768
|
||||||
|
|
||||||
|
@ -15,7 +16,8 @@ export function useMenuActive() {
|
||||||
)
|
)
|
||||||
|
|
||||||
const menuActive = ref(false)
|
const menuActive = ref(false)
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
// set to prefered value
|
// set to prefered value
|
||||||
watch(isMobile, (current) => {
|
watch(isMobile, (current) => {
|
||||||
menuActive.value = current
|
menuActive.value = current
|
||||||
|
@ -31,6 +33,9 @@ export function useMenuActive() {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Hide the menu on mobile when the route changes (e.g. when the user taps a menu item)
|
||||||
|
watch(() => route.fullPath, () => isMobile.value && setMenuActive(false))
|
||||||
|
|
||||||
function setMenuActive(newMenuActive: boolean) {
|
function setMenuActive(newMenuActive: boolean) {
|
||||||
menuActive.value = newMenuActive
|
menuActive.value = newMenuActive
|
||||||
}
|
}
|
||||||
|
@ -40,8 +45,8 @@ export function useMenuActive() {
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
menuActive: readonly(menuActive),
|
menuActive: false,
|
||||||
setMenuActive,
|
setMenuActive,
|
||||||
toggleMenu,
|
toggleMenu,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,46 +0,0 @@
|
||||||
import {computed} from 'vue'
|
|
||||||
import {useRouter} from 'vue-router'
|
|
||||||
import {useEventListener} from '@vueuse/core'
|
|
||||||
|
|
||||||
import {useAuthStore} from '@/stores/auth'
|
|
||||||
import {MILLISECONDS_A_SECOND, SECONDS_A_HOUR} from '@/constants/date'
|
|
||||||
|
|
||||||
const SECONDS_TOKEN_VALID = 60 * SECONDS_A_HOUR
|
|
||||||
|
|
||||||
export function useRenewTokenOnFocus() {
|
|
||||||
const router = useRouter()
|
|
||||||
const authStore = useAuthStore()
|
|
||||||
|
|
||||||
const userInfo = computed(() => authStore.info)
|
|
||||||
const authenticated = computed(() => authStore.authenticated)
|
|
||||||
|
|
||||||
// Try renewing the token every time vikunja is loaded initially
|
|
||||||
// (When opening the browser the focus event is not fired)
|
|
||||||
authStore.renewToken()
|
|
||||||
|
|
||||||
// Check if the token is still valid if the window gets focus again to maybe renew it
|
|
||||||
useEventListener('focus', async () => {
|
|
||||||
if (!authenticated.value) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const nowInSeconds = new Date().getTime() / MILLISECONDS_A_SECOND
|
|
||||||
const expiresIn = userInfo.value !== null
|
|
||||||
? userInfo.value.exp - nowInSeconds
|
|
||||||
: 0
|
|
||||||
|
|
||||||
// If the token expiry is negative, it is already expired and we have no choice but to redirect
|
|
||||||
// the user to the login page
|
|
||||||
if (expiresIn <= 0) {
|
|
||||||
await authStore.checkAuth()
|
|
||||||
await router.push({name: 'user.login'})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the token is valid for less than 60 hours and renew if thats the case
|
|
||||||
if (expiresIn < SECONDS_TOKEN_VALID) {
|
|
||||||
authStore.renewToken()
|
|
||||||
console.debug('renewed token')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -5,6 +5,22 @@ import TaskCollectionService from '@/services/taskCollection'
|
||||||
import type {ITask} from '@/modelTypes/ITask'
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
import {error} from '@/message'
|
import {error} from '@/message'
|
||||||
|
|
||||||
|
export type Order = 'asc' | 'desc' | 'none'
|
||||||
|
|
||||||
|
export interface SortBy {
|
||||||
|
id?: Order
|
||||||
|
index?: Order
|
||||||
|
done?: Order
|
||||||
|
title?: Order
|
||||||
|
priority?: Order
|
||||||
|
due_date?: Order
|
||||||
|
start_date?: Order
|
||||||
|
end_date?: Order
|
||||||
|
percent_done?: Order
|
||||||
|
created?: Order
|
||||||
|
updated?: Order
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: merge with DEFAULT_PARAMS in filters.vue
|
// FIXME: merge with DEFAULT_PARAMS in filters.vue
|
||||||
export const getDefaultParams = () => ({
|
export const getDefaultParams = () => ({
|
||||||
sort_by: ['position', 'id'],
|
sort_by: ['position', 'id'],
|
||||||
|
@ -15,7 +31,7 @@ export const getDefaultParams = () => ({
|
||||||
filter_concat: 'and',
|
filter_concat: 'and',
|
||||||
})
|
})
|
||||||
|
|
||||||
const SORT_BY_DEFAULT = {
|
const SORT_BY_DEFAULT: SortBy = {
|
||||||
id: 'desc',
|
id: 'desc',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,30 +58,15 @@ const SORT_BY_DEFAULT = {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This mixin provides a base set of methods and properties to get tasks on a list.
|
* This mixin provides a base set of methods and properties to get tasks.
|
||||||
*/
|
*/
|
||||||
export function useTaskList(listId, sortByDefault = SORT_BY_DEFAULT) {
|
export function useTaskList(projectId) {
|
||||||
const params = ref({...getDefaultParams()})
|
|
||||||
|
|
||||||
const search = ref('')
|
|
||||||
const page = ref(1)
|
const page = ref(1)
|
||||||
|
|
||||||
const sortBy = ref({ ...sortByDefault })
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const getAllTasksParams = computed(() => {
|
const getAllTasksParams = computed(() => {
|
||||||
let loadParams = {...params.value}
|
|
||||||
|
|
||||||
if (search.value !== '') {
|
|
||||||
loadParams.s = search.value
|
|
||||||
}
|
|
||||||
|
|
||||||
loadParams = formatSortOrder(sortBy.value, loadParams)
|
|
||||||
|
|
||||||
return [
|
return [
|
||||||
{listId: listId.value},
|
{projectId: projectId.value},
|
||||||
loadParams,
|
// TODO_OFFLINE still need sorting by position.
|
||||||
|
{},
|
||||||
page.value || 1,
|
page.value || 1,
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
@ -87,10 +88,7 @@ export function useTaskList(listId, sortByDefault = SORT_BY_DEFAULT) {
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
watch(() => route.query, (query) => {
|
watch(() => route.query, (query) => {
|
||||||
const { page: pageQueryValue, search: searchQuery } = query
|
const { page: pageQueryValue } = query
|
||||||
if (searchQuery !== undefined) {
|
|
||||||
search.value = searchQuery as string
|
|
||||||
}
|
|
||||||
if (pageQueryValue !== undefined) {
|
if (pageQueryValue !== undefined) {
|
||||||
page.value = Number(pageQueryValue)
|
page.value = Number(pageQueryValue)
|
||||||
}
|
}
|
||||||
|
@ -113,8 +111,5 @@ export function useTaskList(listId, sortByDefault = SORT_BY_DEFAULT) {
|
||||||
totalPages,
|
totalPages,
|
||||||
currentPage: page,
|
currentPage: page,
|
||||||
loadTasks,
|
loadTasks,
|
||||||
searchTerm: search,
|
|
||||||
params,
|
|
||||||
sortByParam: sortBy,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -5,17 +5,18 @@ const API_DEFAULT_PORT = '3456'
|
||||||
export const ERROR_NO_API_URL = 'noApiUrlProvided'
|
export const ERROR_NO_API_URL = 'noApiUrlProvided'
|
||||||
|
|
||||||
|
|
||||||
|
// TODO_OFFLINE remove?
|
||||||
export const checkAndSetApiUrl = (url: string): Promise<string> => {
|
export const checkAndSetApiUrl = (url: string): Promise<string> => {
|
||||||
if(url.startsWith('/')) {
|
if (url.startsWith('/')) {
|
||||||
url = window.location.host + url
|
url = window.location.host + url
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the url has an http prefix
|
// Check if the url has a http prefix
|
||||||
if (
|
if (
|
||||||
!url.startsWith('http://') &&
|
!url.startsWith('http://') &&
|
||||||
!url.startsWith('https://')
|
!url.startsWith('https://')
|
||||||
) {
|
) {
|
||||||
url = `http://${url}`
|
url = `${window.location.protocol}//${url}`
|
||||||
}
|
}
|
||||||
|
|
||||||
const urlToCheck: URL = new URL(url)
|
const urlToCheck: URL = new URL(url)
|
||||||
|
@ -41,15 +42,6 @@ export const checkAndSetApiUrl = (url: string): Promise<string> => {
|
||||||
}
|
}
|
||||||
throw e
|
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 => {
|
.catch(e => {
|
||||||
// Check if it is reachable at /api/v1 and https
|
// Check if it is reachable at /api/v1 and https
|
||||||
urlToCheck.pathname = origUrlToCheck.pathname
|
urlToCheck.pathname = origUrlToCheck.pathname
|
||||||
|
@ -66,7 +58,6 @@ export const checkAndSetApiUrl = (url: string): Promise<string> => {
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
// Check if it is reachable at port API_DEFAULT_PORT and https
|
// Check if it is reachable at port API_DEFAULT_PORT and https
|
||||||
if (urlToCheck.port !== API_DEFAULT_PORT) {
|
if (urlToCheck.port !== API_DEFAULT_PORT) {
|
||||||
urlToCheck.protocol = 'https:'
|
|
||||||
urlToCheck.port = API_DEFAULT_PORT
|
urlToCheck.port = API_DEFAULT_PORT
|
||||||
window.API_URL = urlToCheck.toString()
|
window.API_URL = urlToCheck.toString()
|
||||||
return updateConfig()
|
return updateConfig()
|
||||||
|
@ -74,30 +65,7 @@ export const checkAndSetApiUrl = (url: string): Promise<string> => {
|
||||||
throw e
|
throw e
|
||||||
})
|
})
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
// Check if it is reachable at :API_DEFAULT_PORT and /api/v1 and https
|
// Check if it is reachable at :API_DEFAULT_PORT and /api/v1
|
||||||
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
|
|
||||||
urlToCheck.pathname = origUrlToCheck.pathname
|
urlToCheck.pathname = origUrlToCheck.pathname
|
||||||
if (
|
if (
|
||||||
!urlToCheck.pathname.endsWith('/api/v1') &&
|
!urlToCheck.pathname.endsWith('/api/v1') &&
|
||||||
|
@ -113,12 +81,12 @@ export const checkAndSetApiUrl = (url: string): Promise<string> => {
|
||||||
window.API_URL = oldUrl
|
window.API_URL = oldUrl
|
||||||
throw e
|
throw e
|
||||||
})
|
})
|
||||||
.then(r => {
|
.then(success => {
|
||||||
if (typeof r !== 'undefined') {
|
if (success) {
|
||||||
localStorage.setItem('API_URL', window.API_URL)
|
localStorage.setItem('API_URL', window.API_URL)
|
||||||
return window.API_URL
|
return window.API_URL
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(ERROR_NO_API_URL)
|
throw new Error(ERROR_NO_API_URL)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
import {i18n} from '@/i18n'
|
|
||||||
import type {IList} from '@/modelTypes/IList'
|
|
||||||
|
|
||||||
export function getListTitle(l: IList) {
|
|
||||||
if (l.id === -1) {
|
|
||||||
return i18n.global.t('list.pseudo.favorites.title')
|
|
||||||
}
|
|
||||||
return l.title
|
|
||||||
}
|
|
|
@ -3,7 +3,7 @@ import type {INamespace} from '@/modelTypes/INamespace'
|
||||||
|
|
||||||
export const getNamespaceTitle = (n: INamespace) => {
|
export const getNamespaceTitle = (n: INamespace) => {
|
||||||
if (n.id === -1) {
|
if (n.id === -1) {
|
||||||
return i18n.global.t('namespace.pseudo.sharedLists.title')
|
return i18n.global.t('namespace.pseudo.sharedProjects.title')
|
||||||
}
|
}
|
||||||
if (n.id === -2) {
|
if (n.id === -2) {
|
||||||
return i18n.global.t('namespace.pseudo.favorites.title')
|
return i18n.global.t('namespace.pseudo.favorites.title')
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
import {i18n} from '@/i18n'
|
||||||
|
import type {IProject} from '@/modelTypes/IProject'
|
||||||
|
|
||||||
|
export function getProjectTitle(l: IProject) {
|
||||||
|
if (l.id === -1) {
|
||||||
|
return i18n.global.t('project.pseudo.favorites.title')
|
||||||
|
}
|
||||||
|
return l.title
|
||||||
|
}
|
|
@ -113,8 +113,8 @@ task two`)
|
||||||
sub task 2`)
|
sub task 2`)
|
||||||
|
|
||||||
expect(tasks).to.have.length(3)
|
expect(tasks).to.have.length(3)
|
||||||
expect(tasks[0].list).to.eq('list')
|
expect(tasks[0].project).to.eq('list')
|
||||||
expect(tasks[1].list).to.eq('list')
|
expect(tasks[1].project).to.eq('list')
|
||||||
expect(tasks[2].list).to.eq('list')
|
expect(tasks[2].project).to.eq('list')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import {getListFromPrefix} from '@/modules/parseTaskText'
|
import {getProjectFromPrefix} from '@/modules/parseTaskText'
|
||||||
|
|
||||||
export interface TaskWithParent {
|
export interface TaskWithParent {
|
||||||
title: string,
|
title: string,
|
||||||
parent: string | null,
|
parent: string | null,
|
||||||
list: string | null,
|
project: string | null,
|
||||||
}
|
}
|
||||||
|
|
||||||
function cleanupTitle(title: string) {
|
function cleanupTitle(title: string) {
|
||||||
|
@ -23,10 +23,10 @@ export function parseSubtasksViaIndention(taskTitles: string): TaskWithParent[]
|
||||||
const task: TaskWithParent = {
|
const task: TaskWithParent = {
|
||||||
title: cleanupTitle(title),
|
title: cleanupTitle(title),
|
||||||
parent: null,
|
parent: null,
|
||||||
list: null,
|
project: null,
|
||||||
}
|
}
|
||||||
|
|
||||||
task.list = getListFromPrefix(task.title)
|
task.project = getProjectFromPrefix(task.title)
|
||||||
|
|
||||||
if (index === 0) {
|
if (index === 0) {
|
||||||
return task
|
return task
|
||||||
|
@ -47,9 +47,9 @@ export function parseSubtasksViaIndention(taskTitles: string): TaskWithParent[]
|
||||||
} while (parentSpaces >= matchedSpaces)
|
} while (parentSpaces >= matchedSpaces)
|
||||||
task.title = cleanupTitle(title.replace(spaceRegex, ''))
|
task.title = cleanupTitle(title.replace(spaceRegex, ''))
|
||||||
task.parent = task.parent.replace(spaceRegex, '')
|
task.parent = task.parent.replace(spaceRegex, '')
|
||||||
if (task.list === null) {
|
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.list = getListFromPrefix(task.parent)
|
task.project = getProjectFromPrefix(task.parent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
import type { RouteRecordName } from 'vue-router'
|
||||||
|
import router from '@/router'
|
||||||
|
|
||||||
|
import type {IProject} from '@/modelTypes/IProject'
|
||||||
|
|
||||||
|
export type ProjectRouteName = Extract<RouteRecordName, string>
|
||||||
|
export type ProjectViewSettings = Record<
|
||||||
|
IProject['id'],
|
||||||
|
Extract<RouteRecordName, ProjectRouteName>
|
||||||
|
>
|
||||||
|
|
||||||
|
const SETTINGS_KEY_PROJECT_VIEW = 'projectView'
|
||||||
|
|
||||||
|
// TODO: remove migration when releasing 1.0
|
||||||
|
type ListViewSettings = ProjectViewSettings
|
||||||
|
const SETTINGS_KEY_DEPRECATED_LIST_VIEW = 'listView'
|
||||||
|
function migrateStoredProjectRouteSettings() {
|
||||||
|
try {
|
||||||
|
const listViewSettingsString = localStorage.getItem(SETTINGS_KEY_DEPRECATED_LIST_VIEW)
|
||||||
|
if (listViewSettingsString === null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// A) the first version stored one setting for all lists in a string
|
||||||
|
if (listViewSettingsString.startsWith('list.')) {
|
||||||
|
const projectView = listViewSettingsString.replace('list.', 'project.')
|
||||||
|
|
||||||
|
if (!router.hasRoute(projectView)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return projectView as RouteRecordName
|
||||||
|
}
|
||||||
|
|
||||||
|
// B) the last version used a 'list.' prefix
|
||||||
|
const listViewSettings: ListViewSettings = JSON.parse(listViewSettingsString)
|
||||||
|
|
||||||
|
const projectViewSettingEntries = Object.entries(listViewSettings).map(([id, value]) => {
|
||||||
|
return [id, value.replace('list.', 'project.')]
|
||||||
|
})
|
||||||
|
const projectViewSettings = Object.fromEntries(projectViewSettingEntries)
|
||||||
|
|
||||||
|
localStorage.setItem(SETTINGS_KEY_PROJECT_VIEW, JSON.stringify(projectViewSettings))
|
||||||
|
} catch(e) {
|
||||||
|
//
|
||||||
|
} finally {
|
||||||
|
localStorage.removeItem(SETTINGS_KEY_DEPRECATED_LIST_VIEW)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the current project view to local storage
|
||||||
|
*/
|
||||||
|
export function saveProjectView(projectId: IProject['id'], routeName: string) {
|
||||||
|
if (routeName.includes('settings.')) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!projectId) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// We use local storage and not the store here to make it persistent across reloads.
|
||||||
|
const savedProjectView = localStorage.getItem(SETTINGS_KEY_PROJECT_VIEW)
|
||||||
|
let savedProjectViewSettings: ProjectViewSettings | false = false
|
||||||
|
if (savedProjectView !== null) {
|
||||||
|
savedProjectViewSettings = JSON.parse(savedProjectView) as ProjectViewSettings
|
||||||
|
}
|
||||||
|
|
||||||
|
let projectViewSettings: ProjectViewSettings = {}
|
||||||
|
if (savedProjectViewSettings) {
|
||||||
|
projectViewSettings = savedProjectViewSettings
|
||||||
|
}
|
||||||
|
|
||||||
|
projectViewSettings[projectId] = routeName
|
||||||
|
localStorage.setItem(SETTINGS_KEY_PROJECT_VIEW, JSON.stringify(projectViewSettings))
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getProjectView = (projectId: IProject['id']) => {
|
||||||
|
// TODO: remove migration when releasing 1.0
|
||||||
|
const migratedProjectView = migrateStoredProjectRouteSettings()
|
||||||
|
|
||||||
|
if (migratedProjectView !== undefined && router.hasRoute(migratedProjectView)) {
|
||||||
|
return migratedProjectView
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const projectViewSettingsString = localStorage.getItem(SETTINGS_KEY_PROJECT_VIEW)
|
||||||
|
if (!projectViewSettingsString) {
|
||||||
|
throw new Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
const projectViewSettings = JSON.parse(projectViewSettingsString) as ProjectViewSettings
|
||||||
|
if (!router.hasRoute(projectViewSettings[projectId])) {
|
||||||
|
throw new Error()
|
||||||
|
}
|
||||||
|
return projectViewSettings[projectId]
|
||||||
|
} catch (e) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
import type {IBucket} from '@/modelTypes/IBucket'
|
import type {IBucket} from '@/modelTypes/IBucket'
|
||||||
import type {IList} from '@/modelTypes/IList'
|
import type {IProject} from '@/modelTypes/IProject'
|
||||||
|
|
||||||
const key = 'collapsedBuckets'
|
const key = 'collapsedBuckets'
|
||||||
|
|
||||||
|
@ -13,22 +13,22 @@ function getAllState() {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const saveCollapsedBucketState = (
|
export const saveCollapsedBucketState = (
|
||||||
listId: IList['id'],
|
projectId: IProject['id'],
|
||||||
collapsedBuckets: CollapsedBuckets,
|
collapsedBuckets: CollapsedBuckets,
|
||||||
) => {
|
) => {
|
||||||
const state = getAllState()
|
const state = getAllState()
|
||||||
state[listId] = collapsedBuckets
|
state[projectId] = collapsedBuckets
|
||||||
for (const bucketId in state[listId]) {
|
for (const bucketId in state[projectId]) {
|
||||||
if (!state[listId][bucketId]) {
|
if (!state[projectId][bucketId]) {
|
||||||
delete state[listId][bucketId]
|
delete state[projectId][bucketId]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
localStorage.setItem(key, JSON.stringify(state))
|
localStorage.setItem(key, JSON.stringify(state))
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getCollapsedBucketState(listId : IList['id']) {
|
export function getCollapsedBucketState(projectId : IProject['id']) {
|
||||||
const state = getAllState()
|
const state = getAllState()
|
||||||
return typeof state[listId] !== 'undefined'
|
return typeof state[projectId] !== 'undefined'
|
||||||
? state[listId]
|
? state[projectId]
|
||||||
: {}
|
: {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
import type { IList } from '@/modelTypes/IList'
|
|
||||||
|
|
||||||
type ListView = Record<IList['id'], string>
|
|
||||||
|
|
||||||
const DEFAULT_LIST_VIEW = 'list.list' as const
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save the current list view to local storage
|
|
||||||
*/
|
|
||||||
export function saveListView(listId: IList['id'], routeName: string) {
|
|
||||||
if (routeName.includes('settings.')) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!listId) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// We use local storage and not the store here to make it persistent across reloads.
|
|
||||||
const savedListView = localStorage.getItem('listView')
|
|
||||||
let savedListViewJson: ListView | false = false
|
|
||||||
if (savedListView !== null) {
|
|
||||||
savedListViewJson = JSON.parse(savedListView) as ListView
|
|
||||||
}
|
|
||||||
|
|
||||||
let listView: ListView = {}
|
|
||||||
if (savedListViewJson) {
|
|
||||||
listView = savedListViewJson
|
|
||||||
}
|
|
||||||
|
|
||||||
listView[listId] = routeName
|
|
||||||
localStorage.setItem('listView', JSON.stringify(listView))
|
|
||||||
}
|
|
||||||
|
|
||||||
export const getListView = (listId: IList['id']) => {
|
|
||||||
// Remove old stored settings
|
|
||||||
const savedListView = localStorage.getItem('listView')
|
|
||||||
if (savedListView !== null && savedListView.startsWith('list.')) {
|
|
||||||
localStorage.removeItem('listView')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!savedListView) {
|
|
||||||
return DEFAULT_LIST_VIEW
|
|
||||||
}
|
|
||||||
|
|
||||||
const savedListViewJson: ListView = JSON.parse(savedListView)
|
|
||||||
|
|
||||||
if (!savedListViewJson[listId]) {
|
|
||||||
return DEFAULT_LIST_VIEW
|
|
||||||
}
|
|
||||||
|
|
||||||
return savedListViewJson[listId]
|
|
||||||
}
|
|
|
@ -15,7 +15,7 @@ export const SUPPORTED_LOCALES = {
|
||||||
'pt-PT': 'Português',
|
'pt-PT': 'Português',
|
||||||
'zh-CN': 'Chinese',
|
'zh-CN': 'Chinese',
|
||||||
'no-NO': 'Norsk Bokmål',
|
'no-NO': 'Norsk Bokmål',
|
||||||
} as Record<string, string>
|
} as const
|
||||||
|
|
||||||
export type SupportedLocale = keyof typeof SUPPORTED_LOCALES
|
export type SupportedLocale = keyof typeof SUPPORTED_LOCALES
|
||||||
|
|
||||||
|
@ -23,12 +23,12 @@ export const DEFAULT_LANGUAGE: SupportedLocale= 'en'
|
||||||
|
|
||||||
export type ISOLanguage = string
|
export type ISOLanguage = string
|
||||||
|
|
||||||
// we load all messsages async
|
// we load all messages async
|
||||||
export const i18n = createI18n({
|
export const i18n = createI18n({
|
||||||
fallbackLocale: DEFAULT_LANGUAGE,
|
fallbackLocale: DEFAULT_LANGUAGE,
|
||||||
legacy: false,
|
legacy: false,
|
||||||
messages: {
|
messages: {
|
||||||
en: langEN,
|
[DEFAULT_LANGUAGE]: langEN,
|
||||||
} as Record<SupportedLocale, any>,
|
} as Record<SupportedLocale, any>,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -54,16 +54,16 @@ export async function setLanguage(lang: SupportedLocale = getCurrentLanguage()):
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getCurrentLanguage(): SupportedLocale {
|
export function getCurrentLanguage(): SupportedLocale {
|
||||||
const savedLanguage = localStorage.getItem('language')
|
const savedLanguage = localStorage.getItem('language') as SupportedLocale | null
|
||||||
if (savedLanguage !== null) {
|
if (savedLanguage !== null) {
|
||||||
return savedLanguage
|
return savedLanguage
|
||||||
}
|
}
|
||||||
|
|
||||||
const browserLanguage = navigator.language
|
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 + '-')
|
return langKey === browserLanguage || langKey.startsWith(browserLanguage + '-')
|
||||||
})
|
}) as SupportedLocale | undefined
|
||||||
|
|
||||||
return language || DEFAULT_LANGUAGE
|
return language || DEFAULT_LANGUAGE
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,10 +5,10 @@
|
||||||
"welcomeDay": "Hi {username}!",
|
"welcomeDay": "Hi {username}!",
|
||||||
"welcomeEvening": "Good Evening {username}!",
|
"welcomeEvening": "Good Evening {username}!",
|
||||||
"lastViewed": "Last viewed",
|
"lastViewed": "Last viewed",
|
||||||
"list": {
|
"project": {
|
||||||
"newText": "You can create a new list for your new tasks:",
|
"newText": "You can create a new project for your new tasks:",
|
||||||
"new": "New list",
|
"new": "New project",
|
||||||
"importText": "Or import your lists and tasks from other services into Vikunja:",
|
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||||
"import": "Import your data into Vikunja"
|
"import": "Import your data into Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
"weekStartSunday": "Sunday",
|
"weekStartSunday": "Sunday",
|
||||||
"weekStartMonday": "Monday",
|
"weekStartMonday": "Monday",
|
||||||
"language": "Language",
|
"language": "Language",
|
||||||
"defaultList": "Default List",
|
"defaultProject": "Default Project",
|
||||||
"timezone": "Time Zone",
|
"timezone": "Time Zone",
|
||||||
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
||||||
},
|
},
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
},
|
},
|
||||||
"deletion": {
|
"deletion": {
|
||||||
"title": "Delete your Vikunja Account",
|
"title": "Delete your Vikunja Account",
|
||||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, lists, tasks and everything associated with it.",
|
"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.",
|
||||||
"text2": "To proceed, please enter your password. You will receive an email with further instructions.",
|
"text2": "To proceed, please enter your password. You will receive an email with further instructions.",
|
||||||
"confirm": "Delete my account",
|
"confirm": "Delete my account",
|
||||||
"requestSuccess": "The request was successful. You'll receive an email with further instructions.",
|
"requestSuccess": "The request was successful. You'll receive an email with further instructions.",
|
||||||
|
@ -157,47 +157,39 @@
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"title": "Export your Vikunja data",
|
"title": "Export your Vikunja data",
|
||||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Lists, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
"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.",
|
||||||
"descriptionPasswordRequired": "Please enter your password to proceed:",
|
"descriptionPasswordRequired": "Please enter your password to proceed:",
|
||||||
"request": "Request a copy of my Vikunja Data",
|
"request": "Request a copy of my Vikunja Data",
|
||||||
"success": "You've successfully requested your Vikunja Data! We will send you an email once it's ready to download.",
|
"success": "You've successfully requested your Vikunja Data! We will send you an email once it's ready to download.",
|
||||||
"downloadTitle": "Download your exported Vikunja data"
|
"downloadTitle": "Download your exported Vikunja data"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"archived": "This list is archived. It is not possible to create new or edit tasks for it.",
|
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||||
"title": "List Title",
|
"title": "Project Title",
|
||||||
"color": "Color",
|
"color": "Color",
|
||||||
"lists": "Lists",
|
"projects": "Projects",
|
||||||
"list": {
|
"search": "Type to search for a project…",
|
||||||
"title": "List",
|
"searchSelect": "Click or press enter to select this project",
|
||||||
"add": "Add",
|
"shared": "Shared Projects",
|
||||||
"addPlaceholder": "Add a new task…",
|
"noDescriptionAvailable": "No project description is available.",
|
||||||
"empty": "This list is currently empty.",
|
|
||||||
"newTaskCta": "Create a new task.",
|
|
||||||
"editTask": "Edit Task"
|
|
||||||
},
|
|
||||||
"search": "Type to search for a list…",
|
|
||||||
"searchSelect": "Click or press enter to select this list",
|
|
||||||
"shared": "Shared Lists",
|
|
||||||
"noDescriptionAvailable": "No list description is available.",
|
|
||||||
"create": {
|
"create": {
|
||||||
"header": "New list",
|
"header": "New project",
|
||||||
"titlePlaceholder": "The list's title goes here…",
|
"titlePlaceholder": "The project's title goes here…",
|
||||||
"addTitleRequired": "Please specify a title.",
|
"addTitleRequired": "Please specify a title.",
|
||||||
"createdSuccess": "The list was successfully created.",
|
"createdSuccess": "The project was successfully created.",
|
||||||
"addListRequired": "Please specify a list or set a default list in the settings."
|
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"title": "Archive \"{list}\"",
|
"title": "Archive \"{project}\"",
|
||||||
"archive": "Archive this list",
|
"archive": "Archive this project",
|
||||||
"unarchive": "Un-Archive this list",
|
"unarchive": "Un-Archive this project",
|
||||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||||
"archiveText": "You won't be able to edit this list or create new tasks until you un-archive it.",
|
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||||
"success": "The list was successfully archived."
|
"success": "The project was successfully archived."
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
"title": "Set list background",
|
"title": "Set project background",
|
||||||
"remove": "Remove Background",
|
"remove": "Remove Background",
|
||||||
"upload": "Choose a background from your pc",
|
"upload": "Choose a background from your pc",
|
||||||
"searchPlaceholder": "Search for a background…",
|
"searchPlaceholder": "Search for a background…",
|
||||||
|
@ -207,40 +199,40 @@
|
||||||
"removeSuccess": "The background has been removed successfully!"
|
"removeSuccess": "The background has been removed successfully!"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Delete \"{list}\"",
|
"title": "Delete \"{project}\"",
|
||||||
"header": "Delete this list",
|
"header": "Delete this project",
|
||||||
"text1": "Are you sure you want to delete this list and all of its contents?",
|
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||||
"success": "The list was successfully deleted.",
|
"success": "The project was successfully deleted.",
|
||||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||||
"noTasksToDelete": "This list does not contain any tasks, it should be safe to delete."
|
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||||
},
|
},
|
||||||
"duplicate": {
|
"duplicate": {
|
||||||
"title": "Duplicate this list",
|
"title": "Duplicate this project",
|
||||||
"label": "Duplicate",
|
"label": "Duplicate",
|
||||||
"text": "Select a namespace which should hold the duplicated list:",
|
"text": "Select a namespace which should hold the duplicated project:",
|
||||||
"success": "The list was successfully duplicated."
|
"success": "The project was successfully duplicated."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"header": "Edit This List",
|
"header": "Edit This Project",
|
||||||
"title": "Edit \"{list}\"",
|
"title": "Edit \"{project}\"",
|
||||||
"titlePlaceholder": "The list title goes here…",
|
"titlePlaceholder": "The project title goes here…",
|
||||||
"identifierTooltip": "The list identifier can be used to uniquely identify a task across lists. You can set it to empty to disable it.",
|
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||||
"identifier": "List Identifier",
|
"identifier": "Project Identifier",
|
||||||
"identifierPlaceholder": "The list identifier goes here…",
|
"identifierPlaceholder": "The project identifier goes here…",
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "The lists description goes here…",
|
"descriptionPlaceholder": "The projects description goes here…",
|
||||||
"color": "Color",
|
"color": "Color",
|
||||||
"success": "The list was successfully updated."
|
"success": "The project was successfully updated."
|
||||||
},
|
},
|
||||||
"share": {
|
"share": {
|
||||||
"header": "Share this list",
|
"header": "Share this project",
|
||||||
"title": "Share \"{list}\"",
|
"title": "Share \"{project}\"",
|
||||||
"share": "Share",
|
"share": "Share",
|
||||||
"links": {
|
"links": {
|
||||||
"title": "Share Links",
|
"title": "Share Links",
|
||||||
"what": "What is a share link?",
|
"what": "What is a share link?",
|
||||||
"explanation": "Share Links allow you to easily share a list with other users who don't have an account on Vikunja.",
|
"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",
|
"create": "Create a new link share",
|
||||||
"name": "Name (optional)",
|
"name": "Name (optional)",
|
||||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||||
|
@ -249,7 +241,7 @@
|
||||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||||
"noName": "No name set",
|
"noName": "No name set",
|
||||||
"remove": "Remove a link share",
|
"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 list with this link share. This cannot be undone!",
|
"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.",
|
"createSuccess": "The link share was successfully created.",
|
||||||
"deleteSuccess": "The link share was successfully deleted",
|
"deleteSuccess": "The link share was successfully deleted",
|
||||||
"view": "View",
|
"view": "View",
|
||||||
|
@ -278,6 +270,14 @@
|
||||||
"delete": "Delete"
|
"delete": "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"
|
||||||
|
},
|
||||||
"gantt": {
|
"gantt": {
|
||||||
"title": "Gantt",
|
"title": "Gantt",
|
||||||
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||||
|
@ -322,36 +322,36 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"namespace": {
|
"namespace": {
|
||||||
"title": "Namespaces & Lists",
|
"title": "Namespaces & Projects",
|
||||||
"namespace": "Namespace",
|
"namespace": "Namespace",
|
||||||
"showArchived": "Show Archived",
|
"showArchived": "Show Archived",
|
||||||
"noneAvailable": "You don't have any namespaces right now.",
|
"noneAvailable": "You don't have any namespaces right now.",
|
||||||
"unarchive": "Un-Archive",
|
"unarchive": "Un-Archive",
|
||||||
"archived": "Archived",
|
"archived": "Archived",
|
||||||
"noLists": "This namespace does not contain any lists.",
|
"noProjects": "This namespace does not contain any projects.",
|
||||||
"createList": "Create a new list in this namespace.",
|
"createProject": "Create a new project in this namespace.",
|
||||||
"namespaces": "Namespaces",
|
"namespaces": "Namespaces",
|
||||||
"search": "Type to search for a namespace…",
|
"search": "Type to search for a namespace…",
|
||||||
"create": {
|
"create": {
|
||||||
"title": "New namespace",
|
"title": "New namespace",
|
||||||
"titleRequired": "Please specify a title.",
|
"titleRequired": "Please specify a title.",
|
||||||
"explanation": "A namespace is a collection of lists you can share and use to organize your lists with. In fact, every list belongs to a namespace.",
|
"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.",
|
||||||
"tooltip": "What's a namespace?",
|
"tooltip": "What's a namespace?",
|
||||||
"success": "The namespace was successfully created."
|
"success": "The namespace was successfully created."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"titleArchive": "Archive \"{namespace}\"",
|
"titleArchive": "Archive \"{namespace}\"",
|
||||||
"titleUnarchive": "Un-Archive \"{namespace}\"",
|
"titleUnarchive": "Un-Archive \"{namespace}\"",
|
||||||
"archiveText": "You won't be able to edit this namespace or create new lists until you un-archive it. This will also archive all lists in this 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 lists or edit it.",
|
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||||
"success": "The namespace was successfully archived.",
|
"success": "The namespace was successfully archived.",
|
||||||
"unarchiveSuccess": "The namespace was successfully un-archived.",
|
"unarchiveSuccess": "The namespace was successfully un-archived.",
|
||||||
"description": "If a namespace is archived, you cannot create new lists or edit it."
|
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Delete \"{namespace}\"",
|
"title": "Delete \"{namespace}\"",
|
||||||
"text1": "Are you sure you want to delete this namespace and all of its contents?",
|
"text1": "Are you sure you want to delete this namespace and all of its contents?",
|
||||||
"text2": "This includes all lists and tasks and CANNOT BE UNDONE!",
|
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||||
"success": "The namespace was successfully deleted."
|
"success": "The namespace was successfully deleted."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
|
@ -371,8 +371,8 @@
|
||||||
"isArchived": "This namespace is archived"
|
"isArchived": "This namespace is archived"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"sharedLists": {
|
"sharedProjects": {
|
||||||
"title": "Shared Lists"
|
"title": "Shared Projects"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favorites"
|
"title": "Favorites"
|
||||||
|
@ -403,7 +403,7 @@
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "New Saved Filter",
|
"title": "New Saved Filter",
|
||||||
"description": "A saved filter is a virtual list which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
"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.",
|
||||||
"action": "Create new saved filter",
|
"action": "Create new saved filter",
|
||||||
"titleRequired": "Please provide a title for the filter."
|
"titleRequired": "Please provide a title for the filter."
|
||||||
},
|
},
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
"label": {
|
"label": {
|
||||||
"title": "Labels",
|
"title": "Labels",
|
||||||
"manage": "Manage labels",
|
"manage": "Manage labels",
|
||||||
"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 list you have access.",
|
"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.",
|
||||||
"newCTA": "You currently do not have any labels.",
|
"newCTA": "You currently do not have any labels.",
|
||||||
"search": "Type to search for a label…",
|
"search": "Type to search for a label…",
|
||||||
"create": {
|
"create": {
|
||||||
|
@ -460,7 +460,7 @@
|
||||||
},
|
},
|
||||||
"sharing": {
|
"sharing": {
|
||||||
"authenticating": "Authenticating…",
|
"authenticating": "Authenticating…",
|
||||||
"passwordRequired": "This shared list requires a password. Please enter it below:",
|
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||||
"error": "An error occured.",
|
"error": "An error occured.",
|
||||||
"invalidPassword": "The password is invalid."
|
"invalidPassword": "The password is invalid."
|
||||||
},
|
},
|
||||||
|
@ -529,7 +529,7 @@
|
||||||
"code": "Code",
|
"code": "Code",
|
||||||
"quote": "Quote",
|
"quote": "Quote",
|
||||||
"unorderedList": "Unordered List",
|
"unorderedList": "Unordered List",
|
||||||
"orderedList": "Ordered List",
|
"orderedList ": "Ordered List",
|
||||||
"cleanBlock": "Clean Block",
|
"cleanBlock": "Clean Block",
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"image": "Image",
|
"image": "Image",
|
||||||
|
@ -602,6 +602,7 @@
|
||||||
"addReminder": "Add a new reminder…",
|
"addReminder": "Add a new reminder…",
|
||||||
"doneSuccess": "The task was successfully marked as done.",
|
"doneSuccess": "The task was successfully marked as done.",
|
||||||
"undoneSuccess": "The task was successfully un-marked as done.",
|
"undoneSuccess": "The task was successfully un-marked as done.",
|
||||||
|
"undo": "Undo",
|
||||||
"openDetail": "Open task detail view",
|
"openDetail": "Open task detail view",
|
||||||
"checklistTotal": "{checked} of {total} tasks",
|
"checklistTotal": "{checked} of {total} tasks",
|
||||||
"checklistAllDone": "{total} tasks",
|
"checklistAllDone": "{total} tasks",
|
||||||
|
@ -618,7 +619,7 @@
|
||||||
"chooseDueDate": "Click here to set a due date",
|
"chooseDueDate": "Click here to set a due date",
|
||||||
"chooseStartDate": "Click here to set a start date",
|
"chooseStartDate": "Click here to set a start date",
|
||||||
"chooseEndDate": "Click here to set an end date",
|
"chooseEndDate": "Click here to set an end date",
|
||||||
"move": "Move task to a different list",
|
"move": "Move task to a different project",
|
||||||
"done": "Mark task done!",
|
"done": "Mark task done!",
|
||||||
"undone": "Mark as undone",
|
"undone": "Mark as undone",
|
||||||
"created": "Created {0} by {1}",
|
"created": "Created {0} by {1}",
|
||||||
|
@ -626,7 +627,7 @@
|
||||||
"doneAt": "Done {0}",
|
"doneAt": "Done {0}",
|
||||||
"updateSuccess": "The task was saved successfully.",
|
"updateSuccess": "The task was saved successfully.",
|
||||||
"deleteSuccess": "The task has been deleted successfully.",
|
"deleteSuccess": "The task has been deleted successfully.",
|
||||||
"belongsToList": "This task belongs to list '{list}'",
|
"belongsToProject": "This task belongs to project '{project}'",
|
||||||
"due": "Due {at}",
|
"due": "Due {at}",
|
||||||
"closePopup": "Close popup",
|
"closePopup": "Close popup",
|
||||||
"delete": {
|
"delete": {
|
||||||
|
@ -646,7 +647,7 @@
|
||||||
"percentDone": "Set Progress",
|
"percentDone": "Set Progress",
|
||||||
"attachments": "Add Attachments",
|
"attachments": "Add Attachments",
|
||||||
"relatedTasks": "Add Relation",
|
"relatedTasks": "Add Relation",
|
||||||
"moveList": "Move",
|
"moveProject": "Move",
|
||||||
"color": "Set Color",
|
"color": "Set Color",
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
"favorite": "Add to Favorites",
|
"favorite": "Add to Favorites",
|
||||||
|
@ -673,21 +674,21 @@
|
||||||
"updated": "Updated"
|
"updated": "Updated"
|
||||||
},
|
},
|
||||||
"subscription": {
|
"subscription": {
|
||||||
"subscribedListThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this list through its namespace.",
|
"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.",
|
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
|
||||||
"subscribedTaskThroughParentList": "You can't unsubscribe here because you are subscribed to this task through its list.",
|
"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.",
|
"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.",
|
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
|
||||||
"subscribedList": "You are currently subscribed to this list and will receive notifications for changes.",
|
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||||
"notSubscribedList": "You are not subscribed to this list and won't 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.",
|
"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.",
|
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
|
||||||
"subscribe": "Subscribe",
|
"subscribe": "Subscribe",
|
||||||
"unsubscribe": "Unsubscribe",
|
"unsubscribe": "Unsubscribe",
|
||||||
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
||||||
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
||||||
"subscribeSuccessList": "You are now subscribed to this list",
|
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||||
},
|
},
|
||||||
|
@ -761,7 +762,7 @@
|
||||||
"new": "New Task Relation",
|
"new": "New Task Relation",
|
||||||
"searchPlaceholder": "Type search for a new task to add as related…",
|
"searchPlaceholder": "Type search for a new task to add as related…",
|
||||||
"createPlaceholder": "Add this as new related task",
|
"createPlaceholder": "Add this as new related task",
|
||||||
"differentList": "This task belongs to a different list.",
|
"differentProject": "This task belongs to a different project.",
|
||||||
"differentNamespace": "This task belongs to a different namespace.",
|
"differentNamespace": "This task belongs to a different namespace.",
|
||||||
"noneYet": "No task relations yet.",
|
"noneYet": "No task relations yet.",
|
||||||
"delete": "Delete Task Relation",
|
"delete": "Delete Task Relation",
|
||||||
|
@ -811,10 +812,10 @@
|
||||||
"priority1": "To set a task's priority, add a number 1-5, prefixed with a {prefix}.",
|
"priority1": "To set a task's priority, add a number 1-5, prefixed with a {prefix}.",
|
||||||
"priority2": "The higher the number, the higher the priority.",
|
"priority2": "The higher the number, the higher the priority.",
|
||||||
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
||||||
"list1": "To set a list for the task to appear in, enter its name prefixed with {prefix}.",
|
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||||
"list2": "This will return an error if the list does not exist.",
|
"project2": "This will return an error if the project does not exist.",
|
||||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||||
"list4": "For example: {prefix}\"List with spaces\".",
|
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||||
"dateAndTime": "Date and time",
|
"dateAndTime": "Date and time",
|
||||||
"date": "Any date will be used as the due date of the new task. You can use dates in any of these formats:",
|
"date": "Any date will be used as the due date of the new task. You can use dates in any of these formats:",
|
||||||
"dateWeekday": "any weekday, will use the next date with that date",
|
"dateWeekday": "any weekday, will use the next date with that date",
|
||||||
|
@ -847,19 +848,19 @@
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Delete the team",
|
"header": "Delete the team",
|
||||||
"text1": "Are you sure you want to delete this team and all of its members?",
|
"text1": "Are you sure you want to delete this team and all of its members?",
|
||||||
"text2": "All team members will lose access to lists and namespaces shared with this team. This CANNOT BE UNDONE!",
|
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||||
"success": "The team was successfully deleted."
|
"success": "The team was successfully deleted."
|
||||||
},
|
},
|
||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"header": "Remove a user from the team",
|
"header": "Remove a user from the team",
|
||||||
"text1": "Are you sure you want to remove this user from the team?",
|
"text1": "Are you sure you want to remove this user from the team?",
|
||||||
"text2": "They will lose access to all lists and namespaces this team has access to. This CANNOT BE UNDONE!",
|
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||||
"success": "The user was successfully deleted from the team."
|
"success": "The user was successfully deleted from the team."
|
||||||
},
|
},
|
||||||
"leave": {
|
"leave": {
|
||||||
"title": "Leave team",
|
"title": "Leave team",
|
||||||
"text1": "Are you sure you want to leave this team?",
|
"text1": "Are you sure you want to leave this team?",
|
||||||
"text2": "You will lose access to all lists and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
"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.",
|
||||||
"success": "You have successfully left the team."
|
"success": "You have successfully left the team."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -891,12 +892,12 @@
|
||||||
"attachment": "Add an attachment to this task",
|
"attachment": "Add an attachment to this task",
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another project",
|
||||||
"reminder": "Manage reminders of this task",
|
"reminder": "Manage reminders of this task",
|
||||||
"description": "Toggle editing of the task description"
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"title": "List Views",
|
"title": "Project Views",
|
||||||
"switchToListView": "Switch to list view",
|
"switchToListView": "Switch to list view",
|
||||||
"switchToGanttView": "Switch to gantt view",
|
"switchToGanttView": "Switch to gantt view",
|
||||||
"switchToKanbanView": "Switch to kanban view",
|
"switchToKanbanView": "Switch to kanban view",
|
||||||
|
@ -906,7 +907,7 @@
|
||||||
"title": "Navigation",
|
"title": "Navigation",
|
||||||
"overview": "Navigate to overview",
|
"overview": "Navigate to overview",
|
||||||
"upcoming": "Navigate to upcoming tasks",
|
"upcoming": "Navigate to upcoming tasks",
|
||||||
"namespaces": "Navigate to namespaces & lists",
|
"namespaces": "Navigate to namespaces & projects",
|
||||||
"labels": "Navigate to labels",
|
"labels": "Navigate to labels",
|
||||||
"teams": "Navigate to teams"
|
"teams": "Navigate to teams"
|
||||||
}
|
}
|
||||||
|
@ -923,7 +924,7 @@
|
||||||
"unarchive": "Un-Archive",
|
"unarchive": "Un-Archive",
|
||||||
"setBackground": "Set background",
|
"setBackground": "Set background",
|
||||||
"share": "Share",
|
"share": "Share",
|
||||||
"newList": "New list"
|
"newProject": "New project"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"url": "Vikunja URL",
|
"url": "Vikunja URL",
|
||||||
|
@ -942,24 +943,24 @@
|
||||||
"notification": {
|
"notification": {
|
||||||
"title": "Notifications",
|
"title": "Notifications",
|
||||||
"none": "You don't have any notifications. Have a nice day!",
|
"none": "You don't have any notifications. Have a nice day!",
|
||||||
"explainer": "Notifications will appear here when actions on namespaces, lists or tasks you subscribed to happen."
|
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||||
},
|
},
|
||||||
"quickActions": {
|
"quickActions": {
|
||||||
"commands": "Commands",
|
"commands": "Commands",
|
||||||
"placeholder": "Type a command or search…",
|
"placeholder": "Type a command or search…",
|
||||||
"hint": "You can use {list} to limit the search to a list. Combine {list} or {label} (labels) with a search query to search for a task with these labels or on that list. Use {assignee} to only search for teams.",
|
"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.",
|
||||||
"tasks": "Tasks",
|
"tasks": "Tasks",
|
||||||
"lists": "Lists",
|
"projects": "Projects",
|
||||||
"teams": "Teams",
|
"teams": "Teams",
|
||||||
"newList": "Enter the title of the new list…",
|
"newProject": "Enter the title of the new project…",
|
||||||
"newTask": "Enter the title of the new task…",
|
"newTask": "Enter the title of the new task…",
|
||||||
"newNamespace": "Enter the title of the new namespace…",
|
"newNamespace": "Enter the title of the new namespace…",
|
||||||
"newTeam": "Enter the name of the new team…",
|
"newTeam": "Enter the name of the new team…",
|
||||||
"createTask": "Create a task in the current list ({title})",
|
"createTask": "Create a task in the current project ({title})",
|
||||||
"createList": "Create a list in the current namespace ({title})",
|
"createProject": "Create a project in the current namespace ({title})",
|
||||||
"cmds": {
|
"cmds": {
|
||||||
"newTask": "New task",
|
"newTask": "New task",
|
||||||
"newList": "New list",
|
"newProject": "New project",
|
||||||
"newNamespace": "New namespace",
|
"newNamespace": "New namespace",
|
||||||
"newTeam": "New team"
|
"newTeam": "New team"
|
||||||
}
|
}
|
||||||
|
@ -991,15 +992,15 @@
|
||||||
"1018": "The user avatar type setting is invalid.",
|
"1018": "The user avatar type setting is invalid.",
|
||||||
"2001": "ID cannot be empty or 0.",
|
"2001": "ID cannot be empty or 0.",
|
||||||
"2002": "Some of the request data was invalid.",
|
"2002": "Some of the request data was invalid.",
|
||||||
"3001": "The list does not exist.",
|
"3001": "The project does not exist.",
|
||||||
"3004": "You need to have read permissions on that list to perform that action.",
|
"3004": "You need to have read permissions on that project to perform that action.",
|
||||||
"3005": "The list title cannot be empty.",
|
"3005": "The project title cannot be empty.",
|
||||||
"3006": "The list share does not exist.",
|
"3006": "The project share does not exist.",
|
||||||
"3007": "A list with this identifier already exists.",
|
"3007": "A project with this identifier already exists.",
|
||||||
"3008": "The list is archived and can therefore only be accessed read only. This is also true for all tasks associated with this list.",
|
"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 list task text cannot be empty.",
|
"4001": "The project task text cannot be empty.",
|
||||||
"4002": "The list task does not exist.",
|
"4002": "The project task does not exist.",
|
||||||
"4003": "All bulk editing tasks must belong to the same list.",
|
"4003": "All bulk editing tasks must belong to the same project.",
|
||||||
"4004": "Need at least one task when bulk editing tasks.",
|
"4004": "Need at least one task when bulk editing tasks.",
|
||||||
"4005": "You do not have the right to see the task.",
|
"4005": "You do not have the right to see the task.",
|
||||||
"4006": "You can't set a parent task as the task itself.",
|
"4006": "You can't set a parent task as the task itself.",
|
||||||
|
@ -1025,21 +1026,21 @@
|
||||||
"5012": "The namespace is archived and can therefore only be accessed read only.",
|
"5012": "The namespace is archived and can therefore only be accessed read only.",
|
||||||
"6001": "The team name cannot be empty.",
|
"6001": "The team name cannot be empty.",
|
||||||
"6002": "The team does not exist.",
|
"6002": "The team does not exist.",
|
||||||
"6004": "The team already has access to that namespace or list.",
|
"6004": "The team already has access to that namespace or project.",
|
||||||
"6005": "The user is already a member of that team.",
|
"6005": "The user is already a member of that team.",
|
||||||
"6006": "Cannot delete the last team member.",
|
"6006": "Cannot delete the last team member.",
|
||||||
"6007": "The team does not have access to the list to perform that action.",
|
"6007": "The team does not have access to the project to perform that action.",
|
||||||
"7002": "The user already has access to that list.",
|
"7002": "The user already has access to that project.",
|
||||||
"7003": "You do not have access to that list.",
|
"7003": "You do not have access to that project.",
|
||||||
"8001": "This label already exists on that task.",
|
"8001": "This label already exists on that task.",
|
||||||
"8002": "The label does not exist.",
|
"8002": "The label does not exist.",
|
||||||
"8003": "You do not have access to this label.",
|
"8003": "You do not have access to this label.",
|
||||||
"9001": "The right is invalid.",
|
"9001": "The right is invalid.",
|
||||||
"10001": "The bucket does not exist.",
|
"10001": "The bucket does not exist.",
|
||||||
"10002": "The bucket does not belong to that list.",
|
"10002": "The bucket does not belong to that project.",
|
||||||
"10003": "You cannot remove the last bucket on a list.",
|
"10003": "You cannot remove the last bucket on a project.",
|
||||||
"10004": "You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold.",
|
"10004": "You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold.",
|
||||||
"10005": "There can be only one done bucket per list.",
|
"10005": "There can be only one done bucket per project.",
|
||||||
"11001": "The saved filter does not exist.",
|
"11001": "The saved filter does not exist.",
|
||||||
"11002": "Saved filters are not available for link shares.",
|
"11002": "Saved filters are not available for link shares.",
|
||||||
"12001": "The subscription entity type is invalid.",
|
"12001": "The subscription entity type is invalid.",
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
"welcomeDay": "Ahoj {username}!",
|
"welcomeDay": "Ahoj {username}!",
|
||||||
"welcomeEvening": "Dobrý večer {username}!",
|
"welcomeEvening": "Dobrý večer {username}!",
|
||||||
"lastViewed": "Naposledy zobrazeno",
|
"lastViewed": "Naposledy zobrazeno",
|
||||||
"list": {
|
"project": {
|
||||||
"newText": "Můžete vytvořit nový seznam pro své nové úkoly:",
|
"newText": "You can create a new project for your new tasks:",
|
||||||
"new": "Nový seznam",
|
"new": "New project",
|
||||||
"importText": "Nebo importujte své seznamy a úkoly z jiných služeb:",
|
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||||
"import": "Importujte svá data do Vikunja"
|
"import": "Import your data into Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"404": {
|
"404": {
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
"weekStartSunday": "Neděle",
|
"weekStartSunday": "Neděle",
|
||||||
"weekStartMonday": "Pondělí",
|
"weekStartMonday": "Pondělí",
|
||||||
"language": "Jazyk",
|
"language": "Jazyk",
|
||||||
"defaultList": "Výchozí seznam",
|
"defaultProject": "Default Project",
|
||||||
"timezone": "Časové pásmo",
|
"timezone": "Časové pásmo",
|
||||||
"overdueTasksRemindersTime": "Čas odeslání emailu o zpožděných úkolech"
|
"overdueTasksRemindersTime": "Čas odeslání emailu o zpožděných úkolech"
|
||||||
},
|
},
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
},
|
},
|
||||||
"deletion": {
|
"deletion": {
|
||||||
"title": "Smazat svůj účet",
|
"title": "Smazat svůj účet",
|
||||||
"text1": "Odstranění vašeho účtu je trvalé a nelze ho vrátit zpět. Vymažeme všechny vaše prostory, seznamy, úkoly a vše, co je s ním spojeno.",
|
"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.",
|
||||||
"text2": "Chcete-li pokračovat, zadejte své heslo. Obdržíte e-mail s dalšími pokyny.",
|
"text2": "Chcete-li pokračovat, zadejte své heslo. Obdržíte e-mail s dalšími pokyny.",
|
||||||
"confirm": "Smazat můj účet",
|
"confirm": "Smazat můj účet",
|
||||||
"requestSuccess": "Požadavek byl úspěšný. Obdržíte e-mail s dalšími pokyny.",
|
"requestSuccess": "Požadavek byl úspěšný. Obdržíte e-mail s dalšími pokyny.",
|
||||||
|
@ -157,201 +157,201 @@
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"title": "Exportovat data účtu",
|
"title": "Exportovat data účtu",
|
||||||
"description": "Můžete si vyžádat kopii všech vašich dat. To zahrnuje prostory, seznamy, úkoly a vše, co je s nimi spojeno. Tato data můžete importovat v libovolné instanci Vikunja prostřednictvím migrační funkce.",
|
"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.",
|
||||||
"descriptionPasswordRequired": "Pokračujte zadáním vašeho hesla:",
|
"descriptionPasswordRequired": "Pokračujte zadáním vašeho hesla:",
|
||||||
"request": "Požádat o kopii mých dat",
|
"request": "Požádat o kopii mých dat",
|
||||||
"success": "Úspěšně jste požádali o svá data! Jakmile budou připravena ke stažení, pošleme Vám e-mail.",
|
"success": "Úspěšně jste požádali o svá data! Jakmile budou připravena ke stažení, pošleme Vám e-mail.",
|
||||||
"downloadTitle": "Stáhnout exportovaná Vikunja data"
|
"downloadTitle": "Stáhnout exportovaná Vikunja data"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"archived": "Tento seznam je archivován. Není možné vytvářet nebo upravovat jeho úkoly.",
|
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||||
"title": "Název seznamu",
|
"title": "Project Title",
|
||||||
"color": "Barva",
|
"color": "Color",
|
||||||
"lists": "Seznamy",
|
"projects": "Projects",
|
||||||
"list": {
|
"search": "Type to search for a project…",
|
||||||
"title": "Seznam",
|
"searchSelect": "Click or press enter to select this project",
|
||||||
"add": "Přidat",
|
"shared": "Shared Projects",
|
||||||
"addPlaceholder": "Přidat nový úkol…",
|
"noDescriptionAvailable": "No project description is available.",
|
||||||
"empty": "Tento seznam je nyní prázdný.",
|
|
||||||
"newTaskCta": "Vytvořit nový úkol.",
|
|
||||||
"editTask": "Upravit úkol"
|
|
||||||
},
|
|
||||||
"search": "Začni psát pro vyhledání seznamu…",
|
|
||||||
"searchSelect": "Klikněte nebo stiskněte Enter pro výběr tohoto seznamu",
|
|
||||||
"shared": "Sdílené seznamy",
|
|
||||||
"noDescriptionAvailable": "Popis seznamu není k dispozici.",
|
|
||||||
"create": {
|
"create": {
|
||||||
"header": "Nový seznam",
|
"header": "New project",
|
||||||
"titlePlaceholder": "Název seznamu přijde sem…",
|
"titlePlaceholder": "The project's title goes here…",
|
||||||
"addTitleRequired": "Uveďte prosím název.",
|
"addTitleRequired": "Please specify a title.",
|
||||||
"createdSuccess": "Seznam byl úspěšně vytvořen.",
|
"createdSuccess": "The project was successfully created.",
|
||||||
"addListRequired": "Vyberte seznam nebo nastavte výchozí seznam v nastavení."
|
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"title": "Archivovat \"{list}\"",
|
"title": "Archive \"{project}\"",
|
||||||
"archive": "Archivovat tento seznam",
|
"archive": "Archive this project",
|
||||||
"unarchive": "Odarchivovat tento seznam",
|
"unarchive": "Un-Archive this project",
|
||||||
"unarchiveText": "Budete moci vytvářet nové úkoly nebo je upravovat.",
|
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||||
"archiveText": "Tento seznam nebude možné upravovat ani vytvářet nové úkoly, dokud jej neodarchivujete.",
|
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||||
"success": "Seznam byl úspěšně archivován."
|
"success": "The project was successfully archived."
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
"title": "Nastavit pozadí seznamu",
|
"title": "Set project background",
|
||||||
"remove": "Odstranit pozadí",
|
"remove": "Remove Background",
|
||||||
"upload": "Vyberte si pozadí ze svého počítače",
|
"upload": "Choose a background from your pc",
|
||||||
"searchPlaceholder": "Hledat pozadí…",
|
"searchPlaceholder": "Search for a background…",
|
||||||
"poweredByUnsplash": "Běží na Unsplash",
|
"poweredByUnsplash": "Powered by Unsplash",
|
||||||
"loadMore": "Načíst více fotek",
|
"loadMore": "Load more photos",
|
||||||
"success": "Pozadí bylo úspěšně nastaveno!",
|
"success": "The background has been set successfully!",
|
||||||
"removeSuccess": "Pozadí bylo úspěšně odebráno!"
|
"removeSuccess": "The background has been removed successfully!"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Smazat \"{list}\"",
|
"title": "Delete \"{project}\"",
|
||||||
"header": "Smazat tento seznam",
|
"header": "Delete this project",
|
||||||
"text1": "Opravdu chcete odstranit tento seznam a jeho obsah?",
|
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||||
"text2": "To zahrnuje všechny úkoly a NEMŮŽE BÝT VRÁCENO ZPĚT!",
|
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Seznam byl úspěšně smazán.",
|
"success": "The project was successfully deleted.",
|
||||||
"tasksToDelete": "Navždy smazat asi {count} úkolů.",
|
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||||
"noTasksToDelete": "Tento seznam neobsahuje žádné úkoly, mělo by být bezpečné ho smazat."
|
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||||
},
|
},
|
||||||
"duplicate": {
|
"duplicate": {
|
||||||
"title": "Duplikovat tento seznam",
|
"title": "Duplicate this project",
|
||||||
"label": "Duplikovat",
|
"label": "Duplicate",
|
||||||
"text": "Vyberte prostor, kam uložit duplicitní seznam:",
|
"text": "Select a namespace which should hold the duplicated project:",
|
||||||
"success": "Seznam byl úspěšně duplikován."
|
"success": "The project was successfully duplicated."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"header": "Upravit tento seznam",
|
"header": "Edit This Project",
|
||||||
"title": "Upravit \"{list}\"",
|
"title": "Edit \"{project}\"",
|
||||||
"titlePlaceholder": "Název seznamu přijde sem…",
|
"titlePlaceholder": "The project title goes here…",
|
||||||
"identifierTooltip": "Identifikátor seznamu může být použit k jedinečné identifikaci úkolu napříč seznamy. Nechte ho prázdný pro jeho vypnutí.",
|
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||||
"identifier": "Identifikátor seznamu",
|
"identifier": "Project Identifier",
|
||||||
"identifierPlaceholder": "Identifikátor seznamu přijde sem…",
|
"identifierPlaceholder": "The project identifier goes here…",
|
||||||
"description": "Popis",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "Popis seznamu přijde sem…",
|
"descriptionPlaceholder": "The projects description goes here…",
|
||||||
"color": "Barva",
|
"color": "Color",
|
||||||
"success": "Seznam byl úspěšně aktualizován."
|
"success": "The project was successfully updated."
|
||||||
},
|
},
|
||||||
"share": {
|
"share": {
|
||||||
"header": "Sdílet tento seznam",
|
"header": "Share this project",
|
||||||
"title": "Sdílet \"{list}\"",
|
"title": "Share \"{project}\"",
|
||||||
"share": "Sdílet",
|
"share": "Share",
|
||||||
"links": {
|
"links": {
|
||||||
"title": "Sdílet odkazy",
|
"title": "Share Links",
|
||||||
"what": "Co je to sdílený odkaz?",
|
"what": "What is a share link?",
|
||||||
"explanation": "Sdílení odkazů vám umožňuje snadno sdílet seznam s ostatními uživateli, kteří nemají účet na Vikunja.",
|
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||||
"create": "Vytvořit sdílený odkaz",
|
"create": "Create a new link share",
|
||||||
"name": "Název (volitelný)",
|
"name": "Name (optional)",
|
||||||
"namePlaceholder": "např. Lorem Ipsum",
|
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||||
"nameExplanation": "Všechny akce provedené tímto odkazem se zobrazí s tímto názvem.",
|
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||||
"password": "Heslo (volitelné)",
|
"password": "Password (optional)",
|
||||||
"passwordExplanation": "Při autentizaci bude uživatel muset zadat toto heslo.",
|
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||||
"noName": "Není nastaven žádný název",
|
"noName": "No name set",
|
||||||
"remove": "Odstranit sdílený odkaz",
|
"remove": "Remove a link share",
|
||||||
"removeText": "Jste si jisti, že chcete odstranit tento sdílený odkaz? K tomuto seznamu již nebude možné přistupovat s tímto sdíleným odkazem. Tuto akci nelze vrátit zpět!",
|
"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": "Sdílený odkaz byl úspěšně vytvořen.",
|
"createSuccess": "The link share was successfully created.",
|
||||||
"deleteSuccess": "Sdílený odkaz byl úspěšně smazán",
|
"deleteSuccess": "The link share was successfully deleted",
|
||||||
"view": "Zobrazit",
|
"view": "View",
|
||||||
"sharedBy": "Sdíleno {0}"
|
"sharedBy": "Shared by {0}"
|
||||||
},
|
},
|
||||||
"userTeam": {
|
"userTeam": {
|
||||||
"typeUser": "uživatel | uživatelé",
|
"typeUser": "user | users",
|
||||||
"typeTeam": "tým | týmy",
|
"typeTeam": "team | teams",
|
||||||
"shared": "Sdíleno s těmito {type}",
|
"shared": "Shared with these {type}",
|
||||||
"you": "Ty",
|
"you": "You",
|
||||||
"notShared": "Zatím není sdíleno s žádnou {type}.",
|
"notShared": "Not shared with any {type} yet.",
|
||||||
"removeHeader": "Odstranit {type} z {sharable}",
|
"removeHeader": "Remove a {type} from the {sharable}",
|
||||||
"removeText": "Jste si jisti, že chcete odstranit {sharable} z {type}.? Tuto akci nelze vrátit zpět!",
|
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||||
"removeSuccess": "{sharable} byl úspěšně odebrán z {type}.",
|
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||||
"addedSuccess": "{type} byl úspěšně přidán.",
|
"addedSuccess": "The {type} was successfully added.",
|
||||||
"updatedSuccess": "{type} byl úspěšně přidán."
|
"updatedSuccess": "The {type} was successfully added."
|
||||||
},
|
},
|
||||||
"right": {
|
"right": {
|
||||||
"title": "Oprávnění",
|
"title": "Permission",
|
||||||
"read": "Pouze pro čtení",
|
"read": "Read only",
|
||||||
"readWrite": "Čtení a zápis",
|
"readWrite": "Read & write",
|
||||||
"admin": "Administrátor"
|
"admin": "Admin"
|
||||||
},
|
},
|
||||||
"attributes": {
|
"attributes": {
|
||||||
"link": "Odkaz",
|
"link": "Link",
|
||||||
"delete": "Smazat"
|
"delete": "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"
|
||||||
|
},
|
||||||
"gantt": {
|
"gantt": {
|
||||||
"title": "Gantt",
|
"title": "Gantt",
|
||||||
"showTasksWithoutDates": "Zobrazit úkoly, které nemají nastavené datum",
|
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||||
"size": "Velikost",
|
"size": "Size",
|
||||||
"default": "Výchozí",
|
"default": "Default",
|
||||||
"month": "Měsíc",
|
"month": "Month",
|
||||||
"day": "Den",
|
"day": "Day",
|
||||||
"hour": "Hodina",
|
"hour": "Hour",
|
||||||
"range": "Časové období",
|
"range": "Date Range",
|
||||||
"noDates": "Tento úkol nemá nastaveno žádné datum."
|
"noDates": "This task has no dates set."
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"title": "Tabulka",
|
"title": "Table",
|
||||||
"columns": "Sloupce"
|
"columns": "Columns"
|
||||||
},
|
},
|
||||||
"kanban": {
|
"kanban": {
|
||||||
"title": "Kanban",
|
"title": "Kanban",
|
||||||
"limit": "Limit: {limit}",
|
"limit": "Limit: {limit}",
|
||||||
"noLimit": "Nenastaveno",
|
"noLimit": "Not Set",
|
||||||
"doneBucket": "Sloupec \"Hotovo\"",
|
"doneBucket": "Done bucket",
|
||||||
"doneBucketHint": "Všechny úkoly přesunuté do tohoto sloupce budou automaticky označeny jako dokončené.",
|
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||||
"doneBucketHintExtended": "Všechny úkoly přesunuté do sloupce \"Hotovo\" budou označeny jako dokončené automaticky. Všechny úkoly označené jako dokončené jinde sem budou přesunuty také.",
|
"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": "Sloupec \"Hotovo\" byl úspěšně uložen.",
|
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||||
"deleteLast": "Nelze odstranit poslední sloupec.",
|
"deleteLast": "You cannot remove the last bucket.",
|
||||||
"addTaskPlaceholder": "Zadejte nový název úkolu…",
|
"addTaskPlaceholder": "Enter the new task title…",
|
||||||
"addTask": "Přidat úkol",
|
"addTask": "Add a task",
|
||||||
"addAnotherTask": "Přidat další úkol",
|
"addAnotherTask": "Add another task",
|
||||||
"addBucket": "Vytvořit nový sloupec",
|
"addBucket": "Create a new bucket",
|
||||||
"addBucketPlaceholder": "Zadejte název nového sloupce…",
|
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||||
"deleteHeaderBucket": "Smazat sloupec",
|
"deleteHeaderBucket": "Delete the bucket",
|
||||||
"deleteBucketText1": "Opravdu chcete smazat tento sloupec?",
|
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||||
"deleteBucketText2": "Toto nesmaže žádné úkoly, ale přesune je do výchozího sloupce.",
|
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||||
"deleteBucketSuccess": "Sloupec byl úspěšně smazán.",
|
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||||
"bucketTitleSavedSuccess": "Název sloupce byl úspěšně uložen.",
|
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||||
"bucketLimitSavedSuccess": "Limit sloupce byl úspěšně uložen.",
|
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||||
"collapse": "Sbalit tento sloupec"
|
"collapse": "Collapse this bucket"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Oblíbené"
|
"title": "Favorites"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"namespace": {
|
"namespace": {
|
||||||
"title": "Prostory a seznamy",
|
"title": "Namespaces & Projects",
|
||||||
"namespace": "Prostor",
|
"namespace": "Prostor",
|
||||||
"showArchived": "Zobrazit archivované",
|
"showArchived": "Zobrazit archivované",
|
||||||
"noneAvailable": "Momentálně nemáte žádné prostory.",
|
"noneAvailable": "Momentálně nemáte žádné prostory.",
|
||||||
"unarchive": "Obnovit archiv",
|
"unarchive": "Obnovit archiv",
|
||||||
"archived": "Archivováno",
|
"archived": "Archivováno",
|
||||||
"noLists": "Tento prostor neobsahuje žádné seznamy.",
|
"noProjects": "This namespace does not contain any projects.",
|
||||||
"createList": "Vytvořit nový seznam v tomto prostoru.",
|
"createProject": "Create a new project in this namespace.",
|
||||||
"namespaces": "Prostory",
|
"namespaces": "Prostory",
|
||||||
"search": "Začni psát pro vyhledání prostoru…",
|
"search": "Začni psát pro vyhledání prostoru…",
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nový prostor",
|
"title": "Nový prostor",
|
||||||
"titleRequired": "Uveďte prosím název.",
|
"titleRequired": "Uveďte prosím název.",
|
||||||
"explanation": "Prostor je kolekce seznamů, které můžete sdílet a používat k organizaci seznamů. Každý seznam patří do nějakého prostoru.",
|
"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.",
|
||||||
"tooltip": "Co je prostor?",
|
"tooltip": "Co je prostor?",
|
||||||
"success": "Prostor byl úspěšně vytvořen."
|
"success": "Prostor byl úspěšně vytvořen."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"titleArchive": "Archivovat \"{namespace}\"",
|
"titleArchive": "Archivovat \"{namespace}\"",
|
||||||
"titleUnarchive": "Odarchivovat \"{namespace}\"",
|
"titleUnarchive": "Odarchivovat \"{namespace}\"",
|
||||||
"archiveText": "Nebudete moci upravovat tento jmenný prostor ani vytvářet nové seznamy, dokud jej neodarchivujete. Všechny seznamy v tomto prostoru budou také archivovány.",
|
"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": "Budete moci vytvářet nové úkoly nebo je upravovat.",
|
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||||
"success": "Prostor byl úspěšně archivován.",
|
"success": "Prostor byl úspěšně archivován.",
|
||||||
"unarchiveSuccess": "Jmenný prostor byl úspěšně obnoven.",
|
"unarchiveSuccess": "Jmenný prostor byl úspěšně obnoven.",
|
||||||
"description": "Pokud je prostor archivován, nelze vytvořit nové seznamy nebo je upravit."
|
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Smazat \"{namespace}\"",
|
"title": "Smazat \"{namespace}\"",
|
||||||
"text1": "Opravdu chcete odstranit tento prostor a všechen jeho obsah?",
|
"text1": "Opravdu chcete odstranit tento prostor a všechen jeho obsah?",
|
||||||
"text2": "To zahrnuje všechny seznamy a úkoly a NEMŮŽE BÝT VRÁCENO ZPĚT!",
|
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Prostor byl úspěšně smazán."
|
"success": "Prostor byl úspěšně smazán."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
|
@ -371,8 +371,8 @@
|
||||||
"isArchived": "Tento prostor je archivován"
|
"isArchived": "Tento prostor je archivován"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"sharedLists": {
|
"sharedProjects": {
|
||||||
"title": "Sdílené seznamy"
|
"title": "Shared Projects"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Oblíbené"
|
"title": "Oblíbené"
|
||||||
|
@ -403,7 +403,7 @@
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nový uložený filtr",
|
"title": "Nový uložený filtr",
|
||||||
"description": "Uložený filtr je virtuální seznam, který se počítá ze sady filtrů pokaždé, když je přístupný. Jakmile bude vytvořen, objeví se ve speciálním prostoru.",
|
"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.",
|
||||||
"action": "Vytvořit uložený filtr",
|
"action": "Vytvořit uložený filtr",
|
||||||
"titleRequired": "Please provide a title for the filter."
|
"titleRequired": "Please provide a title for the filter."
|
||||||
},
|
},
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
"label": {
|
"label": {
|
||||||
"title": "Štítky",
|
"title": "Štítky",
|
||||||
"manage": "Spravovat štítky",
|
"manage": "Spravovat štítky",
|
||||||
"description": "Klikněte na štítek pro jeho úpravu. Můžete upravit všechny štítky, které jste vytvořili, můžete použít všechny štítky, které jsou přiřazeny k úkolu, do kterého máte přístup.",
|
"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.",
|
||||||
"newCTA": "Momentálně nemáte žádné štítky.",
|
"newCTA": "Momentálně nemáte žádné štítky.",
|
||||||
"search": "Zadejte hledaný štítek…",
|
"search": "Zadejte hledaný štítek…",
|
||||||
"create": {
|
"create": {
|
||||||
|
@ -460,7 +460,7 @@
|
||||||
},
|
},
|
||||||
"sharing": {
|
"sharing": {
|
||||||
"authenticating": "Ověřování…",
|
"authenticating": "Ověřování…",
|
||||||
"passwordRequired": "Tento sdílený seznam vyžaduje heslo. Zadejte jej níže:",
|
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||||
"error": "Došlo k chybě.",
|
"error": "Došlo k chybě.",
|
||||||
"invalidPassword": "Neplatné heslo."
|
"invalidPassword": "Neplatné heslo."
|
||||||
},
|
},
|
||||||
|
@ -529,7 +529,7 @@
|
||||||
"code": "Kód",
|
"code": "Kód",
|
||||||
"quote": "Citace",
|
"quote": "Citace",
|
||||||
"unorderedList": "Seznam s odrážkami",
|
"unorderedList": "Seznam s odrážkami",
|
||||||
"orderedList": "Číslovaný seznam",
|
"orderedList ": "Ordered List",
|
||||||
"cleanBlock": "Čistý blok",
|
"cleanBlock": "Čistý blok",
|
||||||
"link": "Odkaz",
|
"link": "Odkaz",
|
||||||
"image": "Obrázek",
|
"image": "Obrázek",
|
||||||
|
@ -602,6 +602,7 @@
|
||||||
"addReminder": "Přidat novou připomínku…",
|
"addReminder": "Přidat novou připomínku…",
|
||||||
"doneSuccess": "Úkol byl úspěšně označen jako dokončený.",
|
"doneSuccess": "Úkol byl úspěšně označen jako dokončený.",
|
||||||
"undoneSuccess": "Úkol byl úspěšně znovu otevřen.",
|
"undoneSuccess": "Úkol byl úspěšně znovu otevřen.",
|
||||||
|
"undo": "Undo",
|
||||||
"openDetail": "Otevřít zobrazení detailu úkolu",
|
"openDetail": "Otevřít zobrazení detailu úkolu",
|
||||||
"checklistTotal": "{checked} z {total} úkolů",
|
"checklistTotal": "{checked} z {total} úkolů",
|
||||||
"checklistAllDone": "{total} úkolů",
|
"checklistAllDone": "{total} úkolů",
|
||||||
|
@ -618,7 +619,7 @@
|
||||||
"chooseDueDate": "Klikněte zde pro nastavení termínu dokončení",
|
"chooseDueDate": "Klikněte zde pro nastavení termínu dokončení",
|
||||||
"chooseStartDate": "Klikněte zde pro nastavení počátečního data",
|
"chooseStartDate": "Klikněte zde pro nastavení počátečního data",
|
||||||
"chooseEndDate": "Klikněte zde pro nastavení data ukončení",
|
"chooseEndDate": "Klikněte zde pro nastavení data ukončení",
|
||||||
"move": "Přesunout úkol do jiného seznamu",
|
"move": "Move task to a different project",
|
||||||
"done": "Označit úkol jako hotový!",
|
"done": "Označit úkol jako hotový!",
|
||||||
"undone": "Označit jako znovu otevřené",
|
"undone": "Označit jako znovu otevřené",
|
||||||
"created": "Vytvořeno {0} uživatelem {1}",
|
"created": "Vytvořeno {0} uživatelem {1}",
|
||||||
|
@ -626,7 +627,7 @@
|
||||||
"doneAt": "Dokončeno {0}",
|
"doneAt": "Dokončeno {0}",
|
||||||
"updateSuccess": "Úkol byl úspěšně uložen.",
|
"updateSuccess": "Úkol byl úspěšně uložen.",
|
||||||
"deleteSuccess": "Úkol byl úspěšně smazán.",
|
"deleteSuccess": "Úkol byl úspěšně smazán.",
|
||||||
"belongsToList": "Tento úkol patří do seznamu '{list}'",
|
"belongsToProject": "This task belongs to project '{project}'",
|
||||||
"due": "Termín {at}",
|
"due": "Termín {at}",
|
||||||
"closePopup": "Zavřít vyskakovací okno",
|
"closePopup": "Zavřít vyskakovací okno",
|
||||||
"delete": {
|
"delete": {
|
||||||
|
@ -646,7 +647,7 @@
|
||||||
"percentDone": "Nastavit průběh",
|
"percentDone": "Nastavit průběh",
|
||||||
"attachments": "Přidat přílohy",
|
"attachments": "Přidat přílohy",
|
||||||
"relatedTasks": "Přidat vztah",
|
"relatedTasks": "Přidat vztah",
|
||||||
"moveList": "Přesunout",
|
"moveProject": "Move",
|
||||||
"color": "Nastavit barvu",
|
"color": "Nastavit barvu",
|
||||||
"delete": "Smazat",
|
"delete": "Smazat",
|
||||||
"favorite": "Přidat do oblíbených",
|
"favorite": "Přidat do oblíbených",
|
||||||
|
@ -673,21 +674,21 @@
|
||||||
"updated": "Aktualizováno"
|
"updated": "Aktualizováno"
|
||||||
},
|
},
|
||||||
"subscription": {
|
"subscription": {
|
||||||
"subscribedListThroughParentNamespace": "Zde se nemůžete odhlásit, protože jste přihlášeni k odběru tohoto seznamu prostřednictvím jeho prostoru.",
|
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||||
"subscribedTaskThroughParentNamespace": "Zde se nemůžete odhlásit, protože jste přihlášeni k odběru tohoto úkolu prostřednictvím jeho prostoru.",
|
"subscribedTaskThroughParentNamespace": "Zde se nemůžete odhlásit, protože jste přihlášeni k odběru tohoto úkolu prostřednictvím jeho prostoru.",
|
||||||
"subscribedTaskThroughParentList": "Zde se nemůžete odhlásit, protože jste přihlášeni k odběru tohoto úkolu prostřednictvím jeho seznamu.",
|
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||||
"subscribedNamespace": "Nyní jste přihlášeni k odběru tohoto prostoru a budete dostávat oznámení o změnách.",
|
"subscribedNamespace": "Nyní jste přihlášeni k odběru tohoto prostoru a budete dostávat oznámení o změnách.",
|
||||||
"notSubscribedNamespace": "Nejste přihlášeni k odběru tohoto prostoru, takže nebudete dostávat upozornění na změny.",
|
"notSubscribedNamespace": "Nejste přihlášeni k odběru tohoto prostoru, takže nebudete dostávat upozornění na změny.",
|
||||||
"subscribedList": "Nyní jste přihlášeni k odběru tohoto seznamu a budete dostávat oznámení o změnách.",
|
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||||
"notSubscribedList": "Nejste přihlášeni k odběru tohoto seznamu, takže nebudete dostávat upozornění na změny.",
|
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||||
"subscribedTask": "Nyní jste přihlášeni k odběru tohoto úkolu a budete dostávat oznámení o změnách.",
|
"subscribedTask": "Nyní jste přihlášeni k odběru tohoto úkolu a budete dostávat oznámení o změnách.",
|
||||||
"notSubscribedTask": "Nejste přihlášeni k odběru tohoto úkolu, takže nebudete dostávat upozornění na změny.",
|
"notSubscribedTask": "Nejste přihlášeni k odběru tohoto úkolu, takže nebudete dostávat upozornění na změny.",
|
||||||
"subscribe": "Odebírat",
|
"subscribe": "Odebírat",
|
||||||
"unsubscribe": "Odhlásit odběr",
|
"unsubscribe": "Odhlásit odběr",
|
||||||
"subscribeSuccessNamespace": "Nyní jste přihlášeni k tomuto prostoru",
|
"subscribeSuccessNamespace": "Nyní jste přihlášeni k tomuto prostoru",
|
||||||
"unsubscribeSuccessNamespace": "Nyní jste odhlášeni od tohoto prostoru",
|
"unsubscribeSuccessNamespace": "Nyní jste odhlášeni od tohoto prostoru",
|
||||||
"subscribeSuccessList": "Nyní jste přihlášeni k tomuto seznamu",
|
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||||
"unsubscribeSuccessList": "Nyní jste odhlášeni od tohoto seznamu",
|
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||||
"subscribeSuccessTask": "Nyní jste přihlášeni k tomuto úkolu",
|
"subscribeSuccessTask": "Nyní jste přihlášeni k tomuto úkolu",
|
||||||
"unsubscribeSuccessTask": "Nyní jste odhlášeni od tohoto úkolu"
|
"unsubscribeSuccessTask": "Nyní jste odhlášeni od tohoto úkolu"
|
||||||
},
|
},
|
||||||
|
@ -761,7 +762,7 @@
|
||||||
"new": "Nový vztah k úkolu",
|
"new": "Nový vztah k úkolu",
|
||||||
"searchPlaceholder": "Hledejte nový úkol, který chcete přidat jako související…",
|
"searchPlaceholder": "Hledejte nový úkol, který chcete přidat jako související…",
|
||||||
"createPlaceholder": "Přidat toto jako nový související úkol",
|
"createPlaceholder": "Přidat toto jako nový související úkol",
|
||||||
"differentList": "Tento úkol patří do jiného seznamu.",
|
"differentProject": "This task belongs to a different project.",
|
||||||
"differentNamespace": "Tento úkol patří do jiného prostoru.",
|
"differentNamespace": "Tento úkol patří do jiného prostoru.",
|
||||||
"noneYet": "Zatím žádné vztahy mezi úkoly.",
|
"noneYet": "Zatím žádné vztahy mezi úkoly.",
|
||||||
"delete": "Odstranit vztah k úloze",
|
"delete": "Odstranit vztah k úloze",
|
||||||
|
@ -811,10 +812,10 @@
|
||||||
"priority1": "Chcete-li nastavit prioritu úkolu, přidejte číslo 1-5, s prefixem {prefix}.",
|
"priority1": "Chcete-li nastavit prioritu úkolu, přidejte číslo 1-5, s prefixem {prefix}.",
|
||||||
"priority2": "Čím vyšší číslo, tím vyšší priorita.",
|
"priority2": "Čím vyšší číslo, tím vyšší priorita.",
|
||||||
"assignees": "Chcete-li přímo přiřadit úkol k uživateli, přidejte k úkolu jejich uživatelské jméno s prefixem {prefix}.",
|
"assignees": "Chcete-li přímo přiřadit úkol k uživateli, přidejte k úkolu jejich uživatelské jméno s prefixem {prefix}.",
|
||||||
"list1": "Chcete-li nastavit seznam, ve kterém se má úkol zobrazit, zadejte jeho název s předponou {prefix}.",
|
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||||
"list2": "Toto vrátí chybu, pokud seznam neexistuje.",
|
"project2": "This will return an error if the project does not exist.",
|
||||||
"list3": "Chcete-li použít mezery, uzavřete název seznamu do \" nebo '.",
|
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||||
"list4": "Například: {prefix}\"Štítek s mezerami\".",
|
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||||
"dateAndTime": "Datum a čas",
|
"dateAndTime": "Datum a čas",
|
||||||
"date": "Jakékoliv datum bude použito jako datum dokončení nového úkolu. Můžete použít data v kterémkoli z těchto formátů:",
|
"date": "Jakékoliv datum bude použito jako datum dokončení nového úkolu. Můžete použít data v kterémkoli z těchto formátů:",
|
||||||
"dateWeekday": "každý pracovní den použije další datum s tímto datem",
|
"dateWeekday": "každý pracovní den použije další datum s tímto datem",
|
||||||
|
@ -847,19 +848,19 @@
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Smazat tým",
|
"header": "Smazat tým",
|
||||||
"text1": "Jste si jisti, že chcete smazat tento tým a všechny jeho členy?",
|
"text1": "Jste si jisti, že chcete smazat tento tým a všechny jeho členy?",
|
||||||
"text2": "Všichni členové týmu ztratí přístup k seznamům a prostorům, které jsou sdíleny s tímto týmem. Toto NEMŮŽE BÝT VZATO ZPĚT!",
|
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||||
"success": "Tým byl úspěšně smazán."
|
"success": "Tým byl úspěšně smazán."
|
||||||
},
|
},
|
||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"header": "Odebrat uživatele z týmu",
|
"header": "Odebrat uživatele z týmu",
|
||||||
"text1": "Opravdu chcete odebrat tohoto uživatele z týmu?",
|
"text1": "Opravdu chcete odebrat tohoto uživatele z týmu?",
|
||||||
"text2": "Ztratí přístup ke všem seznamům a prostorům, k nimž má tento tým přístup. To NEMŮŽE BÝT VZATO ZPĚT!",
|
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||||
"success": "Uživatel byl úspěšně odstraněn z týmu."
|
"success": "Uživatel byl úspěšně odstraněn z týmu."
|
||||||
},
|
},
|
||||||
"leave": {
|
"leave": {
|
||||||
"title": "Opustit tým",
|
"title": "Opustit tým",
|
||||||
"text1": "Opravdu chcete opustit tento tým?",
|
"text1": "Opravdu chcete opustit tento tým?",
|
||||||
"text2": "Ztratíte přístup ke všem seznamům a prostorům, k nimž má tento tým přístup. Pokud změníte názor, budete potřebovat správce týmu, aby vás znovu přidal.",
|
"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.",
|
||||||
"success": "Úspěšně jste opustili tým."
|
"success": "Úspěšně jste opustili tým."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -891,22 +892,22 @@
|
||||||
"attachment": "Přidat přílohu k tomuto úkolu",
|
"attachment": "Přidat přílohu k tomuto úkolu",
|
||||||
"related": "Upravit související úkoly tohoto úkolu",
|
"related": "Upravit související úkoly tohoto úkolu",
|
||||||
"color": "Změnit barvu tohoto úkolu",
|
"color": "Změnit barvu tohoto úkolu",
|
||||||
"move": "Přesunout tento úkol do jiného seznamu",
|
"move": "Move this task to another project",
|
||||||
"reminder": "Spravovat připomenutí této úlohy",
|
"reminder": "Spravovat připomenutí této úlohy",
|
||||||
"description": "Přepnout úpravy popisu úkolu"
|
"description": "Přepnout úpravy popisu úkolu"
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"title": "Zobrazení seznamů",
|
"title": "Project Views",
|
||||||
"switchToListView": "Přepnout na zobrazení seznamu",
|
"switchToListView": "Switch to list view",
|
||||||
"switchToGanttView": "Přepnout na zobrazení gantt",
|
"switchToGanttView": "Switch to gantt view",
|
||||||
"switchToKanbanView": "Přepnout na zobrazení kanbanu",
|
"switchToKanbanView": "Switch to kanban view",
|
||||||
"switchToTableView": "Přepnout na zobrazení tabulky"
|
"switchToTableView": "Switch to table view"
|
||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"title": "Navigace",
|
"title": "Navigace",
|
||||||
"overview": "Přejít na přehled",
|
"overview": "Přejít na přehled",
|
||||||
"upcoming": "Přejít na nadcházející úkoly",
|
"upcoming": "Přejít na nadcházející úkoly",
|
||||||
"namespaces": "Přejít na prostory a seznamy",
|
"namespaces": "Navigate to namespaces & projects",
|
||||||
"labels": "Přejít na štítky",
|
"labels": "Přejít na štítky",
|
||||||
"teams": "Přejít na týmy"
|
"teams": "Přejít na týmy"
|
||||||
}
|
}
|
||||||
|
@ -923,7 +924,7 @@
|
||||||
"unarchive": "Zrušit archivaci",
|
"unarchive": "Zrušit archivaci",
|
||||||
"setBackground": "Nastavit pozadí",
|
"setBackground": "Nastavit pozadí",
|
||||||
"share": "Sdílet",
|
"share": "Sdílet",
|
||||||
"newList": "Nový seznam"
|
"newProject": "New project"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"url": "Vikunja URL",
|
"url": "Vikunja URL",
|
||||||
|
@ -942,24 +943,24 @@
|
||||||
"notification": {
|
"notification": {
|
||||||
"title": "Oznámení",
|
"title": "Oznámení",
|
||||||
"none": "Nemáte žádná oznámení. Mějte příjemný den!",
|
"none": "Nemáte žádná oznámení. Mějte příjemný den!",
|
||||||
"explainer": "Upozornění se zobrazí zde, když proběhne akce na prostorech, seznamech nebo úkolech, ke kterým jste se přihlásili."
|
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||||
},
|
},
|
||||||
"quickActions": {
|
"quickActions": {
|
||||||
"commands": "Příkazy",
|
"commands": "Příkazy",
|
||||||
"placeholder": "Napište příkaz nebo vyhledávání…",
|
"placeholder": "Napište příkaz nebo vyhledávání…",
|
||||||
"hint": "Můžete použít {list} k omezení hledání na seznam. Kombinujte {list} nebo {label} (štítky) s vyhledávacím dotazem pro hledání úkolu s těmito štítky nebo na tomto seznamu. Použijte {assignee} pouze pro hledání týmů.",
|
"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.",
|
||||||
"tasks": "Úkoly",
|
"tasks": "Úkoly",
|
||||||
"lists": "Seznamy",
|
"projects": "Projects",
|
||||||
"teams": "Týmy",
|
"teams": "Týmy",
|
||||||
"newList": "Zadejte název nového seznamu…",
|
"newProject": "Enter the title of the new project…",
|
||||||
"newTask": "Zadejte název nového úkolu…",
|
"newTask": "Zadejte název nového úkolu…",
|
||||||
"newNamespace": "Zadejte název nového prostoru…",
|
"newNamespace": "Zadejte název nového prostoru…",
|
||||||
"newTeam": "Zadejte název nového týmu…",
|
"newTeam": "Zadejte název nového týmu…",
|
||||||
"createTask": "Vytvořit úkol v aktuálním seznamu ({title})",
|
"createTask": "Create a task in the current project ({title})",
|
||||||
"createList": "Vytvořit seznam v aktuálním prostoru ({title})",
|
"createProject": "Create a project in the current namespace ({title})",
|
||||||
"cmds": {
|
"cmds": {
|
||||||
"newTask": "Nový úkol",
|
"newTask": "Nový úkol",
|
||||||
"newList": "Nový seznam",
|
"newProject": "New project",
|
||||||
"newNamespace": "Nový prostor",
|
"newNamespace": "Nový prostor",
|
||||||
"newTeam": "Nový tým"
|
"newTeam": "Nový tým"
|
||||||
}
|
}
|
||||||
|
@ -991,15 +992,15 @@
|
||||||
"1018": "Nastavení typu avatara uživatele je neplatné.",
|
"1018": "Nastavení typu avatara uživatele je neplatné.",
|
||||||
"2001": "ID nemůže být prázdné nebo 0.",
|
"2001": "ID nemůže být prázdné nebo 0.",
|
||||||
"2002": "Některé údaje požadavku byly neplatné.",
|
"2002": "Některé údaje požadavku byly neplatné.",
|
||||||
"3001": "Seznam neexistuje.",
|
"3001": "The project does not exist.",
|
||||||
"3004": "Pro provedení této akce musíte mít oprávnění ke čtení v tomto seznamu.",
|
"3004": "You need to have read permissions on that project to perform that action.",
|
||||||
"3005": "Název seznamu nemůže být prázdný.",
|
"3005": "The project title cannot be empty.",
|
||||||
"3006": "Sdílení seznamu neexistuje.",
|
"3006": "The project share does not exist.",
|
||||||
"3007": "Seznam s tímto identifikátorem již existuje.",
|
"3007": "A project with this identifier already exists.",
|
||||||
"3008": "Seznam je archivován, a proto může být přístupný pouze pro čtení. To platí i pro všechny úkoly spojené s tímto seznamem.",
|
"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": "Text úkolu seznamu nemůže být prázdný.",
|
"4001": "The project task text cannot be empty.",
|
||||||
"4002": "Úkol seznamu neexistuje.",
|
"4002": "The project task does not exist.",
|
||||||
"4003": "Všechny úkoly pro hromadnou úpravu musí patřit do stejného seznamu.",
|
"4003": "All bulk editing tasks must belong to the same project.",
|
||||||
"4004": "Při hromadných úpravách úkolů je potřeba alespoň jeden úkol.",
|
"4004": "Při hromadných úpravách úkolů je potřeba alespoň jeden úkol.",
|
||||||
"4005": "Nemáte právo vidět tento úkol.",
|
"4005": "Nemáte právo vidět tento úkol.",
|
||||||
"4006": "Nadřazený úkol nelze nastavit jako takový.",
|
"4006": "Nadřazený úkol nelze nastavit jako takový.",
|
||||||
|
@ -1025,21 +1026,21 @@
|
||||||
"5012": "Prostor je archivován, a proto je přístupný pouze pro čtení.",
|
"5012": "Prostor je archivován, a proto je přístupný pouze pro čtení.",
|
||||||
"6001": "Název týmu nemůže být prázdný.",
|
"6001": "Název týmu nemůže být prázdný.",
|
||||||
"6002": "Tým neexistuje.",
|
"6002": "Tým neexistuje.",
|
||||||
"6004": "Tým již má přístup k tomuto prostoru nebo seznamu.",
|
"6004": "The team already has access to that namespace or project.",
|
||||||
"6005": "Uživatel je již členem tohoto týmu.",
|
"6005": "Uživatel je již členem tohoto týmu.",
|
||||||
"6006": "Nelze odstranit posledního člena týmu.",
|
"6006": "Nelze odstranit posledního člena týmu.",
|
||||||
"6007": "Tým nemá přístup k seznamu pro provedení této akce.",
|
"6007": "The team does not have access to the project to perform that action.",
|
||||||
"7002": "Uživatel již má k tomuto seznamu přístup.",
|
"7002": "The user already has access to that project.",
|
||||||
"7003": "Nemáte přístup k tomuto seznamu.",
|
"7003": "You do not have access to that project.",
|
||||||
"8001": "Tento štítek již v tomto úkolu existuje.",
|
"8001": "Tento štítek již v tomto úkolu existuje.",
|
||||||
"8002": "Štítek neexistuje.",
|
"8002": "Štítek neexistuje.",
|
||||||
"8003": "K tomuto štítku nemáte přístup.",
|
"8003": "K tomuto štítku nemáte přístup.",
|
||||||
"9001": "Právo je neplatné.",
|
"9001": "Právo je neplatné.",
|
||||||
"10001": "Sloupec neexistuje.",
|
"10001": "Sloupec neexistuje.",
|
||||||
"10002": "Sloupec nepatří do tohoto seznamu.",
|
"10002": "The bucket does not belong to that project.",
|
||||||
"10003": "Poslední sloupec v seznamu nelze odstranit.",
|
"10003": "You cannot remove the last bucket on a project.",
|
||||||
"10004": "Nemůžete přidat úkol do tohoto sloupce, protože již překročil limit úkolů, které do něj můžete uložit.",
|
"10004": "Nemůžete přidat úkol do tohoto sloupce, protože již překročil limit úkolů, které do něj můžete uložit.",
|
||||||
"10005": "Pro seznam může být pouze jeden sloupec \"Hotovo\".",
|
"10005": "There can be only one done bucket per project.",
|
||||||
"11001": "Uložený filtr neexistuje.",
|
"11001": "Uložený filtr neexistuje.",
|
||||||
"11002": "Uložené filtry nejsou k dispozici pro sdílení odkazů.",
|
"11002": "Uložené filtry nejsou k dispozici pro sdílení odkazů.",
|
||||||
"12001": "Typ předplatného je neplatný.",
|
"12001": "Typ předplatného je neplatný.",
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
"welcomeDay": "Hej {username}!",
|
"welcomeDay": "Hej {username}!",
|
||||||
"welcomeEvening": "Godaften {username}!",
|
"welcomeEvening": "Godaften {username}!",
|
||||||
"lastViewed": "Sidst vist",
|
"lastViewed": "Sidst vist",
|
||||||
"list": {
|
"project": {
|
||||||
"newText": "Du kan oprette en ny liste til dine nye opgaver:",
|
"newText": "You can create a new project for your new tasks:",
|
||||||
"new": "Ny liste",
|
"new": "New project",
|
||||||
"importText": "Eller importere dine lister og opgaver fra andre værktøjer til Vikunja:",
|
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||||
"import": "Importer dine data til Vikunja"
|
"import": "Import your data into Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"404": {
|
"404": {
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
"weekStartSunday": "Søndag",
|
"weekStartSunday": "Søndag",
|
||||||
"weekStartMonday": "Mandag",
|
"weekStartMonday": "Mandag",
|
||||||
"language": "Sprog",
|
"language": "Sprog",
|
||||||
"defaultList": "Standard liste",
|
"defaultProject": "Default Project",
|
||||||
"timezone": "Tidszone",
|
"timezone": "Tidszone",
|
||||||
"overdueTasksRemindersTime": "Forfaldne opgaver påmindelse e-mail tidspunkt"
|
"overdueTasksRemindersTime": "Forfaldne opgaver påmindelse e-mail tidspunkt"
|
||||||
},
|
},
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
},
|
},
|
||||||
"deletion": {
|
"deletion": {
|
||||||
"title": "Slet din Vikunja konto",
|
"title": "Slet din Vikunja konto",
|
||||||
"text1": "Sletningen af din konto er permanent og kan ikke fortrydes. Vi vil slette alle dine navneområder, lister, opgaver og alt, hvad der er knyttet til den.",
|
"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.",
|
||||||
"text2": "For at fortsætte, skal du indtaste din adgangskode. Du vil modtage en e-mail med yderligere instruktioner.",
|
"text2": "For at fortsætte, skal du indtaste din adgangskode. Du vil modtage en e-mail med yderligere instruktioner.",
|
||||||
"confirm": "Slet min konto",
|
"confirm": "Slet min konto",
|
||||||
"requestSuccess": "Anmodningen blev gennemført. Du vil modtage en e-mail med yderligere instruktioner.",
|
"requestSuccess": "Anmodningen blev gennemført. Du vil modtage en e-mail med yderligere instruktioner.",
|
||||||
|
@ -157,201 +157,201 @@
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"title": "Eksporter dine Vikunja-data",
|
"title": "Eksporter dine Vikunja-data",
|
||||||
"description": "Du kan anmode om en kopi af alle dine Vikunja-data. Dette omfatter Navneområder, Lister, Opgaver og alt, hvad der er knyttet til dem. Du kan importere disse data i enhver Vikunja-instans gennem migrationsfunktionen.",
|
"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.",
|
||||||
"descriptionPasswordRequired": "Indtast venligst din adgangskode for at fortsætte:",
|
"descriptionPasswordRequired": "Indtast venligst din adgangskode for at fortsætte:",
|
||||||
"request": "Anmod om en kopi af mine Vikunja-data",
|
"request": "Anmod om en kopi af mine Vikunja-data",
|
||||||
"success": "Du har anmodet om dine Vikunja-data! Vi sender dig en e-mail, når den er klar til hentning.",
|
"success": "Du har anmodet om dine Vikunja-data! Vi sender dig en e-mail, når den er klar til hentning.",
|
||||||
"downloadTitle": "Download dine eksporterede Vikunja-data"
|
"downloadTitle": "Download dine eksporterede Vikunja-data"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"archived": "Denne liste er arkiveret. Det er ikke muligt at oprette eller redigere opgaver i den.",
|
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||||
"title": "Listetitel",
|
"title": "Project Title",
|
||||||
"color": "Farve",
|
"color": "Color",
|
||||||
"lists": "Lister",
|
"projects": "Projects",
|
||||||
"list": {
|
"search": "Type to search for a project…",
|
||||||
"title": "Liste",
|
"searchSelect": "Click or press enter to select this project",
|
||||||
"add": "Tilføj",
|
"shared": "Shared Projects",
|
||||||
"addPlaceholder": "Tilføj en ny opgave…",
|
"noDescriptionAvailable": "No project description is available.",
|
||||||
"empty": "Denne liste er i øjeblikket tom.",
|
|
||||||
"newTaskCta": "Opret en ny opgave.",
|
|
||||||
"editTask": "Rediger opgave"
|
|
||||||
},
|
|
||||||
"search": "Skriv for at søge efter en liste…",
|
|
||||||
"searchSelect": "Klik eller tryk på Enter for at vælge denne liste",
|
|
||||||
"shared": "Delte Lister",
|
|
||||||
"noDescriptionAvailable": "Ingen listebeskrivelse er tilgængelig.",
|
|
||||||
"create": {
|
"create": {
|
||||||
"header": "Ny liste",
|
"header": "New project",
|
||||||
"titlePlaceholder": "Listens titel skrives her…",
|
"titlePlaceholder": "The project's title goes here…",
|
||||||
"addTitleRequired": "Angiv venligst en titel.",
|
"addTitleRequired": "Please specify a title.",
|
||||||
"createdSuccess": "Listen blev oprettet.",
|
"createdSuccess": "The project was successfully created.",
|
||||||
"addListRequired": "Angiv venligst en liste eller opsæt en standardliste i indstillingerne."
|
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"title": "Arkiver \"{list}\"",
|
"title": "Archive \"{project}\"",
|
||||||
"archive": "Arkiver denne liste",
|
"archive": "Archive this project",
|
||||||
"unarchive": "Fjern arkivering af denne liste",
|
"unarchive": "Un-Archive this project",
|
||||||
"unarchiveText": "Du vil være i stand til at oprette nye opgaver eller redigere den.",
|
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||||
"archiveText": "Du vil ikke være i stand til at redigere denne liste, eller oprette nye opgaver, før du fjerner arkiveringen af den.",
|
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||||
"success": "Listen blev arkiveret."
|
"success": "The project was successfully archived."
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
"title": "Indstil listebaggrund",
|
"title": "Set project background",
|
||||||
"remove": "Fjern baggrund",
|
"remove": "Remove Background",
|
||||||
"upload": "Vælg en baggrund fra din pc",
|
"upload": "Choose a background from your pc",
|
||||||
"searchPlaceholder": "Søg efter en baggrund…",
|
"searchPlaceholder": "Search for a background…",
|
||||||
"poweredByUnsplash": "Leveret af Unsplash",
|
"poweredByUnsplash": "Powered by Unsplash",
|
||||||
"loadMore": "Indlæs flere billeder",
|
"loadMore": "Load more photos",
|
||||||
"success": "Baggrunden er indstillet!",
|
"success": "The background has been set successfully!",
|
||||||
"removeSuccess": "Baggrunden er blevet fjernet!"
|
"removeSuccess": "The background has been removed successfully!"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Slet \"{list}\"",
|
"title": "Delete \"{project}\"",
|
||||||
"header": "Slet denne liste",
|
"header": "Delete this project",
|
||||||
"text1": "Er du sikker på, at du vil slette denne liste og alt dens indhold?",
|
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||||
"text2": "Dette omfatter alle opgaver og KAN IKKE GØRES OM!",
|
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Listen blev slettet.",
|
"success": "The project was successfully deleted.",
|
||||||
"tasksToDelete": "Dette vil uigenkaldeligt fjerne ca. {count} opgaver.",
|
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||||
"noTasksToDelete": "Denne liste indeholder ingen opgaver, den bør være sikker at slette."
|
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||||
},
|
},
|
||||||
"duplicate": {
|
"duplicate": {
|
||||||
"title": "Dupliker denne liste",
|
"title": "Duplicate this project",
|
||||||
"label": "Dupliker",
|
"label": "Duplicate",
|
||||||
"text": "Vælg et navneområde som skal indeholde kopien:",
|
"text": "Select a namespace which should hold the duplicated project:",
|
||||||
"success": "Listen blev kopieret."
|
"success": "The project was successfully duplicated."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"header": "Rediger Denne Liste",
|
"header": "Edit This Project",
|
||||||
"title": "Rediger \"{list}\"",
|
"title": "Edit \"{project}\"",
|
||||||
"titlePlaceholder": "Listens titel skrives her…",
|
"titlePlaceholder": "The project title goes here…",
|
||||||
"identifierTooltip": "Liste identifikatoren kan bruges til entydigt at identificere en opgave på tværs af lister. Du kan sætte den til tom for at deaktivere det.",
|
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||||
"identifier": "Liste identifikator",
|
"identifier": "Project Identifier",
|
||||||
"identifierPlaceholder": "Liste-identifikatoren skal være her…",
|
"identifierPlaceholder": "The project identifier goes here…",
|
||||||
"description": "Beskrivelse",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "Listernes beskrivelse skrives her…",
|
"descriptionPlaceholder": "The projects description goes here…",
|
||||||
"color": "Farve",
|
"color": "Color",
|
||||||
"success": "Listen blev opdateret."
|
"success": "The project was successfully updated."
|
||||||
},
|
},
|
||||||
"share": {
|
"share": {
|
||||||
"header": "Del denne liste",
|
"header": "Share this project",
|
||||||
"title": "Del \"{list}\"",
|
"title": "Share \"{project}\"",
|
||||||
"share": "Del",
|
"share": "Share",
|
||||||
"links": {
|
"links": {
|
||||||
"title": "Delingslink",
|
"title": "Share Links",
|
||||||
"what": "Hvad er et delingslink?",
|
"what": "What is a share link?",
|
||||||
"explanation": "Delinglinks giver dig mulighed for nemt at dele en liste med andre brugere, som ikke har en konto på Vikunja.",
|
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||||
"create": "Opret et nyt delingslink",
|
"create": "Create a new link share",
|
||||||
"name": "Navn (valgfrit)",
|
"name": "Name (optional)",
|
||||||
"namePlaceholder": "f.eks. Lorem Ipsum",
|
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||||
"nameExplanation": "Alle handlinger udført med dette link deling vil blive vist med navnet.",
|
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||||
"password": "Adgangskode (valgfrit)",
|
"password": "Password (optional)",
|
||||||
"passwordExplanation": "Ved indlogning vil brugeren blive bedt om at indtaste denne adgangskode.",
|
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||||
"noName": "Intet navn indstillet",
|
"noName": "No name set",
|
||||||
"remove": "Fjern et delingslink",
|
"remove": "Remove a link share",
|
||||||
"removeText": "Er du sikker på, at du vil fjerne dette delingslink? Det vil ikke længere være muligt at få adgang til denne liste med dette delingslink. Dette kan ikke gøres om!",
|
"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": "Delingslinket blev oprettet.",
|
"createSuccess": "The link share was successfully created.",
|
||||||
"deleteSuccess": "Delingslinket blev slettet",
|
"deleteSuccess": "The link share was successfully deleted",
|
||||||
"view": "Vis",
|
"view": "View",
|
||||||
"sharedBy": "Delt af {0}"
|
"sharedBy": "Shared by {0}"
|
||||||
},
|
},
|
||||||
"userTeam": {
|
"userTeam": {
|
||||||
"typeUser": "bruger | brugere",
|
"typeUser": "user | users",
|
||||||
"typeTeam": "hold | hold",
|
"typeTeam": "team | teams",
|
||||||
"shared": "Delt med disse {type}",
|
"shared": "Shared with these {type}",
|
||||||
"you": "Dig",
|
"you": "You",
|
||||||
"notShared": "Ikke delt med nogen {type} endnu.",
|
"notShared": "Not shared with any {type} yet.",
|
||||||
"removeHeader": "Fjern en {type} fra {sharable}",
|
"removeHeader": "Remove a {type} from the {sharable}",
|
||||||
"removeText": "Er du sikker på at du vil fjerne denne {sharable} fra {type}? Dette kan ikke fortrydes!",
|
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||||
"removeSuccess": "{sharable} blev fjernet fra {type}.",
|
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||||
"addedSuccess": "{type} blev tilføjet.",
|
"addedSuccess": "The {type} was successfully added.",
|
||||||
"updatedSuccess": "{type} blev tilføjet."
|
"updatedSuccess": "The {type} was successfully added."
|
||||||
},
|
},
|
||||||
"right": {
|
"right": {
|
||||||
"title": "Tilladelse",
|
"title": "Permission",
|
||||||
"read": "Skrivebeskyttet",
|
"read": "Read only",
|
||||||
"readWrite": "Læse & skrive",
|
"readWrite": "Read & write",
|
||||||
"admin": "Administrator"
|
"admin": "Admin"
|
||||||
},
|
},
|
||||||
"attributes": {
|
"attributes": {
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"delete": "Slet"
|
"delete": "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"
|
||||||
|
},
|
||||||
"gantt": {
|
"gantt": {
|
||||||
"title": "Gantt",
|
"title": "Gantt",
|
||||||
"showTasksWithoutDates": "Vis opgaver som ikke har angivet datoer",
|
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||||
"size": "Størrelse",
|
"size": "Size",
|
||||||
"default": "Standard",
|
"default": "Default",
|
||||||
"month": "Måned",
|
"month": "Month",
|
||||||
"day": "Dag",
|
"day": "Day",
|
||||||
"hour": "Time",
|
"hour": "Hour",
|
||||||
"range": "Datointerval",
|
"range": "Date Range",
|
||||||
"noDates": "Denne opgave har ingen datoer angivet."
|
"noDates": "This task has no dates set."
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"title": "Tabel",
|
"title": "Table",
|
||||||
"columns": "Kolonner"
|
"columns": "Columns"
|
||||||
},
|
},
|
||||||
"kanban": {
|
"kanban": {
|
||||||
"title": "Kanban",
|
"title": "Kanban",
|
||||||
"limit": "Grænse: {limit}",
|
"limit": "Limit: {limit}",
|
||||||
"noLimit": "Ikke angivet",
|
"noLimit": "Not Set",
|
||||||
"doneBucket": "Udført-bøtte",
|
"doneBucket": "Done bucket",
|
||||||
"doneBucketHint": "Alle opgaver der flyttes ind i denne bøtte, vil automatisk blive markeret som udført.",
|
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||||
"doneBucketHintExtended": "Alle opgaver der flyttes ind i den udført-bøtten vil blive markeret som udført automatisk. Alle opgaver markeret som udført fra andre steder vil også blive flyttet.",
|
"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": "Udført-bøtten er blevet gemt.",
|
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||||
"deleteLast": "Du kan ikke fjerne den sidste bøtte.",
|
"deleteLast": "You cannot remove the last bucket.",
|
||||||
"addTaskPlaceholder": "Indtast den nye opgavetitel…",
|
"addTaskPlaceholder": "Enter the new task title…",
|
||||||
"addTask": "Tilføj en opgave",
|
"addTask": "Add a task",
|
||||||
"addAnotherTask": "Tilføj en anden opgave",
|
"addAnotherTask": "Add another task",
|
||||||
"addBucket": "Tilføj en ny bøtte",
|
"addBucket": "Create a new bucket",
|
||||||
"addBucketPlaceholder": "Indtast den nye titel på bøtten…",
|
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||||
"deleteHeaderBucket": "Slet bøtten",
|
"deleteHeaderBucket": "Delete the bucket",
|
||||||
"deleteBucketText1": "Er du sikker på, at du vil slette denne bøtte?",
|
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||||
"deleteBucketText2": "Dette vil ikke slette nogen opgaver, men flytter dem ind i standard-bøtten.",
|
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||||
"deleteBucketSuccess": "Bøtten er blevet slettet.",
|
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||||
"bucketTitleSavedSuccess": "Titlen på bøtten er blevet gemt.",
|
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||||
"bucketLimitSavedSuccess": "Grænsen for bøtten er blevet gemt.",
|
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||||
"collapse": "Sammenfold denne spand"
|
"collapse": "Collapse this bucket"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favoritter"
|
"title": "Favorites"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"namespace": {
|
"namespace": {
|
||||||
"title": "Navneområder & Lister",
|
"title": "Namespaces & Projects",
|
||||||
"namespace": "Navneområde",
|
"namespace": "Navneområde",
|
||||||
"showArchived": "Vis arkiverede",
|
"showArchived": "Vis arkiverede",
|
||||||
"noneAvailable": "Du har ingen navneområder lige nu.",
|
"noneAvailable": "Du har ingen navneområder lige nu.",
|
||||||
"unarchive": "Tilbagekald",
|
"unarchive": "Tilbagekald",
|
||||||
"archived": "Arkiveret",
|
"archived": "Arkiveret",
|
||||||
"noLists": "Dette navneområde indeholder ikke nogen lister.",
|
"noProjects": "This namespace does not contain any projects.",
|
||||||
"createList": "Opret en ny liste i dette navneområde.",
|
"createProject": "Create a new project in this namespace.",
|
||||||
"namespaces": "Navneområder",
|
"namespaces": "Navneområder",
|
||||||
"search": "Skriv for at søge efter et navneområde…",
|
"search": "Skriv for at søge efter et navneområde…",
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nyt navneområde",
|
"title": "Nyt navneområde",
|
||||||
"titleRequired": "Angiv venligst en titel.",
|
"titleRequired": "Angiv venligst en titel.",
|
||||||
"explanation": "Et navneområde er en samling af lister du kan dele og bruge til at organisere dine lister med. Faktisk tilhører hver liste et navneområde.",
|
"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.",
|
||||||
"tooltip": "Hvad er et navneområde?",
|
"tooltip": "Hvad er et navneområde?",
|
||||||
"success": "Navneområdet blev oprettet."
|
"success": "Navneområdet blev oprettet."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"titleArchive": "Arkiver \"{namespace}\"",
|
"titleArchive": "Arkiver \"{namespace}\"",
|
||||||
"titleUnarchive": "Fjern arkivering \"{namespace}\"",
|
"titleUnarchive": "Fjern arkivering \"{namespace}\"",
|
||||||
"archiveText": "Du vil ikke være i stand til at redigere dette navneområde eller oprette nye lister, før du fjerner arkiveringen fra den. Dette vil også arkivere alle lister i dette navneområde.",
|
"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": "Du vil kunne oprette nye lister eller redigere det.",
|
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||||
"success": "Navneområdet blev arkiveret.",
|
"success": "Navneområdet blev arkiveret.",
|
||||||
"unarchiveSuccess": "Navneområdet blev tilbagekaldt.",
|
"unarchiveSuccess": "Navneområdet blev tilbagekaldt.",
|
||||||
"description": "Hvis et navneområde arkiveres, kan du ikke oprette nye lister eller redigere det."
|
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Slet \"{namespace}\"",
|
"title": "Slet \"{namespace}\"",
|
||||||
"text1": "Er du sikker på, at du vil slette dette navneområde og alt dets indhold?",
|
"text1": "Er du sikker på, at du vil slette dette navneområde og alt dets indhold?",
|
||||||
"text2": "Dette omfatter alle lister og opgaver og KAN IKKE GØRES OM!",
|
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Navneområdet blev slettet."
|
"success": "Navneområdet blev slettet."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
|
@ -371,8 +371,8 @@
|
||||||
"isArchived": "Dette navneområde er arkiveret"
|
"isArchived": "Dette navneområde er arkiveret"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"sharedLists": {
|
"sharedProjects": {
|
||||||
"title": "Delte Lister"
|
"title": "Shared Projects"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favoritter"
|
"title": "Favoritter"
|
||||||
|
@ -403,7 +403,7 @@
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nyt Gemt Filter",
|
"title": "Nyt Gemt Filter",
|
||||||
"description": "Et gemt filter er en virtuel liste, som beregnes ud fra et sæt filtre, hver gang det er tilgået. Når den er oprettet, vises den i et særligt navneområde.",
|
"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.",
|
||||||
"action": "Opret nyt gemt filter",
|
"action": "Opret nyt gemt filter",
|
||||||
"titleRequired": "Please provide a title for the filter."
|
"titleRequired": "Please provide a title for the filter."
|
||||||
},
|
},
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
"label": {
|
"label": {
|
||||||
"title": "Etiketter",
|
"title": "Etiketter",
|
||||||
"manage": "Administrer etiketter",
|
"manage": "Administrer etiketter",
|
||||||
"description": "Klik på en etiket for at redigere den. Du kan redigere alle etiketter du har oprettet, du kan bruge alle etiketter som er tilknyttet en opgave tilhørende en liste du har adgang til.",
|
"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.",
|
||||||
"newCTA": "Du har i øjeblikket ingen etiketter.",
|
"newCTA": "Du har i øjeblikket ingen etiketter.",
|
||||||
"search": "Skriv for at søge efter en etiket…",
|
"search": "Skriv for at søge efter en etiket…",
|
||||||
"create": {
|
"create": {
|
||||||
|
@ -460,7 +460,7 @@
|
||||||
},
|
},
|
||||||
"sharing": {
|
"sharing": {
|
||||||
"authenticating": "Godkender…",
|
"authenticating": "Godkender…",
|
||||||
"passwordRequired": "Denne delte liste kræver en adgangskode. Indtast den nedenfor:",
|
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||||
"error": "Der opstod en fejl.",
|
"error": "Der opstod en fejl.",
|
||||||
"invalidPassword": "Adgangskoden er ugyldig."
|
"invalidPassword": "Adgangskoden er ugyldig."
|
||||||
},
|
},
|
||||||
|
@ -529,7 +529,7 @@
|
||||||
"code": "Kode",
|
"code": "Kode",
|
||||||
"quote": "Citat",
|
"quote": "Citat",
|
||||||
"unorderedList": "Usorteret liste",
|
"unorderedList": "Usorteret liste",
|
||||||
"orderedList": "Sorteret liste",
|
"orderedList ": "Ordered List",
|
||||||
"cleanBlock": "Ryd Blok",
|
"cleanBlock": "Ryd Blok",
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"image": "Billede",
|
"image": "Billede",
|
||||||
|
@ -602,6 +602,7 @@
|
||||||
"addReminder": "Tilføj en ny påmindelse…",
|
"addReminder": "Tilføj en ny påmindelse…",
|
||||||
"doneSuccess": "Opgaven blev markeret som udført.",
|
"doneSuccess": "Opgaven blev markeret som udført.",
|
||||||
"undoneSuccess": "Opgaven fik fjernet sin udført-markering.",
|
"undoneSuccess": "Opgaven fik fjernet sin udført-markering.",
|
||||||
|
"undo": "Undo",
|
||||||
"openDetail": "Åbn detaljeret opgavevisning",
|
"openDetail": "Åbn detaljeret opgavevisning",
|
||||||
"checklistTotal": "{checked} af {total} opgaver",
|
"checklistTotal": "{checked} af {total} opgaver",
|
||||||
"checklistAllDone": "{total} opgaver",
|
"checklistAllDone": "{total} opgaver",
|
||||||
|
@ -618,7 +619,7 @@
|
||||||
"chooseDueDate": "Klik her for at angive en forfaldsdato",
|
"chooseDueDate": "Klik her for at angive en forfaldsdato",
|
||||||
"chooseStartDate": "Klik her for at angive en startdato",
|
"chooseStartDate": "Klik her for at angive en startdato",
|
||||||
"chooseEndDate": "Klik her for at angive en slutdato",
|
"chooseEndDate": "Klik her for at angive en slutdato",
|
||||||
"move": "Flyt opgave til en anden liste",
|
"move": "Move task to a different project",
|
||||||
"done": "Markér opgave som udført!",
|
"done": "Markér opgave som udført!",
|
||||||
"undone": "Markér opgave som ikke-udført",
|
"undone": "Markér opgave som ikke-udført",
|
||||||
"created": "Oprettet {0} af {1}",
|
"created": "Oprettet {0} af {1}",
|
||||||
|
@ -626,7 +627,7 @@
|
||||||
"doneAt": "Udført {0}",
|
"doneAt": "Udført {0}",
|
||||||
"updateSuccess": "Opgaven blev gemt.",
|
"updateSuccess": "Opgaven blev gemt.",
|
||||||
"deleteSuccess": "Opgaven er blevet slettet.",
|
"deleteSuccess": "Opgaven er blevet slettet.",
|
||||||
"belongsToList": "Denne opgave tilhører listen '{list}'",
|
"belongsToProject": "This task belongs to project '{project}'",
|
||||||
"due": "Forfalder {at}",
|
"due": "Forfalder {at}",
|
||||||
"closePopup": "Luk pop-up",
|
"closePopup": "Luk pop-up",
|
||||||
"delete": {
|
"delete": {
|
||||||
|
@ -646,7 +647,7 @@
|
||||||
"percentDone": "Indstil Fremskridt",
|
"percentDone": "Indstil Fremskridt",
|
||||||
"attachments": "Tilføj Vedhæftninger",
|
"attachments": "Tilføj Vedhæftninger",
|
||||||
"relatedTasks": "Tilføj Relation",
|
"relatedTasks": "Tilføj Relation",
|
||||||
"moveList": "Flyt",
|
"moveProject": "Move",
|
||||||
"color": "Indstil Farve",
|
"color": "Indstil Farve",
|
||||||
"delete": "Slet",
|
"delete": "Slet",
|
||||||
"favorite": "Tilføj til Favoritter",
|
"favorite": "Tilføj til Favoritter",
|
||||||
|
@ -673,21 +674,21 @@
|
||||||
"updated": "Opdateret"
|
"updated": "Opdateret"
|
||||||
},
|
},
|
||||||
"subscription": {
|
"subscription": {
|
||||||
"subscribedListThroughParentNamespace": "Du kan ikke afmelde dig her, fordi du abonnerer på denne liste gennem dens navneområde.",
|
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||||
"subscribedTaskThroughParentNamespace": "Du kan ikke afmelde dig her, fordi du abonnerer på denne opgave gennem dens navneområde.",
|
"subscribedTaskThroughParentNamespace": "Du kan ikke afmelde dig her, fordi du abonnerer på denne opgave gennem dens navneområde.",
|
||||||
"subscribedTaskThroughParentList": "Du kan ikke afmelde dig her, fordi du abonnerer på denne opgave gennem dens liste.",
|
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||||
"subscribedNamespace": "Du abonnerer i øjeblikket på dette navneområde og vil modtage notifikationer om ændringer.",
|
"subscribedNamespace": "Du abonnerer i øjeblikket på dette navneområde og vil modtage notifikationer om ændringer.",
|
||||||
"notSubscribedNamespace": "Du abonnerer ikke på dette navneområde og modtager ikke notifikationer om ændringer.",
|
"notSubscribedNamespace": "Du abonnerer ikke på dette navneområde og modtager ikke notifikationer om ændringer.",
|
||||||
"subscribedList": "Du abonnerer på denne liste og vil modtage notifikationer om ændringer.",
|
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||||
"notSubscribedList": "Du abonnerer ikke på denne liste og modtager ikke meddelelser om ændringer.",
|
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||||
"subscribedTask": "Du abonnerer på denne opgave og vil modtage notifikationer om ændringer.",
|
"subscribedTask": "Du abonnerer på denne opgave og vil modtage notifikationer om ændringer.",
|
||||||
"notSubscribedTask": "Du abonnerer ikke på denne opgave og modtager ikke notifikationer om ændringer.",
|
"notSubscribedTask": "Du abonnerer ikke på denne opgave og modtager ikke notifikationer om ændringer.",
|
||||||
"subscribe": "Abonner",
|
"subscribe": "Abonner",
|
||||||
"unsubscribe": "Afmeld",
|
"unsubscribe": "Afmeld",
|
||||||
"subscribeSuccessNamespace": "Du abonnerer nu på dette navneområde",
|
"subscribeSuccessNamespace": "Du abonnerer nu på dette navneområde",
|
||||||
"unsubscribeSuccessNamespace": "Du er nu afmeldt dette navneområde",
|
"unsubscribeSuccessNamespace": "Du er nu afmeldt dette navneområde",
|
||||||
"subscribeSuccessList": "Du abonnerer nu på denne liste",
|
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||||
"unsubscribeSuccessList": "Du er nu afmeldt denne liste",
|
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||||
"subscribeSuccessTask": "Du abonnerer nu på denne opgave",
|
"subscribeSuccessTask": "Du abonnerer nu på denne opgave",
|
||||||
"unsubscribeSuccessTask": "Du er nu afmeldt denne opgave"
|
"unsubscribeSuccessTask": "Du er nu afmeldt denne opgave"
|
||||||
},
|
},
|
||||||
|
@ -761,7 +762,7 @@
|
||||||
"new": "Ny Opgaverelation",
|
"new": "Ny Opgaverelation",
|
||||||
"searchPlaceholder": "Indtast søgning efter en ny opgave der tilføjes som relateret…",
|
"searchPlaceholder": "Indtast søgning efter en ny opgave der tilføjes som relateret…",
|
||||||
"createPlaceholder": "Tilføj dette som en ny relateret opgave",
|
"createPlaceholder": "Tilføj dette som en ny relateret opgave",
|
||||||
"differentList": "Denne opgave hører til en anden liste.",
|
"differentProject": "This task belongs to a different project.",
|
||||||
"differentNamespace": "Denne opgave hører til et andet navneområde.",
|
"differentNamespace": "Denne opgave hører til et andet navneområde.",
|
||||||
"noneYet": "Ingen opgaverelationer endnu.",
|
"noneYet": "Ingen opgaverelationer endnu.",
|
||||||
"delete": "Slet Opgaverelation",
|
"delete": "Slet Opgaverelation",
|
||||||
|
@ -811,10 +812,10 @@
|
||||||
"priority1": "For at sætte en opgaves prioritet, tilføj et nummer 1-5, præfikset med {prefix}.",
|
"priority1": "For at sætte en opgaves prioritet, tilføj et nummer 1-5, præfikset med {prefix}.",
|
||||||
"priority2": "Jo højere nummer, des højere prioritet.",
|
"priority2": "Jo højere nummer, des højere prioritet.",
|
||||||
"assignees": "For at tildele opgaven direkte til en bruger, tilføj deres brugernavn præfikset med {prefix} til opgaven.",
|
"assignees": "For at tildele opgaven direkte til en bruger, tilføj deres brugernavn præfikset med {prefix} til opgaven.",
|
||||||
"list1": "For at angive en liste som opgaven skal høre til, skal du indtaste dens navn præfikset med {prefix}.",
|
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||||
"list2": "Dette vil returnere en fejl, hvis listen ikke eksisterer.",
|
"project2": "This will return an error if the project does not exist.",
|
||||||
"list3": "For at bruge mellemrum, skal du blot tilføje \" eller ' omkring listens navn.",
|
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||||
"list4": "For eksempel: {prefix}\"Liste med mellemrum\".",
|
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||||
"dateAndTime": "Dato og tid",
|
"dateAndTime": "Dato og tid",
|
||||||
"date": "En dato vil blive brugt som forfaldsdato for den nye opgave. Du kan bruge datoer i enhver af disse formater:",
|
"date": "En dato vil blive brugt som forfaldsdato for den nye opgave. Du kan bruge datoer i enhver af disse formater:",
|
||||||
"dateWeekday": "enhver ugedag, vil bruge den næste dato med på den dag",
|
"dateWeekday": "enhver ugedag, vil bruge den næste dato med på den dag",
|
||||||
|
@ -847,19 +848,19 @@
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Slet holdet",
|
"header": "Slet holdet",
|
||||||
"text1": "Er du sikker på du vil slette dette hold og alle dets medlemmer?",
|
"text1": "Er du sikker på du vil slette dette hold og alle dets medlemmer?",
|
||||||
"text2": "Alle holdmedlemmer vil miste adgang til lister og navneområder, der er delt med dette team. Dette kan IKKE GØRES OM!",
|
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||||
"success": "Holdet blev slettet."
|
"success": "Holdet blev slettet."
|
||||||
},
|
},
|
||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"header": "Fjern en bruger fra holdet",
|
"header": "Fjern en bruger fra holdet",
|
||||||
"text1": "Er du sikker på du vil fjerne denne bruger fra holdet?",
|
"text1": "Er du sikker på du vil fjerne denne bruger fra holdet?",
|
||||||
"text2": "De vil miste adgang til alle lister og navneområder, som dette hold har adgang til. Dette IKKE GØRES OM!",
|
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||||
"success": "Brugeren blev fjernet fra holdet."
|
"success": "Brugeren blev fjernet fra holdet."
|
||||||
},
|
},
|
||||||
"leave": {
|
"leave": {
|
||||||
"title": "Forlad hold",
|
"title": "Forlad hold",
|
||||||
"text1": "Er du sikker på du vil forlade dette hold?",
|
"text1": "Er du sikker på du vil forlade dette hold?",
|
||||||
"text2": "De vil miste adgang til alle lister og navneområder, som dette hold har adgang til. Hvis du ombestemmer dig, skal du have en holdadministrator til at tilføje dig igen.",
|
"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.",
|
||||||
"success": "Du har forladt holdet."
|
"success": "Du har forladt holdet."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -891,22 +892,22 @@
|
||||||
"attachment": "Tilføj en vedhæftet fil til denne opgave",
|
"attachment": "Tilføj en vedhæftet fil til denne opgave",
|
||||||
"related": "Rediger relaterede opgaver for denne opgave",
|
"related": "Rediger relaterede opgaver for denne opgave",
|
||||||
"color": "Skift farven på denne opgave",
|
"color": "Skift farven på denne opgave",
|
||||||
"move": "Flyt denne opgave til en anden liste",
|
"move": "Move this task to another project",
|
||||||
"reminder": "Administrer påmindelser om denne opgave",
|
"reminder": "Administrer påmindelser om denne opgave",
|
||||||
"description": "Slå redigering af opgavebeskrivelse til/fra"
|
"description": "Slå redigering af opgavebeskrivelse til/fra"
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"title": "Listevisning",
|
"title": "Project Views",
|
||||||
"switchToListView": "Skift til listevisning",
|
"switchToListView": "Switch to list view",
|
||||||
"switchToGanttView": "Skift til gantt- visning",
|
"switchToGanttView": "Switch to gantt view",
|
||||||
"switchToKanbanView": "Skift til kanban visning",
|
"switchToKanbanView": "Switch to kanban view",
|
||||||
"switchToTableView": "Skift til tabelvisning"
|
"switchToTableView": "Switch to table view"
|
||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"title": "Navigation",
|
"title": "Navigation",
|
||||||
"overview": "Gå til oversigt",
|
"overview": "Gå til oversigt",
|
||||||
"upcoming": "Gå til kommende opgaver",
|
"upcoming": "Gå til kommende opgaver",
|
||||||
"namespaces": "Gå til navneområder & lister",
|
"namespaces": "Navigate to namespaces & projects",
|
||||||
"labels": "Naviger til etiketter",
|
"labels": "Naviger til etiketter",
|
||||||
"teams": "Naviger til hold"
|
"teams": "Naviger til hold"
|
||||||
}
|
}
|
||||||
|
@ -923,7 +924,7 @@
|
||||||
"unarchive": "Tilbagekald",
|
"unarchive": "Tilbagekald",
|
||||||
"setBackground": "Indstil baggrund",
|
"setBackground": "Indstil baggrund",
|
||||||
"share": "Del",
|
"share": "Del",
|
||||||
"newList": "Ny liste"
|
"newProject": "New project"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"url": "Vikunja URL",
|
"url": "Vikunja URL",
|
||||||
|
@ -942,24 +943,24 @@
|
||||||
"notification": {
|
"notification": {
|
||||||
"title": "Notifikationer",
|
"title": "Notifikationer",
|
||||||
"none": "Du har ingen notifikationer. Hav en dejlig dag!",
|
"none": "Du har ingen notifikationer. Hav en dejlig dag!",
|
||||||
"explainer": "Notifikationer vises her, når handlinger på navneområder, lister eller opgaver du abonnerede på er nødvendige."
|
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||||
},
|
},
|
||||||
"quickActions": {
|
"quickActions": {
|
||||||
"commands": "Kommandoer",
|
"commands": "Kommandoer",
|
||||||
"placeholder": "Indtast en kommando eller søg…",
|
"placeholder": "Indtast en kommando eller søg…",
|
||||||
"hint": "Du kan bruge {list} til at begrænse søgningen til en liste. Kombiner {list} eller {label} (etiketter) med en søgning for at søge efter en opgave med disse etiketter eller på listen. Brug {assignee} til kun at søge efter hold.",
|
"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.",
|
||||||
"tasks": "Opgaver",
|
"tasks": "Opgaver",
|
||||||
"lists": "Lister",
|
"projects": "Projects",
|
||||||
"teams": "Hold",
|
"teams": "Hold",
|
||||||
"newList": "Indtast titlen på den nye liste…",
|
"newProject": "Enter the title of the new project…",
|
||||||
"newTask": "Indtast titlen på den nye opgave…",
|
"newTask": "Indtast titlen på den nye opgave…",
|
||||||
"newNamespace": "Indtast titlen på det nye navneområde…",
|
"newNamespace": "Indtast titlen på det nye navneområde…",
|
||||||
"newTeam": "Indtast navnet på det nye hold…",
|
"newTeam": "Indtast navnet på det nye hold…",
|
||||||
"createTask": "Opret en opgave i den nuværende liste ({title})",
|
"createTask": "Create a task in the current project ({title})",
|
||||||
"createList": "Opret en liste i det nuværende navneområde ({title})",
|
"createProject": "Create a project in the current namespace ({title})",
|
||||||
"cmds": {
|
"cmds": {
|
||||||
"newTask": "Ny Opgave",
|
"newTask": "Ny Opgave",
|
||||||
"newList": "Ny liste",
|
"newProject": "New project",
|
||||||
"newNamespace": "Nyt navneområde",
|
"newNamespace": "Nyt navneområde",
|
||||||
"newTeam": "Nyt hold"
|
"newTeam": "Nyt hold"
|
||||||
}
|
}
|
||||||
|
@ -991,15 +992,15 @@
|
||||||
"1018": "Brugerens avatartype indstilling er ugyldig.",
|
"1018": "Brugerens avatartype indstilling er ugyldig.",
|
||||||
"2001": "ID kan ikke være tomt eller 0.",
|
"2001": "ID kan ikke være tomt eller 0.",
|
||||||
"2002": "Nogle af forespørgselsdataene var ugyldige.",
|
"2002": "Nogle af forespørgselsdataene var ugyldige.",
|
||||||
"3001": "Listen eksisterer ikke.",
|
"3001": "The project does not exist.",
|
||||||
"3004": "Du skal have læserettigheder på listen for at udføre denne handling.",
|
"3004": "You need to have read permissions on that project to perform that action.",
|
||||||
"3005": "Listens titel må ikke være tom.",
|
"3005": "The project title cannot be empty.",
|
||||||
"3006": "Listendelingen findes ikke.",
|
"3006": "The project share does not exist.",
|
||||||
"3007": "En liste med dette id findes allerede.",
|
"3007": "A project with this identifier already exists.",
|
||||||
"3008": "Listen er arkiveret og kan derfor kun tilgås skrivebeskyttet. Dette gælder også for alle opgaver der er tilknyttet denne liste.",
|
"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": "Listeopgaveteksten kan ikke være tom.",
|
"4001": "The project task text cannot be empty.",
|
||||||
"4002": "Listeopgave eksisterer ikke.",
|
"4002": "The project task does not exist.",
|
||||||
"4003": "Alle masseredigeringsopgaver skal tilhøre den samme liste.",
|
"4003": "All bulk editing tasks must belong to the same project.",
|
||||||
"4004": "Der skal være mindst én opgave for at masseredigere opgaver.",
|
"4004": "Der skal være mindst én opgave for at masseredigere opgaver.",
|
||||||
"4005": "Du har ikke rettigheder til at se opgaven.",
|
"4005": "Du har ikke rettigheder til at se opgaven.",
|
||||||
"4006": "Du kan ikke indstille en overordnet opgave som opgaven selv.",
|
"4006": "Du kan ikke indstille en overordnet opgave som opgaven selv.",
|
||||||
|
@ -1025,21 +1026,21 @@
|
||||||
"5012": "Navneområdet er arkiveret og kan derfor kun læses.",
|
"5012": "Navneområdet er arkiveret og kan derfor kun læses.",
|
||||||
"6001": "Holdnavnet må ikke være tomt.",
|
"6001": "Holdnavnet må ikke være tomt.",
|
||||||
"6002": "Holdet findes ikke.",
|
"6002": "Holdet findes ikke.",
|
||||||
"6004": "Holdet har allerede adgang til dette navneområde eller liste.",
|
"6004": "The team already has access to that namespace or project.",
|
||||||
"6005": "Brugeren er allerede medlem af holdet.",
|
"6005": "Brugeren er allerede medlem af holdet.",
|
||||||
"6006": "Kan ikke slette det sidste holdmedlem.",
|
"6006": "Kan ikke slette det sidste holdmedlem.",
|
||||||
"6007": "Holdet har ikke adgang til listen for at udføre denne handling.",
|
"6007": "The team does not have access to the project to perform that action.",
|
||||||
"7002": "Brugeren har allerede adgang til denne liste.",
|
"7002": "The user already has access to that project.",
|
||||||
"7003": "Du har ikke adgang til denne liste.",
|
"7003": "You do not have access to that project.",
|
||||||
"8001": "Denne etiket findes allerede på denne opgave.",
|
"8001": "Denne etiket findes allerede på denne opgave.",
|
||||||
"8002": "Etiketten findes ikke.",
|
"8002": "Etiketten findes ikke.",
|
||||||
"8003": "Du har ikke adgang til denne etiket.",
|
"8003": "Du har ikke adgang til denne etiket.",
|
||||||
"9001": "Rettigheden er ugyldig.",
|
"9001": "Rettigheden er ugyldig.",
|
||||||
"10001": "Kurven findes ikke.",
|
"10001": "Kurven findes ikke.",
|
||||||
"10002": "Kurven tilhører ikke denne liste.",
|
"10002": "The bucket does not belong to that project.",
|
||||||
"10003": "Du kan ikke fjerne den sidste kurv på en liste.",
|
"10003": "You cannot remove the last bucket on a project.",
|
||||||
"10004": "Du kan ikke tilføje opgaven til denne kurv, da den allerede overskrider grænsen for opgaver, den kan holde.",
|
"10004": "Du kan ikke tilføje opgaven til denne kurv, da den allerede overskrider grænsen for opgaver, den kan holde.",
|
||||||
"10005": "Der kan kun være en færdig kurv pr. liste.",
|
"10005": "There can be only one done bucket per project.",
|
||||||
"11001": "Det gemte filter eksisterer ikke.",
|
"11001": "Det gemte filter eksisterer ikke.",
|
||||||
"11002": "Gemte filtre er ikke tilgængelige for delingslink.",
|
"11002": "Gemte filtre er ikke tilgængelige for delingslink.",
|
||||||
"12001": "Enhedstypen for abonnementet er ugyldigt.",
|
"12001": "Enhedstypen for abonnementet er ugyldigt.",
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
"welcomeDay": "Hallo {username}!",
|
"welcomeDay": "Hallo {username}!",
|
||||||
"welcomeEvening": "Guten Abend, {username}!",
|
"welcomeEvening": "Guten Abend, {username}!",
|
||||||
"lastViewed": "Zuletzt angesehen",
|
"lastViewed": "Zuletzt angesehen",
|
||||||
"list": {
|
"project": {
|
||||||
"newText": "Du kannst eine neue Liste für deine neuen Aufgaben erstellen:",
|
"newText": "Du kannst ein neues Projekt für deine neuen Aufgaben erstellen:",
|
||||||
"new": "Neue Liste",
|
"new": "New project",
|
||||||
"importText": "Oder importiere deine Listen und Aufgaben aus anderen Diensten in Vikunja:",
|
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||||
"import": "Deine Daten in Vikunja importieren"
|
"import": "Import your data into Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"404": {
|
"404": {
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
"weekStartSunday": "Sonntag",
|
"weekStartSunday": "Sonntag",
|
||||||
"weekStartMonday": "Montag",
|
"weekStartMonday": "Montag",
|
||||||
"language": "Sprache",
|
"language": "Sprache",
|
||||||
"defaultList": "Standard-Liste",
|
"defaultProject": "Default Project",
|
||||||
"timezone": "Zeitzone",
|
"timezone": "Zeitzone",
|
||||||
"overdueTasksRemindersTime": "Zeit der E-Mail-Zusammenfassung der überfälligen Aufgaben"
|
"overdueTasksRemindersTime": "Zeit der E-Mail-Zusammenfassung der überfälligen Aufgaben"
|
||||||
},
|
},
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
},
|
},
|
||||||
"deletion": {
|
"deletion": {
|
||||||
"title": "Lösche deinen Vikunja-Account",
|
"title": "Lösche deinen Vikunja-Account",
|
||||||
"text1": "Das Löschen deines Accounts ist dauerhaft und unwiderruflich. Alle Namensräume, Listen und zugehörige Daten werden gelöscht.",
|
"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.",
|
||||||
"text2": "Zum Fortfahren gib bitte dein Passwort ein. Du erhältst eine E-Mail mit weiteren Anweisungen.",
|
"text2": "Zum Fortfahren gib bitte dein Passwort ein. Du erhältst eine E-Mail mit weiteren Anweisungen.",
|
||||||
"confirm": "Meinen Account löschen",
|
"confirm": "Meinen Account löschen",
|
||||||
"requestSuccess": "Die Anfrage war erfolgreich. Du erhältst eine E-Mail mit weiteren Anweisungen.",
|
"requestSuccess": "Die Anfrage war erfolgreich. Du erhältst eine E-Mail mit weiteren Anweisungen.",
|
||||||
|
@ -157,201 +157,201 @@
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"title": "Exportiere deine Vikunja-Daten",
|
"title": "Exportiere deine Vikunja-Daten",
|
||||||
"description": "Du kannst eine Kopie deiner Daten bei Vikunja anfordern. Dazu gehören Namespaces, Listen, Aufgaben und alles, was damit zusammenhängt. Du kannst diese Daten dann in jeder Vikunja-Instanz über die Migrationsfunktion importieren.",
|
"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.",
|
||||||
"descriptionPasswordRequired": "Bitte gib dein Passwort ein, um fortzufahren:",
|
"descriptionPasswordRequired": "Bitte gib dein Passwort ein, um fortzufahren:",
|
||||||
"request": "Eine Kopie meiner Vikunja Daten anfordern",
|
"request": "Eine Kopie meiner Vikunja Daten anfordern",
|
||||||
"success": "Du hast deine Daten bei Vikunja erfolgreich angefordert! Wir schicken dir eine E-Mail, sobald sie zum Download bereitstehen.",
|
"success": "Du hast deine Daten bei Vikunja erfolgreich angefordert! Wir schicken dir eine E-Mail, sobald sie zum Download bereitstehen.",
|
||||||
"downloadTitle": "Lade deine exportierten Vikunja-Daten herunter"
|
"downloadTitle": "Lade deine exportierten Vikunja-Daten herunter"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"archived": "Diese Liste ist archiviert. Es ist nicht möglich, neue Aufgaben zu erstellen oder sie zu bearbeiten.",
|
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||||
"title": "Listentitel",
|
"title": "Project Title",
|
||||||
"color": "Farbe",
|
"color": "Color",
|
||||||
"lists": "Listen",
|
"projects": "Projects",
|
||||||
"list": {
|
"search": "Type to search for a project…",
|
||||||
"title": "Liste",
|
"searchSelect": "Click or press enter to select this project",
|
||||||
"add": "Hinzufügen",
|
"shared": "Shared Projects",
|
||||||
"addPlaceholder": "Neue Aufgabe hinzufügen …",
|
"noDescriptionAvailable": "No project description is available.",
|
||||||
"empty": "Diese Liste ist derzeit leer.",
|
|
||||||
"newTaskCta": "Eine neue Aufgabe erstellen.",
|
|
||||||
"editTask": "Aufgabe bearbeiten"
|
|
||||||
},
|
|
||||||
"search": "Tippe, um nach einer Liste zu suchen…",
|
|
||||||
"searchSelect": "Klicke auf oder drücke die Eingabetaste, um diese Liste auszuwählen",
|
|
||||||
"shared": "Geteilte Listen",
|
|
||||||
"noDescriptionAvailable": "Keine Listenbeschreibung verfügbar.",
|
|
||||||
"create": {
|
"create": {
|
||||||
"header": "Neue Liste",
|
"header": "New project",
|
||||||
"titlePlaceholder": "Der Titel der Liste steht hier…",
|
"titlePlaceholder": "The project's title goes here…",
|
||||||
"addTitleRequired": "Bitte gebe einen Namen an.",
|
"addTitleRequired": "Please specify a title.",
|
||||||
"createdSuccess": "Die Liste wurde erfolgreich erstellt.",
|
"createdSuccess": "The project was successfully created.",
|
||||||
"addListRequired": "Bitte gebe eine Liste an oder lege eine Standardliste in den Einstellungen fest."
|
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"title": "„{list}“ archivieren",
|
"title": "Archive \"{project}\"",
|
||||||
"archive": "Diese Liste archivieren",
|
"archive": "Archive this project",
|
||||||
"unarchive": "Archivierung dieser Liste aufheben",
|
"unarchive": "Un-Archive this project",
|
||||||
"unarchiveText": "Du wirst neue Aufgaben erstellen oder sie bearbeiten können.",
|
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||||
"archiveText": "Du kannst diese Liste nicht bearbeiten oder neue Aufgaben erstellen, bis du die Archivierung aufhebst.",
|
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||||
"success": "Die Liste wurde erfolgreich archiviert."
|
"success": "The project was successfully archived."
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
"title": "Listenhintergrund festlegen",
|
"title": "Set project background",
|
||||||
"remove": "Hintergrund entfernen",
|
"remove": "Remove Background",
|
||||||
"upload": "Wähle einen Hintergrund von deinem Computer",
|
"upload": "Choose a background from your pc",
|
||||||
"searchPlaceholder": "Nach einem Hintergrund suchen…",
|
"searchPlaceholder": "Search for a background…",
|
||||||
"poweredByUnsplash": "Powered by Unsplash",
|
"poweredByUnsplash": "Powered by Unsplash",
|
||||||
"loadMore": "Weitere Bilder laden",
|
"loadMore": "Load more photos",
|
||||||
"success": "Der Hintergrund wurde erfolgreich eingestellt!",
|
"success": "The background has been set successfully!",
|
||||||
"removeSuccess": "Der Hintergrund wurde erfolgreich entfernt!"
|
"removeSuccess": "The background has been removed successfully!"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "„{list}“ löschen",
|
"title": "Delete \"{project}\"",
|
||||||
"header": "Diese Liste löschen",
|
"header": "Delete this project",
|
||||||
"text1": "Bist du sicher, dass du diese Liste und alle ihre Inhalte löschen willst?",
|
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||||
"text2": "Dies umfasst alle Aufgaben und kann NICHT rückgängig gemacht werden!",
|
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Die Liste wurde erfolgreich gelöscht.",
|
"success": "The project was successfully deleted.",
|
||||||
"tasksToDelete": "Dies löscht unwiderruflich ca. {count} Aufgaben.",
|
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||||
"noTasksToDelete": "Diese Liste enthält keine Aufgaben, sie kann sicher gelöscht werden."
|
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||||
},
|
},
|
||||||
"duplicate": {
|
"duplicate": {
|
||||||
"title": "Diese Liste duplizieren",
|
"title": "Duplicate this project",
|
||||||
"label": "Duplizieren",
|
"label": "Duplicate",
|
||||||
"text": "Wähle einen Namespace aus, der die duplizierte Liste enthalten soll:",
|
"text": "Select a namespace which should hold the duplicated project:",
|
||||||
"success": "Die Liste wurde erfolgreich dupliziert."
|
"success": "The project was successfully duplicated."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"header": "Diese Liste bearbeiten",
|
"header": "Edit This Project",
|
||||||
"title": "„{list}“ bearbeiten",
|
"title": "Edit \"{project}\"",
|
||||||
"titlePlaceholder": "Listenname eingeben …",
|
"titlePlaceholder": "The project title goes here…",
|
||||||
"identifierTooltip": "Der Listenbezeichner kann zur eindeutigen Identifizierung einer Aufgabe über Listen hinweg verwendet werden. Du kannst ihn auf leer setzen, um ihn zu deaktivieren.",
|
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||||
"identifier": "Listenbezeichner",
|
"identifier": "Project Identifier",
|
||||||
"identifierPlaceholder": "Der Listenbezeichner kommt hierhin…",
|
"identifierPlaceholder": "The project identifier goes here…",
|
||||||
"description": "Beschreibung",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "Listenbeschreibung eingeben…",
|
"descriptionPlaceholder": "The projects description goes here…",
|
||||||
"color": "Farbe",
|
"color": "Color",
|
||||||
"success": "Die Liste wurde erfolgreich aktualisiert."
|
"success": "The project was successfully updated."
|
||||||
},
|
},
|
||||||
"share": {
|
"share": {
|
||||||
"header": "Diese Liste teilen",
|
"header": "Share this project",
|
||||||
"title": "„{list}“ teilen",
|
"title": "Share \"{project}\"",
|
||||||
"share": "Teilen",
|
"share": "Share",
|
||||||
"links": {
|
"links": {
|
||||||
"title": "Linkfreigaben",
|
"title": "Share Links",
|
||||||
"what": "Was ist eine Linkfreigabe?",
|
"what": "What is a share link?",
|
||||||
"explanation": "Mit Linkfreigaben kannst du Listen mit Benutzer:innen ohne Vikunja-Account teilen.",
|
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||||
"create": "Erstelle einen neue Linkfreigabe",
|
"create": "Create a new link share",
|
||||||
"name": "Name (optional)",
|
"name": "Name (optional)",
|
||||||
"namePlaceholder": "z.B. Max Muster",
|
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||||
"nameExplanation": "Alle Aktionen, die mit dieser Linkfreigabe durchgeführt werden, werden mit diesem Namen angezeigt.",
|
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||||
"password": "Passwort (optional)",
|
"password": "Password (optional)",
|
||||||
"passwordExplanation": "Bei der Authentifizierung wird der:die Benutzer:in aufgefordert, dieses Passwort einzugeben.",
|
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||||
"noName": "Kein Name angegeben",
|
"noName": "No name set",
|
||||||
"remove": "Eine Linkfreigabe löschen",
|
"remove": "Remove a link share",
|
||||||
"removeText": "Bist du sicher, dass du diese Linkfreigabe unwiderruflich löschen möchtest? Über die Linkfreigabe ist danach der Zugriff auf die Liste nicht mehr möglich!",
|
"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": "Die Linkfreigabe wurde erfolgreich erstellt.",
|
"createSuccess": "The link share was successfully created.",
|
||||||
"deleteSuccess": "Die Linkfreigabe wurde erfolgreich gelöscht",
|
"deleteSuccess": "The link share was successfully deleted",
|
||||||
"view": "Ansicht",
|
"view": "View",
|
||||||
"sharedBy": "Von {0} geteilt"
|
"sharedBy": "Shared by {0}"
|
||||||
},
|
},
|
||||||
"userTeam": {
|
"userTeam": {
|
||||||
"typeUser": "Benutzer:in | Benutzer:innen",
|
"typeUser": "user | users",
|
||||||
"typeTeam": "Team | Teams",
|
"typeTeam": "team | teams",
|
||||||
"shared": "Geteilt mit diesen {type}",
|
"shared": "Shared with these {type}",
|
||||||
"you": "Du",
|
"you": "You",
|
||||||
"notShared": "Noch nicht mit einem {type} geteilt.",
|
"notShared": "Not shared with any {type} yet.",
|
||||||
"removeHeader": "Einen {type} von {sharable} entfernen",
|
"removeHeader": "Remove a {type} from the {sharable}",
|
||||||
"removeText": "Diesen {sharable} von {type} entfernen? Dies kann nicht rückgängig gemacht werden!",
|
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||||
"removeSuccess": "{sharable} wurde erfolgreich von {type} entfernt.",
|
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||||
"addedSuccess": "{type} wurde erfolgreich hinzugefügt.",
|
"addedSuccess": "The {type} was successfully added.",
|
||||||
"updatedSuccess": "{type} wurde erfolgreich hinzugefügt."
|
"updatedSuccess": "The {type} was successfully added."
|
||||||
},
|
},
|
||||||
"right": {
|
"right": {
|
||||||
"title": "Berechtigung",
|
"title": "Permission",
|
||||||
"read": "Nur Leserechte",
|
"read": "Read only",
|
||||||
"readWrite": "Lesen & Schreiben",
|
"readWrite": "Read & write",
|
||||||
"admin": "Admin"
|
"admin": "Admin"
|
||||||
},
|
},
|
||||||
"attributes": {
|
"attributes": {
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"delete": "Löschen"
|
"delete": "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"
|
||||||
|
},
|
||||||
"gantt": {
|
"gantt": {
|
||||||
"title": "Gantt",
|
"title": "Gantt",
|
||||||
"showTasksWithoutDates": "Aufgaben anzeigen, für die keine Daten festgelegt sind",
|
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||||
"size": "Größe",
|
"size": "Size",
|
||||||
"default": "Standard",
|
"default": "Default",
|
||||||
"month": "Monat",
|
"month": "Month",
|
||||||
"day": "Tag",
|
"day": "Day",
|
||||||
"hour": "Stunde",
|
"hour": "Hour",
|
||||||
"range": "Zeitraum",
|
"range": "Date Range",
|
||||||
"noDates": "Diese Aufgabe hat keine Daten definiert."
|
"noDates": "This task has no dates set."
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"title": "Tabelle",
|
"title": "Table",
|
||||||
"columns": "Spalten"
|
"columns": "Columns"
|
||||||
},
|
},
|
||||||
"kanban": {
|
"kanban": {
|
||||||
"title": "Kanban",
|
"title": "Kanban",
|
||||||
"limit": "Limit: {limit}",
|
"limit": "Limit: {limit}",
|
||||||
"noLimit": "Nicht gesetzt",
|
"noLimit": "Not Set",
|
||||||
"doneBucket": "Erledigt Spalte",
|
"doneBucket": "Done bucket",
|
||||||
"doneBucketHint": "Alle Aufgaben, die in diese Spalte verschoben werden, werden automatisch als erledigt markiert.",
|
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||||
"doneBucketHintExtended": "Alle Aufgaben, die in die Erledigt Spalte verschoben wurden, werden automatisch als erledigt markiert. Aufgaben, die in einer anderen Spalte als Erledigt markiert wurden, werden auch in diese Spalte verschoben.",
|
"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": "Erledigt Spalte gespeichert.",
|
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||||
"deleteLast": "Du kannst die letzte Spalte nicht entfernen.",
|
"deleteLast": "You cannot remove the last bucket.",
|
||||||
"addTaskPlaceholder": "Gebe einen Aufgabenamen ein …",
|
"addTaskPlaceholder": "Enter the new task title…",
|
||||||
"addTask": "Eine Aufgabe hinzufügen",
|
"addTask": "Add a task",
|
||||||
"addAnotherTask": "Weitere Aufgabe hinzufügen",
|
"addAnotherTask": "Add another task",
|
||||||
"addBucket": "Eine neue Spalte erstellen",
|
"addBucket": "Create a new bucket",
|
||||||
"addBucketPlaceholder": "Gebe einen Spalten-Titel ein…",
|
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||||
"deleteHeaderBucket": "Spalte löschen",
|
"deleteHeaderBucket": "Delete the bucket",
|
||||||
"deleteBucketText1": "Bist du sicher, dass du diese Spalte löschen möchtest?",
|
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||||
"deleteBucketText2": "Dies löscht keine Aufgaben, sondern verschiebt sie in die Standard Spalte.",
|
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||||
"deleteBucketSuccess": "Die Spalte wurde erfolgreich gelöscht.",
|
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||||
"bucketTitleSavedSuccess": "Der Spaltenname wurde erfolgreich gespeichert.",
|
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||||
"bucketLimitSavedSuccess": "Das Spaltenlimit wurde erfolgreich gespeichert.",
|
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||||
"collapse": "Spalte einklappen"
|
"collapse": "Collapse this bucket"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favoriten"
|
"title": "Favorites"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"namespace": {
|
"namespace": {
|
||||||
"title": "Namespaces & Listen",
|
"title": "Namespaces & Projects",
|
||||||
"namespace": "Namespace",
|
"namespace": "Namespace",
|
||||||
"showArchived": "Archivierte anzeigen",
|
"showArchived": "Archivierte anzeigen",
|
||||||
"noneAvailable": "Du hast momentan keine Namespaces.",
|
"noneAvailable": "Du hast momentan keine Namespaces.",
|
||||||
"unarchive": "Archivierung aufheben",
|
"unarchive": "Archivierung aufheben",
|
||||||
"archived": "Archiviert",
|
"archived": "Archiviert",
|
||||||
"noLists": "Dieser Namespace enthält keine Listen.",
|
"noProjects": "This namespace does not contain any projects.",
|
||||||
"createList": "Erstelle eine neue Liste in diesem Namespace.",
|
"createProject": "Create a new project in this namespace.",
|
||||||
"namespaces": "Namespaces",
|
"namespaces": "Namespaces",
|
||||||
"search": "Beginne zu schreiben, um einen Namespace zu suchen…",
|
"search": "Beginne zu schreiben, um einen Namespace zu suchen…",
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Neuer Namespace",
|
"title": "Neuer Namespace",
|
||||||
"titleRequired": "Bitte gebe einen Titel an.",
|
"titleRequired": "Bitte gebe einen Titel an.",
|
||||||
"explanation": "Ein Namespace ist eine Sammlung von Listen, die du teilen und zur Organisation verwenden kannst. Jede Liste gehört zu einem Namespace.",
|
"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.",
|
||||||
"tooltip": "Was ist ein Namespace?",
|
"tooltip": "Was ist ein Namespace?",
|
||||||
"success": "Der Namespace wurde erfolgreich erstellt."
|
"success": "Der Namespace wurde erfolgreich erstellt."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"titleArchive": "„{namespace}“ archivieren",
|
"titleArchive": "„{namespace}“ archivieren",
|
||||||
"titleUnarchive": "Archivierung von \"{namespace}\" aufheben",
|
"titleUnarchive": "Archivierung von \"{namespace}\" aufheben",
|
||||||
"archiveText": "Du kannst diesen Namespace nicht mehr bearbeiten oder neue Listen erstellen, bis du die Archivierung rückgängig machst. Das gilt auch für alle Listen in diesem 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": "Du kannst neue Aufgaben erstellen oder diese bearbeiten.",
|
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||||
"success": "Der Namespace wurde erfolgreich archiviert.",
|
"success": "Der Namespace wurde erfolgreich archiviert.",
|
||||||
"unarchiveSuccess": "Der Namespace wurde erfolgreich wiederhergestellt.",
|
"unarchiveSuccess": "Der Namespace wurde erfolgreich wiederhergestellt.",
|
||||||
"description": "In einem archivierten Namespace können Listen weder angelegt noch editiert werden."
|
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "„{namespace}“ löschen",
|
"title": "„{namespace}“ löschen",
|
||||||
"text1": "Diesen Namespace mit sämtlichem Inhalt löschen?",
|
"text1": "Diesen Namespace mit sämtlichem Inhalt löschen?",
|
||||||
"text2": "Dies umfasst alle Listen und Aufgaben und kann NICHT rückgängig gemacht werden!",
|
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Der Namespace wurde erfolgreich gelöscht."
|
"success": "Der Namespace wurde erfolgreich gelöscht."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
|
@ -371,8 +371,8 @@
|
||||||
"isArchived": "Dieser Namespace ist archiviert"
|
"isArchived": "Dieser Namespace ist archiviert"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"sharedLists": {
|
"sharedProjects": {
|
||||||
"title": "Geteilte Listen"
|
"title": "Shared Projects"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favoriten"
|
"title": "Favoriten"
|
||||||
|
@ -403,7 +403,7 @@
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Neuer gespeicherter Filter",
|
"title": "Neuer gespeicherter Filter",
|
||||||
"description": "Ein gespeicherter Filter ist eine virtuelle Liste, die bei jedem Zugriff aus einem Satz von Filtern errechnet wird. Einmal erstellt, erscheint diese in einem speziellen Namespace.",
|
"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.",
|
||||||
"action": "Neuen gespeicherten Filter erstellen",
|
"action": "Neuen gespeicherten Filter erstellen",
|
||||||
"titleRequired": "Bitte gib den Titel für den Filter an."
|
"titleRequired": "Bitte gib den Titel für den Filter an."
|
||||||
},
|
},
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
"label": {
|
"label": {
|
||||||
"title": "Labels",
|
"title": "Labels",
|
||||||
"manage": "Label verwalten",
|
"manage": "Label verwalten",
|
||||||
"description": "Klicke auf ein Label um es zu editieren. Du kannst alle Labels, welche du erstellt hast, editieren. Du kannst alle Labels, welche mit einer Aufgabe, auf die du Zugriff hast, benutzen.",
|
"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.",
|
||||||
"newCTA": "Du hast momentan keine Labels.",
|
"newCTA": "Du hast momentan keine Labels.",
|
||||||
"search": "Beginne zu schreiben, um nach einem Label zu suchen…",
|
"search": "Beginne zu schreiben, um nach einem Label zu suchen…",
|
||||||
"create": {
|
"create": {
|
||||||
|
@ -460,7 +460,7 @@
|
||||||
},
|
},
|
||||||
"sharing": {
|
"sharing": {
|
||||||
"authenticating": "Authentifizierung …",
|
"authenticating": "Authentifizierung …",
|
||||||
"passwordRequired": "Diese geteilte Liste benötigt ein Passwort. Bitte gebe es unten ein:",
|
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||||
"error": "Es ist ein Fehler aufgetreten.",
|
"error": "Es ist ein Fehler aufgetreten.",
|
||||||
"invalidPassword": "Das Passwort ist ungültig."
|
"invalidPassword": "Das Passwort ist ungültig."
|
||||||
},
|
},
|
||||||
|
@ -529,7 +529,7 @@
|
||||||
"code": "Code",
|
"code": "Code",
|
||||||
"quote": "Zitat",
|
"quote": "Zitat",
|
||||||
"unorderedList": "Ungeordnete Liste",
|
"unorderedList": "Ungeordnete Liste",
|
||||||
"orderedList": "Geordnete Liste",
|
"orderedList ": "Ordered List",
|
||||||
"cleanBlock": "Formatierung löschen",
|
"cleanBlock": "Formatierung löschen",
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"image": "Bild",
|
"image": "Bild",
|
||||||
|
@ -602,6 +602,7 @@
|
||||||
"addReminder": "Eine Erinnerung hinzufügen…",
|
"addReminder": "Eine Erinnerung hinzufügen…",
|
||||||
"doneSuccess": "Die Aufgabe wurde erfolgreich als erledigt markiert.",
|
"doneSuccess": "Die Aufgabe wurde erfolgreich als erledigt markiert.",
|
||||||
"undoneSuccess": "Die Aufgabe wurde erfolgreich als nicht-erledigt markiert.",
|
"undoneSuccess": "Die Aufgabe wurde erfolgreich als nicht-erledigt markiert.",
|
||||||
|
"undo": "Rückgängig",
|
||||||
"openDetail": "Aufgabe in der Detailansicht anzeigen",
|
"openDetail": "Aufgabe in der Detailansicht anzeigen",
|
||||||
"checklistTotal": "{checked} von {total} Aufgaben",
|
"checklistTotal": "{checked} von {total} Aufgaben",
|
||||||
"checklistAllDone": "{total} Aufgaben",
|
"checklistAllDone": "{total} Aufgaben",
|
||||||
|
@ -618,7 +619,7 @@
|
||||||
"chooseDueDate": "Klicke hier, um ein Fälligkeitsdatum zu setzen",
|
"chooseDueDate": "Klicke hier, um ein Fälligkeitsdatum zu setzen",
|
||||||
"chooseStartDate": "Klicke hier, um ein Startdatum zu setzen",
|
"chooseStartDate": "Klicke hier, um ein Startdatum zu setzen",
|
||||||
"chooseEndDate": "Klicke hier, um ein Enddatum zu setzen",
|
"chooseEndDate": "Klicke hier, um ein Enddatum zu setzen",
|
||||||
"move": "Aufgabe in eine andere Liste verschieben",
|
"move": "Move task to a different project",
|
||||||
"done": "Als erledigt markieren!",
|
"done": "Als erledigt markieren!",
|
||||||
"undone": "Als nicht erledigt markieren",
|
"undone": "Als nicht erledigt markieren",
|
||||||
"created": "Erstellt {0} von {1}",
|
"created": "Erstellt {0} von {1}",
|
||||||
|
@ -626,7 +627,7 @@
|
||||||
"doneAt": "Erledigt {0}",
|
"doneAt": "Erledigt {0}",
|
||||||
"updateSuccess": "Die Aufgabe wurde erfolgreich gespeichert.",
|
"updateSuccess": "Die Aufgabe wurde erfolgreich gespeichert.",
|
||||||
"deleteSuccess": "Die Aufgabe wurde erfolgreich gelöscht.",
|
"deleteSuccess": "Die Aufgabe wurde erfolgreich gelöscht.",
|
||||||
"belongsToList": "Diese Aufgabe gehört zur Liste „{list}“",
|
"belongsToProject": "This task belongs to project '{project}'",
|
||||||
"due": "Fällig {at}",
|
"due": "Fällig {at}",
|
||||||
"closePopup": "Popup schließen",
|
"closePopup": "Popup schließen",
|
||||||
"delete": {
|
"delete": {
|
||||||
|
@ -646,7 +647,7 @@
|
||||||
"percentDone": "Fortschritt einstellen",
|
"percentDone": "Fortschritt einstellen",
|
||||||
"attachments": "Anhänge hinzufügen",
|
"attachments": "Anhänge hinzufügen",
|
||||||
"relatedTasks": "Beziehung hinzufügen",
|
"relatedTasks": "Beziehung hinzufügen",
|
||||||
"moveList": "Verschieben",
|
"moveProject": "Move",
|
||||||
"color": "Farbe setzen",
|
"color": "Farbe setzen",
|
||||||
"delete": "Löschen",
|
"delete": "Löschen",
|
||||||
"favorite": "Zu Favoriten hinzufügen",
|
"favorite": "Zu Favoriten hinzufügen",
|
||||||
|
@ -673,21 +674,21 @@
|
||||||
"updated": "Aktualisiert"
|
"updated": "Aktualisiert"
|
||||||
},
|
},
|
||||||
"subscription": {
|
"subscription": {
|
||||||
"subscribedListThroughParentNamespace": "Du kannst hier nicht de-abonnieren, da du diese Liste über ihren Namespace abonniert hast.",
|
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||||
"subscribedTaskThroughParentNamespace": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihren Namespace abonniert hast.",
|
"subscribedTaskThroughParentNamespace": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihren Namespace abonniert hast.",
|
||||||
"subscribedTaskThroughParentList": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihre Liste abonniert hast.",
|
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||||
"subscribedNamespace": "Du hast diesen Namespace abonniert und erhältst Benachrichtigungen über Änderungen.",
|
"subscribedNamespace": "Du hast diesen Namespace abonniert und erhältst Benachrichtigungen über Änderungen.",
|
||||||
"notSubscribedNamespace": "Du hast diesen Namespace nicht abonniert und erhältst keine Benachrichtigungen über Änderungen.",
|
"notSubscribedNamespace": "Du hast diesen Namespace nicht abonniert und erhältst keine Benachrichtigungen über Änderungen.",
|
||||||
"subscribedList": "Du hast diese Liste abonniert und erhältst Benachrichtigungen über Änderungen.",
|
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||||
"notSubscribedList": "Du hast diese Liste nicht abonniert und erhältst keine Benachrichtigungen über Änderungen.",
|
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||||
"subscribedTask": "Du hast diese Aufgabe abonniert und erhältst Benachrichtigungen über Änderungen.",
|
"subscribedTask": "Du hast diese Aufgabe abonniert und erhältst Benachrichtigungen über Änderungen.",
|
||||||
"notSubscribedTask": "Du hast diese Aufgabe nicht abonniert und erhältst keine Benachrichtigungen über Änderungen.",
|
"notSubscribedTask": "Du hast diese Aufgabe nicht abonniert und erhältst keine Benachrichtigungen über Änderungen.",
|
||||||
"subscribe": "Abonnieren",
|
"subscribe": "Abonnieren",
|
||||||
"unsubscribe": "Abbestellen",
|
"unsubscribe": "Abbestellen",
|
||||||
"subscribeSuccessNamespace": "Du hast diesen Namespace jetzt abonniert",
|
"subscribeSuccessNamespace": "Du hast diesen Namespace jetzt abonniert",
|
||||||
"unsubscribeSuccessNamespace": "Du hast diesen Namespace jetzt nicht mehr abonniert",
|
"unsubscribeSuccessNamespace": "Du hast diesen Namespace jetzt nicht mehr abonniert",
|
||||||
"subscribeSuccessList": "Du hast diese Liste jetzt abonniert",
|
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||||
"unsubscribeSuccessList": "Du hast diese Liste jetzt nicht mehr abonniert",
|
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||||
"subscribeSuccessTask": "Du hast diese Aufgabe jetzt abonniert",
|
"subscribeSuccessTask": "Du hast diese Aufgabe jetzt abonniert",
|
||||||
"unsubscribeSuccessTask": "Du hast diese Aufgabe jetzt nicht mehr abonniert"
|
"unsubscribeSuccessTask": "Du hast diese Aufgabe jetzt nicht mehr abonniert"
|
||||||
},
|
},
|
||||||
|
@ -761,7 +762,7 @@
|
||||||
"new": "Neue Aufgabenbeziehung",
|
"new": "Neue Aufgabenbeziehung",
|
||||||
"searchPlaceholder": "Beginne zu schreiben, um eine Aufgabe zu suchen, die als Beziehung hinzugefügt werden soll…",
|
"searchPlaceholder": "Beginne zu schreiben, um eine Aufgabe zu suchen, die als Beziehung hinzugefügt werden soll…",
|
||||||
"createPlaceholder": "Füge diese Aufgabe als neue Aufgabenbeziehung hinzu",
|
"createPlaceholder": "Füge diese Aufgabe als neue Aufgabenbeziehung hinzu",
|
||||||
"differentList": "Diese Aufgabe gehört zu einer anderen Liste.",
|
"differentProject": "This task belongs to a different project.",
|
||||||
"differentNamespace": "Diese Aufgabe gehört zu einem anderen Namespace.",
|
"differentNamespace": "Diese Aufgabe gehört zu einem anderen Namespace.",
|
||||||
"noneYet": "Keine Aufgabenbeziehung vorhanden.",
|
"noneYet": "Keine Aufgabenbeziehung vorhanden.",
|
||||||
"delete": "Aufgabenbeziehung entfernen",
|
"delete": "Aufgabenbeziehung entfernen",
|
||||||
|
@ -811,10 +812,10 @@
|
||||||
"priority1": "Um die Priorität einer Aufgabe zu setzen, gibt eine Zahl zwischen 1 und 5 mit einem vorangestellten {prefix} ein.",
|
"priority1": "Um die Priorität einer Aufgabe zu setzen, gibt eine Zahl zwischen 1 und 5 mit einem vorangestellten {prefix} ein.",
|
||||||
"priority2": "Je höher die Zahl, desto höher die Priorität.",
|
"priority2": "Je höher die Zahl, desto höher die Priorität.",
|
||||||
"assignees": "Um die Aufgabe direkt jemandem zuzuweisen, füge vor dem Anmeldenamen der Person ein {prefix} Zeichen ein.",
|
"assignees": "Um die Aufgabe direkt jemandem zuzuweisen, füge vor dem Anmeldenamen der Person ein {prefix} Zeichen ein.",
|
||||||
"list1": "Um eine Liste zu erstellen, in der die Aufgabe erscheinen soll, gib ihren Namen vorangestellt mit einem {prefix} ein.",
|
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||||
"list2": "Dies gibt einen Fehler zurück, wenn die Liste nicht existiert.",
|
"project2": "This will return an error if the project does not exist.",
|
||||||
"list3": "Um Leerzeichen zu verwenden, füge einfach ein \" oder ' um den Namen der Liste hinzu.",
|
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||||
"list4": "Zum Beispiel: {prefix}\"Liste mit Leerzeichen\".",
|
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||||
"dateAndTime": "Datum und Uhrzeit",
|
"dateAndTime": "Datum und Uhrzeit",
|
||||||
"date": "Jedes Datum wird als Enddatum der neuen Aufgabe verwendet. Du kannst Daten in jedem dieser Formate verwenden:",
|
"date": "Jedes Datum wird als Enddatum der neuen Aufgabe verwendet. Du kannst Daten in jedem dieser Formate verwenden:",
|
||||||
"dateWeekday": "jeder Wochentag, wird das nächste Datum mit diesem Tag verwenden",
|
"dateWeekday": "jeder Wochentag, wird das nächste Datum mit diesem Tag verwenden",
|
||||||
|
@ -847,19 +848,19 @@
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Team löschen",
|
"header": "Team löschen",
|
||||||
"text1": "Bist du sicher, dass du dieses Team und alle seine Mitglieder löschen willst?",
|
"text1": "Bist du sicher, dass du dieses Team und alle seine Mitglieder löschen willst?",
|
||||||
"text2": "Alle Teammitglieder verlieren den Zugriff auf Listen und Namespaces, die mit diesem Team geteilt sind. Dies KANN NICHT Rückgängig gemacht werden!",
|
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||||
"success": "Das Team wurde erfolgreich gelöscht."
|
"success": "Das Team wurde erfolgreich gelöscht."
|
||||||
},
|
},
|
||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"header": "Benutzer:innen aus dem Team entfernen",
|
"header": "Benutzer:innen aus dem Team entfernen",
|
||||||
"text1": "Bist du sicher, dass du diese:n Benutzer:in aus dem Team entfernen willst?",
|
"text1": "Bist du sicher, dass du diese:n Benutzer:in aus dem Team entfernen willst?",
|
||||||
"text2": "Diese:r Benutzer:in verliert den Zugriff auf alle Listen und Namespaces auf die dieses Team Zugriff hat. Dies kann nicht rückgängig gemacht werden!",
|
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||||
"success": "Der:die Benutzer:in wurde erfolgreich aus dem Team gelöscht."
|
"success": "Der:die Benutzer:in wurde erfolgreich aus dem Team gelöscht."
|
||||||
},
|
},
|
||||||
"leave": {
|
"leave": {
|
||||||
"title": "Team verlassen",
|
"title": "Team verlassen",
|
||||||
"text1": "Bist du sicher, dass du dieses Team verlassen willst?",
|
"text1": "Bist du sicher, dass du dieses Team verlassen willst?",
|
||||||
"text2": "Du wirst Zugriff auf alle Listen und Namespaces verlieren, auf die dieses Team Zugriff hat. Wenn du deine Meinung änderst, musst du durch einen Team-Admin wieder hinzugefügt werden.",
|
"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.",
|
||||||
"success": "Du hast das Team erfolgreich verlassen."
|
"success": "Du hast das Team erfolgreich verlassen."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -891,22 +892,22 @@
|
||||||
"attachment": "Einen Anhang dieser Aufgabe hinzufügen",
|
"attachment": "Einen Anhang dieser Aufgabe hinzufügen",
|
||||||
"related": "Ändere die Abhängigen Aufgaben dieser Aufgabe",
|
"related": "Ändere die Abhängigen Aufgaben dieser Aufgabe",
|
||||||
"color": "Die Farbe dieser Aufgabe ändern",
|
"color": "Die Farbe dieser Aufgabe ändern",
|
||||||
"move": "Diese Aufgabe in eine andere Liste verschieben",
|
"move": "Move this task to another project",
|
||||||
"reminder": "Erinnerungen für diese Aufgabe verwalten",
|
"reminder": "Erinnerungen für diese Aufgabe verwalten",
|
||||||
"description": "Aufgabenbeschreibung bearbeiten"
|
"description": "Aufgabenbeschreibung bearbeiten"
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"title": "Listenansicht",
|
"title": "Project Views",
|
||||||
"switchToListView": "Zur Listenansicht wechseln",
|
"switchToListView": "Switch to list view",
|
||||||
"switchToGanttView": "Zur Ganttansicht wechseln",
|
"switchToGanttView": "Switch to gantt view",
|
||||||
"switchToKanbanView": "Zur Kanbanansicht wechseln",
|
"switchToKanbanView": "Switch to kanban view",
|
||||||
"switchToTableView": "Zur Tabellenansicht wechseln"
|
"switchToTableView": "Switch to table view"
|
||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"title": "Navigation",
|
"title": "Navigation",
|
||||||
"overview": "Die Startseite aufrufen",
|
"overview": "Die Startseite aufrufen",
|
||||||
"upcoming": "Anstehende Aufgaben aufrufen",
|
"upcoming": "Anstehende Aufgaben aufrufen",
|
||||||
"namespaces": "Namespaces & Listen aufrufen",
|
"namespaces": "Navigate to namespaces & projects",
|
||||||
"labels": "Labels aufrufen",
|
"labels": "Labels aufrufen",
|
||||||
"teams": "Teams aufrufen"
|
"teams": "Teams aufrufen"
|
||||||
}
|
}
|
||||||
|
@ -923,7 +924,7 @@
|
||||||
"unarchive": "Archivierung aufheben",
|
"unarchive": "Archivierung aufheben",
|
||||||
"setBackground": "Hintergrund einstellen",
|
"setBackground": "Hintergrund einstellen",
|
||||||
"share": "Teilen",
|
"share": "Teilen",
|
||||||
"newList": "Neue Liste"
|
"newProject": "New project"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"url": "Vikunja-URL",
|
"url": "Vikunja-URL",
|
||||||
|
@ -942,24 +943,24 @@
|
||||||
"notification": {
|
"notification": {
|
||||||
"title": "Benachrichtigungen",
|
"title": "Benachrichtigungen",
|
||||||
"none": "Du hast keine Benachrichtigungen. Einen schönen Tag noch!",
|
"none": "Du hast keine Benachrichtigungen. Einen schönen Tag noch!",
|
||||||
"explainer": "Benachrichtigungen werden hier angezeigt, wenn Aktionen für Namespaces, Listen oder Aufgaben, die du abonniert hast, ausgeführt werden."
|
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||||
},
|
},
|
||||||
"quickActions": {
|
"quickActions": {
|
||||||
"commands": "Befehle",
|
"commands": "Befehle",
|
||||||
"placeholder": "Gib einen Befehl oder eine Suche ein …",
|
"placeholder": "Gib einen Befehl oder eine Suche ein …",
|
||||||
"hint": "Du kannst {list} verwenden, um die Suche auf eine Liste zu beschränken. Kombiniere {list} oder {label} (Labels) mit einer Suchabfrage, um eine Aufgabe mit diesen Labels oder auf dieser Liste zu suchen. Verwende {assignee}, um nur nach Teams zu suchen.",
|
"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.",
|
||||||
"tasks": "Aufgaben",
|
"tasks": "Aufgaben",
|
||||||
"lists": "Listen",
|
"projects": "Projects",
|
||||||
"teams": "Teams",
|
"teams": "Teams",
|
||||||
"newList": "Gib den Titel der neuen Liste ein …",
|
"newProject": "Enter the title of the new project…",
|
||||||
"newTask": "Gib den Titel der neuen Aufgabe ein …",
|
"newTask": "Gib den Titel der neuen Aufgabe ein …",
|
||||||
"newNamespace": "Gib den Titel des neuen Namespaces ein…",
|
"newNamespace": "Gib den Titel des neuen Namespaces ein…",
|
||||||
"newTeam": "Gib den Namen des neuen Teams ein …",
|
"newTeam": "Gib den Namen des neuen Teams ein …",
|
||||||
"createTask": "Eine Aufgabe in der aktuellen Liste erstellen ({title})",
|
"createTask": "Create a task in the current project ({title})",
|
||||||
"createList": "Eine Liste im aktuellen Namespace erstellen ({title})",
|
"createProject": "Create a project in the current namespace ({title})",
|
||||||
"cmds": {
|
"cmds": {
|
||||||
"newTask": "Neue Aufgabe",
|
"newTask": "Neue Aufgabe",
|
||||||
"newList": "Neue Liste",
|
"newProject": "New project",
|
||||||
"newNamespace": "Neuer Namespace",
|
"newNamespace": "Neuer Namespace",
|
||||||
"newTeam": "Neues Team"
|
"newTeam": "Neues Team"
|
||||||
}
|
}
|
||||||
|
@ -991,15 +992,15 @@
|
||||||
"1018": "Die Avatareinstellungen sind falsch.",
|
"1018": "Die Avatareinstellungen sind falsch.",
|
||||||
"2001": "Die ID kann nicht leer oder 0 sein.",
|
"2001": "Die ID kann nicht leer oder 0 sein.",
|
||||||
"2002": "Ein Teil der Anfragedaten ist ungültig.",
|
"2002": "Ein Teil der Anfragedaten ist ungültig.",
|
||||||
"3001": "Die Liste existiert nicht.",
|
"3001": "The project does not exist.",
|
||||||
"3004": "Du musst Leseberechtigungen für diese Liste haben, um diese Aktion ausführen zu können.",
|
"3004": "You need to have read permissions on that project to perform that action.",
|
||||||
"3005": "Der Listentitel darf nicht leer sein.",
|
"3005": "The project title cannot be empty.",
|
||||||
"3006": "Diese Linkfreigabe existiert nicht.",
|
"3006": "The project share does not exist.",
|
||||||
"3007": "Eine Liste mit diesem Bezeichner existiert bereits.",
|
"3007": "A project with this identifier already exists.",
|
||||||
"3008": "Diese Liste ist archiviert und kann deshalb nur gelesen werden. Dies gilt auch für alle Aufgaben, die mit dieser Liste verbunden sind.",
|
"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": "Der Aufgabentitel kann nicht leer sein.",
|
"4001": "The project task text cannot be empty.",
|
||||||
"4002": "Diese Aufgabe existiert nicht.",
|
"4002": "The project task does not exist.",
|
||||||
"4003": "Alle Massenbearbeitungen an Aufgaben müssen zu derselben Liste gehören.",
|
"4003": "All bulk editing tasks must belong to the same project.",
|
||||||
"4004": "Es benötigt mindestens einen Task, um eine Massenänderung durchzuführen.",
|
"4004": "Es benötigt mindestens einen Task, um eine Massenänderung durchzuführen.",
|
||||||
"4005": "Du hast keine Berechtigungen, um diese Aufgabe anzuzeigen.",
|
"4005": "Du hast keine Berechtigungen, um diese Aufgabe anzuzeigen.",
|
||||||
"4006": "Du kannst die übergeordnete Aufgabe nicht auf sich selbst referenzieren.",
|
"4006": "Du kannst die übergeordnete Aufgabe nicht auf sich selbst referenzieren.",
|
||||||
|
@ -1025,21 +1026,21 @@
|
||||||
"5012": "Dieser Namespace ist archiviert und kann deshalb nur gelesen werden.",
|
"5012": "Dieser Namespace ist archiviert und kann deshalb nur gelesen werden.",
|
||||||
"6001": "Der Teamname kann nicht leer sein.",
|
"6001": "Der Teamname kann nicht leer sein.",
|
||||||
"6002": "Das Team existiert nicht.",
|
"6002": "Das Team existiert nicht.",
|
||||||
"6004": "Das Team hat bereits Zugriff auf diesen Namespace oder diese Liste.",
|
"6004": "The team already has access to that namespace or project.",
|
||||||
"6005": "Diese:r Benutzer:in ist bereits dem Team beigetreten.",
|
"6005": "Diese:r Benutzer:in ist bereits dem Team beigetreten.",
|
||||||
"6006": "Du kannst den:die letzten Benutzer:in dieses Teams nicht löschen.",
|
"6006": "Du kannst den:die letzten Benutzer:in dieses Teams nicht löschen.",
|
||||||
"6007": "Das Team hat keine Berechtigungen auf dieser Liste, um das durchzuführen.",
|
"6007": "The team does not have access to the project to perform that action.",
|
||||||
"7002": "Der:die Benutzer:in hat bereits Zugriff auf diese Liste.",
|
"7002": "The user already has access to that project.",
|
||||||
"7003": "Du hast keinen Zugriff auf diese Liste.",
|
"7003": "You do not have access to that project.",
|
||||||
"8001": "Dieses Label existiert bereits auf dieser Aufgabe.",
|
"8001": "Dieses Label existiert bereits auf dieser Aufgabe.",
|
||||||
"8002": "Das Label existiert nicht.",
|
"8002": "Das Label existiert nicht.",
|
||||||
"8003": "Du hast keinen Zugriff auf dieses Label.",
|
"8003": "Du hast keinen Zugriff auf dieses Label.",
|
||||||
"9001": "Das Recht ist ungültig.",
|
"9001": "Das Recht ist ungültig.",
|
||||||
"10001": "Diese Spalte existiert nicht.",
|
"10001": "Diese Spalte existiert nicht.",
|
||||||
"10002": "Diese Spalte gehört nicht zu dieser Liste.",
|
"10002": "The bucket does not belong to that project.",
|
||||||
"10003": "Du kannst die letze Spalte in einer Liste nicht entfernen.",
|
"10003": "You cannot remove the last bucket on a project.",
|
||||||
"10004": "Du kannst die Aufgabe nicht in diese Spalte legen, da sie schon die maximale Anzahl an Aufgaben enthält.",
|
"10004": "Du kannst die Aufgabe nicht in diese Spalte legen, da sie schon die maximale Anzahl an Aufgaben enthält.",
|
||||||
"10005": "Es kann nur eine Erledigt-Spalte pro Liste geben.",
|
"10005": "There can be only one done bucket per project.",
|
||||||
"11001": "Der gespeicherte Filter existiert nicht.",
|
"11001": "Der gespeicherte Filter existiert nicht.",
|
||||||
"11002": "Gespeicherte Ansichten sind für Linkfreigaben nicht verfügbar.",
|
"11002": "Gespeicherte Ansichten sind für Linkfreigaben nicht verfügbar.",
|
||||||
"12001": "Der Abonnement-Typ ist ungültig.",
|
"12001": "Der Abonnement-Typ ist ungültig.",
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
"welcomeDay": "Hallo {username}!",
|
"welcomeDay": "Hallo {username}!",
|
||||||
"welcomeEvening": "Guten Abend, {username}!",
|
"welcomeEvening": "Guten Abend, {username}!",
|
||||||
"lastViewed": "Zletscht ahglueget",
|
"lastViewed": "Zletscht ahglueget",
|
||||||
"list": {
|
"project": {
|
||||||
"newText": "Du chasch e Liste für dini neue Uufgabe erstelle:",
|
"newText": "Du kannst ein neues Projekt für deine neuen Aufgaben erstellen:",
|
||||||
"new": "Neue Liste",
|
"new": "New project",
|
||||||
"importText": "Oder importier dini Liste und Uufgabe us anderne Dienst nach Vikunja:",
|
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||||
"import": "Dini Date in Vikunja importiere"
|
"import": "Import your data into Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"404": {
|
"404": {
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
"weekStartSunday": "Sunntig",
|
"weekStartSunday": "Sunntig",
|
||||||
"weekStartMonday": "Määntig",
|
"weekStartMonday": "Määntig",
|
||||||
"language": "Sproch",
|
"language": "Sproch",
|
||||||
"defaultList": "Standard Liste",
|
"defaultProject": "Default Project",
|
||||||
"timezone": "Zeitzone",
|
"timezone": "Zeitzone",
|
||||||
"overdueTasksRemindersTime": "Zeit der E-Mail-Zusammenfassung der überfälligen Aufgaben"
|
"overdueTasksRemindersTime": "Zeit der E-Mail-Zusammenfassung der überfälligen Aufgaben"
|
||||||
},
|
},
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
},
|
},
|
||||||
"deletion": {
|
"deletion": {
|
||||||
"title": "Lösche deinen Vikunja-Account",
|
"title": "Lösche deinen Vikunja-Account",
|
||||||
"text1": "Das Löschen deines Accounts ist dauerhaft und unwiderruflich. Alle Namensräume, Listen und zugehörige Daten werden gelöscht.",
|
"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.",
|
||||||
"text2": "Zum Fortfahren gib bitte dein Passwort ein. Du erhältst eine E-Mail mit weiteren Anweisungen.",
|
"text2": "Zum Fortfahren gib bitte dein Passwort ein. Du erhältst eine E-Mail mit weiteren Anweisungen.",
|
||||||
"confirm": "Meinen Account löschen",
|
"confirm": "Meinen Account löschen",
|
||||||
"requestSuccess": "Die Anfrage war erfolgreich. Du erhältst eine E-Mail mit weiteren Anweisungen.",
|
"requestSuccess": "Die Anfrage war erfolgreich. Du erhältst eine E-Mail mit weiteren Anweisungen.",
|
||||||
|
@ -157,201 +157,201 @@
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"title": "Exportiere deine Vikunja-Daten",
|
"title": "Exportiere deine Vikunja-Daten",
|
||||||
"description": "Du kannst eine Kopie deiner Daten bei Vikunja anfordern. Dazu gehören Namespaces, Listen, Aufgaben und alles, was damit zusammenhängt. Du kannst diese Daten dann in jeder Vikunja-Instanz über die Migrationsfunktion importieren.",
|
"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.",
|
||||||
"descriptionPasswordRequired": "Bitte gib dein Passwort ein, um fortzufahren:",
|
"descriptionPasswordRequired": "Bitte gib dein Passwort ein, um fortzufahren:",
|
||||||
"request": "Eine Kopie meiner Vikunja Daten anfordern",
|
"request": "Eine Kopie meiner Vikunja Daten anfordern",
|
||||||
"success": "Du hast deine Daten bei Vikunja erfolgreich angefordert! Wir schicken dir eine E-Mail, sobald sie zum Download bereitstehen.",
|
"success": "Du hast deine Daten bei Vikunja erfolgreich angefordert! Wir schicken dir eine E-Mail, sobald sie zum Download bereitstehen.",
|
||||||
"downloadTitle": "Lade deine exportierten Vikunja-Daten herunter"
|
"downloadTitle": "Lade deine exportierten Vikunja-Daten herunter"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"archived": "Diese Liste ist archiviert. Es ist nicht möglich, neue Aufgaben zu erstellen oder sie zu bearbeiten.",
|
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||||
"title": "Liste Titl",
|
"title": "Project Title",
|
||||||
"color": "Farb",
|
"color": "Color",
|
||||||
"lists": "Listene",
|
"projects": "Projects",
|
||||||
"list": {
|
"search": "Type to search for a project…",
|
||||||
"title": "Liste",
|
"searchSelect": "Click or press enter to select this project",
|
||||||
"add": "Hinzuefüege",
|
"shared": "Shared Projects",
|
||||||
"addPlaceholder": "E neui Uufgab erstelle…",
|
"noDescriptionAvailable": "No project description is available.",
|
||||||
"empty": "D'Liste isch momentan leer.",
|
|
||||||
"newTaskCta": "Neui Uufgab erstelle.",
|
|
||||||
"editTask": "Uufgab bearbeite"
|
|
||||||
},
|
|
||||||
"search": "Schriib, um nachere Liste z'sueche…",
|
|
||||||
"searchSelect": "Druck uf Enter um die Liste uuszwähle",
|
|
||||||
"shared": "Teilti Liste",
|
|
||||||
"noDescriptionAvailable": "Keine Listenbeschreibung verfügbar.",
|
|
||||||
"create": {
|
"create": {
|
||||||
"header": "Neue Liste",
|
"header": "New project",
|
||||||
"titlePlaceholder": "Listetitl da ahgeh…",
|
"titlePlaceholder": "The project's title goes here…",
|
||||||
"addTitleRequired": "Bitte gib en Titl ah.",
|
"addTitleRequired": "Please specify a title.",
|
||||||
"createdSuccess": "Liste erfolgriich erstellt.",
|
"createdSuccess": "The project was successfully created.",
|
||||||
"addListRequired": "Bitte gib e Liste ah oder definier e standard Liste i de Iihstellige."
|
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"title": "\"{list}\" archiviere",
|
"title": "Archive \"{project}\"",
|
||||||
"archive": "Die Liste archiviere",
|
"archive": "Archive this project",
|
||||||
"unarchive": "Die Liste nüm archiviere",
|
"unarchive": "Un-Archive this project",
|
||||||
"unarchiveText": "Du chasch neui Uufgabe erstelle oder bearbeite.",
|
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||||
"archiveText": "Du chasch kei neui Uufgabe erstelle oder bearbeite bis du das nüm archiviert häsch.",
|
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||||
"success": "Die Liste isch erfolgriich archiviert worde."
|
"success": "The project was successfully archived."
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
"title": "Listehintergrund setze",
|
"title": "Set project background",
|
||||||
"remove": "Listehintergrund entferne",
|
"remove": "Remove Background",
|
||||||
"upload": "Wähl en Hintergrund vo diim Pc uus",
|
"upload": "Choose a background from your pc",
|
||||||
"searchPlaceholder": "Suech nach emne Hintergrund…",
|
"searchPlaceholder": "Search for a background…",
|
||||||
"poweredByUnsplash": "Unterstützt vo Unsplash",
|
"poweredByUnsplash": "Powered by Unsplash",
|
||||||
"loadMore": "Meh Fotis ladä",
|
"loadMore": "Load more photos",
|
||||||
"success": "De Hintergrund isch erfolgriich gsetzt worde!",
|
"success": "The background has been set successfully!",
|
||||||
"removeSuccess": "De Hintergrund isch erfolgriich entfernt worde!"
|
"removeSuccess": "The background has been removed successfully!"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "\"{list}\" chüble",
|
"title": "Delete \"{project}\"",
|
||||||
"header": "Die Liste chüble",
|
"header": "Delete this project",
|
||||||
"text1": "Bisch du dir sicher, dass du die Liste und all ihren Inhalt chüble wetsch?",
|
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||||
"text2": "Das beinhalltet alli Uufgabe und CHAN NID RÜCKGÄNGIG GMACHT WERDE!",
|
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Die Liste isch erfolgriich g'chüblet wore.",
|
"success": "The project was successfully deleted.",
|
||||||
"tasksToDelete": "Dies löscht unwiderruflich ca. {count} Aufgaben.",
|
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||||
"noTasksToDelete": "Diese Liste enthält keine Aufgaben, sie kann sicher gelöscht werden."
|
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||||
},
|
},
|
||||||
"duplicate": {
|
"duplicate": {
|
||||||
"title": "Die Liste dubliziere",
|
"title": "Duplicate this project",
|
||||||
"label": "Dubliziere",
|
"label": "Duplicate",
|
||||||
"text": "Wähl en Namensruum uus, wo die dubliziert Liste hii set gah:",
|
"text": "Select a namespace which should hold the duplicated project:",
|
||||||
"success": "D'Liste isch erfolgriich dubliziert wore."
|
"success": "The project was successfully duplicated."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"header": "Die Liste bearbeite",
|
"header": "Edit This Project",
|
||||||
"title": "\"{list}\" bearbeite",
|
"title": "Edit \"{project}\"",
|
||||||
"titlePlaceholder": "Listetitl da ahgeh…",
|
"titlePlaceholder": "The project title goes here…",
|
||||||
"identifierTooltip": "De Liste Identifikator chan benutzt werde, um Uufgabe differenzierbar über mehreri Liste z'erkenne. Du chasch das Feld leer lah, um die Funktion z'deaktiviere.",
|
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||||
"identifier": "Liste Identifikator",
|
"identifier": "Project Identifier",
|
||||||
"identifierPlaceholder": "Listeidentifikator da ahgeh…",
|
"identifierPlaceholder": "The project identifier goes here…",
|
||||||
"description": "Beschriibig",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "D'Listebeschriibig chunt da hane…",
|
"descriptionPlaceholder": "The projects description goes here…",
|
||||||
"color": "Farb",
|
"color": "Color",
|
||||||
"success": "D'Liste isch erfolgriich aktualisiert wore."
|
"success": "The project was successfully updated."
|
||||||
},
|
},
|
||||||
"share": {
|
"share": {
|
||||||
"header": "Die Liste teile",
|
"header": "Share this project",
|
||||||
"title": "\"{list}\" teile",
|
"title": "Share \"{project}\"",
|
||||||
"share": "Teilä",
|
"share": "Share",
|
||||||
"links": {
|
"links": {
|
||||||
"title": "Link teile",
|
"title": "Share Links",
|
||||||
"what": "Was isch en teilte Link?",
|
"what": "What is a share link?",
|
||||||
"explanation": "En Teilte Link git dir d'möglichkeit, e Liste mit anderne Benutzer wo kein Vikunja account hend, z'teile.",
|
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||||
"create": "En neue teilte Link erstelle",
|
"create": "Create a new link share",
|
||||||
"name": "Namä (optional)",
|
"name": "Name (optional)",
|
||||||
"namePlaceholder": "z.B. Reto Häberli",
|
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||||
"nameExplanation": "Alli aktione, wo mit dem teilte Link gmacht werdet, werded mit dem Name hinterleit.",
|
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||||
"password": "Passwort (optional)",
|
"password": "Password (optional)",
|
||||||
"passwordExplanation": "De Benutzer wird um es Passwort bättet, wenn er dadruf zuegriift.",
|
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||||
"noName": "Kein Name g'setzt",
|
"noName": "No name set",
|
||||||
"remove": "Linkfreigab lösche",
|
"remove": "Remove a link share",
|
||||||
"removeText": "Bisch du sicher, dass du die Freigab lösche wetsch? Es wird nüme möglich sii, die Liste mit dem Link z'erreiche. Das chann nid rückgängig gmacht werde!",
|
"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": "De Freigabelink isch erfolgriich erstellt wore.",
|
"createSuccess": "The link share was successfully created.",
|
||||||
"deleteSuccess": "De g'teilti Link isch erfolgriich g'chüblet wore",
|
"deleteSuccess": "The link share was successfully deleted",
|
||||||
"view": "Ansicht",
|
"view": "View",
|
||||||
"sharedBy": "Von {0} geteilt"
|
"sharedBy": "Shared by {0}"
|
||||||
},
|
},
|
||||||
"userTeam": {
|
"userTeam": {
|
||||||
"typeUser": "Benutzer | Benutzer",
|
"typeUser": "user | users",
|
||||||
"typeTeam": "Team | Teams",
|
"typeTeam": "team | teams",
|
||||||
"shared": "Mit dene {type} teilt",
|
"shared": "Shared with these {type}",
|
||||||
"you": "Du",
|
"you": "You",
|
||||||
"notShared": "Nid mit {type} teilt.",
|
"notShared": "Not shared with any {type} yet.",
|
||||||
"removeHeader": "{type} vo dere {sharable} entferne",
|
"removeHeader": "Remove a {type} from the {sharable}",
|
||||||
"removeText": "Bisch du sicher du wersch de {sharable} vo dem {type} entferne? Das cha nid rückgängig gmacht werde!",
|
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||||
"removeSuccess": "De {sharable} isch erfolgriich vom {type} entfernt wore.",
|
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||||
"addedSuccess": "De {type} isch erfolgriich hinzuegfüegt wore.",
|
"addedSuccess": "The {type} was successfully added.",
|
||||||
"updatedSuccess": "De {type} isch erfolgriich hinzuegfüegt wore."
|
"updatedSuccess": "The {type} was successfully added."
|
||||||
},
|
},
|
||||||
"right": {
|
"right": {
|
||||||
"title": "Berechtigung",
|
"title": "Permission",
|
||||||
"read": "Nur Lese",
|
"read": "Read only",
|
||||||
"readWrite": "Lese und Schriibe",
|
"readWrite": "Read & write",
|
||||||
"admin": "Chef"
|
"admin": "Admin"
|
||||||
},
|
},
|
||||||
"attributes": {
|
"attributes": {
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"delete": "Chüble"
|
"delete": "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"
|
||||||
|
},
|
||||||
"gantt": {
|
"gantt": {
|
||||||
"title": "Gantt",
|
"title": "Gantt",
|
||||||
"showTasksWithoutDates": "Zeig Uufgabe, wo kei Date hend",
|
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||||
"size": "Grössi",
|
"size": "Size",
|
||||||
"default": "Standard",
|
"default": "Default",
|
||||||
"month": "Monet",
|
"month": "Month",
|
||||||
"day": "Taag",
|
"day": "Day",
|
||||||
"hour": "Stunde",
|
"hour": "Hour",
|
||||||
"range": "Zeitraum",
|
"range": "Date Range",
|
||||||
"noDates": "Die Uufgab het no kei Datum gsetzt."
|
"noDates": "This task has no dates set."
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"title": "Tabällä",
|
"title": "Table",
|
||||||
"columns": "Spaltä"
|
"columns": "Columns"
|
||||||
},
|
},
|
||||||
"kanban": {
|
"kanban": {
|
||||||
"title": "Kanban",
|
"title": "Kanban",
|
||||||
"limit": "Limitä: {limit}",
|
"limit": "Limit: {limit}",
|
||||||
"noLimit": "Nid gsetzt",
|
"noLimit": "Not Set",
|
||||||
"doneBucket": "Fertig-Chübl",
|
"doneBucket": "Done bucket",
|
||||||
"doneBucketHint": "Alli Uufgabe wo i de Chübl gworfe werded, sind automatisch als Färtig markiert.",
|
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||||
"doneBucketHintExtended": "Alli Uufgabe wo i de Chübl gworfe werded, sind automatisch als Färtig markiert. Alli Uufgabe wo vo irgendwo anders als Färtig markiert worde sind, werded au dahii gschobe.",
|
"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": "De Färtig-Chübl isch erfolgriich gspeicheret worde.",
|
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||||
"deleteLast": "Du chasch de letscht Chübl nid entferne.",
|
"deleteLast": "You cannot remove the last bucket.",
|
||||||
"addTaskPlaceholder": "Neue Uufgabe Titl hinzuefüege…",
|
"addTaskPlaceholder": "Enter the new task title…",
|
||||||
"addTask": "Uufgab hinzuefüegä",
|
"addTask": "Add a task",
|
||||||
"addAnotherTask": "Nomol e Uufgab hinzuefüege",
|
"addAnotherTask": "Add another task",
|
||||||
"addBucket": "Neue Chübl erstelle",
|
"addBucket": "Create a new bucket",
|
||||||
"addBucketPlaceholder": "Gib en neue Chübl-Name iih…",
|
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||||
"deleteHeaderBucket": "De Chübl chüblä",
|
"deleteHeaderBucket": "Delete the bucket",
|
||||||
"deleteBucketText1": "Bisch du dir sicher, dass du de Chübl chüblä wetsch?",
|
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||||
"deleteBucketText2": "Das löscht kei Uufgabe, aber wirft si in Standard-Chübl.",
|
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||||
"deleteBucketSuccess": "De Chübl isch erfolgriich g'chüblet worde.",
|
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||||
"bucketTitleSavedSuccess": "De Chübl Name isch erfolgriich gspeicheret worde.",
|
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||||
"bucketLimitSavedSuccess": "Das Chübl-Limit isch erfolgriich gspeicheret worde.",
|
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||||
"collapse": "De Chübl zemeklappe"
|
"collapse": "Collapse this bucket"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favoriite"
|
"title": "Favorites"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"namespace": {
|
"namespace": {
|
||||||
"title": "Namensrüüm und Listene",
|
"title": "Namespaces & Projects",
|
||||||
"namespace": "Namensruum",
|
"namespace": "Namensruum",
|
||||||
"showArchived": "Archivierti aahzeige",
|
"showArchived": "Archivierti aahzeige",
|
||||||
"noneAvailable": "Du hesch momentan kein Namensruuim.",
|
"noneAvailable": "Du hesch momentan kein Namensruuim.",
|
||||||
"unarchive": "Ent-archiviere",
|
"unarchive": "Ent-archiviere",
|
||||||
"archived": "Archiviert",
|
"archived": "Archiviert",
|
||||||
"noLists": "De Namensruum het kei Listene drin.",
|
"noProjects": "This namespace does not contain any projects.",
|
||||||
"createList": "E neui Liste i dem Namensruum erstelle.",
|
"createProject": "Create a new project in this namespace.",
|
||||||
"namespaces": "Namensrüüm",
|
"namespaces": "Namensrüüm",
|
||||||
"search": "Schriib, um nachemne Namensruum z'sueche…",
|
"search": "Schriib, um nachemne Namensruum z'sueche…",
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Neuer Namespace",
|
"title": "Neuer Namespace",
|
||||||
"titleRequired": "Bitte gib en Titl ah.",
|
"titleRequired": "Bitte gib en Titl ah.",
|
||||||
"explanation": "Ein Namespace ist eine Sammlung von Listen, die du teilen und zur Organisation verwenden kannst. Jede Liste gehört zu einem Namespace.",
|
"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.",
|
||||||
"tooltip": "Was isch en Namensruum?",
|
"tooltip": "Was isch en Namensruum?",
|
||||||
"success": "Namensruum erstellt."
|
"success": "Namensruum erstellt."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"titleArchive": "\"{namespace}\" archiviere",
|
"titleArchive": "\"{namespace}\" archiviere",
|
||||||
"titleUnarchive": "\"{namespace}\" ent-archiviere",
|
"titleUnarchive": "\"{namespace}\" ent-archiviere",
|
||||||
"archiveText": "Du hesch kei möglichkeit meh de Namensruum z'bearbeite oder neui Listene drin z'erstelle, bis du si wider ent-archiviert hesch. Das archiviert au grad alli Liste im Namensruum.",
|
"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": "Du chasch neui Liste erstelle oder bearbeite.",
|
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||||
"success": "De Namensruum isch erfolgriich archiviert worde.",
|
"success": "De Namensruum isch erfolgriich archiviert worde.",
|
||||||
"unarchiveSuccess": "Der Namespace wurde erfolgreich wiederhergestellt.",
|
"unarchiveSuccess": "Der Namespace wurde erfolgreich wiederhergestellt.",
|
||||||
"description": "Wenn en Namensruum archiviert isch, chasch du kei neui Liste erstelle oder die bearbeite."
|
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "\"{namespace}\" chüble",
|
"title": "\"{namespace}\" chüble",
|
||||||
"text1": "Bisch du dir sicher, dass du de Namensruum und all ihren Inhalt chüble wetsch?",
|
"text1": "Bisch du dir sicher, dass du de Namensruum und all ihren Inhalt chüble wetsch?",
|
||||||
"text2": "Das beinhalltet alli Liste und Uufgabe und CHAN NID RÜCKGÄNGIG GMACHT WERDE!",
|
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Namensruum g'chüblet."
|
"success": "Namensruum g'chüblet."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
|
@ -371,8 +371,8 @@
|
||||||
"isArchived": "De Namensruum isch archiviert"
|
"isArchived": "De Namensruum isch archiviert"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"sharedLists": {
|
"sharedProjects": {
|
||||||
"title": "G'Teilti Liste"
|
"title": "Shared Projects"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favorite"
|
"title": "Favorite"
|
||||||
|
@ -403,7 +403,7 @@
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Neuer gespeicherter Filter",
|
"title": "Neuer gespeicherter Filter",
|
||||||
"description": "En gspeicherete Filter isch e virtuelli Liste, welche vomene Satz a Filter zemmegsetzt wird, sobald me uf sie zuegriift. Wenn sie mal erstellt worde isch, erhaltet si ihren eigene Namensruum.",
|
"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.",
|
||||||
"action": "Neue gspeicherete Filter erstelle",
|
"action": "Neue gspeicherete Filter erstelle",
|
||||||
"titleRequired": "Bitte gib den Titel für den Filter an."
|
"titleRequired": "Bitte gib den Titel für den Filter an."
|
||||||
},
|
},
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
"label": {
|
"label": {
|
||||||
"title": "Labels",
|
"title": "Labels",
|
||||||
"manage": "Label migriere",
|
"manage": "Label migriere",
|
||||||
"description": "Klick uf es Label ums z'editiere. Du chasch alli Labels, wo du erstellt hesch editiere. Du chasch au uf alli Labels zuegriife, wo ufere Liste sind, i dere du Zuegriff hesch.",
|
"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.",
|
||||||
"newCTA": "Du hesch momentan kei Labels.",
|
"newCTA": "Du hesch momentan kei Labels.",
|
||||||
"search": "Schriib, um nachemne Label z'sueche…",
|
"search": "Schriib, um nachemne Label z'sueche…",
|
||||||
"create": {
|
"create": {
|
||||||
|
@ -460,7 +460,7 @@
|
||||||
},
|
},
|
||||||
"sharing": {
|
"sharing": {
|
||||||
"authenticating": "Authentifiziere…",
|
"authenticating": "Authentifiziere…",
|
||||||
"passwordRequired": "Die teilt Liste bruucht es Passwort. Bitte gibs une ah:",
|
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||||
"error": "Het en Fähler geh. :(",
|
"error": "Het en Fähler geh. :(",
|
||||||
"invalidPassword": "Da Passwort isch ungültig."
|
"invalidPassword": "Da Passwort isch ungültig."
|
||||||
},
|
},
|
||||||
|
@ -529,7 +529,7 @@
|
||||||
"code": "Code",
|
"code": "Code",
|
||||||
"quote": "Zitaat",
|
"quote": "Zitaat",
|
||||||
"unorderedList": "Ungordnedi Listä",
|
"unorderedList": "Ungordnedi Listä",
|
||||||
"orderedList": "Gordneti Listä",
|
"orderedList ": "Ordered List",
|
||||||
"cleanBlock": "Formatierig Lösche",
|
"cleanBlock": "Formatierig Lösche",
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"image": "Bild",
|
"image": "Bild",
|
||||||
|
@ -602,6 +602,7 @@
|
||||||
"addReminder": "Neui Errinnerig erstelle…",
|
"addReminder": "Neui Errinnerig erstelle…",
|
||||||
"doneSuccess": "Die Uufgab isch erfolgriich als \"Fertig\" markiert wordä.",
|
"doneSuccess": "Die Uufgab isch erfolgriich als \"Fertig\" markiert wordä.",
|
||||||
"undoneSuccess": "Die Uufgaab isch nüme als fertig markiert.",
|
"undoneSuccess": "Die Uufgaab isch nüme als fertig markiert.",
|
||||||
|
"undo": "Rückgängig",
|
||||||
"openDetail": "Uufgab i de Detailaahsicht öffne",
|
"openDetail": "Uufgab i de Detailaahsicht öffne",
|
||||||
"checklistTotal": "{checked} von {total} Aufgaben",
|
"checklistTotal": "{checked} von {total} Aufgaben",
|
||||||
"checklistAllDone": "{total} Aufgaben",
|
"checklistAllDone": "{total} Aufgaben",
|
||||||
|
@ -618,7 +619,7 @@
|
||||||
"chooseDueDate": "Druck da, um es Fälligkeitsdatum z'setze",
|
"chooseDueDate": "Druck da, um es Fälligkeitsdatum z'setze",
|
||||||
"chooseStartDate": "Druck dah, um es Startdatum z'setze",
|
"chooseStartDate": "Druck dah, um es Startdatum z'setze",
|
||||||
"chooseEndDate": "Druck da, um es Enddatum z'setze",
|
"chooseEndDate": "Druck da, um es Enddatum z'setze",
|
||||||
"move": "Schieb die Uufgab in e anderi Liste",
|
"move": "Move task to a different project",
|
||||||
"done": "Als erledigt markieren!",
|
"done": "Als erledigt markieren!",
|
||||||
"undone": "Als unerledigt markierä",
|
"undone": "Als unerledigt markierä",
|
||||||
"created": "Erstellt am {0} vo {1}",
|
"created": "Erstellt am {0} vo {1}",
|
||||||
|
@ -626,7 +627,7 @@
|
||||||
"doneAt": "{0} erledigt",
|
"doneAt": "{0} erledigt",
|
||||||
"updateSuccess": "Die Uufgab isch erfolgriich g'speichered wore.",
|
"updateSuccess": "Die Uufgab isch erfolgriich g'speichered wore.",
|
||||||
"deleteSuccess": "Die Uufgab isch erfolgriich g'chüblet wore.",
|
"deleteSuccess": "Die Uufgab isch erfolgriich g'chüblet wore.",
|
||||||
"belongsToList": "Die Uufgab ghlrt zu de \"{list}\" Liste",
|
"belongsToProject": "This task belongs to project '{project}'",
|
||||||
"due": "Fällig bis {at}",
|
"due": "Fällig bis {at}",
|
||||||
"closePopup": "Popup schließen",
|
"closePopup": "Popup schließen",
|
||||||
"delete": {
|
"delete": {
|
||||||
|
@ -646,7 +647,7 @@
|
||||||
"percentDone": "Fortschritt einstellen",
|
"percentDone": "Fortschritt einstellen",
|
||||||
"attachments": "Anhänge hinzufügen",
|
"attachments": "Anhänge hinzufügen",
|
||||||
"relatedTasks": "Beziehung hinzufügen",
|
"relatedTasks": "Beziehung hinzufügen",
|
||||||
"moveList": "Verschieben",
|
"moveProject": "Move",
|
||||||
"color": "Farbe setzen",
|
"color": "Farbe setzen",
|
||||||
"delete": "Löschen",
|
"delete": "Löschen",
|
||||||
"favorite": "Zu Favoriten hinzufügen",
|
"favorite": "Zu Favoriten hinzufügen",
|
||||||
|
@ -673,21 +674,21 @@
|
||||||
"updated": "Aktualisiert"
|
"updated": "Aktualisiert"
|
||||||
},
|
},
|
||||||
"subscription": {
|
"subscription": {
|
||||||
"subscribedListThroughParentNamespace": "Du kannst hier nicht de-abonnieren, da du diese Liste über ihren Namespace abonniert hast.",
|
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||||
"subscribedTaskThroughParentNamespace": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihren Namespace abonniert hast.",
|
"subscribedTaskThroughParentNamespace": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihren Namespace abonniert hast.",
|
||||||
"subscribedTaskThroughParentList": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihre Liste abonniert hast.",
|
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||||
"subscribedNamespace": "Du hast diesen Namespace abonniert und erhältst Benachrichtigungen über Änderungen.",
|
"subscribedNamespace": "Du hast diesen Namespace abonniert und erhältst Benachrichtigungen über Änderungen.",
|
||||||
"notSubscribedNamespace": "Du hast diesen Namespace nicht abonniert und erhältst keine Benachrichtigungen über Änderungen.",
|
"notSubscribedNamespace": "Du hast diesen Namespace nicht abonniert und erhältst keine Benachrichtigungen über Änderungen.",
|
||||||
"subscribedList": "Du hast diese Liste abonniert und erhältst Benachrichtigungen über Änderungen.",
|
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||||
"notSubscribedList": "Du hast diese Liste nicht abonniert und erhältst keine Benachrichtigungen über Änderungen.",
|
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||||
"subscribedTask": "Du hast diese Aufgabe abonniert und erhältst Benachrichtigungen über Änderungen.",
|
"subscribedTask": "Du hast diese Aufgabe abonniert und erhältst Benachrichtigungen über Änderungen.",
|
||||||
"notSubscribedTask": "Du hast diese Aufgabe nicht abonniert und erhältst keine Benachrichtigungen über Änderungen.",
|
"notSubscribedTask": "Du hast diese Aufgabe nicht abonniert und erhältst keine Benachrichtigungen über Änderungen.",
|
||||||
"subscribe": "Abooniere",
|
"subscribe": "Abooniere",
|
||||||
"unsubscribe": "Deabonniere",
|
"unsubscribe": "Deabonniere",
|
||||||
"subscribeSuccessNamespace": "Du hast diesen Namespace jetzt abonniert",
|
"subscribeSuccessNamespace": "Du hast diesen Namespace jetzt abonniert",
|
||||||
"unsubscribeSuccessNamespace": "Du hast diesen Namespace jetzt nicht mehr abonniert",
|
"unsubscribeSuccessNamespace": "Du hast diesen Namespace jetzt nicht mehr abonniert",
|
||||||
"subscribeSuccessList": "Du hast diese Liste jetzt abonniert",
|
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||||
"unsubscribeSuccessList": "Du hast diese Liste jetzt nicht mehr abonniert",
|
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||||
"subscribeSuccessTask": "Du hast diese Aufgabe jetzt abonniert",
|
"subscribeSuccessTask": "Du hast diese Aufgabe jetzt abonniert",
|
||||||
"unsubscribeSuccessTask": "Du hast diese Aufgabe jetzt nicht mehr abonniert"
|
"unsubscribeSuccessTask": "Du hast diese Aufgabe jetzt nicht mehr abonniert"
|
||||||
},
|
},
|
||||||
|
@ -761,7 +762,7 @@
|
||||||
"new": "Neui Uufgabe Beziehig",
|
"new": "Neui Uufgabe Beziehig",
|
||||||
"searchPlaceholder": "Schriib, um e neui Uufgab als Zueghörigkeit hinzuezfüege…",
|
"searchPlaceholder": "Schriib, um e neui Uufgab als Zueghörigkeit hinzuezfüege…",
|
||||||
"createPlaceholder": "Das als en neui Zueghörigkeit hinzuefüege",
|
"createPlaceholder": "Das als en neui Zueghörigkeit hinzuefüege",
|
||||||
"differentList": "Die Uufgab ghöört zu ere andere Liste.",
|
"differentProject": "This task belongs to a different project.",
|
||||||
"differentNamespace": "Diese Aufgabe gehört zu einem anderen Namespace.",
|
"differentNamespace": "Diese Aufgabe gehört zu einem anderen Namespace.",
|
||||||
"noneYet": "S'git kei Uufgabe Beziehige.",
|
"noneYet": "S'git kei Uufgabe Beziehige.",
|
||||||
"delete": "Uufgabe Beziehig chüble",
|
"delete": "Uufgabe Beziehig chüble",
|
||||||
|
@ -811,10 +812,10 @@
|
||||||
"priority1": "Um e Task Priorität z'setze: füeg e nummere zwüsched 1 und 5, mit em {prefix} als Prefix iih.",
|
"priority1": "Um e Task Priorität z'setze: füeg e nummere zwüsched 1 und 5, mit em {prefix} als Prefix iih.",
|
||||||
"priority2": "Je höher d'nummere, desto höher d'Priorität.",
|
"priority2": "Je höher d'nummere, desto höher d'Priorität.",
|
||||||
"assignees": "Um die Aufgabe direkt jemandem zuzuweisen, füge vor dem Anmeldenamen der Person ein {prefix} Zeichen ein.",
|
"assignees": "Um die Aufgabe direkt jemandem zuzuweisen, füge vor dem Anmeldenamen der Person ein {prefix} Zeichen ein.",
|
||||||
"list1": "Um e Liste ahzgeh, wo de Task drin erschiine set, gib de name vo de liste mit emne {prefix} ah.",
|
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||||
"list2": "Das wird en Fehler werfe, wenn d'Liste nid existiert.",
|
"project2": "This will return an error if the project does not exist.",
|
||||||
"list3": "Um Leerzeichen zu verwenden, füge einfach ein \" oder ' um den Namen der Liste hinzu.",
|
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||||
"list4": "Zum Beispiel: {prefix}\"Liste mit Leerzeichen\".",
|
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||||
"dateAndTime": "Datum und Ziit",
|
"dateAndTime": "Datum und Ziit",
|
||||||
"date": "Jedes Datum wird als Abgabedatum für di neu Uufgab gnoh. Du chasch Date i de folgende Format verwende:",
|
"date": "Jedes Datum wird als Abgabedatum für di neu Uufgab gnoh. Du chasch Date i de folgende Format verwende:",
|
||||||
"dateWeekday": "jede Wuchetaag wird nimmt s'negste Datum mit dem Datum",
|
"dateWeekday": "jede Wuchetaag wird nimmt s'negste Datum mit dem Datum",
|
||||||
|
@ -847,19 +848,19 @@
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Das Team chüble",
|
"header": "Das Team chüble",
|
||||||
"text1": "Bischder sicher, dasst wetsch da Team mit allne Mitglieder lösche?",
|
"text1": "Bischder sicher, dasst wetsch da Team mit allne Mitglieder lösche?",
|
||||||
"text2": "Alle Teammitglieder verlieren den Zugriff auf Listen und Namespaces, die mit diesem Team geteilt sind. Dies KANN NICHT Rückgängig gemacht werden!",
|
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||||
"success": "Da Team isch erfolgriich g'chüblet wore."
|
"success": "Da Team isch erfolgriich g'chüblet wore."
|
||||||
},
|
},
|
||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"header": "Benutzer usem Team entferne",
|
"header": "Benutzer usem Team entferne",
|
||||||
"text1": "Bisch du dir sicher, dass du de Benutzer usm Team werfe wetsch?",
|
"text1": "Bisch du dir sicher, dass du de Benutzer usm Team werfe wetsch?",
|
||||||
"text2": "Diese:r Benutzer:in verliert den Zugriff auf alle Listen und Namespaces auf die dieses Team Zugriff hat. Dies kann nicht rückgängig gemacht werden!",
|
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||||
"success": "Benutzer erfolgriich usegworfe."
|
"success": "Benutzer erfolgriich usegworfe."
|
||||||
},
|
},
|
||||||
"leave": {
|
"leave": {
|
||||||
"title": "Team verlassen",
|
"title": "Team verlassen",
|
||||||
"text1": "Bist du sicher, dass du dieses Team verlassen willst?",
|
"text1": "Bist du sicher, dass du dieses Team verlassen willst?",
|
||||||
"text2": "Du wirst Zugriff auf alle Listen und Namespaces verlieren, auf die dieses Team Zugriff hat. Wenn du deine Meinung änderst, musst du durch einen Team-Admin wieder hinzugefügt werden.",
|
"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.",
|
||||||
"success": "Du hast das Team erfolgreich verlassen."
|
"success": "Du hast das Team erfolgreich verlassen."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -891,22 +892,22 @@
|
||||||
"attachment": "En Aahang dere Uufgab hinzuefüege",
|
"attachment": "En Aahang dere Uufgab hinzuefüege",
|
||||||
"related": "Beziehige vo dere Uufgab bearbeite",
|
"related": "Beziehige vo dere Uufgab bearbeite",
|
||||||
"color": "Die Farbe dieser Aufgabe ändern",
|
"color": "Die Farbe dieser Aufgabe ändern",
|
||||||
"move": "Diese Aufgabe in eine andere Liste verschieben",
|
"move": "Move this task to another project",
|
||||||
"reminder": "Erinnerungen für diese Aufgabe verwalten",
|
"reminder": "Erinnerungen für diese Aufgabe verwalten",
|
||||||
"description": "Aufgabenbeschreibung bearbeiten"
|
"description": "Aufgabenbeschreibung bearbeiten"
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"title": "Listenansicht",
|
"title": "Project Views",
|
||||||
"switchToListView": "Zur Listenansicht wechseln",
|
"switchToListView": "Switch to list view",
|
||||||
"switchToGanttView": "Zur Ganttansicht wechseln",
|
"switchToGanttView": "Switch to gantt view",
|
||||||
"switchToKanbanView": "Zur Kanbanansicht wechseln",
|
"switchToKanbanView": "Switch to kanban view",
|
||||||
"switchToTableView": "Zur Tabellenansicht wechseln"
|
"switchToTableView": "Switch to table view"
|
||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"title": "Navigation",
|
"title": "Navigation",
|
||||||
"overview": "Die Startseite aufrufen",
|
"overview": "Die Startseite aufrufen",
|
||||||
"upcoming": "Anstehende Aufgaben aufrufen",
|
"upcoming": "Anstehende Aufgaben aufrufen",
|
||||||
"namespaces": "Namespaces & Listen aufrufen",
|
"namespaces": "Navigate to namespaces & projects",
|
||||||
"labels": "Labels aufrufen",
|
"labels": "Labels aufrufen",
|
||||||
"teams": "Teams aufrufen"
|
"teams": "Teams aufrufen"
|
||||||
}
|
}
|
||||||
|
@ -923,7 +924,7 @@
|
||||||
"unarchive": "Ent-archiviere",
|
"unarchive": "Ent-archiviere",
|
||||||
"setBackground": "Hintergrund iihstelle",
|
"setBackground": "Hintergrund iihstelle",
|
||||||
"share": "Teilä",
|
"share": "Teilä",
|
||||||
"newList": "Neui Listä"
|
"newProject": "New project"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"url": "Vikunja URL",
|
"url": "Vikunja URL",
|
||||||
|
@ -942,24 +943,24 @@
|
||||||
"notification": {
|
"notification": {
|
||||||
"title": "Benachrichtigunge",
|
"title": "Benachrichtigunge",
|
||||||
"none": "Du hesch kei neui Benachrichtunge. Heb e schös Tägli!",
|
"none": "Du hesch kei neui Benachrichtunge. Heb e schös Tägli!",
|
||||||
"explainer": "Benachrichtigunge landed do, wenn eppis bi de Namensrüüm, Liste oder Uufgabe passiert, welche du abonniert hesch."
|
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||||
},
|
},
|
||||||
"quickActions": {
|
"quickActions": {
|
||||||
"commands": "Befehl",
|
"commands": "Befehl",
|
||||||
"placeholder": "Schriib en Befehl oder suech…",
|
"placeholder": "Schriib en Befehl oder suech…",
|
||||||
"hint": "Du kannst {list} verwenden, um die Suche auf eine Liste zu beschränken. Kombiniere {list} oder {label} (Labels) mit einer Suchabfrage, um eine Aufgabe mit diesen Labels oder auf dieser Liste zu suchen. Verwende {assignee}, um nur nach Teams zu suchen.",
|
"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.",
|
||||||
"tasks": "Uufgabe",
|
"tasks": "Uufgabe",
|
||||||
"lists": "Listene",
|
"projects": "Projects",
|
||||||
"teams": "Teams",
|
"teams": "Teams",
|
||||||
"newList": "Gib en Titl für die neu Liste iih…",
|
"newProject": "Enter the title of the new project…",
|
||||||
"newTask": "Gib en Titl für die neu Uufgab iih…",
|
"newTask": "Gib en Titl für die neu Uufgab iih…",
|
||||||
"newNamespace": "Gib en Titl für de neu Namensruum iih…",
|
"newNamespace": "Gib en Titl für de neu Namensruum iih…",
|
||||||
"newTeam": "Gib en Name für da neui Team iih…",
|
"newTeam": "Gib en Name für da neui Team iih…",
|
||||||
"createTask": "Erstell e Uufgab i de momentane Listä ({title})",
|
"createTask": "Create a task in the current project ({title})",
|
||||||
"createList": "Erstell e Liste im momentane Namensruum ({title})",
|
"createProject": "Create a project in the current namespace ({title})",
|
||||||
"cmds": {
|
"cmds": {
|
||||||
"newTask": "Neui Uufgab",
|
"newTask": "Neui Uufgab",
|
||||||
"newList": "Neui Liste",
|
"newProject": "New project",
|
||||||
"newNamespace": "Neue Namensruum",
|
"newNamespace": "Neue Namensruum",
|
||||||
"newTeam": "Neus Team"
|
"newTeam": "Neus Team"
|
||||||
}
|
}
|
||||||
|
@ -991,15 +992,15 @@
|
||||||
"1018": "Die Benutzer Profilbild Iihstellige sind nid gültig.",
|
"1018": "Die Benutzer Profilbild Iihstellige sind nid gültig.",
|
||||||
"2001": "ID chann nid leer oder 0 sii.",
|
"2001": "ID chann nid leer oder 0 sii.",
|
||||||
"2002": "Ebbis vo de Ahfragedate isch ungültig.",
|
"2002": "Ebbis vo de Ahfragedate isch ungültig.",
|
||||||
"3001": "Die Liste giz nid.",
|
"3001": "The project does not exist.",
|
||||||
"3004": "Du hesch kei Läseberächtigung für die Liste um das durezfüehre.",
|
"3004": "You need to have read permissions on that project to perform that action.",
|
||||||
"3005": "De Titl cha nid leer sii.",
|
"3005": "The project title cannot be empty.",
|
||||||
"3006": "Die Freigab giz nid.",
|
"3006": "The project share does not exist.",
|
||||||
"3007": "E Liste mit dere Identifizierig giz scho.",
|
"3007": "A project with this identifier already exists.",
|
||||||
"3008": "Die Liste isch archiviert und chan desshalb nur glese werde. Das gliiche gilt für alli Uufgabe i dere Liste.",
|
"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": "De Liste Uufgabe Titl cha nid leer sii.",
|
"4001": "The project task text cannot be empty.",
|
||||||
"4002": "Die Liste Uufgab giz nid.",
|
"4002": "The project task does not exist.",
|
||||||
"4003": "Alli Massebearbeitige a Uufgabe müend i de selbe Liste passiere.",
|
"4003": "All bulk editing tasks must belong to the same project.",
|
||||||
"4004": "Es bruucht mindestens ei Uufgab, um e Masseänderig durezfüehre.",
|
"4004": "Es bruucht mindestens ei Uufgab, um e Masseänderig durezfüehre.",
|
||||||
"4005": "Du hesch kei Berechtigung, um die Uufgab ahzzeige.",
|
"4005": "Du hesch kei Berechtigung, um die Uufgab ahzzeige.",
|
||||||
"4006": "Du chasch kei übergordneti Uufgab uf sich selbst refferenziere.",
|
"4006": "Du chasch kei übergordneti Uufgab uf sich selbst refferenziere.",
|
||||||
|
@ -1025,21 +1026,21 @@
|
||||||
"5012": "De Namensruum isch momentan schriibgschützt weil er archiviert isch.",
|
"5012": "De Namensruum isch momentan schriibgschützt weil er archiviert isch.",
|
||||||
"6001": "Der Teamname kann nicht leer sein.",
|
"6001": "Der Teamname kann nicht leer sein.",
|
||||||
"6002": "Da Team giz nid.",
|
"6002": "Da Team giz nid.",
|
||||||
"6004": "Da Team het scho Zuegang zu dem Namensruum oder Liste.",
|
"6004": "The team already has access to that namespace or project.",
|
||||||
"6005": "De Benutzer isch scho bi dem Team.",
|
"6005": "De Benutzer isch scho bi dem Team.",
|
||||||
"6006": "Du chasch nid de letschti Benutzer vom Team lösche.",
|
"6006": "Du chasch nid de letschti Benutzer vom Team lösche.",
|
||||||
"6007": "Da Team het kei Zuegriff uf die Liste, um das durezfüehre.",
|
"6007": "The team does not have access to the project to perform that action.",
|
||||||
"7002": "De Benutzer het scho Zuegriff uf die Liste.",
|
"7002": "The user already has access to that project.",
|
||||||
"7003": "Du hesch kei Zuegriff uf die Liste.",
|
"7003": "You do not have access to that project.",
|
||||||
"8001": "Da Label existiert scho für die Uufgab.",
|
"8001": "Da Label existiert scho für die Uufgab.",
|
||||||
"8002": "Das Label giz nid.",
|
"8002": "Das Label giz nid.",
|
||||||
"8003": "Du hesch kei Zuegriff uf da Label.",
|
"8003": "Du hesch kei Zuegriff uf da Label.",
|
||||||
"9001": "Die Berechtigung isch ungültig.",
|
"9001": "Die Berechtigung isch ungültig.",
|
||||||
"10001": "De Chübl gits nid.",
|
"10001": "De Chübl gits nid.",
|
||||||
"10002": "De Chübl ghört nid i die Liste.",
|
"10002": "The bucket does not belong to that project.",
|
||||||
"10003": "Du chasch de letscht Chübl nid vo de Liste neh.",
|
"10003": "You cannot remove the last bucket on a project.",
|
||||||
"10004": "Du chasch die Uufgab nid dem Chübl zue wiise, weil er d'Limite für Uufgabe erreicht het.",
|
"10004": "Du chasch die Uufgab nid dem Chübl zue wiise, weil er d'Limite für Uufgabe erreicht het.",
|
||||||
"10005": "Es chan nur ein Fertig Chübl pro Liste geh.",
|
"10005": "There can be only one done bucket per project.",
|
||||||
"11001": "De g'speicheret Filter giz nid.",
|
"11001": "De g'speicheret Filter giz nid.",
|
||||||
"11002": "G'speichereti Filter chend nid Teilt werde.",
|
"11002": "G'speichereti Filter chend nid Teilt werde.",
|
||||||
"12001": "De Abonnement Entitätstyp isch ungültig.",
|
"12001": "De Abonnement Entitätstyp isch ungültig.",
|
||||||
|
|
|
@ -5,10 +5,10 @@
|
||||||
"welcomeDay": "Hi {username}!",
|
"welcomeDay": "Hi {username}!",
|
||||||
"welcomeEvening": "Good Evening {username}!",
|
"welcomeEvening": "Good Evening {username}!",
|
||||||
"lastViewed": "Last viewed",
|
"lastViewed": "Last viewed",
|
||||||
"list": {
|
"project": {
|
||||||
"newText": "You can create a new list for your new tasks:",
|
"newText": "You can create a new project for your new tasks:",
|
||||||
"new": "New list",
|
"new": "New project",
|
||||||
"importText": "Or import your lists and tasks from other services into Vikunja:",
|
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||||
"import": "Import your data into Vikunja"
|
"import": "Import your data into Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
"weekStartSunday": "Sunday",
|
"weekStartSunday": "Sunday",
|
||||||
"weekStartMonday": "Monday",
|
"weekStartMonday": "Monday",
|
||||||
"language": "Language",
|
"language": "Language",
|
||||||
"defaultList": "Default List",
|
"defaultProject": "Default Project",
|
||||||
"timezone": "Time Zone",
|
"timezone": "Time Zone",
|
||||||
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
||||||
},
|
},
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
},
|
},
|
||||||
"deletion": {
|
"deletion": {
|
||||||
"title": "Delete your Vikunja Account",
|
"title": "Delete your Vikunja Account",
|
||||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, lists, tasks and everything associated with it.",
|
"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.",
|
||||||
"text2": "To proceed, please enter your password. You will receive an email with further instructions.",
|
"text2": "To proceed, please enter your password. You will receive an email with further instructions.",
|
||||||
"confirm": "Delete my account",
|
"confirm": "Delete my account",
|
||||||
"requestSuccess": "The request was successful. You'll receive an email with further instructions.",
|
"requestSuccess": "The request was successful. You'll receive an email with further instructions.",
|
||||||
|
@ -157,40 +157,39 @@
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"title": "Export your Vikunja data",
|
"title": "Export your Vikunja data",
|
||||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Lists, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
"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.",
|
||||||
"descriptionPasswordRequired": "Please enter your password to proceed:",
|
"descriptionPasswordRequired": "Please enter your password to proceed:",
|
||||||
"request": "Request a copy of my Vikunja Data",
|
"request": "Request a copy of my Vikunja Data",
|
||||||
"success": "You've successfully requested your Vikunja Data! We will send you an email once it's ready to download.",
|
"success": "You've successfully requested your Vikunja Data! We will send you an email once it's ready to download.",
|
||||||
"downloadTitle": "Download your exported Vikunja data"
|
"downloadTitle": "Download your exported Vikunja data"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"archived": "This list is archived. It is not possible to create new or edit tasks for it.",
|
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||||
"title": "List Title",
|
"title": "Project Title",
|
||||||
"color": "Color",
|
"color": "Color",
|
||||||
"lists": "Lists",
|
"projects": "Projects",
|
||||||
"list": "List",
|
"search": "Type to search for a project…",
|
||||||
"search": "Type to search for a list…",
|
"searchSelect": "Click or press enter to select this project",
|
||||||
"searchSelect": "Click or press enter to select this list",
|
"shared": "Shared Projects",
|
||||||
"shared": "Shared Lists",
|
"noDescriptionAvailable": "No project description is available.",
|
||||||
"noDescriptionAvailable": "No list description is available.",
|
|
||||||
"create": {
|
"create": {
|
||||||
"header": "New list",
|
"header": "New project",
|
||||||
"titlePlaceholder": "The list's title goes here…",
|
"titlePlaceholder": "The project's title goes here…",
|
||||||
"addTitleRequired": "Please specify a title.",
|
"addTitleRequired": "Please specify a title.",
|
||||||
"createdSuccess": "The list was successfully created.",
|
"createdSuccess": "The project was successfully created.",
|
||||||
"addListRequired": "Please specify a list or set a default list in the settings."
|
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"title": "Archive \"{list}\"",
|
"title": "Archive \"{project}\"",
|
||||||
"archive": "Archive this list",
|
"archive": "Archive this project",
|
||||||
"unarchive": "Un-Archive this list",
|
"unarchive": "Un-Archive this project",
|
||||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||||
"archiveText": "You won't be able to edit this list or create new tasks until you un-archive it.",
|
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||||
"success": "The list was successfully archived."
|
"success": "The project was successfully archived."
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
"title": "Set list background",
|
"title": "Set project background",
|
||||||
"remove": "Remove Background",
|
"remove": "Remove Background",
|
||||||
"upload": "Choose a background from your pc",
|
"upload": "Choose a background from your pc",
|
||||||
"searchPlaceholder": "Search for a background…",
|
"searchPlaceholder": "Search for a background…",
|
||||||
|
@ -200,40 +199,40 @@
|
||||||
"removeSuccess": "The background has been removed successfully!"
|
"removeSuccess": "The background has been removed successfully!"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Delete \"{list}\"",
|
"title": "Delete \"{project}\"",
|
||||||
"header": "Delete this list",
|
"header": "Delete this project",
|
||||||
"text1": "Are you sure you want to delete this list and all of its contents?",
|
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||||
"success": "The list was successfully deleted.",
|
"success": "The project was successfully deleted.",
|
||||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||||
"noTasksToDelete": "This list does not contain any tasks, it should be safe to delete."
|
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||||
},
|
},
|
||||||
"duplicate": {
|
"duplicate": {
|
||||||
"title": "Duplicate this list",
|
"title": "Duplicate this project",
|
||||||
"label": "Duplicate",
|
"label": "Duplicate",
|
||||||
"text": "Select a namespace which should hold the duplicated list:",
|
"text": "Select a namespace which should hold the duplicated project:",
|
||||||
"success": "The list was successfully duplicated."
|
"success": "The project was successfully duplicated."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"header": "Edit This List",
|
"header": "Edit This Project",
|
||||||
"title": "Edit \"{list}\"",
|
"title": "Edit \"{project}\"",
|
||||||
"titlePlaceholder": "The list title goes here…",
|
"titlePlaceholder": "The project title goes here…",
|
||||||
"identifierTooltip": "The list identifier can be used to uniquely identify a task across lists. You can set it to empty to disable it.",
|
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||||
"identifier": "List Identifier",
|
"identifier": "Project Identifier",
|
||||||
"identifierPlaceholder": "The list identifier goes here…",
|
"identifierPlaceholder": "The project identifier goes here…",
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "The lists description goes here…",
|
"descriptionPlaceholder": "The projects description goes here…",
|
||||||
"color": "Color",
|
"color": "Color",
|
||||||
"success": "The list was successfully updated."
|
"success": "The project was successfully updated."
|
||||||
},
|
},
|
||||||
"share": {
|
"share": {
|
||||||
"header": "Share this list",
|
"header": "Share this project",
|
||||||
"title": "Share \"{list}\"",
|
"title": "Share \"{project}\"",
|
||||||
"share": "Share",
|
"share": "Share",
|
||||||
"links": {
|
"links": {
|
||||||
"title": "Share Links",
|
"title": "Share Links",
|
||||||
"what": "What is a share link?",
|
"what": "What is a share link?",
|
||||||
"explanation": "Share Links allow you to easily share a list with other users who don't have an account on Vikunja.",
|
"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",
|
"create": "Create a new link share",
|
||||||
"name": "Name (optional)",
|
"name": "Name (optional)",
|
||||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||||
|
@ -242,7 +241,7 @@
|
||||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||||
"noName": "No name set",
|
"noName": "No name set",
|
||||||
"remove": "Remove a link share",
|
"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 list with this link share. This cannot be undone!",
|
"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.",
|
"createSuccess": "The link share was successfully created.",
|
||||||
"deleteSuccess": "The link share was successfully deleted",
|
"deleteSuccess": "The link share was successfully deleted",
|
||||||
"view": "View",
|
"view": "View",
|
||||||
|
@ -275,7 +274,7 @@
|
||||||
"title": "List",
|
"title": "List",
|
||||||
"add": "Add",
|
"add": "Add",
|
||||||
"addPlaceholder": "Add a new task…",
|
"addPlaceholder": "Add a new task…",
|
||||||
"empty": "This list is currently empty.",
|
"empty": "This project is currently empty.",
|
||||||
"newTaskCta": "Create a new task.",
|
"newTaskCta": "Create a new task.",
|
||||||
"editTask": "Edit Task"
|
"editTask": "Edit Task"
|
||||||
},
|
},
|
||||||
|
@ -323,36 +322,36 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"namespace": {
|
"namespace": {
|
||||||
"title": "Namespaces & Lists",
|
"title": "Namespaces & Projects",
|
||||||
"namespace": "Namespace",
|
"namespace": "Namespace",
|
||||||
"showArchived": "Show Archived",
|
"showArchived": "Show Archived",
|
||||||
"noneAvailable": "You don't have any namespaces right now.",
|
"noneAvailable": "You don't have any namespaces right now.",
|
||||||
"unarchive": "Un-Archive",
|
"unarchive": "Un-Archive",
|
||||||
"archived": "Archived",
|
"archived": "Archived",
|
||||||
"noLists": "This namespace does not contain any lists.",
|
"noProjects": "This namespace does not contain any projects.",
|
||||||
"createList": "Create a new list in this namespace.",
|
"createProject": "Create a new project in this namespace.",
|
||||||
"namespaces": "Namespaces",
|
"namespaces": "Namespaces",
|
||||||
"search": "Type to search for a namespace…",
|
"search": "Type to search for a namespace…",
|
||||||
"create": {
|
"create": {
|
||||||
"title": "New namespace",
|
"title": "New namespace",
|
||||||
"titleRequired": "Please specify a title.",
|
"titleRequired": "Please specify a title.",
|
||||||
"explanation": "A namespace is a collection of lists you can share and use to organize your lists with. In fact, every list belongs to a namespace.",
|
"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.",
|
||||||
"tooltip": "What's a namespace?",
|
"tooltip": "What's a namespace?",
|
||||||
"success": "The namespace was successfully created."
|
"success": "The namespace was successfully created."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"titleArchive": "Archive \"{namespace}\"",
|
"titleArchive": "Archive \"{namespace}\"",
|
||||||
"titleUnarchive": "Un-Archive \"{namespace}\"",
|
"titleUnarchive": "Un-Archive \"{namespace}\"",
|
||||||
"archiveText": "You won't be able to edit this namespace or create new lists until you un-archive it. This will also archive all lists in this 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 lists or edit it.",
|
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||||
"success": "The namespace was successfully archived.",
|
"success": "The namespace was successfully archived.",
|
||||||
"unarchiveSuccess": "The namespace was successfully un-archived.",
|
"unarchiveSuccess": "The namespace was successfully un-archived.",
|
||||||
"description": "If a namespace is archived, you cannot create new lists or edit it."
|
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Delete \"{namespace}\"",
|
"title": "Delete \"{namespace}\"",
|
||||||
"text1": "Are you sure you want to delete this namespace and all of its contents?",
|
"text1": "Are you sure you want to delete this namespace and all of its contents?",
|
||||||
"text2": "This includes all lists and tasks and CANNOT BE UNDONE!",
|
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||||
"success": "The namespace was successfully deleted."
|
"success": "The namespace was successfully deleted."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
|
@ -372,8 +371,8 @@
|
||||||
"isArchived": "This namespace is archived"
|
"isArchived": "This namespace is archived"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"sharedLists": {
|
"sharedProjects": {
|
||||||
"title": "Shared Lists"
|
"title": "Shared Projects"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favorites"
|
"title": "Favorites"
|
||||||
|
@ -404,7 +403,7 @@
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "New Saved Filter",
|
"title": "New Saved Filter",
|
||||||
"description": "A saved filter is a virtual list which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
"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.",
|
||||||
"action": "Create new saved filter",
|
"action": "Create new saved filter",
|
||||||
"titleRequired": "Please provide a title for the filter."
|
"titleRequired": "Please provide a title for the filter."
|
||||||
},
|
},
|
||||||
|
@ -436,7 +435,7 @@
|
||||||
"label": {
|
"label": {
|
||||||
"title": "Labels",
|
"title": "Labels",
|
||||||
"manage": "Manage labels",
|
"manage": "Manage labels",
|
||||||
"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 list you have access.",
|
"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.",
|
||||||
"newCTA": "You currently do not have any labels.",
|
"newCTA": "You currently do not have any labels.",
|
||||||
"search": "Type to search for a label…",
|
"search": "Type to search for a label…",
|
||||||
"create": {
|
"create": {
|
||||||
|
@ -461,7 +460,7 @@
|
||||||
},
|
},
|
||||||
"sharing": {
|
"sharing": {
|
||||||
"authenticating": "Authenticating…",
|
"authenticating": "Authenticating…",
|
||||||
"passwordRequired": "This shared list requires a password. Please enter it below:",
|
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||||
"error": "An error occured.",
|
"error": "An error occured.",
|
||||||
"invalidPassword": "The password is invalid."
|
"invalidPassword": "The password is invalid."
|
||||||
},
|
},
|
||||||
|
@ -530,7 +529,7 @@
|
||||||
"code": "Code",
|
"code": "Code",
|
||||||
"quote": "Quote",
|
"quote": "Quote",
|
||||||
"unorderedList": "Unordered List",
|
"unorderedList": "Unordered List",
|
||||||
"orderedList": "Ordered List",
|
"orderedList ": "Ordered List",
|
||||||
"cleanBlock": "Clean Block",
|
"cleanBlock": "Clean Block",
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"image": "Image",
|
"image": "Image",
|
||||||
|
@ -606,6 +605,7 @@
|
||||||
"addReminder": "Add a new reminder…",
|
"addReminder": "Add a new reminder…",
|
||||||
"doneSuccess": "The task was successfully marked as done.",
|
"doneSuccess": "The task was successfully marked as done.",
|
||||||
"undoneSuccess": "The task was successfully un-marked as done.",
|
"undoneSuccess": "The task was successfully un-marked as done.",
|
||||||
|
"undo": "Undo",
|
||||||
"openDetail": "Open task detail view",
|
"openDetail": "Open task detail view",
|
||||||
"checklistTotal": "{checked} of {total} tasks",
|
"checklistTotal": "{checked} of {total} tasks",
|
||||||
"checklistAllDone": "{total} tasks",
|
"checklistAllDone": "{total} tasks",
|
||||||
|
@ -622,7 +622,7 @@
|
||||||
"chooseDueDate": "Click here to set a due date",
|
"chooseDueDate": "Click here to set a due date",
|
||||||
"chooseStartDate": "Click here to set a start date",
|
"chooseStartDate": "Click here to set a start date",
|
||||||
"chooseEndDate": "Click here to set an end date",
|
"chooseEndDate": "Click here to set an end date",
|
||||||
"move": "Move task to a different list",
|
"move": "Move task to a different project",
|
||||||
"done": "Mark task done!",
|
"done": "Mark task done!",
|
||||||
"undone": "Mark as undone",
|
"undone": "Mark as undone",
|
||||||
"created": "Created {0} by {1}",
|
"created": "Created {0} by {1}",
|
||||||
|
@ -630,7 +630,7 @@
|
||||||
"doneAt": "Done {0}",
|
"doneAt": "Done {0}",
|
||||||
"updateSuccess": "The task was saved successfully.",
|
"updateSuccess": "The task was saved successfully.",
|
||||||
"deleteSuccess": "The task has been deleted successfully.",
|
"deleteSuccess": "The task has been deleted successfully.",
|
||||||
"belongsToList": "This task belongs to list '{list}'",
|
"belongsToProject": "This task belongs to project '{project}'",
|
||||||
"due": "Due {at}",
|
"due": "Due {at}",
|
||||||
"closePopup": "Close popup",
|
"closePopup": "Close popup",
|
||||||
"delete": {
|
"delete": {
|
||||||
|
@ -650,7 +650,7 @@
|
||||||
"percentDone": "Set Progress",
|
"percentDone": "Set Progress",
|
||||||
"attachments": "Add Attachments",
|
"attachments": "Add Attachments",
|
||||||
"relatedTasks": "Add Relation",
|
"relatedTasks": "Add Relation",
|
||||||
"moveList": "Move",
|
"moveProject": "Move",
|
||||||
"color": "Set Color",
|
"color": "Set Color",
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
"favorite": "Add to Favorites",
|
"favorite": "Add to Favorites",
|
||||||
|
@ -677,21 +677,21 @@
|
||||||
"updated": "Updated"
|
"updated": "Updated"
|
||||||
},
|
},
|
||||||
"subscription": {
|
"subscription": {
|
||||||
"subscribedListThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this list through its namespace.",
|
"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.",
|
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
|
||||||
"subscribedTaskThroughParentList": "You can't unsubscribe here because you are subscribed to this task through its list.",
|
"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.",
|
"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.",
|
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
|
||||||
"subscribedList": "You are currently subscribed to this list and will receive notifications for changes.",
|
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||||
"notSubscribedList": "You are not subscribed to this list and won't 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.",
|
"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.",
|
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
|
||||||
"subscribe": "Subscribe",
|
"subscribe": "Subscribe",
|
||||||
"unsubscribe": "Unsubscribe",
|
"unsubscribe": "Unsubscribe",
|
||||||
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
||||||
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
||||||
"subscribeSuccessList": "You are now subscribed to this list",
|
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||||
},
|
},
|
||||||
|
@ -765,7 +765,7 @@
|
||||||
"new": "New Task Relation",
|
"new": "New Task Relation",
|
||||||
"searchPlaceholder": "Type search for a new task to add as related…",
|
"searchPlaceholder": "Type search for a new task to add as related…",
|
||||||
"createPlaceholder": "Add this as new related task",
|
"createPlaceholder": "Add this as new related task",
|
||||||
"differentList": "This task belongs to a different list.",
|
"differentProject": "This task belongs to a different project.",
|
||||||
"differentNamespace": "This task belongs to a different namespace.",
|
"differentNamespace": "This task belongs to a different namespace.",
|
||||||
"noneYet": "No task relations yet.",
|
"noneYet": "No task relations yet.",
|
||||||
"delete": "Delete Task Relation",
|
"delete": "Delete Task Relation",
|
||||||
|
@ -815,10 +815,10 @@
|
||||||
"priority1": "To set a task's priority, add a number 1-5, prefixed with a {prefix}.",
|
"priority1": "To set a task's priority, add a number 1-5, prefixed with a {prefix}.",
|
||||||
"priority2": "The higher the number, the higher the priority.",
|
"priority2": "The higher the number, the higher the priority.",
|
||||||
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
||||||
"list1": "To set a list for the task to appear in, enter its name prefixed with {prefix}.",
|
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||||
"list2": "This will return an error if the list does not exist.",
|
"project2": "This will return an error if the project does not exist.",
|
||||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||||
"list4": "For example: {prefix}\"List with spaces\".",
|
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||||
"dateAndTime": "Date and time",
|
"dateAndTime": "Date and time",
|
||||||
"date": "Any date will be used as the due date of the new task. You can use dates in any of these formats:",
|
"date": "Any date will be used as the due date of the new task. You can use dates in any of these formats:",
|
||||||
"dateWeekday": "any weekday, will use the next date with that date",
|
"dateWeekday": "any weekday, will use the next date with that date",
|
||||||
|
@ -851,19 +851,19 @@
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Delete the team",
|
"header": "Delete the team",
|
||||||
"text1": "Are you sure you want to delete this team and all of its members?",
|
"text1": "Are you sure you want to delete this team and all of its members?",
|
||||||
"text2": "All team members will lose access to lists and namespaces shared with this team. This CANNOT BE UNDONE!",
|
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||||
"success": "The team was successfully deleted."
|
"success": "The team was successfully deleted."
|
||||||
},
|
},
|
||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"header": "Remove a user from the team",
|
"header": "Remove a user from the team",
|
||||||
"text1": "Are you sure you want to remove this user from the team?",
|
"text1": "Are you sure you want to remove this user from the team?",
|
||||||
"text2": "They will lose access to all lists and namespaces this team has access to. This CANNOT BE UNDONE!",
|
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||||
"success": "The user was successfully deleted from the team."
|
"success": "The user was successfully deleted from the team."
|
||||||
},
|
},
|
||||||
"leave": {
|
"leave": {
|
||||||
"title": "Leave team",
|
"title": "Leave team",
|
||||||
"text1": "Are you sure you want to leave this team?",
|
"text1": "Are you sure you want to leave this team?",
|
||||||
"text2": "You will lose access to all lists and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
"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.",
|
||||||
"success": "You have successfully left the team."
|
"success": "You have successfully left the team."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -895,12 +895,12 @@
|
||||||
"attachment": "Add an attachment to this task",
|
"attachment": "Add an attachment to this task",
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another project",
|
||||||
"reminder": "Manage reminders of this task",
|
"reminder": "Manage reminders of this task",
|
||||||
"description": "Toggle editing of the task description"
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"title": "List Views",
|
"title": "Project Views",
|
||||||
"switchToListView": "Switch to list view",
|
"switchToListView": "Switch to list view",
|
||||||
"switchToGanttView": "Switch to gantt view",
|
"switchToGanttView": "Switch to gantt view",
|
||||||
"switchToKanbanView": "Switch to kanban view",
|
"switchToKanbanView": "Switch to kanban view",
|
||||||
|
@ -910,7 +910,7 @@
|
||||||
"title": "Navigation",
|
"title": "Navigation",
|
||||||
"overview": "Navigate to overview",
|
"overview": "Navigate to overview",
|
||||||
"upcoming": "Navigate to upcoming tasks",
|
"upcoming": "Navigate to upcoming tasks",
|
||||||
"namespaces": "Navigate to namespaces & lists",
|
"namespaces": "Navigate to namespaces & projects",
|
||||||
"labels": "Navigate to labels",
|
"labels": "Navigate to labels",
|
||||||
"teams": "Navigate to teams"
|
"teams": "Navigate to teams"
|
||||||
}
|
}
|
||||||
|
@ -927,7 +927,7 @@
|
||||||
"unarchive": "Un-Archive",
|
"unarchive": "Un-Archive",
|
||||||
"setBackground": "Set background",
|
"setBackground": "Set background",
|
||||||
"share": "Share",
|
"share": "Share",
|
||||||
"newList": "New list"
|
"newProject": "New project"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"url": "Vikunja URL",
|
"url": "Vikunja URL",
|
||||||
|
@ -946,24 +946,24 @@
|
||||||
"notification": {
|
"notification": {
|
||||||
"title": "Notifications",
|
"title": "Notifications",
|
||||||
"none": "You don't have any notifications. Have a nice day!",
|
"none": "You don't have any notifications. Have a nice day!",
|
||||||
"explainer": "Notifications will appear here when actions on namespaces, lists or tasks you subscribed to happen."
|
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||||
},
|
},
|
||||||
"quickActions": {
|
"quickActions": {
|
||||||
"commands": "Commands",
|
"commands": "Commands",
|
||||||
"placeholder": "Type a command or search…",
|
"placeholder": "Type a command or search…",
|
||||||
"hint": "You can use {list} to limit the search to a list. Combine {list} or {label} (labels) with a search query to search for a task with these labels or on that list. Use {assignee} to only search for teams.",
|
"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.",
|
||||||
"tasks": "Tasks",
|
"tasks": "Tasks",
|
||||||
"lists": "Lists",
|
"projects": "Projects",
|
||||||
"teams": "Teams",
|
"teams": "Teams",
|
||||||
"newList": "Enter the title of the new list…",
|
"newProject": "Enter the title of the new project…",
|
||||||
"newTask": "Enter the title of the new task…",
|
"newTask": "Enter the title of the new task…",
|
||||||
"newNamespace": "Enter the title of the new namespace…",
|
"newNamespace": "Enter the title of the new namespace…",
|
||||||
"newTeam": "Enter the name of the new team…",
|
"newTeam": "Enter the name of the new team…",
|
||||||
"createTask": "Create a task in the current list ({title})",
|
"createTask": "Create a task in the current project ({title})",
|
||||||
"createList": "Create a list in the current namespace ({title})",
|
"createProject": "Create a project in the current namespace ({title})",
|
||||||
"cmds": {
|
"cmds": {
|
||||||
"newTask": "New task",
|
"newTask": "New task",
|
||||||
"newList": "New list",
|
"newProject": "New project",
|
||||||
"newNamespace": "New namespace",
|
"newNamespace": "New namespace",
|
||||||
"newTeam": "New team"
|
"newTeam": "New team"
|
||||||
}
|
}
|
||||||
|
@ -995,15 +995,15 @@
|
||||||
"1018": "The user avatar type setting is invalid.",
|
"1018": "The user avatar type setting is invalid.",
|
||||||
"2001": "ID cannot be empty or 0.",
|
"2001": "ID cannot be empty or 0.",
|
||||||
"2002": "Some of the request data was invalid.",
|
"2002": "Some of the request data was invalid.",
|
||||||
"3001": "The list does not exist.",
|
"3001": "The project does not exist.",
|
||||||
"3004": "You need to have read permissions on that list to perform that action.",
|
"3004": "You need to have read permissions on that project to perform that action.",
|
||||||
"3005": "The list title cannot be empty.",
|
"3005": "The project title cannot be empty.",
|
||||||
"3006": "The list share does not exist.",
|
"3006": "The project share does not exist.",
|
||||||
"3007": "A list with this identifier already exists.",
|
"3007": "A project with this identifier already exists.",
|
||||||
"3008": "The list is archived and can therefore only be accessed read only. This is also true for all tasks associated with this list.",
|
"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 list task text cannot be empty.",
|
"4001": "The project task text cannot be empty.",
|
||||||
"4002": "The list task does not exist.",
|
"4002": "The project task does not exist.",
|
||||||
"4003": "All bulk editing tasks must belong to the same list.",
|
"4003": "All bulk editing tasks must belong to the same project.",
|
||||||
"4004": "Need at least one task when bulk editing tasks.",
|
"4004": "Need at least one task when bulk editing tasks.",
|
||||||
"4005": "You do not have the right to see the task.",
|
"4005": "You do not have the right to see the task.",
|
||||||
"4006": "You can't set a parent task as the task itself.",
|
"4006": "You can't set a parent task as the task itself.",
|
||||||
|
@ -1029,21 +1029,21 @@
|
||||||
"5012": "The namespace is archived and can therefore only be accessed read only.",
|
"5012": "The namespace is archived and can therefore only be accessed read only.",
|
||||||
"6001": "The team name cannot be empty.",
|
"6001": "The team name cannot be empty.",
|
||||||
"6002": "The team does not exist.",
|
"6002": "The team does not exist.",
|
||||||
"6004": "The team already has access to that namespace or list.",
|
"6004": "The team already has access to that namespace or project.",
|
||||||
"6005": "The user is already a member of that team.",
|
"6005": "The user is already a member of that team.",
|
||||||
"6006": "Cannot delete the last team member.",
|
"6006": "Cannot delete the last team member.",
|
||||||
"6007": "The team does not have access to the list to perform that action.",
|
"6007": "The team does not have access to the project to perform that action.",
|
||||||
"7002": "The user already has access to that list.",
|
"7002": "The user already has access to that project.",
|
||||||
"7003": "You do not have access to that list.",
|
"7003": "You do not have access to that project.",
|
||||||
"8001": "This label already exists on that task.",
|
"8001": "This label already exists on that task.",
|
||||||
"8002": "The label does not exist.",
|
"8002": "The label does not exist.",
|
||||||
"8003": "You do not have access to this label.",
|
"8003": "You do not have access to this label.",
|
||||||
"9001": "The right is invalid.",
|
"9001": "The right is invalid.",
|
||||||
"10001": "The bucket does not exist.",
|
"10001": "The bucket does not exist.",
|
||||||
"10002": "The bucket does not belong to that list.",
|
"10002": "The bucket does not belong to that project.",
|
||||||
"10003": "You cannot remove the last bucket on a list.",
|
"10003": "You cannot remove the last bucket on a project.",
|
||||||
"10004": "You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold.",
|
"10004": "You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold.",
|
||||||
"10005": "There can be only one done bucket per list.",
|
"10005": "There can be only one done bucket per project.",
|
||||||
"11001": "The saved filter does not exist.",
|
"11001": "The saved filter does not exist.",
|
||||||
"11002": "Saved filters are not available for link shares.",
|
"11002": "Saved filters are not available for link shares.",
|
||||||
"12001": "The subscription entity type is invalid.",
|
"12001": "The subscription entity type is invalid.",
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
"welcomeDay": "¡Hola {username}!",
|
"welcomeDay": "¡Hola {username}!",
|
||||||
"welcomeEvening": "¡Buenas Tardes {username}!",
|
"welcomeEvening": "¡Buenas Tardes {username}!",
|
||||||
"lastViewed": "Visto por última vez",
|
"lastViewed": "Visto por última vez",
|
||||||
"list": {
|
"project": {
|
||||||
"newText": "Puedes crear una nueva lista para las tareas nuevas:",
|
"newText": "You can create a new project for your new tasks:",
|
||||||
"new": "Nueva lista",
|
"new": "New project",
|
||||||
"importText": "O importa tus listas y tareas de otros servicios a Vikunja:",
|
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||||
"import": "Importa tus datos a Vikunja"
|
"import": "Import your data into Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"404": {
|
"404": {
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
"weekStartSunday": "Domingo",
|
"weekStartSunday": "Domingo",
|
||||||
"weekStartMonday": "Lunes",
|
"weekStartMonday": "Lunes",
|
||||||
"language": "Idioma",
|
"language": "Idioma",
|
||||||
"defaultList": "Lista Predeterminada",
|
"defaultProject": "Default Project",
|
||||||
"timezone": "Zona Horaria",
|
"timezone": "Zona Horaria",
|
||||||
"overdueTasksRemindersTime": "Hora de envío del correo electrónico de tareas pendientes"
|
"overdueTasksRemindersTime": "Hora de envío del correo electrónico de tareas pendientes"
|
||||||
},
|
},
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
},
|
},
|
||||||
"deletion": {
|
"deletion": {
|
||||||
"title": "Eliminar tu Cuenta de Vikunja",
|
"title": "Eliminar tu Cuenta de Vikunja",
|
||||||
"text1": "La eliminación de tu cuenta es permanente y no se puede deshacer. Eliminaremos todos tus proyectos, listas, tareas y todo lo relacionado con ella.",
|
"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.",
|
||||||
"text2": "Para continuar, por favor, introduce tu contraseña. Recibirás un correo electrónico con más instrucciones.",
|
"text2": "Para continuar, por favor, introduce tu contraseña. Recibirás un correo electrónico con más instrucciones.",
|
||||||
"confirm": "Eliminar mi cuenta",
|
"confirm": "Eliminar mi cuenta",
|
||||||
"requestSuccess": "La solicitud ha sido exitosa. Recibirás un correo electrónico con más instrucciones.",
|
"requestSuccess": "La solicitud ha sido exitosa. Recibirás un correo electrónico con más instrucciones.",
|
||||||
|
@ -157,201 +157,201 @@
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"title": "Exportar tus datos de Vikunja",
|
"title": "Exportar tus datos de Vikunja",
|
||||||
"description": "Puede solicitar una copia de todos sus datos de Vikunja. Esto incluye proyectos, listas, tareas y todo lo relacionado con ellos. Puede importar estos datos en cualquier instancia de Vikunja, a través de la función de migración.",
|
"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.",
|
||||||
"descriptionPasswordRequired": "Por favor, introduce tu contraseña para continuar:",
|
"descriptionPasswordRequired": "Por favor, introduce tu contraseña para continuar:",
|
||||||
"request": "Solicitar una copia de mis datos de Vikunja",
|
"request": "Solicitar una copia de mis datos de Vikunja",
|
||||||
"success": "Tu petición de datos de Vikunja ha sido procesada correctamente. Te enviaremos un correo una vez esté lista para descargar.",
|
"success": "Tu petición de datos de Vikunja ha sido procesada correctamente. Te enviaremos un correo una vez esté lista para descargar.",
|
||||||
"downloadTitle": "Descargar tus datos de Vikunja exportados"
|
"downloadTitle": "Descargar tus datos de Vikunja exportados"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"archived": "La lista está archivada. No es posible crear nuevas tareas, ni editarlas.",
|
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||||
"title": "Título de Lista",
|
"title": "Project Title",
|
||||||
"color": "Color",
|
"color": "Color",
|
||||||
"lists": "Listas",
|
"projects": "Projects",
|
||||||
"list": {
|
"search": "Type to search for a project…",
|
||||||
"title": "Lista",
|
"searchSelect": "Click or press enter to select this project",
|
||||||
"add": "Añadir",
|
"shared": "Shared Projects",
|
||||||
"addPlaceholder": "Añadir una nueva tarea…",
|
"noDescriptionAvailable": "No project description is available.",
|
||||||
"empty": "This list is currently empty.",
|
|
||||||
"newTaskCta": "Crear una nueva tarea.",
|
|
||||||
"editTask": "Editar Tarea"
|
|
||||||
},
|
|
||||||
"search": "Escribe para buscar una lista…",
|
|
||||||
"searchSelect": "Haga clic o presione enter para seleccionar esta lista",
|
|
||||||
"shared": "Listas Compartidas",
|
|
||||||
"noDescriptionAvailable": "Descripción de lista no disponible.",
|
|
||||||
"create": {
|
"create": {
|
||||||
"header": "Nueva lista",
|
"header": "New project",
|
||||||
"titlePlaceholder": "El título de la lista va aquí…",
|
"titlePlaceholder": "The project's title goes here…",
|
||||||
"addTitleRequired": "Por favor, especifica un título.",
|
"addTitleRequired": "Please specify a title.",
|
||||||
"createdSuccess": "La lista se ha creado correctamente.",
|
"createdSuccess": "The project was successfully created.",
|
||||||
"addListRequired": "Por favor, especifica una lista o establece una lista por defecto en la configuración."
|
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"title": "Archivar \"{list}\"",
|
"title": "Archive \"{project}\"",
|
||||||
"archive": "Archivar esta lista",
|
"archive": "Archive this project",
|
||||||
"unarchive": "Desarchivar esta lista",
|
"unarchive": "Un-Archive this project",
|
||||||
"unarchiveText": "Podrás crear tareas nuevas o editarlas.",
|
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||||
"archiveText": "No podrás editar esta lista ni crear nuevas tareas hasta que la desarchives.",
|
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||||
"success": "La lista fue archivada con éxito."
|
"success": "The project was successfully archived."
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
"title": "Establecer fondo para la lista",
|
"title": "Set project background",
|
||||||
"remove": "Eliminar Fondo",
|
"remove": "Remove Background",
|
||||||
"upload": "Elige un fondo desde tu pc",
|
"upload": "Choose a background from your pc",
|
||||||
"searchPlaceholder": "Buscar un fondo…",
|
"searchPlaceholder": "Search for a background…",
|
||||||
"poweredByUnsplash": "Con tecnología de Unsplash",
|
"poweredByUnsplash": "Powered by Unsplash",
|
||||||
"loadMore": "Cargar más fotos",
|
"loadMore": "Load more photos",
|
||||||
"success": "¡El fondo se ha establecido con éxito!",
|
"success": "The background has been set successfully!",
|
||||||
"removeSuccess": "¡El fondo se ha eliminado con éxito!"
|
"removeSuccess": "The background has been removed successfully!"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Eliminar \"{list}\"",
|
"title": "Delete \"{project}\"",
|
||||||
"header": "Eliminar esta lista",
|
"header": "Delete this project",
|
||||||
"text1": "¿Estás seguro de que quieres eliminar esta lista y todo su contenido?",
|
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||||
"text2": "¡Esto incluye todas las tareas y NO SE PUEDE DESHACER!",
|
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||||
"success": "La lista se ha eliminado con éxito.",
|
"success": "The project was successfully deleted.",
|
||||||
"tasksToDelete": "Esto eliminará irrevocablemente aprox. {count} tareas.",
|
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||||
"noTasksToDelete": "Esta lista no contiene ninguna tarea, debería ser segura de eliminar."
|
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||||
},
|
},
|
||||||
"duplicate": {
|
"duplicate": {
|
||||||
"title": "Duplicar esta lista",
|
"title": "Duplicate this project",
|
||||||
"label": "Duplicar",
|
"label": "Duplicate",
|
||||||
"text": "Seleccione un proyecto que debería contener la lista duplicada:",
|
"text": "Select a namespace which should hold the duplicated project:",
|
||||||
"success": "La lista se ha duplicado con éxito."
|
"success": "The project was successfully duplicated."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"header": "Editar Esta Lista",
|
"header": "Edit This Project",
|
||||||
"title": "Editar \"{list}\"",
|
"title": "Edit \"{project}\"",
|
||||||
"titlePlaceholder": "El título de la lista va aquí…",
|
"titlePlaceholder": "The project title goes here…",
|
||||||
"identifierTooltip": "El identificador de lista se puede usar para identificar una tarea de forma única a través de las listas. Puedes establecerlo en blanco para desactivarlo.",
|
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||||
"identifier": "Identificador de la lista",
|
"identifier": "Project Identifier",
|
||||||
"identifierPlaceholder": "El identificador de la lista va aquí…",
|
"identifierPlaceholder": "The project identifier goes here…",
|
||||||
"description": "Descripción",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "La descripción de la lista va aquí…",
|
"descriptionPlaceholder": "The projects description goes here…",
|
||||||
"color": "Color",
|
"color": "Color",
|
||||||
"success": "La lista se ha actualizado correctamente."
|
"success": "The project was successfully updated."
|
||||||
},
|
},
|
||||||
"share": {
|
"share": {
|
||||||
"header": "Compartir esta lista",
|
"header": "Share this project",
|
||||||
"title": "Compartir \"{list}\"",
|
"title": "Share \"{project}\"",
|
||||||
"share": "Compartir",
|
"share": "Share",
|
||||||
"links": {
|
"links": {
|
||||||
"title": "Compartir enlaces",
|
"title": "Share Links",
|
||||||
"what": "¿Qué es un enlace compartido?",
|
"what": "What is a share link?",
|
||||||
"explanation": "Enlaces compartidos te permiten compartir fácilmente una lista con otros usuarios que no tienen una cuenta de Vikunja.",
|
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||||
"create": "Crear un nuevo enlace compartido",
|
"create": "Create a new link share",
|
||||||
"name": "Nombre (opcional)",
|
"name": "Name (optional)",
|
||||||
"namePlaceholder": "ej. Lorem Ipsum",
|
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||||
"nameExplanation": "Todas las acciones realizadas por este enlace compartido se mostrarán con el nombre.",
|
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||||
"password": "Contraseña (opcional)",
|
"password": "Password (optional)",
|
||||||
"passwordExplanation": "Al autenticarse, el usuario deberá introducir esta contraseña.",
|
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||||
"noName": "Sin nombre establecido",
|
"noName": "No name set",
|
||||||
"remove": "Eliminar un enlace compartido",
|
"remove": "Remove a link share",
|
||||||
"removeText": "¿Estás seguro de que deseas eliminar este enlace compartido? Ya no será posible acceder a esta lista con este enlace compartido. ¡Esto no se puede deshacer!",
|
"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": "El enlace compartido se ha creado correctamente.",
|
"createSuccess": "The link share was successfully created.",
|
||||||
"deleteSuccess": "El enlace compartido se ha eliminado correctamente",
|
"deleteSuccess": "The link share was successfully deleted",
|
||||||
"view": "Vista",
|
"view": "View",
|
||||||
"sharedBy": "Compartido por {0}"
|
"sharedBy": "Shared by {0}"
|
||||||
},
|
},
|
||||||
"userTeam": {
|
"userTeam": {
|
||||||
"typeUser": "usuario | usuarios",
|
"typeUser": "user | users",
|
||||||
"typeTeam": "equipo | equipos",
|
"typeTeam": "team | teams",
|
||||||
"shared": "Compartido con estos {type}",
|
"shared": "Shared with these {type}",
|
||||||
"you": "Tú",
|
"you": "You",
|
||||||
"notShared": "No compartido con ningún {type} aún.",
|
"notShared": "Not shared with any {type} yet.",
|
||||||
"removeHeader": "Eliminar un {type} de la {sharable}",
|
"removeHeader": "Remove a {type} from the {sharable}",
|
||||||
"removeText": "¿Estás seguro de que quieres eliminar este {sharable} del {type}? ¡Esto no se puede deshacer!",
|
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||||
"removeSuccess": "El {sharable} fue eliminado correctamente de {type}.",
|
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||||
"addedSuccess": "The {type} was successfully added.",
|
"addedSuccess": "The {type} was successfully added.",
|
||||||
"updatedSuccess": "El {type} fue añadido correctamente."
|
"updatedSuccess": "The {type} was successfully added."
|
||||||
},
|
},
|
||||||
"right": {
|
"right": {
|
||||||
"title": "Permiso",
|
"title": "Permission",
|
||||||
"read": "Solo lectura",
|
"read": "Read only",
|
||||||
"readWrite": "Lectura y escritura",
|
"readWrite": "Read & write",
|
||||||
"admin": "Admin"
|
"admin": "Admin"
|
||||||
},
|
},
|
||||||
"attributes": {
|
"attributes": {
|
||||||
"link": "Enlace",
|
"link": "Link",
|
||||||
"delete": "Eliminar"
|
"delete": "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"
|
||||||
|
},
|
||||||
"gantt": {
|
"gantt": {
|
||||||
"title": "Gantt",
|
"title": "Gantt",
|
||||||
"showTasksWithoutDates": "Mostrar tareas que no tienen fechas establecidas",
|
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||||
"size": "Tamaño",
|
"size": "Size",
|
||||||
"default": "Predeterminado",
|
"default": "Default",
|
||||||
"month": "Mes",
|
"month": "Month",
|
||||||
"day": "Día",
|
"day": "Day",
|
||||||
"hour": "Hora",
|
"hour": "Hour",
|
||||||
"range": "Rango de fechas",
|
"range": "Date Range",
|
||||||
"noDates": "Esta tarea no tiene fechas establecidas."
|
"noDates": "This task has no dates set."
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"title": "Tabla",
|
"title": "Table",
|
||||||
"columns": "Columnas"
|
"columns": "Columns"
|
||||||
},
|
},
|
||||||
"kanban": {
|
"kanban": {
|
||||||
"title": "Kanban",
|
"title": "Kanban",
|
||||||
"limit": "Límite: {limit}",
|
"limit": "Limit: {limit}",
|
||||||
"noLimit": "No Establecido",
|
"noLimit": "Not Set",
|
||||||
"doneBucket": "Contenedor Hecho",
|
"doneBucket": "Done bucket",
|
||||||
"doneBucketHint": "Todas las tareas movidas a este contenedor se marcarán automáticamente como hechas.",
|
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||||
"doneBucketHintExtended": "Todas las tareas que se trasladen al cubo de finalizadas se marcarán como realizadas automáticamente. Todas las tareas marcadas como realizadas desde otro lugar también se moverán.",
|
"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": "El cubo finalizado ha sido guardado correctamente.",
|
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||||
"deleteLast": "No puedes eliminar el último contenedor.",
|
"deleteLast": "You cannot remove the last bucket.",
|
||||||
"addTaskPlaceholder": "Introduce el nuevo título de la tarea…",
|
"addTaskPlaceholder": "Enter the new task title…",
|
||||||
"addTask": "Añadir una tarea",
|
"addTask": "Add a task",
|
||||||
"addAnotherTask": "Añadir otra tarea",
|
"addAnotherTask": "Add another task",
|
||||||
"addBucket": "Crear un nuevo contenedor",
|
"addBucket": "Create a new bucket",
|
||||||
"addBucketPlaceholder": "Introduzca el nuevo título del contenedor…",
|
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||||
"deleteHeaderBucket": "Eliminar el contenedor",
|
"deleteHeaderBucket": "Delete the bucket",
|
||||||
"deleteBucketText1": "¿Estás seguro de que quieres eliminar este contenedor?",
|
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||||
"deleteBucketText2": "Esto no eliminará ninguna tarea pero las moverá al contenedor por defecto.",
|
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||||
"deleteBucketSuccess": "El contenedor se ha eliminado con éxito.",
|
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||||
"bucketTitleSavedSuccess": "El título del contenedor se ha guardado con éxito.",
|
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||||
"bucketLimitSavedSuccess": "El límite del contenedor se ha guardado con éxito.",
|
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||||
"collapse": "Contraer este contenedor"
|
"collapse": "Collapse this bucket"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favoritos"
|
"title": "Favorites"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"namespace": {
|
"namespace": {
|
||||||
"title": "Proyectos y listas",
|
"title": "Namespaces & Projects",
|
||||||
"namespace": "Proyecto",
|
"namespace": "Proyecto",
|
||||||
"showArchived": "Mostrar Archivados",
|
"showArchived": "Mostrar Archivados",
|
||||||
"noneAvailable": "No tienes ningún proyecto en este momento.",
|
"noneAvailable": "No tienes ningún proyecto en este momento.",
|
||||||
"unarchive": "Desarchivar",
|
"unarchive": "Desarchivar",
|
||||||
"archived": "Archivado",
|
"archived": "Archivado",
|
||||||
"noLists": "Este proyecto no contiene ninguna lista.",
|
"noProjects": "This namespace does not contain any projects.",
|
||||||
"createList": "Crear una nueva lista en este proyecto.",
|
"createProject": "Create a new project in this namespace.",
|
||||||
"namespaces": "Proyectos",
|
"namespaces": "Proyectos",
|
||||||
"search": "Escribe para buscar un proyecto…",
|
"search": "Escribe para buscar un proyecto…",
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nuevo proyecto",
|
"title": "Nuevo proyecto",
|
||||||
"titleRequired": "Por favor, especifica un título.",
|
"titleRequired": "Por favor, especifica un título.",
|
||||||
"explanation": "Un proyecto es una colección de listas que puedes compartir y utilizar para organizar tus listas. De hecho, cada lista pertenece a un proyecto.",
|
"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.",
|
||||||
"tooltip": "¿Qué es un proyecto?",
|
"tooltip": "¿Qué es un proyecto?",
|
||||||
"success": "El proyecto se ha creado correctamente."
|
"success": "El proyecto se ha creado correctamente."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"titleArchive": "Archivar \"{namespace}\"",
|
"titleArchive": "Archivar \"{namespace}\"",
|
||||||
"titleUnarchive": "Desarchivar \"{namespace}\"",
|
"titleUnarchive": "Desarchivar \"{namespace}\"",
|
||||||
"archiveText": "No podrás editar este proyecto o crear nuevas listas hasta que no lo desarchives. Esto también archivará todas las listas de este proyecto.",
|
"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": "Podrás crear listas nuevas o editarlas.",
|
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||||
"success": "El proyecto fue archivado con éxito.",
|
"success": "El proyecto fue archivado con éxito.",
|
||||||
"unarchiveSuccess": "El proyecto se ha desarchivado con éxito.",
|
"unarchiveSuccess": "El proyecto se ha desarchivado con éxito.",
|
||||||
"description": "Si un proyecto está archivado, no podrás crear nuevas listas o editarlo."
|
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Eliminar \"{namespace}\"",
|
"title": "Eliminar \"{namespace}\"",
|
||||||
"text1": "¿Estás seguro de que deseas eliminar este proyecto y todo su contenido?",
|
"text1": "¿Estás seguro de que deseas eliminar este proyecto y todo su contenido?",
|
||||||
"text2": "¡Esto incluye todas las listas y tareas y NO SE PUEDE DESHACER!",
|
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||||
"success": "El proyecto se ha eliminado con éxito."
|
"success": "El proyecto se ha eliminado con éxito."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
|
@ -371,8 +371,8 @@
|
||||||
"isArchived": "Este proyecto está archivado"
|
"isArchived": "Este proyecto está archivado"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"sharedLists": {
|
"sharedProjects": {
|
||||||
"title": "Listas compartidas"
|
"title": "Shared Projects"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favoritos"
|
"title": "Favoritos"
|
||||||
|
@ -403,7 +403,7 @@
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "New Saved Filter",
|
"title": "New Saved Filter",
|
||||||
"description": "A saved filter is a virtual list which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
"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.",
|
||||||
"action": "Create new saved filter",
|
"action": "Create new saved filter",
|
||||||
"titleRequired": "Please provide a title for the filter."
|
"titleRequired": "Please provide a title for the filter."
|
||||||
},
|
},
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
"label": {
|
"label": {
|
||||||
"title": "Labels",
|
"title": "Labels",
|
||||||
"manage": "Manage labels",
|
"manage": "Manage labels",
|
||||||
"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 list you have access.",
|
"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.",
|
||||||
"newCTA": "You currently do not have any labels.",
|
"newCTA": "You currently do not have any labels.",
|
||||||
"search": "Type to search for a label…",
|
"search": "Type to search for a label…",
|
||||||
"create": {
|
"create": {
|
||||||
|
@ -460,7 +460,7 @@
|
||||||
},
|
},
|
||||||
"sharing": {
|
"sharing": {
|
||||||
"authenticating": "Authenticating…",
|
"authenticating": "Authenticating…",
|
||||||
"passwordRequired": "This shared list requires a password. Please enter it below:",
|
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||||
"error": "Ha ocurrido un error.",
|
"error": "Ha ocurrido un error.",
|
||||||
"invalidPassword": "La contraseña es inválida."
|
"invalidPassword": "La contraseña es inválida."
|
||||||
},
|
},
|
||||||
|
@ -529,7 +529,7 @@
|
||||||
"code": "Código",
|
"code": "Código",
|
||||||
"quote": "Cita",
|
"quote": "Cita",
|
||||||
"unorderedList": "Lista no ordenada",
|
"unorderedList": "Lista no ordenada",
|
||||||
"orderedList": "Lista ordenada",
|
"orderedList ": "Ordered List",
|
||||||
"cleanBlock": "Borrar Bloque",
|
"cleanBlock": "Borrar Bloque",
|
||||||
"link": "Enlace",
|
"link": "Enlace",
|
||||||
"image": "Imagen",
|
"image": "Imagen",
|
||||||
|
@ -602,6 +602,7 @@
|
||||||
"addReminder": "Add a new reminder…",
|
"addReminder": "Add a new reminder…",
|
||||||
"doneSuccess": "La tarea fue marcada con éxito como realizada.",
|
"doneSuccess": "La tarea fue marcada con éxito como realizada.",
|
||||||
"undoneSuccess": "La tarea fue marcada correctamente como incompleta.",
|
"undoneSuccess": "La tarea fue marcada correctamente como incompleta.",
|
||||||
|
"undo": "Undo",
|
||||||
"openDetail": "Open task detail view",
|
"openDetail": "Open task detail view",
|
||||||
"checklistTotal": "{checked} of {total} tasks",
|
"checklistTotal": "{checked} of {total} tasks",
|
||||||
"checklistAllDone": "{total} tasks",
|
"checklistAllDone": "{total} tasks",
|
||||||
|
@ -618,7 +619,7 @@
|
||||||
"chooseDueDate": "Click here to set a due date",
|
"chooseDueDate": "Click here to set a due date",
|
||||||
"chooseStartDate": "Click here to set a start date",
|
"chooseStartDate": "Click here to set a start date",
|
||||||
"chooseEndDate": "Click here to set an end date",
|
"chooseEndDate": "Click here to set an end date",
|
||||||
"move": "Move task to a different list",
|
"move": "Move task to a different project",
|
||||||
"done": "Mark task done!",
|
"done": "Mark task done!",
|
||||||
"undone": "Mark as undone",
|
"undone": "Mark as undone",
|
||||||
"created": "Created {0} by {1}",
|
"created": "Created {0} by {1}",
|
||||||
|
@ -626,7 +627,7 @@
|
||||||
"doneAt": "Done {0}",
|
"doneAt": "Done {0}",
|
||||||
"updateSuccess": "The task was saved successfully.",
|
"updateSuccess": "The task was saved successfully.",
|
||||||
"deleteSuccess": "La tarea se ha eliminado con éxito.",
|
"deleteSuccess": "La tarea se ha eliminado con éxito.",
|
||||||
"belongsToList": "This task belongs to list '{list}'",
|
"belongsToProject": "This task belongs to project '{project}'",
|
||||||
"due": "Due {at}",
|
"due": "Due {at}",
|
||||||
"closePopup": "Close popup",
|
"closePopup": "Close popup",
|
||||||
"delete": {
|
"delete": {
|
||||||
|
@ -646,7 +647,7 @@
|
||||||
"percentDone": "Definir Progreso",
|
"percentDone": "Definir Progreso",
|
||||||
"attachments": "Añadir Adjuntos",
|
"attachments": "Añadir Adjuntos",
|
||||||
"relatedTasks": "Añadir una Relación",
|
"relatedTasks": "Añadir una Relación",
|
||||||
"moveList": "Mover",
|
"moveProject": "Move",
|
||||||
"color": "Definir Color",
|
"color": "Definir Color",
|
||||||
"delete": "Eliminar",
|
"delete": "Eliminar",
|
||||||
"favorite": "Añadir a Favoritos",
|
"favorite": "Añadir a Favoritos",
|
||||||
|
@ -673,21 +674,21 @@
|
||||||
"updated": "Actualizado"
|
"updated": "Actualizado"
|
||||||
},
|
},
|
||||||
"subscription": {
|
"subscription": {
|
||||||
"subscribedListThroughParentNamespace": "No puede cancelar la suscripción aquí porque está suscrito a esta lista a través de su proyecto.",
|
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||||
"subscribedTaskThroughParentNamespace": "No puede cancelar la suscripción aquí porque está suscrito a esta tarea a través de su proyecto.",
|
"subscribedTaskThroughParentNamespace": "No puede cancelar la suscripción aquí porque está suscrito a esta tarea a través de su proyecto.",
|
||||||
"subscribedTaskThroughParentList": "No puedes darte de baja aquí porque estás suscrito a esta tarea a través de su lista.",
|
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||||
"subscribedNamespace": "Actualmente está suscrito a este proyecto y recibirás notificaciones de cambios.",
|
"subscribedNamespace": "Actualmente está suscrito a este proyecto y recibirás notificaciones de cambios.",
|
||||||
"notSubscribedNamespace": "No está suscrito a este proyecto y no recibirá notificaciones de cambios.",
|
"notSubscribedNamespace": "No está suscrito a este proyecto y no recibirá notificaciones de cambios.",
|
||||||
"subscribedList": "Actualmente estás suscrito a esta lista y recibirás notificaciones de cambios.",
|
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||||
"notSubscribedList": "No estás suscrito a esta lista y no recibirás notificaciones de cambios.",
|
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||||
"subscribedTask": "Actualmente estás suscrito a esta tarea y recibirás notificaciones de cambios.",
|
"subscribedTask": "Actualmente estás suscrito a esta tarea y recibirás notificaciones de cambios.",
|
||||||
"notSubscribedTask": "No estás suscrito a esta tarea y no recibirás notificaciones de cambios.",
|
"notSubscribedTask": "No estás suscrito a esta tarea y no recibirás notificaciones de cambios.",
|
||||||
"subscribe": "Suscribirse",
|
"subscribe": "Suscribirse",
|
||||||
"unsubscribe": "Desuscribirse",
|
"unsubscribe": "Desuscribirse",
|
||||||
"subscribeSuccessNamespace": "Ahora está suscrito a este proyecto",
|
"subscribeSuccessNamespace": "Ahora está suscrito a este proyecto",
|
||||||
"unsubscribeSuccessNamespace": "Ya no está suscrito a este proyecto",
|
"unsubscribeSuccessNamespace": "Ya no está suscrito a este proyecto",
|
||||||
"subscribeSuccessList": "Ahora estás suscrito a esta lista",
|
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||||
},
|
},
|
||||||
|
@ -761,7 +762,7 @@
|
||||||
"new": "Nueva Tarea Relacionada",
|
"new": "Nueva Tarea Relacionada",
|
||||||
"searchPlaceholder": "Escriba para buscar una nueva tarea a añadir como relacionada…",
|
"searchPlaceholder": "Escriba para buscar una nueva tarea a añadir como relacionada…",
|
||||||
"createPlaceholder": "Añadir esto como nueva tarea relacionada",
|
"createPlaceholder": "Añadir esto como nueva tarea relacionada",
|
||||||
"differentList": "Esta tarea pertenece a una lista diferente.",
|
"differentProject": "This task belongs to a different project.",
|
||||||
"differentNamespace": "Esta tarea pertenece a un proyecto diferente.",
|
"differentNamespace": "Esta tarea pertenece a un proyecto diferente.",
|
||||||
"noneYet": "Aún no hay tareas relacionadas.",
|
"noneYet": "Aún no hay tareas relacionadas.",
|
||||||
"delete": "Eliminar Relación de Tarea",
|
"delete": "Eliminar Relación de Tarea",
|
||||||
|
@ -811,10 +812,10 @@
|
||||||
"priority1": "Para establecer la prioridad de una tarea, agregue un número 1-5, prefijado por {prefix}.",
|
"priority1": "Para establecer la prioridad de una tarea, agregue un número 1-5, prefijado por {prefix}.",
|
||||||
"priority2": "The higher the number, the higher the priority.",
|
"priority2": "The higher the number, the higher the priority.",
|
||||||
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
||||||
"list1": "To set a list for the task to appear in, enter its name prefixed with {prefix}.",
|
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||||
"list2": "This will return an error if the list does not exist.",
|
"project2": "This will return an error if the project does not exist.",
|
||||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||||
"list4": "For example: {prefix}\"List with spaces\".",
|
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||||
"dateAndTime": "Date and time",
|
"dateAndTime": "Date and time",
|
||||||
"date": "Any date will be used as the due date of the new task. You can use dates in any of these formats:",
|
"date": "Any date will be used as the due date of the new task. You can use dates in any of these formats:",
|
||||||
"dateWeekday": "any weekday, will use the next date with that date",
|
"dateWeekday": "any weekday, will use the next date with that date",
|
||||||
|
@ -847,19 +848,19 @@
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Delete the team",
|
"header": "Delete the team",
|
||||||
"text1": "Are you sure you want to delete this team and all of its members?",
|
"text1": "Are you sure you want to delete this team and all of its members?",
|
||||||
"text2": "All team members will lose access to lists and namespaces shared with this team. This CANNOT BE UNDONE!",
|
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||||
"success": "El equipo fue eliminado con éxito."
|
"success": "El equipo fue eliminado con éxito."
|
||||||
},
|
},
|
||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"header": "Remove a user from the team",
|
"header": "Remove a user from the team",
|
||||||
"text1": "Are you sure you want to remove this user from the team?",
|
"text1": "Are you sure you want to remove this user from the team?",
|
||||||
"text2": "They will lose access to all lists and namespaces this team has access to. This CANNOT BE UNDONE!",
|
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||||
"success": "El usuario fue quitado del equipo con éxito."
|
"success": "El usuario fue quitado del equipo con éxito."
|
||||||
},
|
},
|
||||||
"leave": {
|
"leave": {
|
||||||
"title": "Leave team",
|
"title": "Leave team",
|
||||||
"text1": "Are you sure you want to leave this team?",
|
"text1": "Are you sure you want to leave this team?",
|
||||||
"text2": "You will lose access to all lists and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
"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.",
|
||||||
"success": "Has abandonado el equipo con éxito."
|
"success": "Has abandonado el equipo con éxito."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -891,22 +892,22 @@
|
||||||
"attachment": "Añadir un adjunto a esta tarea",
|
"attachment": "Añadir un adjunto a esta tarea",
|
||||||
"related": "Modificar tareas relacionadas de esta tarea",
|
"related": "Modificar tareas relacionadas de esta tarea",
|
||||||
"color": "Cambia el color de esta tarea",
|
"color": "Cambia el color de esta tarea",
|
||||||
"move": "Mover esta tarea a otra lista",
|
"move": "Move this task to another project",
|
||||||
"reminder": "Administrar recordatorios de esta tarea",
|
"reminder": "Administrar recordatorios de esta tarea",
|
||||||
"description": "Editar la descripción de la tarea"
|
"description": "Editar la descripción de la tarea"
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"title": "Lista de vistas",
|
"title": "Project Views",
|
||||||
"switchToListView": "Cambiar a vista de lista",
|
"switchToListView": "Switch to list view",
|
||||||
"switchToGanttView": "Cambiar a vista gantt",
|
"switchToGanttView": "Switch to gantt view",
|
||||||
"switchToKanbanView": "Cambiar a vista kanban",
|
"switchToKanbanView": "Switch to kanban view",
|
||||||
"switchToTableView": "Cambiar a vista de tabla"
|
"switchToTableView": "Switch to table view"
|
||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"title": "Secciones",
|
"title": "Secciones",
|
||||||
"overview": "Ir a resumen",
|
"overview": "Ir a resumen",
|
||||||
"upcoming": "Ir a tareas próximas",
|
"upcoming": "Ir a tareas próximas",
|
||||||
"namespaces": "Ir a proyectos y listas",
|
"namespaces": "Navigate to namespaces & projects",
|
||||||
"labels": "Ir a etiquetas",
|
"labels": "Ir a etiquetas",
|
||||||
"teams": "Ir a equipos"
|
"teams": "Ir a equipos"
|
||||||
}
|
}
|
||||||
|
@ -923,7 +924,7 @@
|
||||||
"unarchive": "Desarchivar",
|
"unarchive": "Desarchivar",
|
||||||
"setBackground": "Establecer fondo",
|
"setBackground": "Establecer fondo",
|
||||||
"share": "Compartir",
|
"share": "Compartir",
|
||||||
"newList": "Nueva lista"
|
"newProject": "New project"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"url": "URL de Vikunja",
|
"url": "URL de Vikunja",
|
||||||
|
@ -942,24 +943,24 @@
|
||||||
"notification": {
|
"notification": {
|
||||||
"title": "Notificaciones",
|
"title": "Notificaciones",
|
||||||
"none": "No tienes notificaciones. ¡Que tengas un buen día!",
|
"none": "No tienes notificaciones. ¡Que tengas un buen día!",
|
||||||
"explainer": "Notifications will appear here when actions on namespaces, lists or tasks you subscribed to happen."
|
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||||
},
|
},
|
||||||
"quickActions": {
|
"quickActions": {
|
||||||
"commands": "Commands",
|
"commands": "Commands",
|
||||||
"placeholder": "Type a command or search…",
|
"placeholder": "Type a command or search…",
|
||||||
"hint": "You can use {list} to limit the search to a list. Combine {list} or {label} (labels) with a search query to search for a task with these labels or on that list. Use {assignee} to only search for teams.",
|
"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.",
|
||||||
"tasks": "Tasks",
|
"tasks": "Tasks",
|
||||||
"lists": "Lists",
|
"projects": "Projects",
|
||||||
"teams": "Teams",
|
"teams": "Teams",
|
||||||
"newList": "Enter the title of the new list…",
|
"newProject": "Enter the title of the new project…",
|
||||||
"newTask": "Enter the title of the new task…",
|
"newTask": "Enter the title of the new task…",
|
||||||
"newNamespace": "Enter the title of the new namespace…",
|
"newNamespace": "Enter the title of the new namespace…",
|
||||||
"newTeam": "Enter the name of the new team…",
|
"newTeam": "Enter the name of the new team…",
|
||||||
"createTask": "Create a task in the current list ({title})",
|
"createTask": "Create a task in the current project ({title})",
|
||||||
"createList": "Create a list in the current namespace ({title})",
|
"createProject": "Create a project in the current namespace ({title})",
|
||||||
"cmds": {
|
"cmds": {
|
||||||
"newTask": "New task",
|
"newTask": "New task",
|
||||||
"newList": "New list",
|
"newProject": "New project",
|
||||||
"newNamespace": "New namespace",
|
"newNamespace": "New namespace",
|
||||||
"newTeam": "New team"
|
"newTeam": "New team"
|
||||||
}
|
}
|
||||||
|
@ -991,15 +992,15 @@
|
||||||
"1018": "The user avatar type setting is invalid.",
|
"1018": "The user avatar type setting is invalid.",
|
||||||
"2001": "ID cannot be empty or 0.",
|
"2001": "ID cannot be empty or 0.",
|
||||||
"2002": "Some of the request data was invalid.",
|
"2002": "Some of the request data was invalid.",
|
||||||
"3001": "The list does not exist.",
|
"3001": "The project does not exist.",
|
||||||
"3004": "You need to have read permissions on that list to perform that action.",
|
"3004": "You need to have read permissions on that project to perform that action.",
|
||||||
"3005": "The list title cannot be empty.",
|
"3005": "The project title cannot be empty.",
|
||||||
"3006": "The list share does not exist.",
|
"3006": "The project share does not exist.",
|
||||||
"3007": "A list with this identifier already exists.",
|
"3007": "A project with this identifier already exists.",
|
||||||
"3008": "The list is archived and can therefore only be accessed read only. This is also true for all tasks associated with this list.",
|
"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 list task text cannot be empty.",
|
"4001": "The project task text cannot be empty.",
|
||||||
"4002": "The list task does not exist.",
|
"4002": "The project task does not exist.",
|
||||||
"4003": "All bulk editing tasks must belong to the same list.",
|
"4003": "All bulk editing tasks must belong to the same project.",
|
||||||
"4004": "Se necesita al menos una tarea cuando se editan tareas masivamente.",
|
"4004": "Se necesita al menos una tarea cuando se editan tareas masivamente.",
|
||||||
"4005": "No tiene permiso para ver la tarea.",
|
"4005": "No tiene permiso para ver la tarea.",
|
||||||
"4006": "No se puede establecer como tarea padre la propia tarea.",
|
"4006": "No se puede establecer como tarea padre la propia tarea.",
|
||||||
|
@ -1025,21 +1026,21 @@
|
||||||
"5012": "El proyecto está archivado y por lo tanto solo podrá acceder en modo solo lectura.",
|
"5012": "El proyecto está archivado y por lo tanto solo podrá acceder en modo solo lectura.",
|
||||||
"6001": "El nombre del equipo no puede estar vacío.",
|
"6001": "El nombre del equipo no puede estar vacío.",
|
||||||
"6002": "Este equipo no existe.",
|
"6002": "Este equipo no existe.",
|
||||||
"6004": "El equipo ya tiene acceso a ese proyecto o lista.",
|
"6004": "The team already has access to that namespace or project.",
|
||||||
"6005": "El usuario ya es miembro de ese equipo.",
|
"6005": "El usuario ya es miembro de ese equipo.",
|
||||||
"6006": "No se puede quitar al último miembro del equipo.",
|
"6006": "No se puede quitar al último miembro del equipo.",
|
||||||
"6007": "El equipo no tiene acceso a la lista para realizar esa acción.",
|
"6007": "The team does not have access to the project to perform that action.",
|
||||||
"7002": "El usuario ya tiene acceso a esa lista.",
|
"7002": "The user already has access to that project.",
|
||||||
"7003": "No tiene acceso a esta lista.",
|
"7003": "You do not have access to that project.",
|
||||||
"8001": "Esta etiqueta ya existe en esta tarea.",
|
"8001": "Esta etiqueta ya existe en esta tarea.",
|
||||||
"8002": "La etiqueta no existe.",
|
"8002": "La etiqueta no existe.",
|
||||||
"8003": "No tiene acceso a esta etiqueta.",
|
"8003": "No tiene acceso a esta etiqueta.",
|
||||||
"9001": "El permiso es inválido.",
|
"9001": "El permiso es inválido.",
|
||||||
"10001": "El contenedor no existe.",
|
"10001": "El contenedor no existe.",
|
||||||
"10002": "El contenedor no pertenece a esa lista.",
|
"10002": "The bucket does not belong to that project.",
|
||||||
"10003": "No puede eliminar el último contenedor de una lista.",
|
"10003": "You cannot remove the last bucket on a project.",
|
||||||
"10004": "No se puede añadir la tarea a este contenedor, ya que ya ha superado el límite de tareas establecido.",
|
"10004": "No se puede añadir la tarea a este contenedor, ya que ya ha superado el límite de tareas establecido.",
|
||||||
"10005": "Solo puede haber un contenedor hecho por lista.",
|
"10005": "There can be only one done bucket per project.",
|
||||||
"11001": "El filtro guardado no existe.",
|
"11001": "El filtro guardado no existe.",
|
||||||
"11002": "Los filtros guardados no están disponibles para enlaces compartidos.",
|
"11002": "Los filtros guardados no están disponibles para enlaces compartidos.",
|
||||||
"12001": "El tipo de entidad de suscripción es inválido.",
|
"12001": "El tipo de entidad de suscripción es inválido.",
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
"welcomeDay": "Hi {username}!",
|
"welcomeDay": "Hi {username}!",
|
||||||
"welcomeEvening": "Good Evening {username}!",
|
"welcomeEvening": "Good Evening {username}!",
|
||||||
"lastViewed": "Dernière consultation",
|
"lastViewed": "Dernière consultation",
|
||||||
"list": {
|
"project": {
|
||||||
"newText": "Tu peux créer une nouvelle liste pour tes nouvelles tâches :",
|
"newText": "You can create a new project for your new tasks:",
|
||||||
"new": "Nouvelle liste",
|
"new": "New project",
|
||||||
"importText": "Ou importe tes listes et tâches d’autres services dans Vikunja :",
|
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||||
"import": "Importer tes données dans Vikunja"
|
"import": "Import your data into Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"404": {
|
"404": {
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
"weekStartSunday": "dimanche",
|
"weekStartSunday": "dimanche",
|
||||||
"weekStartMonday": "lundi",
|
"weekStartMonday": "lundi",
|
||||||
"language": "Langue",
|
"language": "Langue",
|
||||||
"defaultList": "Liste par défaut",
|
"defaultProject": "Default Project",
|
||||||
"timezone": "Fuseau horaire",
|
"timezone": "Fuseau horaire",
|
||||||
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
||||||
},
|
},
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
},
|
},
|
||||||
"deletion": {
|
"deletion": {
|
||||||
"title": "Supprimer ton compte Vikunja",
|
"title": "Supprimer ton compte Vikunja",
|
||||||
"text1": "La suppression de ton compte est permanente et ne peut pas être annulée. Nous supprimerons tous tes espaces de noms, listes, tâches et tout ce qui y est associés.",
|
"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.",
|
||||||
"text2": "Pour continuer, entre ton mot de passe. Tu recevras un courriel contenant les instructions suivantes.",
|
"text2": "Pour continuer, entre ton mot de passe. Tu recevras un courriel contenant les instructions suivantes.",
|
||||||
"confirm": "Supprimer mon compte",
|
"confirm": "Supprimer mon compte",
|
||||||
"requestSuccess": "La demande a réussi. Tu recevras un courriel avec des instructions supplémentaires.",
|
"requestSuccess": "La demande a réussi. Tu recevras un courriel avec des instructions supplémentaires.",
|
||||||
|
@ -157,201 +157,201 @@
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"title": "Exporter tes données Vikunja",
|
"title": "Exporter tes données Vikunja",
|
||||||
"description": "Tu peux demander une copie de toutes tes données de Vikunja. Ceci inclut les espaces de noms, les listes, les tâches et tout ce qui leur est associé. Tu peux importer ces données dans n'importe quelle instance de Vikunja par le biais de la fonction migration.",
|
"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.",
|
||||||
"descriptionPasswordRequired": "Entre ton mot de passe pour continuer :",
|
"descriptionPasswordRequired": "Entre ton mot de passe pour continuer :",
|
||||||
"request": "Demander une copie de mes données Vikunja",
|
"request": "Demander une copie de mes données Vikunja",
|
||||||
"success": "Tu as bien demandé tes données Vikunja ! Nous t'enverrons un courriel dès qu'elles seront prêtes à être téléchargées.",
|
"success": "Tu as bien demandé tes données Vikunja ! Nous t'enverrons un courriel dès qu'elles seront prêtes à être téléchargées.",
|
||||||
"downloadTitle": "Télécharger tes données exportées de Vikunja"
|
"downloadTitle": "Télécharger tes données exportées de Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"archived": "Cette liste est archivée. Il n’est pas possible d’y créer de nouvelles tâches ou de les modifier.",
|
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||||
"title": "Nom de la liste",
|
"title": "Project Title",
|
||||||
"color": "Couleur",
|
"color": "Color",
|
||||||
"lists": "Listes",
|
"projects": "Projects",
|
||||||
"list": {
|
"search": "Type to search for a project…",
|
||||||
"title": "Liste",
|
"searchSelect": "Click or press enter to select this project",
|
||||||
"add": "Ajouter",
|
"shared": "Shared Projects",
|
||||||
"addPlaceholder": "Ajouter une nouvelle tâche…",
|
"noDescriptionAvailable": "No project description is available.",
|
||||||
"empty": "Cette liste est actuellement vide.",
|
|
||||||
"newTaskCta": "Créer une nouvelle tâche.",
|
|
||||||
"editTask": "Modifier la tâche"
|
|
||||||
},
|
|
||||||
"search": "Écris pour rechercher une liste…",
|
|
||||||
"searchSelect": "Clique ou appuie sur la touche Entrée pour sélectionner cette liste",
|
|
||||||
"shared": "Listes partagées",
|
|
||||||
"noDescriptionAvailable": "No list description is available.",
|
|
||||||
"create": {
|
"create": {
|
||||||
"header": "Nouvelle liste",
|
"header": "New project",
|
||||||
"titlePlaceholder": "Entre le nom de la liste…",
|
"titlePlaceholder": "The project's title goes here…",
|
||||||
"addTitleRequired": "Indique un nom.",
|
"addTitleRequired": "Please specify a title.",
|
||||||
"createdSuccess": "Liste créée.",
|
"createdSuccess": "The project was successfully created.",
|
||||||
"addListRequired": "Indique une liste ou définis une liste par défaut dans les paramètres."
|
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"title": "Archiver « {list} »",
|
"title": "Archive \"{project}\"",
|
||||||
"archive": "Archiver cette liste",
|
"archive": "Archive this project",
|
||||||
"unarchive": "Désarchiver cette liste",
|
"unarchive": "Un-Archive this project",
|
||||||
"unarchiveText": "Tu pourras créer de nouvelles tâches ou les modifier.",
|
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||||
"archiveText": "Tu ne pourras pas modifier cette liste ni créer de nouvelles tâches tant que tu ne l’auras pas désarchivée.",
|
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||||
"success": "Liste archivée."
|
"success": "The project was successfully archived."
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
"title": "Définir l’arrière-plan de la liste",
|
"title": "Set project background",
|
||||||
"remove": "Retirer l’arrière-plan",
|
"remove": "Remove Background",
|
||||||
"upload": "Choisis un arrière-plan depuis ton ordinateur",
|
"upload": "Choose a background from your pc",
|
||||||
"searchPlaceholder": "Rechercher un arrière-plan…",
|
"searchPlaceholder": "Search for a background…",
|
||||||
"poweredByUnsplash": "Propulsé par Unsplash",
|
"poweredByUnsplash": "Powered by Unsplash",
|
||||||
"loadMore": "Charger plus de photos",
|
"loadMore": "Load more photos",
|
||||||
"success": "Arrière-plan défini.",
|
"success": "The background has been set successfully!",
|
||||||
"removeSuccess": "Arrière-plan supprimé."
|
"removeSuccess": "The background has been removed successfully!"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Supprimer « {list} »",
|
"title": "Delete \"{project}\"",
|
||||||
"header": "Supprimer cette liste",
|
"header": "Delete this project",
|
||||||
"text1": "Supprimer cette liste et tout son contenu ?",
|
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||||
"text2": "Ceci inclut toutes les tâches et ne peut pas être annulé !",
|
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Liste supprimée.",
|
"success": "The project was successfully deleted.",
|
||||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||||
"noTasksToDelete": "This list does not contain any tasks, it should be safe to delete."
|
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||||
},
|
},
|
||||||
"duplicate": {
|
"duplicate": {
|
||||||
"title": "Dupliquer cette liste",
|
"title": "Duplicate this project",
|
||||||
"label": "Dupliquer",
|
"label": "Duplicate",
|
||||||
"text": "Sélectionne un espace de noms qui doit contenir la liste dupliquée :",
|
"text": "Select a namespace which should hold the duplicated project:",
|
||||||
"success": "Liste dupliquée."
|
"success": "The project was successfully duplicated."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"header": "Modifier cette liste",
|
"header": "Edit This Project",
|
||||||
"title": "Modifier « {list} »",
|
"title": "Edit \"{project}\"",
|
||||||
"titlePlaceholder": "Entre le nom de la liste…",
|
"titlePlaceholder": "The project title goes here…",
|
||||||
"identifierTooltip": "L’identifiant de liste peut être utilisé pour identifier de manière unique une tâche dans toutes les listes. Tu peux le régler sur vide pour le désactiver.",
|
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||||
"identifier": "Identifiant de la liste",
|
"identifier": "Project Identifier",
|
||||||
"identifierPlaceholder": "L’identifiant de la liste va ici…",
|
"identifierPlaceholder": "The project identifier goes here…",
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "Entre la description de la liste…",
|
"descriptionPlaceholder": "The projects description goes here…",
|
||||||
"color": "Couleur",
|
"color": "Color",
|
||||||
"success": "Liste mise à jour."
|
"success": "The project was successfully updated."
|
||||||
},
|
},
|
||||||
"share": {
|
"share": {
|
||||||
"header": "Partager cette liste",
|
"header": "Share this project",
|
||||||
"title": "Partager « {list} »",
|
"title": "Share \"{project}\"",
|
||||||
"share": "Partager",
|
"share": "Share",
|
||||||
"links": {
|
"links": {
|
||||||
"title": "Liens de partage",
|
"title": "Share Links",
|
||||||
"what": "Qu’est-ce qu’un lien de partage ?",
|
"what": "What is a share link?",
|
||||||
"explanation": "Permet de partager une liste avec les personnes qui n’ont pas de compte sur Vikunja.",
|
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||||
"create": "Créer un nouveau lien de partage",
|
"create": "Create a new link share",
|
||||||
"name": "Nom (facultatif)",
|
"name": "Name (optional)",
|
||||||
"namePlaceholder": "p. ex. Lorem Ipsum",
|
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||||
"nameExplanation": "Toutes les actions effectuées par ce partage de lien apparaîtront avec le nom.",
|
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||||
"password": "Mot de passe (facultatif)",
|
"password": "Password (optional)",
|
||||||
"passwordExplanation": "L’utilisateur·rice doit saisir ce mot de passe pour se connecter.",
|
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||||
"noName": "Aucun nom défini",
|
"noName": "No name set",
|
||||||
"remove": "Retirer un lien de partage",
|
"remove": "Remove a link share",
|
||||||
"removeText": "Retirer ce partage de lien ? Il ne sera plus possible d’accéder à cette liste avec ce partage de lien. Cette opération ne peut être annulée !",
|
"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": "Partage créé.",
|
"createSuccess": "The link share was successfully created.",
|
||||||
"deleteSuccess": "Lien supprimé",
|
"deleteSuccess": "The link share was successfully deleted",
|
||||||
"view": "View",
|
"view": "View",
|
||||||
"sharedBy": "Shared by {0}"
|
"sharedBy": "Shared by {0}"
|
||||||
},
|
},
|
||||||
"userTeam": {
|
"userTeam": {
|
||||||
"typeUser": "utilisateur·rice | utilisateur·rice·s",
|
"typeUser": "user | users",
|
||||||
"typeTeam": "équipe | équipes",
|
"typeTeam": "team | teams",
|
||||||
"shared": "Partagé avec ces {type}",
|
"shared": "Shared with these {type}",
|
||||||
"you": "Toi",
|
"you": "You",
|
||||||
"notShared": "Pas encore partagé avec des {type}.",
|
"notShared": "Not shared with any {type} yet.",
|
||||||
"removeHeader": "Retirer un {type} de la liste {sharable}",
|
"removeHeader": "Remove a {type} from the {sharable}",
|
||||||
"removeText": "Retirer ce {sharable} du {type} ? Ceci ne peut pas être annulé !",
|
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||||
"removeSuccess": "{sharable} retiré de {type}.",
|
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||||
"addedSuccess": "{type} ajouté.",
|
"addedSuccess": "The {type} was successfully added.",
|
||||||
"updatedSuccess": "{type} ajouté."
|
"updatedSuccess": "The {type} was successfully added."
|
||||||
},
|
},
|
||||||
"right": {
|
"right": {
|
||||||
"title": "Permission",
|
"title": "Permission",
|
||||||
"read": "Lecture seule",
|
"read": "Read only",
|
||||||
"readWrite": "Lecture et écriture",
|
"readWrite": "Read & write",
|
||||||
"admin": "Admin"
|
"admin": "Admin"
|
||||||
},
|
},
|
||||||
"attributes": {
|
"attributes": {
|
||||||
"link": "Lien",
|
"link": "Link",
|
||||||
"delete": "Supprimer"
|
"delete": "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"
|
||||||
|
},
|
||||||
"gantt": {
|
"gantt": {
|
||||||
"title": "Gantt",
|
"title": "Gantt",
|
||||||
"showTasksWithoutDates": "Afficher les tâches pour lesquelles aucune date n’a été fixée",
|
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||||
"size": "Taille",
|
"size": "Size",
|
||||||
"default": "Par défaut",
|
"default": "Default",
|
||||||
"month": "Mois",
|
"month": "Month",
|
||||||
"day": "Jour",
|
"day": "Day",
|
||||||
"hour": "Hour",
|
"hour": "Hour",
|
||||||
"range": "Date Range",
|
"range": "Date Range",
|
||||||
"noDates": "Aucune date n’a été fixée pour cette tâche."
|
"noDates": "This task has no dates set."
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"title": "Tableau",
|
"title": "Table",
|
||||||
"columns": "Colonnes"
|
"columns": "Columns"
|
||||||
},
|
},
|
||||||
"kanban": {
|
"kanban": {
|
||||||
"title": "Kanban",
|
"title": "Kanban",
|
||||||
"limit": "Limite : {limit}",
|
"limit": "Limit: {limit}",
|
||||||
"noLimit": "Non défini",
|
"noLimit": "Not Set",
|
||||||
"doneBucket": "Seau des terminés",
|
"doneBucket": "Done bucket",
|
||||||
"doneBucketHint": "Toutes les tâches déplacées dans ce seau seront automatiquement marquées comme faites.",
|
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||||
"doneBucketHintExtended": "Toutes les tâches déplacées dans le seau des choses terminées seront marquées comme terminées automatiquement. Toutes les tâches marquées comme terminées ailleurs seront également déplacées.",
|
"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": "Seau des terminés enregistré.",
|
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||||
"deleteLast": "Tu ne peux pas supprimer le dernier seau.",
|
"deleteLast": "You cannot remove the last bucket.",
|
||||||
"addTaskPlaceholder": "Entre le nom de la tâche…",
|
"addTaskPlaceholder": "Enter the new task title…",
|
||||||
"addTask": "Ajouter une tâche",
|
"addTask": "Add a task",
|
||||||
"addAnotherTask": "Ajouter une autre tâche",
|
"addAnotherTask": "Add another task",
|
||||||
"addBucket": "Créer un nouveau seau",
|
"addBucket": "Create a new bucket",
|
||||||
"addBucketPlaceholder": "Entre le nouveau nom du seau…",
|
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||||
"deleteHeaderBucket": "Supprimer le seau",
|
"deleteHeaderBucket": "Delete the bucket",
|
||||||
"deleteBucketText1": "Supprimer ce seau ?",
|
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||||
"deleteBucketText2": "Ceci ne supprimera pas les tâches mais les déplacera dans le seau par défaut.",
|
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||||
"deleteBucketSuccess": "Seau supprimé.",
|
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||||
"bucketTitleSavedSuccess": "Nom du seau enregistré.",
|
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||||
"bucketLimitSavedSuccess": "Limite du seau enregistrée.",
|
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||||
"collapse": "Réduire ce seau"
|
"collapse": "Collapse this bucket"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favoris"
|
"title": "Favorites"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"namespace": {
|
"namespace": {
|
||||||
"title": "Espaces de noms et listes",
|
"title": "Namespaces & Projects",
|
||||||
"namespace": "Espace de noms",
|
"namespace": "Espace de noms",
|
||||||
"showArchived": "Montrer les archivés",
|
"showArchived": "Montrer les archivés",
|
||||||
"noneAvailable": "Tu n’as pas d’espace de noms pour le moment.",
|
"noneAvailable": "Tu n’as pas d’espace de noms pour le moment.",
|
||||||
"unarchive": "Désarchiver",
|
"unarchive": "Désarchiver",
|
||||||
"archived": "Archivé",
|
"archived": "Archivé",
|
||||||
"noLists": "Cet espace de noms ne contient pas de listes.",
|
"noProjects": "This namespace does not contain any projects.",
|
||||||
"createList": "Créer une nouvelle liste dans cet espace de noms.",
|
"createProject": "Create a new project in this namespace.",
|
||||||
"namespaces": "Espaces de noms",
|
"namespaces": "Espaces de noms",
|
||||||
"search": "Écris pour rechercher un espace de noms…",
|
"search": "Écris pour rechercher un espace de noms…",
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nouvel espace de noms",
|
"title": "Nouvel espace de noms",
|
||||||
"titleRequired": "Indique un nom.",
|
"titleRequired": "Indique un nom.",
|
||||||
"explanation": "A namespace is a collection of lists you can share and use to organize your lists with. In fact, every list belongs to a namespace.",
|
"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.",
|
||||||
"tooltip": "Qu’est-ce qu’un espace de noms ?",
|
"tooltip": "Qu’est-ce qu’un espace de noms ?",
|
||||||
"success": "Espace de noms créé."
|
"success": "Espace de noms créé."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"titleArchive": "Archiver « {namespace} »",
|
"titleArchive": "Archiver « {namespace} »",
|
||||||
"titleUnarchive": "Désarchiver « {namespace} »",
|
"titleUnarchive": "Désarchiver « {namespace} »",
|
||||||
"archiveText": "Tu ne pourras pas modifier cet espace de noms ou créer de nouvelles listes tant que tu ne l’auras pas désarchivé. Ceci archivera également toutes les listes de cet espace de noms.",
|
"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": "Tu pourras créer de nouvelles listes ou les modifier.",
|
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||||
"success": "Espace de noms archivé.",
|
"success": "Espace de noms archivé.",
|
||||||
"unarchiveSuccess": "Espace de noms archivé.",
|
"unarchiveSuccess": "Espace de noms archivé.",
|
||||||
"description": "L’archivage d’un espace de noms signifie qu’on ne peut pas créer de nouvelles listes dans cet espace, ni le modifier."
|
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Supprimer « {namespace} »",
|
"title": "Supprimer « {namespace} »",
|
||||||
"text1": "Supprimer cet espace de noms et tout son contenu ?",
|
"text1": "Supprimer cet espace de noms et tout son contenu ?",
|
||||||
"text2": "Ceci inclut toutes les listes et les tâches et ne peut être annulé !",
|
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Espace de noms supprimé."
|
"success": "Espace de noms supprimé."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
|
@ -371,8 +371,8 @@
|
||||||
"isArchived": "Cet espace de noms est archivé"
|
"isArchived": "Cet espace de noms est archivé"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"sharedLists": {
|
"sharedProjects": {
|
||||||
"title": "Listes partagées"
|
"title": "Shared Projects"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favoris"
|
"title": "Favoris"
|
||||||
|
@ -403,7 +403,7 @@
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nouveau filtre enregistré",
|
"title": "Nouveau filtre enregistré",
|
||||||
"description": "Un filtre enregistré est une liste virtuelle qui est calculée à partir d’un ensemble de filtres à chaque fois qu’on y accède. Une fois créé, il apparaît dans un espace de noms spécial.",
|
"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.",
|
||||||
"action": "Créer un nouveau filtre enregistré",
|
"action": "Créer un nouveau filtre enregistré",
|
||||||
"titleRequired": "Please provide a title for the filter."
|
"titleRequired": "Please provide a title for the filter."
|
||||||
},
|
},
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
"label": {
|
"label": {
|
||||||
"title": "Étiquettes",
|
"title": "Étiquettes",
|
||||||
"manage": "Gérer les étiquettes",
|
"manage": "Gérer les étiquettes",
|
||||||
"description": "Clique sur une étiquette pour la modifier. Tu peux modifier toutes les étiquettes que tu as créées, tu peux utiliser toutes les étiquettes qui sont associées à une tâche dont tu as accès à la liste.",
|
"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.",
|
||||||
"newCTA": "Tu n’as actuellement aucune étiquette.",
|
"newCTA": "Tu n’as actuellement aucune étiquette.",
|
||||||
"search": "Écris pour rechercher une étiquette…",
|
"search": "Écris pour rechercher une étiquette…",
|
||||||
"create": {
|
"create": {
|
||||||
|
@ -460,7 +460,7 @@
|
||||||
},
|
},
|
||||||
"sharing": {
|
"sharing": {
|
||||||
"authenticating": "Authentification…",
|
"authenticating": "Authentification…",
|
||||||
"passwordRequired": "Cette liste partagée nécessite un mot de passe. Entre-le ci-dessous :",
|
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||||
"error": "Une erreur s’est produite.",
|
"error": "Une erreur s’est produite.",
|
||||||
"invalidPassword": "Le mot de passe est invalide."
|
"invalidPassword": "Le mot de passe est invalide."
|
||||||
},
|
},
|
||||||
|
@ -529,7 +529,7 @@
|
||||||
"code": "Code",
|
"code": "Code",
|
||||||
"quote": "Citation",
|
"quote": "Citation",
|
||||||
"unorderedList": "Liste non ordonnée",
|
"unorderedList": "Liste non ordonnée",
|
||||||
"orderedList": "Liste ordonnée",
|
"orderedList ": "Ordered List",
|
||||||
"cleanBlock": "Bloc propre",
|
"cleanBlock": "Bloc propre",
|
||||||
"link": "Lien",
|
"link": "Lien",
|
||||||
"image": "Image",
|
"image": "Image",
|
||||||
|
@ -602,6 +602,7 @@
|
||||||
"addReminder": "Ajouter un nouveau rappel…",
|
"addReminder": "Ajouter un nouveau rappel…",
|
||||||
"doneSuccess": "Tâche marquée comme terminée.",
|
"doneSuccess": "Tâche marquée comme terminée.",
|
||||||
"undoneSuccess": "Tâche marquée comme non terminée.",
|
"undoneSuccess": "Tâche marquée comme non terminée.",
|
||||||
|
"undo": "Undo",
|
||||||
"openDetail": "Ouvrir la vue détaillée de la tâche",
|
"openDetail": "Ouvrir la vue détaillée de la tâche",
|
||||||
"checklistTotal": "{checked} sur {total} tâches",
|
"checklistTotal": "{checked} sur {total} tâches",
|
||||||
"checklistAllDone": "{total} tâches",
|
"checklistAllDone": "{total} tâches",
|
||||||
|
@ -618,7 +619,7 @@
|
||||||
"chooseDueDate": "Clique ici pour définir une date d’échéance",
|
"chooseDueDate": "Clique ici pour définir une date d’échéance",
|
||||||
"chooseStartDate": "Clique ici pour fixer une date de début",
|
"chooseStartDate": "Clique ici pour fixer une date de début",
|
||||||
"chooseEndDate": "Clique ici pour fixer une date de fin",
|
"chooseEndDate": "Clique ici pour fixer une date de fin",
|
||||||
"move": "Déplacer une tâche vers une autre liste",
|
"move": "Move task to a different project",
|
||||||
"done": "Marquer la tâche comme terminée !",
|
"done": "Marquer la tâche comme terminée !",
|
||||||
"undone": "Marquer comme inachevé",
|
"undone": "Marquer comme inachevé",
|
||||||
"created": "Créé {0} par {1}",
|
"created": "Créé {0} par {1}",
|
||||||
|
@ -626,7 +627,7 @@
|
||||||
"doneAt": "Terminé {0}",
|
"doneAt": "Terminé {0}",
|
||||||
"updateSuccess": "Tâche enregistrée.",
|
"updateSuccess": "Tâche enregistrée.",
|
||||||
"deleteSuccess": "Tâche supprimée.",
|
"deleteSuccess": "Tâche supprimée.",
|
||||||
"belongsToList": "Cette tâche appartient à la liste « {list} »",
|
"belongsToProject": "This task belongs to project '{project}'",
|
||||||
"due": "Échéance {at}",
|
"due": "Échéance {at}",
|
||||||
"closePopup": "Fermer la fenêtre",
|
"closePopup": "Fermer la fenêtre",
|
||||||
"delete": {
|
"delete": {
|
||||||
|
@ -646,7 +647,7 @@
|
||||||
"percentDone": "Définir la progression",
|
"percentDone": "Définir la progression",
|
||||||
"attachments": "Ajouter des pièces jointes",
|
"attachments": "Ajouter des pièces jointes",
|
||||||
"relatedTasks": "Ajouter une relation",
|
"relatedTasks": "Ajouter une relation",
|
||||||
"moveList": "Déplacer",
|
"moveProject": "Move",
|
||||||
"color": "Définir la couleur",
|
"color": "Définir la couleur",
|
||||||
"delete": "Supprimer",
|
"delete": "Supprimer",
|
||||||
"favorite": "Ajouter aux favoris",
|
"favorite": "Ajouter aux favoris",
|
||||||
|
@ -673,21 +674,21 @@
|
||||||
"updated": "Mis à jour"
|
"updated": "Mis à jour"
|
||||||
},
|
},
|
||||||
"subscription": {
|
"subscription": {
|
||||||
"subscribedListThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this list through its namespace.",
|
"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.",
|
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
|
||||||
"subscribedTaskThroughParentList": "You can't unsubscribe here because you are subscribed to this task through its list.",
|
"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.",
|
"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.",
|
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
|
||||||
"subscribedList": "You are currently subscribed to this list and will receive notifications for changes.",
|
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||||
"notSubscribedList": "You are not subscribed to this list and won't 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.",
|
"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.",
|
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
|
||||||
"subscribe": "S’abonner",
|
"subscribe": "S’abonner",
|
||||||
"unsubscribe": "Se désabonner",
|
"unsubscribe": "Se désabonner",
|
||||||
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
||||||
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
||||||
"subscribeSuccessList": "You are now subscribed to this list",
|
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||||
},
|
},
|
||||||
|
@ -761,7 +762,7 @@
|
||||||
"new": "Nouvelle relation de tâche",
|
"new": "Nouvelle relation de tâche",
|
||||||
"searchPlaceholder": "Écris la recherche d’une nouvelle tâche à ajouter comme connexe…",
|
"searchPlaceholder": "Écris la recherche d’une nouvelle tâche à ajouter comme connexe…",
|
||||||
"createPlaceholder": "Ajouter cette tâche comme nouvelle tâche connexe",
|
"createPlaceholder": "Ajouter cette tâche comme nouvelle tâche connexe",
|
||||||
"differentList": "Cette tâche appartient à une autre liste.",
|
"differentProject": "This task belongs to a different project.",
|
||||||
"differentNamespace": "Cette tâche fait partie d'un espace de noms différent.",
|
"differentNamespace": "Cette tâche fait partie d'un espace de noms différent.",
|
||||||
"noneYet": "Pas encore de relations de tâches.",
|
"noneYet": "Pas encore de relations de tâches.",
|
||||||
"delete": "Supprimer la relation de tâche",
|
"delete": "Supprimer la relation de tâche",
|
||||||
|
@ -811,10 +812,10 @@
|
||||||
"priority1": "Pour définir la priorité d’une tâche, ajoutez un chiffre de 1 à 5, précédé d’un {prefix}.",
|
"priority1": "Pour définir la priorité d’une tâche, ajoutez un chiffre de 1 à 5, précédé d’un {prefix}.",
|
||||||
"priority2": "Plus le numéro est élevé, plus la priorité est élevée.",
|
"priority2": "Plus le numéro est élevé, plus la priorité est élevée.",
|
||||||
"assignees": "Pour assigner directement la tâche à un utilisateur, ajoutez son nom d'utilisateur préfixé avec {prefix} à la tâche.",
|
"assignees": "Pour assigner directement la tâche à un utilisateur, ajoutez son nom d'utilisateur préfixé avec {prefix} à la tâche.",
|
||||||
"list1": "Pour définir une liste dans laquelle la tâche doit apparaître, entrez son nom précédé de {prefix}.",
|
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||||
"list2": "Ceci renverra une erreur si la liste n’existe pas.",
|
"project2": "This will return an error if the project does not exist.",
|
||||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||||
"list4": "For example: {prefix}\"List with spaces\".",
|
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||||
"dateAndTime": "Date et heure",
|
"dateAndTime": "Date et heure",
|
||||||
"date": "Toute date sera utilisée comme date d’échéance de la nouvelle tâche. Vous pouvez utiliser des dates dans un des formats suivants :",
|
"date": "Toute date sera utilisée comme date d’échéance de la nouvelle tâche. Vous pouvez utiliser des dates dans un des formats suivants :",
|
||||||
"dateWeekday": "n’importe quel jour de la semaine, utilisera la date suivante avec cette date",
|
"dateWeekday": "n’importe quel jour de la semaine, utilisera la date suivante avec cette date",
|
||||||
|
@ -847,19 +848,19 @@
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Supprimer l’équipe",
|
"header": "Supprimer l’équipe",
|
||||||
"text1": "Supprimer cette équipe et tous ses membres ?",
|
"text1": "Supprimer cette équipe et tous ses membres ?",
|
||||||
"text2": "Tous les membres de l'équipe perdront l'accès aux listes et aux espaces de noms partagés avec cette équipe. Ceci NE PEUT PAS ÊTRE ANNULÉ !",
|
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||||
"success": "Équipe supprimée."
|
"success": "Équipe supprimée."
|
||||||
},
|
},
|
||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"header": "Retirer un·e utilisateur·rice de l’équipe",
|
"header": "Retirer un·e utilisateur·rice de l’équipe",
|
||||||
"text1": "Retirer cette personne de l’équipe ?",
|
"text1": "Retirer cette personne de l’équipe ?",
|
||||||
"text2": "Ils perdront l'accès à toutes les listes et espaces de noms auxquels cette équipe a accès. Ceci NE PEUT PAS ÊTRE ANNULÉ !",
|
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||||
"success": "Utilisateur·rice retiré·e de l’équipe."
|
"success": "Utilisateur·rice retiré·e de l’équipe."
|
||||||
},
|
},
|
||||||
"leave": {
|
"leave": {
|
||||||
"title": "Leave team",
|
"title": "Leave team",
|
||||||
"text1": "Are you sure you want to leave this team?",
|
"text1": "Are you sure you want to leave this team?",
|
||||||
"text2": "You will lose access to all lists and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
"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.",
|
||||||
"success": "You have successfully left the team."
|
"success": "You have successfully left the team."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -891,22 +892,22 @@
|
||||||
"attachment": "Ajouter une pièce jointe à cette tâche",
|
"attachment": "Ajouter une pièce jointe à cette tâche",
|
||||||
"related": "Modifier les tâches connexes de cette tâche",
|
"related": "Modifier les tâches connexes de cette tâche",
|
||||||
"color": "Changer la couleur de cette tâche",
|
"color": "Changer la couleur de cette tâche",
|
||||||
"move": "Déplacer cette tâche dans une autre liste",
|
"move": "Move this task to another project",
|
||||||
"reminder": "Manage reminders of this task",
|
"reminder": "Manage reminders of this task",
|
||||||
"description": "Toggle editing of the task description"
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"title": "Vues en liste",
|
"title": "Project Views",
|
||||||
"switchToListView": "Passer en vue liste",
|
"switchToListView": "Switch to list view",
|
||||||
"switchToGanttView": "Passer en vue Gantt",
|
"switchToGanttView": "Switch to gantt view",
|
||||||
"switchToKanbanView": "Passer en vue kanban",
|
"switchToKanbanView": "Switch to kanban view",
|
||||||
"switchToTableView": "Passer en vue tableau"
|
"switchToTableView": "Switch to table view"
|
||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"title": "Navigation",
|
"title": "Navigation",
|
||||||
"overview": "Navigate to overview",
|
"overview": "Navigate to overview",
|
||||||
"upcoming": "Navigate to upcoming tasks",
|
"upcoming": "Navigate to upcoming tasks",
|
||||||
"namespaces": "Navigate to namespaces & lists",
|
"namespaces": "Navigate to namespaces & projects",
|
||||||
"labels": "Accéder aux étiquettes",
|
"labels": "Accéder aux étiquettes",
|
||||||
"teams": "Accéder aux équipes"
|
"teams": "Accéder aux équipes"
|
||||||
}
|
}
|
||||||
|
@ -923,7 +924,7 @@
|
||||||
"unarchive": "Désarchiver",
|
"unarchive": "Désarchiver",
|
||||||
"setBackground": "Définir l’arrière-plan",
|
"setBackground": "Définir l’arrière-plan",
|
||||||
"share": "Partager",
|
"share": "Partager",
|
||||||
"newList": "Nouvelle liste"
|
"newProject": "New project"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"url": "URL Vikunja",
|
"url": "URL Vikunja",
|
||||||
|
@ -942,24 +943,24 @@
|
||||||
"notification": {
|
"notification": {
|
||||||
"title": "Notifications",
|
"title": "Notifications",
|
||||||
"none": "Tu n’as pas de notifications. Passe une bonne journée !",
|
"none": "Tu n’as pas de notifications. Passe une bonne journée !",
|
||||||
"explainer": "Les notifications apparaissent ici lorsque des actions (pour les espaces de noms, les listes ou les tâches) auxquelles tu es abonné·e se produisent."
|
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||||
},
|
},
|
||||||
"quickActions": {
|
"quickActions": {
|
||||||
"commands": "Commandes",
|
"commands": "Commandes",
|
||||||
"placeholder": "Écris une commande ou une recherche…",
|
"placeholder": "Écris une commande ou une recherche…",
|
||||||
"hint": "Vous pouvez utiliser {list} pour limiter la recherche à une liste. Combiner {list} ou {label} (étiquettes) avec une requête de recherche pour rechercher une tâche avec ces étiquettes ou sur cette liste. Utilisez {assignee} pour rechercher uniquement des équipes.",
|
"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.",
|
||||||
"tasks": "Tâches",
|
"tasks": "Tâches",
|
||||||
"lists": "Listes",
|
"projects": "Projects",
|
||||||
"teams": "Équipes",
|
"teams": "Équipes",
|
||||||
"newList": "Entre le nom de la liste…",
|
"newProject": "Enter the title of the new project…",
|
||||||
"newTask": "Entre le nom de la tâche…",
|
"newTask": "Entre le nom de la tâche…",
|
||||||
"newNamespace": "Entre le nom de l’espace de noms…",
|
"newNamespace": "Entre le nom de l’espace de noms…",
|
||||||
"newTeam": "Entre le nom de la nouvelle équipe…",
|
"newTeam": "Entre le nom de la nouvelle équipe…",
|
||||||
"createTask": "Créer une tâche dans la liste actuelle ({title})",
|
"createTask": "Create a task in the current project ({title})",
|
||||||
"createList": "Créer une liste dans l’espace de noms actuel ({title})",
|
"createProject": "Create a project in the current namespace ({title})",
|
||||||
"cmds": {
|
"cmds": {
|
||||||
"newTask": "Nouvelle tâche",
|
"newTask": "Nouvelle tâche",
|
||||||
"newList": "Nouvelle liste",
|
"newProject": "New project",
|
||||||
"newNamespace": "Nouvel espace de noms",
|
"newNamespace": "Nouvel espace de noms",
|
||||||
"newTeam": "Nouvelle équipe"
|
"newTeam": "Nouvelle équipe"
|
||||||
}
|
}
|
||||||
|
@ -991,15 +992,15 @@
|
||||||
"1018": "Le paramètre du type d’avatar de l’utilisateur·rice est invalide.",
|
"1018": "Le paramètre du type d’avatar de l’utilisateur·rice est invalide.",
|
||||||
"2001": "L’identifiant ne peut pas être vide ou égal à 0.",
|
"2001": "L’identifiant ne peut pas être vide ou égal à 0.",
|
||||||
"2002": "Certaines des données de la requête étaient invalides.",
|
"2002": "Certaines des données de la requête étaient invalides.",
|
||||||
"3001": "La liste n’existe pas.",
|
"3001": "The project does not exist.",
|
||||||
"3004": "Tu dois avoir des droits de lecture sur cette liste pour effectuer cette action.",
|
"3004": "You need to have read permissions on that project to perform that action.",
|
||||||
"3005": "Tu dois entrer un nom de liste.",
|
"3005": "The project title cannot be empty.",
|
||||||
"3006": "Le partage de liste n’existe pas.",
|
"3006": "The project share does not exist.",
|
||||||
"3007": "Une liste avec cet identifiant existe déjà.",
|
"3007": "A project with this identifier already exists.",
|
||||||
"3008": "La liste est archivée et ne peut donc être consultée qu’en lecture seule. Ceci est également vrai pour toutes les tâches associées à cette liste.",
|
"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": "Le texte de la tâche de liste ne peut pas être vide.",
|
"4001": "The project task text cannot be empty.",
|
||||||
"4002": "La tâche de liste n’existe pas.",
|
"4002": "The project task does not exist.",
|
||||||
"4003": "Toutes les tâches de modification en bloc doivent appartenir à la même liste.",
|
"4003": "All bulk editing tasks must belong to the same project.",
|
||||||
"4004": "Besoin d’au moins une tâche lors de la modification en bloc de tâches.",
|
"4004": "Besoin d’au moins une tâche lors de la modification en bloc de tâches.",
|
||||||
"4005": "Tu n’as pas le droit de voir la tâche.",
|
"4005": "Tu n’as pas le droit de voir la tâche.",
|
||||||
"4006": "Tu ne peux pas définir une tâche parente comme tâche elle-même.",
|
"4006": "Tu ne peux pas définir une tâche parente comme tâche elle-même.",
|
||||||
|
@ -1025,21 +1026,21 @@
|
||||||
"5012": "L’espace de noms est archivé et ne peut donc être consulté qu’en lecture seule.",
|
"5012": "L’espace de noms est archivé et ne peut donc être consulté qu’en lecture seule.",
|
||||||
"6001": "Le nom de l'équipe ne peut pas être vide.",
|
"6001": "Le nom de l'équipe ne peut pas être vide.",
|
||||||
"6002": "L’équipe n’existe pas.",
|
"6002": "L’équipe n’existe pas.",
|
||||||
"6004": "L’équipe a déjà accès à cet espace de noms ou à cette liste.",
|
"6004": "The team already has access to that namespace or project.",
|
||||||
"6005": "L’utilisateur·rice est déjà membre de cette équipe.",
|
"6005": "L’utilisateur·rice est déjà membre de cette équipe.",
|
||||||
"6006": "Impossible de supprimer le dernier membre de l’équipe.",
|
"6006": "Impossible de supprimer le dernier membre de l’équipe.",
|
||||||
"6007": "L’équipe n’a pas accès à la liste pour effectuer cette action.",
|
"6007": "The team does not have access to the project to perform that action.",
|
||||||
"7002": "L’utilisateur·rice a déjà accès à cette liste.",
|
"7002": "The user already has access to that project.",
|
||||||
"7003": "Tu n’as pas accès à cette liste.",
|
"7003": "You do not have access to that project.",
|
||||||
"8001": "Cette étiquette existe déjà sur cette tâche.",
|
"8001": "Cette étiquette existe déjà sur cette tâche.",
|
||||||
"8002": "L’étiquette n’existe pas.",
|
"8002": "L’étiquette n’existe pas.",
|
||||||
"8003": "Tu n’as pas accès à cette étiquette.",
|
"8003": "Tu n’as pas accès à cette étiquette.",
|
||||||
"9001": "Le droit est invalide.",
|
"9001": "Le droit est invalide.",
|
||||||
"10001": "Le seau n’existe pas.",
|
"10001": "Le seau n’existe pas.",
|
||||||
"10002": "Le seau ne fait pas partie de cette liste.",
|
"10002": "The bucket does not belong to that project.",
|
||||||
"10003": "Tu ne peux pas supprimer le dernier seau d’une liste.",
|
"10003": "You cannot remove the last bucket on a project.",
|
||||||
"10004": "Tu ne peux pas ajouter la tâche à ce seau car il a déjà dépassé la limite de tâches qu’il peut contenir.",
|
"10004": "Tu ne peux pas ajouter la tâche à ce seau car il a déjà dépassé la limite de tâches qu’il peut contenir.",
|
||||||
"10005": "Il peut y avoir seulement un seau des terminés par liste.",
|
"10005": "There can be only one done bucket per project.",
|
||||||
"11001": "Le filtre enregistré n’existe pas.",
|
"11001": "Le filtre enregistré n’existe pas.",
|
||||||
"11002": "Les filtres enregistrés ne sont pas disponibles pour les partages de liens.",
|
"11002": "Les filtres enregistrés ne sont pas disponibles pour les partages de liens.",
|
||||||
"12001": "Le type d’entité d’abonnement est invalide.",
|
"12001": "Le type d’entité d’abonnement est invalide.",
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
"welcomeDay": "Ciao {username}!",
|
"welcomeDay": "Ciao {username}!",
|
||||||
"welcomeEvening": "Buonasera {username}!",
|
"welcomeEvening": "Buonasera {username}!",
|
||||||
"lastViewed": "Ultima visualizzazione",
|
"lastViewed": "Ultima visualizzazione",
|
||||||
"list": {
|
"project": {
|
||||||
"newText": "È possibile creare una nuova lista per le nuove attività:",
|
"newText": "You can create a new project for your new tasks:",
|
||||||
"new": "Nuova lista",
|
"new": "New project",
|
||||||
"importText": "O importare le liste e le attività da altri servizi in Vikunja:",
|
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||||
"import": "Importa i tuoi dati in Vikunja"
|
"import": "Import your data into Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"404": {
|
"404": {
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
"weekStartSunday": "Domenica",
|
"weekStartSunday": "Domenica",
|
||||||
"weekStartMonday": "Lunedì",
|
"weekStartMonday": "Lunedì",
|
||||||
"language": "Lingua",
|
"language": "Lingua",
|
||||||
"defaultList": "Lista predefinita",
|
"defaultProject": "Default Project",
|
||||||
"timezone": "Fuso Orario",
|
"timezone": "Fuso Orario",
|
||||||
"overdueTasksRemindersTime": "Orario email attività in scadute"
|
"overdueTasksRemindersTime": "Orario email attività in scadute"
|
||||||
},
|
},
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
},
|
},
|
||||||
"deletion": {
|
"deletion": {
|
||||||
"title": "Elimina il tuo Account Vikunja",
|
"title": "Elimina il tuo Account Vikunja",
|
||||||
"text1": "La cancellazione del tuo account è permanente e non può essere annullata. Elimineremo tutti i tuoi namespace, liste, attività e tutto ciò che è ad esso associato.",
|
"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.",
|
||||||
"text2": "Per continuare, inserisci la tua password. Riceverai un'e-mail con ulteriori istruzioni.",
|
"text2": "Per continuare, inserisci la tua password. Riceverai un'e-mail con ulteriori istruzioni.",
|
||||||
"confirm": "Elimina il mio profilo",
|
"confirm": "Elimina il mio profilo",
|
||||||
"requestSuccess": "Richiesta riuscita. Riceverai un'e-mail con ulteriori istruzioni.",
|
"requestSuccess": "Richiesta riuscita. Riceverai un'e-mail con ulteriori istruzioni.",
|
||||||
|
@ -157,201 +157,201 @@
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"title": "Esporta i tuoi dati Vikunja",
|
"title": "Esporta i tuoi dati Vikunja",
|
||||||
"description": "Puoi richiedere una copia di tutti i tuoi dati all'interno di Vikunja. Questo include i Namespace, le Liste, le Attività e tutto ciò che è loro associato. È possibile importare questi dati in qualsiasi istanza Vikunja attraverso la funzione di migrazione.",
|
"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.",
|
||||||
"descriptionPasswordRequired": "Inserisci la tua password per procedere:",
|
"descriptionPasswordRequired": "Inserisci la tua password per procedere:",
|
||||||
"request": "Richiedi una copia dei miei dati Vikunja",
|
"request": "Richiedi una copia dei miei dati Vikunja",
|
||||||
"success": "Hai richiesto con successo i tuoi dati Vikunja! Ti invieremo un'e-mail una volta che saranno pronti da scaricare.",
|
"success": "Hai richiesto con successo i tuoi dati Vikunja! Ti invieremo un'e-mail una volta che saranno pronti da scaricare.",
|
||||||
"downloadTitle": "Scarica i tuoi dati Vikunja esportati"
|
"downloadTitle": "Scarica i tuoi dati Vikunja esportati"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"archived": "Questa lista è archiviata. Non è possibile creare nuove attività o modificarle.",
|
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||||
"title": "Titolo della Lista",
|
"title": "Project Title",
|
||||||
"color": "Colore",
|
"color": "Color",
|
||||||
"lists": "Liste",
|
"projects": "Projects",
|
||||||
"list": {
|
"search": "Type to search for a project…",
|
||||||
"title": "Lista",
|
"searchSelect": "Click or press enter to select this project",
|
||||||
"add": "Aggiungi",
|
"shared": "Shared Projects",
|
||||||
"addPlaceholder": "Aggiungi una nuova attività…",
|
"noDescriptionAvailable": "No project description is available.",
|
||||||
"empty": "Questa lista è attualmente vuota.",
|
|
||||||
"newTaskCta": "Crea una nuova attività.",
|
|
||||||
"editTask": "Modifica Attività"
|
|
||||||
},
|
|
||||||
"search": "Digita per cercare una lista…",
|
|
||||||
"searchSelect": "Fare clic o premere invio per selezionare questa lista",
|
|
||||||
"shared": "Liste Condivise",
|
|
||||||
"noDescriptionAvailable": "Nessuna descrizione della lista disponibile.",
|
|
||||||
"create": {
|
"create": {
|
||||||
"header": "Nuova lista",
|
"header": "New project",
|
||||||
"titlePlaceholder": "Il titolo della lista va qui…",
|
"titlePlaceholder": "The project's title goes here…",
|
||||||
"addTitleRequired": "Specifica un titolo.",
|
"addTitleRequired": "Please specify a title.",
|
||||||
"createdSuccess": "La lista è stata creata correttamente.",
|
"createdSuccess": "The project was successfully created.",
|
||||||
"addListRequired": "Specifica una lista o imposta una lista predefinita nelle impostazioni."
|
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"title": "Archivia \"{list}\"",
|
"title": "Archive \"{project}\"",
|
||||||
"archive": "Archivia questa lista",
|
"archive": "Archive this project",
|
||||||
"unarchive": "Estrai questa lista dall'archivio",
|
"unarchive": "Un-Archive this project",
|
||||||
"unarchiveText": "Potrai creare nuove attività o modificarle.",
|
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||||
"archiveText": "Non sarà possibile modificare questa lista o creare nuove attività fino a quando non verrà estratta dall'archivio.",
|
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||||
"success": "Lista archiviata con successo."
|
"success": "The project was successfully archived."
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
"title": "Imposta sfondo lista",
|
"title": "Set project background",
|
||||||
"remove": "Rimuovi Sfondo",
|
"remove": "Remove Background",
|
||||||
"upload": "Scegli uno sfondo dal tuo pc",
|
"upload": "Choose a background from your pc",
|
||||||
"searchPlaceholder": "Cerca uno sfondo…",
|
"searchPlaceholder": "Search for a background…",
|
||||||
"poweredByUnsplash": "Realizzato con Unsplash",
|
"poweredByUnsplash": "Powered by Unsplash",
|
||||||
"loadMore": "Carica altre foto",
|
"loadMore": "Load more photos",
|
||||||
"success": "Lo sfondo è stato impostato con successo!",
|
"success": "The background has been set successfully!",
|
||||||
"removeSuccess": "Lo sfondo è stato rimosso con successo!"
|
"removeSuccess": "The background has been removed successfully!"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Elimina \"{list}\"",
|
"title": "Delete \"{project}\"",
|
||||||
"header": "Elimina questa lista",
|
"header": "Delete this project",
|
||||||
"text1": "Sei sicuro di voler eliminare questa lista e tutti i suoi contenuti?",
|
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||||
"text2": "Questo include tutte le attività e NON PUÒ ESSERE RIPRISTINATO!",
|
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||||
"success": "La lista è stata eliminata con successo.",
|
"success": "The project was successfully deleted.",
|
||||||
"tasksToDelete": "Questo eliminerà definitivamente circa {count} attività.",
|
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||||
"noTasksToDelete": "Questo elenco non contiene alcuna attività, puoi eliminarlo in sicurezza."
|
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||||
},
|
},
|
||||||
"duplicate": {
|
"duplicate": {
|
||||||
"title": "Duplica questa lista",
|
"title": "Duplicate this project",
|
||||||
"label": "Duplica",
|
"label": "Duplicate",
|
||||||
"text": "Seleziona un namespace che dovrebbe contenere l'elenco duplicato:",
|
"text": "Select a namespace which should hold the duplicated project:",
|
||||||
"success": "Lista duplicata."
|
"success": "The project was successfully duplicated."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"header": "Modifica Questa Lista",
|
"header": "Edit This Project",
|
||||||
"title": "Modifica \"{list}\"",
|
"title": "Edit \"{project}\"",
|
||||||
"titlePlaceholder": "Il titolo della lista va qui…",
|
"titlePlaceholder": "The project title goes here…",
|
||||||
"identifierTooltip": "L'identificatore della lista può essere usato per identificare univocamente un'attività tra le varie liste. Puoi lasciarlo vuoto per disabilitarlo.",
|
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||||
"identifier": "Identificatore Della Lista",
|
"identifier": "Project Identifier",
|
||||||
"identifierPlaceholder": "L'identificatore della lista va qui…",
|
"identifierPlaceholder": "The project identifier goes here…",
|
||||||
"description": "Descrizione",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "La descrizione della lista va qui…",
|
"descriptionPlaceholder": "The projects description goes here…",
|
||||||
"color": "Colore",
|
"color": "Color",
|
||||||
"success": "Lista aggiornata."
|
"success": "The project was successfully updated."
|
||||||
},
|
},
|
||||||
"share": {
|
"share": {
|
||||||
"header": "Condividi questa lista",
|
"header": "Share this project",
|
||||||
"title": "Condividi \"{list}\"",
|
"title": "Share \"{project}\"",
|
||||||
"share": "Condividi",
|
"share": "Share",
|
||||||
"links": {
|
"links": {
|
||||||
"title": "Link di condivisione",
|
"title": "Share Links",
|
||||||
"what": "Cos'è un link di condivisione?",
|
"what": "What is a share link?",
|
||||||
"explanation": "I link di condivisione consentono di condividere facilmente una lista con altri utenti che non hanno un account su Vikunja.",
|
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||||
"create": "Crea nuovo link di condivisione",
|
"create": "Create a new link share",
|
||||||
"name": "Nome (facoltativo)",
|
"name": "Name (optional)",
|
||||||
"namePlaceholder": "es. Lorem Ipsum",
|
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||||
"nameExplanation": "Tutte le azioni svolte tramite questo link di condivisione verranno visualizzate con questo nome.",
|
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||||
"password": "Password (facoltativo)",
|
"password": "Password (optional)",
|
||||||
"passwordExplanation": "Durante l'autenticazione, l'utente dovrà inserire questa password.",
|
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||||
"noName": "Nessun nome impostato",
|
"noName": "No name set",
|
||||||
"remove": "Rimuovi un link di condivisione",
|
"remove": "Remove a link share",
|
||||||
"removeText": "Sei sicuro di voler rimuovere questo link di condivisione? Non sarà più possibile accedere a questa lista con questo link. Non può essere ripristinato!",
|
"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": "Link di condivisione creato.",
|
"createSuccess": "The link share was successfully created.",
|
||||||
"deleteSuccess": "Link di condivisione elimitato",
|
"deleteSuccess": "The link share was successfully deleted",
|
||||||
"view": "Mostra",
|
"view": "View",
|
||||||
"sharedBy": "Condiviso da {0}"
|
"sharedBy": "Shared by {0}"
|
||||||
},
|
},
|
||||||
"userTeam": {
|
"userTeam": {
|
||||||
"typeUser": "utente | utenti",
|
"typeUser": "user | users",
|
||||||
"typeTeam": "gruppo | gruppi",
|
"typeTeam": "team | teams",
|
||||||
"shared": "Condiviso con questi {type}",
|
"shared": "Shared with these {type}",
|
||||||
"you": "Tu",
|
"you": "You",
|
||||||
"notShared": "Non ancora condiviso con nessun {type}.",
|
"notShared": "Not shared with any {type} yet.",
|
||||||
"removeHeader": "Rimuovi un {type} dal {sharable}",
|
"removeHeader": "Remove a {type} from the {sharable}",
|
||||||
"removeText": "Sei sicuro di voler rimuovere questo {sharable} dal {type}? Non può essere ripristinato!",
|
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||||
"removeSuccess": "{sharable} rimosso dal {type}.",
|
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||||
"addedSuccess": "{type} aggiunto.",
|
"addedSuccess": "The {type} was successfully added.",
|
||||||
"updatedSuccess": "{type} aggiunto."
|
"updatedSuccess": "The {type} was successfully added."
|
||||||
},
|
},
|
||||||
"right": {
|
"right": {
|
||||||
"title": "Permessi",
|
"title": "Permission",
|
||||||
"read": "Sola lettura",
|
"read": "Read only",
|
||||||
"readWrite": "Lettura e scrittura",
|
"readWrite": "Read & write",
|
||||||
"admin": "Amministratore"
|
"admin": "Admin"
|
||||||
},
|
},
|
||||||
"attributes": {
|
"attributes": {
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"delete": "Elimina"
|
"delete": "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"
|
||||||
|
},
|
||||||
"gantt": {
|
"gantt": {
|
||||||
"title": "Gantt",
|
"title": "Gantt",
|
||||||
"showTasksWithoutDates": "Mostra attività che non hanno date impostate",
|
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||||
"size": "Dimensione",
|
"size": "Size",
|
||||||
"default": "Predefinito",
|
"default": "Default",
|
||||||
"month": "Mese",
|
"month": "Month",
|
||||||
"day": "Giorno",
|
"day": "Day",
|
||||||
"hour": "Ora",
|
"hour": "Hour",
|
||||||
"range": "Intervallo date",
|
"range": "Date Range",
|
||||||
"noDates": "Questa attività non ha date impostate."
|
"noDates": "This task has no dates set."
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"title": "Tabella",
|
"title": "Table",
|
||||||
"columns": "Colonne"
|
"columns": "Columns"
|
||||||
},
|
},
|
||||||
"kanban": {
|
"kanban": {
|
||||||
"title": "Kanban",
|
"title": "Kanban",
|
||||||
"limit": "Limite: {limit}",
|
"limit": "Limit: {limit}",
|
||||||
"noLimit": "Non Impostato",
|
"noLimit": "Not Set",
|
||||||
"doneBucket": "Colonna attività completate",
|
"doneBucket": "Done bucket",
|
||||||
"doneBucketHint": "Tutte le attività spostate in questa colonna verranno automaticamente contrassegnate come completate.",
|
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||||
"doneBucketHintExtended": "Tutte le attività spostate nella colonna attività completate saranno contrassegnate automaticamente come completate. Tutte le attività contrassegnate come completate altrove verranno anche spostate.",
|
"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": "Colonna attività completate salvata.",
|
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||||
"deleteLast": "Impossibile eliminare l'ultima colonna.",
|
"deleteLast": "You cannot remove the last bucket.",
|
||||||
"addTaskPlaceholder": "Inserisci il nuovo titolo dell'attività…",
|
"addTaskPlaceholder": "Enter the new task title…",
|
||||||
"addTask": "Aggiungi un'attività",
|
"addTask": "Add a task",
|
||||||
"addAnotherTask": "Aggiungi un'altra attività",
|
"addAnotherTask": "Add another task",
|
||||||
"addBucket": "Crea una nuova colonna",
|
"addBucket": "Create a new bucket",
|
||||||
"addBucketPlaceholder": "Inserisci il titolo della nuova colonna…",
|
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||||
"deleteHeaderBucket": "Elimina la colonna",
|
"deleteHeaderBucket": "Delete the bucket",
|
||||||
"deleteBucketText1": "Confermi di voler eliminare questa colonna?",
|
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||||
"deleteBucketText2": "Questo non eliminerà nessuna attività, ma la sposterà nel bucket predefinito.",
|
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||||
"deleteBucketSuccess": "Colonna eliminata.",
|
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||||
"bucketTitleSavedSuccess": "Titolo della colonna salvato.",
|
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||||
"bucketLimitSavedSuccess": "Limite della colonna salvato.",
|
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||||
"collapse": "Comprimi questa colonna"
|
"collapse": "Collapse this bucket"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Preferiti"
|
"title": "Favorites"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"namespace": {
|
"namespace": {
|
||||||
"title": "Namespace e Liste",
|
"title": "Namespaces & Projects",
|
||||||
"namespace": "Namespace",
|
"namespace": "Namespace",
|
||||||
"showArchived": "Mostra Archiviati",
|
"showArchived": "Mostra Archiviati",
|
||||||
"noneAvailable": "Non hai alcun namespace in questo momento.",
|
"noneAvailable": "Non hai alcun namespace in questo momento.",
|
||||||
"unarchive": "De-Archivia",
|
"unarchive": "De-Archivia",
|
||||||
"archived": "Archiviato",
|
"archived": "Archiviato",
|
||||||
"noLists": "Questo namespace non contiene alcuna lista.",
|
"noProjects": "This namespace does not contain any projects.",
|
||||||
"createList": "Crea una nuova lista in questo namespace.",
|
"createProject": "Create a new project in this namespace.",
|
||||||
"namespaces": "Namespace",
|
"namespaces": "Namespace",
|
||||||
"search": "Digita per cercare un namespace…",
|
"search": "Digita per cercare un namespace…",
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nuovo namespace",
|
"title": "Nuovo namespace",
|
||||||
"titleRequired": "Specifica un titolo.",
|
"titleRequired": "Specifica un titolo.",
|
||||||
"explanation": "Una collezione è una raccolta di liste che puoi condividere e che puoi usare per organizzare le tue liste. Infatti, ogni lista appartiene a una collezione.",
|
"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.",
|
||||||
"tooltip": "Che cos'è un namespace?",
|
"tooltip": "Che cos'è un namespace?",
|
||||||
"success": "Namespace creato."
|
"success": "Namespace creato."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"titleArchive": "Archivia \"{namespace}\"",
|
"titleArchive": "Archivia \"{namespace}\"",
|
||||||
"titleUnarchive": "Disarchivia \"{namespace}\"",
|
"titleUnarchive": "Disarchivia \"{namespace}\"",
|
||||||
"archiveText": "Non sarà possibile modificare questo namespace o creare nuove liste fino a quando non verrà disarchiviato. Questo archivierà anche tutte le liste in questo 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": "Potrai creare nuove liste o modificarle.",
|
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||||
"success": "Namespace creato.",
|
"success": "Namespace creato.",
|
||||||
"unarchiveSuccess": "Namespace estratto dall'archivio.",
|
"unarchiveSuccess": "Namespace estratto dall'archivio.",
|
||||||
"description": "Se un namespace è archiviato, non è possibile creare nuove liste o modificarlo."
|
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Elimina \"{namespace}\"",
|
"title": "Elimina \"{namespace}\"",
|
||||||
"text1": "Sei sicuro di voler rimuovere questo namespace e tutto il relativo contenuto?",
|
"text1": "Sei sicuro di voler rimuovere questo namespace e tutto il relativo contenuto?",
|
||||||
"text2": "Questo include tutte le liste e le attività e NON PUÒ ESSERE RIPRISTINATO!",
|
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Namespace eliminato."
|
"success": "Namespace eliminato."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
|
@ -371,8 +371,8 @@
|
||||||
"isArchived": "Questo namespace è archiviato"
|
"isArchived": "Questo namespace è archiviato"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"sharedLists": {
|
"sharedProjects": {
|
||||||
"title": "Liste Condivise"
|
"title": "Shared Projects"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Preferiti"
|
"title": "Preferiti"
|
||||||
|
@ -403,9 +403,9 @@
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nuovo Filtro Salvato",
|
"title": "Nuovo Filtro Salvato",
|
||||||
"description": "Un filtro salvato è una lista virtuale che viene calcolata da un insieme di filtri di volta in volta. Una volta creato, apparirà in un namespace speciale.",
|
"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.",
|
||||||
"action": "Crea nuovo filtro salvato",
|
"action": "Crea nuovo filtro salvato",
|
||||||
"titleRequired": "Please provide a title for the filter."
|
"titleRequired": "È necessario un titolo per il filtro."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Elimina questo filtro salvato",
|
"header": "Elimina questo filtro salvato",
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
"label": {
|
"label": {
|
||||||
"title": "Etichette",
|
"title": "Etichette",
|
||||||
"manage": "Gestione etichette",
|
"manage": "Gestione etichette",
|
||||||
"description": "Fare clic su un'etichetta per modificarla. Puoi modificare tutte le etichette che hai creato, puoi usare tutte le etichette che sono associate a un'attività alla quale hai accesso.",
|
"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.",
|
||||||
"newCTA": "Non hai nessuna etichetta.",
|
"newCTA": "Non hai nessuna etichetta.",
|
||||||
"search": "Digita per cercare un'etichetta…",
|
"search": "Digita per cercare un'etichetta…",
|
||||||
"create": {
|
"create": {
|
||||||
|
@ -460,7 +460,7 @@
|
||||||
},
|
},
|
||||||
"sharing": {
|
"sharing": {
|
||||||
"authenticating": "Autenticazione…",
|
"authenticating": "Autenticazione…",
|
||||||
"passwordRequired": "Questo elenco condiviso richiede una password. Inseriscila qui sotto:",
|
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||||
"error": "Si è verificato un errore.",
|
"error": "Si è verificato un errore.",
|
||||||
"invalidPassword": "La password non è valida."
|
"invalidPassword": "La password non è valida."
|
||||||
},
|
},
|
||||||
|
@ -529,7 +529,7 @@
|
||||||
"code": "Codice",
|
"code": "Codice",
|
||||||
"quote": "Citazione",
|
"quote": "Citazione",
|
||||||
"unorderedList": "Elenco puntato",
|
"unorderedList": "Elenco puntato",
|
||||||
"orderedList": "Elenco numerato",
|
"orderedList ": "Ordered List",
|
||||||
"cleanBlock": "Pulisci Blocco",
|
"cleanBlock": "Pulisci Blocco",
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"image": "Immagine",
|
"image": "Immagine",
|
||||||
|
@ -602,6 +602,7 @@
|
||||||
"addReminder": "Aggiungi un nuovo promemoria…",
|
"addReminder": "Aggiungi un nuovo promemoria…",
|
||||||
"doneSuccess": "Attività segnata come completata.",
|
"doneSuccess": "Attività segnata come completata.",
|
||||||
"undoneSuccess": "Attività segnata come non completata.",
|
"undoneSuccess": "Attività segnata come non completata.",
|
||||||
|
"undo": "Undo",
|
||||||
"openDetail": "Apri vista dettagli attività",
|
"openDetail": "Apri vista dettagli attività",
|
||||||
"checklistTotal": "{checked} di {total} attività",
|
"checklistTotal": "{checked} di {total} attività",
|
||||||
"checklistAllDone": "{total} attività",
|
"checklistAllDone": "{total} attività",
|
||||||
|
@ -618,7 +619,7 @@
|
||||||
"chooseDueDate": "Clicca qui per impostare una data di scadenza",
|
"chooseDueDate": "Clicca qui per impostare una data di scadenza",
|
||||||
"chooseStartDate": "Clicca qui per impostare una data di inizio",
|
"chooseStartDate": "Clicca qui per impostare una data di inizio",
|
||||||
"chooseEndDate": "Clicca qui per impostare una data di fine",
|
"chooseEndDate": "Clicca qui per impostare una data di fine",
|
||||||
"move": "Sposta attività in un'altra lista",
|
"move": "Move task to a different project",
|
||||||
"done": "Segna attività fatta!",
|
"done": "Segna attività fatta!",
|
||||||
"undone": "Segna come non completato",
|
"undone": "Segna come non completato",
|
||||||
"created": "Creato {0} da {1}",
|
"created": "Creato {0} da {1}",
|
||||||
|
@ -626,7 +627,7 @@
|
||||||
"doneAt": "Fatto {0}",
|
"doneAt": "Fatto {0}",
|
||||||
"updateSuccess": "Attività salvata con successo.",
|
"updateSuccess": "Attività salvata con successo.",
|
||||||
"deleteSuccess": "L'attività è stata eliminata con successo.",
|
"deleteSuccess": "L'attività è stata eliminata con successo.",
|
||||||
"belongsToList": "Questa attività appartiene alla lista '{list}'",
|
"belongsToProject": "This task belongs to project '{project}'",
|
||||||
"due": "Scadenza {at}",
|
"due": "Scadenza {at}",
|
||||||
"closePopup": "Chiudi popup",
|
"closePopup": "Chiudi popup",
|
||||||
"delete": {
|
"delete": {
|
||||||
|
@ -646,7 +647,7 @@
|
||||||
"percentDone": "Imposta Progresso",
|
"percentDone": "Imposta Progresso",
|
||||||
"attachments": "Aggiungi Allegati",
|
"attachments": "Aggiungi Allegati",
|
||||||
"relatedTasks": "Aggiungi Relazione",
|
"relatedTasks": "Aggiungi Relazione",
|
||||||
"moveList": "Sposta",
|
"moveProject": "Move",
|
||||||
"color": "Imposta Colore",
|
"color": "Imposta Colore",
|
||||||
"delete": "Elimina",
|
"delete": "Elimina",
|
||||||
"favorite": "Aggiungi ai Preferiti",
|
"favorite": "Aggiungi ai Preferiti",
|
||||||
|
@ -673,21 +674,21 @@
|
||||||
"updated": "Aggiornato"
|
"updated": "Aggiornato"
|
||||||
},
|
},
|
||||||
"subscription": {
|
"subscription": {
|
||||||
"subscribedListThroughParentNamespace": "Non puoi annullare l'iscrizione perché sei iscritto al namespace di questa lista.",
|
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||||
"subscribedTaskThroughParentNamespace": "Non puoi annullare l'iscrizione perché sei iscritto al namespace di questa attività.",
|
"subscribedTaskThroughParentNamespace": "Non puoi annullare l'iscrizione perché sei iscritto al namespace di questa attività.",
|
||||||
"subscribedTaskThroughParentList": "Non puoi annullare l'iscrizione perché sei iscritto alla lista di questa attività.",
|
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||||
"subscribedNamespace": "Sei iscritto a questo namespace e verrai notificato delle modifiche.",
|
"subscribedNamespace": "Sei iscritto a questo namespace e verrai notificato delle modifiche.",
|
||||||
"notSubscribedNamespace": "Non sei iscritto a questo namespace e non verrai notificato delle modifiche.",
|
"notSubscribedNamespace": "Non sei iscritto a questo namespace e non verrai notificato delle modifiche.",
|
||||||
"subscribedList": "Sei iscritto a questa lista e verrai notificato delle modifiche.",
|
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||||
"notSubscribedList": "Non sei iscritto a questa lista e non verrai notificato delle modifiche.",
|
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||||
"subscribedTask": "Sei iscritto a questa attività e verrai notificato delle modifiche.",
|
"subscribedTask": "Sei iscritto a questa attività e verrai notificato delle modifiche.",
|
||||||
"notSubscribedTask": "Non sei iscritto a questa attività e non verrai notificato delle modifiche.",
|
"notSubscribedTask": "Non sei iscritto a questa attività e non verrai notificato delle modifiche.",
|
||||||
"subscribe": "Iscriviti",
|
"subscribe": "Iscriviti",
|
||||||
"unsubscribe": "Disiscriviti",
|
"unsubscribe": "Disiscriviti",
|
||||||
"subscribeSuccessNamespace": "Sei iscritto a questo namespace",
|
"subscribeSuccessNamespace": "Sei iscritto a questo namespace",
|
||||||
"unsubscribeSuccessNamespace": "Non sei più iscritto a questo namespace",
|
"unsubscribeSuccessNamespace": "Non sei più iscritto a questo namespace",
|
||||||
"subscribeSuccessList": "Sei iscritto a questa lista",
|
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||||
"unsubscribeSuccessList": "Non sei più iscritto a questa lista",
|
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||||
"subscribeSuccessTask": "Sei iscritto a questa attività",
|
"subscribeSuccessTask": "Sei iscritto a questa attività",
|
||||||
"unsubscribeSuccessTask": "Non sei più iscritto a questa attività"
|
"unsubscribeSuccessTask": "Non sei più iscritto a questa attività"
|
||||||
},
|
},
|
||||||
|
@ -761,7 +762,7 @@
|
||||||
"new": "Nuova Attività Collegata",
|
"new": "Nuova Attività Collegata",
|
||||||
"searchPlaceholder": "Digita per cercare un'attività da aggiungere come collegata…",
|
"searchPlaceholder": "Digita per cercare un'attività da aggiungere come collegata…",
|
||||||
"createPlaceholder": "Aggiungi come attività collegata",
|
"createPlaceholder": "Aggiungi come attività collegata",
|
||||||
"differentList": "Questa attività è di una lista diversa.",
|
"differentProject": "This task belongs to a different project.",
|
||||||
"differentNamespace": "Questa attività appartiene ad un namespace diverso.",
|
"differentNamespace": "Questa attività appartiene ad un namespace diverso.",
|
||||||
"noneYet": "Nessuna attività collegata.",
|
"noneYet": "Nessuna attività collegata.",
|
||||||
"delete": "Elimina Collegamento Attività",
|
"delete": "Elimina Collegamento Attività",
|
||||||
|
@ -811,10 +812,10 @@
|
||||||
"priority1": "Per impostare la priorità di un'attività, aggiungi un numero 1-5, preceduto da {prefix}.",
|
"priority1": "Per impostare la priorità di un'attività, aggiungi un numero 1-5, preceduto da {prefix}.",
|
||||||
"priority2": "Più alto è il numero, più alta è la priorità.",
|
"priority2": "Più alto è il numero, più alta è la priorità.",
|
||||||
"assignees": "Per assegnare direttamente l'attività a un utente, aggiungere il suo nome utente preceduto da {prefix} all'attività.",
|
"assignees": "Per assegnare direttamente l'attività a un utente, aggiungere il suo nome utente preceduto da {prefix} all'attività.",
|
||||||
"list1": "Per impostare una lista di appartenenza all'attività, inserisci il suo nome prefisso con {prefix}.",
|
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||||
"list2": "Ciò restituirà un errore se la lista non esiste.",
|
"project2": "This will return an error if the project does not exist.",
|
||||||
"list3": "Per usare gli spazi, basta aggiungere un \" o ' prima e dopo il nome della lista.",
|
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||||
"list4": "Per esempio: {prefix}\"Etichetta con spazi\".",
|
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||||
"dateAndTime": "Data e ora",
|
"dateAndTime": "Data e ora",
|
||||||
"date": "Qualsiasi data verrà utilizzata come data di scadenza della nuova attività. È possibile utilizzare le date in uno qualsiasi di questi formati:",
|
"date": "Qualsiasi data verrà utilizzata come data di scadenza della nuova attività. È possibile utilizzare le date in uno qualsiasi di questi formati:",
|
||||||
"dateWeekday": "qualsiasi giorno della settimana, userà la data più vicina",
|
"dateWeekday": "qualsiasi giorno della settimana, userà la data più vicina",
|
||||||
|
@ -847,19 +848,19 @@
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Elimina il gruppo",
|
"header": "Elimina il gruppo",
|
||||||
"text1": "Sei sicuro di voler eliminare questo gruppo e tutti i suoi membri?",
|
"text1": "Sei sicuro di voler eliminare questo gruppo e tutti i suoi membri?",
|
||||||
"text2": "Tutti i membri del gruppo perderanno l'accesso alle liste e ai namespace condivisi con questo gruppo. NON PUÒ ESSERE RIPRISTINATO!",
|
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||||
"success": "Gruppo eliminato."
|
"success": "Gruppo eliminato."
|
||||||
},
|
},
|
||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"header": "Rimuovi un utente dal gruppo",
|
"header": "Rimuovi un utente dal gruppo",
|
||||||
"text1": "Confermi di voler rimuovere questo utente dal gruppo?",
|
"text1": "Confermi di voler rimuovere questo utente dal gruppo?",
|
||||||
"text2": "Perderanno l'accesso a tutte le liste e i namespace a cui questo gruppo ha accesso. NON PUÒ ESSERE RIPRISTINATO!",
|
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||||
"success": "Utente rimosso dal gruppo."
|
"success": "Utente rimosso dal gruppo."
|
||||||
},
|
},
|
||||||
"leave": {
|
"leave": {
|
||||||
"title": "Abbandona il gruppo",
|
"title": "Abbandona il gruppo",
|
||||||
"text1": "Sei sicuro di voler abbandonare questo gruppo?",
|
"text1": "Sei sicuro di voler abbandonare questo gruppo?",
|
||||||
"text2": "Perderai l'accesso a tutte le liste e namespace a cui questo gruppo ha accesso. Se cambi idea, dovrai farti aggiungere di nuovo da un amministratore del gruppo.",
|
"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.",
|
||||||
"success": "Hai abbandonato il gruppo."
|
"success": "Hai abbandonato il gruppo."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -891,22 +892,22 @@
|
||||||
"attachment": "Aggiungi un allegato a questa attività",
|
"attachment": "Aggiungi un allegato a questa attività",
|
||||||
"related": "Modifica le attività collegate a questa",
|
"related": "Modifica le attività collegate a questa",
|
||||||
"color": "Cambia il colore di questa attività",
|
"color": "Cambia il colore di questa attività",
|
||||||
"move": "Sposta questa attività in un altro elenco",
|
"move": "Move this task to another project",
|
||||||
"reminder": "Gestisci i promemoria di questa attività",
|
"reminder": "Gestisci i promemoria di questa attività",
|
||||||
"description": "Attiva/Disattiva modifica della descrizione dell'attività"
|
"description": "Attiva/Disattiva modifica della descrizione dell'attività"
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"title": "Viste Liste",
|
"title": "Project Views",
|
||||||
"switchToListView": "Passa alla vista Lista",
|
"switchToListView": "Switch to list view",
|
||||||
"switchToGanttView": "Passa alla vista Gantt",
|
"switchToGanttView": "Switch to gantt view",
|
||||||
"switchToKanbanView": "Passa alla vista Kanban",
|
"switchToKanbanView": "Switch to kanban view",
|
||||||
"switchToTableView": "Passa alla vista Tabella"
|
"switchToTableView": "Switch to table view"
|
||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"title": "Navigazione",
|
"title": "Navigazione",
|
||||||
"overview": "Passa a \"Panoramica\"",
|
"overview": "Passa a \"Panoramica\"",
|
||||||
"upcoming": "Passa a \"Prossimamente\"",
|
"upcoming": "Passa a \"Prossimamente\"",
|
||||||
"namespaces": "Passa a \"Namespace e Liste\"",
|
"namespaces": "Navigate to namespaces & projects",
|
||||||
"labels": "Passa a \"Etichette\"",
|
"labels": "Passa a \"Etichette\"",
|
||||||
"teams": "Passa a \"Gruppi\""
|
"teams": "Passa a \"Gruppi\""
|
||||||
}
|
}
|
||||||
|
@ -923,7 +924,7 @@
|
||||||
"unarchive": "Disarchivia",
|
"unarchive": "Disarchivia",
|
||||||
"setBackground": "Imposta sfondo",
|
"setBackground": "Imposta sfondo",
|
||||||
"share": "Condividi",
|
"share": "Condividi",
|
||||||
"newList": "Nuova lista"
|
"newProject": "New project"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"url": "URL Vikunja",
|
"url": "URL Vikunja",
|
||||||
|
@ -942,24 +943,24 @@
|
||||||
"notification": {
|
"notification": {
|
||||||
"title": "Notifiche",
|
"title": "Notifiche",
|
||||||
"none": "Nessuna notifica. Buona giornata!",
|
"none": "Nessuna notifica. Buona giornata!",
|
||||||
"explainer": "Le notifiche appariranno qui quando le azioni su Namespace, liste o attività a cui hai sottoscritto la sottoscrizione avvengono."
|
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||||
},
|
},
|
||||||
"quickActions": {
|
"quickActions": {
|
||||||
"commands": "Comandi",
|
"commands": "Comandi",
|
||||||
"placeholder": "Digita un comando o cerca…",
|
"placeholder": "Digita un comando o cerca…",
|
||||||
"hint": "Puoi usare {list} per limitare la ricerca a una lista. Unisci {list} o {label} (etichette) alla ricerca per trovare un'attività con quelle etichette o in quella lista. Usa {assignee} per cercare solo i gruppi.",
|
"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.",
|
||||||
"tasks": "Attivitá",
|
"tasks": "Attivitá",
|
||||||
"lists": "Liste",
|
"projects": "Projects",
|
||||||
"teams": "Gruppi",
|
"teams": "Gruppi",
|
||||||
"newList": "Inserisci il titolo della nuova lista…",
|
"newProject": "Enter the title of the new project…",
|
||||||
"newTask": "Inserisci il titolo della nuova attività…",
|
"newTask": "Inserisci il titolo della nuova attività…",
|
||||||
"newNamespace": "Inserisci il titolo del nuovo namespace…",
|
"newNamespace": "Inserisci il titolo del nuovo namespace…",
|
||||||
"newTeam": "Inserisci il nome del nuovo gruppo…",
|
"newTeam": "Inserisci il nome del nuovo gruppo…",
|
||||||
"createTask": "Crea un'attività nella lista attuale ({title})",
|
"createTask": "Create a task in the current project ({title})",
|
||||||
"createList": "Crea una lista nel namespace attuale ({title})",
|
"createProject": "Create a project in the current namespace ({title})",
|
||||||
"cmds": {
|
"cmds": {
|
||||||
"newTask": "Nuova attività",
|
"newTask": "Nuova attività",
|
||||||
"newList": "Nuova lista",
|
"newProject": "New project",
|
||||||
"newNamespace": "Nuovo Namespace",
|
"newNamespace": "Nuovo Namespace",
|
||||||
"newTeam": "Nuovo gruppo"
|
"newTeam": "Nuovo gruppo"
|
||||||
}
|
}
|
||||||
|
@ -991,15 +992,15 @@
|
||||||
"1018": "L'impostazione del tipo di avatar utente non è valida.",
|
"1018": "L'impostazione del tipo di avatar utente non è valida.",
|
||||||
"2001": "L'ID non può essere vuoto o 0.",
|
"2001": "L'ID non può essere vuoto o 0.",
|
||||||
"2002": "Alcuni dati della richiesta non erano validi.",
|
"2002": "Alcuni dati della richiesta non erano validi.",
|
||||||
"3001": "La lista non esiste.",
|
"3001": "The project does not exist.",
|
||||||
"3004": "Devi avere i permessi di lettura su quella lista per eseguire quell'azione.",
|
"3004": "You need to have read permissions on that project to perform that action.",
|
||||||
"3005": "Il titolo della lista non può essere vuoto.",
|
"3005": "The project title cannot be empty.",
|
||||||
"3006": "La condivisione della lista non esiste.",
|
"3006": "The project share does not exist.",
|
||||||
"3007": "Esiste già una lista con questo identificatore.",
|
"3007": "A project with this identifier already exists.",
|
||||||
"3008": "La lista è archiviata e può quindi essere consultata solo in sola lettura. Questo vale anche per tutte le attività associate a questa lista.",
|
"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": "Il testo delle attività della lista non può essere vuoto.",
|
"4001": "The project task text cannot be empty.",
|
||||||
"4002": "Lista di attività non esistente.",
|
"4002": "The project task does not exist.",
|
||||||
"4003": "Tutte le attività di modifica in blocco devono appartenere alla stessa lista.",
|
"4003": "All bulk editing tasks must belong to the same project.",
|
||||||
"4004": "Hai bisogno di almeno un'attività quando si modificano in blocco le attività.",
|
"4004": "Hai bisogno di almeno un'attività quando si modificano in blocco le attività.",
|
||||||
"4005": "Non hai il permesso di vedere l'attività.",
|
"4005": "Non hai il permesso di vedere l'attività.",
|
||||||
"4006": "Non è possibile impostare un'attività principale come l'attività stessa.",
|
"4006": "Non è possibile impostare un'attività principale come l'attività stessa.",
|
||||||
|
@ -1025,21 +1026,21 @@
|
||||||
"5012": "Il namespace è archiviato e può quindi essere accessibile solo in sola lettura.",
|
"5012": "Il namespace è archiviato e può quindi essere accessibile solo in sola lettura.",
|
||||||
"6001": "Il nome del gruppo non può essere vuoto.",
|
"6001": "Il nome del gruppo non può essere vuoto.",
|
||||||
"6002": "Gruppo non esistente.",
|
"6002": "Gruppo non esistente.",
|
||||||
"6004": "Il team ha già accesso a questo namespace o lista.",
|
"6004": "The team already has access to that namespace or project.",
|
||||||
"6005": "L'utente è già membro di quel gruppo.",
|
"6005": "L'utente è già membro di quel gruppo.",
|
||||||
"6006": "Non è possibile eliminare l'ultimo membro del gruppo.",
|
"6006": "Non è possibile eliminare l'ultimo membro del gruppo.",
|
||||||
"6007": "Il gruppo non ha accesso alla lista per eseguire quell'azione.",
|
"6007": "The team does not have access to the project to perform that action.",
|
||||||
"7002": "L'utente ha già accesso a quella lista.",
|
"7002": "The user already has access to that project.",
|
||||||
"7003": "Non hai accesso a quella lista.",
|
"7003": "You do not have access to that project.",
|
||||||
"8001": "Questa etichetta esiste già in quell'attività.",
|
"8001": "Questa etichetta esiste già in quell'attività.",
|
||||||
"8002": "L'etichetta non esiste.",
|
"8002": "L'etichetta non esiste.",
|
||||||
"8003": "Non hai accesso a questa etichetta.",
|
"8003": "Non hai accesso a questa etichetta.",
|
||||||
"9001": "Permesso non valido.",
|
"9001": "Permesso non valido.",
|
||||||
"10001": "Colonna non esistente.",
|
"10001": "Colonna non esistente.",
|
||||||
"10002": "La colonna non appartiene a quella lista.",
|
"10002": "The bucket does not belong to that project.",
|
||||||
"10003": "Non puoi rimuovere l'ultima colonna di una lista.",
|
"10003": "You cannot remove the last bucket on a project.",
|
||||||
"10004": "Non puoi aggiungere l'attività a questa colonna perché ha già superato il limite di attività che può contenere.",
|
"10004": "Non puoi aggiungere l'attività a questa colonna perché ha già superato il limite di attività che può contenere.",
|
||||||
"10005": "Ci può essere solo una colonna completati per lista.",
|
"10005": "There can be only one done bucket per project.",
|
||||||
"11001": "Filtro salvato non esistente.",
|
"11001": "Filtro salvato non esistente.",
|
||||||
"11002": "I filtri salvati non sono disponibili per i link di condivisione.",
|
"11002": "I filtri salvati non sono disponibili per i link di condivisione.",
|
||||||
"12001": "Il tipo di entità sottoscritto non è valido.",
|
"12001": "Il tipo di entità sottoscritto non è valido.",
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
"welcomeDay": "Hi {username}!",
|
"welcomeDay": "Hi {username}!",
|
||||||
"welcomeEvening": "Good Evening {username}!",
|
"welcomeEvening": "Good Evening {username}!",
|
||||||
"lastViewed": "Laatst bekeken",
|
"lastViewed": "Laatst bekeken",
|
||||||
"list": {
|
"project": {
|
||||||
"newText": "Je kan een nieuwe lijst maken voor je nieuwe taken:",
|
"newText": "You can create a new project for your new tasks:",
|
||||||
"new": "Nieuwe lijst",
|
"new": "New project",
|
||||||
"importText": "Of importeer je lijsten en taken van andere diensten naar Vikunja:",
|
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||||
"import": "Importeer je gegevens in Vikunja"
|
"import": "Import your data into Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"404": {
|
"404": {
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
"weekStartSunday": "Zondag",
|
"weekStartSunday": "Zondag",
|
||||||
"weekStartMonday": "Maandag",
|
"weekStartMonday": "Maandag",
|
||||||
"language": "Taal",
|
"language": "Taal",
|
||||||
"defaultList": "Standaard lijst",
|
"defaultProject": "Default Project",
|
||||||
"timezone": "Time Zone",
|
"timezone": "Time Zone",
|
||||||
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
||||||
},
|
},
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
},
|
},
|
||||||
"deletion": {
|
"deletion": {
|
||||||
"title": "Verwijder je Vikunja account",
|
"title": "Verwijder je Vikunja account",
|
||||||
"text1": "Het verwijderen van je account is permanent en kan niet ongedaan worden gemaakt. We zullen al je namespaces, lijsten, taken en alles wat ermee verbonden is verwijderen.",
|
"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.",
|
||||||
"text2": "Graag je wachtwoord invullen om verder te gaan. Je zult een e-mail ontvangen met verdere instructies.",
|
"text2": "Graag je wachtwoord invullen om verder te gaan. Je zult een e-mail ontvangen met verdere instructies.",
|
||||||
"confirm": "Verwijder mijn account",
|
"confirm": "Verwijder mijn account",
|
||||||
"requestSuccess": "Het verzoek was succesvol. Je ontvangt een e-mail met verdere instructies.",
|
"requestSuccess": "Het verzoek was succesvol. Je ontvangt een e-mail met verdere instructies.",
|
||||||
|
@ -157,154 +157,154 @@
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"title": "Je Vikunja gegevens exporteren",
|
"title": "Je Vikunja gegevens exporteren",
|
||||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Lists, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
"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.",
|
||||||
"descriptionPasswordRequired": "Voer je wachtwoord in om door te gaan:",
|
"descriptionPasswordRequired": "Voer je wachtwoord in om door te gaan:",
|
||||||
"request": "Een kopie van mijn Vikunja gegevens opvragen",
|
"request": "Een kopie van mijn Vikunja gegevens opvragen",
|
||||||
"success": "Je hebt met succes je Vikunja Data aangevraagd! We sturen je een e-mail zodra het klaar is om te downloaden.",
|
"success": "Je hebt met succes je Vikunja Data aangevraagd! We sturen je een e-mail zodra het klaar is om te downloaden.",
|
||||||
"downloadTitle": "Download je geëxporteerde Vikunja gegevens"
|
"downloadTitle": "Download je geëxporteerde Vikunja gegevens"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"archived": "This list is archived. It is not possible to create new or edit tasks for it.",
|
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||||
"title": "Lijst titel",
|
"title": "Project Title",
|
||||||
"color": "Kleur",
|
"color": "Color",
|
||||||
"lists": "Lijsten",
|
"projects": "Projects",
|
||||||
"list": {
|
"search": "Type to search for a project…",
|
||||||
"title": "Lijst",
|
"searchSelect": "Click or press enter to select this project",
|
||||||
"add": "Toevoegen",
|
"shared": "Shared Projects",
|
||||||
"addPlaceholder": "Voeg een nieuwe taak toe…",
|
"noDescriptionAvailable": "No project description is available.",
|
||||||
"empty": "Deze lijst is momenteel leeg.",
|
|
||||||
"newTaskCta": "Creëer een nieuwe taak.",
|
|
||||||
"editTask": "Taak bewerken"
|
|
||||||
},
|
|
||||||
"search": "Typ om naar een lijst te zoeken…",
|
|
||||||
"searchSelect": "Klik of druk op enter om deze lijst te selecteren",
|
|
||||||
"shared": "Gedeelde lijsten",
|
|
||||||
"noDescriptionAvailable": "No list description is available.",
|
|
||||||
"create": {
|
"create": {
|
||||||
"header": "Nieuwe lijst",
|
"header": "New project",
|
||||||
"titlePlaceholder": "De titel van de lijst komt hier…",
|
"titlePlaceholder": "The project's title goes here…",
|
||||||
"addTitleRequired": "Voer alsjeblieft een titel in.",
|
"addTitleRequired": "Please specify a title.",
|
||||||
"createdSuccess": "Lijst is succesvol aangemaakt.",
|
"createdSuccess": "The project was successfully created.",
|
||||||
"addListRequired": "Please specify a list or set a default list in the settings."
|
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"title": "Archiveer \"{list}\"",
|
"title": "Archive \"{project}\"",
|
||||||
"archive": "Archiveer deze lijst",
|
"archive": "Archive this project",
|
||||||
"unarchive": "Archivering van deze lijst opheffen",
|
"unarchive": "Un-Archive this project",
|
||||||
"unarchiveText": "Je kan nieuwe taken maken of bewerken.",
|
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||||
"archiveText": "You won't be able to edit this list or create new tasks until you un-archive it.",
|
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||||
"success": "De lijst is succesvol gearchiveerd."
|
"success": "The project was successfully archived."
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
"title": "Achtergrond van lijst instellen",
|
"title": "Set project background",
|
||||||
"remove": "Verwijder achtergrond",
|
"remove": "Remove Background",
|
||||||
"upload": "Kies een achtergrond vanuit je pc",
|
"upload": "Choose a background from your pc",
|
||||||
"searchPlaceholder": "Naar een achtergrond zoeken…",
|
"searchPlaceholder": "Search for a background…",
|
||||||
"poweredByUnsplash": "Mogelijk gemaakt door Unsplash",
|
"poweredByUnsplash": "Powered by Unsplash",
|
||||||
"loadMore": "Meer foto's laden",
|
"loadMore": "Load more photos",
|
||||||
"success": "De achtergrond is succesvol ingesteld!",
|
"success": "The background has been set successfully!",
|
||||||
"removeSuccess": "De achtergrond is succesvol verwijderd!"
|
"removeSuccess": "The background has been removed successfully!"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Verwijder \"{list}\"",
|
"title": "Delete \"{project}\"",
|
||||||
"header": "Verwijder deze lijst",
|
"header": "Delete this project",
|
||||||
"text1": "Are you sure you want to delete this list and all of its contents?",
|
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||||
"text2": "Dit omvat alle taken en KAN NIET ONGEDAAN GEMAAKT WORDEN!",
|
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||||
"success": "De lijst is succesvol verwijderd.",
|
"success": "The project was successfully deleted.",
|
||||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||||
"noTasksToDelete": "This list does not contain any tasks, it should be safe to delete."
|
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||||
},
|
},
|
||||||
"duplicate": {
|
"duplicate": {
|
||||||
"title": "Deze lijst dupliceren",
|
"title": "Duplicate this project",
|
||||||
"label": "Dupliceer",
|
"label": "Duplicate",
|
||||||
"text": "Select a namespace which should hold the duplicated list:",
|
"text": "Select a namespace which should hold the duplicated project:",
|
||||||
"success": "De lijst is succesvol gedupliceerd."
|
"success": "The project was successfully duplicated."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"header": "Bewerk deze lijst",
|
"header": "Edit This Project",
|
||||||
"title": "Bewerk \"{list}\"",
|
"title": "Edit \"{project}\"",
|
||||||
"titlePlaceholder": "De titel van de lijst komt hier…",
|
"titlePlaceholder": "The project title goes here…",
|
||||||
"identifierTooltip": "The list identifier can be used to uniquely identify a task across lists. You can set it to empty to disable it.",
|
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||||
"identifier": "List Identifier",
|
"identifier": "Project Identifier",
|
||||||
"identifierPlaceholder": "The list identifier goes here…",
|
"identifierPlaceholder": "The project identifier goes here…",
|
||||||
"description": "Beschrijving",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "The lists description goes here…",
|
"descriptionPlaceholder": "The projects description goes here…",
|
||||||
"color": "Kleur",
|
"color": "Color",
|
||||||
"success": "De lijst is succesvol bijgewerkt."
|
"success": "The project was successfully updated."
|
||||||
},
|
},
|
||||||
"share": {
|
"share": {
|
||||||
"header": "Deel deze lijst",
|
"header": "Share this project",
|
||||||
"title": "Deel \"{list}\"",
|
"title": "Share \"{project}\"",
|
||||||
"share": "Delen",
|
"share": "Share",
|
||||||
"links": {
|
"links": {
|
||||||
"title": "Share Links",
|
"title": "Share Links",
|
||||||
"what": "What is a share link?",
|
"what": "What is a share link?",
|
||||||
"explanation": "Share Links allow you to easily share a list with other users who don't have an account on Vikunja.",
|
"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",
|
"create": "Create a new link share",
|
||||||
"name": "Naam (optioneel)",
|
"name": "Name (optional)",
|
||||||
"namePlaceholder": "bv. Lorem Ipsum",
|
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||||
"nameExplanation": "All actions done by this link share will show up with the name.",
|
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||||
"password": "Wachtwoord (optioneel)",
|
"password": "Password (optional)",
|
||||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||||
"noName": "Geen naam ingesteld",
|
"noName": "No name set",
|
||||||
"remove": "Remove a link share",
|
"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 list with this link share. This cannot be undone!",
|
"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.",
|
"createSuccess": "The link share was successfully created.",
|
||||||
"deleteSuccess": "The link share was successfully deleted",
|
"deleteSuccess": "The link share was successfully deleted",
|
||||||
"view": "View",
|
"view": "View",
|
||||||
"sharedBy": "Shared by {0}"
|
"sharedBy": "Shared by {0}"
|
||||||
},
|
},
|
||||||
"userTeam": {
|
"userTeam": {
|
||||||
"typeUser": "gebruiker | gebruikers",
|
"typeUser": "user | users",
|
||||||
"typeTeam": "team | teams",
|
"typeTeam": "team | teams",
|
||||||
"shared": "Shared with these {type}",
|
"shared": "Shared with these {type}",
|
||||||
"you": "Jij",
|
"you": "You",
|
||||||
"notShared": "Not shared with any {type} yet.",
|
"notShared": "Not shared with any {type} yet.",
|
||||||
"removeHeader": "Remove a {type} from the {sharable}",
|
"removeHeader": "Remove a {type} from the {sharable}",
|
||||||
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
"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}.",
|
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||||
"addedSuccess": "Het {type} is succesvol toegevoegd.",
|
"addedSuccess": "The {type} was successfully added.",
|
||||||
"updatedSuccess": "The {type} was successfully added."
|
"updatedSuccess": "The {type} was successfully added."
|
||||||
},
|
},
|
||||||
"right": {
|
"right": {
|
||||||
"title": "Permission",
|
"title": "Permission",
|
||||||
"read": "Alleen lezen",
|
"read": "Read only",
|
||||||
"readWrite": "Lezen & schrijven",
|
"readWrite": "Read & write",
|
||||||
"admin": "Beheerder"
|
"admin": "Admin"
|
||||||
},
|
},
|
||||||
"attributes": {
|
"attributes": {
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"delete": "Verwijderen"
|
"delete": "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"
|
||||||
|
},
|
||||||
"gantt": {
|
"gantt": {
|
||||||
"title": "Gantt",
|
"title": "Gantt",
|
||||||
"showTasksWithoutDates": "Toon taken waarvoor geen datums zijn ingesteld",
|
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||||
"size": "Grootte",
|
"size": "Size",
|
||||||
"default": "Standaard",
|
"default": "Default",
|
||||||
"month": "Maand",
|
"month": "Month",
|
||||||
"day": "Dag",
|
"day": "Day",
|
||||||
"hour": "Hour",
|
"hour": "Hour",
|
||||||
"range": "Date Range",
|
"range": "Date Range",
|
||||||
"noDates": "This task has no dates set."
|
"noDates": "This task has no dates set."
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"title": "Tabel",
|
"title": "Table",
|
||||||
"columns": "Kolommen"
|
"columns": "Columns"
|
||||||
},
|
},
|
||||||
"kanban": {
|
"kanban": {
|
||||||
"title": "Kanban",
|
"title": "Kanban",
|
||||||
"limit": "Limiet: {limit}",
|
"limit": "Limit: {limit}",
|
||||||
"noLimit": "Niet ingesteld",
|
"noLimit": "Not Set",
|
||||||
"doneBucket": "Done bucket",
|
"doneBucket": "Done bucket",
|
||||||
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
"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.",
|
"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.",
|
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||||
"deleteLast": "You cannot remove the last bucket.",
|
"deleteLast": "You cannot remove the last bucket.",
|
||||||
"addTaskPlaceholder": "Voer de nieuwe taak titel in…",
|
"addTaskPlaceholder": "Enter the new task title…",
|
||||||
"addTask": "Taak toevoegen",
|
"addTask": "Add a task",
|
||||||
"addAnotherTask": "Nog een taak toevoegen",
|
"addAnotherTask": "Add another task",
|
||||||
"addBucket": "Create a new bucket",
|
"addBucket": "Create a new bucket",
|
||||||
"addBucketPlaceholder": "Enter the new bucket title…",
|
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||||
"deleteHeaderBucket": "Delete the bucket",
|
"deleteHeaderBucket": "Delete the bucket",
|
||||||
|
@ -317,41 +317,41 @@
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favorieten"
|
"title": "Favorites"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"namespace": {
|
"namespace": {
|
||||||
"title": "Namespaces & lijsten",
|
"title": "Namespaces & Projects",
|
||||||
"namespace": "Namespace",
|
"namespace": "Namespace",
|
||||||
"showArchived": "Toon gearchiveerd",
|
"showArchived": "Toon gearchiveerd",
|
||||||
"noneAvailable": "Je hebt op dit moment geen Namespaces.",
|
"noneAvailable": "Je hebt op dit moment geen Namespaces.",
|
||||||
"unarchive": "Archivering opheffen",
|
"unarchive": "Archivering opheffen",
|
||||||
"archived": "Gearchiveerd",
|
"archived": "Gearchiveerd",
|
||||||
"noLists": "Deze namespace bevat geen lijsten.",
|
"noProjects": "This namespace does not contain any projects.",
|
||||||
"createList": "Maak een nieuwe lijst in deze namespace.",
|
"createProject": "Create a new project in this namespace.",
|
||||||
"namespaces": "Namespaces",
|
"namespaces": "Namespaces",
|
||||||
"search": "Begin met typen om een Namespace te zoeken…",
|
"search": "Begin met typen om een Namespace te zoeken…",
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nieuwe namespace",
|
"title": "Nieuwe namespace",
|
||||||
"titleRequired": "Voer een titel in.",
|
"titleRequired": "Voer een titel in.",
|
||||||
"explanation": "A namespace is a collection of lists you can share and use to organize your lists with. In fact, every list belongs to a namespace.",
|
"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.",
|
||||||
"tooltip": "Wat is een namespace?",
|
"tooltip": "Wat is een namespace?",
|
||||||
"success": "De Namespace is succesvol gemaakt."
|
"success": "De Namespace is succesvol gemaakt."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"titleArchive": "Archiveer \"{namespace}\"",
|
"titleArchive": "Archiveer \"{namespace}\"",
|
||||||
"titleUnarchive": "Archivering \"{namespace}\" ongedaan maken",
|
"titleUnarchive": "Archivering \"{namespace}\" ongedaan maken",
|
||||||
"archiveText": "You won't be able to edit this namespace or create new lists until you un-archive it. This will also archive all lists in this 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": "Je kan nieuwe lijsten maken of deze bewerken.",
|
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||||
"success": "The namespace was successfully archived.",
|
"success": "The namespace was successfully archived.",
|
||||||
"unarchiveSuccess": "The namespace was successfully un-archived.",
|
"unarchiveSuccess": "The namespace was successfully un-archived.",
|
||||||
"description": "If a namespace is archived, you cannot create new lists or edit it."
|
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "\"{namespace}\" verwijderen",
|
"title": "\"{namespace}\" verwijderen",
|
||||||
"text1": "Weet je zeker dat je deze Namespace en alle inhoud ervan wilt verwijderen?",
|
"text1": "Weet je zeker dat je deze Namespace en alle inhoud ervan wilt verwijderen?",
|
||||||
"text2": "Dit omvat alle lijsten en taken en KAN NIET ONGEDAAN GEMAAKT WORDEN!",
|
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||||
"success": "De Namespace is succesvol verwijderd."
|
"success": "De Namespace is succesvol verwijderd."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
|
@ -371,8 +371,8 @@
|
||||||
"isArchived": "This namespace is archived"
|
"isArchived": "This namespace is archived"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"sharedLists": {
|
"sharedProjects": {
|
||||||
"title": "Gedeelde lijsten"
|
"title": "Shared Projects"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favorieten"
|
"title": "Favorieten"
|
||||||
|
@ -403,7 +403,7 @@
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "New Saved Filter",
|
"title": "New Saved Filter",
|
||||||
"description": "A saved filter is a virtual list which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
"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.",
|
||||||
"action": "Create new saved filter",
|
"action": "Create new saved filter",
|
||||||
"titleRequired": "Please provide a title for the filter."
|
"titleRequired": "Please provide a title for the filter."
|
||||||
},
|
},
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
"label": {
|
"label": {
|
||||||
"title": "Labels",
|
"title": "Labels",
|
||||||
"manage": "Labels beheren",
|
"manage": "Labels beheren",
|
||||||
"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 list you have access.",
|
"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.",
|
||||||
"newCTA": "Je hebt momenteel geen labels.",
|
"newCTA": "Je hebt momenteel geen labels.",
|
||||||
"search": "Type to search for a label…",
|
"search": "Type to search for a label…",
|
||||||
"create": {
|
"create": {
|
||||||
|
@ -460,7 +460,7 @@
|
||||||
},
|
},
|
||||||
"sharing": {
|
"sharing": {
|
||||||
"authenticating": "Authenticeren…",
|
"authenticating": "Authenticeren…",
|
||||||
"passwordRequired": "Deze gedeelde lijst vereist een wachtwoord. Gelieve hieronder in te voeren:",
|
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||||
"error": "Er is een fout opgetreden.",
|
"error": "Er is een fout opgetreden.",
|
||||||
"invalidPassword": "Het wachtwoord is ongeldig."
|
"invalidPassword": "Het wachtwoord is ongeldig."
|
||||||
},
|
},
|
||||||
|
@ -529,7 +529,7 @@
|
||||||
"code": "Code",
|
"code": "Code",
|
||||||
"quote": "Citaat",
|
"quote": "Citaat",
|
||||||
"unorderedList": "Ongesorteerde lijst",
|
"unorderedList": "Ongesorteerde lijst",
|
||||||
"orderedList": "Ordered List",
|
"orderedList ": "Ordered List",
|
||||||
"cleanBlock": "Clean Block",
|
"cleanBlock": "Clean Block",
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"image": "Afbeelding",
|
"image": "Afbeelding",
|
||||||
|
@ -602,6 +602,7 @@
|
||||||
"addReminder": "Nieuwe herinnering toevoegen…",
|
"addReminder": "Nieuwe herinnering toevoegen…",
|
||||||
"doneSuccess": "The task was successfully marked as done.",
|
"doneSuccess": "The task was successfully marked as done.",
|
||||||
"undoneSuccess": "The task was successfully un-marked as done.",
|
"undoneSuccess": "The task was successfully un-marked as done.",
|
||||||
|
"undo": "Undo",
|
||||||
"openDetail": "Open task detail view",
|
"openDetail": "Open task detail view",
|
||||||
"checklistTotal": "{checked} van {total} taken",
|
"checklistTotal": "{checked} van {total} taken",
|
||||||
"checklistAllDone": "{total} taken",
|
"checklistAllDone": "{total} taken",
|
||||||
|
@ -618,7 +619,7 @@
|
||||||
"chooseDueDate": "Klik hier om een vervaldatum in te stellen",
|
"chooseDueDate": "Klik hier om een vervaldatum in te stellen",
|
||||||
"chooseStartDate": "Klik hier om een begindatum in te stellen",
|
"chooseStartDate": "Klik hier om een begindatum in te stellen",
|
||||||
"chooseEndDate": "Klik hier om een einddatum in te stellen",
|
"chooseEndDate": "Klik hier om een einddatum in te stellen",
|
||||||
"move": "Verplaats taak naar een andere lijst",
|
"move": "Move task to a different project",
|
||||||
"done": "Mark task done!",
|
"done": "Mark task done!",
|
||||||
"undone": "Markeer als niet voltooid",
|
"undone": "Markeer als niet voltooid",
|
||||||
"created": "Created {0} by {1}",
|
"created": "Created {0} by {1}",
|
||||||
|
@ -626,7 +627,7 @@
|
||||||
"doneAt": "Done {0}",
|
"doneAt": "Done {0}",
|
||||||
"updateSuccess": "De taak is succesvol opgeslagen.",
|
"updateSuccess": "De taak is succesvol opgeslagen.",
|
||||||
"deleteSuccess": "De taak is succesvol verwijderd.",
|
"deleteSuccess": "De taak is succesvol verwijderd.",
|
||||||
"belongsToList": "Deze taak hoort bij de lijst '{list}'",
|
"belongsToProject": "This task belongs to project '{project}'",
|
||||||
"due": "Vervalt {at}",
|
"due": "Vervalt {at}",
|
||||||
"closePopup": "Close popup",
|
"closePopup": "Close popup",
|
||||||
"delete": {
|
"delete": {
|
||||||
|
@ -646,7 +647,7 @@
|
||||||
"percentDone": "Set Progress",
|
"percentDone": "Set Progress",
|
||||||
"attachments": "Add Attachments",
|
"attachments": "Add Attachments",
|
||||||
"relatedTasks": "Add Relation",
|
"relatedTasks": "Add Relation",
|
||||||
"moveList": "Move",
|
"moveProject": "Move",
|
||||||
"color": "Set Color",
|
"color": "Set Color",
|
||||||
"delete": "Verwijder",
|
"delete": "Verwijder",
|
||||||
"favorite": "Toevoegen aan favorieten",
|
"favorite": "Toevoegen aan favorieten",
|
||||||
|
@ -673,21 +674,21 @@
|
||||||
"updated": "Bijgewerkt"
|
"updated": "Bijgewerkt"
|
||||||
},
|
},
|
||||||
"subscription": {
|
"subscription": {
|
||||||
"subscribedListThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this list through its namespace.",
|
"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.",
|
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
|
||||||
"subscribedTaskThroughParentList": "You can't unsubscribe here because you are subscribed to this task through its list.",
|
"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.",
|
"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.",
|
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
|
||||||
"subscribedList": "You are currently subscribed to this list and will receive notifications for changes.",
|
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||||
"notSubscribedList": "You are not subscribed to this list and won't 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.",
|
"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.",
|
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
|
||||||
"subscribe": "Subscribe",
|
"subscribe": "Subscribe",
|
||||||
"unsubscribe": "Unsubscribe",
|
"unsubscribe": "Unsubscribe",
|
||||||
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
||||||
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
||||||
"subscribeSuccessList": "You are now subscribed to this list",
|
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||||
},
|
},
|
||||||
|
@ -761,7 +762,7 @@
|
||||||
"new": "Nieuwe taakrelatie",
|
"new": "Nieuwe taakrelatie",
|
||||||
"searchPlaceholder": "Type search for a new task to add as related…",
|
"searchPlaceholder": "Type search for a new task to add as related…",
|
||||||
"createPlaceholder": "Voeg dit toe als nieuwe gerelateerde taak",
|
"createPlaceholder": "Voeg dit toe als nieuwe gerelateerde taak",
|
||||||
"differentList": "Deze taak hoort bij een andere lijst.",
|
"differentProject": "This task belongs to a different project.",
|
||||||
"differentNamespace": "This task belongs to a different namespace.",
|
"differentNamespace": "This task belongs to a different namespace.",
|
||||||
"noneYet": "Nog geen taakrelaties.",
|
"noneYet": "Nog geen taakrelaties.",
|
||||||
"delete": "Taak relatie verwijderen",
|
"delete": "Taak relatie verwijderen",
|
||||||
|
@ -811,10 +812,10 @@
|
||||||
"priority1": "Om prioriteit aan een taak te geven voeg je een nummer tussen 1-5 toe, beginnend met een {prefix}.",
|
"priority1": "Om prioriteit aan een taak te geven voeg je een nummer tussen 1-5 toe, beginnend met een {prefix}.",
|
||||||
"priority2": "Hoe hoger het getal, hoe hoger de prioriteit.",
|
"priority2": "Hoe hoger het getal, hoe hoger de prioriteit.",
|
||||||
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
||||||
"list1": "To set a list for the task to appear in, enter its name prefixed with {prefix}.",
|
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||||
"list2": "Dit geeft een foutmelding als de lijst niet bestaat.",
|
"project2": "This will return an error if the project does not exist.",
|
||||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||||
"list4": "For example: {prefix}\"List with spaces\".",
|
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||||
"dateAndTime": "Datum en tijd",
|
"dateAndTime": "Datum en tijd",
|
||||||
"date": "Any date will be used as the due date of the new task. You can use dates in any of these formats:",
|
"date": "Any date will be used as the due date of the new task. You can use dates in any of these formats:",
|
||||||
"dateWeekday": "any weekday, will use the next date with that date",
|
"dateWeekday": "any weekday, will use the next date with that date",
|
||||||
|
@ -847,19 +848,19 @@
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Verwijder het team",
|
"header": "Verwijder het team",
|
||||||
"text1": "Are you sure you want to delete this team and all of its members?",
|
"text1": "Are you sure you want to delete this team and all of its members?",
|
||||||
"text2": "All team members will lose access to lists and namespaces shared with this team. This CANNOT BE UNDONE!",
|
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||||
"success": "The team was successfully deleted."
|
"success": "The team was successfully deleted."
|
||||||
},
|
},
|
||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"header": "Verwijder een gebruiker uit het team",
|
"header": "Verwijder een gebruiker uit het team",
|
||||||
"text1": "Weet je zeker dat je deze gebruiker wilt verwijderen uit het team?",
|
"text1": "Weet je zeker dat je deze gebruiker wilt verwijderen uit het team?",
|
||||||
"text2": "They will lose access to all lists and namespaces this team has access to. This CANNOT BE UNDONE!",
|
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||||
"success": "The user was successfully deleted from the team."
|
"success": "The user was successfully deleted from the team."
|
||||||
},
|
},
|
||||||
"leave": {
|
"leave": {
|
||||||
"title": "Leave team",
|
"title": "Leave team",
|
||||||
"text1": "Are you sure you want to leave this team?",
|
"text1": "Are you sure you want to leave this team?",
|
||||||
"text2": "You will lose access to all lists and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
"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.",
|
||||||
"success": "You have successfully left the team."
|
"success": "You have successfully left the team."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -891,12 +892,12 @@
|
||||||
"attachment": "Add an attachment to this task",
|
"attachment": "Add an attachment to this task",
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another project",
|
||||||
"reminder": "Manage reminders of this task",
|
"reminder": "Manage reminders of this task",
|
||||||
"description": "Toggle editing of the task description"
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"title": "List Views",
|
"title": "Project Views",
|
||||||
"switchToListView": "Switch to list view",
|
"switchToListView": "Switch to list view",
|
||||||
"switchToGanttView": "Switch to gantt view",
|
"switchToGanttView": "Switch to gantt view",
|
||||||
"switchToKanbanView": "Switch to kanban view",
|
"switchToKanbanView": "Switch to kanban view",
|
||||||
|
@ -906,7 +907,7 @@
|
||||||
"title": "Navigation",
|
"title": "Navigation",
|
||||||
"overview": "Navigate to overview",
|
"overview": "Navigate to overview",
|
||||||
"upcoming": "Navigate to upcoming tasks",
|
"upcoming": "Navigate to upcoming tasks",
|
||||||
"namespaces": "Navigate to namespaces & lists",
|
"namespaces": "Navigate to namespaces & projects",
|
||||||
"labels": "Navigate to labels",
|
"labels": "Navigate to labels",
|
||||||
"teams": "Navigate to teams"
|
"teams": "Navigate to teams"
|
||||||
}
|
}
|
||||||
|
@ -923,7 +924,7 @@
|
||||||
"unarchive": "Archivering opheffen",
|
"unarchive": "Archivering opheffen",
|
||||||
"setBackground": "Achtergrond instellen",
|
"setBackground": "Achtergrond instellen",
|
||||||
"share": "Delen",
|
"share": "Delen",
|
||||||
"newList": "Nieuwe lijst"
|
"newProject": "New project"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"url": "Vikunja URL",
|
"url": "Vikunja URL",
|
||||||
|
@ -942,24 +943,24 @@
|
||||||
"notification": {
|
"notification": {
|
||||||
"title": "Notificaties",
|
"title": "Notificaties",
|
||||||
"none": "Je hebt geen meldingen. Fijne dag!",
|
"none": "Je hebt geen meldingen. Fijne dag!",
|
||||||
"explainer": "Notifications will appear here when actions on namespaces, lists or tasks you subscribed to happen."
|
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||||
},
|
},
|
||||||
"quickActions": {
|
"quickActions": {
|
||||||
"commands": "Commands",
|
"commands": "Commands",
|
||||||
"placeholder": "Type a command or search…",
|
"placeholder": "Type a command or search…",
|
||||||
"hint": "You can use {list} to limit the search to a list. Combine {list} or {label} (labels) with a search query to search for a task with these labels or on that list. Use {assignee} to only search for teams.",
|
"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.",
|
||||||
"tasks": "Taken",
|
"tasks": "Taken",
|
||||||
"lists": "Lijsten",
|
"projects": "Projects",
|
||||||
"teams": "Teams",
|
"teams": "Teams",
|
||||||
"newList": "Enter the title of the new list…",
|
"newProject": "Enter the title of the new project…",
|
||||||
"newTask": "Enter the title of the new task…",
|
"newTask": "Enter the title of the new task…",
|
||||||
"newNamespace": "Enter the title of the new namespace…",
|
"newNamespace": "Enter the title of the new namespace…",
|
||||||
"newTeam": "Enter the name of the new team…",
|
"newTeam": "Enter the name of the new team…",
|
||||||
"createTask": "Create a task in the current list ({title})",
|
"createTask": "Create a task in the current project ({title})",
|
||||||
"createList": "Create a list in the current namespace ({title})",
|
"createProject": "Create a project in the current namespace ({title})",
|
||||||
"cmds": {
|
"cmds": {
|
||||||
"newTask": "Nieuwe taak",
|
"newTask": "Nieuwe taak",
|
||||||
"newList": "Nieuwe lijst",
|
"newProject": "New project",
|
||||||
"newNamespace": "Nieuwe namespace",
|
"newNamespace": "Nieuwe namespace",
|
||||||
"newTeam": "Nieuw team"
|
"newTeam": "Nieuw team"
|
||||||
}
|
}
|
||||||
|
@ -991,15 +992,15 @@
|
||||||
"1018": "The user avatar type setting is invalid.",
|
"1018": "The user avatar type setting is invalid.",
|
||||||
"2001": "ID cannot be empty or 0.",
|
"2001": "ID cannot be empty or 0.",
|
||||||
"2002": "Some of the request data was invalid.",
|
"2002": "Some of the request data was invalid.",
|
||||||
"3001": "De lijst bestaat niet.",
|
"3001": "The project does not exist.",
|
||||||
"3004": "Je moet leesrechten hebben op die lijst om die actie uit te voeren.",
|
"3004": "You need to have read permissions on that project to perform that action.",
|
||||||
"3005": "De titel van de lijst mag niet leeg zijn.",
|
"3005": "The project title cannot be empty.",
|
||||||
"3006": "The list share does not exist.",
|
"3006": "The project share does not exist.",
|
||||||
"3007": "A list with this identifier already exists.",
|
"3007": "A project with this identifier already exists.",
|
||||||
"3008": "The list is archived and can therefore only be accessed read only. This is also true for all tasks associated with this list.",
|
"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 list task text cannot be empty.",
|
"4001": "The project task text cannot be empty.",
|
||||||
"4002": "The list task does not exist.",
|
"4002": "The project task does not exist.",
|
||||||
"4003": "All bulk editing tasks must belong to the same list.",
|
"4003": "All bulk editing tasks must belong to the same project.",
|
||||||
"4004": "Need at least one task when bulk editing tasks.",
|
"4004": "Need at least one task when bulk editing tasks.",
|
||||||
"4005": "You do not have the right to see the task.",
|
"4005": "You do not have the right to see the task.",
|
||||||
"4006": "You can't set a parent task as the task itself.",
|
"4006": "You can't set a parent task as the task itself.",
|
||||||
|
@ -1025,21 +1026,21 @@
|
||||||
"5012": "The namespace is archived and can therefore only be accessed read only.",
|
"5012": "The namespace is archived and can therefore only be accessed read only.",
|
||||||
"6001": "The team name cannot be empty.",
|
"6001": "The team name cannot be empty.",
|
||||||
"6002": "Het team bestaat niet.",
|
"6002": "Het team bestaat niet.",
|
||||||
"6004": "Het team heeft al toegang tot die namespace of lijst.",
|
"6004": "The team already has access to that namespace or project.",
|
||||||
"6005": "The user is already a member of that team.",
|
"6005": "The user is already a member of that team.",
|
||||||
"6006": "Kan het laatste teamlid niet verwijderen.",
|
"6006": "Kan het laatste teamlid niet verwijderen.",
|
||||||
"6007": "Het team heeft geen toegang tot de lijst om die actie uit te voeren.",
|
"6007": "The team does not have access to the project to perform that action.",
|
||||||
"7002": "De gebruiker heeft al toegang tot deze lijst.",
|
"7002": "The user already has access to that project.",
|
||||||
"7003": "Je hebt geen toegang tot die lijst.",
|
"7003": "You do not have access to that project.",
|
||||||
"8001": "Dit label bestaat al voor die taak.",
|
"8001": "Dit label bestaat al voor die taak.",
|
||||||
"8002": "Het label bestaat niet.",
|
"8002": "Het label bestaat niet.",
|
||||||
"8003": "Je hebt geen toegang tot dit label.",
|
"8003": "Je hebt geen toegang tot dit label.",
|
||||||
"9001": "Ongeldige rechten.",
|
"9001": "Ongeldige rechten.",
|
||||||
"10001": "The bucket does not exist.",
|
"10001": "The bucket does not exist.",
|
||||||
"10002": "The bucket does not belong to that list.",
|
"10002": "The bucket does not belong to that project.",
|
||||||
"10003": "You cannot remove the last bucket on a list.",
|
"10003": "You cannot remove the last bucket on a project.",
|
||||||
"10004": "You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold.",
|
"10004": "You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold.",
|
||||||
"10005": "There can be only one done bucket per list.",
|
"10005": "There can be only one done bucket per project.",
|
||||||
"11001": "Het opgeslagen filter bestaat niet.",
|
"11001": "Het opgeslagen filter bestaat niet.",
|
||||||
"11002": "Saved filters are not available for link shares.",
|
"11002": "Saved filters are not available for link shares.",
|
||||||
"12001": "The subscription entity type is invalid.",
|
"12001": "The subscription entity type is invalid.",
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
"welcomeDay": "Hei {username}!",
|
"welcomeDay": "Hei {username}!",
|
||||||
"welcomeEvening": "God Morgen {username}!",
|
"welcomeEvening": "God Morgen {username}!",
|
||||||
"lastViewed": "Sist sett",
|
"lastViewed": "Sist sett",
|
||||||
"list": {
|
"project": {
|
||||||
"newText": "Du kan opprette en ny liste for dine nye oppgaver:",
|
"newText": "You can create a new project for your new tasks:",
|
||||||
"new": "Ny liste",
|
"new": "New project",
|
||||||
"importText": "Eller importer lister og oppgaver fra andre tjenester til Vikunja:",
|
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||||
"import": "Importer dine data til Vikunja"
|
"import": "Import your data into Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"404": {
|
"404": {
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
"weekStartSunday": "Søndag",
|
"weekStartSunday": "Søndag",
|
||||||
"weekStartMonday": "Mandag",
|
"weekStartMonday": "Mandag",
|
||||||
"language": "Språk",
|
"language": "Språk",
|
||||||
"defaultList": "Standardliste",
|
"defaultProject": "Default Project",
|
||||||
"timezone": "Tidssone",
|
"timezone": "Tidssone",
|
||||||
"overdueTasksRemindersTime": "Utløpte påminnelses-tid for oppgaver"
|
"overdueTasksRemindersTime": "Utløpte påminnelses-tid for oppgaver"
|
||||||
},
|
},
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
},
|
},
|
||||||
"deletion": {
|
"deletion": {
|
||||||
"title": "Slett kontoen din",
|
"title": "Slett kontoen din",
|
||||||
"text1": "Sletting av kontoen din er permanent og kan ikke reverseres. Vi vil slette alle navnefeltene, lister, oppgaver og alt knyttet til den.",
|
"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.",
|
||||||
"text2": "For å fortsette, skriv inn passordet ditt. Du vil motta en e-post med ytterligere instruksjoner.",
|
"text2": "For å fortsette, skriv inn passordet ditt. Du vil motta en e-post med ytterligere instruksjoner.",
|
||||||
"confirm": "Slett min konto",
|
"confirm": "Slett min konto",
|
||||||
"requestSuccess": "Forespørselen var vellykket. Du vil motta en e-post med ytterligere instruksjoner.",
|
"requestSuccess": "Forespørselen var vellykket. Du vil motta en e-post med ytterligere instruksjoner.",
|
||||||
|
@ -157,201 +157,201 @@
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"title": "Eksporter dine kontodata",
|
"title": "Eksporter dine kontodata",
|
||||||
"description": "Du kan be om en kopi av alle Vikunja dataene dine. Dette inkluderer navneområder, lister, oppgaver og alt tilknyttet dem.",
|
"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.",
|
||||||
"descriptionPasswordRequired": "Skriv inn passordet for å fortsette:",
|
"descriptionPasswordRequired": "Skriv inn passordet for å fortsette:",
|
||||||
"request": "Be om kopi av mine Vikunja Data",
|
"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.",
|
"success": "Du har spurt om dine Vikunja data! Vi sender deg en e-post når den er klar til å laste ned.",
|
||||||
"downloadTitle": "Last ned dine eksporterte Vikunja data"
|
"downloadTitle": "Last ned dine eksporterte Vikunja data"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"archived": "Denne listen er arkivert. Det er ikke mulig å opprette nye eller redigere oppgaver for den.",
|
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||||
"title": "Listenavn",
|
"title": "Project Title",
|
||||||
"color": "Farge",
|
"color": "Color",
|
||||||
"lists": "Lister",
|
"projects": "Projects",
|
||||||
"list": {
|
"search": "Type to search for a project…",
|
||||||
"title": "Liste",
|
"searchSelect": "Click or press enter to select this project",
|
||||||
"add": "Legg til",
|
"shared": "Shared Projects",
|
||||||
"addPlaceholder": "Legg til ny oppgave…",
|
"noDescriptionAvailable": "No project description is available.",
|
||||||
"empty": "Denne listen er for øyeblikket tom.",
|
|
||||||
"newTaskCta": "Lage en ny oppgave.",
|
|
||||||
"editTask": "Endre oppgave"
|
|
||||||
},
|
|
||||||
"search": "Skriv for å søke etter en liste…",
|
|
||||||
"searchSelect": "Klikk eller trykk enter for å velge denne listen",
|
|
||||||
"shared": "Delte lister",
|
|
||||||
"noDescriptionAvailable": "Ingen beskrivelse er tilgengelig.",
|
|
||||||
"create": {
|
"create": {
|
||||||
"header": "Ny liste",
|
"header": "New project",
|
||||||
"titlePlaceholder": "Listens tittel går her…",
|
"titlePlaceholder": "The project's title goes here…",
|
||||||
"addTitleRequired": "Angi den nye tittelen.",
|
"addTitleRequired": "Please specify a title.",
|
||||||
"createdSuccess": "Applisten ble opprettet.",
|
"createdSuccess": "The project was successfully created.",
|
||||||
"addListRequired": "Vennligst spesifiser en liste eller angi en standardliste i innstillingene."
|
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"title": "Arkiv \"{list}\"",
|
"title": "Archive \"{project}\"",
|
||||||
"archive": "Arkiver denne listen",
|
"archive": "Archive this project",
|
||||||
"unarchive": "Ikke-arkiver denne listen",
|
"unarchive": "Un-Archive this project",
|
||||||
"unarchiveText": "Du vil kunne opprette nye oppgaver eller redigere den.",
|
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||||
"archiveText": "Du vil ikke være i stand til å redigere denne listen eller opprette nye oppgaver før du fjerner arkiveringen.",
|
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||||
"success": "Listen ble arkivert."
|
"success": "The project was successfully archived."
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
"title": "Angi bakgrunn",
|
"title": "Set project background",
|
||||||
"remove": "Fjern bakgrunn",
|
"remove": "Remove Background",
|
||||||
"upload": "Velg en bakgrunn fra din pc",
|
"upload": "Choose a background from your pc",
|
||||||
"searchPlaceholder": "Søk etter en bakgrunn…",
|
"searchPlaceholder": "Search for a background…",
|
||||||
"poweredByUnsplash": "Drevet av Unsplash",
|
"poweredByUnsplash": "Powered by Unsplash",
|
||||||
"loadMore": "Laste inn flere bilder",
|
"loadMore": "Load more photos",
|
||||||
"success": "Bakgrunnen er satt vellykket!",
|
"success": "The background has been set successfully!",
|
||||||
"removeSuccess": "Bakgrunnen har blitt fjernet!"
|
"removeSuccess": "The background has been removed successfully!"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Slett \"{list}",
|
"title": "Delete \"{project}\"",
|
||||||
"header": "Slett denne listen",
|
"header": "Delete this project",
|
||||||
"text1": "Er du sikker på at du vil slette denne listen og alt innholdet?",
|
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||||
"text2": "Dette inkluderer alle oppgaver og KAN IKKE ANGRES!",
|
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Listen ble slettet.",
|
"success": "The project was successfully deleted.",
|
||||||
"tasksToDelete": "Dette vil ugjenkallelig fjerne ca. {count} oppgaver.",
|
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||||
"noTasksToDelete": "Denne listen inneholder ingen oppgaver, det bør være trygt å slette."
|
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||||
},
|
},
|
||||||
"duplicate": {
|
"duplicate": {
|
||||||
"title": "Dupliser denne listen",
|
"title": "Duplicate this project",
|
||||||
"label": "Dupliser",
|
"label": "Duplicate",
|
||||||
"text": "Velg et navneområde som skal inneholde den dupliserte listen:",
|
"text": "Select a namespace which should hold the duplicated project:",
|
||||||
"success": "Listen ble duplisert."
|
"success": "The project was successfully duplicated."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"header": "Rediger denne listen",
|
"header": "Edit This Project",
|
||||||
"title": "Rediger \"{list}",
|
"title": "Edit \"{project}\"",
|
||||||
"titlePlaceholder": "Listens tittel kommer her…",
|
"titlePlaceholder": "The project title goes here…",
|
||||||
"identifierTooltip": "Liste-identifikatoren kan brukes til å entydig identifisere en oppgave på tvers av lister. Du kan sette den til tom å deaktivere den.",
|
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||||
"identifier": "Liste identifikator",
|
"identifier": "Project Identifier",
|
||||||
"identifierPlaceholder": "Listens tittel kommer her…",
|
"identifierPlaceholder": "The project identifier goes here…",
|
||||||
"description": "Beskrivelse",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "Listens tittel kommer her…",
|
"descriptionPlaceholder": "The projects description goes here…",
|
||||||
"color": "Farger",
|
"color": "Color",
|
||||||
"success": "Listen ble oppdatert."
|
"success": "The project was successfully updated."
|
||||||
},
|
},
|
||||||
"share": {
|
"share": {
|
||||||
"header": "Del denne listen",
|
"header": "Share this project",
|
||||||
"title": "Del \"{list}",
|
"title": "Share \"{project}\"",
|
||||||
"share": "Del",
|
"share": "Share",
|
||||||
"links": {
|
"links": {
|
||||||
"title": "Del link",
|
"title": "Share Links",
|
||||||
"what": "Hva er en lenke for deling?",
|
"what": "What is a share link?",
|
||||||
"explanation": "Lenker lar deg enkelt dele en liste med andre brukere som ikke har en konto på Vikunja.",
|
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||||
"create": "Opprett en ny lenkedeling",
|
"create": "Create a new link share",
|
||||||
"name": "Navn (valgfritt)",
|
"name": "Name (optional)",
|
||||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||||
"nameExplanation": "Alle handlinger utført av denne koblingsdelingen vises med navnet.",
|
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||||
"password": "Passord (valgfritt)",
|
"password": "Password (optional)",
|
||||||
"passwordExplanation": "Når brukeren autentiseres, må vedkommende angi dette passordet.",
|
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||||
"noName": "Ingen navn satt",
|
"noName": "No name set",
|
||||||
"remove": "Fjern en link deling",
|
"remove": "Remove a link share",
|
||||||
"removeText": "Er du sikker på at du vil fjerne denne lenkedelen? Det vil ikke lenger være mulig å åpne denne listen med denne lenkedelingen. Dette kan ikke angres!",
|
"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": "Delingen ble opprettet.",
|
"createSuccess": "The link share was successfully created.",
|
||||||
"deleteSuccess": "Delingen ble slettet",
|
"deleteSuccess": "The link share was successfully deleted",
|
||||||
"view": "Vis",
|
"view": "View",
|
||||||
"sharedBy": "Delt av {0}"
|
"sharedBy": "Shared by {0}"
|
||||||
},
|
},
|
||||||
"userTeam": {
|
"userTeam": {
|
||||||
"typeUser": "bruker | bukere",
|
"typeUser": "user | users",
|
||||||
"typeTeam": "team | teams",
|
"typeTeam": "team | teams",
|
||||||
"shared": "Delt med disse {type}",
|
"shared": "Shared with these {type}",
|
||||||
"you": "Du",
|
"you": "You",
|
||||||
"notShared": "Ikke delt med noen {type} ennå.",
|
"notShared": "Not shared with any {type} yet.",
|
||||||
"removeHeader": "Fjern en {type} fra {sharable}",
|
"removeHeader": "Remove a {type} from the {sharable}",
|
||||||
"removeText": "Er du sikker på at du vil fjerne denne {sharable} fra {type}? Dette kan ikke angres!",
|
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||||
"removeSuccess": "{sharable} ble fjernet fra {type}.",
|
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||||
"addedSuccess": "{type} ble lagt til.",
|
"addedSuccess": "The {type} was successfully added.",
|
||||||
"updatedSuccess": "{type} ble lagt til."
|
"updatedSuccess": "The {type} was successfully added."
|
||||||
},
|
},
|
||||||
"right": {
|
"right": {
|
||||||
"title": "Rettighet",
|
"title": "Permission",
|
||||||
"read": "Skrivebeskyttet",
|
"read": "Read only",
|
||||||
"readWrite": "Les / Skriv",
|
"readWrite": "Read & write",
|
||||||
"admin": "Administrator"
|
"admin": "Admin"
|
||||||
},
|
},
|
||||||
"attributes": {
|
"attributes": {
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"delete": "Slett"
|
"delete": "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"
|
||||||
|
},
|
||||||
"gantt": {
|
"gantt": {
|
||||||
"title": "Gantt",
|
"title": "Gantt",
|
||||||
"showTasksWithoutDates": "Vis oppgaver som ikke har datoer angitt",
|
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||||
"size": "Størrelse",
|
"size": "Size",
|
||||||
"default": "Standard",
|
"default": "Default",
|
||||||
"month": "Måned",
|
"month": "Month",
|
||||||
"day": "Dag",
|
"day": "Day",
|
||||||
"hour": "Time",
|
"hour": "Hour",
|
||||||
"range": "Datointervall",
|
"range": "Date Range",
|
||||||
"noDates": "Denne oppgaven har ingen datoer satt."
|
"noDates": "This task has no dates set."
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"title": "Tabell",
|
"title": "Table",
|
||||||
"columns": "Kolonner"
|
"columns": "Columns"
|
||||||
},
|
},
|
||||||
"kanban": {
|
"kanban": {
|
||||||
"title": "Kanban",
|
"title": "Kanban",
|
||||||
"limit": "Grense: {limit}",
|
"limit": "Limit: {limit}",
|
||||||
"noLimit": "Ikke Angitt",
|
"noLimit": "Not Set",
|
||||||
"doneBucket": "Ferdig bøtte",
|
"doneBucket": "Done bucket",
|
||||||
"doneBucketHint": "Alle oppgaver som flyttet til denne bøtte vil automatisk bli markert som ferdig.",
|
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||||
"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.",
|
"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": "Hendelsen er lagret.",
|
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||||
"deleteLast": "Du kan ikke fjerne den siste bøtten.",
|
"deleteLast": "You cannot remove the last bucket.",
|
||||||
"addTaskPlaceholder": "Skriv den nye oppgavens tittel…",
|
"addTaskPlaceholder": "Enter the new task title…",
|
||||||
"addTask": "Legg til oppgave",
|
"addTask": "Add a task",
|
||||||
"addAnotherTask": "Legg til en annen oppgave",
|
"addAnotherTask": "Add another task",
|
||||||
"addBucket": "Lag en ny bøtte",
|
"addBucket": "Create a new bucket",
|
||||||
"addBucketPlaceholder": "Angi den nye bøtte-tittelen…",
|
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||||
"deleteHeaderBucket": "Slett bøtte",
|
"deleteHeaderBucket": "Delete the bucket",
|
||||||
"deleteBucketText1": "Er du sikker på at du vil slette denne bøtte?",
|
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||||
"deleteBucketText2": "Dette vil ikke slette noen oppgaver, men flytte dem til standard bøtte.",
|
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||||
"deleteBucketSuccess": "Bøtten er slettet.",
|
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||||
"bucketTitleSavedSuccess": "Bøtten er lagret.",
|
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||||
"bucketLimitSavedSuccess": "Grensen på bøtte er lagret.",
|
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||||
"collapse": "Skjul denne bøtten"
|
"collapse": "Collapse this bucket"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favoritter"
|
"title": "Favorites"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"namespace": {
|
"namespace": {
|
||||||
"title": "Navneområder & lister",
|
"title": "Namespaces & Projects",
|
||||||
"namespace": "Navneområde",
|
"namespace": "Navneområde",
|
||||||
"showArchived": "Vis arkiverte",
|
"showArchived": "Vis arkiverte",
|
||||||
"noneAvailable": "Du har ingen navneområder akkurat nå.",
|
"noneAvailable": "Du har ingen navneområder akkurat nå.",
|
||||||
"unarchive": "Av-arkiver",
|
"unarchive": "Av-arkiver",
|
||||||
"archived": "Arkivert",
|
"archived": "Arkivert",
|
||||||
"noLists": "Dette navneområdet inneholder ikke noen lister.",
|
"noProjects": "This namespace does not contain any projects.",
|
||||||
"createList": "Opprett en ny liste i dette navneområdet.",
|
"createProject": "Create a new project in this namespace.",
|
||||||
"namespaces": "Navnerom",
|
"namespaces": "Navnerom",
|
||||||
"search": "Skriv for å søke etter en etikett…",
|
"search": "Skriv for å søke etter en etikett…",
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nytt navneområde",
|
"title": "Nytt navneområde",
|
||||||
"titleRequired": "Angi den nye tittelen.",
|
"titleRequired": "Angi den nye tittelen.",
|
||||||
"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.",
|
"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.",
|
||||||
"tooltip": "Hva er et navneområde?",
|
"tooltip": "Hva er et navneområde?",
|
||||||
"success": "Navneområdet ble opprettet."
|
"success": "Navneområdet ble opprettet."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"titleArchive": "Arkiv \"{namespace}\"",
|
"titleArchive": "Arkiv \"{namespace}\"",
|
||||||
"titleUnarchive": "Av-Arkiv \"{namespace}\"",
|
"titleUnarchive": "Av-Arkiv \"{namespace}\"",
|
||||||
"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.",
|
"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": "Du vil kunne opprette nye oppgaver eller redigere den.",
|
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||||
"success": "Navnerommet ble arkivert.",
|
"success": "Navnerommet ble arkivert.",
|
||||||
"unarchiveSuccess": "Navnerommet ble vellykket fjernet fra arkivet.",
|
"unarchiveSuccess": "Navnerommet ble vellykket fjernet fra arkivet.",
|
||||||
"description": "Hvis navneområdet er arkivert, kan du ikke opprette nye lister eller redigere det."
|
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Slett \"{namespace}",
|
"title": "Slett \"{namespace}",
|
||||||
"text1": "Er du sikker på at du vil slette dette navneområdet og alt innholdet?",
|
"text1": "Er du sikker på at du vil slette dette navneområdet og alt innholdet?",
|
||||||
"text2": "Dette inkluderer alle oppgaver og KAN IKKE ANGRES!",
|
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Navnområdet ble slettet."
|
"success": "Navnområdet ble slettet."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
|
@ -371,8 +371,8 @@
|
||||||
"isArchived": "Dette navneområdet er arkivert"
|
"isArchived": "Dette navneområdet er arkivert"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"sharedLists": {
|
"sharedProjects": {
|
||||||
"title": "Delte lister"
|
"title": "Shared Projects"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favoritter"
|
"title": "Favoritter"
|
||||||
|
@ -403,7 +403,7 @@
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nytt lagret filter",
|
"title": "Nytt lagret filter",
|
||||||
"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.",
|
"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.",
|
||||||
"action": "Opprett nytt filter",
|
"action": "Opprett nytt filter",
|
||||||
"titleRequired": "Please provide a title for the filter."
|
"titleRequired": "Please provide a title for the filter."
|
||||||
},
|
},
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
"label": {
|
"label": {
|
||||||
"title": "Etiketter",
|
"title": "Etiketter",
|
||||||
"manage": "Behandle etiketter",
|
"manage": "Behandle etiketter",
|
||||||
"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.",
|
"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.",
|
||||||
"newCTA": "Du har ingen etiketter for øyeblikket.",
|
"newCTA": "Du har ingen etiketter for øyeblikket.",
|
||||||
"search": "Skriv for å søke etter en etikett…",
|
"search": "Skriv for å søke etter en etikett…",
|
||||||
"create": {
|
"create": {
|
||||||
|
@ -460,7 +460,7 @@
|
||||||
},
|
},
|
||||||
"sharing": {
|
"sharing": {
|
||||||
"authenticating": "Autentiserer…",
|
"authenticating": "Autentiserer…",
|
||||||
"passwordRequired": "Denne delte listen krever et passord. Vennligst skriv det nedenfor:",
|
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||||
"error": "En feil oppsto.",
|
"error": "En feil oppsto.",
|
||||||
"invalidPassword": "Det oppgitte passordet er ugyldig."
|
"invalidPassword": "Det oppgitte passordet er ugyldig."
|
||||||
},
|
},
|
||||||
|
@ -529,7 +529,7 @@
|
||||||
"code": "Kode",
|
"code": "Kode",
|
||||||
"quote": "Sitat",
|
"quote": "Sitat",
|
||||||
"unorderedList": "Uordnet liste",
|
"unorderedList": "Uordnet liste",
|
||||||
"orderedList": "Sortert liste",
|
"orderedList ": "Ordered List",
|
||||||
"cleanBlock": "Tøm blokk",
|
"cleanBlock": "Tøm blokk",
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"image": "Bilde",
|
"image": "Bilde",
|
||||||
|
@ -602,6 +602,7 @@
|
||||||
"addReminder": "Legg til en ny påminnelse…",
|
"addReminder": "Legg til en ny påminnelse…",
|
||||||
"doneSuccess": "Oppgaven ble markert som ferdig.",
|
"doneSuccess": "Oppgaven ble markert som ferdig.",
|
||||||
"undoneSuccess": "Oppgaven ble fjernet som ferdig.",
|
"undoneSuccess": "Oppgaven ble fjernet som ferdig.",
|
||||||
|
"undo": "Undo",
|
||||||
"openDetail": "Åpne detaljvisning",
|
"openDetail": "Åpne detaljvisning",
|
||||||
"checklistTotal": "{checked} av {total} oppgaver",
|
"checklistTotal": "{checked} av {total} oppgaver",
|
||||||
"checklistAllDone": "{total} oppgaver",
|
"checklistAllDone": "{total} oppgaver",
|
||||||
|
@ -618,7 +619,7 @@
|
||||||
"chooseDueDate": "Klikk her for å angi en forfallsdato",
|
"chooseDueDate": "Klikk her for å angi en forfallsdato",
|
||||||
"chooseStartDate": "Klikk her for å angi en startdato",
|
"chooseStartDate": "Klikk her for å angi en startdato",
|
||||||
"chooseEndDate": "Klikk her for å angi en sluttdato",
|
"chooseEndDate": "Klikk her for å angi en sluttdato",
|
||||||
"move": "Flytt oppgaven til en annen liste",
|
"move": "Move task to a different project",
|
||||||
"done": "Marker som utført!",
|
"done": "Marker som utført!",
|
||||||
"undone": "Merk som uferdig",
|
"undone": "Merk som uferdig",
|
||||||
"created": "Opprettet {0} av {1}",
|
"created": "Opprettet {0} av {1}",
|
||||||
|
@ -626,7 +627,7 @@
|
||||||
"doneAt": "Ferdig {0}",
|
"doneAt": "Ferdig {0}",
|
||||||
"updateSuccess": "Oppgaven ble lagret.",
|
"updateSuccess": "Oppgaven ble lagret.",
|
||||||
"deleteSuccess": "Oppgaven har blitt slettet.",
|
"deleteSuccess": "Oppgaven har blitt slettet.",
|
||||||
"belongsToList": "Denne oppgaven tilhører listen '{list}'",
|
"belongsToProject": "This task belongs to project '{project}'",
|
||||||
"due": "Forfallsdato {at}",
|
"due": "Forfallsdato {at}",
|
||||||
"closePopup": "Lukk popup",
|
"closePopup": "Lukk popup",
|
||||||
"delete": {
|
"delete": {
|
||||||
|
@ -646,7 +647,7 @@
|
||||||
"percentDone": "Angi fremdrift",
|
"percentDone": "Angi fremdrift",
|
||||||
"attachments": "Legg til vedlegg",
|
"attachments": "Legg til vedlegg",
|
||||||
"relatedTasks": "Legg til relasjon",
|
"relatedTasks": "Legg til relasjon",
|
||||||
"moveList": "Flytt",
|
"moveProject": "Move",
|
||||||
"color": "Sett Farge",
|
"color": "Sett Farge",
|
||||||
"delete": "Slett",
|
"delete": "Slett",
|
||||||
"favorite": "Legg til i favoritter",
|
"favorite": "Legg til i favoritter",
|
||||||
|
@ -673,21 +674,21 @@
|
||||||
"updated": "Oppdatert"
|
"updated": "Oppdatert"
|
||||||
},
|
},
|
||||||
"subscription": {
|
"subscription": {
|
||||||
"subscribedListThroughParentNamespace": "Du kan ikke slutte å abonnere her fordi du abonnerer på denne listen gjennom dens navneområde.",
|
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||||
"subscribedTaskThroughParentNamespace": "Du kan ikke slutte å abonnere her fordi du abonnerer på denne oppgaven gjennom navneområdet.",
|
"subscribedTaskThroughParentNamespace": "Du kan ikke slutte å abonnere her fordi du abonnerer på denne oppgaven gjennom navneområdet.",
|
||||||
"subscribedTaskThroughParentList": "Du kan ikke melde deg ut her, fordi du abonnerer på denne oppgaven gjennom listen.",
|
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||||
"subscribedNamespace": "Du abonnerer for øyeblikket på dette navneområdet og vil motta varsler for endringer.",
|
"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.",
|
"notSubscribedNamespace": "Du abonnerer ikke på dette navneområdet og vil ikke motta varsler for endringer.",
|
||||||
"subscribedList": "Du abonnerer for øyeblikket på denne listen og vil motta varsler for endringer.",
|
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||||
"notSubscribedList": "Du abonnerer ikke på denne listen og vil ikke motta varsler for endringer.",
|
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||||
"subscribedTask": "Du abonnerer for øyeblikket på denne oppgaven og vil 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.",
|
"notSubscribedTask": "Du abonnerer ikke på denne oppgaven og vil ikke motta varsler for endringer.",
|
||||||
"subscribe": "Abonnerer",
|
"subscribe": "Abonnerer",
|
||||||
"unsubscribe": "Avslutt abonnement",
|
"unsubscribe": "Avslutt abonnement",
|
||||||
"subscribeSuccessNamespace": "Du abonnerer nå på dette navneområdet",
|
"subscribeSuccessNamespace": "Du abonnerer nå på dette navneområdet",
|
||||||
"unsubscribeSuccessNamespace": "Du blir nå avmeldt dette navneområdet",
|
"unsubscribeSuccessNamespace": "Du blir nå avmeldt dette navneområdet",
|
||||||
"subscribeSuccessList": "Du abonnerer nå på denne listen",
|
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||||
"unsubscribeSuccessList": "Du har nå avsluttet abonnementet for denne listen",
|
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||||
"subscribeSuccessTask": "Du abonnerer nå på denne oppgaven",
|
"subscribeSuccessTask": "Du abonnerer nå på denne oppgaven",
|
||||||
"unsubscribeSuccessTask": "Du har nå avsluttet abonnementet for denne oppgaven"
|
"unsubscribeSuccessTask": "Du har nå avsluttet abonnementet for denne oppgaven"
|
||||||
},
|
},
|
||||||
|
@ -761,7 +762,7 @@
|
||||||
"new": "Ny oppgaveforbindelse",
|
"new": "Ny oppgaveforbindelse",
|
||||||
"searchPlaceholder": "Skriv søk etter en ny oppgave å legge til som relatert…",
|
"searchPlaceholder": "Skriv søk etter en ny oppgave å legge til som relatert…",
|
||||||
"createPlaceholder": "Legg til denne som ny relatert oppgave",
|
"createPlaceholder": "Legg til denne som ny relatert oppgave",
|
||||||
"differentList": "Denne oppgaven tilhører en annen liste.",
|
"differentProject": "This task belongs to a different project.",
|
||||||
"differentNamespace": "Denne oppgaven tilhører en annen navneområde.",
|
"differentNamespace": "Denne oppgaven tilhører en annen navneområde.",
|
||||||
"noneYet": "Ingen arbeidsrelasjoner ennå.",
|
"noneYet": "Ingen arbeidsrelasjoner ennå.",
|
||||||
"delete": "Slett relasjon",
|
"delete": "Slett relasjon",
|
||||||
|
@ -811,10 +812,10 @@
|
||||||
"priority1": "For å angi en oppgaves prioritet, legg til et nummer 1-5, med en {prefix} som prefiks.",
|
"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.",
|
"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.",
|
"assignees": "For å direkte tilordne oppgaven til en bruker må du legge til brukernavnet deres med {prefix} som er prefikset på oppgaven.",
|
||||||
"list1": "For å angi en liste for oppgaven som skal vises i, skriv inn dens navn med {prefix}.",
|
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||||
"list2": "Dette vil returnere en feil dersom listen ikke finnes.",
|
"project2": "This will return an error if the project does not exist.",
|
||||||
"list3": "For å bruke mellomrom, legg bare til en \" eller ' rundt listenavnet.",
|
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||||
"list4": "For eksempel: {prefix}\"Liste med mellomrom\".",
|
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||||
"dateAndTime": "Dato og tid",
|
"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:",
|
"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",
|
"dateWeekday": "hver ukedag vil bruke neste dato med den datoen",
|
||||||
|
@ -847,19 +848,19 @@
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Slett gruppen",
|
"header": "Slett gruppen",
|
||||||
"text1": "Er du sikker på at du vil slette denne gruppen og alle dets medlemmer?",
|
"text1": "Er du sikker på at du vil slette denne gruppen og alle dets medlemmer?",
|
||||||
"text2": "Alle medlemmer vil miste tilgang til lister og navneområder som deles med denne gruppen. DETTE KAN IKKE ANGRES!",
|
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||||
"success": "Gruppen ble slettet."
|
"success": "Gruppen ble slettet."
|
||||||
},
|
},
|
||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"header": "Fjerne en bruker fra gruppen",
|
"header": "Fjerne en bruker fra gruppen",
|
||||||
"text1": "Er du sikker på at du vil fjerne bruker fra denne gruppen?",
|
"text1": "Er du sikker på at du vil fjerne bruker fra denne gruppen?",
|
||||||
"text2": "De vil miste tilgang til alle lister og navneområder denne gruppen har tilgang til. DETTE KAN IKKE ANGRES!",
|
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||||
"success": "Brukeren ble slettet fra gruppen."
|
"success": "Brukeren ble slettet fra gruppen."
|
||||||
},
|
},
|
||||||
"leave": {
|
"leave": {
|
||||||
"title": "Forlat gruppen",
|
"title": "Forlat gruppen",
|
||||||
"text1": "Er du sikker på at du vil forlate denne gruppen?",
|
"text1": "Er du sikker på at du vil forlate denne gruppen?",
|
||||||
"text2": "Du vil miste tilgang til alle lister og navneområder denne gruppen har tilgang til. Hvis du ombestemmer deg, må du ha en lagadministrator for å legge deg til igjen.",
|
"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.",
|
||||||
"success": "Du har forlatt gruppen."
|
"success": "Du har forlatt gruppen."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -891,22 +892,22 @@
|
||||||
"attachment": "Legg til et vedlegg til denne oppgaven",
|
"attachment": "Legg til et vedlegg til denne oppgaven",
|
||||||
"related": "Endre relaterte oppgaver for denne oppgaven",
|
"related": "Endre relaterte oppgaver for denne oppgaven",
|
||||||
"color": "Endre fargen på denne oppgaven",
|
"color": "Endre fargen på denne oppgaven",
|
||||||
"move": "Flytt denne oppgaven til en annen liste",
|
"move": "Move this task to another project",
|
||||||
"reminder": "Behandle påminnelser om denne oppgaven",
|
"reminder": "Behandle påminnelser om denne oppgaven",
|
||||||
"description": "Veksle redigering av oppgavebeskrivelsen"
|
"description": "Veksle redigering av oppgavebeskrivelsen"
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"title": "Listevisning",
|
"title": "Project Views",
|
||||||
"switchToListView": "Byttet til listevisning",
|
"switchToListView": "Switch to list view",
|
||||||
"switchToGanttView": "Bytt til gantt-visning",
|
"switchToGanttView": "Switch to gantt view",
|
||||||
"switchToKanbanView": "Bytt til kanban visning",
|
"switchToKanbanView": "Switch to kanban view",
|
||||||
"switchToTableView": "Bytt til tabellvisning"
|
"switchToTableView": "Switch to table view"
|
||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"title": "Navigasjon",
|
"title": "Navigasjon",
|
||||||
"overview": "Naviger til oversikt",
|
"overview": "Naviger til oversikt",
|
||||||
"upcoming": "Gå til kommende oppgaver",
|
"upcoming": "Gå til kommende oppgaver",
|
||||||
"namespaces": "Gå til navneområder og lister",
|
"namespaces": "Navigate to namespaces & projects",
|
||||||
"labels": "Naviger til etiketter",
|
"labels": "Naviger til etiketter",
|
||||||
"teams": "Naviger til gruppe"
|
"teams": "Naviger til gruppe"
|
||||||
}
|
}
|
||||||
|
@ -923,7 +924,7 @@
|
||||||
"unarchive": "Av-arkiver",
|
"unarchive": "Av-arkiver",
|
||||||
"setBackground": "Bruk som bakgrunn",
|
"setBackground": "Bruk som bakgrunn",
|
||||||
"share": "Del",
|
"share": "Del",
|
||||||
"newList": "Ny liste"
|
"newProject": "New project"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"url": "Vikunja URL",
|
"url": "Vikunja URL",
|
||||||
|
@ -942,24 +943,24 @@
|
||||||
"notification": {
|
"notification": {
|
||||||
"title": "Varsler",
|
"title": "Varsler",
|
||||||
"none": "Du har ingen varsler på dette tidspunktet!",
|
"none": "Du har ingen varsler på dette tidspunktet!",
|
||||||
"explainer": "Varsler vil vises her når handlinger på navneområder, lister eller oppgaver du abonnerer på."
|
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||||
},
|
},
|
||||||
"quickActions": {
|
"quickActions": {
|
||||||
"commands": "Kommandoer",
|
"commands": "Kommandoer",
|
||||||
"placeholder": "Skriv en kommando eller søk…",
|
"placeholder": "Skriv en kommando eller søk…",
|
||||||
"hint": "Du kan bruke {list} for å begrense søket til en liste. Kombiner {list} 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.",
|
"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.",
|
||||||
"tasks": "Oppgaver",
|
"tasks": "Oppgaver",
|
||||||
"lists": "Lister",
|
"projects": "Projects",
|
||||||
"teams": "Grupper",
|
"teams": "Grupper",
|
||||||
"newList": "Skriv tittelen på den nye listen…",
|
"newProject": "Enter the title of the new project…",
|
||||||
"newTask": "Skriv tittelen på den nye oppgaven…",
|
"newTask": "Skriv tittelen på den nye oppgaven…",
|
||||||
"newNamespace": "Skriv inn tittelen på det nye navneområdet…",
|
"newNamespace": "Skriv inn tittelen på det nye navneområdet…",
|
||||||
"newTeam": "Skriv inn navnet på den nye gruppen…",
|
"newTeam": "Skriv inn navnet på den nye gruppen…",
|
||||||
"createTask": "Opprett en oppgave i den gjeldende listen ({title})",
|
"createTask": "Create a task in the current project ({title})",
|
||||||
"createList": "Opprett en liste i gjeldende navneområde ({title})",
|
"createProject": "Create a project in the current namespace ({title})",
|
||||||
"cmds": {
|
"cmds": {
|
||||||
"newTask": "Ny oppgave",
|
"newTask": "Ny oppgave",
|
||||||
"newList": "Ny liste",
|
"newProject": "New project",
|
||||||
"newNamespace": "Nytt navneområde",
|
"newNamespace": "Nytt navneområde",
|
||||||
"newTeam": "Ny gruppe"
|
"newTeam": "Ny gruppe"
|
||||||
}
|
}
|
||||||
|
@ -991,15 +992,15 @@
|
||||||
"1018": "Innstillingen av brukerens avatartype er ugyldig.",
|
"1018": "Innstillingen av brukerens avatartype er ugyldig.",
|
||||||
"2001": "ID kan ikke være tom eller 0.",
|
"2001": "ID kan ikke være tom eller 0.",
|
||||||
"2002": "Noen av forespørselsdataene var ugyldig.",
|
"2002": "Noen av forespørselsdataene var ugyldig.",
|
||||||
"3001": "Listen eksisterer ikke.",
|
"3001": "The project does not exist.",
|
||||||
"3004": "Du må ha lesetilgang på den listen for å utføre den handlingen.",
|
"3004": "You need to have read permissions on that project to perform that action.",
|
||||||
"3005": "Tittelen kan ikke være tom.",
|
"3005": "The project title cannot be empty.",
|
||||||
"3006": "Listedelingen finnes ikke.",
|
"3006": "The project share does not exist.",
|
||||||
"3007": "En liste med denne identifikatoren finnes allerede.",
|
"3007": "A project with this identifier already exists.",
|
||||||
"3008": "Listen er arkivert og kan derfor bare leses om. Dette gjelder også for alle oppgaver som er tilknyttet denne listen.",
|
"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": "Tittelen kan ikke være tom.",
|
"4001": "The project task text cannot be empty.",
|
||||||
"4002": "Listedelingen finnes ikke.",
|
"4002": "The project task does not exist.",
|
||||||
"4003": "Alle sammenkoblede redigeringsoppgaver må tilhøre samme liste.",
|
"4003": "All bulk editing tasks must belong to the same project.",
|
||||||
"4004": "Trenger minst én oppgave når masseredigeringsoppgaver skal utføres.",
|
"4004": "Trenger minst én oppgave når masseredigeringsoppgaver skal utføres.",
|
||||||
"4005": "Du har ikke rettigheter til å redigere denne siden.",
|
"4005": "Du har ikke rettigheter til å redigere denne siden.",
|
||||||
"4006": "Du kan ikke sette en overordnet oppgave som oppgaven selv.",
|
"4006": "Du kan ikke sette en overordnet oppgave som oppgaven selv.",
|
||||||
|
@ -1025,21 +1026,21 @@
|
||||||
"5012": "Navneområdet er arkivert og kan derfor kun leses på.",
|
"5012": "Navneområdet er arkivert og kan derfor kun leses på.",
|
||||||
"6001": "Gruppe nanvet kan ikke være tomt.",
|
"6001": "Gruppe nanvet kan ikke være tomt.",
|
||||||
"6002": "Gruppen finnes ikke.",
|
"6002": "Gruppen finnes ikke.",
|
||||||
"6004": "Gruppen har allerede tilgang til dette navneområdet eller listen.",
|
"6004": "The team already has access to that namespace or project.",
|
||||||
"6005": "Brukeren er allerede medlem av gruppen.",
|
"6005": "Brukeren er allerede medlem av gruppen.",
|
||||||
"6006": "Kan ikke slette siste gruppemedlem.",
|
"6006": "Kan ikke slette siste gruppemedlem.",
|
||||||
"6007": "Gruppen har ikke tilgang til listen for å utføre den handlingen.",
|
"6007": "The team does not have access to the project to perform that action.",
|
||||||
"7002": "Brukeren har allerede tilgang til denne listen.",
|
"7002": "The user already has access to that project.",
|
||||||
"7003": "Du har ikke tilgang til dette.",
|
"7003": "You do not have access to that project.",
|
||||||
"8001": "Denne etiketten finnes allerede på den oppgaven.",
|
"8001": "Denne etiketten finnes allerede på den oppgaven.",
|
||||||
"8002": "Etiketten finnes ikke.",
|
"8002": "Etiketten finnes ikke.",
|
||||||
"8003": "Du har ikke tilgang til denne etiketten.",
|
"8003": "Du har ikke tilgang til denne etiketten.",
|
||||||
"9001": "Linken er ugyldig.",
|
"9001": "Linken er ugyldig.",
|
||||||
"10001": "Bøtten finnes ikke.",
|
"10001": "Bøtten finnes ikke.",
|
||||||
"10002": "Bøtten tilhører ikke den listen.",
|
"10002": "The bucket does not belong to that project.",
|
||||||
"10003": "Du kan ikke fjerne den siste bøtten.",
|
"10003": "You cannot remove the last bucket on a project.",
|
||||||
"10004": "Du kan ikke legge til oppgaven i denne bøtte fordi den allerede overskrider grensen på oppgaver som den kan holde.",
|
"10004": "Du kan ikke legge til oppgaven i denne bøtte fordi den allerede overskrider grensen på oppgaver som den kan holde.",
|
||||||
"10005": "Det kan bare være en ferdig bøtte per liste.",
|
"10005": "There can be only one done bucket per project.",
|
||||||
"11001": "Det lagrede filteret finnes ikke.",
|
"11001": "Det lagrede filteret finnes ikke.",
|
||||||
"11002": "Lagrede filtre er ikke tilgjengelige for lenke delinger.",
|
"11002": "Lagrede filtre er ikke tilgjengelige for lenke delinger.",
|
||||||
"12001": "Abonnement enhetstypen er ugyldig.",
|
"12001": "Abonnement enhetstypen er ugyldig.",
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
"welcomeDay": "Hi {username}!",
|
"welcomeDay": "Hi {username}!",
|
||||||
"welcomeEvening": "Good Evening {username}!",
|
"welcomeEvening": "Good Evening {username}!",
|
||||||
"lastViewed": "Ostatnio oglądane",
|
"lastViewed": "Ostatnio oglądane",
|
||||||
"list": {
|
"project": {
|
||||||
"newText": "Możesz stworzyć nową listę dla swoich nowych zadań:",
|
"newText": "You can create a new project for your new tasks:",
|
||||||
"new": "Nowa lista",
|
"new": "New project",
|
||||||
"importText": "Lub zaimportować swoje listy i zadania z innych usług do Vikunja:",
|
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||||
"import": "Zaimportuj swoje dane do Vikunja"
|
"import": "Import your data into Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"404": {
|
"404": {
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
"weekStartSunday": "niedzieli",
|
"weekStartSunday": "niedzieli",
|
||||||
"weekStartMonday": "poniedziałku",
|
"weekStartMonday": "poniedziałku",
|
||||||
"language": "Język",
|
"language": "Język",
|
||||||
"defaultList": "Domyślna lista",
|
"defaultProject": "Default Project",
|
||||||
"timezone": "Strefa czasowa",
|
"timezone": "Strefa czasowa",
|
||||||
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
||||||
},
|
},
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
},
|
},
|
||||||
"deletion": {
|
"deletion": {
|
||||||
"title": "Usuń swoje konto Vikunja",
|
"title": "Usuń swoje konto Vikunja",
|
||||||
"text1": "Usunięcie Twojego konta jest trwałe i nie można tego cofnąć. Usuniemy wszystkie Twoje sekcje, listy, zadania i wszystko, co z nimi powiązane.",
|
"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.",
|
||||||
"text2": "Aby kontynuować, wprowadź swoje hasło. Otrzymasz wiadomość e-mail z dalszymi instrukcjami.",
|
"text2": "Aby kontynuować, wprowadź swoje hasło. Otrzymasz wiadomość e-mail z dalszymi instrukcjami.",
|
||||||
"confirm": "Usuń moje konto",
|
"confirm": "Usuń moje konto",
|
||||||
"requestSuccess": "Żądanie powiodło się. Otrzymasz wiadomość e-mail z dalszymi instrukcjami.",
|
"requestSuccess": "Żądanie powiodło się. Otrzymasz wiadomość e-mail z dalszymi instrukcjami.",
|
||||||
|
@ -157,201 +157,201 @@
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"title": "Eksportuj swoje dane Vikunja",
|
"title": "Eksportuj swoje dane Vikunja",
|
||||||
"description": "Możesz zażądać kopii wszystkich swoich danych Vikunja. Obejmuje to sekcje, listy, zadania i wszystko, co z nimi powiązane. Możesz zaimportować te dane do dowolnej instancji Vikunja za pomocą funkcji migracji.",
|
"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.",
|
||||||
"descriptionPasswordRequired": "Wprowadź hasło, aby kontynuować:",
|
"descriptionPasswordRequired": "Wprowadź hasło, aby kontynuować:",
|
||||||
"request": "Generuj kopię moich danych Vikunja",
|
"request": "Generuj kopię moich danych Vikunja",
|
||||||
"success": "Pomyślnie zażądałeś danych Vikunja! Wyślemy Ci e-mail, gdy będą gotowe do pobrania.",
|
"success": "Pomyślnie zażądałeś danych Vikunja! Wyślemy Ci e-mail, gdy będą gotowe do pobrania.",
|
||||||
"downloadTitle": "Pobierz wyeksportowane dane Vikunja"
|
"downloadTitle": "Pobierz wyeksportowane dane Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"archived": "Ta lista jest zarchiwizowana. Nie można w niej tworzyć ani edytować zadań.",
|
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||||
"title": "Tytuł listy",
|
"title": "Project Title",
|
||||||
"color": "Kolor",
|
"color": "Color",
|
||||||
"lists": "Listy",
|
"projects": "Projects",
|
||||||
"list": {
|
"search": "Type to search for a project…",
|
||||||
"title": "Lista",
|
"searchSelect": "Click or press enter to select this project",
|
||||||
"add": "Dodaj",
|
"shared": "Shared Projects",
|
||||||
"addPlaceholder": "Dodaj nowe zadanie…",
|
"noDescriptionAvailable": "No project description is available.",
|
||||||
"empty": "Ta lista jest obecnie pusta.",
|
|
||||||
"newTaskCta": "Utwórz nowe zadanie.",
|
|
||||||
"editTask": "Edytuj zadanie"
|
|
||||||
},
|
|
||||||
"search": "Wpisz, aby wyszukać listę…",
|
|
||||||
"searchSelect": "Kliknij lub naciśnij Enter, aby wybrać tę listę",
|
|
||||||
"shared": "Współdzielone listy",
|
|
||||||
"noDescriptionAvailable": "No list description is available.",
|
|
||||||
"create": {
|
"create": {
|
||||||
"header": "Nowa lista",
|
"header": "New project",
|
||||||
"titlePlaceholder": "Tu wpisz tytuł listy…",
|
"titlePlaceholder": "The project's title goes here…",
|
||||||
"addTitleRequired": "Proszę podaj tytuł.",
|
"addTitleRequired": "Please specify a title.",
|
||||||
"createdSuccess": "Lista została pomyślnie utworzona.",
|
"createdSuccess": "The project was successfully created.",
|
||||||
"addListRequired": "Proszę, wybierz listę lub ustaw listę domyślną w ustawieniach."
|
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"title": "Archiwizuj \"{list}\"",
|
"title": "Archive \"{project}\"",
|
||||||
"archive": "Zarchiwizuj tę listę",
|
"archive": "Archive this project",
|
||||||
"unarchive": "Cofnij archiwizację tej listy",
|
"unarchive": "Un-Archive this project",
|
||||||
"unarchiveText": "Będziesz mógł tworzyć nowe zadania lub je edytować.",
|
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||||
"archiveText": "Nie będziesz mógł edytować tej listy ani tworzyć nowych zadań, dopóki nie cofniesz jej archiwizacji.",
|
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||||
"success": "Lista została pomyślnie zarchiwizowana."
|
"success": "The project was successfully archived."
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
"title": "Ustaw tło listy",
|
"title": "Set project background",
|
||||||
"remove": "Usuń tło",
|
"remove": "Remove Background",
|
||||||
"upload": "Prześlij tło ze swojego komputera",
|
"upload": "Choose a background from your pc",
|
||||||
"searchPlaceholder": "Wyszukiwanie tła…",
|
"searchPlaceholder": "Search for a background…",
|
||||||
"poweredByUnsplash": "Wspierane przez Unsplash",
|
"poweredByUnsplash": "Powered by Unsplash",
|
||||||
"loadMore": "Załaduj więcej zdjęć",
|
"loadMore": "Load more photos",
|
||||||
"success": "Tło zostało ustawione pomyślnie!",
|
"success": "The background has been set successfully!",
|
||||||
"removeSuccess": "Tło zostało pomyślnie usunięte!"
|
"removeSuccess": "The background has been removed successfully!"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Usuń \"{list}\"",
|
"title": "Delete \"{project}\"",
|
||||||
"header": "Usuń tę listę",
|
"header": "Delete this project",
|
||||||
"text1": "Czy na pewno chcesz usunąć tę listę i całą jej zawartość?",
|
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||||
"text2": "Obejmuje to wszystkie zadania i tego NIE DA SIĘ COFNĄĆ!",
|
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Lista została pomyślnie usunięta.",
|
"success": "The project was successfully deleted.",
|
||||||
"tasksToDelete": "To nieodwołalnie usunie około {count} zadań.",
|
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||||
"noTasksToDelete": "Ta lista nie zawiera żadnych zadań, usunięcie powinno być bezpieczne."
|
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||||
},
|
},
|
||||||
"duplicate": {
|
"duplicate": {
|
||||||
"title": "Duplikuj tę listę",
|
"title": "Duplicate this project",
|
||||||
"label": "Duplikuj",
|
"label": "Duplicate",
|
||||||
"text": "Wybierz sekcję, do której powinna trafić zduplikowana lista:",
|
"text": "Select a namespace which should hold the duplicated project:",
|
||||||
"success": "Lista została pomyślnie zduplikowana."
|
"success": "The project was successfully duplicated."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"header": "Edytuj tę listę",
|
"header": "Edit This Project",
|
||||||
"title": "Edytuj \"{list}\"",
|
"title": "Edit \"{project}\"",
|
||||||
"titlePlaceholder": "Tu wpisz tytuł listy…",
|
"titlePlaceholder": "The project title goes here…",
|
||||||
"identifierTooltip": "Identyfikator listy może być użyty do jednoznacznej identyfikacji zadania z różnych list. Możesz ustawić go jako pusty, aby go wyłączyć.",
|
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||||
"identifier": "Identyfikator listy",
|
"identifier": "Project Identifier",
|
||||||
"identifierPlaceholder": "Tu wpisz identyfikator listy…",
|
"identifierPlaceholder": "The project identifier goes here…",
|
||||||
"description": "Opis",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "Tu wpisz opis listy…",
|
"descriptionPlaceholder": "The projects description goes here…",
|
||||||
"color": "Kolor",
|
"color": "Color",
|
||||||
"success": "Lista została pomyślnie zaktualizowana."
|
"success": "The project was successfully updated."
|
||||||
},
|
},
|
||||||
"share": {
|
"share": {
|
||||||
"header": "Udostępnij tę listę",
|
"header": "Share this project",
|
||||||
"title": "Udostępnij \"{list}\"",
|
"title": "Share \"{project}\"",
|
||||||
"share": "Udostępnij",
|
"share": "Share",
|
||||||
"links": {
|
"links": {
|
||||||
"title": "Udostępnij linki",
|
"title": "Share Links",
|
||||||
"what": "Co to jest udostępnianie linków?",
|
"what": "What is a share link?",
|
||||||
"explanation": "Udostępnianie linków umożliwia łatwe udostępnianie listy innym użytkownikom, którzy nie mają konta na Vikunja.",
|
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||||
"create": "Utwórz nowy link do udostępnienia",
|
"create": "Create a new link share",
|
||||||
"name": "Nazwa: (opcjonalnie)",
|
"name": "Name (optional)",
|
||||||
"namePlaceholder": "np. Lorem Ipsum",
|
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||||
"nameExplanation": "Wszystkie działania wykonane przez ten link będą wyświetlane pod tą nazwą.",
|
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||||
"password": "Hasło (opcjonalnie)",
|
"password": "Password (optional)",
|
||||||
"passwordExplanation": "Podczas uwierzytelniania użytkownik będzie musiał wprowadzić to hasło.",
|
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||||
"noName": "Nie ustawiono nazwy",
|
"noName": "No name set",
|
||||||
"remove": "Usuń link",
|
"remove": "Remove a link share",
|
||||||
"removeText": "Czy na pewno chcesz usunąć ten link? Dostęp do tej listy z tym linkiem nie będzie już możliwy. Tego nie da się cofnąć!",
|
"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": "Pomyślnie utworzono udostępniony link.",
|
"createSuccess": "The link share was successfully created.",
|
||||||
"deleteSuccess": "Udostępniony link został pomyślnie usunięty",
|
"deleteSuccess": "The link share was successfully deleted",
|
||||||
"view": "View",
|
"view": "View",
|
||||||
"sharedBy": "Shared by {0}"
|
"sharedBy": "Shared by {0}"
|
||||||
},
|
},
|
||||||
"userTeam": {
|
"userTeam": {
|
||||||
"typeUser": "użytkownik(a) | użytkownikom",
|
"typeUser": "user | users",
|
||||||
"typeTeam": "zespół | zespołom",
|
"typeTeam": "team | teams",
|
||||||
"shared": "Udostępniono tym {type}",
|
"shared": "Shared with these {type}",
|
||||||
"you": "Ty",
|
"you": "You",
|
||||||
"notShared": "Nie udostępniono jeszcze żadnym {type}.",
|
"notShared": "Not shared with any {type} yet.",
|
||||||
"removeHeader": "Usuń {type} z {sharable}",
|
"removeHeader": "Remove a {type} from the {sharable}",
|
||||||
"removeText": "Czy na pewno chcesz usunąć {type} z {sharable}? Tego nie da się cofnąć!",
|
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||||
"removeSuccess": "{type} został pomyślnie usunięty z {sharable}.",
|
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||||
"addedSuccess": "{type} został pomyślnie dodany.",
|
"addedSuccess": "The {type} was successfully added.",
|
||||||
"updatedSuccess": "{type} został pomyślnie dodany."
|
"updatedSuccess": "The {type} was successfully added."
|
||||||
},
|
},
|
||||||
"right": {
|
"right": {
|
||||||
"title": "Permission",
|
"title": "Permission",
|
||||||
"read": "Tylko do odczytu",
|
"read": "Read only",
|
||||||
"readWrite": "Odczyt i zapis",
|
"readWrite": "Read & write",
|
||||||
"admin": "Administrator"
|
"admin": "Admin"
|
||||||
},
|
},
|
||||||
"attributes": {
|
"attributes": {
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"delete": "Usuń"
|
"delete": "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"
|
||||||
|
},
|
||||||
"gantt": {
|
"gantt": {
|
||||||
"title": "Gantt",
|
"title": "Gantt",
|
||||||
"showTasksWithoutDates": "Pokaż zadania, które nie mają ustawionych dat",
|
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||||
"size": "Rozmiar",
|
"size": "Size",
|
||||||
"default": "Domyślny",
|
"default": "Default",
|
||||||
"month": "Miesiąc",
|
"month": "Month",
|
||||||
"day": "Dzień",
|
"day": "Day",
|
||||||
"hour": "Hour",
|
"hour": "Hour",
|
||||||
"range": "Date Range",
|
"range": "Date Range",
|
||||||
"noDates": "To zadanie nie ma ustawionych dat."
|
"noDates": "This task has no dates set."
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"title": "Tabela",
|
"title": "Table",
|
||||||
"columns": "Kolumny"
|
"columns": "Columns"
|
||||||
},
|
},
|
||||||
"kanban": {
|
"kanban": {
|
||||||
"title": "Kanban",
|
"title": "Kanban",
|
||||||
"limit": "Limit: {limit}",
|
"limit": "Limit: {limit}",
|
||||||
"noLimit": "Nie ustawiony",
|
"noLimit": "Not Set",
|
||||||
"doneBucket": "Zasobnik ukończonych zadań",
|
"doneBucket": "Done bucket",
|
||||||
"doneBucketHint": "Wszystkie zadania przeniesione do tego zasobnika zostaną automatycznie oznaczone jako ukończone.",
|
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||||
"doneBucketHintExtended": "Wszystkie zadania przeniesione do zasobnika ukończonych zadań zostaną automatycznie oznaczone jako ukończone. Również wszystkie zadania z innych zasobników oznaczone jako ukończone zostaną do niego przeniesione.",
|
"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": "Zasobnik ukończonych zadań został pomyślnie zapisany.",
|
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||||
"deleteLast": "Nie możesz usunąć ostatniego zasobnika.",
|
"deleteLast": "You cannot remove the last bucket.",
|
||||||
"addTaskPlaceholder": "Wpisz tytuł nowego zadania…",
|
"addTaskPlaceholder": "Enter the new task title…",
|
||||||
"addTask": "Dodaj zadanie",
|
"addTask": "Add a task",
|
||||||
"addAnotherTask": "Dodaj kolejne zadanie",
|
"addAnotherTask": "Add another task",
|
||||||
"addBucket": "Utwórz nowy zasobnik",
|
"addBucket": "Create a new bucket",
|
||||||
"addBucketPlaceholder": "Wpisz tytuł nowego zasobnika…",
|
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||||
"deleteHeaderBucket": "Usuń zasobnik",
|
"deleteHeaderBucket": "Delete the bucket",
|
||||||
"deleteBucketText1": "Czy na pewno chcesz usunąć ten zasobnik?",
|
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||||
"deleteBucketText2": "Nie spowoduje to usunięcia żadnych zadań, ale przeniesie je do domyślnego zasobnika.",
|
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||||
"deleteBucketSuccess": "Zasobnik został pomyślnie usunięty.",
|
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||||
"bucketTitleSavedSuccess": "Tytuł zasobnika został pomyślnie zapisany.",
|
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||||
"bucketLimitSavedSuccess": "Limit zasobnika został pomyślnie zapisany.",
|
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||||
"collapse": "Zwiń ten zasobnik"
|
"collapse": "Collapse this bucket"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Ulubione"
|
"title": "Favorites"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"namespace": {
|
"namespace": {
|
||||||
"title": "Sekcje i Listy",
|
"title": "Namespaces & Projects",
|
||||||
"namespace": "Sekcja",
|
"namespace": "Sekcja",
|
||||||
"showArchived": "Pokaż zarchiwizowane",
|
"showArchived": "Pokaż zarchiwizowane",
|
||||||
"noneAvailable": "W tej chwili nie masz żadnych sekcji.",
|
"noneAvailable": "W tej chwili nie masz żadnych sekcji.",
|
||||||
"unarchive": "Cofnij archiwizację",
|
"unarchive": "Cofnij archiwizację",
|
||||||
"archived": "Zarchiwizowane",
|
"archived": "Zarchiwizowane",
|
||||||
"noLists": "Ta sekcja nie zawiera żadnych list.",
|
"noProjects": "This namespace does not contain any projects.",
|
||||||
"createList": "Utwórz nową listę w tej sekcji.",
|
"createProject": "Create a new project in this namespace.",
|
||||||
"namespaces": "Sekcje",
|
"namespaces": "Sekcje",
|
||||||
"search": "Wpisz, aby wyszukać sekcję…",
|
"search": "Wpisz, aby wyszukać sekcję…",
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nowa sekcja",
|
"title": "Nowa sekcja",
|
||||||
"titleRequired": "Proszę, podaj tytuł.",
|
"titleRequired": "Proszę, podaj tytuł.",
|
||||||
"explanation": "Sekcja to zbiór list, które możesz udostępniać i używać do organizowania list. Każda lista należy do jakiejś sekcji.",
|
"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.",
|
||||||
"tooltip": "Co to jest sekcja?",
|
"tooltip": "Co to jest sekcja?",
|
||||||
"success": "Sekcja została pomyślnie utworzona."
|
"success": "Sekcja została pomyślnie utworzona."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"titleArchive": "Archiwizuj \"{namespace}\"",
|
"titleArchive": "Archiwizuj \"{namespace}\"",
|
||||||
"titleUnarchive": "Cofnij archiwizację \"{namespace}\"",
|
"titleUnarchive": "Cofnij archiwizację \"{namespace}\"",
|
||||||
"archiveText": "Nie będziesz mógł tworzyć nowych list ani edytować tej sekcji, dopóki nie cofniesz archiwizacji. Ta operacja zarchiwizuje również wszystkie listy należące do tej sekcji.",
|
"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": "Będziesz mógł tworzyć nowe listy i je edytować.",
|
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||||
"success": "Sekcja została pomyślnie zarchiwizowana.",
|
"success": "Sekcja została pomyślnie zarchiwizowana.",
|
||||||
"unarchiveSuccess": "Archiwizacja sekcji została pomyślnie cofnięta.",
|
"unarchiveSuccess": "Archiwizacja sekcji została pomyślnie cofnięta.",
|
||||||
"description": "Jeśli sekcja jest zarchiwizowana, nie można edytować ani tworzyć nowych list."
|
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Usuń \"{namespace}\"",
|
"title": "Usuń \"{namespace}\"",
|
||||||
"text1": "Czy na pewno chcesz usunąć tę sekcję i całą jej zawartość?",
|
"text1": "Czy na pewno chcesz usunąć tę sekcję i całą jej zawartość?",
|
||||||
"text2": "Dotyczy to wszystkich list i zadań i tego NIE DA SIĘ COFNĄĆ!",
|
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||||
"success": "Sekcja została pomyślnie usunięta."
|
"success": "Sekcja została pomyślnie usunięta."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
|
@ -371,8 +371,8 @@
|
||||||
"isArchived": "Ta sekcja jest zarchiwizowana"
|
"isArchived": "Ta sekcja jest zarchiwizowana"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"sharedLists": {
|
"sharedProjects": {
|
||||||
"title": "Współdzielone listy"
|
"title": "Shared Projects"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Ulubione"
|
"title": "Ulubione"
|
||||||
|
@ -403,7 +403,7 @@
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Nowy filtr stały",
|
"title": "Nowy filtr stały",
|
||||||
"description": "Filtr stały to wirtualna lista, która jest kalkulowana na podstawie zestawu filtrów przy każdym wejściu w nią. Po utworzeniu pojawi się w specjalnej sekcji.",
|
"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.",
|
||||||
"action": "Utwórz nowy filtr stały",
|
"action": "Utwórz nowy filtr stały",
|
||||||
"titleRequired": "Please provide a title for the filter."
|
"titleRequired": "Please provide a title for the filter."
|
||||||
},
|
},
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
"label": {
|
"label": {
|
||||||
"title": "Etykiety",
|
"title": "Etykiety",
|
||||||
"manage": "Zarządzaj etykietami",
|
"manage": "Zarządzaj etykietami",
|
||||||
"description": "Kliknij etykietę, aby ją edytować. Możesz edytować wszystkie etykiety które utworzyłeś. Możesz edytować każdą etykietę powiązaną z zadaniem, do którego masz dostęp.",
|
"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.",
|
||||||
"newCTA": "Obecnie nie masz żadnych etykiet.",
|
"newCTA": "Obecnie nie masz żadnych etykiet.",
|
||||||
"search": "Wpisz, aby wyszukać etykietę…",
|
"search": "Wpisz, aby wyszukać etykietę…",
|
||||||
"create": {
|
"create": {
|
||||||
|
@ -460,7 +460,7 @@
|
||||||
},
|
},
|
||||||
"sharing": {
|
"sharing": {
|
||||||
"authenticating": "Uwierzytelnianie…",
|
"authenticating": "Uwierzytelnianie…",
|
||||||
"passwordRequired": "Ta współdzielona lista wymaga hasła. Wpisz je poniżej:",
|
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||||
"error": "Wystąpił błąd.",
|
"error": "Wystąpił błąd.",
|
||||||
"invalidPassword": "Hasło jest nieprawidłowe."
|
"invalidPassword": "Hasło jest nieprawidłowe."
|
||||||
},
|
},
|
||||||
|
@ -529,7 +529,7 @@
|
||||||
"code": "Kod",
|
"code": "Kod",
|
||||||
"quote": "Cytat",
|
"quote": "Cytat",
|
||||||
"unorderedList": "Lista nieuporządkowana",
|
"unorderedList": "Lista nieuporządkowana",
|
||||||
"orderedList": "Lista uporządkowana",
|
"orderedList ": "Ordered List",
|
||||||
"cleanBlock": "Wyczyść blok",
|
"cleanBlock": "Wyczyść blok",
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"image": "Obraz",
|
"image": "Obraz",
|
||||||
|
@ -602,6 +602,7 @@
|
||||||
"addReminder": "Dodaj nowe przypomnienie…",
|
"addReminder": "Dodaj nowe przypomnienie…",
|
||||||
"doneSuccess": "Zadanie zostało pomyślnie oznaczone jako ukończone.",
|
"doneSuccess": "Zadanie zostało pomyślnie oznaczone jako ukończone.",
|
||||||
"undoneSuccess": "Zadanie zostało pomyślnie otwarte ponownie.",
|
"undoneSuccess": "Zadanie zostało pomyślnie otwarte ponownie.",
|
||||||
|
"undo": "Undo",
|
||||||
"openDetail": "Otwórz szczegółowy widok zadania",
|
"openDetail": "Otwórz szczegółowy widok zadania",
|
||||||
"checklistTotal": "{checked} z {total} zadań",
|
"checklistTotal": "{checked} z {total} zadań",
|
||||||
"checklistAllDone": "{total} zadań",
|
"checklistAllDone": "{total} zadań",
|
||||||
|
@ -618,7 +619,7 @@
|
||||||
"chooseDueDate": "Kliknij tutaj, aby ustawić termin",
|
"chooseDueDate": "Kliknij tutaj, aby ustawić termin",
|
||||||
"chooseStartDate": "Kliknij tutaj, aby ustawić datę rozpoczęcia",
|
"chooseStartDate": "Kliknij tutaj, aby ustawić datę rozpoczęcia",
|
||||||
"chooseEndDate": "Kliknij tutaj, aby ustawić datę zakończenia",
|
"chooseEndDate": "Kliknij tutaj, aby ustawić datę zakończenia",
|
||||||
"move": "Przenieś zadanie na inną listę",
|
"move": "Move task to a different project",
|
||||||
"done": "Oznacz zadanie jako ukończone!",
|
"done": "Oznacz zadanie jako ukończone!",
|
||||||
"undone": "Otwórz zadanie ponownie",
|
"undone": "Otwórz zadanie ponownie",
|
||||||
"created": "Utworzono {0} przez {1}",
|
"created": "Utworzono {0} przez {1}",
|
||||||
|
@ -626,7 +627,7 @@
|
||||||
"doneAt": "Ukończone {0}",
|
"doneAt": "Ukończone {0}",
|
||||||
"updateSuccess": "Zadanie zostało pomyślnie zapisane.",
|
"updateSuccess": "Zadanie zostało pomyślnie zapisane.",
|
||||||
"deleteSuccess": "Zadanie zostało pomyślnie usunięte.",
|
"deleteSuccess": "Zadanie zostało pomyślnie usunięte.",
|
||||||
"belongsToList": "To zadanie należy do listy '{list}'",
|
"belongsToProject": "This task belongs to project '{project}'",
|
||||||
"due": "Termin {at}",
|
"due": "Termin {at}",
|
||||||
"closePopup": "Zamknij okno",
|
"closePopup": "Zamknij okno",
|
||||||
"delete": {
|
"delete": {
|
||||||
|
@ -646,7 +647,7 @@
|
||||||
"percentDone": "Ustaw postęp",
|
"percentDone": "Ustaw postęp",
|
||||||
"attachments": "Dodaj załączniki",
|
"attachments": "Dodaj załączniki",
|
||||||
"relatedTasks": "Dodaj powiązanie",
|
"relatedTasks": "Dodaj powiązanie",
|
||||||
"moveList": "Przenieś",
|
"moveProject": "Move",
|
||||||
"color": "Ustaw kolor",
|
"color": "Ustaw kolor",
|
||||||
"delete": "Usuń",
|
"delete": "Usuń",
|
||||||
"favorite": "Dodaj do ulubionych",
|
"favorite": "Dodaj do ulubionych",
|
||||||
|
@ -673,21 +674,21 @@
|
||||||
"updated": "Zaktualizowano"
|
"updated": "Zaktualizowano"
|
||||||
},
|
},
|
||||||
"subscription": {
|
"subscription": {
|
||||||
"subscribedListThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this list through its namespace.",
|
"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.",
|
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
|
||||||
"subscribedTaskThroughParentList": "You can't unsubscribe here because you are subscribed to this task through its list.",
|
"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.",
|
"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.",
|
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
|
||||||
"subscribedList": "You are currently subscribed to this list and will receive notifications for changes.",
|
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||||
"notSubscribedList": "You are not subscribed to this list and won't 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.",
|
"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.",
|
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
|
||||||
"subscribe": "Subskrybuj",
|
"subscribe": "Subskrybuj",
|
||||||
"unsubscribe": "Anuluj subskrypcję",
|
"unsubscribe": "Anuluj subskrypcję",
|
||||||
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
||||||
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
||||||
"subscribeSuccessList": "You are now subscribed to this list",
|
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||||
},
|
},
|
||||||
|
@ -761,7 +762,7 @@
|
||||||
"new": "Nowe powiązane zadanie",
|
"new": "Nowe powiązane zadanie",
|
||||||
"searchPlaceholder": "Wpisz, aby wyszukać zadanie, które chcesz dodać jako powiązane…",
|
"searchPlaceholder": "Wpisz, aby wyszukać zadanie, które chcesz dodać jako powiązane…",
|
||||||
"createPlaceholder": "Dodaj jako nowe powiązane zadanie",
|
"createPlaceholder": "Dodaj jako nowe powiązane zadanie",
|
||||||
"differentList": "To zadanie należy do innej listy.",
|
"differentProject": "This task belongs to a different project.",
|
||||||
"differentNamespace": "To zadanie należy do innej sekcji.",
|
"differentNamespace": "To zadanie należy do innej sekcji.",
|
||||||
"noneYet": "Nie ma jeszcze powiązanych zadań.",
|
"noneYet": "Nie ma jeszcze powiązanych zadań.",
|
||||||
"delete": "Usuń powiązane zadanie",
|
"delete": "Usuń powiązane zadanie",
|
||||||
|
@ -811,10 +812,10 @@
|
||||||
"priority1": "Aby ustawić priorytet zadania, dodaj liczbę 1-5 poprzedzoną {prefix}.",
|
"priority1": "Aby ustawić priorytet zadania, dodaj liczbę 1-5 poprzedzoną {prefix}.",
|
||||||
"priority2": "Im większa liczba, tym wyższy priorytet.",
|
"priority2": "Im większa liczba, tym wyższy priorytet.",
|
||||||
"assignees": "Aby bezpośrednio przypisać zadanie użytkownikowi, dodaj nazwę użytkownika poprzedzoną przedrostkiem {prefix} do zadania.",
|
"assignees": "Aby bezpośrednio przypisać zadanie użytkownikowi, dodaj nazwę użytkownika poprzedzoną przedrostkiem {prefix} do zadania.",
|
||||||
"list1": "Aby ustawić listę, do której ma zostać przypisane zadanie, wprowadź jego nazwę z prefiksem {prefix}.",
|
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||||
"list2": "Jeśli lista nie istnieje zostanie zwrócony błąd.",
|
"project2": "This will return an error if the project does not exist.",
|
||||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||||
"list4": "For example: {prefix}\"List with spaces\".",
|
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||||
"dateAndTime": "Data i godzina",
|
"dateAndTime": "Data i godzina",
|
||||||
"date": "Dowolna data może być użyta jako termin wykonania nowego zadania. Możesz wykorzystać datę w dowolnym z podanych formatów:",
|
"date": "Dowolna data może być użyta jako termin wykonania nowego zadania. Możesz wykorzystać datę w dowolnym z podanych formatów:",
|
||||||
"dateWeekday": "dowolny dzień tygodnia spowoduje wybranie najbliższej daty przypadającej na podany dzień tygodnia",
|
"dateWeekday": "dowolny dzień tygodnia spowoduje wybranie najbliższej daty przypadającej na podany dzień tygodnia",
|
||||||
|
@ -847,19 +848,19 @@
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Usuń zespół",
|
"header": "Usuń zespół",
|
||||||
"text1": "Czy na pewno chcesz usunąć ten zespół i wszystkich jego członków?",
|
"text1": "Czy na pewno chcesz usunąć ten zespół i wszystkich jego członków?",
|
||||||
"text2": "Wszyscy członkowie zespołu stracą dostęp do list i sekcji udostępnionych temu zespołowi. Tego NIE DA SIĘ COFNĄĆ!",
|
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||||
"success": "Zespół został pomyślnie usunięty."
|
"success": "Zespół został pomyślnie usunięty."
|
||||||
},
|
},
|
||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"header": "Usuń użytkownika z zespołu",
|
"header": "Usuń użytkownika z zespołu",
|
||||||
"text1": "Czy na pewno chcesz usunąć tego użytkownika z zespołu?",
|
"text1": "Czy na pewno chcesz usunąć tego użytkownika z zespołu?",
|
||||||
"text2": "Utraci on dostęp do wszystkich list i sekcji, do których ma dostęp ten zespół. Tego NIE DA SIĘ COFNĄĆ!",
|
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||||
"success": "Użytkownik został pomyślnie usunięty z zespołu."
|
"success": "Użytkownik został pomyślnie usunięty z zespołu."
|
||||||
},
|
},
|
||||||
"leave": {
|
"leave": {
|
||||||
"title": "Leave team",
|
"title": "Leave team",
|
||||||
"text1": "Are you sure you want to leave this team?",
|
"text1": "Are you sure you want to leave this team?",
|
||||||
"text2": "You will lose access to all lists and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
"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.",
|
||||||
"success": "You have successfully left the team."
|
"success": "You have successfully left the team."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -891,22 +892,22 @@
|
||||||
"attachment": "Dodaj załącznik do tego zadania",
|
"attachment": "Dodaj załącznik do tego zadania",
|
||||||
"related": "Zmodyfikuj zadania powiązane z tym zadaniem",
|
"related": "Zmodyfikuj zadania powiązane z tym zadaniem",
|
||||||
"color": "Zmień kolor tego zadania",
|
"color": "Zmień kolor tego zadania",
|
||||||
"move": "Przenieś to zadanie do innej listy",
|
"move": "Move this task to another project",
|
||||||
"reminder": "Zarządzaj przypomnieniami o tym zadaniu",
|
"reminder": "Zarządzaj przypomnieniami o tym zadaniu",
|
||||||
"description": "Toggle editing of the task description"
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"title": "Widoki listy",
|
"title": "Project Views",
|
||||||
"switchToListView": "Przełącz na widok listy",
|
"switchToListView": "Switch to list view",
|
||||||
"switchToGanttView": "Przełącz na widok Gantta",
|
"switchToGanttView": "Switch to gantt view",
|
||||||
"switchToKanbanView": "Przełącz na widok Kanban",
|
"switchToKanbanView": "Switch to kanban view",
|
||||||
"switchToTableView": "Przełącz na widok tabeli"
|
"switchToTableView": "Switch to table view"
|
||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"title": "Nawigacja",
|
"title": "Nawigacja",
|
||||||
"overview": "Przejdź do przeglądu",
|
"overview": "Przejdź do przeglądu",
|
||||||
"upcoming": "Przejdź do nadchodzących zadań",
|
"upcoming": "Przejdź do nadchodzących zadań",
|
||||||
"namespaces": "Przejdź do sekcji i list",
|
"namespaces": "Navigate to namespaces & projects",
|
||||||
"labels": "Przejdź do etykiet",
|
"labels": "Przejdź do etykiet",
|
||||||
"teams": "Przejdź do zespołów"
|
"teams": "Przejdź do zespołów"
|
||||||
}
|
}
|
||||||
|
@ -923,7 +924,7 @@
|
||||||
"unarchive": "Cofnij archiwizację",
|
"unarchive": "Cofnij archiwizację",
|
||||||
"setBackground": "Ustaw tło",
|
"setBackground": "Ustaw tło",
|
||||||
"share": "Udostępnij",
|
"share": "Udostępnij",
|
||||||
"newList": "Nowa lista"
|
"newProject": "New project"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"url": "URL Vikunji",
|
"url": "URL Vikunji",
|
||||||
|
@ -942,24 +943,24 @@
|
||||||
"notification": {
|
"notification": {
|
||||||
"title": "Powiadomienia",
|
"title": "Powiadomienia",
|
||||||
"none": "Nie masz żadnych powiadomień. Miłego dnia!",
|
"none": "Nie masz żadnych powiadomień. Miłego dnia!",
|
||||||
"explainer": "Powiadomienia pojawią się tutaj, gdy będą miały miejsce akcje na sekcjach, listach lub zadaniach, które subskrybujesz."
|
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||||
},
|
},
|
||||||
"quickActions": {
|
"quickActions": {
|
||||||
"commands": "Polecenia",
|
"commands": "Polecenia",
|
||||||
"placeholder": "Wpisz polecenie lub wyszukiwaną frazę…",
|
"placeholder": "Wpisz polecenie lub wyszukiwaną frazę…",
|
||||||
"hint": "Możesz użyć {list}, aby ograniczyć wyszukiwanie do listy. Połącz {list} lub {label} (etykiety) z wyszukiwaną frazą, aby wyszukać zadanie z tymi etykietami lub na tej liście. Użyj {assignee}, aby wyszukiwać tylko zespoły.",
|
"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.",
|
||||||
"tasks": "Zadania",
|
"tasks": "Zadania",
|
||||||
"lists": "Listy",
|
"projects": "Projects",
|
||||||
"teams": "Zespoły",
|
"teams": "Zespoły",
|
||||||
"newList": "Wpisz tytuł nowej listy…",
|
"newProject": "Enter the title of the new project…",
|
||||||
"newTask": "Wpisz tytuł nowego zadania…",
|
"newTask": "Wpisz tytuł nowego zadania…",
|
||||||
"newNamespace": "Wpisz tytuł nowej sekcji…",
|
"newNamespace": "Wpisz tytuł nowej sekcji…",
|
||||||
"newTeam": "Wpisz nazwę nowego zespołu…",
|
"newTeam": "Wpisz nazwę nowego zespołu…",
|
||||||
"createTask": "Utwórz zadanie na bieżącej liście ({title})",
|
"createTask": "Create a task in the current project ({title})",
|
||||||
"createList": "Utwórz listę w bieżącej sekcji ({title})",
|
"createProject": "Create a project in the current namespace ({title})",
|
||||||
"cmds": {
|
"cmds": {
|
||||||
"newTask": "Nowe zadanie",
|
"newTask": "Nowe zadanie",
|
||||||
"newList": "Nowa lista",
|
"newProject": "New project",
|
||||||
"newNamespace": "Nowa sekcja",
|
"newNamespace": "Nowa sekcja",
|
||||||
"newTeam": "Nowy zespół"
|
"newTeam": "Nowy zespół"
|
||||||
}
|
}
|
||||||
|
@ -991,15 +992,15 @@
|
||||||
"1018": "Ustawienie typu awatara użytkownika jest nieprawidłowe.",
|
"1018": "Ustawienie typu awatara użytkownika jest nieprawidłowe.",
|
||||||
"2001": "ID nie może być puste lub równe 0.",
|
"2001": "ID nie może być puste lub równe 0.",
|
||||||
"2002": "Niektóre dane żądania były nieprawidłowe.",
|
"2002": "Niektóre dane żądania były nieprawidłowe.",
|
||||||
"3001": "Lista nie istnieje.",
|
"3001": "The project does not exist.",
|
||||||
"3004": "Aby wykonać tę akcję, musisz mieć uprawnienia do odczytu tej listy.",
|
"3004": "You need to have read permissions on that project to perform that action.",
|
||||||
"3005": "Tytuł listy nie może być pusty.",
|
"3005": "The project title cannot be empty.",
|
||||||
"3006": "Współdzielona lista nie istnieje.",
|
"3006": "The project share does not exist.",
|
||||||
"3007": "Lista o tym identyfikatorze już istnieje.",
|
"3007": "A project with this identifier already exists.",
|
||||||
"3008": "Lista jest zarchiwizowana i dlatego jest dostępna w trybie tylko do odczytu. Dotyczy to również wszystkich zadań powiązanych z tą listą.",
|
"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": "Tekst zadania listy nie może być pusty.",
|
"4001": "The project task text cannot be empty.",
|
||||||
"4002": "Zadanie listy nie istnieje.",
|
"4002": "The project task does not exist.",
|
||||||
"4003": "Wszystkie zadania edycji zbiorczej muszą należeć do tej samej listy.",
|
"4003": "All bulk editing tasks must belong to the same project.",
|
||||||
"4004": "Potrzebujesz co najmniej jednego zadania do edycji zbiorczej zadań.",
|
"4004": "Potrzebujesz co najmniej jednego zadania do edycji zbiorczej zadań.",
|
||||||
"4005": "Nie masz uprawnień, aby zobaczyć to zadanie.",
|
"4005": "Nie masz uprawnień, aby zobaczyć to zadanie.",
|
||||||
"4006": "Zadanie nie może zostać ustawione jako nadrzędne dla samego siebie.",
|
"4006": "Zadanie nie może zostać ustawione jako nadrzędne dla samego siebie.",
|
||||||
|
@ -1025,21 +1026,21 @@
|
||||||
"5012": "Sekcja jest zarchiwizowana, dlatego może być dostępna tylko do odczytu.",
|
"5012": "Sekcja jest zarchiwizowana, dlatego może być dostępna tylko do odczytu.",
|
||||||
"6001": "Nazwa zespołu nie może być pusta.",
|
"6001": "Nazwa zespołu nie może być pusta.",
|
||||||
"6002": "Zespół nie istnieje.",
|
"6002": "Zespół nie istnieje.",
|
||||||
"6004": "Zespół ma już dostęp do tej sekcji lub listy.",
|
"6004": "The team already has access to that namespace or project.",
|
||||||
"6005": "Użytkownik jest już członkiem tego zespołu.",
|
"6005": "Użytkownik jest już członkiem tego zespołu.",
|
||||||
"6006": "Nie można usunąć ostatniego członka zespołu.",
|
"6006": "Nie można usunąć ostatniego członka zespołu.",
|
||||||
"6007": "Zespół nie ma dostępu do listy, aby wykonać tę akcję.",
|
"6007": "The team does not have access to the project to perform that action.",
|
||||||
"7002": "Użytkownik ma już dostęp do tej listy.",
|
"7002": "The user already has access to that project.",
|
||||||
"7003": "Nie masz dostępu do tej listy.",
|
"7003": "You do not have access to that project.",
|
||||||
"8001": "Ta etykieta już istnieje w tym zadaniu.",
|
"8001": "Ta etykieta już istnieje w tym zadaniu.",
|
||||||
"8002": "Etykieta nie istnieje.",
|
"8002": "Etykieta nie istnieje.",
|
||||||
"8003": "Nie masz dostępu do tej etykiety.",
|
"8003": "Nie masz dostępu do tej etykiety.",
|
||||||
"9001": "Nieprawidłowe uprawnienia.",
|
"9001": "Nieprawidłowe uprawnienia.",
|
||||||
"10001": "Zasobnik nie istnieje.",
|
"10001": "Zasobnik nie istnieje.",
|
||||||
"10002": "Zasobnik nie należy do tej listy.",
|
"10002": "The bucket does not belong to that project.",
|
||||||
"10003": "Nie możesz usunąć ostatniego zasobnika z listy.",
|
"10003": "You cannot remove the last bucket on a project.",
|
||||||
"10004": "Nie możesz dodać zadania do tego zasobnika, ponieważ przekroczyło już limit zadań, które może pomieścić.",
|
"10004": "Nie możesz dodać zadania do tego zasobnika, ponieważ przekroczyło już limit zadań, które może pomieścić.",
|
||||||
"10005": "Na liście może znajdować się tylko jeden zasobnik ukończonych zadań.",
|
"10005": "There can be only one done bucket per project.",
|
||||||
"11001": "Filtr stały nie istnieje.",
|
"11001": "Filtr stały nie istnieje.",
|
||||||
"11002": "Filtry stałe nie są dostępne dla udostępnionych linków.",
|
"11002": "Filtry stałe nie są dostępne dla udostępnionych linków.",
|
||||||
"12001": "Typ subskrypcji jest nieprawidłowy.",
|
"12001": "Typ subskrypcji jest nieprawidłowy.",
|
||||||
|
|
|
@ -5,10 +5,10 @@
|
||||||
"welcomeDay": "Olá, {username}!",
|
"welcomeDay": "Olá, {username}!",
|
||||||
"welcomeEvening": "Boa noite, {username}!",
|
"welcomeEvening": "Boa noite, {username}!",
|
||||||
"lastViewed": "Visto por último",
|
"lastViewed": "Visto por último",
|
||||||
"list": {
|
"project": {
|
||||||
"newText": "Você pode criar uma nova lista para suas novas tarefas:",
|
"newText": "You can create a new project for your new tasks:",
|
||||||
"new": "Nova lista",
|
"new": "New project",
|
||||||
"importText": "Or import your lists and tasks from other services into Vikunja:",
|
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||||
"import": "Import your data into Vikunja"
|
"import": "Import your data into Vikunja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
"weekStartSunday": "Sunday",
|
"weekStartSunday": "Sunday",
|
||||||
"weekStartMonday": "Monday",
|
"weekStartMonday": "Monday",
|
||||||
"language": "Language",
|
"language": "Language",
|
||||||
"defaultList": "Default List",
|
"defaultProject": "Default Project",
|
||||||
"timezone": "Fuso horário",
|
"timezone": "Fuso horário",
|
||||||
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
||||||
},
|
},
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
},
|
},
|
||||||
"deletion": {
|
"deletion": {
|
||||||
"title": "Delete your Vikunja Account",
|
"title": "Delete your Vikunja Account",
|
||||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, lists, tasks and everything associated with it.",
|
"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.",
|
||||||
"text2": "To proceed, please enter your password. You will receive an email with further instructions.",
|
"text2": "To proceed, please enter your password. You will receive an email with further instructions.",
|
||||||
"confirm": "Delete my account",
|
"confirm": "Delete my account",
|
||||||
"requestSuccess": "The request was successful. You'll receive an email with further instructions.",
|
"requestSuccess": "The request was successful. You'll receive an email with further instructions.",
|
||||||
|
@ -157,47 +157,39 @@
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"title": "Export your Vikunja data",
|
"title": "Export your Vikunja data",
|
||||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Lists, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
"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.",
|
||||||
"descriptionPasswordRequired": "Please enter your password to proceed:",
|
"descriptionPasswordRequired": "Please enter your password to proceed:",
|
||||||
"request": "Request a copy of my Vikunja Data",
|
"request": "Request a copy of my Vikunja Data",
|
||||||
"success": "You've successfully requested your Vikunja Data! We will send you an email once it's ready to download.",
|
"success": "You've successfully requested your Vikunja Data! We will send you an email once it's ready to download.",
|
||||||
"downloadTitle": "Download your exported Vikunja data"
|
"downloadTitle": "Download your exported Vikunja data"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"archived": "This list is archived. It is not possible to create new or edit tasks for it.",
|
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||||
"title": "List Title",
|
"title": "Project Title",
|
||||||
"color": "Color",
|
"color": "Color",
|
||||||
"lists": "Lists",
|
"projects": "Projects",
|
||||||
"list": {
|
"search": "Type to search for a project…",
|
||||||
"title": "List",
|
"searchSelect": "Click or press enter to select this project",
|
||||||
"add": "Add",
|
"shared": "Shared Projects",
|
||||||
"addPlaceholder": "Add a new task…",
|
"noDescriptionAvailable": "No project description is available.",
|
||||||
"empty": "Esta lista está atualmente vazia.",
|
|
||||||
"newTaskCta": "Criar uma nova tarefa.",
|
|
||||||
"editTask": "Editar Tarefa"
|
|
||||||
},
|
|
||||||
"search": "Type to search for a list…",
|
|
||||||
"searchSelect": "Click or press enter to select this list",
|
|
||||||
"shared": "Shared Lists",
|
|
||||||
"noDescriptionAvailable": "No list description is available.",
|
|
||||||
"create": {
|
"create": {
|
||||||
"header": "Nova lista",
|
"header": "New project",
|
||||||
"titlePlaceholder": "The list's title goes here…",
|
"titlePlaceholder": "The project's title goes here…",
|
||||||
"addTitleRequired": "Please specify a title.",
|
"addTitleRequired": "Please specify a title.",
|
||||||
"createdSuccess": "The list was successfully created.",
|
"createdSuccess": "The project was successfully created.",
|
||||||
"addListRequired": "Please specify a list or set a default list in the settings."
|
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"title": "Archive \"{list}\"",
|
"title": "Archive \"{project}\"",
|
||||||
"archive": "Archive this list",
|
"archive": "Archive this project",
|
||||||
"unarchive": "Un-Archive this list",
|
"unarchive": "Un-Archive this project",
|
||||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||||
"archiveText": "You won't be able to edit this list or create new tasks until you un-archive it.",
|
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||||
"success": "The list was successfully archived."
|
"success": "The project was successfully archived."
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
"title": "Set list background",
|
"title": "Set project background",
|
||||||
"remove": "Remove Background",
|
"remove": "Remove Background",
|
||||||
"upload": "Choose a background from your pc",
|
"upload": "Choose a background from your pc",
|
||||||
"searchPlaceholder": "Search for a background…",
|
"searchPlaceholder": "Search for a background…",
|
||||||
|
@ -207,40 +199,40 @@
|
||||||
"removeSuccess": "The background has been removed successfully!"
|
"removeSuccess": "The background has been removed successfully!"
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Delete \"{list}\"",
|
"title": "Delete \"{project}\"",
|
||||||
"header": "Delete this list",
|
"header": "Delete this project",
|
||||||
"text1": "Are you sure you want to delete this list and all of its contents?",
|
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||||
"success": "The list was successfully deleted.",
|
"success": "The project was successfully deleted.",
|
||||||
"tasksToDelete": "Isto irá remover irrevogavelmente aprox. {count} tarefas.",
|
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||||
"noTasksToDelete": "Esta lista não contém tarefas, deve ser segura para excluir."
|
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||||
},
|
},
|
||||||
"duplicate": {
|
"duplicate": {
|
||||||
"title": "Duplicate this list",
|
"title": "Duplicate this project",
|
||||||
"label": "Duplicate",
|
"label": "Duplicate",
|
||||||
"text": "Select a namespace which should hold the duplicated list:",
|
"text": "Select a namespace which should hold the duplicated project:",
|
||||||
"success": "The list was successfully duplicated."
|
"success": "The project was successfully duplicated."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"header": "Edit This List",
|
"header": "Edit This Project",
|
||||||
"title": "Edit \"{list}\"",
|
"title": "Edit \"{project}\"",
|
||||||
"titlePlaceholder": "The list title goes here…",
|
"titlePlaceholder": "The project title goes here…",
|
||||||
"identifierTooltip": "The list identifier can be used to uniquely identify a task across lists. You can set it to empty to disable it.",
|
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||||
"identifier": "List Identifier",
|
"identifier": "Project Identifier",
|
||||||
"identifierPlaceholder": "The list identifier goes here…",
|
"identifierPlaceholder": "The project identifier goes here…",
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "The lists description goes here…",
|
"descriptionPlaceholder": "The projects description goes here…",
|
||||||
"color": "Color",
|
"color": "Color",
|
||||||
"success": "The list was successfully updated."
|
"success": "The project was successfully updated."
|
||||||
},
|
},
|
||||||
"share": {
|
"share": {
|
||||||
"header": "Share this list",
|
"header": "Share this project",
|
||||||
"title": "Share \"{list}\"",
|
"title": "Share \"{project}\"",
|
||||||
"share": "Share",
|
"share": "Share",
|
||||||
"links": {
|
"links": {
|
||||||
"title": "Share Links",
|
"title": "Share Links",
|
||||||
"what": "What is a share link?",
|
"what": "What is a share link?",
|
||||||
"explanation": "Share Links allow you to easily share a list with other users who don't have an account on Vikunja.",
|
"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",
|
"create": "Create a new link share",
|
||||||
"name": "Name (optional)",
|
"name": "Name (optional)",
|
||||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||||
|
@ -249,7 +241,7 @@
|
||||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||||
"noName": "No name set",
|
"noName": "No name set",
|
||||||
"remove": "Remove a link share",
|
"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 list with this link share. This cannot be undone!",
|
"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.",
|
"createSuccess": "The link share was successfully created.",
|
||||||
"deleteSuccess": "The link share was successfully deleted",
|
"deleteSuccess": "The link share was successfully deleted",
|
||||||
"view": "View",
|
"view": "View",
|
||||||
|
@ -268,7 +260,7 @@
|
||||||
"updatedSuccess": "The {type} was successfully added."
|
"updatedSuccess": "The {type} was successfully added."
|
||||||
},
|
},
|
||||||
"right": {
|
"right": {
|
||||||
"title": "Permissão",
|
"title": "Permission",
|
||||||
"read": "Read only",
|
"read": "Read only",
|
||||||
"readWrite": "Read & write",
|
"readWrite": "Read & write",
|
||||||
"admin": "Admin"
|
"admin": "Admin"
|
||||||
|
@ -278,80 +270,88 @@
|
||||||
"delete": "Delete"
|
"delete": "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"
|
||||||
|
},
|
||||||
"gantt": {
|
"gantt": {
|
||||||
"title": "Gantt",
|
"title": "Gantt",
|
||||||
"showTasksWithoutDates": "Mostrar tarefas que não possuem datas definidas",
|
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||||
"size": "Tamanho",
|
"size": "Size",
|
||||||
"default": "Padrão",
|
"default": "Default",
|
||||||
"month": "Mês",
|
"month": "Month",
|
||||||
"day": "Dia",
|
"day": "Day",
|
||||||
"hour": "Hour",
|
"hour": "Hour",
|
||||||
"range": "Date Range",
|
"range": "Date Range",
|
||||||
"noDates": "Esta tarefa não tem datas definidas."
|
"noDates": "This task has no dates set."
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"title": "Tabela",
|
"title": "Table",
|
||||||
"columns": "Colunas"
|
"columns": "Columns"
|
||||||
},
|
},
|
||||||
"kanban": {
|
"kanban": {
|
||||||
"title": "Kanban",
|
"title": "Kanban",
|
||||||
"limit": "Limite: {limit}",
|
"limit": "Limit: {limit}",
|
||||||
"noLimit": "Não definido",
|
"noLimit": "Not Set",
|
||||||
"doneBucket": "Bucket concluído",
|
"doneBucket": "Done bucket",
|
||||||
"doneBucketHint": "Todas as tarefas movidas para este bucket serão marcadas automaticamente como concluídas.",
|
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||||
"doneBucketHintExtended": "Todas as tarefas movidas para o bucket concluído serão automaticamente concluídas também. Todas as tarefas concluídas de outro lugar serão movidas também.",
|
"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": "O bucket foi marcado como concluído com sucesso.",
|
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||||
"deleteLast": "Você não pode remover o último bucket.",
|
"deleteLast": "You cannot remove the last bucket.",
|
||||||
"addTaskPlaceholder": "Digite o novo título da tarefa…",
|
"addTaskPlaceholder": "Enter the new task title…",
|
||||||
"addTask": "Adicionar uma tarefa",
|
"addTask": "Add a task",
|
||||||
"addAnotherTask": "Adicionar outra tarefa",
|
"addAnotherTask": "Add another task",
|
||||||
"addBucket": "Criar um novo bucket",
|
"addBucket": "Create a new bucket",
|
||||||
"addBucketPlaceholder": "Digite o novo título do bucket…",
|
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||||
"deleteHeaderBucket": "Excluir o bucket",
|
"deleteHeaderBucket": "Delete the bucket",
|
||||||
"deleteBucketText1": "Tem certeza que deseja excluir este bucket?",
|
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||||
"deleteBucketText2": "Isto não vai apagar nenhuma tarefa, mas as moverá para o bucket padrão.",
|
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||||
"deleteBucketSuccess": "O bucket foi excluído com sucesso.",
|
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||||
"bucketTitleSavedSuccess": "O título do bucket foi salvo com sucesso.",
|
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||||
"bucketLimitSavedSuccess": "O limite do bucket foi salvo com sucesso.",
|
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||||
"collapse": "Recolher este bucket"
|
"collapse": "Collapse this bucket"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favoritos"
|
"title": "Favorites"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"namespace": {
|
"namespace": {
|
||||||
"title": "Listas & Namespaces",
|
"title": "Namespaces & Projects",
|
||||||
"namespace": "Namespace",
|
"namespace": "Namespace",
|
||||||
"showArchived": "Show Archived",
|
"showArchived": "Show Archived",
|
||||||
"noneAvailable": "Você não tem nenhum namespace no momento.",
|
"noneAvailable": "Você não tem nenhum namespace no momento.",
|
||||||
"unarchive": "Desarquivar",
|
"unarchive": "Desarquivar",
|
||||||
"archived": "Arquivado",
|
"archived": "Arquivado",
|
||||||
"noLists": "Este namespace não contém nenhuma lista.",
|
"noProjects": "This namespace does not contain any projects.",
|
||||||
"createList": "Criar uma nova lista neste namespace.",
|
"createProject": "Create a new project in this namespace.",
|
||||||
"namespaces": "Namespaces",
|
"namespaces": "Namespaces",
|
||||||
"search": "Digite para procurar por um namespace…",
|
"search": "Digite para procurar por um namespace…",
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Novo namespace",
|
"title": "Novo namespace",
|
||||||
"titleRequired": "Por favor, especifique um título.",
|
"titleRequired": "Por favor, especifique um título.",
|
||||||
"explanation": "Um namespace é uma coleção de listas que você pode compartilhar e usar para organizar suas listas. Na verdade, todas as listas pertencem a um namespace.",
|
"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.",
|
||||||
"tooltip": "O que é um namespace?",
|
"tooltip": "O que é um namespace?",
|
||||||
"success": "O namespace foi criado com sucesso."
|
"success": "O namespace foi criado com sucesso."
|
||||||
},
|
},
|
||||||
"archive": {
|
"archive": {
|
||||||
"titleArchive": "Arquivar \"{namespace}\"",
|
"titleArchive": "Arquivar \"{namespace}\"",
|
||||||
"titleUnarchive": "Desarquivar \"{namespace}\"",
|
"titleUnarchive": "Desarquivar \"{namespace}\"",
|
||||||
"archiveText": "You won't be able to edit this namespace or create new lists until you un-archive it. This will also archive all lists in this 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": "Você será capaz de criar novas listas ou editá-las.",
|
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||||
"success": "O namespace foi arquivado com sucesso.",
|
"success": "O namespace foi arquivado com sucesso.",
|
||||||
"unarchiveSuccess": "O namespace foi desarquivado com sucesso.",
|
"unarchiveSuccess": "O namespace foi desarquivado com sucesso.",
|
||||||
"description": "If a namespace is archived, you cannot create new lists or edit it."
|
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Excluir \"{namespace}\"",
|
"title": "Excluir \"{namespace}\"",
|
||||||
"text1": "Are you sure you want to delete this namespace and all of its contents?",
|
"text1": "Are you sure you want to delete this namespace and all of its contents?",
|
||||||
"text2": "This includes all lists and tasks and CANNOT BE UNDONE!",
|
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||||
"success": "O namespace foi excluído com sucesso."
|
"success": "O namespace foi excluído com sucesso."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
|
@ -371,8 +371,8 @@
|
||||||
"isArchived": "Este namespace está arquivado"
|
"isArchived": "Este namespace está arquivado"
|
||||||
},
|
},
|
||||||
"pseudo": {
|
"pseudo": {
|
||||||
"sharedLists": {
|
"sharedProjects": {
|
||||||
"title": "Listas Compartilhadas"
|
"title": "Shared Projects"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"title": "Favoritos"
|
"title": "Favoritos"
|
||||||
|
@ -403,7 +403,7 @@
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Novo filtro salvo",
|
"title": "Novo filtro salvo",
|
||||||
"description": "A saved filter is a virtual list which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
"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.",
|
||||||
"action": "Create new saved filter",
|
"action": "Create new saved filter",
|
||||||
"titleRequired": "Please provide a title for the filter."
|
"titleRequired": "Please provide a title for the filter."
|
||||||
},
|
},
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
"label": {
|
"label": {
|
||||||
"title": "Etiquetas",
|
"title": "Etiquetas",
|
||||||
"manage": "Editar etiquetas",
|
"manage": "Editar 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 list you have access.",
|
"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.",
|
||||||
"newCTA": "Você não tem nenhuma etiqueta atualmente.",
|
"newCTA": "Você não tem nenhuma etiqueta atualmente.",
|
||||||
"search": "Digite para procurar por uma etiqueta…",
|
"search": "Digite para procurar por uma etiqueta…",
|
||||||
"create": {
|
"create": {
|
||||||
|
@ -460,7 +460,7 @@
|
||||||
},
|
},
|
||||||
"sharing": {
|
"sharing": {
|
||||||
"authenticating": "Autenticando…",
|
"authenticating": "Autenticando…",
|
||||||
"passwordRequired": "Esta lista compartilhada requer uma senha. Por favor, digite-a abaixo:",
|
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||||
"error": "Ocorreu um erro.",
|
"error": "Ocorreu um erro.",
|
||||||
"invalidPassword": "A senha é inválida."
|
"invalidPassword": "A senha é inválida."
|
||||||
},
|
},
|
||||||
|
@ -529,7 +529,7 @@
|
||||||
"code": "Código",
|
"code": "Código",
|
||||||
"quote": "Citação",
|
"quote": "Citação",
|
||||||
"unorderedList": "Lista não ordenada",
|
"unorderedList": "Lista não ordenada",
|
||||||
"orderedList": "Lista ordenada",
|
"orderedList ": "Ordered List",
|
||||||
"cleanBlock": "Clean Block",
|
"cleanBlock": "Clean Block",
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"image": "Imagem",
|
"image": "Imagem",
|
||||||
|
@ -602,6 +602,7 @@
|
||||||
"addReminder": "Adicionar um novo lembrete…",
|
"addReminder": "Adicionar um novo lembrete…",
|
||||||
"doneSuccess": "A tarefa foi marcada como feita com sucesso.",
|
"doneSuccess": "A tarefa foi marcada como feita com sucesso.",
|
||||||
"undoneSuccess": "A tarefa foi desmarcada como feita com sucesso.",
|
"undoneSuccess": "A tarefa foi desmarcada como feita com sucesso.",
|
||||||
|
"undo": "Undo",
|
||||||
"openDetail": "Abrir detalhes da tarefa",
|
"openDetail": "Abrir detalhes da tarefa",
|
||||||
"checklistTotal": "{checked} de {total} tarefas",
|
"checklistTotal": "{checked} de {total} tarefas",
|
||||||
"checklistAllDone": "{total} tarefas",
|
"checklistAllDone": "{total} tarefas",
|
||||||
|
@ -618,7 +619,7 @@
|
||||||
"chooseDueDate": "Click here to set a due date",
|
"chooseDueDate": "Click here to set a due date",
|
||||||
"chooseStartDate": "Clique aqui para definir uma data de início",
|
"chooseStartDate": "Clique aqui para definir uma data de início",
|
||||||
"chooseEndDate": "Click here to set an end date",
|
"chooseEndDate": "Click here to set an end date",
|
||||||
"move": "Move task to a different list",
|
"move": "Move task to a different project",
|
||||||
"done": "Marcar tarefa como concluída!",
|
"done": "Marcar tarefa como concluída!",
|
||||||
"undone": "Marcar como não concluído",
|
"undone": "Marcar como não concluído",
|
||||||
"created": "Criado {0} por {1}",
|
"created": "Criado {0} por {1}",
|
||||||
|
@ -626,7 +627,7 @@
|
||||||
"doneAt": "Concluído {0}",
|
"doneAt": "Concluído {0}",
|
||||||
"updateSuccess": "A tarefa foi salva com sucesso.",
|
"updateSuccess": "A tarefa foi salva com sucesso.",
|
||||||
"deleteSuccess": "A tarefa foi excluída com sucesso.",
|
"deleteSuccess": "A tarefa foi excluída com sucesso.",
|
||||||
"belongsToList": "This task belongs to list '{list}'",
|
"belongsToProject": "This task belongs to project '{project}'",
|
||||||
"due": "Due {at}",
|
"due": "Due {at}",
|
||||||
"closePopup": "Fechar janela",
|
"closePopup": "Fechar janela",
|
||||||
"delete": {
|
"delete": {
|
||||||
|
@ -646,7 +647,7 @@
|
||||||
"percentDone": "Definir progresso",
|
"percentDone": "Definir progresso",
|
||||||
"attachments": "Adicionar anexos",
|
"attachments": "Adicionar anexos",
|
||||||
"relatedTasks": "Add Relation",
|
"relatedTasks": "Add Relation",
|
||||||
"moveList": "Mover",
|
"moveProject": "Move",
|
||||||
"color": "Definir cor",
|
"color": "Definir cor",
|
||||||
"delete": "Excluir",
|
"delete": "Excluir",
|
||||||
"favorite": "Adicionar aos favoritos",
|
"favorite": "Adicionar aos favoritos",
|
||||||
|
@ -673,21 +674,21 @@
|
||||||
"updated": "Atualizado"
|
"updated": "Atualizado"
|
||||||
},
|
},
|
||||||
"subscription": {
|
"subscription": {
|
||||||
"subscribedListThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this list through its namespace.",
|
"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.",
|
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
|
||||||
"subscribedTaskThroughParentList": "You can't unsubscribe here because you are subscribed to this task through its list.",
|
"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.",
|
"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.",
|
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
|
||||||
"subscribedList": "You are currently subscribed to this list and will receive notifications for changes.",
|
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||||
"notSubscribedList": "You are not subscribed to this list and won't 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.",
|
"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.",
|
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
|
||||||
"subscribe": "Inscrever-se",
|
"subscribe": "Inscrever-se",
|
||||||
"unsubscribe": "Desinscrever-se",
|
"unsubscribe": "Desinscrever-se",
|
||||||
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
||||||
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
||||||
"subscribeSuccessList": "You are now subscribed to this list",
|
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||||
},
|
},
|
||||||
|
@ -761,7 +762,7 @@
|
||||||
"new": "New Task Relation",
|
"new": "New Task Relation",
|
||||||
"searchPlaceholder": "Type search for a new task to add as related…",
|
"searchPlaceholder": "Type search for a new task to add as related…",
|
||||||
"createPlaceholder": "Add this as new related task",
|
"createPlaceholder": "Add this as new related task",
|
||||||
"differentList": "This task belongs to a different list.",
|
"differentProject": "This task belongs to a different project.",
|
||||||
"differentNamespace": "This task belongs to a different namespace.",
|
"differentNamespace": "This task belongs to a different namespace.",
|
||||||
"noneYet": "No task relations yet.",
|
"noneYet": "No task relations yet.",
|
||||||
"delete": "Delete Task Relation",
|
"delete": "Delete Task Relation",
|
||||||
|
@ -811,10 +812,10 @@
|
||||||
"priority1": "Para definir a prioridade de uma tarefa, adicione um número de 1 a 5, precedido de um {prefix}.",
|
"priority1": "Para definir a prioridade de uma tarefa, adicione um número de 1 a 5, precedido de um {prefix}.",
|
||||||
"priority2": "Quanto maior o número, maior a prioridade.",
|
"priority2": "Quanto maior o número, maior a prioridade.",
|
||||||
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
||||||
"list1": "To set a list for the task to appear in, enter its name prefixed with {prefix}.",
|
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||||
"list2": "This will return an error if the list does not exist.",
|
"project2": "This will return an error if the project does not exist.",
|
||||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||||
"list4": "For example: {prefix}\"List with spaces\".",
|
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||||
"dateAndTime": "Data e hora",
|
"dateAndTime": "Data e hora",
|
||||||
"date": "Any date will be used as the due date of the new task. You can use dates in any of these formats:",
|
"date": "Any date will be used as the due date of the new task. You can use dates in any of these formats:",
|
||||||
"dateWeekday": "any weekday, will use the next date with that date",
|
"dateWeekday": "any weekday, will use the next date with that date",
|
||||||
|
@ -847,19 +848,19 @@
|
||||||
"delete": {
|
"delete": {
|
||||||
"header": "Excluir a equipe",
|
"header": "Excluir a equipe",
|
||||||
"text1": "Are you sure you want to delete this team and all of its members?",
|
"text1": "Are you sure you want to delete this team and all of its members?",
|
||||||
"text2": "All team members will lose access to lists and namespaces shared with this team. This CANNOT BE UNDONE!",
|
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||||
"success": "A equipe foi excluída com sucesso."
|
"success": "A equipe foi excluída com sucesso."
|
||||||
},
|
},
|
||||||
"deleteUser": {
|
"deleteUser": {
|
||||||
"header": "Remove a user from the team",
|
"header": "Remove a user from the team",
|
||||||
"text1": "Are you sure you want to remove this user from the team?",
|
"text1": "Are you sure you want to remove this user from the team?",
|
||||||
"text2": "They will lose access to all lists and namespaces this team has access to. This CANNOT BE UNDONE!",
|
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||||
"success": "O usuário foi removido da equipe com sucesso."
|
"success": "O usuário foi removido da equipe com sucesso."
|
||||||
},
|
},
|
||||||
"leave": {
|
"leave": {
|
||||||
"title": "Leave team",
|
"title": "Leave team",
|
||||||
"text1": "Are you sure you want to leave this team?",
|
"text1": "Are you sure you want to leave this team?",
|
||||||
"text2": "You will lose access to all lists and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
"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.",
|
||||||
"success": "You have successfully left the team."
|
"success": "You have successfully left the team."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -891,12 +892,12 @@
|
||||||
"attachment": "Add an attachment to this task",
|
"attachment": "Add an attachment to this task",
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another project",
|
||||||
"reminder": "Manage reminders of this task",
|
"reminder": "Manage reminders of this task",
|
||||||
"description": "Toggle editing of the task description"
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"project": {
|
||||||
"title": "List Views",
|
"title": "Project Views",
|
||||||
"switchToListView": "Switch to list view",
|
"switchToListView": "Switch to list view",
|
||||||
"switchToGanttView": "Switch to gantt view",
|
"switchToGanttView": "Switch to gantt view",
|
||||||
"switchToKanbanView": "Switch to kanban view",
|
"switchToKanbanView": "Switch to kanban view",
|
||||||
|
@ -906,7 +907,7 @@
|
||||||
"title": "Navigation",
|
"title": "Navigation",
|
||||||
"overview": "Navigate to overview",
|
"overview": "Navigate to overview",
|
||||||
"upcoming": "Navigate to upcoming tasks",
|
"upcoming": "Navigate to upcoming tasks",
|
||||||
"namespaces": "Navigate to namespaces & lists",
|
"namespaces": "Navigate to namespaces & projects",
|
||||||
"labels": "Navigate to labels",
|
"labels": "Navigate to labels",
|
||||||
"teams": "Navigate to teams"
|
"teams": "Navigate to teams"
|
||||||
}
|
}
|
||||||
|
@ -923,7 +924,7 @@
|
||||||
"unarchive": "Un-Archive",
|
"unarchive": "Un-Archive",
|
||||||
"setBackground": "Set background",
|
"setBackground": "Set background",
|
||||||
"share": "Share",
|
"share": "Share",
|
||||||
"newList": "New list"
|
"newProject": "New project"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"url": "Vikunja URL",
|
"url": "Vikunja URL",
|
||||||
|
@ -942,24 +943,24 @@
|
||||||
"notification": {
|
"notification": {
|
||||||
"title": "Notificações",
|
"title": "Notificações",
|
||||||
"none": "You don't have any notifications. Have a nice day!",
|
"none": "You don't have any notifications. Have a nice day!",
|
||||||
"explainer": "Notifications will appear here when actions on namespaces, lists or tasks you subscribed to happen."
|
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||||
},
|
},
|
||||||
"quickActions": {
|
"quickActions": {
|
||||||
"commands": "Comandos",
|
"commands": "Comandos",
|
||||||
"placeholder": "Digite um comando ou pesquise…",
|
"placeholder": "Digite um comando ou pesquise…",
|
||||||
"hint": "You can use {list} to limit the search to a list. Combine {list} or {label} (labels) with a search query to search for a task with these labels or on that list. Use {assignee} to only search for teams.",
|
"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.",
|
||||||
"tasks": "Tarefas",
|
"tasks": "Tarefas",
|
||||||
"lists": "Listas",
|
"projects": "Projects",
|
||||||
"teams": "Equipes",
|
"teams": "Equipes",
|
||||||
"newList": "Digite o título da nova lista…",
|
"newProject": "Enter the title of the new project…",
|
||||||
"newTask": "Enter the title of the new task…",
|
"newTask": "Enter the title of the new task…",
|
||||||
"newNamespace": "Enter the title of the new namespace…",
|
"newNamespace": "Enter the title of the new namespace…",
|
||||||
"newTeam": "Enter the name of the new team…",
|
"newTeam": "Enter the name of the new team…",
|
||||||
"createTask": "Create a task in the current list ({title})",
|
"createTask": "Create a task in the current project ({title})",
|
||||||
"createList": "Create a list in the current namespace ({title})",
|
"createProject": "Create a project in the current namespace ({title})",
|
||||||
"cmds": {
|
"cmds": {
|
||||||
"newTask": "Nova tarefa",
|
"newTask": "Nova tarefa",
|
||||||
"newList": "Nova lista",
|
"newProject": "New project",
|
||||||
"newNamespace": "Novo namespace",
|
"newNamespace": "Novo namespace",
|
||||||
"newTeam": "Nova equipe"
|
"newTeam": "Nova equipe"
|
||||||
}
|
}
|
||||||
|
@ -991,15 +992,15 @@
|
||||||
"1018": "The user avatar type setting is invalid.",
|
"1018": "The user avatar type setting is invalid.",
|
||||||
"2001": "ID cannot be empty or 0.",
|
"2001": "ID cannot be empty or 0.",
|
||||||
"2002": "Some of the request data was invalid.",
|
"2002": "Some of the request data was invalid.",
|
||||||
"3001": "The list does not exist.",
|
"3001": "The project does not exist.",
|
||||||
"3004": "You need to have read permissions on that list to perform that action.",
|
"3004": "You need to have read permissions on that project to perform that action.",
|
||||||
"3005": "The list title cannot be empty.",
|
"3005": "The project title cannot be empty.",
|
||||||
"3006": "The list share does not exist.",
|
"3006": "The project share does not exist.",
|
||||||
"3007": "A list with this identifier already exists.",
|
"3007": "A project with this identifier already exists.",
|
||||||
"3008": "The list is archived and can therefore only be accessed read only. This is also true for all tasks associated with this list.",
|
"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 list task text cannot be empty.",
|
"4001": "The project task text cannot be empty.",
|
||||||
"4002": "The list task does not exist.",
|
"4002": "The project task does not exist.",
|
||||||
"4003": "All bulk editing tasks must belong to the same list.",
|
"4003": "All bulk editing tasks must belong to the same project.",
|
||||||
"4004": "Need at least one task when bulk editing tasks.",
|
"4004": "Need at least one task when bulk editing tasks.",
|
||||||
"4005": "You do not have the right to see the task.",
|
"4005": "You do not have the right to see the task.",
|
||||||
"4006": "You can't set a parent task as the task itself.",
|
"4006": "You can't set a parent task as the task itself.",
|
||||||
|
@ -1025,21 +1026,21 @@
|
||||||
"5012": "The namespace is archived and can therefore only be accessed read only.",
|
"5012": "The namespace is archived and can therefore only be accessed read only.",
|
||||||
"6001": "The team name cannot be empty.",
|
"6001": "The team name cannot be empty.",
|
||||||
"6002": "The team does not exist.",
|
"6002": "The team does not exist.",
|
||||||
"6004": "The team already has access to that namespace or list.",
|
"6004": "The team already has access to that namespace or project.",
|
||||||
"6005": "The user is already a member of that team.",
|
"6005": "The user is already a member of that team.",
|
||||||
"6006": "Cannot delete the last team member.",
|
"6006": "Cannot delete the last team member.",
|
||||||
"6007": "The team does not have access to the list to perform that action.",
|
"6007": "The team does not have access to the project to perform that action.",
|
||||||
"7002": "The user already has access to that list.",
|
"7002": "The user already has access to that project.",
|
||||||
"7003": "You do not have access to that list.",
|
"7003": "You do not have access to that project.",
|
||||||
"8001": "This label already exists on that task.",
|
"8001": "This label already exists on that task.",
|
||||||
"8002": "The label does not exist.",
|
"8002": "The label does not exist.",
|
||||||
"8003": "You do not have access to this label.",
|
"8003": "You do not have access to this label.",
|
||||||
"9001": "The right is invalid.",
|
"9001": "The right is invalid.",
|
||||||
"10001": "The bucket does not exist.",
|
"10001": "The bucket does not exist.",
|
||||||
"10002": "The bucket does not belong to that list.",
|
"10002": "The bucket does not belong to that project.",
|
||||||
"10003": "You cannot remove the last bucket on a list.",
|
"10003": "You cannot remove the last bucket on a project.",
|
||||||
"10004": "You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold.",
|
"10004": "You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold.",
|
||||||
"10005": "There can be only one done bucket per list.",
|
"10005": "There can be only one done bucket per project.",
|
||||||
"11001": "The saved filter does not exist.",
|
"11001": "The saved filter does not exist.",
|
||||||
"11002": "Saved filters are not available for link shares.",
|
"11002": "Saved filters are not available for link shares.",
|
||||||
"12001": "The subscription entity type is invalid.",
|
"12001": "The subscription entity type is invalid.",
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue