forked from vikunja/frontend
Compare commits
No commits in common. "webxdc-sync" and "main" have entirely different histories.
webxdc-syn
...
main
|
@ -15,7 +15,6 @@ trigger:
|
|||
services:
|
||||
- name: api
|
||||
image: vikunja/api:unstable
|
||||
pull: always
|
||||
environment:
|
||||
VIKUNJA_SERVICE_TESTINGTOKEN: averyLongSecretToSe33dtheDB
|
||||
VIKUNJA_LOG_LEVEL: DEBUG
|
||||
|
@ -522,6 +521,6 @@ steps:
|
|||
from_secret: crowdin_key
|
||||
---
|
||||
kind: signature
|
||||
hmac: 303afeb09b75a57ba88720b45dc06c8bf2c7320e19d738d8299f325438246f75
|
||||
hmac: 971875b90c7bb1649d1b00d022d0b594ba9b68f927bf8f0dbe840190816d676b
|
||||
|
||||
...
|
||||
|
|
96
.github/workflows/deploy-and-release.yml
vendored
96
.github/workflows/deploy-and-release.yml
vendored
|
@ -1,96 +0,0 @@
|
|||
# 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,279 +9,6 @@ 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.
|
||||
|
||||
## [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
|
||||
|
||||
### Bug Fixes
|
||||
|
|
|
@ -66,3 +66,5 @@ RUN chmod 0755 /docker-entrypoint.d/*.sh /etc/nginx/templates && \
|
|||
chmod -R 0644 /etc/nginx/nginx.conf && \
|
||||
chown -R nginx:nginx ./ /etc/nginx/conf.d /etc/nginx/templates && \
|
||||
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)
|
||||
[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE)
|
||||
[![Download](https://img.shields.io/badge/download-v0.20.5-brightgreen.svg)](https://dl.vikunja.io)
|
||||
[![Download](https://img.shields.io/badge/download-v0.20.3-brightgreen.svg)](https://dl.vikunja.io)
|
||||
[![Translation](https://badges.crowdin.net/vikunja/localized.svg)](https://crowdin.com/project/vikunja)
|
||||
|
||||
This is the web frontend for Vikunja, written in Vue.js.
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
#!/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
|
57
cypress/e2e/list/list-history.spec.ts
Normal file
57
cypress/e2e/list/list-history.spec.ts
Normal file
|
@ -0,0 +1,57 @@
|
|||
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)
|
||||
})
|
||||
})
|
|
@ -3,15 +3,15 @@ import {formatISO, format} from 'date-fns'
|
|||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||
|
||||
import {TaskFactory} from '../../factories/task'
|
||||
import {prepareProjects} from './prepareProjects'
|
||||
import {prepareLists} from './prepareLists'
|
||||
|
||||
describe('Project View Gantt', () => {
|
||||
describe('List View Gantt', () => {
|
||||
createFakeUserAndLogin()
|
||||
prepareProjects()
|
||||
prepareLists()
|
||||
|
||||
it('Hides tasks with no dates', () => {
|
||||
const tasks = TaskFactory.create(1)
|
||||
cy.visit('/projects/1/gantt')
|
||||
cy.visit('/lists/1/gantt')
|
||||
|
||||
cy.get('.g-gantt-rows-container')
|
||||
.should('not.contain', tasks[0].title)
|
||||
|
@ -25,7 +25,7 @@ describe('Project View Gantt', () => {
|
|||
nextMonth.setDate(1)
|
||||
nextMonth.setMonth(9)
|
||||
|
||||
cy.visit('/projects/1/gantt')
|
||||
cy.visit('/lists/1/gantt')
|
||||
|
||||
cy.get('.g-timeunits-container')
|
||||
.should('contain', format(now, 'MMMM'))
|
||||
|
@ -38,7 +38,7 @@ describe('Project View Gantt', () => {
|
|||
start_date: now.toISOString(),
|
||||
end_date: new Date(new Date(now).setDate(now.getDate() + 4)).toISOString(),
|
||||
})
|
||||
cy.visit('/projects/1/gantt')
|
||||
cy.visit('/lists/1/gantt')
|
||||
|
||||
cy.get('.g-gantt-rows-container')
|
||||
.should('not.be.empty')
|
||||
|
@ -50,7 +50,7 @@ describe('Project View Gantt', () => {
|
|||
start_date: null,
|
||||
end_date: null,
|
||||
})
|
||||
cy.visit('/projects/1/gantt')
|
||||
cy.visit('/lists/1/gantt')
|
||||
|
||||
cy.get('.gantt-options .fancycheckbox')
|
||||
.contains('Show tasks which don\'t have dates set')
|
||||
|
@ -69,7 +69,7 @@ describe('Project View Gantt', () => {
|
|||
start_date: now.toISOString(),
|
||||
end_date: new Date(new Date(now).setDate(now.getDate() + 4)).toISOString(),
|
||||
})
|
||||
cy.visit('/projects/1/gantt')
|
||||
cy.visit('/lists/1/gantt')
|
||||
|
||||
cy.get('.g-gantt-rows-container .g-gantt-row .g-gantt-row-bars-container div .g-gantt-bar')
|
||||
.first()
|
||||
|
@ -83,9 +83,9 @@ describe('Project View Gantt', () => {
|
|||
const now = Date.UTC(2022, 10, 9)
|
||||
cy.clock(now, ['Date'])
|
||||
|
||||
cy.visit('/projects/1/gantt')
|
||||
cy.visit('/lists/1/gantt')
|
||||
|
||||
cy.get('.project-gantt .gantt-options .field .control input.input.form-control')
|
||||
cy.get('.list-gantt .gantt-options .field .control input.input.form-control')
|
||||
.click()
|
||||
cy.get('.flatpickr-calendar .flatpickr-innerContainer .dayContainer .flatpickr-day')
|
||||
.first()
|
||||
|
@ -99,13 +99,13 @@ describe('Project View Gantt', () => {
|
|||
})
|
||||
|
||||
it('Should change the date range based on date query parameters', () => {
|
||||
cy.visit('/projects/1/gantt?dateFrom=2022-09-25&dateTo=2022-11-05')
|
||||
cy.visit('/lists/1/gantt?dateFrom=2022-09-25&dateTo=2022-11-05')
|
||||
|
||||
cy.get('.g-timeunits-container')
|
||||
.should('contain', 'September 2022')
|
||||
.should('contain', 'October 2022')
|
||||
.should('contain', 'November 2022')
|
||||
cy.get('.project-gantt .gantt-options .field .control input.input.form-control')
|
||||
cy.get('.list-gantt .gantt-options .field .control input.input.form-control')
|
||||
.should('have.value', '25 Sep 2022 to 5 Nov 2022')
|
||||
})
|
||||
|
||||
|
@ -115,7 +115,7 @@ describe('Project View Gantt', () => {
|
|||
start_date: formatISO(now),
|
||||
end_date: formatISO(now.setDate(now.getDate() + 4)),
|
||||
})
|
||||
cy.visit('/projects/1/gantt')
|
||||
cy.visit('/lists/1/gantt')
|
||||
|
||||
cy.get('.gantt-container .g-gantt-chart .g-gantt-row-bars-container .g-gantt-bar')
|
||||
.dblclick()
|
|
@ -1,13 +1,13 @@
|
|||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||
|
||||
import {BucketFactory} from '../../factories/bucket'
|
||||
import {ProjectFactory} from '../../factories/project'
|
||||
import {ListFactory} from '../../factories/list'
|
||||
import {TaskFactory} from '../../factories/task'
|
||||
import {prepareProjects} from './prepareProjects'
|
||||
import {prepareLists} from './prepareLists'
|
||||
|
||||
describe('Project View Kanban', () => {
|
||||
describe('List View Kanban', () => {
|
||||
createFakeUserAndLogin()
|
||||
prepareProjects()
|
||||
prepareLists()
|
||||
|
||||
let buckets
|
||||
beforeEach(() => {
|
||||
|
@ -16,10 +16,10 @@ describe('Project View Kanban', () => {
|
|||
|
||||
it('Shows all buckets with their tasks', () => {
|
||||
const data = TaskFactory.create(10, {
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
bucket_id: 1,
|
||||
})
|
||||
cy.visit('/projects/1/kanban')
|
||||
cy.visit('/lists/1/kanban')
|
||||
|
||||
cy.get('.kanban .bucket .title')
|
||||
.contains(buckets[0].title)
|
||||
|
@ -34,10 +34,10 @@ describe('Project View Kanban', () => {
|
|||
|
||||
it('Can add a new task to a bucket', () => {
|
||||
TaskFactory.create(2, {
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
bucket_id: 1,
|
||||
})
|
||||
cy.visit('/projects/1/kanban')
|
||||
cy.visit('/lists/1/kanban')
|
||||
|
||||
cy.get('.kanban .bucket')
|
||||
.contains(buckets[0].title)
|
||||
|
@ -55,7 +55,7 @@ describe('Project View Kanban', () => {
|
|||
})
|
||||
|
||||
it('Can create a new bucket', () => {
|
||||
cy.visit('/projects/1/kanban')
|
||||
cy.visit('/lists/1/kanban')
|
||||
|
||||
cy.get('.kanban .bucket.new-bucket .button')
|
||||
.click()
|
||||
|
@ -69,7 +69,7 @@ describe('Project View Kanban', () => {
|
|||
})
|
||||
|
||||
it('Can set a bucket limit', () => {
|
||||
cy.visit('/projects/1/kanban')
|
||||
cy.visit('/lists/1/kanban')
|
||||
|
||||
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-trigger')
|
||||
.first()
|
||||
|
@ -90,7 +90,7 @@ describe('Project View Kanban', () => {
|
|||
})
|
||||
|
||||
it('Can rename a bucket', () => {
|
||||
cy.visit('/projects/1/kanban')
|
||||
cy.visit('/lists/1/kanban')
|
||||
|
||||
cy.get('.kanban .bucket .bucket-header .title')
|
||||
.first()
|
||||
|
@ -101,7 +101,7 @@ describe('Project View Kanban', () => {
|
|||
})
|
||||
|
||||
it('Can delete a bucket', () => {
|
||||
cy.visit('/projects/1/kanban')
|
||||
cy.visit('/lists/1/kanban')
|
||||
|
||||
cy.get('.kanban .bucket .bucket-header .dropdown.options .dropdown-trigger')
|
||||
.first()
|
||||
|
@ -125,10 +125,10 @@ describe('Project View Kanban', () => {
|
|||
|
||||
it('Can drag tasks around', () => {
|
||||
const tasks = TaskFactory.create(2, {
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
bucket_id: 1,
|
||||
})
|
||||
cy.visit('/projects/1/kanban')
|
||||
cy.visit('/lists/1/kanban')
|
||||
|
||||
cy.get('.kanban .bucket .tasks .task')
|
||||
.contains(tasks[0].title)
|
||||
|
@ -144,10 +144,10 @@ describe('Project View Kanban', () => {
|
|||
it('Should navigate to the task when the task card is clicked', () => {
|
||||
const tasks = TaskFactory.create(5, {
|
||||
id: '{increment}',
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
bucket_id: 1,
|
||||
})
|
||||
cy.visit('/projects/1/kanban')
|
||||
cy.visit('/lists/1/kanban')
|
||||
|
||||
cy.get('.kanban .bucket .tasks .task')
|
||||
.contains(tasks[0].title)
|
||||
|
@ -158,18 +158,18 @@ describe('Project View Kanban', () => {
|
|||
.should('contain', `/tasks/${tasks[0].id}`, { timeout: 1000 })
|
||||
})
|
||||
|
||||
it('Should remove a task from the kanban board when moving it to another project', () => {
|
||||
const projects = ProjectFactory.create(2)
|
||||
it('Should remove a task from the kanban board when moving it to another list', () => {
|
||||
const lists = ListFactory.create(2)
|
||||
BucketFactory.create(2, {
|
||||
project_id: '{increment}',
|
||||
list_id: '{increment}',
|
||||
})
|
||||
const tasks = TaskFactory.create(5, {
|
||||
id: '{increment}',
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
bucket_id: 1,
|
||||
})
|
||||
const task = tasks[0]
|
||||
cy.visit('/projects/1/kanban')
|
||||
cy.visit('/lists/1/kanban')
|
||||
|
||||
cy.get('.kanban .bucket .tasks .task')
|
||||
.contains(task.title)
|
||||
|
@ -180,7 +180,7 @@ describe('Project View Kanban', () => {
|
|||
.contains('Move')
|
||||
.click()
|
||||
cy.get('.task-view .content.details .field .multiselect.control .input-wrapper input')
|
||||
.type(`${projects[1].title}{enter}`)
|
||||
.type(`${lists[1].title}{enter}`)
|
||||
// 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.
|
||||
cy.get('.task-view .content.details .field .multiselect.control .search-results')
|
||||
|
@ -197,26 +197,26 @@ describe('Project View Kanban', () => {
|
|||
|
||||
it('Shows a button to filter the kanban board', () => {
|
||||
const data = TaskFactory.create(10, {
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
bucket_id: 1,
|
||||
})
|
||||
cy.visit('/projects/1/kanban')
|
||||
cy.visit('/lists/1/kanban')
|
||||
|
||||
cy.get('.project-kanban .filter-container .base-button')
|
||||
cy.get('.list-kanban .filter-container .base-button')
|
||||
.should('exist')
|
||||
})
|
||||
|
||||
it('Should remove a task from the board when deleting it', () => {
|
||||
const projects = ProjectFactory.create(1)
|
||||
const lists = ListFactory.create(1)
|
||||
const buckets = BucketFactory.create(2, {
|
||||
project_id: projects[0].id,
|
||||
list_id: lists[0].id,
|
||||
})
|
||||
const tasks = TaskFactory.create(5, {
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
bucket_id: buckets[0].id,
|
||||
})
|
||||
const task = tasks[0]
|
||||
cy.visit('/projects/1/kanban')
|
||||
cy.visit('/lists/1/kanban')
|
||||
|
||||
cy.get('.kanban .bucket .tasks .task')
|
||||
.contains(task.title)
|
|
@ -1,32 +1,32 @@
|
|||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||
|
||||
import {UserProjectFactory} from '../../factories/users_project'
|
||||
import {UserListFactory} from '../../factories/users_list'
|
||||
import {TaskFactory} from '../../factories/task'
|
||||
import {UserFactory} from '../../factories/user'
|
||||
import {ProjectFactory} from '../../factories/project'
|
||||
import {prepareProjects} from './prepareProjects'
|
||||
import {ListFactory} from '../../factories/list'
|
||||
import {prepareLists} from './prepareLists'
|
||||
|
||||
describe('Project View Project', () => {
|
||||
describe('List View List', () => {
|
||||
createFakeUserAndLogin()
|
||||
prepareProjects()
|
||||
prepareLists()
|
||||
|
||||
it('Should be an empty project', () => {
|
||||
cy.visit('/projects/1')
|
||||
it('Should be an empty list', () => {
|
||||
cy.visit('/lists/1')
|
||||
cy.url()
|
||||
.should('contain', '/projects/1/list')
|
||||
cy.get('.project-title')
|
||||
.should('contain', 'First Project')
|
||||
cy.get('.project-title-dropdown')
|
||||
.should('contain', '/lists/1/list')
|
||||
cy.get('.list-title')
|
||||
.should('contain', 'First List')
|
||||
cy.get('.list-title-dropdown')
|
||||
.should('exist')
|
||||
cy.get('p')
|
||||
.contains('This project is currently empty.')
|
||||
.contains('This list is currently empty.')
|
||||
.should('exist')
|
||||
})
|
||||
|
||||
it('Should create a new task', () => {
|
||||
const newTaskTitle = 'New task'
|
||||
|
||||
cy.visit('/projects/1')
|
||||
cy.visit('/lists/1')
|
||||
cy.get('.task-add textarea')
|
||||
.type(newTaskTitle+'{enter}')
|
||||
cy.get('.tasks')
|
||||
|
@ -36,9 +36,9 @@ describe('Project View Project', () => {
|
|||
it('Should navigate to the task when the title is clicked', () => {
|
||||
const tasks = TaskFactory.create(5, {
|
||||
id: '{increment}',
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
})
|
||||
cy.visit('/projects/1/list')
|
||||
cy.visit('/lists/1/list')
|
||||
|
||||
cy.get('.tasks .task .tasktext')
|
||||
.contains(tasks[0].title)
|
||||
|
@ -49,33 +49,33 @@ describe('Project View Project', () => {
|
|||
.should('contain', `/tasks/${tasks[0].id}`)
|
||||
})
|
||||
|
||||
it('Should not see any elements for a project which is shared read only', () => {
|
||||
it('Should not see any elements for a list which is shared read only', () => {
|
||||
UserFactory.create(2)
|
||||
UserProjectFactory.create(1, {
|
||||
project_id: 2,
|
||||
UserListFactory.create(1, {
|
||||
list_id: 2,
|
||||
user_id: 1,
|
||||
right: 0,
|
||||
})
|
||||
const projects = ProjectFactory.create(2, {
|
||||
const lists = ListFactory.create(2, {
|
||||
owner_id: '{increment}',
|
||||
namespace_id: '{increment}',
|
||||
})
|
||||
cy.visit(`/projects/${projects[1].id}/`)
|
||||
cy.visit(`/lists/${lists[1].id}/`)
|
||||
|
||||
cy.get('.project-title-wrapper .icon')
|
||||
cy.get('.list-title-wrapper .icon')
|
||||
.should('not.exist')
|
||||
cy.get('input.input[placeholder="Add a new task..."')
|
||||
.should('not.exist')
|
||||
})
|
||||
|
||||
it('Should only show the color of a project in the navigation and not in the list view', () => {
|
||||
const projects = ProjectFactory.create(1, {
|
||||
it('Should only show the color of a list in the navigation and not in the list view', () => {
|
||||
const lists = ListFactory.create(1, {
|
||||
hex_color: '00db60',
|
||||
})
|
||||
TaskFactory.create(10, {
|
||||
project_id: projects[0].id,
|
||||
list_id: lists[0].id,
|
||||
})
|
||||
cy.visit(`/projects/${projects[0].id}/`)
|
||||
cy.visit(`/lists/${lists[0].id}/`)
|
||||
|
||||
cy.get('.menu-list li .list-menu-link .color-bubble')
|
||||
.should('have.css', 'background-color', 'rgb(0, 219, 96)')
|
||||
|
@ -87,9 +87,9 @@ describe('Project View Project', () => {
|
|||
const tasks = TaskFactory.create(100, {
|
||||
id: '{increment}',
|
||||
title: i => `task${i}`,
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
})
|
||||
cy.visit('/projects/1/list')
|
||||
cy.visit('/lists/1/list')
|
||||
|
||||
cy.get('.tasks')
|
||||
.should('contain', tasks[1].title)
|
|
@ -2,37 +2,37 @@ import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
|||
|
||||
import {TaskFactory} from '../../factories/task'
|
||||
|
||||
describe('Project View Table', () => {
|
||||
describe('List View Table', () => {
|
||||
createFakeUserAndLogin()
|
||||
|
||||
it('Should show a table with tasks', () => {
|
||||
const tasks = TaskFactory.create(1)
|
||||
cy.visit('/projects/1/table')
|
||||
cy.visit('/lists/1/table')
|
||||
|
||||
cy.get('.project-table table.table')
|
||||
cy.get('.list-table table.table')
|
||||
.should('exist')
|
||||
cy.get('.project-table table.table')
|
||||
cy.get('.list-table table.table')
|
||||
.should('contain', tasks[0].title)
|
||||
})
|
||||
|
||||
it('Should have working column switches', () => {
|
||||
TaskFactory.create(1)
|
||||
cy.visit('/projects/1/table')
|
||||
cy.visit('/lists/1/table')
|
||||
|
||||
cy.get('.project-table .filter-container .items .button')
|
||||
cy.get('.list-table .filter-container .items .button')
|
||||
.contains('Columns')
|
||||
.click()
|
||||
cy.get('.project-table .filter-container .card.columns-filter .card-content .fancycheckbox .check')
|
||||
cy.get('.list-table .filter-container .card.columns-filter .card-content .fancycheckbox .check')
|
||||
.contains('Priority')
|
||||
.click()
|
||||
cy.get('.project-table .filter-container .card.columns-filter .card-content .fancycheckbox .check')
|
||||
cy.get('.list-table .filter-container .card.columns-filter .card-content .fancycheckbox .check')
|
||||
.contains('Done')
|
||||
.click()
|
||||
|
||||
cy.get('.project-table table.table th')
|
||||
cy.get('.list-table table.table th')
|
||||
.contains('Priority')
|
||||
.should('exist')
|
||||
cy.get('.project-table table.table th')
|
||||
cy.get('.list-table table.table th')
|
||||
.contains('Done')
|
||||
.should('not.exist')
|
||||
})
|
||||
|
@ -40,11 +40,11 @@ describe('Project View Table', () => {
|
|||
it('Should navigate to the task when the title is clicked', () => {
|
||||
const tasks = TaskFactory.create(5, {
|
||||
id: '{increment}',
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
})
|
||||
cy.visit('/projects/1/table')
|
||||
cy.visit('/lists/1/table')
|
||||
|
||||
cy.get('.project-table table.table')
|
||||
cy.get('.list-table table.table')
|
||||
.contains(tasks[0].title)
|
||||
.click()
|
||||
|
|
@ -1,60 +1,58 @@
|
|||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||
|
||||
import {TaskFactory} from '../../factories/task'
|
||||
import {prepareProjects} from './prepareProjects'
|
||||
import {prepareLists} from './prepareLists'
|
||||
|
||||
describe('Projects', () => {
|
||||
describe('Lists', () => {
|
||||
createFakeUserAndLogin()
|
||||
|
||||
let projects
|
||||
prepareProjects((newProjects) => (projects = newProjects))
|
||||
let lists
|
||||
prepareLists((newLists) => (lists = newLists))
|
||||
|
||||
it('Should create a new project', () => {
|
||||
it('Should create a new list', () => {
|
||||
cy.visit('/')
|
||||
cy.get('.namespace-title .dropdown-trigger')
|
||||
.click()
|
||||
cy.get('.namespace-title .dropdown .dropdown-item')
|
||||
.contains('New project')
|
||||
.contains('New list')
|
||||
.click()
|
||||
cy.url()
|
||||
.should('contain', '/projects/new/1')
|
||||
.should('contain', '/lists/new/1')
|
||||
cy.get('.card-header-title')
|
||||
.contains('New project')
|
||||
.contains('New list')
|
||||
cy.get('input.input')
|
||||
.type('New Project')
|
||||
.type('New List')
|
||||
cy.get('.button')
|
||||
.contains('Create')
|
||||
.click()
|
||||
|
||||
cy.get('.global-notification', { timeout: 1000 }) // Waiting until the request to create the new project is done
|
||||
cy.get('.global-notification', { timeout: 1000 }) // Waiting until the request to create the new list is done
|
||||
.should('contain', 'Success')
|
||||
cy.url()
|
||||
.should('contain', '/projects/')
|
||||
cy.get('.project-title')
|
||||
.should('contain', 'New Project')
|
||||
.should('contain', '/lists/')
|
||||
cy.get('.list-title')
|
||||
.should('contain', 'New List')
|
||||
})
|
||||
|
||||
it('Should redirect to a specific project view after visited', () => {
|
||||
cy.intercept(Cypress.env('API_URL') + '/projects/*/buckets*').as('loadBuckets')
|
||||
cy.visit('/projects/1/kanban')
|
||||
it('Should redirect to a specific list view after visited', () => {
|
||||
cy.visit('/lists/1/kanban')
|
||||
cy.url()
|
||||
.should('contain', '/projects/1/kanban')
|
||||
cy.wait('@loadBuckets')
|
||||
cy.visit('/projects/1')
|
||||
.should('contain', '/lists/1/kanban')
|
||||
cy.visit('/lists/1')
|
||||
cy.url()
|
||||
.should('contain', '/projects/1/kanban')
|
||||
.should('contain', '/lists/1/kanban')
|
||||
})
|
||||
|
||||
it('Should rename the project in all places', () => {
|
||||
it('Should rename the list in all places', () => {
|
||||
TaskFactory.create(5, {
|
||||
id: '{increment}',
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
})
|
||||
const newProjectName = 'New project name'
|
||||
const newListName = 'New list name'
|
||||
|
||||
cy.visit('/projects/1')
|
||||
cy.get('.project-title')
|
||||
.should('contain', 'First Project')
|
||||
cy.visit('/lists/1')
|
||||
cy.get('.list-title')
|
||||
.should('contain', 'First List')
|
||||
|
||||
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child .dropdown .menu-list-dropdown-trigger')
|
||||
.click()
|
||||
|
@ -62,27 +60,27 @@ describe('Projects', () => {
|
|||
.contains('Edit')
|
||||
.click()
|
||||
cy.get('#title')
|
||||
.type(`{selectall}${newProjectName}`)
|
||||
.type(`{selectall}${newListName}`)
|
||||
cy.get('footer.card-footer .button')
|
||||
.contains('Save')
|
||||
.click()
|
||||
|
||||
cy.get('.global-notification')
|
||||
.should('contain', 'Success')
|
||||
cy.get('.project-title')
|
||||
.should('contain', newProjectName)
|
||||
.should('not.contain', projects[0].title)
|
||||
cy.get('.list-title')
|
||||
.should('contain', newListName)
|
||||
.should('not.contain', lists[0].title)
|
||||
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child')
|
||||
.should('contain', newProjectName)
|
||||
.should('not.contain', projects[0].title)
|
||||
.should('contain', newListName)
|
||||
.should('not.contain', lists[0].title)
|
||||
cy.visit('/')
|
||||
cy.get('.card-content')
|
||||
.should('contain', newProjectName)
|
||||
.should('not.contain', projects[0].title)
|
||||
.should('contain', newListName)
|
||||
.should('not.contain', lists[0].title)
|
||||
})
|
||||
|
||||
it('Should remove a project', () => {
|
||||
cy.visit(`/projects/${projects[0].id}`)
|
||||
it('Should remove a list', () => {
|
||||
cy.visit(`/lists/${lists[0].id}`)
|
||||
|
||||
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child .dropdown .menu-list-dropdown-trigger')
|
||||
.click()
|
||||
|
@ -98,27 +96,27 @@ describe('Projects', () => {
|
|||
cy.get('.global-notification')
|
||||
.should('contain', 'Success')
|
||||
cy.get('.namespace-container .menu.namespaces-lists .menu-list')
|
||||
.should('not.contain', projects[0].title)
|
||||
.should('not.contain', lists[0].title)
|
||||
cy.location('pathname')
|
||||
.should('equal', '/')
|
||||
})
|
||||
|
||||
it('Should archive a project', () => {
|
||||
cy.visit(`/projects/${projects[0].id}`)
|
||||
it('Should archive a list', () => {
|
||||
cy.visit(`/lists/${lists[0].id}`)
|
||||
|
||||
cy.get('.project-title-dropdown')
|
||||
cy.get('.list-title-dropdown')
|
||||
.click()
|
||||
cy.get('.project-title-dropdown .dropdown-menu .dropdown-item')
|
||||
cy.get('.list-title-dropdown .dropdown-menu .dropdown-item')
|
||||
.contains('Archive')
|
||||
.click()
|
||||
cy.get('.modal-content')
|
||||
.should('contain.text', 'Archive this project')
|
||||
.should('contain.text', 'Archive this list')
|
||||
cy.get('.modal-content [data-cy=modalPrimary]')
|
||||
.click()
|
||||
|
||||
cy.get('.namespace-container .menu.namespaces-lists .menu-list')
|
||||
.should('not.contain', projects[0].title)
|
||||
.should('not.contain', lists[0].title)
|
||||
cy.get('main.app-content')
|
||||
.should('contain.text', 'This project is archived. It is not possible to create new or edit tasks for it.')
|
||||
.should('contain.text', 'This list is archived. It is not possible to create new or edit tasks for it.')
|
||||
})
|
||||
})
|
|
@ -1,6 +1,6 @@
|
|||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||
|
||||
import {ProjectFactory} from '../../factories/project'
|
||||
import {ListFactory} from '../../factories/list'
|
||||
import {NamespaceFactory} from '../../factories/namespace'
|
||||
|
||||
describe('Namepaces', () => {
|
||||
|
@ -10,7 +10,7 @@ describe('Namepaces', () => {
|
|||
|
||||
beforeEach(() => {
|
||||
namespaces = NamespaceFactory.create(1)
|
||||
ProjectFactory.create(1)
|
||||
ListFactory.create(1)
|
||||
})
|
||||
|
||||
it('Should be all there', () => {
|
||||
|
@ -99,17 +99,17 @@ describe('Namepaces', () => {
|
|||
.should('not.contain', newNamespaces[0].title)
|
||||
})
|
||||
|
||||
it('Should not show archived projects & namespaces if the filter is not checked', () => {
|
||||
it('Should not show archived lists & namespaces if the filter is not checked', () => {
|
||||
const n = NamespaceFactory.create(1, {
|
||||
id: 2,
|
||||
is_archived: true,
|
||||
}, false)
|
||||
ProjectFactory.create(1, {
|
||||
ListFactory.create(1, {
|
||||
id: 2,
|
||||
namespace_id: n[0].id,
|
||||
}, false)
|
||||
|
||||
ProjectFactory.create(1, {
|
||||
ListFactory.create(1, {
|
||||
id: 3,
|
||||
is_archived: true,
|
||||
}, false)
|
19
cypress/e2e/list/prepareLists.ts
Normal file
19
cypress/e2e/list/prepareLists.ts
Normal file
|
@ -0,0 +1,19 @@
|
|||
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,20 +1,18 @@
|
|||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||
|
||||
import {TaskFactory} from '../../factories/task'
|
||||
import {ProjectFactory} from '../../factories/project'
|
||||
import {ListFactory} from '../../factories/list'
|
||||
import {NamespaceFactory} from '../../factories/namespace'
|
||||
import {UserProjectFactory} from '../../factories/users_project'
|
||||
import {BucketFactory} from '../../factories/bucket'
|
||||
import {UserListFactory} from '../../factories/users_list'
|
||||
|
||||
describe('Editor', () => {
|
||||
createFakeUserAndLogin()
|
||||
|
||||
beforeEach(() => {
|
||||
NamespaceFactory.create(1)
|
||||
ProjectFactory.create(1)
|
||||
BucketFactory.create(1)
|
||||
ListFactory.create(1)
|
||||
TaskFactory.truncate()
|
||||
UserProjectFactory.truncate()
|
||||
UserListFactory.truncate()
|
||||
})
|
||||
|
||||
it('Has a preview with checkable checkboxes', () => {
|
||||
|
@ -26,7 +24,6 @@ describe('Editor', () => {
|
|||
* [ ] Checklist
|
||||
* [x] Checklist checked
|
||||
`,
|
||||
bucket_id: 1,
|
||||
})
|
||||
|
||||
cy.visit(`/tasks/${tasks[0].id}`)
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
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)
|
||||
})
|
||||
}
|
|
@ -1,57 +0,0 @@
|
|||
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)
|
||||
})
|
||||
})
|
|
@ -1,22 +1,22 @@
|
|||
import {LinkShareFactory} from '../../factories/link_sharing'
|
||||
import {ProjectFactory} from '../../factories/project'
|
||||
import {ListFactory} from '../../factories/list'
|
||||
import {TaskFactory} from '../../factories/task'
|
||||
|
||||
describe('Link shares', () => {
|
||||
it('Can view a link share', () => {
|
||||
const projects = ProjectFactory.create(1)
|
||||
const lists = ListFactory.create(1)
|
||||
const tasks = TaskFactory.create(10, {
|
||||
project_id: projects[0].id
|
||||
list_id: lists[0].id
|
||||
})
|
||||
const linkShares = LinkShareFactory.create(1, {
|
||||
project_id: projects[0].id,
|
||||
list_id: lists[0].id,
|
||||
right: 0,
|
||||
})
|
||||
|
||||
cy.visit(`/share/${linkShares[0].hash}/auth`)
|
||||
|
||||
cy.get('h1.title')
|
||||
.should('contain', projects[0].title)
|
||||
.should('contain', lists[0].title)
|
||||
cy.get('input.input[placeholder="Add a new task..."')
|
||||
.should('not.exist')
|
||||
cy.get('.tasks')
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||
|
||||
import {ProjectFactory} from '../../factories/project'
|
||||
import {ListFactory} from '../../factories/list'
|
||||
import {seed} from '../../support/seed'
|
||||
import {TaskFactory} from '../../factories/task'
|
||||
import {NamespaceFactory} from '../../factories/namespace'
|
||||
|
@ -9,9 +9,9 @@ import {updateUserSettings} from '../../support/updateUserSettings'
|
|||
|
||||
function seedTasks(numberOfTasks = 50, startDueDate = new Date()) {
|
||||
NamespaceFactory.create(1)
|
||||
const project = ProjectFactory.create()[0]
|
||||
const list = ListFactory.create()[0]
|
||||
BucketFactory.create(1, {
|
||||
project_id: project.id,
|
||||
list_id: list.id,
|
||||
})
|
||||
const tasks = []
|
||||
let dueDate = startDueDate
|
||||
|
@ -20,7 +20,7 @@ function seedTasks(numberOfTasks = 50, startDueDate = new Date()) {
|
|||
dueDate = new Date(new Date(dueDate).setDate(dueDate.getDate() + 2))
|
||||
tasks.push({
|
||||
id: i + 1,
|
||||
project_id: project.id,
|
||||
list_id: list.id,
|
||||
done: false,
|
||||
created_by_id: 1,
|
||||
title: 'Test Task ' + i,
|
||||
|
@ -31,7 +31,7 @@ function seedTasks(numberOfTasks = 50, startDueDate = new Date()) {
|
|||
})
|
||||
}
|
||||
seed(TaskFactory.table, tasks)
|
||||
return {tasks, project}
|
||||
return {tasks, list}
|
||||
}
|
||||
|
||||
describe('Home Page Task Overview', () => {
|
||||
|
@ -73,7 +73,7 @@ describe('Home Page Task Overview', () => {
|
|||
due_date: new Date().toISOString(),
|
||||
}, false)
|
||||
|
||||
cy.visit(`/projects/${tasks[0].project_id}/list`)
|
||||
cy.visit(`/lists/${tasks[0].list_id}/list`)
|
||||
cy.get('.tasks .task')
|
||||
.first()
|
||||
.should('contain.text', newTaskTitle)
|
||||
|
@ -90,7 +90,7 @@ describe('Home Page Task Overview', () => {
|
|||
|
||||
cy.visit('/')
|
||||
|
||||
cy.visit(`/projects/${tasks[0].project_id}/list`)
|
||||
cy.visit(`/lists/${tasks[0].list_id}/list`)
|
||||
cy.get('.task-add textarea')
|
||||
.type(newTaskTitle+'{enter}')
|
||||
cy.visit('/')
|
||||
|
@ -113,10 +113,10 @@ describe('Home Page Task Overview', () => {
|
|||
.should('contain.text', newTaskTitle)
|
||||
})
|
||||
|
||||
it('Should show a task without a due date added via default project at the bottom', () => {
|
||||
const {project} = seedTasks(40)
|
||||
it('Should show a task without a due date added via default list at the bottom', () => {
|
||||
const {list} = seedTasks(40)
|
||||
updateUserSettings({
|
||||
default_project_id: project.id,
|
||||
default_list_id: list.id,
|
||||
overdue_tasks_reminders_time: '9:00',
|
||||
})
|
||||
|
||||
|
@ -131,23 +131,23 @@ describe('Home Page Task Overview', () => {
|
|||
.should('contain.text', newTaskTitle)
|
||||
})
|
||||
|
||||
it('Should show the cta buttons for new project when there are no tasks', () => {
|
||||
it('Should show the cta buttons for new list when there are no tasks', () => {
|
||||
TaskFactory.truncate()
|
||||
|
||||
cy.visit('/')
|
||||
|
||||
cy.get('.home.app-content .content')
|
||||
.should('contain.text', 'You can create a new project for your new tasks:')
|
||||
.should('contain.text', 'Or import your projects and tasks from other services into Vikunja:')
|
||||
.should('contain.text', 'You can create a new list for your new tasks:')
|
||||
.should('contain.text', 'Or import your lists and tasks from other services into Vikunja:')
|
||||
})
|
||||
|
||||
it('Should not show the cta buttons for new project when there are tasks', () => {
|
||||
it('Should not show the cta buttons for new list when there are tasks', () => {
|
||||
seedTasks()
|
||||
|
||||
cy.visit('/')
|
||||
|
||||
cy.get('.home.app-content .content')
|
||||
.should('not.contain.text', 'You can create a new project for your new tasks:')
|
||||
.should('not.contain.text', 'Or import your projects and tasks from other services into Vikunja:')
|
||||
.should('not.contain.text', 'You can create a new list for your new tasks:')
|
||||
.should('not.contain.text', 'Or import your lists and tasks from other services into Vikunja:')
|
||||
})
|
||||
})
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||
|
||||
import {TaskFactory} from '../../factories/task'
|
||||
import {ProjectFactory} from '../../factories/project'
|
||||
import {ListFactory} from '../../factories/list'
|
||||
import {TaskCommentFactory} from '../../factories/task_comment'
|
||||
import {UserFactory} from '../../factories/user'
|
||||
import {NamespaceFactory} from '../../factories/namespace'
|
||||
import {UserProjectFactory} from '../../factories/users_project'
|
||||
import {UserListFactory} from '../../factories/users_list'
|
||||
import {TaskAssigneeFactory} from '../../factories/task_assignee'
|
||||
import {LabelFactory} from '../../factories/labels'
|
||||
import {LabelTaskFactory} from '../../factories/label_task'
|
||||
|
@ -48,22 +48,22 @@ describe('Task', () => {
|
|||
createFakeUserAndLogin()
|
||||
|
||||
let namespaces
|
||||
let projects
|
||||
let lists
|
||||
let buckets
|
||||
|
||||
beforeEach(() => {
|
||||
// UserFactory.create(1)
|
||||
namespaces = NamespaceFactory.create(1)
|
||||
projects = ProjectFactory.create(1)
|
||||
lists = ListFactory.create(1)
|
||||
buckets = BucketFactory.create(1, {
|
||||
project_id: projects[0].id,
|
||||
list_id: lists[0].id,
|
||||
})
|
||||
TaskFactory.truncate()
|
||||
UserProjectFactory.truncate()
|
||||
UserListFactory.truncate()
|
||||
})
|
||||
|
||||
it('Should be created new', () => {
|
||||
cy.visit('/projects/1/list')
|
||||
cy.visit('/lists/1/list')
|
||||
cy.get('.input[placeholder="Add a new task…"')
|
||||
.type('New Task')
|
||||
cy.get('.button')
|
||||
|
@ -74,11 +74,11 @@ describe('Task', () => {
|
|||
.should('contain', 'New Task')
|
||||
})
|
||||
|
||||
it('Inserts new tasks at the top of the project', () => {
|
||||
it('Inserts new tasks at the top of the list', () => {
|
||||
TaskFactory.create(1)
|
||||
|
||||
cy.visit('/projects/1/list')
|
||||
cy.get('.project-is-empty-notice')
|
||||
cy.visit('/lists/1/list')
|
||||
cy.get('.list-is-empty-notice')
|
||||
.should('not.exist')
|
||||
cy.get('.input[placeholder="Add a new task…"')
|
||||
.type('New Task')
|
||||
|
@ -95,7 +95,7 @@ describe('Task', () => {
|
|||
it('Marks a task as done', () => {
|
||||
TaskFactory.create(1)
|
||||
|
||||
cy.visit('/projects/1/list')
|
||||
cy.visit('/lists/1/list')
|
||||
cy.get('.tasks .task .fancycheckbox label.check')
|
||||
.first()
|
||||
.click()
|
||||
|
@ -106,7 +106,7 @@ describe('Task', () => {
|
|||
it('Can add a task to favorites', () => {
|
||||
TaskFactory.create(1)
|
||||
|
||||
cy.visit('/projects/1/list')
|
||||
cy.visit('/lists/1/list')
|
||||
cy.get('.tasks .task .favorite')
|
||||
.first()
|
||||
.click()
|
||||
|
@ -134,7 +134,7 @@ describe('Task', () => {
|
|||
.should('contain', '#1')
|
||||
cy.get('.task-view h6.subtitle')
|
||||
.should('contain', namespaces[0].title)
|
||||
.should('contain', projects[0].title)
|
||||
.should('contain', lists[0].title)
|
||||
cy.get('.task-view .details.content.description')
|
||||
.should('contain', tasks[0].description)
|
||||
cy.get('.task-view .action-buttons p.created')
|
||||
|
@ -179,21 +179,21 @@ describe('Task', () => {
|
|||
.should('contain', 'Mark as undone')
|
||||
})
|
||||
|
||||
it('Shows a task identifier since the project has one', () => {
|
||||
const projects = ProjectFactory.create(1, {
|
||||
it('Shows a task identifier since the list has one', () => {
|
||||
const lists = ListFactory.create(1, {
|
||||
id: 1,
|
||||
identifier: 'TEST',
|
||||
})
|
||||
const tasks = TaskFactory.create(1, {
|
||||
id: 1,
|
||||
project_id: projects[0].id,
|
||||
list_id: lists[0].id,
|
||||
index: 1,
|
||||
})
|
||||
|
||||
cy.visit(`/tasks/${tasks[0].id}`)
|
||||
|
||||
cy.get('.task-view h1.title.task-id')
|
||||
.should('contain', `${projects[0].identifier}-${tasks[0].index}`)
|
||||
.should('contain', `${lists[0].identifier}-${tasks[0].index}`)
|
||||
})
|
||||
|
||||
it('Can edit the description', () => {
|
||||
|
@ -236,14 +236,14 @@ describe('Task', () => {
|
|||
.should('contain', 'Success')
|
||||
})
|
||||
|
||||
it('Can move a task to another project', () => {
|
||||
const projects = ProjectFactory.create(2)
|
||||
it('Can move a task to another list', () => {
|
||||
const lists = ListFactory.create(2)
|
||||
BucketFactory.create(2, {
|
||||
project_id: '{increment}'
|
||||
list_id: '{increment}'
|
||||
})
|
||||
const tasks = TaskFactory.create(1, {
|
||||
id: 1,
|
||||
project_id: projects[0].id,
|
||||
list_id: lists[0].id,
|
||||
})
|
||||
cy.visit(`/tasks/${tasks[0].id}`)
|
||||
|
||||
|
@ -251,7 +251,7 @@ describe('Task', () => {
|
|||
.contains('Move')
|
||||
.click()
|
||||
cy.get('.task-view .content.details .field .multiselect.control .input-wrapper input')
|
||||
.type(`${projects[1].title}{enter}`)
|
||||
.type(`${lists[1].title}{enter}`)
|
||||
// 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.
|
||||
cy.get('.task-view .content.details .field .multiselect.control .search-results')
|
||||
|
@ -261,7 +261,7 @@ describe('Task', () => {
|
|||
|
||||
cy.get('.task-view h6.subtitle')
|
||||
.should('contain', namespaces[0].title)
|
||||
.should('contain', projects[1].title)
|
||||
.should('contain', lists[1].title)
|
||||
cy.get('.global-notification')
|
||||
.should('contain', 'Success')
|
||||
})
|
||||
|
@ -269,7 +269,7 @@ describe('Task', () => {
|
|||
it('Can delete a task', () => {
|
||||
const tasks = TaskFactory.create(1, {
|
||||
id: 1,
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
})
|
||||
cy.visit(`/tasks/${tasks[0].id}`)
|
||||
|
||||
|
@ -286,17 +286,17 @@ describe('Task', () => {
|
|||
cy.get('.global-notification')
|
||||
.should('contain', 'Success')
|
||||
cy.url()
|
||||
.should('contain', `/projects/${tasks[0].project_id}/`)
|
||||
.should('contain', `/lists/${tasks[0].list_id}/`)
|
||||
})
|
||||
|
||||
it('Can add an assignee to a task', () => {
|
||||
const users = UserFactory.create(5)
|
||||
const tasks = TaskFactory.create(1, {
|
||||
id: 1,
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
})
|
||||
UserProjectFactory.create(5, {
|
||||
project_id: 1,
|
||||
UserListFactory.create(5, {
|
||||
list_id: 1,
|
||||
user_id: '{increment}',
|
||||
})
|
||||
|
||||
|
@ -321,10 +321,10 @@ describe('Task', () => {
|
|||
const users = UserFactory.create(2)
|
||||
const tasks = TaskFactory.create(1, {
|
||||
id: 1,
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
})
|
||||
UserProjectFactory.create(5, {
|
||||
project_id: 1,
|
||||
UserListFactory.create(5, {
|
||||
list_id: 1,
|
||||
user_id: '{increment}',
|
||||
})
|
||||
TaskAssigneeFactory.create(1, {
|
||||
|
@ -347,7 +347,7 @@ describe('Task', () => {
|
|||
it('Can add a new label to a task', () => {
|
||||
const tasks = TaskFactory.create(1, {
|
||||
id: 1,
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
})
|
||||
LabelFactory.truncate()
|
||||
const newLabelText = 'some new label'
|
||||
|
@ -375,7 +375,7 @@ describe('Task', () => {
|
|||
it('Can add an existing label to a task', () => {
|
||||
const tasks = TaskFactory.create(1, {
|
||||
id: 1,
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
})
|
||||
const labels = LabelFactory.create(1)
|
||||
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', () => {
|
||||
const tasks = TaskFactory.create(1, {
|
||||
id: 1,
|
||||
project_id: projects[0].id,
|
||||
list_id: lists[0].id,
|
||||
bucket_id: buckets[0].id,
|
||||
})
|
||||
const labels = LabelFactory.create(1)
|
||||
LabelTaskFactory.truncate()
|
||||
|
||||
cy.visit(`/projects/${projects[0].id}/kanban`)
|
||||
cy.visit(`/lists/${lists[0].id}/kanban`)
|
||||
|
||||
cy.get('.bucket .task')
|
||||
.contains(tasks[0].title)
|
||||
|
@ -412,7 +412,7 @@ describe('Task', () => {
|
|||
it('Can remove a label from a task', () => {
|
||||
const tasks = TaskFactory.create(1, {
|
||||
id: 1,
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
})
|
||||
const labels = LabelFactory.create(1)
|
||||
LabelTaskFactory.create(1, {
|
||||
|
@ -527,13 +527,13 @@ describe('Task', () => {
|
|||
TaskAttachmentFactory.truncate()
|
||||
const tasks = TaskFactory.create(1, {
|
||||
id: 1,
|
||||
project_id: projects[0].id,
|
||||
list_id: lists[0].id,
|
||||
bucket_id: buckets[0].id,
|
||||
})
|
||||
const labels = LabelFactory.create(1)
|
||||
LabelTaskFactory.truncate()
|
||||
|
||||
cy.visit(`/projects/${projects[0].id}/kanban`)
|
||||
cy.visit(`/lists/${lists[0].id}/kanban`)
|
||||
|
||||
cy.get('.bucket .task')
|
||||
.contains(tasks[0].title)
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
"isolatedModules": false,
|
||||
"target": "ES2015",
|
||||
"lib": ["ESNext", "dom"],
|
||||
"types": ["cypress"],
|
||||
"ignoreDeprecations": "5.0"
|
||||
"types": ["cypress"]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,14 +1,12 @@
|
|||
import {UserFactory} from '../../factories/user'
|
||||
|
||||
const testAndAssertFailed = fixture => {
|
||||
cy.intercept(Cypress.env('API_URL') + '/login*').as('login')
|
||||
|
||||
cy.visit('/login')
|
||||
cy.get('input[id=username]').type(fixture.username)
|
||||
cy.get('input[id=password]').type(fixture.password)
|
||||
cy.get('.button').contains('Login').click()
|
||||
|
||||
cy.wait('@login')
|
||||
cy.wait(5000) // It can take waaaayy too long to log the user in
|
||||
cy.url().should('include', '/')
|
||||
cy.get('div.message.danger').contains('Wrong username or password.')
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {createFakeUserAndLogin} from '../../support/authenticateUser'
|
||||
import {createProjects} from '../project/prepareProjects'
|
||||
import {createLists} from '../list/prepareLists'
|
||||
|
||||
function logout() {
|
||||
cy.get('.navbar .username-dropdown-trigger')
|
||||
|
@ -26,21 +26,21 @@ describe('Log out', () => {
|
|||
})
|
||||
})
|
||||
|
||||
it.skip('Should clear the project history after logging the user out', () => {
|
||||
const projects = createProjects()
|
||||
cy.visit(`/projects/${projects[0].id}`)
|
||||
it.skip('Should clear the list history after logging the user out', () => {
|
||||
const lists = createLists()
|
||||
cy.visit(`/lists/${lists[0].id}`)
|
||||
.then(() => {
|
||||
expect(localStorage.getItem('projectHistory')).to.not.eq(null)
|
||||
expect(localStorage.getItem('listHistory')).to.not.eq(null)
|
||||
})
|
||||
|
||||
logout()
|
||||
|
||||
cy.wait(1000) // This makes re-loading of the project and associated entities (and the resulting error) visible
|
||||
cy.wait(1000) // This makes re-loading of the list and associated entities (and the resulting error) visible
|
||||
|
||||
cy.url()
|
||||
.should('contain', '/login')
|
||||
.then(() => {
|
||||
expect(localStorage.getItem('projectHistory')).to.eq(null)
|
||||
expect(localStorage.getItem('listHistory')).to.eq(null)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
|
@ -10,7 +10,7 @@ export class BucketFactory extends Factory {
|
|||
return {
|
||||
id: '{increment}',
|
||||
title: faker.lorem.words(3),
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
created_by_id: 1,
|
||||
created: now.toISOString(),
|
||||
updated: now.toISOString(),
|
||||
|
|
|
@ -10,7 +10,7 @@ export class LinkShareFactory extends Factory {
|
|||
return {
|
||||
id: '{increment}',
|
||||
hash: faker.random.word(32),
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
right: 0,
|
||||
sharing_type: 0,
|
||||
shared_by_id: 1,
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import {Factory} from '../support/factory'
|
||||
import {faker} from '@faker-js/faker'
|
||||
|
||||
export class ProjectFactory extends Factory {
|
||||
static table = 'projects'
|
||||
export class ListFactory extends Factory {
|
||||
static table = 'lists'
|
||||
|
||||
static factory() {
|
||||
const now = new Date()
|
|
@ -11,7 +11,7 @@ export class TaskFactory extends Factory {
|
|||
id: '{increment}',
|
||||
title: faker.lorem.words(3),
|
||||
done: false,
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
created_by_id: 1,
|
||||
index: '{increment}',
|
||||
position: '{increment}',
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
import {Factory} from '../support/factory'
|
||||
|
||||
export class UserProjectFactory extends Factory {
|
||||
static table = 'users_projects'
|
||||
export class UserListFactory extends Factory {
|
||||
static table = 'users_lists'
|
||||
|
||||
static factory() {
|
||||
const now = new Date()
|
||||
|
||||
return {
|
||||
id: '{increment}',
|
||||
project_id: 1,
|
||||
list_id: 1,
|
||||
user_id: 1,
|
||||
right: 0,
|
||||
created: now.toISOString(),
|
|
@ -30,21 +30,21 @@ A basic service can look like this:
|
|||
|
||||
```javascript
|
||||
import AbstractService from './abstractService'
|
||||
import ProjectModel from '../models/project'
|
||||
import ListModel from '../models/list'
|
||||
|
||||
export default class ProjectService extends AbstractService {
|
||||
export default class ListService extends AbstractService {
|
||||
constructor() {
|
||||
super({
|
||||
getAll: '/projects',
|
||||
get: '/projects/{id}',
|
||||
create: '/namespaces/{namespaceID}/projects',
|
||||
update: '/projects/{id}',
|
||||
delete: '/projects/{id}',
|
||||
getAll: '/lists',
|
||||
get: '/lists/{id}',
|
||||
create: '/namespaces/{namespaceID}/lists',
|
||||
update: '/lists/{id}',
|
||||
delete: '/lists/{id}',
|
||||
})
|
||||
}
|
||||
|
||||
modelFactory(data) {
|
||||
return new ProjectModel(data)
|
||||
return new ListModel(data)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
@ -132,7 +132,7 @@ import AbstractModel from './abstractModel'
|
|||
import TaskModel from './task'
|
||||
import UserModel from './user'
|
||||
|
||||
export default class ProjectModel extends AbstractModel {
|
||||
export default class ListModel extends AbstractModel {
|
||||
|
||||
constructor(data) {
|
||||
// The constructor of AbstractModel handles all the default parsing.
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
#!/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',
|
||||
// dark: './img/dark.png',
|
||||
// },
|
||||
logoHref: 'https://vikunja.io',
|
||||
// logoHref: 'https://acme.com',
|
||||
// favicon: './favicon.ico',
|
||||
},
|
||||
})
|
|
@ -16,9 +16,6 @@
|
|||
<strong>We're sorry but Vikunja doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
<!-- TODO_OFFLINE maybe need to dynamically import it instead.
|
||||
Not sure if it works ok inside Delta Chat. -->
|
||||
<script type="module" src="/webxdc.js"></script>
|
||||
<script type="module" src="/src/main.ts"></script>
|
||||
<script>
|
||||
//
|
||||
|
|
Binary file not shown.
Binary file not shown.
88
package.json
88
package.json
|
@ -13,7 +13,7 @@
|
|||
},
|
||||
"homepage": "https://vikunja.io/",
|
||||
"funding": "https://opencollective.com/vikunja",
|
||||
"packageManager": "pnpm@7.30.5",
|
||||
"packageManager": "pnpm@7.28.0",
|
||||
"keywords": [
|
||||
"todo",
|
||||
"productivity",
|
||||
|
@ -27,8 +27,6 @@
|
|||
"preview": "vite preview --port 4173",
|
||||
"preview:dev": "vite preview --outDir dist-dev --mode development --port 4173",
|
||||
"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:dev": "vite build --mode development --outDir dist-dev/",
|
||||
"lint": "eslint --ignore-pattern '*.test.*' ./src --ext .vue,.js,.ts",
|
||||
|
@ -47,19 +45,19 @@
|
|||
"story:preview": "histoire preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@fortawesome/fontawesome-svg-core": "6.4.0",
|
||||
"@fortawesome/free-regular-svg-icons": "6.4.0",
|
||||
"@fortawesome/free-solid-svg-icons": "6.4.0",
|
||||
"@fortawesome/fontawesome-svg-core": "6.3.0",
|
||||
"@fortawesome/free-regular-svg-icons": "6.3.0",
|
||||
"@fortawesome/free-solid-svg-icons": "6.3.0",
|
||||
"@fortawesome/vue-fontawesome": "3.0.3",
|
||||
"@github/hotkey": "2.0.1",
|
||||
"@infectoone/vue-ganttastic": "2.1.4",
|
||||
"@intlify/unplugin-vue-i18n": "0.10.0",
|
||||
"@intlify/unplugin-vue-i18n": "0.8.2",
|
||||
"@kyvg/vue3-notification": "2.9.0",
|
||||
"@sentry/tracing": "7.45.0",
|
||||
"@sentry/vue": "7.45.0",
|
||||
"@sentry/tracing": "7.39.0",
|
||||
"@sentry/vue": "7.39.0",
|
||||
"@types/is-touch-device": "1.0.0",
|
||||
"@types/lodash.clonedeep": "4.5.7",
|
||||
"@types/sortablejs": "1.15.1",
|
||||
"@types/sortablejs": "1.15.0",
|
||||
"@vueuse/core": "9.13.0",
|
||||
"axios": "1.3.4",
|
||||
"blurhash": "2.0.5",
|
||||
|
@ -68,89 +66,81 @@
|
|||
"codemirror": "5.65.12",
|
||||
"date-fns": "2.29.3",
|
||||
"dayjs": "1.11.7",
|
||||
"dompurify": "3.0.1",
|
||||
"dompurify": "3.0.0",
|
||||
"easymde": "2.18.0",
|
||||
"fast-deep-equal": "3.1.3",
|
||||
"flatpickr": "4.6.13",
|
||||
"flexsearch": "0.7.31",
|
||||
"flexsearch": "0.7.21",
|
||||
"floating-vue": "2.0.0-beta.20",
|
||||
"focus-within": "3.0.2",
|
||||
"highlight.js": "11.7.0",
|
||||
"is-touch-device": "1.0.1",
|
||||
"klona": "2.0.6",
|
||||
"lodash.debounce": "4.0.8",
|
||||
"marked": "4.3.0",
|
||||
"pinia": "2.0.33",
|
||||
"marked": "4.2.12",
|
||||
"pinia": "2.0.32",
|
||||
"register-service-worker": "1.7.2",
|
||||
"snake-case": "3.0.4",
|
||||
"sortablejs": "1.15.0",
|
||||
"ufo": "1.1.1",
|
||||
"vue": "3.2.47",
|
||||
"vue-advanced-cropper": "2.8.8",
|
||||
"vue-flatpickr-component": "11.0.3",
|
||||
"vue-flatpickr-component": "11.0.2",
|
||||
"vue-i18n": "9.2.2",
|
||||
"vue-router": "4.1.6",
|
||||
"workbox-precaching": "6.5.4",
|
||||
"y-indexeddb": "^9.0.10",
|
||||
"y-webrtc": "^10.2.5",
|
||||
"yjs": "^13.5.51",
|
||||
"zhyswan-vuedraggable": "4.1.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@4tw/cypress-drag-drop": "2.2.3",
|
||||
"@cypress/vite-dev-server": "5.0.5",
|
||||
"@cypress/vue": "5.0.5",
|
||||
"@cypress/vite-dev-server": "5.0.4",
|
||||
"@cypress/vue": "5.0.4",
|
||||
"@faker-js/faker": "7.6.0",
|
||||
"@histoire/plugin-screenshot": "0.15.9",
|
||||
"@histoire/plugin-screenshot": "0.15.8",
|
||||
"@histoire/plugin-vue": "0.15.8",
|
||||
"@rushstack/eslint-patch": "1.2.0",
|
||||
"@types/codemirror": "5.60.7",
|
||||
"@types/dompurify": "3.0.0",
|
||||
"@types/dompurify": "2.4.0",
|
||||
"@types/flexsearch": "0.7.3",
|
||||
"@types/focus-within": "1.0.1",
|
||||
"@types/lodash.debounce": "4.0.7",
|
||||
"@types/marked": "4.0.8",
|
||||
"@types/node": "18.15.10",
|
||||
"@types/node": "18.14.2",
|
||||
"@types/postcss-preset-env": "7.7.0",
|
||||
"@typescript-eslint/eslint-plugin": "5.57.0",
|
||||
"@typescript-eslint/parser": "5.57.0",
|
||||
"@vitejs/plugin-legacy": "4.0.2",
|
||||
"@vitejs/plugin-vue": "4.1.0",
|
||||
"@typescript-eslint/eslint-plugin": "5.54.0",
|
||||
"@typescript-eslint/parser": "5.54.0",
|
||||
"@vitejs/plugin-legacy": "4.0.1",
|
||||
"@vitejs/plugin-vue": "4.0.0",
|
||||
"@vue/eslint-config-typescript": "11.0.2",
|
||||
"@vue/test-utils": "2.3.2",
|
||||
"@vue/test-utils": "2.3.0",
|
||||
"@vue/tsconfig": "0.1.3",
|
||||
"autoprefixer": "10.4.14",
|
||||
"autoprefixer": "10.4.13",
|
||||
"browserslist": "4.21.5",
|
||||
"caniuse-lite": "1.0.30001470",
|
||||
"caniuse-lite": "1.0.30001458",
|
||||
"csstype": "3.1.1",
|
||||
"cypress": "12.8.1",
|
||||
"esbuild": "0.17.14",
|
||||
"eslint": "8.36.0",
|
||||
"eslint-plugin-vue": "9.10.0",
|
||||
"cypress": "12.7.0",
|
||||
"esbuild": "0.17.10",
|
||||
"eslint": "8.35.0",
|
||||
"eslint-plugin-vue": "9.9.0",
|
||||
"happy-dom": "8.9.0",
|
||||
"histoire": "0.15.9",
|
||||
"netlify-cli": "13.2.1",
|
||||
"histoire": "0.15.8",
|
||||
"netlify-cli": "13.0.0",
|
||||
"postcss": "8.4.21",
|
||||
"postcss-easing-gradients": "3.0.1",
|
||||
"postcss-easings": "3.0.1",
|
||||
"postcss-preset-env": "8.1.0",
|
||||
"rollup": "3.20.2",
|
||||
"postcss-preset-env": "8.0.1",
|
||||
"rollup": "3.17.3",
|
||||
"rollup-plugin-visualizer": "5.9.0",
|
||||
"sass": "1.60.0",
|
||||
"sass": "1.58.3",
|
||||
"start-server-and-test": "2.0.0",
|
||||
"typescript": "5.0.2",
|
||||
"vite": "4.2.1",
|
||||
"vite-plugin-inject-preload": "1.3.1",
|
||||
"vite-plugin-pwa": "0.14.7",
|
||||
"typescript": "4.9.5",
|
||||
"vite": "4.1.4",
|
||||
"vite-plugin-inject-preload": "1.3.0",
|
||||
"vite-plugin-pwa": "0.14.4",
|
||||
"vite-svg-loader": "4.0.0",
|
||||
"vitest": "0.29.7",
|
||||
"vitest": "0.29.1",
|
||||
"vue-tsc": "1.2.0",
|
||||
"wait-on": "7.0.1",
|
||||
"workbox-cli": "6.5.4"
|
||||
},
|
||||
"pnpm": {
|
||||
"patchedDependencies": {
|
||||
"flexsearch@0.7.31": "patches/flexsearch@0.7.31.patch"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
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",
|
2713
pnpm-lock.yaml
2713
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
36
src/App.vue
36
src/App.vue
|
@ -35,6 +35,7 @@ import NoAuthWrapper from '@/components/misc/no-auth-wrapper.vue'
|
|||
import Ready from '@/components/misc/ready.vue'
|
||||
|
||||
import {setLanguage} from '@/i18n'
|
||||
import AccountDeleteService from '@/services/accountDelete'
|
||||
import {success} from '@/message'
|
||||
|
||||
import {useAuthStore} from '@/stores/auth'
|
||||
|
@ -56,6 +57,41 @@ const authLinkShare = computed(() => authStore.authLinkShare)
|
|||
|
||||
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()
|
||||
useColorScheme()
|
||||
</script>
|
||||
|
|
Binary file not shown.
|
@ -4,11 +4,8 @@ import { useNow } from '@vueuse/core'
|
|||
|
||||
import LogoFull from '@/assets/logo-full.svg?component'
|
||||
import LogoFullPride from '@/assets/logo-full-pride.svg?component'
|
||||
import {MILLISECONDS_A_HOUR} from '@/constants/date'
|
||||
|
||||
const now = useNow({
|
||||
interval: MILLISECONDS_A_HOUR,
|
||||
})
|
||||
const now = useNow()
|
||||
const Logo = computed(() => now.value.getMonth() === 5 ? LogoFullPride : LogoFull)
|
||||
</script>
|
||||
|
||||
|
|
|
@ -1,31 +1,67 @@
|
|||
<template>
|
||||
<header :class="{ 'has-background': background, 'menu-active': menuActive }" aria-label="main navigation"
|
||||
class="navbar d-print-none">
|
||||
<router-link :to="{ name: 'home' }" class="logo-link">
|
||||
<Logo width="164" height="48" />
|
||||
<header
|
||||
:class="{'has-background': background, 'menu-active': menuActive}"
|
||||
aria-label="main navigation"
|
||||
class="navbar d-print-none"
|
||||
>
|
||||
<router-link :to="{name: 'home'}" class="logo-link">
|
||||
<Logo width="164" height="48"/>
|
||||
</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">
|
||||
<BaseButton @click="openQuickActions" class="trigger-button" v-shortcut="'Control+k'"
|
||||
:title="$t('keyboardShortcuts.quickSearch')">
|
||||
<icon icon="search" />
|
||||
<BaseButton
|
||||
@click="openQuickActions"
|
||||
class="trigger-button"
|
||||
v-shortcut="'Control+k'"
|
||||
:title="$t('keyboardShortcuts.quickSearch')"
|
||||
>
|
||||
<icon icon="search"/>
|
||||
</BaseButton>
|
||||
<Notifications />
|
||||
<dropdown>
|
||||
<template #trigger="{ toggleOpen, open }">
|
||||
<BaseButton class="username-dropdown-trigger" @click="toggleOpen" variant="secondary" :shadow="false">
|
||||
<img :src="authStore.avatarUrl" alt="" class="avatar" width="40" height="40" />
|
||||
<template #trigger="{toggleOpen, open}">
|
||||
<BaseButton
|
||||
class="username-dropdown-trigger"
|
||||
@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="icon is-small" :style="{
|
||||
transform: open ? 'rotate(180deg)' : 'rotate(0)',
|
||||
}">
|
||||
<icon icon="chevron-down" />
|
||||
<icon icon="chevron-down"/>
|
||||
</span>
|
||||
</BaseButton>
|
||||
</template>
|
||||
|
||||
<dropdown-item :to="{ name: 'user.settings' }">
|
||||
<dropdown-item :to="{name: 'user.settings'}">
|
||||
{{ $t('user.settings.title') }}
|
||||
</dropdown-item>
|
||||
<dropdown-item v-if="imprintUrl" :href="imprintUrl">
|
||||
|
@ -37,20 +73,23 @@
|
|||
<dropdown-item @click="baseStore.setKeyboardShortcutsActive(true)">
|
||||
{{ $t('keyboardShortcuts.title') }}
|
||||
</dropdown-item>
|
||||
<dropdown-item :to="{ name: 'about' }">
|
||||
<dropdown-item :to="{name: 'about'}">
|
||||
{{ $t('about.title') }}
|
||||
</dropdown-item>
|
||||
<dropdown-item @click="authStore.logout()">
|
||||
{{ $t('user.auth.logout') }}
|
||||
</dropdown-item>
|
||||
</dropdown>
|
||||
</div>
|
||||
</header>
|
||||
</template>
|
||||
|
||||
<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 ProjectSettingsDropdown from '@/components/project/project-settings-dropdown.vue'
|
||||
import ListSettingsDropdown from '@/components/list/list-settings-dropdown.vue'
|
||||
import Dropdown from '@/components/misc/dropdown.vue'
|
||||
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
||||
import Notifications from '@/components/notifications/notifications.vue'
|
||||
|
@ -58,16 +97,16 @@ import Logo from '@/components/home/Logo.vue'
|
|||
import BaseButton from '@/components/base/BaseButton.vue'
|
||||
import MenuButton from '@/components/home/MenuButton.vue'
|
||||
|
||||
import { getProjectTitle } from '@/helpers/getProjectTitle'
|
||||
import {getListTitle} from '@/helpers/getListTitle'
|
||||
|
||||
import { useBaseStore } from '@/stores/base'
|
||||
import { useConfigStore } from '@/stores/config'
|
||||
import { useAuthStore } from '@/stores/auth'
|
||||
import {useBaseStore} from '@/stores/base'
|
||||
import {useConfigStore} from '@/stores/config'
|
||||
import {useAuthStore} from '@/stores/auth'
|
||||
|
||||
const baseStore = useBaseStore()
|
||||
const currentProject = computed(() => baseStore.currentProject)
|
||||
const currentList = computed(() => baseStore.currentList)
|
||||
const background = computed(() => baseStore.background)
|
||||
const canWriteCurrentProject = computed(() => baseStore.currentProject.maxRight > Rights.READ)
|
||||
const canWriteCurrentList = computed(() => baseStore.currentList.maxRight > Rights.READ)
|
||||
const menuActive = computed(() => baseStore.menuActive)
|
||||
|
||||
const authStore = useAuthStore()
|
||||
|
@ -127,7 +166,7 @@ $user-dropdown-width-mobile: 5rem;
|
|||
|
||||
.logo-link {
|
||||
display: none;
|
||||
|
||||
|
||||
@media screen and (min-width: $tablet) {
|
||||
align-self: stretch;
|
||||
display: flex;
|
||||
|
@ -146,12 +185,12 @@ $user-dropdown-width-mobile: 5rem;
|
|||
}
|
||||
}
|
||||
|
||||
.project-title-wrapper {
|
||||
.list-title-wrapper {
|
||||
margin-inline: auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
// this makes the truncated text of the project title work
|
||||
// this makes the truncated text of the list title work
|
||||
// inside the flexbox parent
|
||||
min-width: 0;
|
||||
|
||||
|
@ -160,7 +199,7 @@ $user-dropdown-width-mobile: 5rem;
|
|||
}
|
||||
}
|
||||
|
||||
.project-title {
|
||||
.list-title {
|
||||
font-size: 1rem;
|
||||
// We need the following for overflowing ellipsis to work
|
||||
text-overflow: ellipsis;
|
||||
|
@ -172,15 +211,15 @@ $user-dropdown-width-mobile: 5rem;
|
|||
}
|
||||
}
|
||||
|
||||
.project-title-dropdown {
|
||||
.list-title-dropdown {
|
||||
align-self: stretch;
|
||||
|
||||
.project-title-button {
|
||||
.list-title-button {
|
||||
flex-grow: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.project-title-button {
|
||||
.list-title-button {
|
||||
align-self: stretch;
|
||||
min-width: var(--navbar-button-min-width);
|
||||
display: flex;
|
||||
|
@ -196,7 +235,7 @@ $user-dropdown-width-mobile: 5rem;
|
|||
display: flex;
|
||||
align-items: stretch;
|
||||
|
||||
>* {
|
||||
> * {
|
||||
min-width: var(--navbar-button-min-width);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
:class="{'is-visible': background}"
|
||||
class="app-container-background background-fade-in d-print-none"
|
||||
:style="{'background-image': background && `url(${background})`}"></div>
|
||||
<!-- Can't remove <navigation> because otherwise namespaces would not get loaded. -->
|
||||
<navigation class="d-print-none"/>
|
||||
<main
|
||||
class="app-content"
|
||||
|
@ -34,7 +33,7 @@
|
|||
<quick-actions/>
|
||||
|
||||
<router-view :route="routeWithModal" v-slot="{ Component }">
|
||||
<keep-alive :include="['project.list', 'project.gantt', 'project.table', 'project.kanban']">
|
||||
<keep-alive :include="['list.list', 'list.gantt', 'list.table', 'list.kanban']">
|
||||
<component :is="Component"/>
|
||||
</keep-alive>
|
||||
</router-view>
|
||||
|
@ -72,6 +71,7 @@ import {useBaseStore} from '@/stores/base'
|
|||
import {useLabelStore} from '@/stores/labels'
|
||||
|
||||
import {useRouteWithModal} from '@/composables/useRouteWithModal'
|
||||
import {useRenewTokenOnFocus} from '@/composables/useRenewTokenOnFocus'
|
||||
|
||||
const {routeWithModal, currentModal, closeModal} = useRouteWithModal()
|
||||
|
||||
|
@ -87,7 +87,7 @@ function showKeyboardShortcuts() {
|
|||
const route = useRoute()
|
||||
|
||||
// FIXME: this is really error prone
|
||||
// Reset the current project highlight in menu if the current route is not project related.
|
||||
// Reset the current list highlight in menu if the current route is not list related.
|
||||
watch(() => route.name as string, (routeName) => {
|
||||
if (
|
||||
routeName &&
|
||||
|
@ -106,12 +106,14 @@ watch(() => route.name as string, (routeName) => {
|
|||
routeName.startsWith('user.settings')
|
||||
)
|
||||
) {
|
||||
baseStore.handleSetCurrentProject({project: null})
|
||||
baseStore.handleSetCurrentList({list: null})
|
||||
}
|
||||
})
|
||||
|
||||
// TODO: Reset the title if the page component does not set one itself
|
||||
|
||||
useRenewTokenOnFocus()
|
||||
|
||||
const labelStore = useLabelStore()
|
||||
labelStore.loadAllLabels()
|
||||
</script>
|
||||
|
@ -154,8 +156,6 @@ labelStore.loadAllLabels()
|
|||
z-index: 10;
|
||||
position: relative;
|
||||
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) {
|
||||
margin-left: 0;
|
||||
|
|
|
@ -9,9 +9,9 @@
|
|||
<Logo class="logo" v-if="logoVisible"/>
|
||||
<h1
|
||||
:class="{'m-0': !logoVisible}"
|
||||
:style="{ 'opacity': currentProject.title === '' ? '0': '1' }"
|
||||
:style="{ 'opacity': currentList.title === '' ? '0': '1' }"
|
||||
class="title">
|
||||
{{ currentProject.title === '' ? $t('misc.loading') : currentProject.title }}
|
||||
{{ currentList.title === '' ? $t('misc.loading') : currentList.title }}
|
||||
</h1>
|
||||
<div class="box has-text-left view">
|
||||
<router-view/>
|
||||
|
@ -31,7 +31,7 @@ import Logo from '@/components/home/Logo.vue'
|
|||
import PoweredByLink from './PoweredByLink.vue'
|
||||
|
||||
const baseStore = useBaseStore()
|
||||
const currentProject = computed(() => baseStore.currentProject)
|
||||
const currentList = computed(() => baseStore.currentList)
|
||||
const background = computed(() => baseStore.background)
|
||||
const logoVisible = computed(() => baseStore.logoVisible)
|
||||
</script>
|
||||
|
|
|
@ -52,37 +52,37 @@
|
|||
<template v-for="(n, nk) in namespaces" :key="n.id">
|
||||
<div class="namespace-title" :class="{'has-menu': n.id > 0}">
|
||||
<BaseButton
|
||||
@click="toggleProjects(n.id)"
|
||||
@click="toggleLists(n.id)"
|
||||
class="menu-label"
|
||||
v-tooltip="namespaceTitles[nk]"
|
||||
>
|
||||
<ColorBubble
|
||||
v-if="n.hexColor !== ''"
|
||||
:color="n.hexColor"
|
||||
class="mr-1"
|
||||
v-if="n.hexColor !== ''"
|
||||
:color="n.hexColor"
|
||||
class="mr-1"
|
||||
/>
|
||||
<span class="name">{{ namespaceTitles[nk] }}</span>
|
||||
<div
|
||||
class="icon menu-item-icon is-small toggle-lists-icon pl-2"
|
||||
:class="{'active': typeof projectsVisible[n.id] !== 'undefined' ? projectsVisible[n.id] : true}"
|
||||
class="icon menu-item-icon is-small toggle-lists-icon pl-2"
|
||||
:class="{'active': typeof listsVisible[n.id] !== 'undefined' ? listsVisible[n.id] : true}"
|
||||
>
|
||||
<icon icon="chevron-down"/>
|
||||
</div>
|
||||
<span class="count" :class="{'ml-2 mr-0': n.id > 0}">
|
||||
({{ namespaceProjectsCount[nk] }})
|
||||
({{ namespaceListsCount[nk] }})
|
||||
</span>
|
||||
</BaseButton>
|
||||
<namespace-settings-dropdown class="menu-list-dropdown" :namespace="n" v-if="n.id > 0"/>
|
||||
</div>
|
||||
<!--
|
||||
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
|
||||
-->
|
||||
<draggable
|
||||
v-if="projectsVisible[n.id] ?? true"
|
||||
<!--
|
||||
NOTE: a v-model / computed setter is not possible, since the updateActiveLists function
|
||||
triggered by the change needs to have access to the current namespace
|
||||
-->
|
||||
<draggable
|
||||
v-if="listsVisible[n.id] ?? true"
|
||||
v-bind="dragOptions"
|
||||
:modelValue="activeProjects[nk]"
|
||||
@update:modelValue="(projects) => updateActiveProjects(n, projects)"
|
||||
:modelValue="activeLists[nk]"
|
||||
@update:modelValue="(lists) => updateActiveLists(n, lists)"
|
||||
group="namespace-lists"
|
||||
@start="() => drag = true"
|
||||
@end="saveListPosition"
|
||||
|
@ -100,46 +100,46 @@
|
|||
{ 'dragging-disabled': n.id < 0 }
|
||||
]
|
||||
}"
|
||||
>
|
||||
<template #item="{element: l}">
|
||||
<li
|
||||
class="list-menu loader-container is-loading-small"
|
||||
: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}"
|
||||
>
|
||||
<template #item="{element: l}">
|
||||
<li
|
||||
class="list-menu loader-container is-loading-small"
|
||||
:class="{'is-loading': listUpdating[l.id]}"
|
||||
>
|
||||
<span class="icon menu-item-icon handle">
|
||||
<icon icon="grip-lines"/>
|
||||
</span>
|
||||
<ColorBubble
|
||||
<BaseButton
|
||||
:to="{ name: 'list.index', params: { listId: l.id} }"
|
||||
class="list-menu-link"
|
||||
:class="{'router-link-exact-active': currentList.id === l.id}"
|
||||
>
|
||||
<span class="icon menu-item-icon handle">
|
||||
<icon icon="grip-lines"/>
|
||||
</span>
|
||||
<ColorBubble
|
||||
v-if="l.hexColor !== ''"
|
||||
:color="l.hexColor"
|
||||
class="mr-1"
|
||||
/>
|
||||
<span class="list-menu-title">{{ getProjectTitle(l) }}</span>
|
||||
</BaseButton>
|
||||
<BaseButton
|
||||
v-if="l.id > 0"
|
||||
class="favorite"
|
||||
:class="{'is-favorite': l.isFavorite}"
|
||||
@click="projectStore.toggleProjectFavorite(l)"
|
||||
>
|
||||
<icon :icon="l.isFavorite ? 'star' : ['far', 'star']"/>
|
||||
</BaseButton>
|
||||
<ProjectSettingsDropdown class="menu-list-dropdown" :project="l" v-if="l.id > 0">
|
||||
<template #trigger="{toggleOpen}">
|
||||
<BaseButton class="menu-list-dropdown-trigger" @click="toggleOpen">
|
||||
<icon icon="ellipsis-h" class="icon"/>
|
||||
</BaseButton>
|
||||
</template>
|
||||
</ProjectSettingsDropdown>
|
||||
<span class="list-setting-spacer" v-else></span>
|
||||
</li>
|
||||
</template>
|
||||
</draggable>
|
||||
/>
|
||||
<span class="list-menu-title">{{ getListTitle(l) }}</span>
|
||||
</BaseButton>
|
||||
<BaseButton
|
||||
v-if="l.id > 0"
|
||||
class="favorite"
|
||||
:class="{'is-favorite': l.isFavorite}"
|
||||
@click="listStore.toggleListFavorite(l)"
|
||||
>
|
||||
<icon :icon="l.isFavorite ? 'star' : ['far', 'star']"/>
|
||||
</BaseButton>
|
||||
<list-settings-dropdown class="menu-list-dropdown" :list="l" v-if="l.id > 0">
|
||||
<template #trigger="{toggleOpen}">
|
||||
<BaseButton class="menu-list-dropdown-trigger" @click="toggleOpen">
|
||||
<icon icon="ellipsis-h" class="icon"/>
|
||||
</BaseButton>
|
||||
</template>
|
||||
</list-settings-dropdown>
|
||||
<span class="list-setting-spacer" v-else></span>
|
||||
</li>
|
||||
</template>
|
||||
</draggable>
|
||||
</template>
|
||||
</nav>
|
||||
<PoweredByLink/>
|
||||
|
@ -152,20 +152,20 @@ import draggable from 'zhyswan-vuedraggable'
|
|||
import type {SortableEvent} from 'sortablejs'
|
||||
|
||||
import BaseButton from '@/components/base/BaseButton.vue'
|
||||
import ProjectSettingsDropdown from '@/components/project/project-settings-dropdown.vue'
|
||||
import ListSettingsDropdown from '@/components/list/list-settings-dropdown.vue'
|
||||
import NamespaceSettingsDropdown from '@/components/namespace/namespace-settings-dropdown.vue'
|
||||
import PoweredByLink from '@/components/home/PoweredByLink.vue'
|
||||
import Logo from '@/components/home/Logo.vue'
|
||||
|
||||
import {calculateItemPosition} from '@/helpers/calculateItemPosition'
|
||||
import {getNamespaceTitle} from '@/helpers/getNamespaceTitle'
|
||||
import {getProjectTitle} from '@/helpers/getProjectTitle'
|
||||
import type {IProject} from '@/modelTypes/IProject'
|
||||
import {getListTitle} from '@/helpers/getListTitle'
|
||||
import type {IList} from '@/modelTypes/IList'
|
||||
import type {INamespace} from '@/modelTypes/INamespace'
|
||||
import ColorBubble from '@/components/misc/colorBubble.vue'
|
||||
|
||||
import {useBaseStore} from '@/stores/base'
|
||||
import {useProjectStore} from '@/stores/projects'
|
||||
import {useListStore} from '@/stores/lists'
|
||||
import {useNamespaceStore} from '@/stores/namespaces'
|
||||
|
||||
const drag = ref(false)
|
||||
|
@ -176,7 +176,7 @@ const dragOptions = {
|
|||
|
||||
const baseStore = useBaseStore()
|
||||
const namespaceStore = useNamespaceStore()
|
||||
const currentProject = computed(() => baseStore.currentProject)
|
||||
const currentList = computed(() => baseStore.currentList)
|
||||
const menuActive = computed(() => baseStore.menuActive)
|
||||
const loading = computed(() => namespaceStore.isLoading)
|
||||
|
||||
|
@ -184,9 +184,9 @@ const loading = computed(() => namespaceStore.isLoading)
|
|||
const namespaces = computed(() => {
|
||||
return namespaceStore.namespaces.filter(n => !n.isArchived)
|
||||
})
|
||||
const activeProjects = computed(() => {
|
||||
return namespaces.value.map(({projects}) => {
|
||||
return projects?.filter(item => {
|
||||
const activeLists = computed(() => {
|
||||
return namespaces.value.map(({lists}) => {
|
||||
return lists?.filter(item => {
|
||||
return typeof item !== 'undefined' && !item.isArchived
|
||||
})
|
||||
})
|
||||
|
@ -196,45 +196,45 @@ const namespaceTitles = computed(() => {
|
|||
return namespaces.value.map((namespace) => getNamespaceTitle(namespace))
|
||||
})
|
||||
|
||||
const namespaceProjectsCount = computed(() => {
|
||||
return namespaces.value.map((_, index) => activeProjects.value[index]?.length ?? 0)
|
||||
const namespaceListsCount = computed(() => {
|
||||
return namespaces.value.map((_, index) => activeLists.value[index]?.length ?? 0)
|
||||
})
|
||||
|
||||
const projectStore = useProjectStore()
|
||||
const listStore = useListStore()
|
||||
|
||||
function toggleProjects(namespaceId: INamespace['id']) {
|
||||
projectsVisible.value[namespaceId] = !projectsVisible.value[namespaceId]
|
||||
function toggleLists(namespaceId: INamespace['id']) {
|
||||
listsVisible.value[namespaceId] = !listsVisible.value[namespaceId]
|
||||
}
|
||||
|
||||
const projectsVisible = ref<{ [id: INamespace['id']]: boolean }>({})
|
||||
const listsVisible = ref<{ [id: INamespace['id']]: boolean }>({})
|
||||
// FIXME: async action will be unfinished when component mounts
|
||||
onBeforeMount(async () => {
|
||||
const namespaces = await namespaceStore.loadNamespaces()
|
||||
namespaces.forEach(n => {
|
||||
if (typeof projectsVisible.value[n.id] === 'undefined') {
|
||||
projectsVisible.value[n.id] = true
|
||||
if (typeof listsVisible.value[n.id] === 'undefined') {
|
||||
listsVisible.value[n.id] = true
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
function updateActiveProjects(namespace: INamespace, activeProjects: IProject[]) {
|
||||
function updateActiveLists(namespace: INamespace, activeLists: IList[]) {
|
||||
// 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.
|
||||
// To work around this, we merge the active projects with the archived ones. Doing so breaks the order
|
||||
// because now all archived projects are sorted after the active ones. This is fine because they are sorted
|
||||
// To work around this, we merge the active lists 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
|
||||
// later when showing them anyway, and it makes the merging happening here a lot easier.
|
||||
const projects = [
|
||||
...activeProjects,
|
||||
...namespace.projects.filter(l => l.isArchived),
|
||||
const lists = [
|
||||
...activeLists,
|
||||
...namespace.lists.filter(l => l.isArchived),
|
||||
]
|
||||
|
||||
namespaceStore.setNamespaceById({
|
||||
...namespace,
|
||||
projects,
|
||||
lists,
|
||||
})
|
||||
}
|
||||
|
||||
const projectUpdating = ref<{ [id: INamespace['id']]: boolean }>({})
|
||||
const listUpdating = ref<{ [id: INamespace['id']]: boolean }>({})
|
||||
|
||||
async function saveListPosition(e: SortableEvent) {
|
||||
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 newNamespaceIndex = parseInt(e.to.dataset.namespaceIndex as string)
|
||||
|
||||
const projectsActive = activeProjects.value[newNamespaceIndex]
|
||||
// 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 project will fail.
|
||||
const listsActive = activeLists.value[newNamespaceIndex]
|
||||
// If the list was dragged to the last position, Safari will report e.newIndex as the size of the listsActive
|
||||
// array instead of using the position. Because the index is wrong in that case, dragging the list will fail.
|
||||
// To work around that we're explicitly checking that case here and decrease the index.
|
||||
const newIndex = e.newIndex === projectsActive.length ? e.newIndex - 1 : e.newIndex
|
||||
|
||||
const project = projectsActive[newIndex]
|
||||
const projectBefore = projectsActive[newIndex - 1] ?? null
|
||||
const projectAfter = projectsActive[newIndex + 1] ?? null
|
||||
projectUpdating.value[project.id] = true
|
||||
const newIndex = e.newIndex === listsActive.length ? e.newIndex - 1 : e.newIndex
|
||||
|
||||
const list = listsActive[newIndex]
|
||||
const listBefore = listsActive[newIndex - 1] ?? null
|
||||
const listAfter = listsActive[newIndex + 1] ?? null
|
||||
listUpdating.value[list.id] = true
|
||||
|
||||
const position = calculateItemPosition(
|
||||
projectBefore !== null ? projectBefore.position : null,
|
||||
projectAfter !== null ? projectAfter.position : null,
|
||||
listBefore !== null ? listBefore.position : null,
|
||||
listAfter !== null ? listAfter.position : null,
|
||||
)
|
||||
|
||||
try {
|
||||
// create a copy of the project in order to not violate pinia manipulation
|
||||
await projectStore.updateProject({
|
||||
...project,
|
||||
// create a copy of the list in order to not violate pinia manipulation
|
||||
await listStore.updateList({
|
||||
...list,
|
||||
position,
|
||||
namespaceId,
|
||||
})
|
||||
} finally {
|
||||
projectUpdating.value[project.id] = false
|
||||
listUpdating.value[list.id] = false
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
@ -342,20 +342,13 @@ $vikunja-nav-selected-width: 0.4rem;
|
|||
}
|
||||
|
||||
.menu-list-dropdown {
|
||||
opacity: 1;
|
||||
opacity: 0;
|
||||
transition: $transition;
|
||||
}
|
||||
|
||||
@media(hover: hover) and (pointer: fine) {
|
||||
.menu-list-dropdown {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
&:hover .menu-list-dropdown {
|
||||
opacity: 1;
|
||||
}
|
||||
&:hover .menu-list-dropdown {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.menu-item-icon {
|
||||
|
@ -425,6 +418,7 @@ $vikunja-nav-selected-width: 0.4rem;
|
|||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
&:not(.dragging-disabled) .handle {
|
||||
cursor: grab;
|
||||
}
|
||||
|
@ -433,7 +427,7 @@ $vikunja-nav-selected-width: 0.4rem;
|
|||
|
||||
.top-menu {
|
||||
margin-top: math.div($navbar-padding, 2);
|
||||
|
||||
|
||||
.menu-list {
|
||||
li {
|
||||
font-weight: 600;
|
||||
|
@ -488,24 +482,17 @@ $vikunja-nav-selected-width: 0.4rem;
|
|||
.favorite {
|
||||
margin-left: .25rem;
|
||||
transition: opacity $transition, color $transition;
|
||||
opacity: 1;
|
||||
opacity: 0;
|
||||
|
||||
&:hover,
|
||||
&.is-favorite {
|
||||
color: var(--warning);
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@media(hover: hover) and (pointer: fine) {
|
||||
.list-menu .favorite {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.list-menu:hover .favorite,
|
||||
.favorite.is-favorite {
|
||||
opacity: 1;
|
||||
}
|
||||
.favorite.is-favorite,
|
||||
.list-menu:hover .favorite {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.list-menu-title {
|
||||
|
|
63
src/components/input/SelectList.vue
Normal file
63
src/components/input/SelectList.vue
Normal file
|
@ -0,0 +1,63 @@
|
|||
<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>
|
|
@ -1,63 +0,0 @@
|
|||
<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')
|
||||
return
|
||||
}
|
||||
const projectPrefix = text.value.substring(index, index + 1)
|
||||
const listPrefix = text.value.substring(index, index + 1)
|
||||
|
||||
console.debug({index, projectPrefix, checked, text: text.value})
|
||||
console.debug({index, listPrefix, checked, text: text.value})
|
||||
|
||||
text.value = replaceAt(text.value, index, `${projectPrefix} ${checked ? '[x]' : '[ ]'} `)
|
||||
text.value = replaceAt(text.value, index, `${listPrefix} ${checked ? '[x]' : '[ ]'} `)
|
||||
bubble()
|
||||
renderPreview()
|
||||
}
|
||||
|
|
200
src/components/list/ListWrapper.vue
Normal file
200
src/components/list/ListWrapper.vue
Normal file
|
@ -0,0 +1,200 @@
|
|||
<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>
|
|
@ -8,24 +8,24 @@
|
|||
</slot>
|
||||
</template>
|
||||
|
||||
<template v-if="isSavedFilter(project)">
|
||||
<template v-if="isSavedFilter(list)">
|
||||
<dropdown-item
|
||||
:to="{ name: 'filter.settings.edit', params: { projectId: project.id } }"
|
||||
:to="{ name: 'filter.settings.edit', params: { listId: list.id } }"
|
||||
icon="pen"
|
||||
>
|
||||
{{ $t('menu.edit') }}
|
||||
</dropdown-item>
|
||||
<dropdown-item
|
||||
:to="{ name: 'filter.settings.delete', params: { projectId: project.id } }"
|
||||
:to="{ name: 'filter.settings.delete', params: { listId: list.id } }"
|
||||
icon="trash-alt"
|
||||
>
|
||||
{{ $t('misc.delete') }}
|
||||
</dropdown-item>
|
||||
</template>
|
||||
|
||||
<template v-else-if="project.isArchived">
|
||||
<template v-else-if="list.isArchived">
|
||||
<dropdown-item
|
||||
:to="{ name: 'project.settings.archive', params: { projectId: project.id } }"
|
||||
:to="{ name: 'list.settings.archive', params: { listId: list.id } }"
|
||||
icon="archive"
|
||||
>
|
||||
{{ $t('menu.unarchive') }}
|
||||
|
@ -33,32 +33,32 @@
|
|||
</template>
|
||||
<template v-else>
|
||||
<dropdown-item
|
||||
:to="{ name: 'project.settings.edit', params: { projectId: project.id } }"
|
||||
:to="{ name: 'list.settings.edit', params: { listId: list.id } }"
|
||||
icon="pen"
|
||||
>
|
||||
{{ $t('menu.edit') }}
|
||||
</dropdown-item>
|
||||
<dropdown-item
|
||||
v-if="backgroundsEnabled"
|
||||
:to="{ name: 'project.settings.background', params: { projectId: project.id } }"
|
||||
:to="{ name: 'list.settings.background', params: { listId: list.id } }"
|
||||
icon="image"
|
||||
>
|
||||
{{ $t('menu.setBackground') }}
|
||||
</dropdown-item>
|
||||
<dropdown-item
|
||||
:to="{ name: 'project.settings.share', params: { projectId: project.id } }"
|
||||
:to="{ name: 'list.settings.share', params: { listId: list.id } }"
|
||||
icon="share-alt"
|
||||
>
|
||||
{{ $t('menu.share') }}
|
||||
</dropdown-item>
|
||||
<dropdown-item
|
||||
:to="{ name: 'project.settings.duplicate', params: { projectId: project.id } }"
|
||||
:to="{ name: 'list.settings.duplicate', params: { listId: list.id } }"
|
||||
icon="paste"
|
||||
>
|
||||
{{ $t('menu.duplicate') }}
|
||||
</dropdown-item>
|
||||
<dropdown-item
|
||||
:to="{ name: 'project.settings.archive', params: { projectId: project.id } }"
|
||||
:to="{ name: 'list.settings.archive', params: { listId: list.id } }"
|
||||
icon="archive"
|
||||
>
|
||||
{{ $t('menu.archive') }}
|
||||
|
@ -66,14 +66,14 @@
|
|||
<Subscription
|
||||
class="has-no-shadow"
|
||||
:is-button="false"
|
||||
entity="project"
|
||||
:entity-id="project.id"
|
||||
:model-value="project.subscription"
|
||||
entity="list"
|
||||
:entity-id="list.id"
|
||||
:model-value="list.subscription"
|
||||
@update:model-value="setSubscriptionInStore"
|
||||
type="dropdown"
|
||||
/>
|
||||
<dropdown-item
|
||||
:to="{ name: 'project.settings.delete', params: { projectId: project.id } }"
|
||||
:to="{ name: 'list.settings.delete', params: { listId: list.id } }"
|
||||
icon="trash-alt"
|
||||
class="has-text-danger"
|
||||
>
|
||||
|
@ -90,26 +90,26 @@ import BaseButton from '@/components/base/BaseButton.vue'
|
|||
import Dropdown from '@/components/misc/dropdown.vue'
|
||||
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
||||
import Subscription from '@/components/misc/subscription.vue'
|
||||
import type {IProject} from '@/modelTypes/IProject'
|
||||
import type {IList} from '@/modelTypes/IList'
|
||||
import type {ISubscription} from '@/modelTypes/ISubscription'
|
||||
|
||||
import {isSavedFilter} from '@/services/savedFilter'
|
||||
import {useConfigStore} from '@/stores/config'
|
||||
import {useProjectStore} from '@/stores/projects'
|
||||
import {useListStore} from '@/stores/lists'
|
||||
import {useNamespaceStore} from '@/stores/namespaces'
|
||||
|
||||
const props = defineProps({
|
||||
project: {
|
||||
type: Object as PropType<IProject>,
|
||||
list: {
|
||||
type: Object as PropType<IList>,
|
||||
required: true,
|
||||
},
|
||||
})
|
||||
|
||||
const projectStore = useProjectStore()
|
||||
const listStore = useListStore()
|
||||
const namespaceStore = useNamespaceStore()
|
||||
const subscription = ref<ISubscription | null>(null)
|
||||
watchEffect(() => {
|
||||
subscription.value = props.project.subscription ?? null
|
||||
subscription.value = props.list.subscription ?? null
|
||||
})
|
||||
|
||||
const configStore = useConfigStore()
|
||||
|
@ -117,11 +117,11 @@ const backgroundsEnabled = computed(() => configStore.enabledBackgroundProviders
|
|||
|
||||
function setSubscriptionInStore(sub: ISubscription) {
|
||||
subscription.value = sub
|
||||
const updatedProject = {
|
||||
...props.project,
|
||||
const updatedList = {
|
||||
...props.list,
|
||||
subscription: sub,
|
||||
}
|
||||
projectStore.setProject(updatedProject)
|
||||
namespaceStore.setProjectInNamespaceById(updatedProject)
|
||||
listStore.setList(updatedList)
|
||||
namespaceStore.setListInNamespaceById(updatedList)
|
||||
}
|
||||
</script>
|
|
@ -1,39 +1,39 @@
|
|||
<template>
|
||||
<div
|
||||
class="project-card"
|
||||
class="list-card"
|
||||
:class="{
|
||||
'has-light-text': background !== null,
|
||||
'has-background': blurHashUrl !== '' || background !== null
|
||||
}"
|
||||
:style="{
|
||||
'border-left': project.hexColor ? `0.25rem solid ${project.hexColor}` : undefined,
|
||||
'border-left': list.hexColor ? `0.25rem solid ${list.hexColor}` : undefined,
|
||||
'background-image': blurHashUrl !== '' ? `url(${blurHashUrl})` : undefined,
|
||||
}"
|
||||
>
|
||||
<div
|
||||
class="project-background background-fade-in"
|
||||
class="list-background background-fade-in"
|
||||
:class="{'is-visible': background}"
|
||||
:style="{'background-image': background !== null ? `url(${background})` : undefined}"
|
||||
/>
|
||||
<span v-if="project.isArchived" class="is-archived" >{{ $t('namespace.archived') }}</span>
|
||||
<span v-if="list.isArchived" class="is-archived" >{{ $t('namespace.archived') }}</span>
|
||||
|
||||
<div class="project-title" aria-hidden="true">{{ project.title }}</div>
|
||||
<div class="list-title" aria-hidden="true">{{ list.title }}</div>
|
||||
<BaseButton
|
||||
class="project-button"
|
||||
:aria-label="project.title"
|
||||
:title="project.description"
|
||||
class="list-button"
|
||||
:aria-label="list.title"
|
||||
:title="list.description"
|
||||
:to="{
|
||||
name: 'project.index',
|
||||
params: { projectId: project.id}
|
||||
name: 'list.index',
|
||||
params: { listId: list.id}
|
||||
}"
|
||||
/>
|
||||
<BaseButton
|
||||
v-if="!project.isArchived"
|
||||
v-if="!list.isArchived"
|
||||
class="favorite"
|
||||
:class="{'is-favorite': project.isFavorite}"
|
||||
@click.prevent.stop="projectStore.toggleProjectFavorite(project)"
|
||||
:class="{'is-favorite': list.isFavorite}"
|
||||
@click.prevent.stop="listStore.toggleListFavorite(list)"
|
||||
>
|
||||
<icon :icon="project.isFavorite ? 'star' : ['far', 'star']" />
|
||||
<icon :icon="list.isFavorite ? 'star' : ['far', 'star']" />
|
||||
</BaseButton>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -41,30 +41,30 @@
|
|||
<script lang="ts" setup>
|
||||
import {toRef, type PropType} from 'vue'
|
||||
|
||||
import type {IProject} from '@/modelTypes/IProject'
|
||||
import type {IList} from '@/modelTypes/IList'
|
||||
|
||||
import BaseButton from '@/components/base/BaseButton.vue'
|
||||
|
||||
import {useProjectBackground} from './useProjectBackground'
|
||||
import {useProjectStore} from '@/stores/projects'
|
||||
import {useListBackground} from './useListBackground'
|
||||
import {useListStore} from '@/stores/lists'
|
||||
|
||||
const props = defineProps({
|
||||
project: {
|
||||
type: Object as PropType<IProject>,
|
||||
list: {
|
||||
type: Object as PropType<IList>,
|
||||
required: true,
|
||||
},
|
||||
})
|
||||
|
||||
const {background, blurHashUrl} = useProjectBackground(toRef(props, 'project'))
|
||||
const {background, blurHashUrl} = useListBackground(toRef(props, 'list'))
|
||||
|
||||
const projectStore = useProjectStore()
|
||||
const listStore = useListStore()
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.project-card {
|
||||
--project-card-padding: 1rem;
|
||||
.list-card {
|
||||
--list-card-padding: 1rem;
|
||||
background: var(--white);
|
||||
padding: var(--project-card-padding);
|
||||
padding: var(--list-card-padding);
|
||||
border-radius: $radius;
|
||||
box-shadow: var(--shadow-sm);
|
||||
transition: box-shadow $transition;
|
||||
|
@ -91,14 +91,14 @@ const projectStore = useProjectStore()
|
|||
}
|
||||
|
||||
.has-background,
|
||||
.project-background {
|
||||
.list-background {
|
||||
background-size: cover;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
}
|
||||
|
||||
.project-background,
|
||||
.project-button {
|
||||
.list-background,
|
||||
.list-button {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
|
@ -111,7 +111,7 @@ const projectStore = useProjectStore()
|
|||
float: left;
|
||||
}
|
||||
|
||||
.project-title {
|
||||
.list-title {
|
||||
align-self: flex-end;
|
||||
font-family: $vikunja-font;
|
||||
font-weight: 400;
|
||||
|
@ -120,7 +120,7 @@ const projectStore = useProjectStore()
|
|||
color: var(--text);
|
||||
width: 100%;
|
||||
margin-bottom: 0;
|
||||
max-height: calc(100% - (var(--project-card-padding) + 1rem)); // padding & height of the "is archived" badge
|
||||
max-height: calc(100% - (var(--list-card-padding) + 1rem)); // padding & height of the "is archived" badge
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
word-break: break-word;
|
||||
|
@ -130,11 +130,11 @@ const projectStore = useProjectStore()
|
|||
-webkit-box-orient: vertical;
|
||||
}
|
||||
|
||||
.has-light-text .project-title {
|
||||
.has-light-text .list-title {
|
||||
color: var(--grey-100);
|
||||
}
|
||||
|
||||
.has-background .project-title {
|
||||
.has-background .list-title {
|
||||
text-shadow:
|
||||
0 0 10px var(--black),
|
||||
1px 1px 5px var(--grey-700),
|
||||
|
@ -144,10 +144,10 @@ const projectStore = useProjectStore()
|
|||
|
||||
.favorite {
|
||||
position: absolute;
|
||||
top: var(--project-card-padding);
|
||||
right: var(--project-card-padding);
|
||||
top: var(--list-card-padding);
|
||||
right: var(--list-card-padding);
|
||||
transition: opacity $transition, color $transition;
|
||||
opacity: 1;
|
||||
opacity: 0;
|
||||
|
||||
&:hover {
|
||||
color: var(--warning);
|
||||
|
@ -160,14 +160,8 @@ const projectStore = useProjectStore()
|
|||
}
|
||||
}
|
||||
|
||||
@media(hover: hover) and (pointer: fine) {
|
||||
.project-card .favorite {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.project-card:hover .favorite {
|
||||
opacity: 1;
|
||||
}
|
||||
.list-card:hover .favorite {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.background-fade-in {
|
||||
|
@ -179,4 +173,4 @@ const projectStore = useProjectStore()
|
|||
opacity: 1;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
77
src/components/list/partials/ListCardGrid.vue
Normal file
77
src/components/list/partials/ListCardGrid.vue
Normal file
|
@ -0,0 +1,77 @@
|
|||
<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>
|
|
@ -32,7 +32,7 @@
|
|||
<script setup lang="ts">
|
||||
import {computed, ref, watch} from 'vue'
|
||||
|
||||
import Filters from '@/components/project/partials/filters.vue'
|
||||
import Filters from '@/components/list/partials/filters.vue'
|
||||
|
||||
import {getDefaultParams} from '@/composables/useTaskList'
|
||||
|
|
@ -20,7 +20,7 @@
|
|||
{{ $t('filters.attributes.showDoneTasks') }}
|
||||
</fancycheckbox>
|
||||
<fancycheckbox
|
||||
v-if="!['project.kanban', 'project.table'].includes($route.name as string)"
|
||||
v-if="!['list.kanban', 'list.table'].includes($route.name as string)"
|
||||
v-model="sortAlphabetically"
|
||||
@update:model-value="change()"
|
||||
>
|
||||
|
@ -154,14 +154,14 @@
|
|||
</div>
|
||||
|
||||
<template
|
||||
v-if="['filters.create', 'project.edit', 'filter.settings.edit'].includes($route.name as string)">
|
||||
v-if="['filters.create', 'list.edit', 'filter.settings.edit'].includes($route.name as string)">
|
||||
<div class="field">
|
||||
<label class="label">{{ $t('project.lists') }}</label>
|
||||
<label class="label">{{ $t('list.lists') }}</label>
|
||||
<div class="control">
|
||||
<SelectProject
|
||||
v-model="entities.projects"
|
||||
@select="changeMultiselectFilter('projects', 'project_id')"
|
||||
@remove="changeMultiselectFilter('projects', 'project_id')"
|
||||
<SelectList
|
||||
v-model="entities.lists"
|
||||
@select="changeMultiselectFilter('lists', 'list_id')"
|
||||
@remove="changeMultiselectFilter('lists', 'list_id')"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -190,7 +190,7 @@ import {camelCase} from 'camel-case'
|
|||
import type {ILabel} from '@/modelTypes/ILabel'
|
||||
import type {IUser} from '@/modelTypes/IUser'
|
||||
import type {INamespace} from '@/modelTypes/INamespace'
|
||||
import type {IProject} from '@/modelTypes/IProject'
|
||||
import type {IList} from '@/modelTypes/IList'
|
||||
|
||||
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 Fancycheckbox from '@/components/input/fancycheckbox.vue'
|
||||
import SelectUser from '@/components/input/SelectUser.vue'
|
||||
import SelectProject from '@/components/input/SelectProject.vue'
|
||||
import SelectList from '@/components/input/SelectList.vue'
|
||||
import SelectNamespace from '@/components/input/SelectNamespace.vue'
|
||||
|
||||
import {parseDateOrString} from '@/helpers/time/parseDateOrString'
|
||||
|
@ -208,13 +208,13 @@ import {dateIsValid, formatISO} from '@/helpers/time/formatDate'
|
|||
import {objectToSnakeCase} from '@/helpers/case'
|
||||
|
||||
import UserService from '@/services/user'
|
||||
import ProjectService from '@/services/project'
|
||||
import ListService from '@/services/list'
|
||||
import NamespaceService from '@/services/namespace'
|
||||
|
||||
// FIXME: do not use this here for now. instead create new version from DEFAULT_PARAMS
|
||||
import {getDefaultParams} from '@/composables/useTaskList'
|
||||
|
||||
// FIXME: merge with DEFAULT_PARAMS in taskProject.js
|
||||
// FIXME: merge with DEFAULT_PARAMS in taskList.js
|
||||
const DEFAULT_PARAMS = {
|
||||
sort_by: [],
|
||||
order_by: [],
|
||||
|
@ -239,7 +239,7 @@ const DEFAULT_FILTERS = {
|
|||
reminders: '',
|
||||
assignees: '',
|
||||
labels: '',
|
||||
project_id: '',
|
||||
list_id: '',
|
||||
namespace: '',
|
||||
} as const
|
||||
|
||||
|
@ -264,23 +264,23 @@ const filters = ref({...DEFAULT_FILTERS})
|
|||
|
||||
const services = {
|
||||
users: shallowReactive(new UserService()),
|
||||
projects: shallowReactive(new ProjectService()),
|
||||
lists: shallowReactive(new ListService()),
|
||||
namespace: shallowReactive(new NamespaceService()),
|
||||
}
|
||||
|
||||
interface Entities {
|
||||
users: IUser[]
|
||||
labels: ILabel[]
|
||||
projects: IProject[]
|
||||
lists: IList[]
|
||||
namespace: INamespace[]
|
||||
}
|
||||
|
||||
type EntityType = 'users' | 'labels' | 'projects' | 'namespace'
|
||||
type EntityType = 'users' | 'labels' | 'lists' | 'namespace'
|
||||
|
||||
const entities: Entities = reactive({
|
||||
users: [],
|
||||
labels: [],
|
||||
projects: [],
|
||||
lists: [],
|
||||
namespace: [],
|
||||
})
|
||||
|
||||
|
@ -327,7 +327,7 @@ function prepareFilters() {
|
|||
prepareSingleValue('percent_done', 'percentDone', 'usePercentDone', true)
|
||||
prepareDate('reminders')
|
||||
prepareRelatedObjectFilter('users', 'assignees')
|
||||
prepareRelatedObjectFilter('projects', 'project_id')
|
||||
prepareRelatedObjectFilter('lists', 'list_id')
|
||||
prepareRelatedObjectFilter('namespace')
|
||||
|
||||
prepareSingleValue('labels')
|
|
@ -1,30 +1,30 @@
|
|||
import {ref, watch, type Ref} from 'vue'
|
||||
import ProjectService from '@/services/project'
|
||||
import type {IProject} from '@/modelTypes/IProject'
|
||||
import ListService from '@/services/list'
|
||||
import type {IList} from '@/modelTypes/IList'
|
||||
import {getBlobFromBlurHash} from '@/helpers/getBlobFromBlurHash'
|
||||
|
||||
export function useProjectBackground(project: Ref<IProject>) {
|
||||
export function useListBackground(list: Ref<IList>) {
|
||||
const background = ref<string | null>(null)
|
||||
const backgroundLoading = ref(false)
|
||||
const blurHashUrl = ref('')
|
||||
|
||||
watch(
|
||||
() => [project.value.id, project.value.backgroundBlurHash] as [IProject['id'], IProject['backgroundBlurHash']],
|
||||
async ([projectId, blurHash], oldValue) => {
|
||||
() => [list.value.id, list.value.backgroundBlurHash] as [IList['id'], IList['backgroundBlurHash']],
|
||||
async ([listId, blurHash], oldValue) => {
|
||||
if (
|
||||
project.value === null ||
|
||||
!project.value.backgroundInformation ||
|
||||
list.value === null ||
|
||||
!list.value.backgroundInformation ||
|
||||
backgroundLoading.value
|
||||
) {
|
||||
return
|
||||
}
|
||||
|
||||
const [oldProjectId, oldBlurHash] = oldValue || []
|
||||
const [oldListId, oldBlurHash] = oldValue || []
|
||||
if (
|
||||
oldValue !== undefined &&
|
||||
projectId === oldProjectId && blurHash === oldBlurHash
|
||||
oldValue !== undefined &&
|
||||
listId === oldListId && blurHash === oldBlurHash
|
||||
) {
|
||||
// project hasn't changed
|
||||
// list hasn't changed
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -35,8 +35,8 @@ export function useProjectBackground(project: Ref<IProject>) {
|
|||
blurHashUrl.value = blurHash ? window.URL.createObjectURL(blurHash) : ''
|
||||
})
|
||||
|
||||
const projectService = new ProjectService()
|
||||
const backgroundPromise = projectService.background(project.value).then((result) => {
|
||||
const listService = new ListService()
|
||||
const backgroundPromise = listService.background(list.value).then((result) => {
|
||||
background.value = result
|
||||
})
|
||||
await Promise.all([blurHashPromise, backgroundPromise])
|
||||
|
@ -44,7 +44,7 @@ export function useProjectBackground(project: Ref<IProject>) {
|
|||
backgroundLoading.value = false
|
||||
}
|
||||
},
|
||||
{immediate: true},
|
||||
{ immediate: true },
|
||||
)
|
||||
|
||||
return {
|
||||
|
@ -52,4 +52,4 @@ export function useProjectBackground(project: Ref<IProject>) {
|
|||
blurHashUrl,
|
||||
backgroundLoading,
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
<template>
|
||||
<modal @close="close()">
|
||||
<card class="has-background-white keyboard-shortcuts" :shadow="false" :title="$t('keyboardShortcuts.title')">
|
||||
<card class="has-background-white has-no-shadow keyboard-shortcuts" :title="$t('keyboardShortcuts.title')">
|
||||
<template v-for="(s, i) in shortcuts" :key="i">
|
||||
<h3>{{ $t(s.title) }}</h3>
|
||||
|
||||
|
|
|
@ -61,8 +61,8 @@ export const KEYBOARD_SHORTCUTS : ShortcutGroup[] = [
|
|||
],
|
||||
},
|
||||
{
|
||||
title: 'project.kanban.title',
|
||||
available: (route) => route.name === 'project.kanban',
|
||||
title: 'list.kanban.title',
|
||||
available: (route) => route.name === 'list.kanban',
|
||||
shortcuts: [
|
||||
{
|
||||
title: 'keyboardShortcuts.task.done',
|
||||
|
@ -71,26 +71,26 @@ export const KEYBOARD_SHORTCUTS : ShortcutGroup[] = [
|
|||
],
|
||||
},
|
||||
{
|
||||
title: 'keyboardShortcuts.project.title',
|
||||
available: (route) => (route.name as string)?.startsWith('project.'),
|
||||
title: 'keyboardShortcuts.list.title',
|
||||
available: (route) => (route.name as string)?.startsWith('list.'),
|
||||
shortcuts: [
|
||||
{
|
||||
title: 'keyboardShortcuts.project.switchToListView',
|
||||
title: 'keyboardShortcuts.list.switchToListView',
|
||||
keys: ['g', 'l'],
|
||||
combination: 'then',
|
||||
},
|
||||
{
|
||||
title: 'keyboardShortcuts.project.switchToGanttView',
|
||||
title: 'keyboardShortcuts.list.switchToGanttView',
|
||||
keys: ['g', 'g'],
|
||||
combination: 'then',
|
||||
},
|
||||
{
|
||||
title: 'keyboardShortcuts.project.switchToTableView',
|
||||
title: 'keyboardShortcuts.list.switchToTableView',
|
||||
keys: ['g', 't'],
|
||||
combination: 'then',
|
||||
},
|
||||
{
|
||||
title: 'keyboardShortcuts.project.switchToKanbanView',
|
||||
title: 'keyboardShortcuts.list.switchToKanbanView',
|
||||
keys: ['g', 'k'],
|
||||
combination: 'then',
|
||||
},
|
||||
|
|
|
@ -63,7 +63,7 @@ const route = useRoute()
|
|||
const baseStore = useBaseStore()
|
||||
|
||||
const ready = computed(() => baseStore.ready)
|
||||
const online = true
|
||||
const online = useOnline()
|
||||
|
||||
const error = ref('')
|
||||
const showLoading = computed(() => !ready.value && error.value === '')
|
||||
|
|
|
@ -73,14 +73,14 @@ const {t} = useI18n({useScope: 'global'})
|
|||
|
||||
const tooltipText = computed(() => {
|
||||
if (disabled.value) {
|
||||
if (props.entity === 'project' && subscriptionEntity.value === 'namespace') {
|
||||
return t('task.subscription.subscribedProjectThroughParentNamespace')
|
||||
if (props.entity === 'list' && subscriptionEntity.value === 'namespace') {
|
||||
return t('task.subscription.subscribedListThroughParentNamespace')
|
||||
}
|
||||
if (props.entity === 'task' && subscriptionEntity.value === 'namespace') {
|
||||
return t('task.subscription.subscribedTaskThroughParentNamespace')
|
||||
}
|
||||
if (props.entity === 'task' && subscriptionEntity.value === 'project') {
|
||||
return t('task.subscription.subscribedTaskThroughParentProject')
|
||||
if (props.entity === 'task' && subscriptionEntity.value === 'list') {
|
||||
return t('task.subscription.subscribedTaskThroughParentList')
|
||||
}
|
||||
|
||||
return ''
|
||||
|
@ -91,10 +91,10 @@ const tooltipText = computed(() => {
|
|||
return props.modelValue !== null ?
|
||||
t('task.subscription.subscribedNamespace') :
|
||||
t('task.subscription.notSubscribedNamespace')
|
||||
case 'project':
|
||||
case 'list':
|
||||
return props.modelValue !== null ?
|
||||
t('task.subscription.subscribedProject') :
|
||||
t('task.subscription.notSubscribedProject')
|
||||
t('task.subscription.subscribedList') :
|
||||
t('task.subscription.notSubscribedList')
|
||||
case 'task':
|
||||
return props.modelValue !== null ?
|
||||
t('task.subscription.subscribedTask') :
|
||||
|
@ -133,8 +133,8 @@ async function subscribe() {
|
|||
case 'namespace':
|
||||
message = t('task.subscription.subscribeSuccessNamespace')
|
||||
break
|
||||
case 'project':
|
||||
message = t('task.subscription.subscribeSuccessProject')
|
||||
case 'list':
|
||||
message = t('task.subscription.subscribeSuccessList')
|
||||
break
|
||||
case 'task':
|
||||
message = t('task.subscription.subscribeSuccessTask')
|
||||
|
@ -156,8 +156,8 @@ async function unsubscribe() {
|
|||
case 'namespace':
|
||||
message = t('task.subscription.unsubscribeSuccessNamespace')
|
||||
break
|
||||
case 'project':
|
||||
message = t('task.subscription.unsubscribeSuccessProject')
|
||||
case 'list':
|
||||
message = t('task.subscription.unsubscribeSuccessList')
|
||||
break
|
||||
case 'task':
|
||||
message = t('task.subscription.unsubscribeSuccessTask')
|
||||
|
|
|
@ -30,10 +30,10 @@
|
|||
{{ $t('menu.share') }}
|
||||
</dropdown-item>
|
||||
<dropdown-item
|
||||
:to="{ name: 'project.create', params: { namespaceId: namespace.id } }"
|
||||
:to="{ name: 'list.create', params: { namespaceId: namespace.id } }"
|
||||
icon="plus"
|
||||
>
|
||||
{{ $t('menu.newProject') }}
|
||||
{{ $t('menu.newList') }}
|
||||
</dropdown-item>
|
||||
<dropdown-item
|
||||
:to="{ name: 'namespace.settings.archive', params: { id: namespace.id } }"
|
||||
|
|
|
@ -80,9 +80,9 @@ const userInfo = computed(() => authStore.info)
|
|||
let interval: ReturnType<typeof setInterval>
|
||||
|
||||
onMounted(() => {
|
||||
// loadNotifications()
|
||||
loadNotifications()
|
||||
document.addEventListener('click', hidePopup)
|
||||
// interval = setInterval(loadNotifications, LOAD_NOTIFICATIONS_INTERVAL)
|
||||
interval = setInterval(loadNotifications, LOAD_NOTIFICATIONS_INTERVAL)
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
|
@ -117,9 +117,9 @@ function to(n, index) {
|
|||
case names.TASK_DELETED:
|
||||
// Nothing
|
||||
break
|
||||
case names.PROJECT_CREATED:
|
||||
case names.LIST_CREATED:
|
||||
to.name = 'task.index'
|
||||
to.params.projectId = n.notification.project.id
|
||||
to.params.listId = n.notification.list.id
|
||||
break
|
||||
case names.TEAM_MEMBER_ADDED:
|
||||
to.name = 'teams.edit'
|
||||
|
|
|
@ -1,200 +0,0 @@
|
|||
<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,73 +0,0 @@
|
|||
<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>
|
|
@ -63,18 +63,18 @@ import TeamService from '@/services/team'
|
|||
|
||||
import NamespaceModel from '@/models/namespace'
|
||||
import TeamModel from '@/models/team'
|
||||
import ProjectModel from '@/models/project'
|
||||
import ListModel from '@/models/list'
|
||||
|
||||
import BaseButton from '@/components/base/BaseButton.vue'
|
||||
import QuickAddMagic from '@/components/tasks/partials/quick-add-magic.vue'
|
||||
|
||||
import {useBaseStore} from '@/stores/base'
|
||||
import {useProjectStore} from '@/stores/projects'
|
||||
import {useListStore} from '@/stores/lists'
|
||||
import {useNamespaceStore} from '@/stores/namespaces'
|
||||
import {useLabelStore} from '@/stores/labels'
|
||||
import {useTaskStore} from '@/stores/tasks'
|
||||
|
||||
import {getHistory} from '@/modules/projectHistory'
|
||||
import {getHistory} from '@/modules/listHistory'
|
||||
import {parseTaskText, PrefixMode, PREFIXES} from '@/modules/parseTaskText'
|
||||
import {getQuickAddMagicMode} from '@/helpers/quickAddMagicMode'
|
||||
import {success} from '@/message'
|
||||
|
@ -82,13 +82,13 @@ import {success} from '@/message'
|
|||
import type {ITeam} from '@/modelTypes/ITeam'
|
||||
import type {ITask} from '@/modelTypes/ITask'
|
||||
import type {INamespace} from '@/modelTypes/INamespace'
|
||||
import type {IProject} from '@/modelTypes/IProject'
|
||||
import type {IList} from '@/modelTypes/IList'
|
||||
|
||||
const {t} = useI18n({useScope: 'global'})
|
||||
const router = useRouter()
|
||||
|
||||
const baseStore = useBaseStore()
|
||||
const projectStore = useProjectStore()
|
||||
const listStore = useListStore()
|
||||
const namespaceStore = useNamespaceStore()
|
||||
const labelStore = useLabelStore()
|
||||
const taskStore = useTaskStore()
|
||||
|
@ -98,13 +98,13 @@ type DoAction<Type = any> = { type: ACTION_TYPE } & Type
|
|||
enum ACTION_TYPE {
|
||||
CMD = 'cmd',
|
||||
TASK = 'task',
|
||||
PROJECT = 'project',
|
||||
LIST = 'list',
|
||||
TEAM = 'team',
|
||||
}
|
||||
|
||||
enum COMMAND_TYPE {
|
||||
NEW_TASK = 'newTask',
|
||||
NEW_PROJECT = 'newProject',
|
||||
NEW_LIST = 'newList',
|
||||
NEW_NAMESPACE = 'newNamespace',
|
||||
NEW_TEAM = 'newTeam',
|
||||
}
|
||||
|
@ -112,7 +112,7 @@ enum COMMAND_TYPE {
|
|||
enum SEARCH_MODE {
|
||||
ALL = 'all',
|
||||
TASKS = 'tasks',
|
||||
PROJECTS = 'projects',
|
||||
LISTS = 'lists',
|
||||
TEAMS = 'teams',
|
||||
}
|
||||
|
||||
|
@ -137,26 +137,26 @@ function closeQuickActions() {
|
|||
baseStore.setQuickActionsActive(false)
|
||||
}
|
||||
|
||||
const foundProjects = computed(() => {
|
||||
const { project } = parsedQuery.value
|
||||
const foundLists = computed(() => {
|
||||
const { list } = parsedQuery.value
|
||||
if (
|
||||
searchMode.value === SEARCH_MODE.ALL ||
|
||||
searchMode.value === SEARCH_MODE.PROJECTS ||
|
||||
project === null
|
||||
searchMode.value === SEARCH_MODE.LISTS ||
|
||||
list === null
|
||||
) {
|
||||
return []
|
||||
}
|
||||
|
||||
const ncache: { [id: ProjectModel['id']]: INamespace } = {}
|
||||
const ncache: { [id: ListModel['id']]: INamespace } = {}
|
||||
const history = getHistory()
|
||||
const allProjects = [
|
||||
const allLists = [
|
||||
...new Set([
|
||||
...history.map((l) => projectStore.getProjectById(l.id)),
|
||||
...projectStore.searchProject(project),
|
||||
...history.map((l) => listStore.getListById(l.id)),
|
||||
...listStore.searchList(list),
|
||||
]),
|
||||
]
|
||||
|
||||
return allProjects.filter((l) => {
|
||||
return allLists.filter((l) => {
|
||||
if (typeof l === 'undefined' || l === null) {
|
||||
return false
|
||||
}
|
||||
|
@ -191,9 +191,9 @@ const results = computed<Result[]>(() => {
|
|||
items: foundTasks.value,
|
||||
},
|
||||
{
|
||||
type: ACTION_TYPE.PROJECT,
|
||||
title: t('quickActions.projects'),
|
||||
items: foundProjects.value,
|
||||
type: ACTION_TYPE.LIST,
|
||||
title: t('quickActions.lists'),
|
||||
items: foundLists.value,
|
||||
},
|
||||
{
|
||||
type: ACTION_TYPE.TEAM,
|
||||
|
@ -206,7 +206,7 @@ const results = computed<Result[]>(() => {
|
|||
const loading = computed(() =>
|
||||
taskService.loading ||
|
||||
namespaceStore.isLoading ||
|
||||
projectStore.isLoading ||
|
||||
listStore.isLoading ||
|
||||
teamService.loading,
|
||||
)
|
||||
|
||||
|
@ -224,11 +224,11 @@ const commands = computed<{ [key in COMMAND_TYPE]: Command }>(() => ({
|
|||
placeholder: t('quickActions.newTask'),
|
||||
action: newTask,
|
||||
},
|
||||
newProject: {
|
||||
type: COMMAND_TYPE.NEW_PROJECT,
|
||||
title: t('quickActions.cmds.newProject'),
|
||||
placeholder: t('quickActions.newProject'),
|
||||
action: newProject,
|
||||
newList: {
|
||||
type: COMMAND_TYPE.NEW_LIST,
|
||||
title: t('quickActions.cmds.newList'),
|
||||
placeholder: t('quickActions.newList'),
|
||||
action: newList,
|
||||
},
|
||||
newNamespace: {
|
||||
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 currentProject = computed(() => Object.keys(baseStore.currentProject).length === 0
|
||||
const currentList = computed(() => Object.keys(baseStore.currentList).length === 0
|
||||
? null
|
||||
: baseStore.currentProject,
|
||||
: baseStore.currentList,
|
||||
)
|
||||
|
||||
const hintText = computed(() => {
|
||||
let namespace
|
||||
if (selectedCmd.value !== null && currentProject.value !== null) {
|
||||
if (selectedCmd.value !== null && currentList.value !== null) {
|
||||
switch (selectedCmd.value.type) {
|
||||
case COMMAND_TYPE.NEW_TASK:
|
||||
return t('quickActions.createTask', {
|
||||
title: currentProject.value.title,
|
||||
title: currentList.value.title,
|
||||
})
|
||||
case COMMAND_TYPE.NEW_PROJECT:
|
||||
case COMMAND_TYPE.NEW_LIST:
|
||||
namespace = namespaceStore.getNamespaceById(
|
||||
currentProject.value.namespaceId,
|
||||
currentList.value.namespaceId,
|
||||
)
|
||||
return t('quickActions.createProject', {
|
||||
return t('quickActions.createList', {
|
||||
title: namespace?.title,
|
||||
})
|
||||
}
|
||||
|
@ -275,8 +275,8 @@ const hintText = computed(() => {
|
|||
|
||||
const availableCmds = computed(() => {
|
||||
const cmds = []
|
||||
if (currentProject.value !== null) {
|
||||
cmds.push(commands.value.newTask, commands.value.newProject)
|
||||
if (currentList.value !== null) {
|
||||
cmds.push(commands.value.newTask, commands.value.newList)
|
||||
}
|
||||
cmds.push(commands.value.newNamespace, commands.value.newTeam)
|
||||
return cmds
|
||||
|
@ -288,21 +288,21 @@ const searchMode = computed(() => {
|
|||
if (query.value === '') {
|
||||
return SEARCH_MODE.ALL
|
||||
}
|
||||
const { text, project, labels, assignees } = parsedQuery.value
|
||||
const { text, list, labels, assignees } = parsedQuery.value
|
||||
if (assignees.length === 0 && text !== '') {
|
||||
return SEARCH_MODE.TASKS
|
||||
}
|
||||
if (
|
||||
assignees.length === 0 &&
|
||||
project !== null &&
|
||||
list !== null &&
|
||||
text === '' &&
|
||||
labels.length === 0
|
||||
) {
|
||||
return SEARCH_MODE.PROJECTS
|
||||
return SEARCH_MODE.LISTS
|
||||
}
|
||||
if (
|
||||
assignees.length > 0 &&
|
||||
project === null &&
|
||||
list === null &&
|
||||
text === '' &&
|
||||
labels.length === 0
|
||||
) {
|
||||
|
@ -356,7 +356,7 @@ function searchTasks() {
|
|||
taskSearchTimeout.value = null
|
||||
}
|
||||
|
||||
const { text, project: projectName, labels } = parsedQuery.value
|
||||
const { text, list: listName, labels } = parsedQuery.value
|
||||
|
||||
const filters: Filter[] = []
|
||||
|
||||
|
@ -373,10 +373,10 @@ function searchTasks() {
|
|||
})
|
||||
}
|
||||
|
||||
if (projectName !== null) {
|
||||
const project = projectStore.findProjectByExactname(projectName)
|
||||
if (project !== null) {
|
||||
addFilter('projectId', project.id, 'equals')
|
||||
if (listName !== null) {
|
||||
const list = listStore.findListByExactname(listName)
|
||||
if (list !== null) {
|
||||
addFilter('listId', list.id, 'equals')
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -396,9 +396,9 @@ function searchTasks() {
|
|||
const r = await taskService.getAll({}, params) as DoAction<ITask>[]
|
||||
foundTasks.value = r.map((t) => {
|
||||
t.type = ACTION_TYPE.TASK
|
||||
const project = projectStore.getProjectById(t.projectId)
|
||||
if (project !== null) {
|
||||
t.title = `${t.title} (${project.title})`
|
||||
const list = listStore.getListById(t.listId)
|
||||
if (list !== null) {
|
||||
t.title = `${t.title} (${list.title})`
|
||||
}
|
||||
return t
|
||||
})
|
||||
|
@ -428,7 +428,7 @@ function searchTeams() {
|
|||
teamService.getAll({}, { s: t }),
|
||||
)
|
||||
const teamsResult = await Promise.all(teamSearchPromises)
|
||||
foundTeams.value = teamsResult.flat().map((team) => {
|
||||
foundTeams.value = teamsResult.flatMap((team) => {
|
||||
team.title = team.name
|
||||
return team
|
||||
})
|
||||
|
@ -444,11 +444,11 @@ const searchInput = ref<HTMLElement | null>(null)
|
|||
|
||||
async function doAction(type: ACTION_TYPE, item: DoAction) {
|
||||
switch (type) {
|
||||
case ACTION_TYPE.PROJECT:
|
||||
case ACTION_TYPE.LIST:
|
||||
closeQuickActions()
|
||||
await router.push({
|
||||
name: 'project.index',
|
||||
params: { projectId: (item as DoAction<IProject>).id },
|
||||
name: 'list.index',
|
||||
params: { listId: (item as DoAction<IList>).id },
|
||||
})
|
||||
break
|
||||
case ACTION_TYPE.TASK:
|
||||
|
@ -458,13 +458,6 @@ async function doAction(type: ACTION_TYPE, item: DoAction) {
|
|||
params: { id: (item as DoAction<ITask>).id },
|
||||
})
|
||||
break
|
||||
case ACTION_TYPE.TEAM:
|
||||
closeQuickActions()
|
||||
await router.push({
|
||||
name: 'teams.edit',
|
||||
params: { id: (item as DoAction<ITeam>).id },
|
||||
})
|
||||
break
|
||||
case ACTION_TYPE.CMD:
|
||||
query.value = ''
|
||||
selectedCmd.value = item as DoAction<Command>
|
||||
|
@ -489,29 +482,29 @@ async function doCmd() {
|
|||
}
|
||||
|
||||
async function newTask() {
|
||||
if (currentProject.value === null) {
|
||||
if (currentList.value === null) {
|
||||
return
|
||||
}
|
||||
const task = await taskStore.createNewTask({
|
||||
title: query.value,
|
||||
projectId: currentProject.value.id,
|
||||
listId: currentList.value.id,
|
||||
})
|
||||
success({ message: t('task.createSuccess') })
|
||||
await router.push({ name: 'task.detail', params: { id: task.id } })
|
||||
}
|
||||
|
||||
async function newProject() {
|
||||
if (currentProject.value === null) {
|
||||
async function newList() {
|
||||
if (currentList.value === null) {
|
||||
return
|
||||
}
|
||||
const newProject = await projectStore.createProject(new ProjectModel({
|
||||
const newList = await listStore.createList(new ListModel({
|
||||
title: query.value,
|
||||
namespaceId: currentProject.value.namespaceId,
|
||||
namespaceId: currentList.value.namespaceId,
|
||||
}))
|
||||
success({ message: t('project.create.createdSuccess')})
|
||||
success({ message: t('list.create.createdSuccess')})
|
||||
await router.push({
|
||||
name: 'project.index',
|
||||
params: { projectId: newProject.id },
|
||||
name: 'list.index',
|
||||
params: { listId: newList.id },
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -1,39 +1,39 @@
|
|||
<template>
|
||||
<div>
|
||||
<p class="has-text-weight-bold">
|
||||
{{ $t('project.share.links.title') }}
|
||||
{{ $t('list.share.links.title') }}
|
||||
<span
|
||||
class="is-size-7 has-text-grey is-italic ml-3"
|
||||
v-tooltip="$t('project.share.links.explanation')">
|
||||
{{ $t('project.share.links.what') }}
|
||||
v-tooltip="$t('list.share.links.explanation')">
|
||||
{{ $t('list.share.links.what') }}
|
||||
</span>
|
||||
</p>
|
||||
|
||||
<div class="sharables-project">
|
||||
<div class="sharables-list">
|
||||
<x-button
|
||||
v-if="!(linkShares.length === 0 || showNewForm)"
|
||||
@click="showNewForm = true"
|
||||
icon="plus"
|
||||
class="mb-4">
|
||||
{{ $t('project.share.links.create') }}
|
||||
{{ $t('list.share.links.create') }}
|
||||
</x-button>
|
||||
|
||||
<div class="p-4" v-if="linkShares.length === 0 || showNewForm">
|
||||
<div class="field">
|
||||
<label class="label" for="linkShareRight">
|
||||
{{ $t('project.share.right.title') }}
|
||||
{{ $t('list.share.right.title') }}
|
||||
</label>
|
||||
<div class="control">
|
||||
<div class="select">
|
||||
<select v-model="selectedRight" id="linkShareRight">
|
||||
<option :value="RIGHTS.READ">
|
||||
{{ $t('project.share.right.read') }}
|
||||
{{ $t('list.share.right.read') }}
|
||||
</option>
|
||||
<option :value="RIGHTS.READ_WRITE">
|
||||
{{ $t('project.share.right.readWrite') }}
|
||||
{{ $t('list.share.right.readWrite') }}
|
||||
</option>
|
||||
<option :value="RIGHTS.ADMIN">
|
||||
{{ $t('project.share.right.admin') }}
|
||||
{{ $t('list.share.right.admin') }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
@ -41,21 +41,21 @@
|
|||
</div>
|
||||
<div class="field">
|
||||
<label class="label" for="linkShareName">
|
||||
{{ $t('project.share.links.name') }}
|
||||
{{ $t('list.share.links.name') }}
|
||||
</label>
|
||||
<div class="control">
|
||||
<input
|
||||
id="linkShareName"
|
||||
class="input"
|
||||
:placeholder="$t('project.share.links.namePlaceholder')"
|
||||
v-tooltip="$t('project.share.links.nameExplanation')"
|
||||
:placeholder="$t('list.share.links.namePlaceholder')"
|
||||
v-tooltip="$t('list.share.links.nameExplanation')"
|
||||
v-model="name"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label" for="linkSharePassword">
|
||||
{{ $t('project.share.links.password') }}
|
||||
{{ $t('list.share.links.password') }}
|
||||
</label>
|
||||
<div class="control">
|
||||
<input
|
||||
|
@ -63,25 +63,25 @@
|
|||
type="password"
|
||||
class="input"
|
||||
:placeholder="$t('user.auth.passwordPlaceholder')"
|
||||
v-tooltip="$t('project.share.links.passwordExplanation')"
|
||||
v-tooltip="$t('list.share.links.passwordExplanation')"
|
||||
v-model="password"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<x-button @click="add(projectId)" icon="plus">
|
||||
{{ $t('project.share.share') }}
|
||||
<x-button @click="add(listId)" icon="plus">
|
||||
{{ $t('list.share.share') }}
|
||||
</x-button>
|
||||
</div>
|
||||
|
||||
<table
|
||||
class="table has-actions is-striped is-hoverable is-fullwidth"
|
||||
class="table has-actions is-striped is-hoverable is-fullwidth link-share-list"
|
||||
v-if="linkShares.length > 0"
|
||||
>
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>{{ $t('project.share.links.view') }}</th>
|
||||
<th>{{ $t('project.share.attributes.delete') }}</th>
|
||||
<th>{{ $t('list.share.links.view') }}</th>
|
||||
<th>{{ $t('list.share.attributes.delete') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -92,7 +92,7 @@
|
|||
</p>
|
||||
|
||||
<p class="mb-2">
|
||||
<i18n-t keypath="project.share.links.sharedBy" scope="global">
|
||||
<i18n-t keypath="list.share.links.sharedBy" scope="global">
|
||||
<strong>{{ getDisplayName(s.sharedBy) }}</strong>
|
||||
</i18n-t>
|
||||
</p>
|
||||
|
@ -102,19 +102,19 @@
|
|||
<span class="icon is-small">
|
||||
<icon icon="lock"/>
|
||||
</span>
|
||||
{{ $t('project.share.right.admin') }}
|
||||
{{ $t('list.share.right.admin') }}
|
||||
</template>
|
||||
<template v-else-if="s.right === RIGHTS.READ_WRITE">
|
||||
<span class="icon is-small">
|
||||
<icon icon="pen"/>
|
||||
</span>
|
||||
{{ $t('project.share.right.readWrite') }}
|
||||
{{ $t('list.share.right.readWrite') }}
|
||||
</template>
|
||||
<template v-else>
|
||||
<span class="icon is-small">
|
||||
<icon icon="users"/>
|
||||
</span>
|
||||
{{ $t('project.share.right.read') }}
|
||||
{{ $t('list.share.right.read') }}
|
||||
</template>
|
||||
</p>
|
||||
|
||||
|
@ -172,14 +172,14 @@
|
|||
<modal
|
||||
:enabled="showDeleteModal"
|
||||
@close="showDeleteModal = false"
|
||||
@submit="remove(projectId)"
|
||||
@submit="remove(listId)"
|
||||
>
|
||||
<template #header>
|
||||
<span>{{ $t('project.share.links.remove') }}</span>
|
||||
<span>{{ $t('list.share.links.remove') }}</span>
|
||||
</template>
|
||||
|
||||
<template #text>
|
||||
<p>{{ $t('project.share.links.removeText') }}</p>
|
||||
<p>{{ $t('list.share.links.removeText') }}</p>
|
||||
</template>
|
||||
</modal>
|
||||
</div>
|
||||
|
@ -193,19 +193,19 @@ import {RIGHTS} from '@/constants/rights'
|
|||
import LinkShareModel from '@/models/linkShare'
|
||||
|
||||
import type {ILinkShare} from '@/modelTypes/ILinkShare'
|
||||
import type {IProject} from '@/modelTypes/IProject'
|
||||
import type {IList} from '@/modelTypes/IList'
|
||||
|
||||
import LinkShareService from '@/services/linkShare'
|
||||
|
||||
import {useCopyToClipboard} from '@/composables/useCopyToClipboard'
|
||||
import {success} from '@/message'
|
||||
import {getDisplayName} from '@/models/user'
|
||||
import type {ProjectView} from '@/types/ProjectView'
|
||||
import {PROJECT_VIEWS} from '@/types/ProjectView'
|
||||
import type {ListView} from '@/types/ListView'
|
||||
import {LIST_VIEWS} from '@/types/ListView'
|
||||
import {useConfigStore} from '@/stores/config'
|
||||
|
||||
const props = defineProps({
|
||||
projectId: {
|
||||
listId: {
|
||||
default: 0,
|
||||
required: true,
|
||||
},
|
||||
|
@ -222,20 +222,20 @@ const showDeleteModal = ref(false)
|
|||
const linkIdToDelete = ref(0)
|
||||
const showNewForm = ref(false)
|
||||
|
||||
type SelectedViewMapper = Record<IProject['id'], ProjectView>
|
||||
type SelectedViewMapper = Record<IList['id'], ListView>
|
||||
|
||||
const selectedView = ref<SelectedViewMapper>({})
|
||||
|
||||
const availableViews = computed<Record<ProjectView, string>>(() => ({
|
||||
list: t('project.list.title'),
|
||||
gantt: t('project.gantt.title'),
|
||||
table: t('project.table.title'),
|
||||
kanban: t('project.kanban.title'),
|
||||
const availableViews = computed<Record<ListView, string>>(() => ({
|
||||
list: t('list.list.title'),
|
||||
gantt: t('list.gantt.title'),
|
||||
table: t('list.table.title'),
|
||||
kanban: t('list.kanban.title'),
|
||||
}))
|
||||
|
||||
const copy = useCopyToClipboard()
|
||||
watch(
|
||||
() => props.projectId,
|
||||
() => props.listId,
|
||||
load,
|
||||
{immediate: true},
|
||||
)
|
||||
|
@ -243,23 +243,23 @@ watch(
|
|||
const configStore = useConfigStore()
|
||||
const frontendUrl = computed(() => configStore.frontendUrl)
|
||||
|
||||
async function load(projectId: IProject['id']) {
|
||||
// If projectId == 0 the project on the calling component wasn't already loaded, so we just bail out here
|
||||
if (projectId === 0) {
|
||||
async function load(listId: IList['id']) {
|
||||
// If listId == 0 the list on the calling component wasn't already loaded, so we just bail out here
|
||||
if (listId === 0) {
|
||||
return
|
||||
}
|
||||
|
||||
const links = await linkShareService.getAll({projectId})
|
||||
const links = await linkShareService.getAll({listId})
|
||||
links.forEach((l: ILinkShare) => {
|
||||
selectedView.value[l.id] = 'project'
|
||||
selectedView.value[l.id] = 'list'
|
||||
})
|
||||
linkShares.value = links
|
||||
}
|
||||
|
||||
async function add(projectId: IProject['id']) {
|
||||
async function add(listId: IList['id']) {
|
||||
const newLinkShare = new LinkShareModel({
|
||||
right: selectedRight.value,
|
||||
projectId,
|
||||
listId,
|
||||
name: name.value,
|
||||
password: password.value,
|
||||
})
|
||||
|
@ -268,31 +268,31 @@ async function add(projectId: IProject['id']) {
|
|||
name.value = ''
|
||||
password.value = ''
|
||||
showNewForm.value = false
|
||||
success({message: t('project.share.links.createSuccess')})
|
||||
await load(projectId)
|
||||
success({message: t('list.share.links.createSuccess')})
|
||||
await load(listId)
|
||||
}
|
||||
|
||||
async function remove(projectId: IProject['id']) {
|
||||
async function remove(listId: IList['id']) {
|
||||
try {
|
||||
await linkShareService.delete(new LinkShareModel({
|
||||
id: linkIdToDelete.value,
|
||||
projectId,
|
||||
listId,
|
||||
}))
|
||||
success({message: t('project.share.links.deleteSuccess')})
|
||||
await load(projectId)
|
||||
success({message: t('list.share.links.deleteSuccess')})
|
||||
await load(listId)
|
||||
} finally {
|
||||
showDeleteModal.value = false
|
||||
}
|
||||
}
|
||||
|
||||
function getShareLink(hash: string, view: ProjectView = PROJECT_VIEWS.LIST) {
|
||||
function getShareLink(hash: string, view: ListView = LIST_VIEWS.LIST) {
|
||||
return frontendUrl.value + 'share/' + hash + '/auth?view=' + view
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
// FIXME: I think this is not needed
|
||||
.sharables-project:not(.card-content) {
|
||||
.sharables-list:not(.card-content) {
|
||||
overflow-y: auto
|
||||
}
|
||||
</style>
|
|
@ -1,7 +1,7 @@
|
|||
<template>
|
||||
<div>
|
||||
<p class="has-text-weight-bold">
|
||||
{{ $t('project.share.userTeam.shared', {type: shareTypeNames}) }}
|
||||
{{ $t('list.share.userTeam.shared', {type: shareTypeNames}) }}
|
||||
</p>
|
||||
<div v-if="userIsAdmin">
|
||||
<div class="field has-addons">
|
||||
|
@ -19,7 +19,7 @@
|
|||
/>
|
||||
</p>
|
||||
<p class="control">
|
||||
<x-button @click="add()">{{ $t('project.share.share') }}</x-button>
|
||||
<x-button @click="add()">{{ $t('list.share.share') }}</x-button>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -31,7 +31,7 @@
|
|||
<td>{{ getDisplayName(s) }}</td>
|
||||
<td>
|
||||
<template v-if="s.id === userInfo.id">
|
||||
<b class="is-success">{{ $t('project.share.userTeam.you') }}</b>
|
||||
<b class="is-success">{{ $t('list.share.userTeam.you') }}</b>
|
||||
</template>
|
||||
</td>
|
||||
</template>
|
||||
|
@ -52,19 +52,19 @@
|
|||
<span class="icon is-small">
|
||||
<icon icon="lock"/>
|
||||
</span>
|
||||
{{ $t('project.share.right.admin') }}
|
||||
{{ $t('list.share.right.admin') }}
|
||||
</template>
|
||||
<template v-else-if="s.right === RIGHTS.READ_WRITE">
|
||||
<span class="icon is-small">
|
||||
<icon icon="pen"/>
|
||||
</span>
|
||||
{{ $t('project.share.right.readWrite') }}
|
||||
{{ $t('list.share.right.readWrite') }}
|
||||
</template>
|
||||
<template v-else>
|
||||
<span class="icon is-small">
|
||||
<icon icon="users"/>
|
||||
</span>
|
||||
{{ $t('project.share.right.read') }}
|
||||
{{ $t('list.share.right.read') }}
|
||||
</template>
|
||||
</td>
|
||||
<td class="actions" v-if="userIsAdmin">
|
||||
|
@ -78,19 +78,19 @@
|
|||
:selected="s.right === RIGHTS.READ"
|
||||
:value="RIGHTS.READ"
|
||||
>
|
||||
{{ $t('project.share.right.read') }}
|
||||
{{ $t('list.share.right.read') }}
|
||||
</option>
|
||||
<option
|
||||
:selected="s.right === RIGHTS.READ_WRITE"
|
||||
:value="RIGHTS.READ_WRITE"
|
||||
>
|
||||
{{ $t('project.share.right.readWrite') }}
|
||||
{{ $t('list.share.right.readWrite') }}
|
||||
</option>
|
||||
<option
|
||||
:selected="s.right === RIGHTS.ADMIN"
|
||||
:value="RIGHTS.ADMIN"
|
||||
>
|
||||
{{ $t('project.share.right.admin') }}
|
||||
{{ $t('list.share.right.admin') }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
@ -110,7 +110,7 @@
|
|||
</table>
|
||||
|
||||
<nothing v-else>
|
||||
{{ $t('project.share.userTeam.notShared', {type: shareTypeNames}) }}
|
||||
{{ $t('list.share.userTeam.notShared', {type: shareTypeNames}) }}
|
||||
</nothing>
|
||||
|
||||
<modal
|
||||
|
@ -120,11 +120,11 @@
|
|||
>
|
||||
<template #header>
|
||||
<span>{{
|
||||
$t('project.share.userTeam.removeHeader', {type: shareTypeName, sharable: sharableName})
|
||||
$t('list.share.userTeam.removeHeader', {type: shareTypeName, sharable: sharableName})
|
||||
}}</span>
|
||||
</template>
|
||||
<template #text>
|
||||
<p>{{ $t('project.share.userTeam.removeText', {type: shareTypeName, sharable: sharableName}) }}</p>
|
||||
<p>{{ $t('list.share.userTeam.removeText', {type: shareTypeName, sharable: sharableName}) }}</p>
|
||||
</template>
|
||||
</modal>
|
||||
</div>
|
||||
|
@ -143,9 +143,9 @@ import UserNamespaceService from '@/services/userNamespace'
|
|||
import UserNamespaceModel from '@/models/userNamespace'
|
||||
import type {IUserNamespace} from '@/modelTypes/IUserNamespace'
|
||||
|
||||
import UserProjectService from '@/services/userProject'
|
||||
import UserProjectModel from '@/models/userProject'
|
||||
import type {IUserProject} from '@/modelTypes/IUserProject'
|
||||
import UserListService from '@/services/userList'
|
||||
import UserListModel from '@/models/userList'
|
||||
import type {IUserList} from '@/modelTypes/IUserList'
|
||||
|
||||
import UserService from '@/services/user'
|
||||
import UserModel, { getDisplayName } from '@/models/user'
|
||||
|
@ -155,9 +155,9 @@ import TeamNamespaceService from '@/services/teamNamespace'
|
|||
import TeamNamespaceModel from '@/models/teamNamespace'
|
||||
import type { ITeamNamespace } from '@/modelTypes/ITeamNamespace'
|
||||
|
||||
import TeamProjectService from '@/services/teamProject'
|
||||
import TeamProjectModel from '@/models/teamProject'
|
||||
import type { ITeamProject } from '@/modelTypes/ITeamProject'
|
||||
import TeamListService from '@/services/teamList'
|
||||
import TeamListModel from '@/models/teamList'
|
||||
import type { ITeamList } from '@/modelTypes/ITeamList'
|
||||
|
||||
import TeamService from '@/services/team'
|
||||
import TeamModel from '@/models/team'
|
||||
|
@ -172,7 +172,7 @@ import {useAuthStore} from '@/stores/auth'
|
|||
|
||||
const props = defineProps({
|
||||
type: {
|
||||
type: String as PropType<'project' | 'namespace'>,
|
||||
type: String as PropType<'list' | 'namespace'>,
|
||||
default: '',
|
||||
},
|
||||
shareType: {
|
||||
|
@ -191,9 +191,9 @@ const props = defineProps({
|
|||
|
||||
const {t} = useI18n({useScope: 'global'})
|
||||
|
||||
// This user service is either a userNamespaceService or a userProjectService, depending on the type we are using
|
||||
let stuffService: UserNamespaceService | UserProjectService | TeamProjectService | TeamNamespaceService
|
||||
let stuffModel: IUserNamespace | IUserProject | ITeamProject | ITeamNamespace
|
||||
// This user service is either a userNamespaceService or a userListService, depending on the type we are using
|
||||
let stuffService: UserNamespaceService | UserListService | TeamListService | TeamNamespaceService
|
||||
let stuffModel: IUserNamespace | IUserList | ITeamList | ITeamNamespace
|
||||
let searchService: UserService | TeamService
|
||||
let sharable: Ref<IUser | ITeam>
|
||||
|
||||
|
@ -201,7 +201,7 @@ const searchLabel = ref('')
|
|||
const selectedRight = ref({})
|
||||
|
||||
|
||||
// This holds either teams or users who this namepace or project is shared with
|
||||
// This holds either teams or users who this namepace or list is shared with
|
||||
const sharables = ref([])
|
||||
const showDeleteModal = ref(false)
|
||||
|
||||
|
@ -212,11 +212,11 @@ const userInfo = computed(() => authStore.info)
|
|||
function createShareTypeNameComputed(count: number) {
|
||||
return computed(() => {
|
||||
if (props.shareType === 'user') {
|
||||
return t('project.share.userTeam.typeUser', count)
|
||||
return t('list.share.userTeam.typeUser', count)
|
||||
}
|
||||
|
||||
if (props.shareType === 'team') {
|
||||
return t('project.share.userTeam.typeTeam', count)
|
||||
return t('list.share.userTeam.typeTeam', count)
|
||||
}
|
||||
|
||||
return ''
|
||||
|
@ -227,8 +227,8 @@ const shareTypeNames = createShareTypeNameComputed(2)
|
|||
const shareTypeName = createShareTypeNameComputed(1)
|
||||
|
||||
const sharableName = computed(() => {
|
||||
if (props.type === 'project') {
|
||||
return t('project.list.title')
|
||||
if (props.type === 'list') {
|
||||
return t('list.list.title')
|
||||
}
|
||||
|
||||
if (props.shareType === 'namespace') {
|
||||
|
@ -244,9 +244,9 @@ if (props.shareType === 'user') {
|
|||
sharable = ref(new UserModel())
|
||||
searchLabel.value = 'username'
|
||||
|
||||
if (props.type === 'project') {
|
||||
stuffService = shallowReactive(new UserProjectService())
|
||||
stuffModel = reactive(new UserProjectModel({projectId: props.id}))
|
||||
if (props.type === 'list') {
|
||||
stuffService = shallowReactive(new UserListService())
|
||||
stuffModel = reactive(new UserListModel({listId: props.id}))
|
||||
} else if (props.type === 'namespace') {
|
||||
stuffService = shallowReactive(new UserNamespaceService())
|
||||
stuffModel = reactive(new UserNamespaceModel({
|
||||
|
@ -261,9 +261,9 @@ if (props.shareType === 'user') {
|
|||
sharable = ref(new TeamModel())
|
||||
searchLabel.value = 'name'
|
||||
|
||||
if (props.type === 'project') {
|
||||
stuffService = shallowReactive(new TeamProjectService())
|
||||
stuffModel = reactive(new TeamProjectModel({projectId: props.id}))
|
||||
if (props.type === 'list') {
|
||||
stuffService = shallowReactive(new TeamListService())
|
||||
stuffModel = reactive(new TeamListModel({listId: props.id}))
|
||||
} else if (props.type === 'namespace') {
|
||||
stuffService = shallowReactive(new TeamNamespaceService())
|
||||
stuffModel = reactive(new TeamNamespaceModel({
|
||||
|
@ -303,7 +303,7 @@ async function deleteSharable() {
|
|||
}
|
||||
}
|
||||
success({
|
||||
message: t('project.share.userTeam.removeSuccess', {
|
||||
message: t('list.share.userTeam.removeSuccess', {
|
||||
type: shareTypeName.value,
|
||||
sharable: sharableName.value,
|
||||
}),
|
||||
|
@ -326,7 +326,7 @@ async function add(admin) {
|
|||
}
|
||||
|
||||
await stuffService.create(stuffModel)
|
||||
success({message: t('project.share.userTeam.addedSuccess', {type: shareTypeName.value})})
|
||||
success({message: t('list.share.userTeam.addedSuccess', {type: shareTypeName.value})})
|
||||
await load()
|
||||
}
|
||||
|
||||
|
@ -358,7 +358,7 @@ async function toggleType(sharable) {
|
|||
sharables.value[i].right = r.right
|
||||
}
|
||||
}
|
||||
success({message: t('project.share.userTeam.updatedSuccess', {type: shareTypeName.value})})
|
||||
success({message: t('list.share.userTeam.updatedSuccess', {type: shareTypeName.value})})
|
||||
}
|
||||
|
||||
const found = ref([])
|
||||
|
|
|
@ -38,8 +38,9 @@
|
|||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {computed, ref, watch, toRefs, onActivated} from 'vue'
|
||||
import {computed, ref, watch, toRefs} from 'vue'
|
||||
import {useRouter} from 'vue-router'
|
||||
import {useNow} from '@vueuse/core'
|
||||
|
||||
import {getHexColor} from '@/models/task'
|
||||
|
||||
|
@ -49,7 +50,7 @@ import {parseKebabDate} from '@/helpers/time/parseKebabDate'
|
|||
|
||||
import type {ITask, ITaskPartialWithId} from '@/modelTypes/ITask'
|
||||
import type {DateISO} from '@/types/DateISO'
|
||||
import type {GanttFilters} from '@/views/project/helpers/useGanttFilters'
|
||||
import type {GanttFilters} from '@/views/list/helpers/useGanttFilters'
|
||||
|
||||
import {
|
||||
extendDayjs,
|
||||
|
@ -156,8 +157,7 @@ function openTask(e: {
|
|||
|
||||
const weekDayFromDate = useWeekDayFromDate()
|
||||
|
||||
const today = ref(new Date())
|
||||
onActivated(() => today.value = new Date())
|
||||
const today = useNow()
|
||||
const dateIsToday = computed(() => (date: Date) => {
|
||||
return (
|
||||
date.getDate() === today.value.getDate() &&
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<textarea
|
||||
class="add-task-textarea input"
|
||||
:class="{'textarea-empty': newTaskTitle === ''}"
|
||||
:placeholder="$t('project.list.addPlaceholder')"
|
||||
:placeholder="$t('list.list.addPlaceholder')"
|
||||
rows="1"
|
||||
v-focus
|
||||
v-model="newTaskTitle"
|
||||
|
@ -24,10 +24,10 @@
|
|||
@click="addTask()"
|
||||
icon="plus"
|
||||
:loading="loading"
|
||||
:aria-label="$t('project.list.add')"
|
||||
:aria-label="$t('list.list.add')"
|
||||
>
|
||||
<span class="button-text">
|
||||
{{ $t('project.list.add') }}
|
||||
{{ $t('list.list.add') }}
|
||||
</span>
|
||||
</x-button>
|
||||
</p>
|
||||
|
@ -107,7 +107,7 @@ const loading = computed(() => taskStore.isLoading)
|
|||
|
||||
async function addTask() {
|
||||
if (newTaskTitle.value === '') {
|
||||
errorMessage.value = t('project.create.addTitleRequired')
|
||||
errorMessage.value = t('list.create.addTitleRequired')
|
||||
return
|
||||
}
|
||||
errorMessage.value = ''
|
||||
|
@ -128,20 +128,20 @@ async function addTask() {
|
|||
const allLabels = tasksToCreate.map(({title}) => getLabelsFromPrefix(title) ?? [])
|
||||
await taskStore.ensureLabelsExist(allLabels.flat())
|
||||
|
||||
const newTasks = tasksToCreate.map(async ({title, project}) => {
|
||||
const newTasks = tasksToCreate.map(async ({title, list}) => {
|
||||
if (title === '') {
|
||||
return
|
||||
}
|
||||
|
||||
// If the task has a project specified, make sure to use it
|
||||
let projectId = null
|
||||
if (project !== null) {
|
||||
projectId = await taskStore.findProjectId({project, projectId: 0})
|
||||
// If the task has a list specified, make sure to use it
|
||||
let listId = null
|
||||
if (list !== null) {
|
||||
listId = await taskStore.findListId({list, listId: 0})
|
||||
}
|
||||
|
||||
const task = await taskStore.createNewTask({
|
||||
title,
|
||||
projectId: projectId || authStore.settings.defaultProjectId,
|
||||
listId: listId || authStore.settings.defaultListId,
|
||||
position: props.defaultPosition,
|
||||
})
|
||||
createdTasks[title] = task
|
||||
|
@ -176,7 +176,7 @@ async function addTask() {
|
|||
}))
|
||||
|
||||
createdTask.relatedTasks[RELATION_KIND.PARENTTASK] = [createdParentTask]
|
||||
// we're only emitting here so that the relation shows up in the project
|
||||
// we're only emitting here so that the relation shows up in the task list
|
||||
emit('taskAdded', createdTask)
|
||||
|
||||
return rel
|
||||
|
@ -184,8 +184,8 @@ async function addTask() {
|
|||
await Promise.all(relations)
|
||||
} catch (e: any) {
|
||||
newTaskTitle.value = taskTitleBackup
|
||||
if (e?.message === 'NO_PROJECT') {
|
||||
errorMessage.value = t('project.create.addProjectRequired')
|
||||
if (e?.message === 'NO_LIST') {
|
||||
errorMessage.value = t('list.create.addListRequired')
|
||||
return
|
||||
}
|
||||
throw e
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<template>
|
||||
<Multiselect
|
||||
:loading="projectUserService.loading"
|
||||
:loading="listUserService.loading"
|
||||
:placeholder="$t('task.assignee.placeholder')"
|
||||
:multiple="true"
|
||||
@search="findUser"
|
||||
|
@ -30,7 +30,7 @@ import Multiselect from '@/components/input/multiselect.vue'
|
|||
import BaseButton from '@/components/base/BaseButton.vue'
|
||||
|
||||
import {includesById} from '@/helpers/utils'
|
||||
import ProjectUserService from '@/services/projectUsers'
|
||||
import ListUserService from '@/services/listUsers'
|
||||
import {success} from '@/message'
|
||||
import {useTaskStore} from '@/stores/tasks'
|
||||
|
||||
|
@ -42,7 +42,7 @@ const props = defineProps({
|
|||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
projectId: {
|
||||
listId: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
|
@ -59,7 +59,7 @@ const emit = defineEmits(['update:modelValue'])
|
|||
const taskStore = useTaskStore()
|
||||
const {t} = useI18n({useScope: 'global'})
|
||||
|
||||
const projectUserService = shallowReactive(new ProjectUserService())
|
||||
const listUserService = shallowReactive(new ListUserService())
|
||||
const foundUsers = ref<IUser[]>([])
|
||||
const assignees = ref<IUser[]>([])
|
||||
let isAdding = false
|
||||
|
@ -94,7 +94,7 @@ async function addAssignee(user: IUser) {
|
|||
async function removeAssignee(user: IUser) {
|
||||
await taskStore.removeAssignee({user: user, taskId: props.taskId})
|
||||
|
||||
// Remove the assignee from the project
|
||||
// Remove the assignee from the list
|
||||
for (const a in assignees.value) {
|
||||
if (assignees.value[a].id === user.id) {
|
||||
assignees.value.splice(a, 1)
|
||||
|
@ -109,7 +109,7 @@ async function findUser(query: string) {
|
|||
return
|
||||
}
|
||||
|
||||
const response = await projectUserService.getAll({projectId: props.projectId}, {s: query}) as IUser[]
|
||||
const response = await listUserService.getAll({listId: props.listId}, {s: query}) as IUser[]
|
||||
|
||||
// Filter the results to not include users who are already assigned
|
||||
foundUsers.value = response
|
||||
|
|
|
@ -1,18 +1,18 @@
|
|||
<template>
|
||||
<Multiselect
|
||||
class="control is-expanded"
|
||||
:placeholder="$t('project.search')"
|
||||
:search-results="foundProjects"
|
||||
:placeholder="$t('list.search')"
|
||||
:search-results="foundLists"
|
||||
label="title"
|
||||
:select-placeholder="$t('project.searchSelect')"
|
||||
:model-value="project"
|
||||
@update:model-value="Object.assign(project, $event)"
|
||||
:select-placeholder="$t('list.searchSelect')"
|
||||
:model-value="list"
|
||||
@update:model-value="Object.assign(list, $event)"
|
||||
@select="select"
|
||||
@search="findProjects"
|
||||
@search="findLists"
|
||||
>
|
||||
<template #searchResult="{option}">
|
||||
<span class="project-namespace-title search-result">{{ namespace((option as IProject).namespaceId) }} ></span>
|
||||
{{ (option as IProject).title }}
|
||||
<span class="list-namespace-title search-result">{{ namespace((option as IList).namespaceId) }} ></span>
|
||||
{{ (option as IList).title }}
|
||||
</template>
|
||||
</Multiselect>
|
||||
</template>
|
||||
|
@ -22,19 +22,19 @@ import {reactive, ref, watch} from 'vue'
|
|||
import type {PropType} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
|
||||
import type {IProject} from '@/modelTypes/IProject'
|
||||
import type {IList} from '@/modelTypes/IList'
|
||||
import type {INamespace} from '@/modelTypes/INamespace'
|
||||
|
||||
import {useProjectStore} from '@/stores/projects'
|
||||
import {useListStore} from '@/stores/lists'
|
||||
import {useNamespaceStore} from '@/stores/namespaces'
|
||||
|
||||
import ProjectModel from '@/models/project'
|
||||
import ListModel from '@/models/list'
|
||||
|
||||
import Multiselect from '@/components/input/multiselect.vue'
|
||||
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: Object as PropType<IProject>,
|
||||
type: Object as PropType<IList>,
|
||||
required: false,
|
||||
},
|
||||
})
|
||||
|
@ -42,45 +42,45 @@ const emit = defineEmits(['update:modelValue'])
|
|||
|
||||
const {t} = useI18n({useScope: 'global'})
|
||||
|
||||
const project: IProject = reactive(new ProjectModel())
|
||||
const list: IList = reactive(new ListModel())
|
||||
|
||||
watch(
|
||||
() => props.modelValue,
|
||||
(newProject) => Object.assign(project, newProject),
|
||||
(newList) => Object.assign(list, newList),
|
||||
{
|
||||
immediate: true,
|
||||
deep: true,
|
||||
},
|
||||
)
|
||||
|
||||
const projectStore = useProjectStore()
|
||||
const listStore = useListStore()
|
||||
const namespaceStore = useNamespaceStore()
|
||||
const foundProjects = ref<IProject[]>([])
|
||||
function findProjects(query: string) {
|
||||
const foundLists = ref<IList[]>([])
|
||||
function findLists(query: string) {
|
||||
if (query === '') {
|
||||
select(null)
|
||||
}
|
||||
foundProjects.value = projectStore.searchProject(query)
|
||||
foundLists.value = listStore.searchList(query)
|
||||
}
|
||||
|
||||
function select(l: IProject | null) {
|
||||
function select(l: IList | null) {
|
||||
if (l === null) {
|
||||
return
|
||||
}
|
||||
Object.assign(project, l)
|
||||
emit('update:modelValue', project)
|
||||
Object.assign(list, l)
|
||||
emit('update:modelValue', list)
|
||||
}
|
||||
|
||||
function namespace(namespaceId: INamespace['id']) {
|
||||
const namespace = namespaceStore.getNamespaceById(namespaceId)
|
||||
return namespace !== null
|
||||
? namespace.title
|
||||
: t('project.shared')
|
||||
: t('list.shared')
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.project-namespace-title {
|
||||
.list-namespace-title {
|
||||
color: var(--grey-500);
|
||||
}
|
||||
</style>
|
|
@ -37,14 +37,14 @@
|
|||
{{ $t('task.quickAddMagic.multiple') }}
|
||||
</p>
|
||||
|
||||
<h3>{{ $t('project.list.title') }}</h3>
|
||||
<h3>{{ $t('list.list.title') }}</h3>
|
||||
<p>
|
||||
{{ $t('task.quickAddMagic.project1', {prefix: prefixes.project}) }}
|
||||
{{ $t('task.quickAddMagic.project2') }}
|
||||
{{ $t('task.quickAddMagic.list1', {prefix: prefixes.list}) }}
|
||||
{{ $t('task.quickAddMagic.list2') }}
|
||||
</p>
|
||||
<p>
|
||||
{{ $t('task.quickAddMagic.project3') }}
|
||||
{{ $t('task.quickAddMagic.project4', {prefix: prefixes.project}) }}
|
||||
{{ $t('task.quickAddMagic.list3') }}
|
||||
{{ $t('task.quickAddMagic.list4', {prefix: prefixes.list}) }}
|
||||
</p>
|
||||
|
||||
<h3>{{ $t('task.quickAddMagic.dateAndTime') }}</h3>
|
||||
|
|
|
@ -43,8 +43,8 @@
|
|||
:class="{'is-strikethrough': task.done}"
|
||||
>
|
||||
<span
|
||||
class="different-project"
|
||||
v-if="task.projectId !== projectId"
|
||||
class="different-list"
|
||||
v-if="task.listId !== listId"
|
||||
>
|
||||
<span
|
||||
v-if="task.differentNamespace !== null"
|
||||
|
@ -52,9 +52,9 @@
|
|||
{{ task.differentNamespace }} >
|
||||
</span>
|
||||
<span
|
||||
v-if="task.differentProject !== null"
|
||||
v-tooltip="$t('task.relation.differentProject')">
|
||||
{{ task.differentProject }} >
|
||||
v-if="task.differentList !== null"
|
||||
v-tooltip="$t('task.relation.differentList')">
|
||||
{{ task.differentList }} >
|
||||
</span>
|
||||
</span>
|
||||
{{ task.title }}
|
||||
|
@ -98,8 +98,8 @@
|
|||
:class="{ 'is-strikethrough': t.done}"
|
||||
>
|
||||
<span
|
||||
class="different-project"
|
||||
v-if="t.projectId !== projectId"
|
||||
class="different-list"
|
||||
v-if="t.listId !== listId"
|
||||
>
|
||||
<span
|
||||
v-if="t.differentNamespace !== null"
|
||||
|
@ -107,9 +107,9 @@
|
|||
{{ t.differentNamespace }} >
|
||||
</span>
|
||||
<span
|
||||
v-if="t.differentProject !== null"
|
||||
v-tooltip="$t('task.relation.differentProject')">
|
||||
{{ t.differentProject }} >
|
||||
v-if="t.differentList !== null"
|
||||
v-tooltip="$t('task.relation.differentList')">
|
||||
{{ t.differentList }} >
|
||||
</span>
|
||||
</span>
|
||||
{{ t.title }}
|
||||
|
@ -186,7 +186,7 @@ const props = defineProps({
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
projectId: {
|
||||
listId: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
|
@ -230,17 +230,17 @@ async function findTasks(newQuery: string) {
|
|||
foundTasks.value = await taskService.getAll({}, {s: newQuery})
|
||||
}
|
||||
|
||||
const getProjectAndNamespaceById = (projectId: number) => namespaceStore.getProjectAndNamespaceById(projectId, true)
|
||||
const getListAndNamespaceById = (listId: number) => namespaceStore.getListAndNamespaceById(listId, true)
|
||||
|
||||
const namespace = computed(() => getProjectAndNamespaceById(props.projectId)?.namespace)
|
||||
const namespace = computed(() => getListAndNamespaceById(props.listId)?.namespace)
|
||||
|
||||
function mapRelatedTasks(tasks: ITask[]) {
|
||||
return tasks.map(task => {
|
||||
// by doing this here once we can save a lot of duplicate calls in the template
|
||||
const {
|
||||
project,
|
||||
list,
|
||||
namespace: taskNamespace,
|
||||
} = getProjectAndNamespaceById(task.projectId) || {project: null, namespace: null}
|
||||
} = getListAndNamespaceById(task.listId) || {list: null, namespace: null}
|
||||
|
||||
return {
|
||||
...task,
|
||||
|
@ -248,10 +248,10 @@ function mapRelatedTasks(tasks: ITask[]) {
|
|||
(taskNamespace !== null &&
|
||||
taskNamespace.id !== namespace.value.id &&
|
||||
taskNamespace?.title) || null,
|
||||
differentProject:
|
||||
(project !== null &&
|
||||
task.projectId !== props.projectId &&
|
||||
project?.title) || null,
|
||||
differentList:
|
||||
(list !== null &&
|
||||
task.listId !== props.listId &&
|
||||
list?.title) || null,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -343,7 +343,7 @@ async function removeTaskRelation() {
|
|||
}
|
||||
|
||||
async function createAndRelateTask(title: string) {
|
||||
const newTask = await taskService.create(new TaskModel({title, projectId: props.projectId}))
|
||||
const newTask = await taskService.create(new TaskModel({title, listId: props.listId}))
|
||||
newTaskRelation.task = newTask
|
||||
await addTaskRelation()
|
||||
}
|
||||
|
@ -351,7 +351,7 @@ async function createAndRelateTask(title: string) {
|
|||
async function toggleTaskDone(task: ITask) {
|
||||
await taskStore.update(task)
|
||||
|
||||
// Find the task in the project and update it so that it is correctly strike through
|
||||
// Find the task in the list and update it so that it is correctly strike through
|
||||
Object.entries(relatedTasks.value).some(([kind, tasks]) => {
|
||||
return (tasks as ITask[]).some((t, key) => {
|
||||
const found = t.id === task.id
|
||||
|
@ -379,7 +379,7 @@ async function toggleTaskDone(task: ITask) {
|
|||
}
|
||||
}
|
||||
|
||||
.different-project {
|
||||
.different-list {
|
||||
color: var(--grey-500);
|
||||
width: auto;
|
||||
}
|
||||
|
|
|
@ -9,25 +9,25 @@
|
|||
@change="markAsDone"
|
||||
v-model="task.done"
|
||||
/>
|
||||
|
||||
|
||||
<ColorBubble
|
||||
v-if="showProjectColor && projectColor !== '' && currentProject.id !== task.projectId"
|
||||
:color="projectColor"
|
||||
v-if="showListColor && listColor !== '' && currentList.id !== task.listId"
|
||||
:color="listColor"
|
||||
class="mr-1"
|
||||
/>
|
||||
|
||||
|
||||
<div
|
||||
:class="{ 'done': task.done, 'show-project': showProject && project !== null}"
|
||||
:class="{ 'done': task.done, 'show-list': showList && taskList !== null}"
|
||||
class="tasktext"
|
||||
>
|
||||
<span>
|
||||
<router-link
|
||||
v-if="showProject && project !== null"
|
||||
:to="{ name: 'project.list', params: { projectId: task.projectId } }"
|
||||
class="task-project"
|
||||
v-if="showList && taskList !== null"
|
||||
:to="{ name: 'list.list', params: { listId: task.listId } }"
|
||||
class="task-list"
|
||||
:class="{'mr-2': task.hexColor !== ''}"
|
||||
v-tooltip="$t('task.detail.belongsToProject', {project: project.title})">
|
||||
{{ project.title }}
|
||||
v-tooltip="$t('task.detail.belongsToList', {list: taskList.title})">
|
||||
{{ taskList.title }}
|
||||
</router-link>
|
||||
|
||||
<ColorBubble
|
||||
|
@ -84,13 +84,13 @@
|
|||
<priority-label :priority="task.priority" :done="task.done"/>
|
||||
|
||||
<span>
|
||||
<span class="project-task-icon" v-if="task.attachments.length > 0">
|
||||
<span class="list-task-icon" v-if="task.attachments.length > 0">
|
||||
<icon icon="paperclip"/>
|
||||
</span>
|
||||
<span class="project-task-icon" v-if="task.description">
|
||||
<span class="list-task-icon" v-if="task.description">
|
||||
<icon icon="align-left"/>
|
||||
</span>
|
||||
<span class="project-task-icon" v-if="task.repeatAfter.amount > 0">
|
||||
<span class="list-task-icon" v-if="task.repeatAfter.amount > 0">
|
||||
<icon icon="history"/>
|
||||
</span>
|
||||
</span>
|
||||
|
@ -107,12 +107,12 @@
|
|||
</progress>
|
||||
|
||||
<router-link
|
||||
v-if="!showProject && currentProject.id !== task.projectId && project !== null"
|
||||
:to="{ name: 'project.list', params: { projectId: task.projectId } }"
|
||||
class="task-project"
|
||||
v-tooltip="$t('task.detail.belongsToProject', {project: project.title})"
|
||||
v-if="!showList && currentList.id !== task.listId && taskList !== null"
|
||||
:to="{ name: 'list.list', params: { listId: task.listId } }"
|
||||
class="task-list"
|
||||
v-tooltip="$t('task.detail.belongsToList', {list: taskList.title})"
|
||||
>
|
||||
{{ project.title }}
|
||||
{{ taskList.title }}
|
||||
</router-link>
|
||||
|
||||
<BaseButton
|
||||
|
@ -151,7 +151,7 @@ import {closeWhenClickedOutside} from '@/helpers/closeWhenClickedOutside'
|
|||
import {formatDateSince, formatISO, formatDateLong} from '@/helpers/time/formatDate'
|
||||
import {success} from '@/message'
|
||||
|
||||
import {useProjectStore} from '@/stores/projects'
|
||||
import {useListStore} from '@/stores/lists'
|
||||
import {useNamespaceStore} from '@/stores/namespaces'
|
||||
import {useBaseStore} from '@/stores/base'
|
||||
import {useTaskStore} from '@/stores/tasks'
|
||||
|
@ -165,7 +165,7 @@ const props = defineProps({
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
showProject: {
|
||||
showList: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
@ -173,7 +173,7 @@ const props = defineProps({
|
|||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
showProjectColor: {
|
||||
showListColor: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
|
@ -210,18 +210,18 @@ onBeforeUnmount(() => {
|
|||
})
|
||||
|
||||
const baseStore = useBaseStore()
|
||||
const projectStore = useProjectStore()
|
||||
const listStore = useListStore()
|
||||
const taskStore = useTaskStore()
|
||||
const namespaceStore = useNamespaceStore()
|
||||
|
||||
const project = computed(() => projectStore.getProjectById(task.value.projectId))
|
||||
const projectColor = computed(() => project.value !== null ? project.value.hexColor : '')
|
||||
const taskList = computed(() => listStore.getListById(task.value.listId))
|
||||
const listColor = computed(() => taskList.value !== null ? taskList.value.hexColor : '')
|
||||
|
||||
const currentProject = computed(() => {
|
||||
return typeof baseStore.currentProject === 'undefined' ? {
|
||||
const currentList = computed(() => {
|
||||
return typeof baseStore.currentList === 'undefined' ? {
|
||||
id: 0,
|
||||
title: '',
|
||||
} : baseStore.currentProject
|
||||
} : baseStore.currentList
|
||||
})
|
||||
|
||||
const taskDetailRoute = computed(() => ({
|
||||
|
@ -242,7 +242,7 @@ async function markAsDone(checked: boolean) {
|
|||
t('task.doneSuccess') :
|
||||
t('task.undoneSuccess'),
|
||||
}, [{
|
||||
title: t('task.undo'),
|
||||
title: 'Undo',
|
||||
callback: () => undoDone(checked),
|
||||
}])
|
||||
}
|
||||
|
@ -287,7 +287,7 @@ function hideDeferDueDatePopup(e) {
|
|||
cursor: pointer;
|
||||
border-radius: $radius;
|
||||
border: 2px solid transparent;
|
||||
|
||||
|
||||
color: var(--text);
|
||||
transition: color ease $transition-duration;
|
||||
|
||||
|
@ -314,7 +314,7 @@ function hideDeferDueDatePopup(e) {
|
|||
}
|
||||
}
|
||||
|
||||
.task-project {
|
||||
.task-list {
|
||||
width: auto;
|
||||
color: var(--grey-400);
|
||||
font-size: .9rem;
|
||||
|
@ -329,7 +329,7 @@ function hideDeferDueDatePopup(e) {
|
|||
width: 27px;
|
||||
}
|
||||
|
||||
.project-task-icon {
|
||||
.list-task-icon {
|
||||
margin-left: 6px;
|
||||
|
||||
&:not(:first-of-type) {
|
||||
|
@ -339,7 +339,7 @@ function hideDeferDueDatePopup(e) {
|
|||
}
|
||||
|
||||
.favorite {
|
||||
opacity: 1;
|
||||
opacity: 0;
|
||||
text-align: center;
|
||||
width: 27px;
|
||||
transition: opacity $transition, color $transition;
|
||||
|
@ -354,26 +354,21 @@ function hideDeferDueDatePopup(e) {
|
|||
}
|
||||
}
|
||||
|
||||
.handle {
|
||||
&:hover .favorite {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.handle {
|
||||
opacity: 0;
|
||||
transition: opacity $transition;
|
||||
margin-right: .25rem;
|
||||
cursor: grab;
|
||||
}
|
||||
|
||||
@media(hover: hover) and (pointer: fine) {
|
||||
& .favorite,
|
||||
& .handle {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
&:hover .favorite,
|
||||
&:hover .handle {
|
||||
opacity: 1;
|
||||
}
|
||||
&:hover .handle {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
|
||||
:deep(.fancycheckbox) {
|
||||
height: 18px;
|
||||
padding-top: 0;
|
||||
|
@ -394,7 +389,7 @@ function hideDeferDueDatePopup(e) {
|
|||
width: auto;
|
||||
}
|
||||
|
||||
.show-project .parent-tasks {
|
||||
.show-list .parent-tasks {
|
||||
padding-left: .25rem;
|
||||
}
|
||||
|
||||
|
@ -425,4 +420,4 @@ function hideDeferDueDatePopup(e) {
|
|||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
|
@ -1,5 +1,6 @@
|
|||
import {computed, onActivated, ref} from 'vue'
|
||||
import {computed} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {useNow} from '@vueuse/core'
|
||||
|
||||
import {useAuthStore} from '@/stores/auth'
|
||||
import {hourToDaytime} from '@/helpers/hourToDaytime'
|
||||
|
@ -8,8 +9,7 @@ export type Daytime = 'night' | 'morning' | 'day' | 'evening'
|
|||
|
||||
export function useDaytimeSalutation() {
|
||||
const {t} = useI18n({useScope: 'global'})
|
||||
const now = ref(new Date())
|
||||
onActivated(() => now.value = new Date())
|
||||
const now = useNow()
|
||||
const authStore = useAuthStore()
|
||||
|
||||
const name = computed(() => authStore.userDisplayName)
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import {ref, watch, readonly} from 'vue'
|
||||
import {useLocalStorage, useMediaQuery} from '@vueuse/core'
|
||||
import {useRoute} from 'vue-router'
|
||||
|
||||
const BULMA_MOBILE_BREAKPOINT = 768
|
||||
|
||||
|
@ -16,8 +15,7 @@ export function useMenuActive() {
|
|||
)
|
||||
|
||||
const menuActive = ref(false)
|
||||
const route = useRoute()
|
||||
|
||||
|
||||
// set to prefered value
|
||||
watch(isMobile, (current) => {
|
||||
menuActive.value = current
|
||||
|
@ -33,9 +31,6 @@ 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) {
|
||||
menuActive.value = newMenuActive
|
||||
}
|
||||
|
@ -45,8 +40,8 @@ export function useMenuActive() {
|
|||
}
|
||||
|
||||
return {
|
||||
menuActive: false,
|
||||
menuActive: readonly(menuActive),
|
||||
setMenuActive,
|
||||
toggleMenu,
|
||||
}
|
||||
}
|
||||
}
|
46
src/composables/useRenewTokenOnFocus.ts
Normal file
46
src/composables/useRenewTokenOnFocus.ts
Normal file
|
@ -0,0 +1,46 @@
|
|||
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,22 +5,6 @@ import TaskCollectionService from '@/services/taskCollection'
|
|||
import type {ITask} from '@/modelTypes/ITask'
|
||||
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
|
||||
export const getDefaultParams = () => ({
|
||||
sort_by: ['position', 'id'],
|
||||
|
@ -31,7 +15,7 @@ export const getDefaultParams = () => ({
|
|||
filter_concat: 'and',
|
||||
})
|
||||
|
||||
const SORT_BY_DEFAULT: SortBy = {
|
||||
const SORT_BY_DEFAULT = {
|
||||
id: 'desc',
|
||||
}
|
||||
|
||||
|
@ -58,15 +42,30 @@ const SORT_BY_DEFAULT: SortBy = {
|
|||
}
|
||||
|
||||
/**
|
||||
* This mixin provides a base set of methods and properties to get tasks.
|
||||
* This mixin provides a base set of methods and properties to get tasks on a list.
|
||||
*/
|
||||
export function useTaskList(projectId) {
|
||||
export function useTaskList(listId, sortByDefault = SORT_BY_DEFAULT) {
|
||||
const params = ref({...getDefaultParams()})
|
||||
|
||||
const search = ref('')
|
||||
const page = ref(1)
|
||||
|
||||
const sortBy = ref({ ...sortByDefault })
|
||||
|
||||
|
||||
|
||||
const getAllTasksParams = computed(() => {
|
||||
let loadParams = {...params.value}
|
||||
|
||||
if (search.value !== '') {
|
||||
loadParams.s = search.value
|
||||
}
|
||||
|
||||
loadParams = formatSortOrder(sortBy.value, loadParams)
|
||||
|
||||
return [
|
||||
{projectId: projectId.value},
|
||||
// TODO_OFFLINE still need sorting by position.
|
||||
{},
|
||||
{listId: listId.value},
|
||||
loadParams,
|
||||
page.value || 1,
|
||||
]
|
||||
})
|
||||
|
@ -88,7 +87,10 @@ export function useTaskList(projectId) {
|
|||
|
||||
const route = useRoute()
|
||||
watch(() => route.query, (query) => {
|
||||
const { page: pageQueryValue } = query
|
||||
const { page: pageQueryValue, search: searchQuery } = query
|
||||
if (searchQuery !== undefined) {
|
||||
search.value = searchQuery as string
|
||||
}
|
||||
if (pageQueryValue !== undefined) {
|
||||
page.value = Number(pageQueryValue)
|
||||
}
|
||||
|
@ -111,5 +113,8 @@ export function useTaskList(projectId) {
|
|||
totalPages,
|
||||
currentPage: page,
|
||||
loadTasks,
|
||||
searchTerm: search,
|
||||
params,
|
||||
sortByParam: sortBy,
|
||||
}
|
||||
}
|
|
@ -5,18 +5,17 @@ const API_DEFAULT_PORT = '3456'
|
|||
export const ERROR_NO_API_URL = 'noApiUrlProvided'
|
||||
|
||||
|
||||
// TODO_OFFLINE remove?
|
||||
export const checkAndSetApiUrl = (url: string): Promise<string> => {
|
||||
if (url.startsWith('/')) {
|
||||
if(url.startsWith('/')) {
|
||||
url = window.location.host + url
|
||||
}
|
||||
|
||||
// Check if the url has a http prefix
|
||||
|
||||
// Check if the url has an http prefix
|
||||
if (
|
||||
!url.startsWith('http://') &&
|
||||
!url.startsWith('https://')
|
||||
) {
|
||||
url = `${window.location.protocol}//${url}`
|
||||
url = `http://${url}`
|
||||
}
|
||||
|
||||
const urlToCheck: URL = new URL(url)
|
||||
|
@ -42,6 +41,15 @@ export const checkAndSetApiUrl = (url: string): Promise<string> => {
|
|||
}
|
||||
throw e
|
||||
})
|
||||
.catch(e => {
|
||||
// Check if it has a port and if not check if it is reachable at https
|
||||
if (urlToCheck.protocol === 'http:') {
|
||||
urlToCheck.protocol = 'https:'
|
||||
window.API_URL = urlToCheck.toString()
|
||||
return updateConfig()
|
||||
}
|
||||
throw e
|
||||
})
|
||||
.catch(e => {
|
||||
// Check if it is reachable at /api/v1 and https
|
||||
urlToCheck.pathname = origUrlToCheck.pathname
|
||||
|
@ -58,6 +66,7 @@ export const checkAndSetApiUrl = (url: string): Promise<string> => {
|
|||
.catch(e => {
|
||||
// Check if it is reachable at port API_DEFAULT_PORT and https
|
||||
if (urlToCheck.port !== API_DEFAULT_PORT) {
|
||||
urlToCheck.protocol = 'https:'
|
||||
urlToCheck.port = API_DEFAULT_PORT
|
||||
window.API_URL = urlToCheck.toString()
|
||||
return updateConfig()
|
||||
|
@ -65,7 +74,30 @@ export const checkAndSetApiUrl = (url: string): Promise<string> => {
|
|||
throw e
|
||||
})
|
||||
.catch(e => {
|
||||
// Check if it is reachable at :API_DEFAULT_PORT and /api/v1
|
||||
// Check if it is reachable at :API_DEFAULT_PORT and /api/v1 and https
|
||||
urlToCheck.pathname = origUrlToCheck.pathname
|
||||
if (
|
||||
!urlToCheck.pathname.endsWith('/api/v1') &&
|
||||
!urlToCheck.pathname.endsWith('/api/v1/')
|
||||
) {
|
||||
urlToCheck.pathname = `${urlToCheck.pathname}api/v1`
|
||||
window.API_URL = urlToCheck.toString()
|
||||
return updateConfig()
|
||||
}
|
||||
throw e
|
||||
})
|
||||
.catch(e => {
|
||||
// Check if it is reachable at port API_DEFAULT_PORT and http
|
||||
if (urlToCheck.port !== API_DEFAULT_PORT) {
|
||||
urlToCheck.protocol = 'http:'
|
||||
urlToCheck.port = API_DEFAULT_PORT
|
||||
window.API_URL = urlToCheck.toString()
|
||||
return updateConfig()
|
||||
}
|
||||
throw e
|
||||
})
|
||||
.catch(e => {
|
||||
// Check if it is reachable at :API_DEFAULT_PORT and /api/v1 and http
|
||||
urlToCheck.pathname = origUrlToCheck.pathname
|
||||
if (
|
||||
!urlToCheck.pathname.endsWith('/api/v1') &&
|
||||
|
@ -81,12 +113,12 @@ export const checkAndSetApiUrl = (url: string): Promise<string> => {
|
|||
window.API_URL = oldUrl
|
||||
throw e
|
||||
})
|
||||
.then(success => {
|
||||
if (success) {
|
||||
.then(r => {
|
||||
if (typeof r !== 'undefined') {
|
||||
localStorage.setItem('API_URL', window.API_URL)
|
||||
return window.API_URL
|
||||
}
|
||||
|
||||
|
||||
throw new Error(ERROR_NO_API_URL)
|
||||
})
|
||||
}
|
||||
|
|
9
src/helpers/getListTitle.ts
Normal file
9
src/helpers/getListTitle.ts
Normal file
|
@ -0,0 +1,9 @@
|
|||
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) => {
|
||||
if (n.id === -1) {
|
||||
return i18n.global.t('namespace.pseudo.sharedProjects.title')
|
||||
return i18n.global.t('namespace.pseudo.sharedLists.title')
|
||||
}
|
||||
if (n.id === -2) {
|
||||
return i18n.global.t('namespace.pseudo.favorites.title')
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
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`)
|
||||
|
||||
expect(tasks).to.have.length(3)
|
||||
expect(tasks[0].project).to.eq('list')
|
||||
expect(tasks[1].project).to.eq('list')
|
||||
expect(tasks[2].project).to.eq('list')
|
||||
expect(tasks[0].list).to.eq('list')
|
||||
expect(tasks[1].list).to.eq('list')
|
||||
expect(tasks[2].list).to.eq('list')
|
||||
})
|
||||
})
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import {getProjectFromPrefix} from '@/modules/parseTaskText'
|
||||
import {getListFromPrefix} from '@/modules/parseTaskText'
|
||||
|
||||
export interface TaskWithParent {
|
||||
title: string,
|
||||
parent: string | null,
|
||||
project: string | null,
|
||||
list: string | null,
|
||||
}
|
||||
|
||||
function cleanupTitle(title: string) {
|
||||
|
@ -23,10 +23,10 @@ export function parseSubtasksViaIndention(taskTitles: string): TaskWithParent[]
|
|||
const task: TaskWithParent = {
|
||||
title: cleanupTitle(title),
|
||||
parent: null,
|
||||
project: null,
|
||||
list: null,
|
||||
}
|
||||
|
||||
task.project = getProjectFromPrefix(task.title)
|
||||
task.list = getListFromPrefix(task.title)
|
||||
|
||||
if (index === 0) {
|
||||
return task
|
||||
|
@ -47,9 +47,9 @@ export function parseSubtasksViaIndention(taskTitles: string): TaskWithParent[]
|
|||
} while (parentSpaces >= matchedSpaces)
|
||||
task.title = cleanupTitle(title.replace(spaceRegex, ''))
|
||||
task.parent = task.parent.replace(spaceRegex, '')
|
||||
if (task.project === null) {
|
||||
// This allows to specify a project once for the parent task and inherit it to all subtasks
|
||||
task.project = getProjectFromPrefix(task.parent)
|
||||
if (task.list === null) {
|
||||
// This allows to specify a list once for the parent task and inherit it to all subtasks
|
||||
task.list = getListFromPrefix(task.parent)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,100 +0,0 @@
|
|||
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 {IProject} from '@/modelTypes/IProject'
|
||||
import type {IList} from '@/modelTypes/IList'
|
||||
|
||||
const key = 'collapsedBuckets'
|
||||
|
||||
|
@ -13,22 +13,22 @@ function getAllState() {
|
|||
}
|
||||
|
||||
export const saveCollapsedBucketState = (
|
||||
projectId: IProject['id'],
|
||||
listId: IList['id'],
|
||||
collapsedBuckets: CollapsedBuckets,
|
||||
) => {
|
||||
const state = getAllState()
|
||||
state[projectId] = collapsedBuckets
|
||||
for (const bucketId in state[projectId]) {
|
||||
if (!state[projectId][bucketId]) {
|
||||
delete state[projectId][bucketId]
|
||||
state[listId] = collapsedBuckets
|
||||
for (const bucketId in state[listId]) {
|
||||
if (!state[listId][bucketId]) {
|
||||
delete state[listId][bucketId]
|
||||
}
|
||||
}
|
||||
localStorage.setItem(key, JSON.stringify(state))
|
||||
}
|
||||
|
||||
export function getCollapsedBucketState(projectId : IProject['id']) {
|
||||
export function getCollapsedBucketState(listId : IList['id']) {
|
||||
const state = getAllState()
|
||||
return typeof state[projectId] !== 'undefined'
|
||||
? state[projectId]
|
||||
return typeof state[listId] !== 'undefined'
|
||||
? state[listId]
|
||||
: {}
|
||||
}
|
||||
|
|
53
src/helpers/saveListView.ts
Normal file
53
src/helpers/saveListView.ts
Normal file
|
@ -0,0 +1,53 @@
|
|||
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',
|
||||
'zh-CN': 'Chinese',
|
||||
'no-NO': 'Norsk Bokmål',
|
||||
} as const
|
||||
} as Record<string, string>
|
||||
|
||||
export type SupportedLocale = keyof typeof SUPPORTED_LOCALES
|
||||
|
||||
|
@ -23,12 +23,12 @@ export const DEFAULT_LANGUAGE: SupportedLocale= 'en'
|
|||
|
||||
export type ISOLanguage = string
|
||||
|
||||
// we load all messages async
|
||||
// we load all messsages async
|
||||
export const i18n = createI18n({
|
||||
fallbackLocale: DEFAULT_LANGUAGE,
|
||||
legacy: false,
|
||||
messages: {
|
||||
[DEFAULT_LANGUAGE]: langEN,
|
||||
en: langEN,
|
||||
} as Record<SupportedLocale, any>,
|
||||
})
|
||||
|
||||
|
@ -54,16 +54,16 @@ export async function setLanguage(lang: SupportedLocale = getCurrentLanguage()):
|
|||
}
|
||||
|
||||
export function getCurrentLanguage(): SupportedLocale {
|
||||
const savedLanguage = localStorage.getItem('language') as SupportedLocale | null
|
||||
const savedLanguage = localStorage.getItem('language')
|
||||
if (savedLanguage !== null) {
|
||||
return savedLanguage
|
||||
}
|
||||
|
||||
const browserLanguage = navigator.language
|
||||
|
||||
const language = Object.keys(SUPPORTED_LOCALES).find(langKey => {
|
||||
const language: SupportedLocale | undefined = Object.keys(SUPPORTED_LOCALES).find(langKey => {
|
||||
return langKey === browserLanguage || langKey.startsWith(browserLanguage + '-')
|
||||
}) as SupportedLocale | undefined
|
||||
})
|
||||
|
||||
return language || DEFAULT_LANGUAGE
|
||||
}
|
||||
|
|
|
@ -5,10 +5,10 @@
|
|||
"welcomeDay": "Hi {username}!",
|
||||
"welcomeEvening": "Good Evening {username}!",
|
||||
"lastViewed": "Last viewed",
|
||||
"project": {
|
||||
"newText": "You can create a new project for your new tasks:",
|
||||
"new": "New project",
|
||||
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||
"list": {
|
||||
"newText": "You can create a new list for your new tasks:",
|
||||
"new": "New list",
|
||||
"importText": "Or import your lists and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
}
|
||||
},
|
||||
|
@ -85,7 +85,7 @@
|
|||
"weekStartSunday": "Sunday",
|
||||
"weekStartMonday": "Monday",
|
||||
"language": "Language",
|
||||
"defaultProject": "Default Project",
|
||||
"defaultList": "Default List",
|
||||
"timezone": "Time Zone",
|
||||
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
||||
},
|
||||
|
@ -143,7 +143,7 @@
|
|||
},
|
||||
"deletion": {
|
||||
"title": "Delete your Vikunja Account",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, lists, tasks and everything associated with it.",
|
||||
"text2": "To proceed, please enter your password. You will receive an email with further instructions.",
|
||||
"confirm": "Delete my account",
|
||||
"requestSuccess": "The request was successful. You'll receive an email with further instructions.",
|
||||
|
@ -157,39 +157,47 @@
|
|||
},
|
||||
"export": {
|
||||
"title": "Export your Vikunja data",
|
||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
||||
"description": "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.",
|
||||
"descriptionPasswordRequired": "Please enter your password to proceed:",
|
||||
"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.",
|
||||
"downloadTitle": "Download your exported Vikunja data"
|
||||
}
|
||||
},
|
||||
"project": {
|
||||
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Project Title",
|
||||
"list": {
|
||||
"archived": "This list is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "List Title",
|
||||
"color": "Color",
|
||||
"projects": "Projects",
|
||||
"search": "Type to search for a project…",
|
||||
"searchSelect": "Click or press enter to select this project",
|
||||
"shared": "Shared Projects",
|
||||
"noDescriptionAvailable": "No project description is available.",
|
||||
"lists": "Lists",
|
||||
"list": {
|
||||
"title": "List",
|
||||
"add": "Add",
|
||||
"addPlaceholder": "Add a new task…",
|
||||
"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": {
|
||||
"header": "New project",
|
||||
"titlePlaceholder": "The project's title goes here…",
|
||||
"header": "New list",
|
||||
"titlePlaceholder": "The list's title goes here…",
|
||||
"addTitleRequired": "Please specify a title.",
|
||||
"createdSuccess": "The project was successfully created.",
|
||||
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||
"createdSuccess": "The list was successfully created.",
|
||||
"addListRequired": "Please specify a list or set a default list in the settings."
|
||||
},
|
||||
"archive": {
|
||||
"title": "Archive \"{project}\"",
|
||||
"archive": "Archive this project",
|
||||
"unarchive": "Un-Archive this project",
|
||||
"title": "Archive \"{list}\"",
|
||||
"archive": "Archive this list",
|
||||
"unarchive": "Un-Archive this list",
|
||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||
"success": "The project was successfully archived."
|
||||
"archiveText": "You won't be able to edit this list or create new tasks until you un-archive it.",
|
||||
"success": "The list was successfully archived."
|
||||
},
|
||||
"background": {
|
||||
"title": "Set project background",
|
||||
"title": "Set list background",
|
||||
"remove": "Remove Background",
|
||||
"upload": "Choose a background from your pc",
|
||||
"searchPlaceholder": "Search for a background…",
|
||||
|
@ -199,40 +207,40 @@
|
|||
"removeSuccess": "The background has been removed successfully!"
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{project}\"",
|
||||
"header": "Delete this project",
|
||||
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||
"title": "Delete \"{list}\"",
|
||||
"header": "Delete this list",
|
||||
"text1": "Are you sure you want to delete this list and all of its contents?",
|
||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||
"success": "The project was successfully deleted.",
|
||||
"success": "The list was successfully deleted.",
|
||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||
"noTasksToDelete": "This list does not contain any tasks, it should be safe to delete."
|
||||
},
|
||||
"duplicate": {
|
||||
"title": "Duplicate this project",
|
||||
"title": "Duplicate this list",
|
||||
"label": "Duplicate",
|
||||
"text": "Select a namespace which should hold the duplicated project:",
|
||||
"success": "The project was successfully duplicated."
|
||||
"text": "Select a namespace which should hold the duplicated list:",
|
||||
"success": "The list was successfully duplicated."
|
||||
},
|
||||
"edit": {
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifier": "Project Identifier",
|
||||
"identifierPlaceholder": "The project identifier goes here…",
|
||||
"header": "Edit This List",
|
||||
"title": "Edit \"{list}\"",
|
||||
"titlePlaceholder": "The list 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.",
|
||||
"identifier": "List Identifier",
|
||||
"identifierPlaceholder": "The list identifier goes here…",
|
||||
"description": "Description",
|
||||
"descriptionPlaceholder": "The projects description goes here…",
|
||||
"descriptionPlaceholder": "The lists description goes here…",
|
||||
"color": "Color",
|
||||
"success": "The project was successfully updated."
|
||||
"success": "The list was successfully updated."
|
||||
},
|
||||
"share": {
|
||||
"header": "Share this project",
|
||||
"title": "Share \"{project}\"",
|
||||
"header": "Share this list",
|
||||
"title": "Share \"{list}\"",
|
||||
"share": "Share",
|
||||
"links": {
|
||||
"title": "Share Links",
|
||||
"what": "What is a share link?",
|
||||
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||
"explanation": "Share Links allow you to easily share a list with other users who don't have an account on Vikunja.",
|
||||
"create": "Create a new link share",
|
||||
"name": "Name (optional)",
|
||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||
|
@ -241,7 +249,7 @@
|
|||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||
"noName": "No name set",
|
||||
"remove": "Remove a link share",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"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!",
|
||||
"createSuccess": "The link share was successfully created.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"view": "View",
|
||||
|
@ -270,14 +278,6 @@
|
|||
"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": {
|
||||
"title": "Gantt",
|
||||
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||
|
@ -322,36 +322,36 @@
|
|||
}
|
||||
},
|
||||
"namespace": {
|
||||
"title": "Namespaces & Projects",
|
||||
"title": "Namespaces & Lists",
|
||||
"namespace": "Namespace",
|
||||
"showArchived": "Show Archived",
|
||||
"noneAvailable": "You don't have any namespaces right now.",
|
||||
"unarchive": "Un-Archive",
|
||||
"archived": "Archived",
|
||||
"noProjects": "This namespace does not contain any projects.",
|
||||
"createProject": "Create a new project in this namespace.",
|
||||
"noLists": "This namespace does not contain any lists.",
|
||||
"createList": "Create a new list in this namespace.",
|
||||
"namespaces": "Namespaces",
|
||||
"search": "Type to search for a namespace…",
|
||||
"create": {
|
||||
"title": "New namespace",
|
||||
"titleRequired": "Please specify a title.",
|
||||
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
|
||||
"explanation": "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.",
|
||||
"tooltip": "What's a namespace?",
|
||||
"success": "The namespace was successfully created."
|
||||
},
|
||||
"archive": {
|
||||
"titleArchive": "Archive \"{namespace}\"",
|
||||
"titleUnarchive": "Un-Archive \"{namespace}\"",
|
||||
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
|
||||
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||
"archiveText": "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.",
|
||||
"unarchiveText": "You will be able to create new lists or edit it.",
|
||||
"success": "The namespace was successfully archived.",
|
||||
"unarchiveSuccess": "The namespace was successfully un-archived.",
|
||||
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||
"description": "If a namespace is archived, you cannot create new lists or edit it."
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{namespace}\"",
|
||||
"text1": "Are you sure you want to delete this namespace and all of its contents?",
|
||||
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||
"text2": "This includes all lists and tasks and CANNOT BE UNDONE!",
|
||||
"success": "The namespace was successfully deleted."
|
||||
},
|
||||
"edit": {
|
||||
|
@ -371,8 +371,8 @@
|
|||
"isArchived": "This namespace is archived"
|
||||
},
|
||||
"pseudo": {
|
||||
"sharedProjects": {
|
||||
"title": "Shared Projects"
|
||||
"sharedLists": {
|
||||
"title": "Shared Lists"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "Favorites"
|
||||
|
@ -403,7 +403,7 @@
|
|||
},
|
||||
"create": {
|
||||
"title": "New Saved Filter",
|
||||
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
||||
"description": "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.",
|
||||
"action": "Create new saved filter",
|
||||
"titleRequired": "Please provide a title for the filter."
|
||||
},
|
||||
|
@ -435,7 +435,7 @@
|
|||
"label": {
|
||||
"title": "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 project 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 list you have access.",
|
||||
"newCTA": "You currently do not have any labels.",
|
||||
"search": "Type to search for a label…",
|
||||
"create": {
|
||||
|
@ -460,7 +460,7 @@
|
|||
},
|
||||
"sharing": {
|
||||
"authenticating": "Authenticating…",
|
||||
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||
"passwordRequired": "This shared list requires a password. Please enter it below:",
|
||||
"error": "An error occured.",
|
||||
"invalidPassword": "The password is invalid."
|
||||
},
|
||||
|
@ -529,7 +529,7 @@
|
|||
"code": "Code",
|
||||
"quote": "Quote",
|
||||
"unorderedList": "Unordered List",
|
||||
"orderedList ": "Ordered List",
|
||||
"orderedList": "Ordered List",
|
||||
"cleanBlock": "Clean Block",
|
||||
"link": "Link",
|
||||
"image": "Image",
|
||||
|
@ -602,7 +602,6 @@
|
|||
"addReminder": "Add a new reminder…",
|
||||
"doneSuccess": "The task was successfully marked as done.",
|
||||
"undoneSuccess": "The task was successfully un-marked as done.",
|
||||
"undo": "Undo",
|
||||
"openDetail": "Open task detail view",
|
||||
"checklistTotal": "{checked} of {total} tasks",
|
||||
"checklistAllDone": "{total} tasks",
|
||||
|
@ -619,7 +618,7 @@
|
|||
"chooseDueDate": "Click here to set a due date",
|
||||
"chooseStartDate": "Click here to set a start date",
|
||||
"chooseEndDate": "Click here to set an end date",
|
||||
"move": "Move task to a different project",
|
||||
"move": "Move task to a different list",
|
||||
"done": "Mark task done!",
|
||||
"undone": "Mark as undone",
|
||||
"created": "Created {0} by {1}",
|
||||
|
@ -627,7 +626,7 @@
|
|||
"doneAt": "Done {0}",
|
||||
"updateSuccess": "The task was saved successfully.",
|
||||
"deleteSuccess": "The task has been deleted successfully.",
|
||||
"belongsToProject": "This task belongs to project '{project}'",
|
||||
"belongsToList": "This task belongs to list '{list}'",
|
||||
"due": "Due {at}",
|
||||
"closePopup": "Close popup",
|
||||
"delete": {
|
||||
|
@ -647,7 +646,7 @@
|
|||
"percentDone": "Set Progress",
|
||||
"attachments": "Add Attachments",
|
||||
"relatedTasks": "Add Relation",
|
||||
"moveProject": "Move",
|
||||
"moveList": "Move",
|
||||
"color": "Set Color",
|
||||
"delete": "Delete",
|
||||
"favorite": "Add to Favorites",
|
||||
|
@ -674,21 +673,21 @@
|
|||
"updated": "Updated"
|
||||
},
|
||||
"subscription": {
|
||||
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||
"subscribedListThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this list through its namespace.",
|
||||
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
|
||||
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||
"subscribedTaskThroughParentList": "You can't unsubscribe here because you are subscribed to this task through its list.",
|
||||
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
|
||||
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
|
||||
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||
"subscribedList": "You are currently subscribed to this list and will receive notifications for changes.",
|
||||
"notSubscribedList": "You are not subscribed to this list and won't receive notifications for changes.",
|
||||
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
|
||||
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
|
||||
"subscribe": "Subscribe",
|
||||
"unsubscribe": "Unsubscribe",
|
||||
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
||||
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
||||
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||
"subscribeSuccessList": "You are now subscribed to this list",
|
||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||
},
|
||||
|
@ -762,7 +761,7 @@
|
|||
"new": "New Task Relation",
|
||||
"searchPlaceholder": "Type search for a new task to add as related…",
|
||||
"createPlaceholder": "Add this as new related task",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentList": "This task belongs to a different list.",
|
||||
"differentNamespace": "This task belongs to a different namespace.",
|
||||
"noneYet": "No task relations yet.",
|
||||
"delete": "Delete Task Relation",
|
||||
|
@ -812,10 +811,10 @@
|
|||
"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.",
|
||||
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
||||
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||
"list1": "To set a list for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"list2": "This will return an error if the list does not exist.",
|
||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
||||
"list4": "For example: {prefix}\"List with spaces\".",
|
||||
"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:",
|
||||
"dateWeekday": "any weekday, will use the next date with that date",
|
||||
|
@ -848,19 +847,19 @@
|
|||
"delete": {
|
||||
"header": "Delete the team",
|
||||
"text1": "Are you sure you want to delete this team and all of its members?",
|
||||
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"text2": "All team members will lose access to lists and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"success": "The team was successfully deleted."
|
||||
},
|
||||
"deleteUser": {
|
||||
"header": "Remove a user from the team",
|
||||
"text1": "Are you sure you want to remove this user from the team?",
|
||||
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"text2": "They will lose access to all lists and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"success": "The user was successfully deleted from the team."
|
||||
},
|
||||
"leave": {
|
||||
"title": "Leave team",
|
||||
"text1": "Are you sure you want to leave this team?",
|
||||
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
||||
"text2": "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.",
|
||||
"success": "You have successfully left the team."
|
||||
}
|
||||
},
|
||||
|
@ -892,12 +891,12 @@
|
|||
"attachment": "Add an attachment to this task",
|
||||
"related": "Modify related tasks of this task",
|
||||
"color": "Change the color of this task",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Move this task to another list",
|
||||
"reminder": "Manage reminders of this task",
|
||||
"description": "Toggle editing of the task description"
|
||||
},
|
||||
"project": {
|
||||
"title": "Project Views",
|
||||
"list": {
|
||||
"title": "List Views",
|
||||
"switchToListView": "Switch to list view",
|
||||
"switchToGanttView": "Switch to gantt view",
|
||||
"switchToKanbanView": "Switch to kanban view",
|
||||
|
@ -907,7 +906,7 @@
|
|||
"title": "Navigation",
|
||||
"overview": "Navigate to overview",
|
||||
"upcoming": "Navigate to upcoming tasks",
|
||||
"namespaces": "Navigate to namespaces & projects",
|
||||
"namespaces": "Navigate to namespaces & lists",
|
||||
"labels": "Navigate to labels",
|
||||
"teams": "Navigate to teams"
|
||||
}
|
||||
|
@ -924,7 +923,7 @@
|
|||
"unarchive": "Un-Archive",
|
||||
"setBackground": "Set background",
|
||||
"share": "Share",
|
||||
"newProject": "New project"
|
||||
"newList": "New list"
|
||||
},
|
||||
"apiConfig": {
|
||||
"url": "Vikunja URL",
|
||||
|
@ -943,24 +942,24 @@
|
|||
"notification": {
|
||||
"title": "Notifications",
|
||||
"none": "You don't have any notifications. Have a nice day!",
|
||||
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||
"explainer": "Notifications will appear here when actions on namespaces, lists or tasks you subscribed to happen."
|
||||
},
|
||||
"quickActions": {
|
||||
"commands": "Commands",
|
||||
"placeholder": "Type a command or search…",
|
||||
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
|
||||
"hint": "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.",
|
||||
"tasks": "Tasks",
|
||||
"projects": "Projects",
|
||||
"lists": "Lists",
|
||||
"teams": "Teams",
|
||||
"newProject": "Enter the title of the new project…",
|
||||
"newList": "Enter the title of the new list…",
|
||||
"newTask": "Enter the title of the new task…",
|
||||
"newNamespace": "Enter the title of the new namespace…",
|
||||
"newTeam": "Enter the name of the new team…",
|
||||
"createTask": "Create a task in the current project ({title})",
|
||||
"createProject": "Create a project in the current namespace ({title})",
|
||||
"createTask": "Create a task in the current list ({title})",
|
||||
"createList": "Create a list in the current namespace ({title})",
|
||||
"cmds": {
|
||||
"newTask": "New task",
|
||||
"newProject": "New project",
|
||||
"newList": "New list",
|
||||
"newNamespace": "New namespace",
|
||||
"newTeam": "New team"
|
||||
}
|
||||
|
@ -992,15 +991,15 @@
|
|||
"1018": "The user avatar type setting is invalid.",
|
||||
"2001": "ID cannot be empty or 0.",
|
||||
"2002": "Some of the request data was invalid.",
|
||||
"3001": "The project does not exist.",
|
||||
"3004": "You need to have read permissions on that project to perform that action.",
|
||||
"3005": "The project title cannot be empty.",
|
||||
"3006": "The project share does not exist.",
|
||||
"3007": "A project with this identifier already exists.",
|
||||
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
|
||||
"4001": "The project task text cannot be empty.",
|
||||
"4002": "The project task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same project.",
|
||||
"3001": "The list does not exist.",
|
||||
"3004": "You need to have read permissions on that list to perform that action.",
|
||||
"3005": "The list title cannot be empty.",
|
||||
"3006": "The list share does not exist.",
|
||||
"3007": "A list 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.",
|
||||
"4001": "The list task text cannot be empty.",
|
||||
"4002": "The list task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same list.",
|
||||
"4004": "Need at least one task when bulk editing tasks.",
|
||||
"4005": "You do not have the right to see the task.",
|
||||
"4006": "You can't set a parent task as the task itself.",
|
||||
|
@ -1026,21 +1025,21 @@
|
|||
"5012": "The namespace is archived and can therefore only be accessed read only.",
|
||||
"6001": "The team name cannot be empty.",
|
||||
"6002": "The team does not exist.",
|
||||
"6004": "The team already has access to that namespace or project.",
|
||||
"6004": "The team already has access to that namespace or list.",
|
||||
"6005": "The user is already a member of that team.",
|
||||
"6006": "Cannot delete the last team member.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "The user already has access to that project.",
|
||||
"7003": "You do not have access to that project.",
|
||||
"6007": "The team does not have access to the list to perform that action.",
|
||||
"7002": "The user already has access to that list.",
|
||||
"7003": "You do not have access to that list.",
|
||||
"8001": "This label already exists on that task.",
|
||||
"8002": "The label does not exist.",
|
||||
"8003": "You do not have access to this label.",
|
||||
"9001": "The right is invalid.",
|
||||
"10001": "The bucket does not exist.",
|
||||
"10002": "The bucket does not belong to that project.",
|
||||
"10003": "You cannot remove the last bucket on a project.",
|
||||
"10002": "The bucket does not belong to that list.",
|
||||
"10003": "You cannot remove the last bucket on a list.",
|
||||
"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 project.",
|
||||
"10005": "There can be only one done bucket per list.",
|
||||
"11001": "The saved filter does not exist.",
|
||||
"11002": "Saved filters are not available for link shares.",
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
"welcomeDay": "Ahoj {username}!",
|
||||
"welcomeEvening": "Dobrý večer {username}!",
|
||||
"lastViewed": "Naposledy zobrazeno",
|
||||
"project": {
|
||||
"newText": "You can create a new project for your new tasks:",
|
||||
"new": "New project",
|
||||
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
"list": {
|
||||
"newText": "Můžete vytvořit nový seznam pro své nové úkoly:",
|
||||
"new": "Nový seznam",
|
||||
"importText": "Nebo importujte své seznamy a úkoly z jiných služeb:",
|
||||
"import": "Importujte svá data do Vikunja"
|
||||
}
|
||||
},
|
||||
"404": {
|
||||
|
@ -85,7 +85,7 @@
|
|||
"weekStartSunday": "Neděle",
|
||||
"weekStartMonday": "Pondělí",
|
||||
"language": "Jazyk",
|
||||
"defaultProject": "Default Project",
|
||||
"defaultList": "Výchozí seznam",
|
||||
"timezone": "Časové pásmo",
|
||||
"overdueTasksRemindersTime": "Čas odeslání emailu o zpožděných úkolech"
|
||||
},
|
||||
|
@ -143,7 +143,7 @@
|
|||
},
|
||||
"deletion": {
|
||||
"title": "Smazat svůj účet",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
|
||||
"text1": "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.",
|
||||
"text2": "Chcete-li pokračovat, zadejte své heslo. Obdržíte e-mail s dalšími pokyny.",
|
||||
"confirm": "Smazat můj účet",
|
||||
"requestSuccess": "Požadavek byl úspěšný. Obdržíte e-mail s dalšími pokyny.",
|
||||
|
@ -157,201 +157,201 @@
|
|||
},
|
||||
"export": {
|
||||
"title": "Exportovat data účtu",
|
||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
||||
"description": "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.",
|
||||
"descriptionPasswordRequired": "Pokračujte zadáním vašeho hesla:",
|
||||
"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.",
|
||||
"downloadTitle": "Stáhnout exportovaná Vikunja data"
|
||||
}
|
||||
},
|
||||
"project": {
|
||||
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Project Title",
|
||||
"color": "Color",
|
||||
"projects": "Projects",
|
||||
"search": "Type to search for a project…",
|
||||
"searchSelect": "Click or press enter to select this project",
|
||||
"shared": "Shared Projects",
|
||||
"noDescriptionAvailable": "No project description is available.",
|
||||
"list": {
|
||||
"archived": "Tento seznam je archivován. Není možné vytvářet nebo upravovat jeho úkoly.",
|
||||
"title": "Název seznamu",
|
||||
"color": "Barva",
|
||||
"lists": "Seznamy",
|
||||
"list": {
|
||||
"title": "Seznam",
|
||||
"add": "Přidat",
|
||||
"addPlaceholder": "Přidat nový úkol…",
|
||||
"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": {
|
||||
"header": "New project",
|
||||
"titlePlaceholder": "The project's title goes here…",
|
||||
"addTitleRequired": "Please specify a title.",
|
||||
"createdSuccess": "The project was successfully created.",
|
||||
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||
"header": "Nový seznam",
|
||||
"titlePlaceholder": "Název seznamu přijde sem…",
|
||||
"addTitleRequired": "Uveďte prosím název.",
|
||||
"createdSuccess": "Seznam byl úspěšně vytvořen.",
|
||||
"addListRequired": "Vyberte seznam nebo nastavte výchozí seznam v nastavení."
|
||||
},
|
||||
"archive": {
|
||||
"title": "Archive \"{project}\"",
|
||||
"archive": "Archive this project",
|
||||
"unarchive": "Un-Archive this project",
|
||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||
"success": "The project was successfully archived."
|
||||
"title": "Archivovat \"{list}\"",
|
||||
"archive": "Archivovat tento seznam",
|
||||
"unarchive": "Odarchivovat tento seznam",
|
||||
"unarchiveText": "Budete moci vytvářet nové úkoly nebo je upravovat.",
|
||||
"archiveText": "Tento seznam nebude možné upravovat ani vytvářet nové úkoly, dokud jej neodarchivujete.",
|
||||
"success": "Seznam byl úspěšně archivován."
|
||||
},
|
||||
"background": {
|
||||
"title": "Set project background",
|
||||
"remove": "Remove Background",
|
||||
"upload": "Choose a background from your pc",
|
||||
"searchPlaceholder": "Search for a background…",
|
||||
"poweredByUnsplash": "Powered by Unsplash",
|
||||
"loadMore": "Load more photos",
|
||||
"success": "The background has been set successfully!",
|
||||
"removeSuccess": "The background has been removed successfully!"
|
||||
"title": "Nastavit pozadí seznamu",
|
||||
"remove": "Odstranit pozadí",
|
||||
"upload": "Vyberte si pozadí ze svého počítače",
|
||||
"searchPlaceholder": "Hledat pozadí…",
|
||||
"poweredByUnsplash": "Běží na Unsplash",
|
||||
"loadMore": "Načíst více fotek",
|
||||
"success": "Pozadí bylo úspěšně nastaveno!",
|
||||
"removeSuccess": "Pozadí bylo úspěšně odebráno!"
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{project}\"",
|
||||
"header": "Delete this project",
|
||||
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||
"success": "The project was successfully deleted.",
|
||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||
"title": "Smazat \"{list}\"",
|
||||
"header": "Smazat tento seznam",
|
||||
"text1": "Opravdu chcete odstranit tento seznam a jeho obsah?",
|
||||
"text2": "To zahrnuje všechny úkoly a NEMŮŽE BÝT VRÁCENO ZPĚT!",
|
||||
"success": "Seznam byl úspěšně smazán.",
|
||||
"tasksToDelete": "Navždy smazat asi {count} úkolů.",
|
||||
"noTasksToDelete": "Tento seznam neobsahuje žádné úkoly, mělo by být bezpečné ho smazat."
|
||||
},
|
||||
"duplicate": {
|
||||
"title": "Duplicate this project",
|
||||
"label": "Duplicate",
|
||||
"text": "Select a namespace which should hold the duplicated project:",
|
||||
"success": "The project was successfully duplicated."
|
||||
"title": "Duplikovat tento seznam",
|
||||
"label": "Duplikovat",
|
||||
"text": "Vyberte prostor, kam uložit duplicitní seznam:",
|
||||
"success": "Seznam byl úspěšně duplikován."
|
||||
},
|
||||
"edit": {
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifier": "Project Identifier",
|
||||
"identifierPlaceholder": "The project identifier goes here…",
|
||||
"description": "Description",
|
||||
"descriptionPlaceholder": "The projects description goes here…",
|
||||
"color": "Color",
|
||||
"success": "The project was successfully updated."
|
||||
"header": "Upravit tento seznam",
|
||||
"title": "Upravit \"{list}\"",
|
||||
"titlePlaceholder": "Název seznamu přijde sem…",
|
||||
"identifierTooltip": "Identifikátor seznamu může být použit k jedinečné identifikaci úkolu napříč seznamy. Nechte ho prázdný pro jeho vypnutí.",
|
||||
"identifier": "Identifikátor seznamu",
|
||||
"identifierPlaceholder": "Identifikátor seznamu přijde sem…",
|
||||
"description": "Popis",
|
||||
"descriptionPlaceholder": "Popis seznamu přijde sem…",
|
||||
"color": "Barva",
|
||||
"success": "Seznam byl úspěšně aktualizován."
|
||||
},
|
||||
"share": {
|
||||
"header": "Share this project",
|
||||
"title": "Share \"{project}\"",
|
||||
"share": "Share",
|
||||
"header": "Sdílet tento seznam",
|
||||
"title": "Sdílet \"{list}\"",
|
||||
"share": "Sdílet",
|
||||
"links": {
|
||||
"title": "Share Links",
|
||||
"what": "What is a share link?",
|
||||
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||
"create": "Create a new link share",
|
||||
"name": "Name (optional)",
|
||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||
"password": "Password (optional)",
|
||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||
"noName": "No name set",
|
||||
"remove": "Remove a link share",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"createSuccess": "The link share was successfully created.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"view": "View",
|
||||
"sharedBy": "Shared by {0}"
|
||||
"title": "Sdílet odkazy",
|
||||
"what": "Co je to sdílený odkaz?",
|
||||
"explanation": "Sdílení odkazů vám umožňuje snadno sdílet seznam s ostatními uživateli, kteří nemají účet na Vikunja.",
|
||||
"create": "Vytvořit sdílený odkaz",
|
||||
"name": "Název (volitelný)",
|
||||
"namePlaceholder": "např. Lorem Ipsum",
|
||||
"nameExplanation": "Všechny akce provedené tímto odkazem se zobrazí s tímto názvem.",
|
||||
"password": "Heslo (volitelné)",
|
||||
"passwordExplanation": "Při autentizaci bude uživatel muset zadat toto heslo.",
|
||||
"noName": "Není nastaven žádný název",
|
||||
"remove": "Odstranit sdílený odkaz",
|
||||
"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!",
|
||||
"createSuccess": "Sdílený odkaz byl úspěšně vytvořen.",
|
||||
"deleteSuccess": "Sdílený odkaz byl úspěšně smazán",
|
||||
"view": "Zobrazit",
|
||||
"sharedBy": "Sdíleno {0}"
|
||||
},
|
||||
"userTeam": {
|
||||
"typeUser": "user | users",
|
||||
"typeTeam": "team | teams",
|
||||
"shared": "Shared with these {type}",
|
||||
"you": "You",
|
||||
"notShared": "Not shared with any {type} yet.",
|
||||
"removeHeader": "Remove a {type} from the {sharable}",
|
||||
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||
"addedSuccess": "The {type} was successfully added.",
|
||||
"updatedSuccess": "The {type} was successfully added."
|
||||
"typeUser": "uživatel | uživatelé",
|
||||
"typeTeam": "tým | týmy",
|
||||
"shared": "Sdíleno s těmito {type}",
|
||||
"you": "Ty",
|
||||
"notShared": "Zatím není sdíleno s žádnou {type}.",
|
||||
"removeHeader": "Odstranit {type} z {sharable}",
|
||||
"removeText": "Jste si jisti, že chcete odstranit {sharable} z {type}.? Tuto akci nelze vrátit zpět!",
|
||||
"removeSuccess": "{sharable} byl úspěšně odebrán z {type}.",
|
||||
"addedSuccess": "{type} byl úspěšně přidán.",
|
||||
"updatedSuccess": "{type} byl úspěšně přidán."
|
||||
},
|
||||
"right": {
|
||||
"title": "Permission",
|
||||
"read": "Read only",
|
||||
"readWrite": "Read & write",
|
||||
"admin": "Admin"
|
||||
"title": "Oprávnění",
|
||||
"read": "Pouze pro čtení",
|
||||
"readWrite": "Čtení a zápis",
|
||||
"admin": "Administrátor"
|
||||
},
|
||||
"attributes": {
|
||||
"link": "Link",
|
||||
"delete": "Delete"
|
||||
"link": "Odkaz",
|
||||
"delete": "Smazat"
|
||||
}
|
||||
},
|
||||
"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": {
|
||||
"title": "Gantt",
|
||||
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||
"size": "Size",
|
||||
"default": "Default",
|
||||
"month": "Month",
|
||||
"day": "Day",
|
||||
"hour": "Hour",
|
||||
"range": "Date Range",
|
||||
"noDates": "This task has no dates set."
|
||||
"showTasksWithoutDates": "Zobrazit úkoly, které nemají nastavené datum",
|
||||
"size": "Velikost",
|
||||
"default": "Výchozí",
|
||||
"month": "Měsíc",
|
||||
"day": "Den",
|
||||
"hour": "Hodina",
|
||||
"range": "Časové období",
|
||||
"noDates": "Tento úkol nemá nastaveno žádné datum."
|
||||
},
|
||||
"table": {
|
||||
"title": "Table",
|
||||
"columns": "Columns"
|
||||
"title": "Tabulka",
|
||||
"columns": "Sloupce"
|
||||
},
|
||||
"kanban": {
|
||||
"title": "Kanban",
|
||||
"limit": "Limit: {limit}",
|
||||
"noLimit": "Not Set",
|
||||
"doneBucket": "Done bucket",
|
||||
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
|
||||
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||
"deleteLast": "You cannot remove the last bucket.",
|
||||
"addTaskPlaceholder": "Enter the new task title…",
|
||||
"addTask": "Add a task",
|
||||
"addAnotherTask": "Add another task",
|
||||
"addBucket": "Create a new bucket",
|
||||
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||
"deleteHeaderBucket": "Delete the bucket",
|
||||
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"noLimit": "Nenastaveno",
|
||||
"doneBucket": "Sloupec \"Hotovo\"",
|
||||
"doneBucketHint": "Všechny úkoly přesunuté do tohoto sloupce budou automaticky označeny jako dokončené.",
|
||||
"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é.",
|
||||
"doneBucketSavedSuccess": "Sloupec \"Hotovo\" byl úspěšně uložen.",
|
||||
"deleteLast": "Nelze odstranit poslední sloupec.",
|
||||
"addTaskPlaceholder": "Zadejte nový název úkolu…",
|
||||
"addTask": "Přidat úkol",
|
||||
"addAnotherTask": "Přidat další úkol",
|
||||
"addBucket": "Vytvořit nový sloupec",
|
||||
"addBucketPlaceholder": "Zadejte název nového sloupce…",
|
||||
"deleteHeaderBucket": "Smazat sloupec",
|
||||
"deleteBucketText1": "Opravdu chcete smazat tento sloupec?",
|
||||
"deleteBucketText2": "Toto nesmaže žádné úkoly, ale přesune je do výchozího sloupce.",
|
||||
"deleteBucketSuccess": "Sloupec byl úspěšně smazán.",
|
||||
"bucketTitleSavedSuccess": "Název sloupce byl úspěšně uložen.",
|
||||
"bucketLimitSavedSuccess": "Limit sloupce byl úspěšně uložen.",
|
||||
"collapse": "Sbalit tento sloupec"
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
"title": "Favorites"
|
||||
"title": "Oblíbené"
|
||||
}
|
||||
}
|
||||
},
|
||||
"namespace": {
|
||||
"title": "Namespaces & Projects",
|
||||
"title": "Prostory a seznamy",
|
||||
"namespace": "Prostor",
|
||||
"showArchived": "Zobrazit archivované",
|
||||
"noneAvailable": "Momentálně nemáte žádné prostory.",
|
||||
"unarchive": "Obnovit archiv",
|
||||
"archived": "Archivováno",
|
||||
"noProjects": "This namespace does not contain any projects.",
|
||||
"createProject": "Create a new project in this namespace.",
|
||||
"noLists": "Tento prostor neobsahuje žádné seznamy.",
|
||||
"createList": "Vytvořit nový seznam v tomto prostoru.",
|
||||
"namespaces": "Prostory",
|
||||
"search": "Začni psát pro vyhledání prostoru…",
|
||||
"create": {
|
||||
"title": "Nový prostor",
|
||||
"titleRequired": "Uveďte prosím název.",
|
||||
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
|
||||
"explanation": "Prostor je kolekce seznamů, které můžete sdílet a používat k organizaci seznamů. Každý seznam patří do nějakého prostoru.",
|
||||
"tooltip": "Co je prostor?",
|
||||
"success": "Prostor byl úspěšně vytvořen."
|
||||
},
|
||||
"archive": {
|
||||
"titleArchive": "Archivovat \"{namespace}\"",
|
||||
"titleUnarchive": "Odarchivovat \"{namespace}\"",
|
||||
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
|
||||
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||
"archiveText": "Nebudete moci upravovat tento jmenný prostor ani vytvářet nové seznamy, dokud jej neodarchivujete. Všechny seznamy v tomto prostoru budou také archivovány.",
|
||||
"unarchiveText": "Budete moci vytvářet nové úkoly nebo je upravovat.",
|
||||
"success": "Prostor byl úspěšně archivován.",
|
||||
"unarchiveSuccess": "Jmenný prostor byl úspěšně obnoven.",
|
||||
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||
"description": "Pokud je prostor archivován, nelze vytvořit nové seznamy nebo je upravit."
|
||||
},
|
||||
"delete": {
|
||||
"title": "Smazat \"{namespace}\"",
|
||||
"text1": "Opravdu chcete odstranit tento prostor a všechen jeho obsah?",
|
||||
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||
"text2": "To zahrnuje všechny seznamy a úkoly a NEMŮŽE BÝT VRÁCENO ZPĚT!",
|
||||
"success": "Prostor byl úspěšně smazán."
|
||||
},
|
||||
"edit": {
|
||||
|
@ -371,8 +371,8 @@
|
|||
"isArchived": "Tento prostor je archivován"
|
||||
},
|
||||
"pseudo": {
|
||||
"sharedProjects": {
|
||||
"title": "Shared Projects"
|
||||
"sharedLists": {
|
||||
"title": "Sdílené seznamy"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "Oblíbené"
|
||||
|
@ -403,7 +403,7 @@
|
|||
},
|
||||
"create": {
|
||||
"title": "Nový uložený filtr",
|
||||
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
||||
"description": "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.",
|
||||
"action": "Vytvořit uložený filtr",
|
||||
"titleRequired": "Please provide a title for the filter."
|
||||
},
|
||||
|
@ -435,7 +435,7 @@
|
|||
"label": {
|
||||
"title": "Štítky",
|
||||
"manage": "Spravovat štítky",
|
||||
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
|
||||
"description": "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.",
|
||||
"newCTA": "Momentálně nemáte žádné štítky.",
|
||||
"search": "Zadejte hledaný štítek…",
|
||||
"create": {
|
||||
|
@ -460,7 +460,7 @@
|
|||
},
|
||||
"sharing": {
|
||||
"authenticating": "Ověřování…",
|
||||
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||
"passwordRequired": "Tento sdílený seznam vyžaduje heslo. Zadejte jej níže:",
|
||||
"error": "Došlo k chybě.",
|
||||
"invalidPassword": "Neplatné heslo."
|
||||
},
|
||||
|
@ -529,7 +529,7 @@
|
|||
"code": "Kód",
|
||||
"quote": "Citace",
|
||||
"unorderedList": "Seznam s odrážkami",
|
||||
"orderedList ": "Ordered List",
|
||||
"orderedList": "Číslovaný seznam",
|
||||
"cleanBlock": "Čistý blok",
|
||||
"link": "Odkaz",
|
||||
"image": "Obrázek",
|
||||
|
@ -602,7 +602,6 @@
|
|||
"addReminder": "Přidat novou připomínku…",
|
||||
"doneSuccess": "Úkol byl úspěšně označen jako dokončený.",
|
||||
"undoneSuccess": "Úkol byl úspěšně znovu otevřen.",
|
||||
"undo": "Undo",
|
||||
"openDetail": "Otevřít zobrazení detailu úkolu",
|
||||
"checklistTotal": "{checked} z {total} úkolů",
|
||||
"checklistAllDone": "{total} úkolů",
|
||||
|
@ -619,7 +618,7 @@
|
|||
"chooseDueDate": "Klikněte zde pro nastavení termínu dokončení",
|
||||
"chooseStartDate": "Klikněte zde pro nastavení počátečního data",
|
||||
"chooseEndDate": "Klikněte zde pro nastavení data ukončení",
|
||||
"move": "Move task to a different project",
|
||||
"move": "Přesunout úkol do jiného seznamu",
|
||||
"done": "Označit úkol jako hotový!",
|
||||
"undone": "Označit jako znovu otevřené",
|
||||
"created": "Vytvořeno {0} uživatelem {1}",
|
||||
|
@ -627,7 +626,7 @@
|
|||
"doneAt": "Dokončeno {0}",
|
||||
"updateSuccess": "Úkol byl úspěšně uložen.",
|
||||
"deleteSuccess": "Úkol byl úspěšně smazán.",
|
||||
"belongsToProject": "This task belongs to project '{project}'",
|
||||
"belongsToList": "Tento úkol patří do seznamu '{list}'",
|
||||
"due": "Termín {at}",
|
||||
"closePopup": "Zavřít vyskakovací okno",
|
||||
"delete": {
|
||||
|
@ -647,7 +646,7 @@
|
|||
"percentDone": "Nastavit průběh",
|
||||
"attachments": "Přidat přílohy",
|
||||
"relatedTasks": "Přidat vztah",
|
||||
"moveProject": "Move",
|
||||
"moveList": "Přesunout",
|
||||
"color": "Nastavit barvu",
|
||||
"delete": "Smazat",
|
||||
"favorite": "Přidat do oblíbených",
|
||||
|
@ -674,21 +673,21 @@
|
|||
"updated": "Aktualizováno"
|
||||
},
|
||||
"subscription": {
|
||||
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||
"subscribedListThroughParentNamespace": "Zde se nemůžete odhlásit, protože jste přihlášeni k odběru tohoto seznamu 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.",
|
||||
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||
"subscribedTaskThroughParentList": "Zde se nemůžete odhlásit, protože jste přihlášeni k odběru tohoto úkolu prostřednictvím jeho seznamu.",
|
||||
"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.",
|
||||
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||
"subscribedList": "Nyní jste přihlášeni k odběru tohoto seznamu a budete dostávat oznámení o změnách.",
|
||||
"notSubscribedList": "Nejste přihlášeni k odběru tohoto seznamu, takže nebudete dostávat upozornění na změny.",
|
||||
"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.",
|
||||
"subscribe": "Odebírat",
|
||||
"unsubscribe": "Odhlásit odběr",
|
||||
"subscribeSuccessNamespace": "Nyní jste přihlášeni k tomuto prostoru",
|
||||
"unsubscribeSuccessNamespace": "Nyní jste odhlášeni od tohoto prostoru",
|
||||
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||
"subscribeSuccessList": "Nyní jste přihlášeni k tomuto seznamu",
|
||||
"unsubscribeSuccessList": "Nyní jste odhlášeni od tohoto seznamu",
|
||||
"subscribeSuccessTask": "Nyní jste přihlášeni k tomuto úkolu",
|
||||
"unsubscribeSuccessTask": "Nyní jste odhlášeni od tohoto úkolu"
|
||||
},
|
||||
|
@ -762,7 +761,7 @@
|
|||
"new": "Nový vztah k úkolu",
|
||||
"searchPlaceholder": "Hledejte nový úkol, který chcete přidat jako související…",
|
||||
"createPlaceholder": "Přidat toto jako nový související úkol",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentList": "Tento úkol patří do jiného seznamu.",
|
||||
"differentNamespace": "Tento úkol patří do jiného prostoru.",
|
||||
"noneYet": "Zatím žádné vztahy mezi úkoly.",
|
||||
"delete": "Odstranit vztah k úloze",
|
||||
|
@ -812,10 +811,10 @@
|
|||
"priority1": "Chcete-li nastavit prioritu úkolu, přidejte číslo 1-5, s prefixem {prefix}.",
|
||||
"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}.",
|
||||
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||
"list1": "Chcete-li nastavit seznam, ve kterém se má úkol zobrazit, zadejte jeho název s předponou {prefix}.",
|
||||
"list2": "Toto vrátí chybu, pokud seznam neexistuje.",
|
||||
"list3": "Chcete-li použít mezery, uzavřete název seznamu do \" nebo '.",
|
||||
"list4": "Například: {prefix}\"Štítek s mezerami\".",
|
||||
"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ů:",
|
||||
"dateWeekday": "každý pracovní den použije další datum s tímto datem",
|
||||
|
@ -848,19 +847,19 @@
|
|||
"delete": {
|
||||
"header": "Smazat tým",
|
||||
"text1": "Jste si jisti, že chcete smazat tento tým a všechny jeho členy?",
|
||||
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"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!",
|
||||
"success": "Tým byl úspěšně smazán."
|
||||
},
|
||||
"deleteUser": {
|
||||
"header": "Odebrat uživatele z týmu",
|
||||
"text1": "Opravdu chcete odebrat tohoto uživatele z týmu?",
|
||||
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"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!",
|
||||
"success": "Uživatel byl úspěšně odstraněn z týmu."
|
||||
},
|
||||
"leave": {
|
||||
"title": "Opustit tým",
|
||||
"text1": "Opravdu chcete opustit tento tým?",
|
||||
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
||||
"text2": "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.",
|
||||
"success": "Úspěšně jste opustili tým."
|
||||
}
|
||||
},
|
||||
|
@ -892,22 +891,22 @@
|
|||
"attachment": "Přidat přílohu k tomuto úkolu",
|
||||
"related": "Upravit související úkoly tohoto úkolu",
|
||||
"color": "Změnit barvu tohoto úkolu",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Přesunout tento úkol do jiného seznamu",
|
||||
"reminder": "Spravovat připomenutí této úlohy",
|
||||
"description": "Přepnout úpravy popisu úkolu"
|
||||
},
|
||||
"project": {
|
||||
"title": "Project Views",
|
||||
"switchToListView": "Switch to list view",
|
||||
"switchToGanttView": "Switch to gantt view",
|
||||
"switchToKanbanView": "Switch to kanban view",
|
||||
"switchToTableView": "Switch to table view"
|
||||
"list": {
|
||||
"title": "Zobrazení seznamů",
|
||||
"switchToListView": "Přepnout na zobrazení seznamu",
|
||||
"switchToGanttView": "Přepnout na zobrazení gantt",
|
||||
"switchToKanbanView": "Přepnout na zobrazení kanbanu",
|
||||
"switchToTableView": "Přepnout na zobrazení tabulky"
|
||||
},
|
||||
"navigation": {
|
||||
"title": "Navigace",
|
||||
"overview": "Přejít na přehled",
|
||||
"upcoming": "Přejít na nadcházející úkoly",
|
||||
"namespaces": "Navigate to namespaces & projects",
|
||||
"namespaces": "Přejít na prostory a seznamy",
|
||||
"labels": "Přejít na štítky",
|
||||
"teams": "Přejít na týmy"
|
||||
}
|
||||
|
@ -924,7 +923,7 @@
|
|||
"unarchive": "Zrušit archivaci",
|
||||
"setBackground": "Nastavit pozadí",
|
||||
"share": "Sdílet",
|
||||
"newProject": "New project"
|
||||
"newList": "Nový seznam"
|
||||
},
|
||||
"apiConfig": {
|
||||
"url": "Vikunja URL",
|
||||
|
@ -943,24 +942,24 @@
|
|||
"notification": {
|
||||
"title": "Oznámení",
|
||||
"none": "Nemáte žádná oznámení. Mějte příjemný den!",
|
||||
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||
"explainer": "Upozornění se zobrazí zde, když proběhne akce na prostorech, seznamech nebo úkolech, ke kterým jste se přihlásili."
|
||||
},
|
||||
"quickActions": {
|
||||
"commands": "Příkazy",
|
||||
"placeholder": "Napište příkaz nebo vyhledávání…",
|
||||
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
|
||||
"hint": "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ů.",
|
||||
"tasks": "Úkoly",
|
||||
"projects": "Projects",
|
||||
"lists": "Seznamy",
|
||||
"teams": "Týmy",
|
||||
"newProject": "Enter the title of the new project…",
|
||||
"newList": "Zadejte název nového seznamu…",
|
||||
"newTask": "Zadejte název nového úkolu…",
|
||||
"newNamespace": "Zadejte název nového prostoru…",
|
||||
"newTeam": "Zadejte název nového týmu…",
|
||||
"createTask": "Create a task in the current project ({title})",
|
||||
"createProject": "Create a project in the current namespace ({title})",
|
||||
"createTask": "Vytvořit úkol v aktuálním seznamu ({title})",
|
||||
"createList": "Vytvořit seznam v aktuálním prostoru ({title})",
|
||||
"cmds": {
|
||||
"newTask": "Nový úkol",
|
||||
"newProject": "New project",
|
||||
"newList": "Nový seznam",
|
||||
"newNamespace": "Nový prostor",
|
||||
"newTeam": "Nový tým"
|
||||
}
|
||||
|
@ -992,15 +991,15 @@
|
|||
"1018": "Nastavení typu avatara uživatele je neplatné.",
|
||||
"2001": "ID nemůže být prázdné nebo 0.",
|
||||
"2002": "Některé údaje požadavku byly neplatné.",
|
||||
"3001": "The project does not exist.",
|
||||
"3004": "You need to have read permissions on that project to perform that action.",
|
||||
"3005": "The project title cannot be empty.",
|
||||
"3006": "The project share does not exist.",
|
||||
"3007": "A project with this identifier already exists.",
|
||||
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
|
||||
"4001": "The project task text cannot be empty.",
|
||||
"4002": "The project task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same project.",
|
||||
"3001": "Seznam neexistuje.",
|
||||
"3004": "Pro provedení této akce musíte mít oprávnění ke čtení v tomto seznamu.",
|
||||
"3005": "Název seznamu nemůže být prázdný.",
|
||||
"3006": "Sdílení seznamu neexistuje.",
|
||||
"3007": "Seznam s tímto identifikátorem již existuje.",
|
||||
"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.",
|
||||
"4001": "Text úkolu seznamu nemůže být prázdný.",
|
||||
"4002": "Úkol seznamu neexistuje.",
|
||||
"4003": "Všechny úkoly pro hromadnou úpravu musí patřit do stejného seznamu.",
|
||||
"4004": "Při hromadných úpravách úkolů je potřeba alespoň jeden úkol.",
|
||||
"4005": "Nemáte právo vidět tento úkol.",
|
||||
"4006": "Nadřazený úkol nelze nastavit jako takový.",
|
||||
|
@ -1026,21 +1025,21 @@
|
|||
"5012": "Prostor je archivován, a proto je přístupný pouze pro čtení.",
|
||||
"6001": "Název týmu nemůže být prázdný.",
|
||||
"6002": "Tým neexistuje.",
|
||||
"6004": "The team already has access to that namespace or project.",
|
||||
"6004": "Tým již má přístup k tomuto prostoru nebo seznamu.",
|
||||
"6005": "Uživatel je již členem tohoto týmu.",
|
||||
"6006": "Nelze odstranit posledního člena týmu.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "The user already has access to that project.",
|
||||
"7003": "You do not have access to that project.",
|
||||
"6007": "Tým nemá přístup k seznamu pro provedení této akce.",
|
||||
"7002": "Uživatel již má k tomuto seznamu přístup.",
|
||||
"7003": "Nemáte přístup k tomuto seznamu.",
|
||||
"8001": "Tento štítek již v tomto úkolu existuje.",
|
||||
"8002": "Štítek neexistuje.",
|
||||
"8003": "K tomuto štítku nemáte přístup.",
|
||||
"9001": "Právo je neplatné.",
|
||||
"10001": "Sloupec neexistuje.",
|
||||
"10002": "The bucket does not belong to that project.",
|
||||
"10003": "You cannot remove the last bucket on a project.",
|
||||
"10002": "Sloupec nepatří do tohoto seznamu.",
|
||||
"10003": "Poslední sloupec v seznamu nelze odstranit.",
|
||||
"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": "There can be only one done bucket per project.",
|
||||
"10005": "Pro seznam může být pouze jeden sloupec \"Hotovo\".",
|
||||
"11001": "Uložený filtr neexistuje.",
|
||||
"11002": "Uložené filtry nejsou k dispozici pro sdílení odkazů.",
|
||||
"12001": "Typ předplatného je neplatný.",
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
"welcomeDay": "Hej {username}!",
|
||||
"welcomeEvening": "Godaften {username}!",
|
||||
"lastViewed": "Sidst vist",
|
||||
"project": {
|
||||
"newText": "You can create a new project for your new tasks:",
|
||||
"new": "New project",
|
||||
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
"list": {
|
||||
"newText": "Du kan oprette en ny liste til dine nye opgaver:",
|
||||
"new": "Ny liste",
|
||||
"importText": "Eller importere dine lister og opgaver fra andre værktøjer til Vikunja:",
|
||||
"import": "Importer dine data til Vikunja"
|
||||
}
|
||||
},
|
||||
"404": {
|
||||
|
@ -85,7 +85,7 @@
|
|||
"weekStartSunday": "Søndag",
|
||||
"weekStartMonday": "Mandag",
|
||||
"language": "Sprog",
|
||||
"defaultProject": "Default Project",
|
||||
"defaultList": "Standard liste",
|
||||
"timezone": "Tidszone",
|
||||
"overdueTasksRemindersTime": "Forfaldne opgaver påmindelse e-mail tidspunkt"
|
||||
},
|
||||
|
@ -143,7 +143,7 @@
|
|||
},
|
||||
"deletion": {
|
||||
"title": "Slet din Vikunja konto",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
|
||||
"text1": "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.",
|
||||
"text2": "For at fortsætte, skal du indtaste din adgangskode. Du vil modtage en e-mail med yderligere instruktioner.",
|
||||
"confirm": "Slet min konto",
|
||||
"requestSuccess": "Anmodningen blev gennemført. Du vil modtage en e-mail med yderligere instruktioner.",
|
||||
|
@ -157,201 +157,201 @@
|
|||
},
|
||||
"export": {
|
||||
"title": "Eksporter dine Vikunja-data",
|
||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
||||
"description": "Du kan 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.",
|
||||
"descriptionPasswordRequired": "Indtast venligst din adgangskode for at fortsætte:",
|
||||
"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.",
|
||||
"downloadTitle": "Download dine eksporterede Vikunja-data"
|
||||
}
|
||||
},
|
||||
"project": {
|
||||
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Project Title",
|
||||
"color": "Color",
|
||||
"projects": "Projects",
|
||||
"search": "Type to search for a project…",
|
||||
"searchSelect": "Click or press enter to select this project",
|
||||
"shared": "Shared Projects",
|
||||
"noDescriptionAvailable": "No project description is available.",
|
||||
"list": {
|
||||
"archived": "Denne liste er arkiveret. Det er ikke muligt at oprette eller redigere opgaver i den.",
|
||||
"title": "Listetitel",
|
||||
"color": "Farve",
|
||||
"lists": "Lister",
|
||||
"list": {
|
||||
"title": "Liste",
|
||||
"add": "Tilføj",
|
||||
"addPlaceholder": "Tilføj en ny opgave…",
|
||||
"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": {
|
||||
"header": "New project",
|
||||
"titlePlaceholder": "The project's title goes here…",
|
||||
"addTitleRequired": "Please specify a title.",
|
||||
"createdSuccess": "The project was successfully created.",
|
||||
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||
"header": "Ny liste",
|
||||
"titlePlaceholder": "Listens titel skrives her…",
|
||||
"addTitleRequired": "Angiv venligst en titel.",
|
||||
"createdSuccess": "Listen blev oprettet.",
|
||||
"addListRequired": "Angiv venligst en liste eller opsæt en standardliste i indstillingerne."
|
||||
},
|
||||
"archive": {
|
||||
"title": "Archive \"{project}\"",
|
||||
"archive": "Archive this project",
|
||||
"unarchive": "Un-Archive this project",
|
||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||
"success": "The project was successfully archived."
|
||||
"title": "Arkiver \"{list}\"",
|
||||
"archive": "Arkiver denne liste",
|
||||
"unarchive": "Fjern arkivering af denne liste",
|
||||
"unarchiveText": "Du vil være i stand til at oprette nye opgaver eller redigere den.",
|
||||
"archiveText": "Du vil ikke være i stand til at redigere denne liste, eller oprette nye opgaver, før du fjerner arkiveringen af den.",
|
||||
"success": "Listen blev arkiveret."
|
||||
},
|
||||
"background": {
|
||||
"title": "Set project background",
|
||||
"remove": "Remove Background",
|
||||
"upload": "Choose a background from your pc",
|
||||
"searchPlaceholder": "Search for a background…",
|
||||
"poweredByUnsplash": "Powered by Unsplash",
|
||||
"loadMore": "Load more photos",
|
||||
"success": "The background has been set successfully!",
|
||||
"removeSuccess": "The background has been removed successfully!"
|
||||
"title": "Indstil listebaggrund",
|
||||
"remove": "Fjern baggrund",
|
||||
"upload": "Vælg en baggrund fra din pc",
|
||||
"searchPlaceholder": "Søg efter en baggrund…",
|
||||
"poweredByUnsplash": "Leveret af Unsplash",
|
||||
"loadMore": "Indlæs flere billeder",
|
||||
"success": "Baggrunden er indstillet!",
|
||||
"removeSuccess": "Baggrunden er blevet fjernet!"
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{project}\"",
|
||||
"header": "Delete this project",
|
||||
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||
"success": "The project was successfully deleted.",
|
||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||
"title": "Slet \"{list}\"",
|
||||
"header": "Slet denne liste",
|
||||
"text1": "Er du sikker på, at du vil slette denne liste og alt dens indhold?",
|
||||
"text2": "Dette omfatter alle opgaver og KAN IKKE GØRES OM!",
|
||||
"success": "Listen blev slettet.",
|
||||
"tasksToDelete": "Dette vil uigenkaldeligt fjerne ca. {count} opgaver.",
|
||||
"noTasksToDelete": "Denne liste indeholder ingen opgaver, den bør være sikker at slette."
|
||||
},
|
||||
"duplicate": {
|
||||
"title": "Duplicate this project",
|
||||
"label": "Duplicate",
|
||||
"text": "Select a namespace which should hold the duplicated project:",
|
||||
"success": "The project was successfully duplicated."
|
||||
"title": "Dupliker denne liste",
|
||||
"label": "Dupliker",
|
||||
"text": "Vælg et navneområde som skal indeholde kopien:",
|
||||
"success": "Listen blev kopieret."
|
||||
},
|
||||
"edit": {
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifier": "Project Identifier",
|
||||
"identifierPlaceholder": "The project identifier goes here…",
|
||||
"description": "Description",
|
||||
"descriptionPlaceholder": "The projects description goes here…",
|
||||
"color": "Color",
|
||||
"success": "The project was successfully updated."
|
||||
"header": "Rediger Denne Liste",
|
||||
"title": "Rediger \"{list}\"",
|
||||
"titlePlaceholder": "Listens titel skrives her…",
|
||||
"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.",
|
||||
"identifier": "Liste identifikator",
|
||||
"identifierPlaceholder": "Liste-identifikatoren skal være her…",
|
||||
"description": "Beskrivelse",
|
||||
"descriptionPlaceholder": "Listernes beskrivelse skrives her…",
|
||||
"color": "Farve",
|
||||
"success": "Listen blev opdateret."
|
||||
},
|
||||
"share": {
|
||||
"header": "Share this project",
|
||||
"title": "Share \"{project}\"",
|
||||
"share": "Share",
|
||||
"header": "Del denne liste",
|
||||
"title": "Del \"{list}\"",
|
||||
"share": "Del",
|
||||
"links": {
|
||||
"title": "Share Links",
|
||||
"what": "What is a share link?",
|
||||
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||
"create": "Create a new link share",
|
||||
"name": "Name (optional)",
|
||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||
"password": "Password (optional)",
|
||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||
"noName": "No name set",
|
||||
"remove": "Remove a link share",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"createSuccess": "The link share was successfully created.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"view": "View",
|
||||
"sharedBy": "Shared by {0}"
|
||||
"title": "Delingslink",
|
||||
"what": "Hvad er et delingslink?",
|
||||
"explanation": "Delinglinks giver dig mulighed for nemt at dele en liste med andre brugere, som ikke har en konto på Vikunja.",
|
||||
"create": "Opret et nyt delingslink",
|
||||
"name": "Navn (valgfrit)",
|
||||
"namePlaceholder": "f.eks. Lorem Ipsum",
|
||||
"nameExplanation": "Alle handlinger udført med dette link deling vil blive vist med navnet.",
|
||||
"password": "Adgangskode (valgfrit)",
|
||||
"passwordExplanation": "Ved indlogning vil brugeren blive bedt om at indtaste denne adgangskode.",
|
||||
"noName": "Intet navn indstillet",
|
||||
"remove": "Fjern et delingslink",
|
||||
"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!",
|
||||
"createSuccess": "Delingslinket blev oprettet.",
|
||||
"deleteSuccess": "Delingslinket blev slettet",
|
||||
"view": "Vis",
|
||||
"sharedBy": "Delt af {0}"
|
||||
},
|
||||
"userTeam": {
|
||||
"typeUser": "user | users",
|
||||
"typeTeam": "team | teams",
|
||||
"shared": "Shared with these {type}",
|
||||
"you": "You",
|
||||
"notShared": "Not shared with any {type} yet.",
|
||||
"removeHeader": "Remove a {type} from the {sharable}",
|
||||
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||
"addedSuccess": "The {type} was successfully added.",
|
||||
"updatedSuccess": "The {type} was successfully added."
|
||||
"typeUser": "bruger | brugere",
|
||||
"typeTeam": "hold | hold",
|
||||
"shared": "Delt med disse {type}",
|
||||
"you": "Dig",
|
||||
"notShared": "Ikke delt med nogen {type} endnu.",
|
||||
"removeHeader": "Fjern en {type} fra {sharable}",
|
||||
"removeText": "Er du sikker på at du vil fjerne denne {sharable} fra {type}? Dette kan ikke fortrydes!",
|
||||
"removeSuccess": "{sharable} blev fjernet fra {type}.",
|
||||
"addedSuccess": "{type} blev tilføjet.",
|
||||
"updatedSuccess": "{type} blev tilføjet."
|
||||
},
|
||||
"right": {
|
||||
"title": "Permission",
|
||||
"read": "Read only",
|
||||
"readWrite": "Read & write",
|
||||
"admin": "Admin"
|
||||
"title": "Tilladelse",
|
||||
"read": "Skrivebeskyttet",
|
||||
"readWrite": "Læse & skrive",
|
||||
"admin": "Administrator"
|
||||
},
|
||||
"attributes": {
|
||||
"link": "Link",
|
||||
"delete": "Delete"
|
||||
"delete": "Slet"
|
||||
}
|
||||
},
|
||||
"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": {
|
||||
"title": "Gantt",
|
||||
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||
"size": "Size",
|
||||
"default": "Default",
|
||||
"month": "Month",
|
||||
"day": "Day",
|
||||
"hour": "Hour",
|
||||
"range": "Date Range",
|
||||
"noDates": "This task has no dates set."
|
||||
"showTasksWithoutDates": "Vis opgaver som ikke har angivet datoer",
|
||||
"size": "Størrelse",
|
||||
"default": "Standard",
|
||||
"month": "Måned",
|
||||
"day": "Dag",
|
||||
"hour": "Time",
|
||||
"range": "Datointerval",
|
||||
"noDates": "Denne opgave har ingen datoer angivet."
|
||||
},
|
||||
"table": {
|
||||
"title": "Table",
|
||||
"columns": "Columns"
|
||||
"title": "Tabel",
|
||||
"columns": "Kolonner"
|
||||
},
|
||||
"kanban": {
|
||||
"title": "Kanban",
|
||||
"limit": "Limit: {limit}",
|
||||
"noLimit": "Not Set",
|
||||
"doneBucket": "Done bucket",
|
||||
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
|
||||
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||
"deleteLast": "You cannot remove the last bucket.",
|
||||
"addTaskPlaceholder": "Enter the new task title…",
|
||||
"addTask": "Add a task",
|
||||
"addAnotherTask": "Add another task",
|
||||
"addBucket": "Create a new bucket",
|
||||
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||
"deleteHeaderBucket": "Delete the bucket",
|
||||
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"limit": "Grænse: {limit}",
|
||||
"noLimit": "Ikke angivet",
|
||||
"doneBucket": "Udført-bøtte",
|
||||
"doneBucketHint": "Alle opgaver der flyttes ind i denne bøtte, vil automatisk blive markeret som udført.",
|
||||
"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.",
|
||||
"doneBucketSavedSuccess": "Udført-bøtten er blevet gemt.",
|
||||
"deleteLast": "Du kan ikke fjerne den sidste bøtte.",
|
||||
"addTaskPlaceholder": "Indtast den nye opgavetitel…",
|
||||
"addTask": "Tilføj en opgave",
|
||||
"addAnotherTask": "Tilføj en anden opgave",
|
||||
"addBucket": "Tilføj en ny bøtte",
|
||||
"addBucketPlaceholder": "Indtast den nye titel på bøtten…",
|
||||
"deleteHeaderBucket": "Slet bøtten",
|
||||
"deleteBucketText1": "Er du sikker på, at du vil slette denne bøtte?",
|
||||
"deleteBucketText2": "Dette vil ikke slette nogen opgaver, men flytter dem ind i standard-bøtten.",
|
||||
"deleteBucketSuccess": "Bøtten er blevet slettet.",
|
||||
"bucketTitleSavedSuccess": "Titlen på bøtten er blevet gemt.",
|
||||
"bucketLimitSavedSuccess": "Grænsen for bøtten er blevet gemt.",
|
||||
"collapse": "Sammenfold denne spand"
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
"title": "Favorites"
|
||||
"title": "Favoritter"
|
||||
}
|
||||
}
|
||||
},
|
||||
"namespace": {
|
||||
"title": "Namespaces & Projects",
|
||||
"title": "Navneområder & Lister",
|
||||
"namespace": "Navneområde",
|
||||
"showArchived": "Vis arkiverede",
|
||||
"noneAvailable": "Du har ingen navneområder lige nu.",
|
||||
"unarchive": "Tilbagekald",
|
||||
"archived": "Arkiveret",
|
||||
"noProjects": "This namespace does not contain any projects.",
|
||||
"createProject": "Create a new project in this namespace.",
|
||||
"noLists": "Dette navneområde indeholder ikke nogen lister.",
|
||||
"createList": "Opret en ny liste i dette navneområde.",
|
||||
"namespaces": "Navneområder",
|
||||
"search": "Skriv for at søge efter et navneområde…",
|
||||
"create": {
|
||||
"title": "Nyt navneområde",
|
||||
"titleRequired": "Angiv venligst en titel.",
|
||||
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
|
||||
"explanation": "Et navneområde er en samling af lister du kan dele og bruge til at organisere dine lister med. Faktisk tilhører hver liste et navneområde.",
|
||||
"tooltip": "Hvad er et navneområde?",
|
||||
"success": "Navneområdet blev oprettet."
|
||||
},
|
||||
"archive": {
|
||||
"titleArchive": "Arkiver \"{namespace}\"",
|
||||
"titleUnarchive": "Fjern arkivering \"{namespace}\"",
|
||||
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
|
||||
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||
"archiveText": "Du vil ikke 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.",
|
||||
"unarchiveText": "Du vil kunne oprette nye lister eller redigere det.",
|
||||
"success": "Navneområdet blev arkiveret.",
|
||||
"unarchiveSuccess": "Navneområdet blev tilbagekaldt.",
|
||||
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||
"description": "Hvis et navneområde arkiveres, kan du ikke oprette nye lister eller redigere det."
|
||||
},
|
||||
"delete": {
|
||||
"title": "Slet \"{namespace}\"",
|
||||
"text1": "Er du sikker på, at du vil slette dette navneområde og alt dets indhold?",
|
||||
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||
"text2": "Dette omfatter alle lister og opgaver og KAN IKKE GØRES OM!",
|
||||
"success": "Navneområdet blev slettet."
|
||||
},
|
||||
"edit": {
|
||||
|
@ -371,8 +371,8 @@
|
|||
"isArchived": "Dette navneområde er arkiveret"
|
||||
},
|
||||
"pseudo": {
|
||||
"sharedProjects": {
|
||||
"title": "Shared Projects"
|
||||
"sharedLists": {
|
||||
"title": "Delte Lister"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "Favoritter"
|
||||
|
@ -403,7 +403,7 @@
|
|||
},
|
||||
"create": {
|
||||
"title": "Nyt Gemt Filter",
|
||||
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
||||
"description": "Et 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.",
|
||||
"action": "Opret nyt gemt filter",
|
||||
"titleRequired": "Please provide a title for the filter."
|
||||
},
|
||||
|
@ -435,7 +435,7 @@
|
|||
"label": {
|
||||
"title": "Etiketter",
|
||||
"manage": "Administrer etiketter",
|
||||
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
|
||||
"description": "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.",
|
||||
"newCTA": "Du har i øjeblikket ingen etiketter.",
|
||||
"search": "Skriv for at søge efter en etiket…",
|
||||
"create": {
|
||||
|
@ -460,7 +460,7 @@
|
|||
},
|
||||
"sharing": {
|
||||
"authenticating": "Godkender…",
|
||||
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||
"passwordRequired": "Denne delte liste kræver en adgangskode. Indtast den nedenfor:",
|
||||
"error": "Der opstod en fejl.",
|
||||
"invalidPassword": "Adgangskoden er ugyldig."
|
||||
},
|
||||
|
@ -529,7 +529,7 @@
|
|||
"code": "Kode",
|
||||
"quote": "Citat",
|
||||
"unorderedList": "Usorteret liste",
|
||||
"orderedList ": "Ordered List",
|
||||
"orderedList": "Sorteret liste",
|
||||
"cleanBlock": "Ryd Blok",
|
||||
"link": "Link",
|
||||
"image": "Billede",
|
||||
|
@ -602,7 +602,6 @@
|
|||
"addReminder": "Tilføj en ny påmindelse…",
|
||||
"doneSuccess": "Opgaven blev markeret som udført.",
|
||||
"undoneSuccess": "Opgaven fik fjernet sin udført-markering.",
|
||||
"undo": "Undo",
|
||||
"openDetail": "Åbn detaljeret opgavevisning",
|
||||
"checklistTotal": "{checked} af {total} opgaver",
|
||||
"checklistAllDone": "{total} opgaver",
|
||||
|
@ -619,7 +618,7 @@
|
|||
"chooseDueDate": "Klik her for at angive en forfaldsdato",
|
||||
"chooseStartDate": "Klik her for at angive en startdato",
|
||||
"chooseEndDate": "Klik her for at angive en slutdato",
|
||||
"move": "Move task to a different project",
|
||||
"move": "Flyt opgave til en anden liste",
|
||||
"done": "Markér opgave som udført!",
|
||||
"undone": "Markér opgave som ikke-udført",
|
||||
"created": "Oprettet {0} af {1}",
|
||||
|
@ -627,7 +626,7 @@
|
|||
"doneAt": "Udført {0}",
|
||||
"updateSuccess": "Opgaven blev gemt.",
|
||||
"deleteSuccess": "Opgaven er blevet slettet.",
|
||||
"belongsToProject": "This task belongs to project '{project}'",
|
||||
"belongsToList": "Denne opgave tilhører listen '{list}'",
|
||||
"due": "Forfalder {at}",
|
||||
"closePopup": "Luk pop-up",
|
||||
"delete": {
|
||||
|
@ -647,7 +646,7 @@
|
|||
"percentDone": "Indstil Fremskridt",
|
||||
"attachments": "Tilføj Vedhæftninger",
|
||||
"relatedTasks": "Tilføj Relation",
|
||||
"moveProject": "Move",
|
||||
"moveList": "Flyt",
|
||||
"color": "Indstil Farve",
|
||||
"delete": "Slet",
|
||||
"favorite": "Tilføj til Favoritter",
|
||||
|
@ -674,21 +673,21 @@
|
|||
"updated": "Opdateret"
|
||||
},
|
||||
"subscription": {
|
||||
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||
"subscribedListThroughParentNamespace": "Du kan ikke afmelde dig her, fordi du abonnerer på denne liste gennem dens navneområde.",
|
||||
"subscribedTaskThroughParentNamespace": "Du kan ikke afmelde dig her, fordi du abonnerer på denne opgave gennem dens navneområde.",
|
||||
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||
"subscribedTaskThroughParentList": "Du kan ikke afmelde dig her, fordi du abonnerer på denne opgave gennem dens liste.",
|
||||
"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.",
|
||||
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||
"subscribedList": "Du abonnerer på denne liste og vil modtage notifikationer om ændringer.",
|
||||
"notSubscribedList": "Du abonnerer ikke på denne liste og modtager ikke meddelelser 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.",
|
||||
"subscribe": "Abonner",
|
||||
"unsubscribe": "Afmeld",
|
||||
"subscribeSuccessNamespace": "Du abonnerer nu på dette navneområde",
|
||||
"unsubscribeSuccessNamespace": "Du er nu afmeldt dette navneområde",
|
||||
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||
"subscribeSuccessList": "Du abonnerer nu på denne liste",
|
||||
"unsubscribeSuccessList": "Du er nu afmeldt denne liste",
|
||||
"subscribeSuccessTask": "Du abonnerer nu på denne opgave",
|
||||
"unsubscribeSuccessTask": "Du er nu afmeldt denne opgave"
|
||||
},
|
||||
|
@ -762,7 +761,7 @@
|
|||
"new": "Ny Opgaverelation",
|
||||
"searchPlaceholder": "Indtast søgning efter en ny opgave der tilføjes som relateret…",
|
||||
"createPlaceholder": "Tilføj dette som en ny relateret opgave",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentList": "Denne opgave hører til en anden liste.",
|
||||
"differentNamespace": "Denne opgave hører til et andet navneområde.",
|
||||
"noneYet": "Ingen opgaverelationer endnu.",
|
||||
"delete": "Slet Opgaverelation",
|
||||
|
@ -812,10 +811,10 @@
|
|||
"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.",
|
||||
"assignees": "For at tildele opgaven direkte til en bruger, tilføj deres brugernavn præfikset med {prefix} til opgaven.",
|
||||
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||
"list1": "For at angive en liste som opgaven skal høre til, skal du indtaste dens navn præfikset med {prefix}.",
|
||||
"list2": "Dette vil returnere en fejl, hvis listen ikke eksisterer.",
|
||||
"list3": "For at bruge mellemrum, skal du blot tilføje \" eller ' omkring listens navn.",
|
||||
"list4": "For eksempel: {prefix}\"Liste med mellemrum\".",
|
||||
"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:",
|
||||
"dateWeekday": "enhver ugedag, vil bruge den næste dato med på den dag",
|
||||
|
@ -848,19 +847,19 @@
|
|||
"delete": {
|
||||
"header": "Slet holdet",
|
||||
"text1": "Er du sikker på du vil slette dette hold og alle dets medlemmer?",
|
||||
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"text2": "Alle holdmedlemmer vil miste adgang til lister og navneområder, der er delt med dette team. Dette kan IKKE GØRES OM!",
|
||||
"success": "Holdet blev slettet."
|
||||
},
|
||||
"deleteUser": {
|
||||
"header": "Fjern en bruger fra holdet",
|
||||
"text1": "Er du sikker på du vil fjerne denne bruger fra holdet?",
|
||||
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"text2": "De vil miste adgang til alle lister og navneområder, som dette hold har adgang til. Dette IKKE GØRES OM!",
|
||||
"success": "Brugeren blev fjernet fra holdet."
|
||||
},
|
||||
"leave": {
|
||||
"title": "Forlad hold",
|
||||
"text1": "Er du sikker på du vil forlade dette hold?",
|
||||
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
||||
"text2": "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.",
|
||||
"success": "Du har forladt holdet."
|
||||
}
|
||||
},
|
||||
|
@ -892,22 +891,22 @@
|
|||
"attachment": "Tilføj en vedhæftet fil til denne opgave",
|
||||
"related": "Rediger relaterede opgaver for denne opgave",
|
||||
"color": "Skift farven på denne opgave",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Flyt denne opgave til en anden liste",
|
||||
"reminder": "Administrer påmindelser om denne opgave",
|
||||
"description": "Slå redigering af opgavebeskrivelse til/fra"
|
||||
},
|
||||
"project": {
|
||||
"title": "Project Views",
|
||||
"switchToListView": "Switch to list view",
|
||||
"switchToGanttView": "Switch to gantt view",
|
||||
"switchToKanbanView": "Switch to kanban view",
|
||||
"switchToTableView": "Switch to table view"
|
||||
"list": {
|
||||
"title": "Listevisning",
|
||||
"switchToListView": "Skift til listevisning",
|
||||
"switchToGanttView": "Skift til gantt- visning",
|
||||
"switchToKanbanView": "Skift til kanban visning",
|
||||
"switchToTableView": "Skift til tabelvisning"
|
||||
},
|
||||
"navigation": {
|
||||
"title": "Navigation",
|
||||
"overview": "Gå til oversigt",
|
||||
"upcoming": "Gå til kommende opgaver",
|
||||
"namespaces": "Navigate to namespaces & projects",
|
||||
"namespaces": "Gå til navneområder & lister",
|
||||
"labels": "Naviger til etiketter",
|
||||
"teams": "Naviger til hold"
|
||||
}
|
||||
|
@ -924,7 +923,7 @@
|
|||
"unarchive": "Tilbagekald",
|
||||
"setBackground": "Indstil baggrund",
|
||||
"share": "Del",
|
||||
"newProject": "New project"
|
||||
"newList": "Ny liste"
|
||||
},
|
||||
"apiConfig": {
|
||||
"url": "Vikunja URL",
|
||||
|
@ -943,24 +942,24 @@
|
|||
"notification": {
|
||||
"title": "Notifikationer",
|
||||
"none": "Du har ingen notifikationer. Hav en dejlig dag!",
|
||||
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||
"explainer": "Notifikationer vises her, når handlinger på navneområder, lister eller opgaver du abonnerede på er nødvendige."
|
||||
},
|
||||
"quickActions": {
|
||||
"commands": "Kommandoer",
|
||||
"placeholder": "Indtast en kommando eller søg…",
|
||||
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
|
||||
"hint": "Du kan 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.",
|
||||
"tasks": "Opgaver",
|
||||
"projects": "Projects",
|
||||
"lists": "Lister",
|
||||
"teams": "Hold",
|
||||
"newProject": "Enter the title of the new project…",
|
||||
"newList": "Indtast titlen på den nye liste…",
|
||||
"newTask": "Indtast titlen på den nye opgave…",
|
||||
"newNamespace": "Indtast titlen på det nye navneområde…",
|
||||
"newTeam": "Indtast navnet på det nye hold…",
|
||||
"createTask": "Create a task in the current project ({title})",
|
||||
"createProject": "Create a project in the current namespace ({title})",
|
||||
"createTask": "Opret en opgave i den nuværende liste ({title})",
|
||||
"createList": "Opret en liste i det nuværende navneområde ({title})",
|
||||
"cmds": {
|
||||
"newTask": "Ny Opgave",
|
||||
"newProject": "New project",
|
||||
"newList": "Ny liste",
|
||||
"newNamespace": "Nyt navneområde",
|
||||
"newTeam": "Nyt hold"
|
||||
}
|
||||
|
@ -992,15 +991,15 @@
|
|||
"1018": "Brugerens avatartype indstilling er ugyldig.",
|
||||
"2001": "ID kan ikke være tomt eller 0.",
|
||||
"2002": "Nogle af forespørgselsdataene var ugyldige.",
|
||||
"3001": "The project does not exist.",
|
||||
"3004": "You need to have read permissions on that project to perform that action.",
|
||||
"3005": "The project title cannot be empty.",
|
||||
"3006": "The project share does not exist.",
|
||||
"3007": "A project with this identifier already exists.",
|
||||
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
|
||||
"4001": "The project task text cannot be empty.",
|
||||
"4002": "The project task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same project.",
|
||||
"3001": "Listen eksisterer ikke.",
|
||||
"3004": "Du skal have læserettigheder på listen for at udføre denne handling.",
|
||||
"3005": "Listens titel må ikke være tom.",
|
||||
"3006": "Listendelingen findes ikke.",
|
||||
"3007": "En liste med dette id findes allerede.",
|
||||
"3008": "Listen er arkiveret og kan derfor kun tilgås skrivebeskyttet. Dette gælder også for alle opgaver der er tilknyttet denne liste.",
|
||||
"4001": "Listeopgaveteksten kan ikke være tom.",
|
||||
"4002": "Listeopgave eksisterer ikke.",
|
||||
"4003": "Alle masseredigeringsopgaver skal tilhøre den samme liste.",
|
||||
"4004": "Der skal være mindst én opgave for at masseredigere opgaver.",
|
||||
"4005": "Du har ikke rettigheder til at se opgaven.",
|
||||
"4006": "Du kan ikke indstille en overordnet opgave som opgaven selv.",
|
||||
|
@ -1026,21 +1025,21 @@
|
|||
"5012": "Navneområdet er arkiveret og kan derfor kun læses.",
|
||||
"6001": "Holdnavnet må ikke være tomt.",
|
||||
"6002": "Holdet findes ikke.",
|
||||
"6004": "The team already has access to that namespace or project.",
|
||||
"6004": "Holdet har allerede adgang til dette navneområde eller liste.",
|
||||
"6005": "Brugeren er allerede medlem af holdet.",
|
||||
"6006": "Kan ikke slette det sidste holdmedlem.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "The user already has access to that project.",
|
||||
"7003": "You do not have access to that project.",
|
||||
"6007": "Holdet har ikke adgang til listen for at udføre denne handling.",
|
||||
"7002": "Brugeren har allerede adgang til denne liste.",
|
||||
"7003": "Du har ikke adgang til denne liste.",
|
||||
"8001": "Denne etiket findes allerede på denne opgave.",
|
||||
"8002": "Etiketten findes ikke.",
|
||||
"8003": "Du har ikke adgang til denne etiket.",
|
||||
"9001": "Rettigheden er ugyldig.",
|
||||
"10001": "Kurven findes ikke.",
|
||||
"10002": "The bucket does not belong to that project.",
|
||||
"10003": "You cannot remove the last bucket on a project.",
|
||||
"10002": "Kurven tilhører ikke denne liste.",
|
||||
"10003": "Du kan ikke fjerne den sidste kurv på en liste.",
|
||||
"10004": "Du kan ikke tilføje opgaven til denne kurv, da den allerede overskrider grænsen for opgaver, den kan holde.",
|
||||
"10005": "There can be only one done bucket per project.",
|
||||
"10005": "Der kan kun være en færdig kurv pr. liste.",
|
||||
"11001": "Det gemte filter eksisterer ikke.",
|
||||
"11002": "Gemte filtre er ikke tilgængelige for delingslink.",
|
||||
"12001": "Enhedstypen for abonnementet er ugyldigt.",
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
"welcomeDay": "Hallo {username}!",
|
||||
"welcomeEvening": "Guten Abend, {username}!",
|
||||
"lastViewed": "Zuletzt angesehen",
|
||||
"project": {
|
||||
"newText": "Du kannst ein neues Projekt für deine neuen Aufgaben erstellen:",
|
||||
"new": "New project",
|
||||
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
"list": {
|
||||
"newText": "Du kannst eine neue Liste für deine neuen Aufgaben erstellen:",
|
||||
"new": "Neue Liste",
|
||||
"importText": "Oder importiere deine Listen und Aufgaben aus anderen Diensten in Vikunja:",
|
||||
"import": "Deine Daten in Vikunja importieren"
|
||||
}
|
||||
},
|
||||
"404": {
|
||||
|
@ -85,7 +85,7 @@
|
|||
"weekStartSunday": "Sonntag",
|
||||
"weekStartMonday": "Montag",
|
||||
"language": "Sprache",
|
||||
"defaultProject": "Default Project",
|
||||
"defaultList": "Standard-Liste",
|
||||
"timezone": "Zeitzone",
|
||||
"overdueTasksRemindersTime": "Zeit der E-Mail-Zusammenfassung der überfälligen Aufgaben"
|
||||
},
|
||||
|
@ -143,7 +143,7 @@
|
|||
},
|
||||
"deletion": {
|
||||
"title": "Lösche deinen Vikunja-Account",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
|
||||
"text1": "Das Löschen deines Accounts ist dauerhaft und unwiderruflich. Alle Namensräume, Listen und zugehörige Daten werden gelöscht.",
|
||||
"text2": "Zum Fortfahren gib bitte dein Passwort ein. Du erhältst eine E-Mail mit weiteren Anweisungen.",
|
||||
"confirm": "Meinen Account löschen",
|
||||
"requestSuccess": "Die Anfrage war erfolgreich. Du erhältst eine E-Mail mit weiteren Anweisungen.",
|
||||
|
@ -157,201 +157,201 @@
|
|||
},
|
||||
"export": {
|
||||
"title": "Exportiere deine Vikunja-Daten",
|
||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
||||
"description": "Du 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.",
|
||||
"descriptionPasswordRequired": "Bitte gib dein Passwort ein, um fortzufahren:",
|
||||
"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.",
|
||||
"downloadTitle": "Lade deine exportierten Vikunja-Daten herunter"
|
||||
}
|
||||
},
|
||||
"project": {
|
||||
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Project Title",
|
||||
"color": "Color",
|
||||
"projects": "Projects",
|
||||
"search": "Type to search for a project…",
|
||||
"searchSelect": "Click or press enter to select this project",
|
||||
"shared": "Shared Projects",
|
||||
"noDescriptionAvailable": "No project description is available.",
|
||||
"list": {
|
||||
"archived": "Diese Liste ist archiviert. Es ist nicht möglich, neue Aufgaben zu erstellen oder sie zu bearbeiten.",
|
||||
"title": "Listentitel",
|
||||
"color": "Farbe",
|
||||
"lists": "Listen",
|
||||
"list": {
|
||||
"title": "Liste",
|
||||
"add": "Hinzufügen",
|
||||
"addPlaceholder": "Neue Aufgabe hinzufügen …",
|
||||
"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": {
|
||||
"header": "New project",
|
||||
"titlePlaceholder": "The project's title goes here…",
|
||||
"addTitleRequired": "Please specify a title.",
|
||||
"createdSuccess": "The project was successfully created.",
|
||||
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||
"header": "Neue Liste",
|
||||
"titlePlaceholder": "Der Titel der Liste steht hier…",
|
||||
"addTitleRequired": "Bitte gebe einen Namen an.",
|
||||
"createdSuccess": "Die Liste wurde erfolgreich erstellt.",
|
||||
"addListRequired": "Bitte gebe eine Liste an oder lege eine Standardliste in den Einstellungen fest."
|
||||
},
|
||||
"archive": {
|
||||
"title": "Archive \"{project}\"",
|
||||
"archive": "Archive this project",
|
||||
"unarchive": "Un-Archive this project",
|
||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||
"success": "The project was successfully archived."
|
||||
"title": "„{list}“ archivieren",
|
||||
"archive": "Diese Liste archivieren",
|
||||
"unarchive": "Archivierung dieser Liste aufheben",
|
||||
"unarchiveText": "Du wirst neue Aufgaben erstellen oder sie bearbeiten können.",
|
||||
"archiveText": "Du kannst diese Liste nicht bearbeiten oder neue Aufgaben erstellen, bis du die Archivierung aufhebst.",
|
||||
"success": "Die Liste wurde erfolgreich archiviert."
|
||||
},
|
||||
"background": {
|
||||
"title": "Set project background",
|
||||
"remove": "Remove Background",
|
||||
"upload": "Choose a background from your pc",
|
||||
"searchPlaceholder": "Search for a background…",
|
||||
"title": "Listenhintergrund festlegen",
|
||||
"remove": "Hintergrund entfernen",
|
||||
"upload": "Wähle einen Hintergrund von deinem Computer",
|
||||
"searchPlaceholder": "Nach einem Hintergrund suchen…",
|
||||
"poweredByUnsplash": "Powered by Unsplash",
|
||||
"loadMore": "Load more photos",
|
||||
"success": "The background has been set successfully!",
|
||||
"removeSuccess": "The background has been removed successfully!"
|
||||
"loadMore": "Weitere Bilder laden",
|
||||
"success": "Der Hintergrund wurde erfolgreich eingestellt!",
|
||||
"removeSuccess": "Der Hintergrund wurde erfolgreich entfernt!"
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{project}\"",
|
||||
"header": "Delete this project",
|
||||
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||
"success": "The project was successfully deleted.",
|
||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||
"title": "„{list}“ löschen",
|
||||
"header": "Diese Liste löschen",
|
||||
"text1": "Bist du sicher, dass du diese Liste und alle ihre Inhalte löschen willst?",
|
||||
"text2": "Dies umfasst alle Aufgaben und kann NICHT rückgängig gemacht werden!",
|
||||
"success": "Die Liste wurde erfolgreich gelöscht.",
|
||||
"tasksToDelete": "Dies löscht unwiderruflich ca. {count} Aufgaben.",
|
||||
"noTasksToDelete": "Diese Liste enthält keine Aufgaben, sie kann sicher gelöscht werden."
|
||||
},
|
||||
"duplicate": {
|
||||
"title": "Duplicate this project",
|
||||
"label": "Duplicate",
|
||||
"text": "Select a namespace which should hold the duplicated project:",
|
||||
"success": "The project was successfully duplicated."
|
||||
"title": "Diese Liste duplizieren",
|
||||
"label": "Duplizieren",
|
||||
"text": "Wähle einen Namespace aus, der die duplizierte Liste enthalten soll:",
|
||||
"success": "Die Liste wurde erfolgreich dupliziert."
|
||||
},
|
||||
"edit": {
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifier": "Project Identifier",
|
||||
"identifierPlaceholder": "The project identifier goes here…",
|
||||
"description": "Description",
|
||||
"descriptionPlaceholder": "The projects description goes here…",
|
||||
"color": "Color",
|
||||
"success": "The project was successfully updated."
|
||||
"header": "Diese Liste bearbeiten",
|
||||
"title": "„{list}“ bearbeiten",
|
||||
"titlePlaceholder": "Listenname eingeben …",
|
||||
"identifierTooltip": "Der Listenbezeichner kann zur eindeutigen Identifizierung einer Aufgabe über Listen hinweg verwendet werden. Du kannst ihn auf leer setzen, um ihn zu deaktivieren.",
|
||||
"identifier": "Listenbezeichner",
|
||||
"identifierPlaceholder": "Der Listenbezeichner kommt hierhin…",
|
||||
"description": "Beschreibung",
|
||||
"descriptionPlaceholder": "Listenbeschreibung eingeben…",
|
||||
"color": "Farbe",
|
||||
"success": "Die Liste wurde erfolgreich aktualisiert."
|
||||
},
|
||||
"share": {
|
||||
"header": "Share this project",
|
||||
"title": "Share \"{project}\"",
|
||||
"share": "Share",
|
||||
"header": "Diese Liste teilen",
|
||||
"title": "„{list}“ teilen",
|
||||
"share": "Teilen",
|
||||
"links": {
|
||||
"title": "Share Links",
|
||||
"what": "What is a share link?",
|
||||
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||
"create": "Create a new link share",
|
||||
"title": "Linkfreigaben",
|
||||
"what": "Was ist eine Linkfreigabe?",
|
||||
"explanation": "Mit Linkfreigaben kannst du Listen mit Benutzer:innen ohne Vikunja-Account teilen.",
|
||||
"create": "Erstelle einen neue Linkfreigabe",
|
||||
"name": "Name (optional)",
|
||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||
"password": "Password (optional)",
|
||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||
"noName": "No name set",
|
||||
"remove": "Remove a link share",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"createSuccess": "The link share was successfully created.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"view": "View",
|
||||
"sharedBy": "Shared by {0}"
|
||||
"namePlaceholder": "z.B. Max Muster",
|
||||
"nameExplanation": "Alle Aktionen, die mit dieser Linkfreigabe durchgeführt werden, werden mit diesem Namen angezeigt.",
|
||||
"password": "Passwort (optional)",
|
||||
"passwordExplanation": "Bei der Authentifizierung wird der:die Benutzer:in aufgefordert, dieses Passwort einzugeben.",
|
||||
"noName": "Kein Name angegeben",
|
||||
"remove": "Eine Linkfreigabe löschen",
|
||||
"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!",
|
||||
"createSuccess": "Die Linkfreigabe wurde erfolgreich erstellt.",
|
||||
"deleteSuccess": "Die Linkfreigabe wurde erfolgreich gelöscht",
|
||||
"view": "Ansicht",
|
||||
"sharedBy": "Von {0} geteilt"
|
||||
},
|
||||
"userTeam": {
|
||||
"typeUser": "user | users",
|
||||
"typeTeam": "team | teams",
|
||||
"shared": "Shared with these {type}",
|
||||
"you": "You",
|
||||
"notShared": "Not shared with any {type} yet.",
|
||||
"removeHeader": "Remove a {type} from the {sharable}",
|
||||
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||
"addedSuccess": "The {type} was successfully added.",
|
||||
"updatedSuccess": "The {type} was successfully added."
|
||||
"typeUser": "Benutzer:in | Benutzer:innen",
|
||||
"typeTeam": "Team | Teams",
|
||||
"shared": "Geteilt mit diesen {type}",
|
||||
"you": "Du",
|
||||
"notShared": "Noch nicht mit einem {type} geteilt.",
|
||||
"removeHeader": "Einen {type} von {sharable} entfernen",
|
||||
"removeText": "Diesen {sharable} von {type} entfernen? Dies kann nicht rückgängig gemacht werden!",
|
||||
"removeSuccess": "{sharable} wurde erfolgreich von {type} entfernt.",
|
||||
"addedSuccess": "{type} wurde erfolgreich hinzugefügt.",
|
||||
"updatedSuccess": "{type} wurde erfolgreich hinzugefügt."
|
||||
},
|
||||
"right": {
|
||||
"title": "Permission",
|
||||
"read": "Read only",
|
||||
"readWrite": "Read & write",
|
||||
"title": "Berechtigung",
|
||||
"read": "Nur Leserechte",
|
||||
"readWrite": "Lesen & Schreiben",
|
||||
"admin": "Admin"
|
||||
},
|
||||
"attributes": {
|
||||
"link": "Link",
|
||||
"delete": "Delete"
|
||||
"delete": "Löschen"
|
||||
}
|
||||
},
|
||||
"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": {
|
||||
"title": "Gantt",
|
||||
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||
"size": "Size",
|
||||
"default": "Default",
|
||||
"month": "Month",
|
||||
"day": "Day",
|
||||
"hour": "Hour",
|
||||
"range": "Date Range",
|
||||
"noDates": "This task has no dates set."
|
||||
"showTasksWithoutDates": "Aufgaben anzeigen, für die keine Daten festgelegt sind",
|
||||
"size": "Größe",
|
||||
"default": "Standard",
|
||||
"month": "Monat",
|
||||
"day": "Tag",
|
||||
"hour": "Stunde",
|
||||
"range": "Zeitraum",
|
||||
"noDates": "Diese Aufgabe hat keine Daten definiert."
|
||||
},
|
||||
"table": {
|
||||
"title": "Table",
|
||||
"columns": "Columns"
|
||||
"title": "Tabelle",
|
||||
"columns": "Spalten"
|
||||
},
|
||||
"kanban": {
|
||||
"title": "Kanban",
|
||||
"limit": "Limit: {limit}",
|
||||
"noLimit": "Not Set",
|
||||
"doneBucket": "Done bucket",
|
||||
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
|
||||
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||
"deleteLast": "You cannot remove the last bucket.",
|
||||
"addTaskPlaceholder": "Enter the new task title…",
|
||||
"addTask": "Add a task",
|
||||
"addAnotherTask": "Add another task",
|
||||
"addBucket": "Create a new bucket",
|
||||
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||
"deleteHeaderBucket": "Delete the bucket",
|
||||
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"noLimit": "Nicht gesetzt",
|
||||
"doneBucket": "Erledigt Spalte",
|
||||
"doneBucketHint": "Alle Aufgaben, die in diese Spalte verschoben werden, werden automatisch als erledigt markiert.",
|
||||
"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.",
|
||||
"doneBucketSavedSuccess": "Erledigt Spalte gespeichert.",
|
||||
"deleteLast": "Du kannst die letzte Spalte nicht entfernen.",
|
||||
"addTaskPlaceholder": "Gebe einen Aufgabenamen ein …",
|
||||
"addTask": "Eine Aufgabe hinzufügen",
|
||||
"addAnotherTask": "Weitere Aufgabe hinzufügen",
|
||||
"addBucket": "Eine neue Spalte erstellen",
|
||||
"addBucketPlaceholder": "Gebe einen Spalten-Titel ein…",
|
||||
"deleteHeaderBucket": "Spalte löschen",
|
||||
"deleteBucketText1": "Bist du sicher, dass du diese Spalte löschen möchtest?",
|
||||
"deleteBucketText2": "Dies löscht keine Aufgaben, sondern verschiebt sie in die Standard Spalte.",
|
||||
"deleteBucketSuccess": "Die Spalte wurde erfolgreich gelöscht.",
|
||||
"bucketTitleSavedSuccess": "Der Spaltenname wurde erfolgreich gespeichert.",
|
||||
"bucketLimitSavedSuccess": "Das Spaltenlimit wurde erfolgreich gespeichert.",
|
||||
"collapse": "Spalte einklappen"
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
"title": "Favorites"
|
||||
"title": "Favoriten"
|
||||
}
|
||||
}
|
||||
},
|
||||
"namespace": {
|
||||
"title": "Namespaces & Projects",
|
||||
"title": "Namespaces & Listen",
|
||||
"namespace": "Namespace",
|
||||
"showArchived": "Archivierte anzeigen",
|
||||
"noneAvailable": "Du hast momentan keine Namespaces.",
|
||||
"unarchive": "Archivierung aufheben",
|
||||
"archived": "Archiviert",
|
||||
"noProjects": "This namespace does not contain any projects.",
|
||||
"createProject": "Create a new project in this namespace.",
|
||||
"noLists": "Dieser Namespace enthält keine Listen.",
|
||||
"createList": "Erstelle eine neue Liste in diesem Namespace.",
|
||||
"namespaces": "Namespaces",
|
||||
"search": "Beginne zu schreiben, um einen Namespace zu suchen…",
|
||||
"create": {
|
||||
"title": "Neuer Namespace",
|
||||
"titleRequired": "Bitte gebe einen Titel an.",
|
||||
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
|
||||
"explanation": "Ein Namespace ist eine Sammlung von Listen, die du teilen und zur Organisation verwenden kannst. Jede Liste gehört zu einem Namespace.",
|
||||
"tooltip": "Was ist ein Namespace?",
|
||||
"success": "Der Namespace wurde erfolgreich erstellt."
|
||||
},
|
||||
"archive": {
|
||||
"titleArchive": "„{namespace}“ archivieren",
|
||||
"titleUnarchive": "Archivierung von \"{namespace}\" aufheben",
|
||||
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
|
||||
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||
"archiveText": "Du 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.",
|
||||
"unarchiveText": "Du kannst neue Aufgaben erstellen oder diese bearbeiten.",
|
||||
"success": "Der Namespace wurde erfolgreich archiviert.",
|
||||
"unarchiveSuccess": "Der Namespace wurde erfolgreich wiederhergestellt.",
|
||||
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||
"description": "In einem archivierten Namespace können Listen weder angelegt noch editiert werden."
|
||||
},
|
||||
"delete": {
|
||||
"title": "„{namespace}“ löschen",
|
||||
"text1": "Diesen Namespace mit sämtlichem Inhalt löschen?",
|
||||
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||
"text2": "Dies umfasst alle Listen und Aufgaben und kann NICHT rückgängig gemacht werden!",
|
||||
"success": "Der Namespace wurde erfolgreich gelöscht."
|
||||
},
|
||||
"edit": {
|
||||
|
@ -371,8 +371,8 @@
|
|||
"isArchived": "Dieser Namespace ist archiviert"
|
||||
},
|
||||
"pseudo": {
|
||||
"sharedProjects": {
|
||||
"title": "Shared Projects"
|
||||
"sharedLists": {
|
||||
"title": "Geteilte Listen"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "Favoriten"
|
||||
|
@ -403,7 +403,7 @@
|
|||
},
|
||||
"create": {
|
||||
"title": "Neuer gespeicherter Filter",
|
||||
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
||||
"description": "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.",
|
||||
"action": "Neuen gespeicherten Filter erstellen",
|
||||
"titleRequired": "Bitte gib den Titel für den Filter an."
|
||||
},
|
||||
|
@ -435,7 +435,7 @@
|
|||
"label": {
|
||||
"title": "Labels",
|
||||
"manage": "Label verwalten",
|
||||
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
|
||||
"description": "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.",
|
||||
"newCTA": "Du hast momentan keine Labels.",
|
||||
"search": "Beginne zu schreiben, um nach einem Label zu suchen…",
|
||||
"create": {
|
||||
|
@ -460,7 +460,7 @@
|
|||
},
|
||||
"sharing": {
|
||||
"authenticating": "Authentifizierung …",
|
||||
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||
"passwordRequired": "Diese geteilte Liste benötigt ein Passwort. Bitte gebe es unten ein:",
|
||||
"error": "Es ist ein Fehler aufgetreten.",
|
||||
"invalidPassword": "Das Passwort ist ungültig."
|
||||
},
|
||||
|
@ -529,7 +529,7 @@
|
|||
"code": "Code",
|
||||
"quote": "Zitat",
|
||||
"unorderedList": "Ungeordnete Liste",
|
||||
"orderedList ": "Ordered List",
|
||||
"orderedList": "Geordnete Liste",
|
||||
"cleanBlock": "Formatierung löschen",
|
||||
"link": "Link",
|
||||
"image": "Bild",
|
||||
|
@ -602,7 +602,6 @@
|
|||
"addReminder": "Eine Erinnerung hinzufügen…",
|
||||
"doneSuccess": "Die Aufgabe wurde erfolgreich als erledigt markiert.",
|
||||
"undoneSuccess": "Die Aufgabe wurde erfolgreich als nicht-erledigt markiert.",
|
||||
"undo": "Rückgängig",
|
||||
"openDetail": "Aufgabe in der Detailansicht anzeigen",
|
||||
"checklistTotal": "{checked} von {total} Aufgaben",
|
||||
"checklistAllDone": "{total} Aufgaben",
|
||||
|
@ -619,7 +618,7 @@
|
|||
"chooseDueDate": "Klicke hier, um ein Fälligkeitsdatum zu setzen",
|
||||
"chooseStartDate": "Klicke hier, um ein Startdatum zu setzen",
|
||||
"chooseEndDate": "Klicke hier, um ein Enddatum zu setzen",
|
||||
"move": "Move task to a different project",
|
||||
"move": "Aufgabe in eine andere Liste verschieben",
|
||||
"done": "Als erledigt markieren!",
|
||||
"undone": "Als nicht erledigt markieren",
|
||||
"created": "Erstellt {0} von {1}",
|
||||
|
@ -627,7 +626,7 @@
|
|||
"doneAt": "Erledigt {0}",
|
||||
"updateSuccess": "Die Aufgabe wurde erfolgreich gespeichert.",
|
||||
"deleteSuccess": "Die Aufgabe wurde erfolgreich gelöscht.",
|
||||
"belongsToProject": "This task belongs to project '{project}'",
|
||||
"belongsToList": "Diese Aufgabe gehört zur Liste „{list}“",
|
||||
"due": "Fällig {at}",
|
||||
"closePopup": "Popup schließen",
|
||||
"delete": {
|
||||
|
@ -647,7 +646,7 @@
|
|||
"percentDone": "Fortschritt einstellen",
|
||||
"attachments": "Anhänge hinzufügen",
|
||||
"relatedTasks": "Beziehung hinzufügen",
|
||||
"moveProject": "Move",
|
||||
"moveList": "Verschieben",
|
||||
"color": "Farbe setzen",
|
||||
"delete": "Löschen",
|
||||
"favorite": "Zu Favoriten hinzufügen",
|
||||
|
@ -674,21 +673,21 @@
|
|||
"updated": "Aktualisiert"
|
||||
},
|
||||
"subscription": {
|
||||
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||
"subscribedListThroughParentNamespace": "Du kannst hier nicht de-abonnieren, da du diese Liste über ihren Namespace abonniert hast.",
|
||||
"subscribedTaskThroughParentNamespace": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihren Namespace abonniert hast.",
|
||||
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||
"subscribedTaskThroughParentList": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihre Liste abonniert hast.",
|
||||
"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.",
|
||||
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||
"subscribedList": "Du hast diese Liste abonniert und erhältst Benachrichtigungen über Änderungen.",
|
||||
"notSubscribedList": "Du hast diese Liste nicht abonniert und erhältst keine 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.",
|
||||
"subscribe": "Abonnieren",
|
||||
"unsubscribe": "Abbestellen",
|
||||
"subscribeSuccessNamespace": "Du hast diesen Namespace jetzt abonniert",
|
||||
"unsubscribeSuccessNamespace": "Du hast diesen Namespace jetzt nicht mehr abonniert",
|
||||
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||
"subscribeSuccessList": "Du hast diese Liste jetzt abonniert",
|
||||
"unsubscribeSuccessList": "Du hast diese Liste jetzt nicht mehr abonniert",
|
||||
"subscribeSuccessTask": "Du hast diese Aufgabe jetzt abonniert",
|
||||
"unsubscribeSuccessTask": "Du hast diese Aufgabe jetzt nicht mehr abonniert"
|
||||
},
|
||||
|
@ -762,7 +761,7 @@
|
|||
"new": "Neue Aufgabenbeziehung",
|
||||
"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",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentList": "Diese Aufgabe gehört zu einer anderen Liste.",
|
||||
"differentNamespace": "Diese Aufgabe gehört zu einem anderen Namespace.",
|
||||
"noneYet": "Keine Aufgabenbeziehung vorhanden.",
|
||||
"delete": "Aufgabenbeziehung entfernen",
|
||||
|
@ -812,10 +811,10 @@
|
|||
"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.",
|
||||
"assignees": "Um die Aufgabe direkt jemandem zuzuweisen, füge vor dem Anmeldenamen der Person ein {prefix} Zeichen ein.",
|
||||
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||
"list1": "Um eine Liste zu erstellen, in der die Aufgabe erscheinen soll, gib ihren Namen vorangestellt mit einem {prefix} ein.",
|
||||
"list2": "Dies gibt einen Fehler zurück, wenn die Liste nicht existiert.",
|
||||
"list3": "Um Leerzeichen zu verwenden, füge einfach ein \" oder ' um den Namen der Liste hinzu.",
|
||||
"list4": "Zum Beispiel: {prefix}\"Liste mit Leerzeichen\".",
|
||||
"dateAndTime": "Datum und Uhrzeit",
|
||||
"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",
|
||||
|
@ -848,19 +847,19 @@
|
|||
"delete": {
|
||||
"header": "Team löschen",
|
||||
"text1": "Bist du sicher, dass du dieses Team und alle seine Mitglieder löschen willst?",
|
||||
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"text2": "Alle Teammitglieder verlieren den Zugriff auf Listen und Namespaces, die mit diesem Team geteilt sind. Dies KANN NICHT Rückgängig gemacht werden!",
|
||||
"success": "Das Team wurde erfolgreich gelöscht."
|
||||
},
|
||||
"deleteUser": {
|
||||
"header": "Benutzer:innen aus dem Team entfernen",
|
||||
"text1": "Bist du sicher, dass du diese:n Benutzer:in aus dem Team entfernen willst?",
|
||||
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"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!",
|
||||
"success": "Der:die Benutzer:in wurde erfolgreich aus dem Team gelöscht."
|
||||
},
|
||||
"leave": {
|
||||
"title": "Team verlassen",
|
||||
"text1": "Bist du sicher, dass du dieses Team verlassen willst?",
|
||||
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
||||
"text2": "Du 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.",
|
||||
"success": "Du hast das Team erfolgreich verlassen."
|
||||
}
|
||||
},
|
||||
|
@ -892,22 +891,22 @@
|
|||
"attachment": "Einen Anhang dieser Aufgabe hinzufügen",
|
||||
"related": "Ändere die Abhängigen Aufgaben dieser Aufgabe",
|
||||
"color": "Die Farbe dieser Aufgabe ändern",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Diese Aufgabe in eine andere Liste verschieben",
|
||||
"reminder": "Erinnerungen für diese Aufgabe verwalten",
|
||||
"description": "Aufgabenbeschreibung bearbeiten"
|
||||
},
|
||||
"project": {
|
||||
"title": "Project Views",
|
||||
"switchToListView": "Switch to list view",
|
||||
"switchToGanttView": "Switch to gantt view",
|
||||
"switchToKanbanView": "Switch to kanban view",
|
||||
"switchToTableView": "Switch to table view"
|
||||
"list": {
|
||||
"title": "Listenansicht",
|
||||
"switchToListView": "Zur Listenansicht wechseln",
|
||||
"switchToGanttView": "Zur Ganttansicht wechseln",
|
||||
"switchToKanbanView": "Zur Kanbanansicht wechseln",
|
||||
"switchToTableView": "Zur Tabellenansicht wechseln"
|
||||
},
|
||||
"navigation": {
|
||||
"title": "Navigation",
|
||||
"overview": "Die Startseite aufrufen",
|
||||
"upcoming": "Anstehende Aufgaben aufrufen",
|
||||
"namespaces": "Navigate to namespaces & projects",
|
||||
"namespaces": "Namespaces & Listen aufrufen",
|
||||
"labels": "Labels aufrufen",
|
||||
"teams": "Teams aufrufen"
|
||||
}
|
||||
|
@ -924,7 +923,7 @@
|
|||
"unarchive": "Archivierung aufheben",
|
||||
"setBackground": "Hintergrund einstellen",
|
||||
"share": "Teilen",
|
||||
"newProject": "New project"
|
||||
"newList": "Neue Liste"
|
||||
},
|
||||
"apiConfig": {
|
||||
"url": "Vikunja-URL",
|
||||
|
@ -943,24 +942,24 @@
|
|||
"notification": {
|
||||
"title": "Benachrichtigungen",
|
||||
"none": "Du hast keine Benachrichtigungen. Einen schönen Tag noch!",
|
||||
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||
"explainer": "Benachrichtigungen werden hier angezeigt, wenn Aktionen für Namespaces, Listen oder Aufgaben, die du abonniert hast, ausgeführt werden."
|
||||
},
|
||||
"quickActions": {
|
||||
"commands": "Befehle",
|
||||
"placeholder": "Gib einen Befehl oder eine Suche ein …",
|
||||
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
|
||||
"hint": "Du 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.",
|
||||
"tasks": "Aufgaben",
|
||||
"projects": "Projects",
|
||||
"lists": "Listen",
|
||||
"teams": "Teams",
|
||||
"newProject": "Enter the title of the new project…",
|
||||
"newList": "Gib den Titel der neuen Liste ein …",
|
||||
"newTask": "Gib den Titel der neuen Aufgabe ein …",
|
||||
"newNamespace": "Gib den Titel des neuen Namespaces ein…",
|
||||
"newTeam": "Gib den Namen des neuen Teams ein …",
|
||||
"createTask": "Create a task in the current project ({title})",
|
||||
"createProject": "Create a project in the current namespace ({title})",
|
||||
"createTask": "Eine Aufgabe in der aktuellen Liste erstellen ({title})",
|
||||
"createList": "Eine Liste im aktuellen Namespace erstellen ({title})",
|
||||
"cmds": {
|
||||
"newTask": "Neue Aufgabe",
|
||||
"newProject": "New project",
|
||||
"newList": "Neue Liste",
|
||||
"newNamespace": "Neuer Namespace",
|
||||
"newTeam": "Neues Team"
|
||||
}
|
||||
|
@ -992,15 +991,15 @@
|
|||
"1018": "Die Avatareinstellungen sind falsch.",
|
||||
"2001": "Die ID kann nicht leer oder 0 sein.",
|
||||
"2002": "Ein Teil der Anfragedaten ist ungültig.",
|
||||
"3001": "The project does not exist.",
|
||||
"3004": "You need to have read permissions on that project to perform that action.",
|
||||
"3005": "The project title cannot be empty.",
|
||||
"3006": "The project share does not exist.",
|
||||
"3007": "A project with this identifier already exists.",
|
||||
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
|
||||
"4001": "The project task text cannot be empty.",
|
||||
"4002": "The project task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same project.",
|
||||
"3001": "Die Liste existiert nicht.",
|
||||
"3004": "Du musst Leseberechtigungen für diese Liste haben, um diese Aktion ausführen zu können.",
|
||||
"3005": "Der Listentitel darf nicht leer sein.",
|
||||
"3006": "Diese Linkfreigabe existiert nicht.",
|
||||
"3007": "Eine Liste mit diesem Bezeichner existiert bereits.",
|
||||
"3008": "Diese Liste ist archiviert und kann deshalb nur gelesen werden. Dies gilt auch für alle Aufgaben, die mit dieser Liste verbunden sind.",
|
||||
"4001": "Der Aufgabentitel kann nicht leer sein.",
|
||||
"4002": "Diese Aufgabe existiert nicht.",
|
||||
"4003": "Alle Massenbearbeitungen an Aufgaben müssen zu derselben Liste gehören.",
|
||||
"4004": "Es benötigt mindestens einen Task, um eine Massenänderung durchzuführen.",
|
||||
"4005": "Du hast keine Berechtigungen, um diese Aufgabe anzuzeigen.",
|
||||
"4006": "Du kannst die übergeordnete Aufgabe nicht auf sich selbst referenzieren.",
|
||||
|
@ -1026,21 +1025,21 @@
|
|||
"5012": "Dieser Namespace ist archiviert und kann deshalb nur gelesen werden.",
|
||||
"6001": "Der Teamname kann nicht leer sein.",
|
||||
"6002": "Das Team existiert nicht.",
|
||||
"6004": "The team already has access to that namespace or project.",
|
||||
"6004": "Das Team hat bereits Zugriff auf diesen Namespace oder diese Liste.",
|
||||
"6005": "Diese:r Benutzer:in ist bereits dem Team beigetreten.",
|
||||
"6006": "Du kannst den:die letzten Benutzer:in dieses Teams nicht löschen.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "The user already has access to that project.",
|
||||
"7003": "You do not have access to that project.",
|
||||
"6007": "Das Team hat keine Berechtigungen auf dieser Liste, um das durchzuführen.",
|
||||
"7002": "Der:die Benutzer:in hat bereits Zugriff auf diese Liste.",
|
||||
"7003": "Du hast keinen Zugriff auf diese Liste.",
|
||||
"8001": "Dieses Label existiert bereits auf dieser Aufgabe.",
|
||||
"8002": "Das Label existiert nicht.",
|
||||
"8003": "Du hast keinen Zugriff auf dieses Label.",
|
||||
"9001": "Das Recht ist ungültig.",
|
||||
"10001": "Diese Spalte existiert nicht.",
|
||||
"10002": "The bucket does not belong to that project.",
|
||||
"10003": "You cannot remove the last bucket on a project.",
|
||||
"10002": "Diese Spalte gehört nicht zu dieser Liste.",
|
||||
"10003": "Du kannst die letze Spalte in einer Liste nicht entfernen.",
|
||||
"10004": "Du kannst die Aufgabe nicht in diese Spalte legen, da sie schon die maximale Anzahl an Aufgaben enthält.",
|
||||
"10005": "There can be only one done bucket per project.",
|
||||
"10005": "Es kann nur eine Erledigt-Spalte pro Liste geben.",
|
||||
"11001": "Der gespeicherte Filter existiert nicht.",
|
||||
"11002": "Gespeicherte Ansichten sind für Linkfreigaben nicht verfügbar.",
|
||||
"12001": "Der Abonnement-Typ ist ungültig.",
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
"welcomeDay": "Hallo {username}!",
|
||||
"welcomeEvening": "Guten Abend, {username}!",
|
||||
"lastViewed": "Zletscht ahglueget",
|
||||
"project": {
|
||||
"newText": "Du kannst ein neues Projekt für deine neuen Aufgaben erstellen:",
|
||||
"new": "New project",
|
||||
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
"list": {
|
||||
"newText": "Du chasch e Liste für dini neue Uufgabe erstelle:",
|
||||
"new": "Neue Liste",
|
||||
"importText": "Oder importier dini Liste und Uufgabe us anderne Dienst nach Vikunja:",
|
||||
"import": "Dini Date in Vikunja importiere"
|
||||
}
|
||||
},
|
||||
"404": {
|
||||
|
@ -85,7 +85,7 @@
|
|||
"weekStartSunday": "Sunntig",
|
||||
"weekStartMonday": "Määntig",
|
||||
"language": "Sproch",
|
||||
"defaultProject": "Default Project",
|
||||
"defaultList": "Standard Liste",
|
||||
"timezone": "Zeitzone",
|
||||
"overdueTasksRemindersTime": "Zeit der E-Mail-Zusammenfassung der überfälligen Aufgaben"
|
||||
},
|
||||
|
@ -143,7 +143,7 @@
|
|||
},
|
||||
"deletion": {
|
||||
"title": "Lösche deinen Vikunja-Account",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
|
||||
"text1": "Das Löschen deines Accounts ist dauerhaft und unwiderruflich. Alle Namensräume, Listen und zugehörige Daten werden gelöscht.",
|
||||
"text2": "Zum Fortfahren gib bitte dein Passwort ein. Du erhältst eine E-Mail mit weiteren Anweisungen.",
|
||||
"confirm": "Meinen Account löschen",
|
||||
"requestSuccess": "Die Anfrage war erfolgreich. Du erhältst eine E-Mail mit weiteren Anweisungen.",
|
||||
|
@ -157,201 +157,201 @@
|
|||
},
|
||||
"export": {
|
||||
"title": "Exportiere deine Vikunja-Daten",
|
||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
||||
"description": "Du 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.",
|
||||
"descriptionPasswordRequired": "Bitte gib dein Passwort ein, um fortzufahren:",
|
||||
"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.",
|
||||
"downloadTitle": "Lade deine exportierten Vikunja-Daten herunter"
|
||||
}
|
||||
},
|
||||
"project": {
|
||||
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Project Title",
|
||||
"color": "Color",
|
||||
"projects": "Projects",
|
||||
"search": "Type to search for a project…",
|
||||
"searchSelect": "Click or press enter to select this project",
|
||||
"shared": "Shared Projects",
|
||||
"noDescriptionAvailable": "No project description is available.",
|
||||
"list": {
|
||||
"archived": "Diese Liste ist archiviert. Es ist nicht möglich, neue Aufgaben zu erstellen oder sie zu bearbeiten.",
|
||||
"title": "Liste Titl",
|
||||
"color": "Farb",
|
||||
"lists": "Listene",
|
||||
"list": {
|
||||
"title": "Liste",
|
||||
"add": "Hinzuefüege",
|
||||
"addPlaceholder": "E neui Uufgab erstelle…",
|
||||
"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": {
|
||||
"header": "New project",
|
||||
"titlePlaceholder": "The project's title goes here…",
|
||||
"addTitleRequired": "Please specify a title.",
|
||||
"createdSuccess": "The project was successfully created.",
|
||||
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||
"header": "Neue Liste",
|
||||
"titlePlaceholder": "Listetitl da ahgeh…",
|
||||
"addTitleRequired": "Bitte gib en Titl ah.",
|
||||
"createdSuccess": "Liste erfolgriich erstellt.",
|
||||
"addListRequired": "Bitte gib e Liste ah oder definier e standard Liste i de Iihstellige."
|
||||
},
|
||||
"archive": {
|
||||
"title": "Archive \"{project}\"",
|
||||
"archive": "Archive this project",
|
||||
"unarchive": "Un-Archive this project",
|
||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||
"success": "The project was successfully archived."
|
||||
"title": "\"{list}\" archiviere",
|
||||
"archive": "Die Liste archiviere",
|
||||
"unarchive": "Die Liste nüm archiviere",
|
||||
"unarchiveText": "Du chasch neui Uufgabe erstelle oder bearbeite.",
|
||||
"archiveText": "Du chasch kei neui Uufgabe erstelle oder bearbeite bis du das nüm archiviert häsch.",
|
||||
"success": "Die Liste isch erfolgriich archiviert worde."
|
||||
},
|
||||
"background": {
|
||||
"title": "Set project background",
|
||||
"remove": "Remove Background",
|
||||
"upload": "Choose a background from your pc",
|
||||
"searchPlaceholder": "Search for a background…",
|
||||
"poweredByUnsplash": "Powered by Unsplash",
|
||||
"loadMore": "Load more photos",
|
||||
"success": "The background has been set successfully!",
|
||||
"removeSuccess": "The background has been removed successfully!"
|
||||
"title": "Listehintergrund setze",
|
||||
"remove": "Listehintergrund entferne",
|
||||
"upload": "Wähl en Hintergrund vo diim Pc uus",
|
||||
"searchPlaceholder": "Suech nach emne Hintergrund…",
|
||||
"poweredByUnsplash": "Unterstützt vo Unsplash",
|
||||
"loadMore": "Meh Fotis ladä",
|
||||
"success": "De Hintergrund isch erfolgriich gsetzt worde!",
|
||||
"removeSuccess": "De Hintergrund isch erfolgriich entfernt worde!"
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{project}\"",
|
||||
"header": "Delete this project",
|
||||
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||
"success": "The project was successfully deleted.",
|
||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||
"title": "\"{list}\" chüble",
|
||||
"header": "Die Liste chüble",
|
||||
"text1": "Bisch du dir sicher, dass du die Liste und all ihren Inhalt chüble wetsch?",
|
||||
"text2": "Das beinhalltet alli Uufgabe und CHAN NID RÜCKGÄNGIG GMACHT WERDE!",
|
||||
"success": "Die Liste isch erfolgriich g'chüblet wore.",
|
||||
"tasksToDelete": "Dies löscht unwiderruflich ca. {count} Aufgaben.",
|
||||
"noTasksToDelete": "Diese Liste enthält keine Aufgaben, sie kann sicher gelöscht werden."
|
||||
},
|
||||
"duplicate": {
|
||||
"title": "Duplicate this project",
|
||||
"label": "Duplicate",
|
||||
"text": "Select a namespace which should hold the duplicated project:",
|
||||
"success": "The project was successfully duplicated."
|
||||
"title": "Die Liste dubliziere",
|
||||
"label": "Dubliziere",
|
||||
"text": "Wähl en Namensruum uus, wo die dubliziert Liste hii set gah:",
|
||||
"success": "D'Liste isch erfolgriich dubliziert wore."
|
||||
},
|
||||
"edit": {
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifier": "Project Identifier",
|
||||
"identifierPlaceholder": "The project identifier goes here…",
|
||||
"description": "Description",
|
||||
"descriptionPlaceholder": "The projects description goes here…",
|
||||
"color": "Color",
|
||||
"success": "The project was successfully updated."
|
||||
"header": "Die Liste bearbeite",
|
||||
"title": "\"{list}\" bearbeite",
|
||||
"titlePlaceholder": "Listetitl da ahgeh…",
|
||||
"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.",
|
||||
"identifier": "Liste Identifikator",
|
||||
"identifierPlaceholder": "Listeidentifikator da ahgeh…",
|
||||
"description": "Beschriibig",
|
||||
"descriptionPlaceholder": "D'Listebeschriibig chunt da hane…",
|
||||
"color": "Farb",
|
||||
"success": "D'Liste isch erfolgriich aktualisiert wore."
|
||||
},
|
||||
"share": {
|
||||
"header": "Share this project",
|
||||
"title": "Share \"{project}\"",
|
||||
"share": "Share",
|
||||
"header": "Die Liste teile",
|
||||
"title": "\"{list}\" teile",
|
||||
"share": "Teilä",
|
||||
"links": {
|
||||
"title": "Share Links",
|
||||
"what": "What is a share link?",
|
||||
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||
"create": "Create a new link share",
|
||||
"name": "Name (optional)",
|
||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||
"password": "Password (optional)",
|
||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||
"noName": "No name set",
|
||||
"remove": "Remove a link share",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"createSuccess": "The link share was successfully created.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"view": "View",
|
||||
"sharedBy": "Shared by {0}"
|
||||
"title": "Link teile",
|
||||
"what": "Was isch en teilte Link?",
|
||||
"explanation": "En Teilte Link git dir d'möglichkeit, e Liste mit anderne Benutzer wo kein Vikunja account hend, z'teile.",
|
||||
"create": "En neue teilte Link erstelle",
|
||||
"name": "Namä (optional)",
|
||||
"namePlaceholder": "z.B. Reto Häberli",
|
||||
"nameExplanation": "Alli aktione, wo mit dem teilte Link gmacht werdet, werded mit dem Name hinterleit.",
|
||||
"password": "Passwort (optional)",
|
||||
"passwordExplanation": "De Benutzer wird um es Passwort bättet, wenn er dadruf zuegriift.",
|
||||
"noName": "Kein Name g'setzt",
|
||||
"remove": "Linkfreigab lösche",
|
||||
"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!",
|
||||
"createSuccess": "De Freigabelink isch erfolgriich erstellt wore.",
|
||||
"deleteSuccess": "De g'teilti Link isch erfolgriich g'chüblet wore",
|
||||
"view": "Ansicht",
|
||||
"sharedBy": "Von {0} geteilt"
|
||||
},
|
||||
"userTeam": {
|
||||
"typeUser": "user | users",
|
||||
"typeTeam": "team | teams",
|
||||
"shared": "Shared with these {type}",
|
||||
"you": "You",
|
||||
"notShared": "Not shared with any {type} yet.",
|
||||
"removeHeader": "Remove a {type} from the {sharable}",
|
||||
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||
"addedSuccess": "The {type} was successfully added.",
|
||||
"updatedSuccess": "The {type} was successfully added."
|
||||
"typeUser": "Benutzer | Benutzer",
|
||||
"typeTeam": "Team | Teams",
|
||||
"shared": "Mit dene {type} teilt",
|
||||
"you": "Du",
|
||||
"notShared": "Nid mit {type} teilt.",
|
||||
"removeHeader": "{type} vo dere {sharable} entferne",
|
||||
"removeText": "Bisch du sicher du wersch de {sharable} vo dem {type} entferne? Das cha nid rückgängig gmacht werde!",
|
||||
"removeSuccess": "De {sharable} isch erfolgriich vom {type} entfernt wore.",
|
||||
"addedSuccess": "De {type} isch erfolgriich hinzuegfüegt wore.",
|
||||
"updatedSuccess": "De {type} isch erfolgriich hinzuegfüegt wore."
|
||||
},
|
||||
"right": {
|
||||
"title": "Permission",
|
||||
"read": "Read only",
|
||||
"readWrite": "Read & write",
|
||||
"admin": "Admin"
|
||||
"title": "Berechtigung",
|
||||
"read": "Nur Lese",
|
||||
"readWrite": "Lese und Schriibe",
|
||||
"admin": "Chef"
|
||||
},
|
||||
"attributes": {
|
||||
"link": "Link",
|
||||
"delete": "Delete"
|
||||
"delete": "Chüble"
|
||||
}
|
||||
},
|
||||
"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": {
|
||||
"title": "Gantt",
|
||||
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||
"size": "Size",
|
||||
"default": "Default",
|
||||
"month": "Month",
|
||||
"day": "Day",
|
||||
"hour": "Hour",
|
||||
"range": "Date Range",
|
||||
"noDates": "This task has no dates set."
|
||||
"showTasksWithoutDates": "Zeig Uufgabe, wo kei Date hend",
|
||||
"size": "Grössi",
|
||||
"default": "Standard",
|
||||
"month": "Monet",
|
||||
"day": "Taag",
|
||||
"hour": "Stunde",
|
||||
"range": "Zeitraum",
|
||||
"noDates": "Die Uufgab het no kei Datum gsetzt."
|
||||
},
|
||||
"table": {
|
||||
"title": "Table",
|
||||
"columns": "Columns"
|
||||
"title": "Tabällä",
|
||||
"columns": "Spaltä"
|
||||
},
|
||||
"kanban": {
|
||||
"title": "Kanban",
|
||||
"limit": "Limit: {limit}",
|
||||
"noLimit": "Not Set",
|
||||
"doneBucket": "Done bucket",
|
||||
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
|
||||
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||
"deleteLast": "You cannot remove the last bucket.",
|
||||
"addTaskPlaceholder": "Enter the new task title…",
|
||||
"addTask": "Add a task",
|
||||
"addAnotherTask": "Add another task",
|
||||
"addBucket": "Create a new bucket",
|
||||
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||
"deleteHeaderBucket": "Delete the bucket",
|
||||
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"limit": "Limitä: {limit}",
|
||||
"noLimit": "Nid gsetzt",
|
||||
"doneBucket": "Fertig-Chübl",
|
||||
"doneBucketHint": "Alli Uufgabe wo i de Chübl gworfe werded, sind automatisch als Färtig markiert.",
|
||||
"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.",
|
||||
"doneBucketSavedSuccess": "De Färtig-Chübl isch erfolgriich gspeicheret worde.",
|
||||
"deleteLast": "Du chasch de letscht Chübl nid entferne.",
|
||||
"addTaskPlaceholder": "Neue Uufgabe Titl hinzuefüege…",
|
||||
"addTask": "Uufgab hinzuefüegä",
|
||||
"addAnotherTask": "Nomol e Uufgab hinzuefüege",
|
||||
"addBucket": "Neue Chübl erstelle",
|
||||
"addBucketPlaceholder": "Gib en neue Chübl-Name iih…",
|
||||
"deleteHeaderBucket": "De Chübl chüblä",
|
||||
"deleteBucketText1": "Bisch du dir sicher, dass du de Chübl chüblä wetsch?",
|
||||
"deleteBucketText2": "Das löscht kei Uufgabe, aber wirft si in Standard-Chübl.",
|
||||
"deleteBucketSuccess": "De Chübl isch erfolgriich g'chüblet worde.",
|
||||
"bucketTitleSavedSuccess": "De Chübl Name isch erfolgriich gspeicheret worde.",
|
||||
"bucketLimitSavedSuccess": "Das Chübl-Limit isch erfolgriich gspeicheret worde.",
|
||||
"collapse": "De Chübl zemeklappe"
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
"title": "Favorites"
|
||||
"title": "Favoriite"
|
||||
}
|
||||
}
|
||||
},
|
||||
"namespace": {
|
||||
"title": "Namespaces & Projects",
|
||||
"title": "Namensrüüm und Listene",
|
||||
"namespace": "Namensruum",
|
||||
"showArchived": "Archivierti aahzeige",
|
||||
"noneAvailable": "Du hesch momentan kein Namensruuim.",
|
||||
"unarchive": "Ent-archiviere",
|
||||
"archived": "Archiviert",
|
||||
"noProjects": "This namespace does not contain any projects.",
|
||||
"createProject": "Create a new project in this namespace.",
|
||||
"noLists": "De Namensruum het kei Listene drin.",
|
||||
"createList": "E neui Liste i dem Namensruum erstelle.",
|
||||
"namespaces": "Namensrüüm",
|
||||
"search": "Schriib, um nachemne Namensruum z'sueche…",
|
||||
"create": {
|
||||
"title": "Neuer Namespace",
|
||||
"titleRequired": "Bitte gib en Titl ah.",
|
||||
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
|
||||
"explanation": "Ein Namespace ist eine Sammlung von Listen, die du teilen und zur Organisation verwenden kannst. Jede Liste gehört zu einem Namespace.",
|
||||
"tooltip": "Was isch en Namensruum?",
|
||||
"success": "Namensruum erstellt."
|
||||
},
|
||||
"archive": {
|
||||
"titleArchive": "\"{namespace}\" archiviere",
|
||||
"titleUnarchive": "\"{namespace}\" ent-archiviere",
|
||||
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
|
||||
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||
"archiveText": "Du 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.",
|
||||
"unarchiveText": "Du chasch neui Liste erstelle oder bearbeite.",
|
||||
"success": "De Namensruum isch erfolgriich archiviert worde.",
|
||||
"unarchiveSuccess": "Der Namespace wurde erfolgreich wiederhergestellt.",
|
||||
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||
"description": "Wenn en Namensruum archiviert isch, chasch du kei neui Liste erstelle oder die bearbeite."
|
||||
},
|
||||
"delete": {
|
||||
"title": "\"{namespace}\" chüble",
|
||||
"text1": "Bisch du dir sicher, dass du de Namensruum und all ihren Inhalt chüble wetsch?",
|
||||
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||
"text2": "Das beinhalltet alli Liste und Uufgabe und CHAN NID RÜCKGÄNGIG GMACHT WERDE!",
|
||||
"success": "Namensruum g'chüblet."
|
||||
},
|
||||
"edit": {
|
||||
|
@ -371,8 +371,8 @@
|
|||
"isArchived": "De Namensruum isch archiviert"
|
||||
},
|
||||
"pseudo": {
|
||||
"sharedProjects": {
|
||||
"title": "Shared Projects"
|
||||
"sharedLists": {
|
||||
"title": "G'Teilti Liste"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "Favorite"
|
||||
|
@ -403,7 +403,7 @@
|
|||
},
|
||||
"create": {
|
||||
"title": "Neuer gespeicherter Filter",
|
||||
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
||||
"description": "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.",
|
||||
"action": "Neue gspeicherete Filter erstelle",
|
||||
"titleRequired": "Bitte gib den Titel für den Filter an."
|
||||
},
|
||||
|
@ -435,7 +435,7 @@
|
|||
"label": {
|
||||
"title": "Labels",
|
||||
"manage": "Label migriere",
|
||||
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
|
||||
"description": "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.",
|
||||
"newCTA": "Du hesch momentan kei Labels.",
|
||||
"search": "Schriib, um nachemne Label z'sueche…",
|
||||
"create": {
|
||||
|
@ -460,7 +460,7 @@
|
|||
},
|
||||
"sharing": {
|
||||
"authenticating": "Authentifiziere…",
|
||||
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||
"passwordRequired": "Die teilt Liste bruucht es Passwort. Bitte gibs une ah:",
|
||||
"error": "Het en Fähler geh. :(",
|
||||
"invalidPassword": "Da Passwort isch ungültig."
|
||||
},
|
||||
|
@ -529,7 +529,7 @@
|
|||
"code": "Code",
|
||||
"quote": "Zitaat",
|
||||
"unorderedList": "Ungordnedi Listä",
|
||||
"orderedList ": "Ordered List",
|
||||
"orderedList": "Gordneti Listä",
|
||||
"cleanBlock": "Formatierig Lösche",
|
||||
"link": "Link",
|
||||
"image": "Bild",
|
||||
|
@ -602,7 +602,6 @@
|
|||
"addReminder": "Neui Errinnerig erstelle…",
|
||||
"doneSuccess": "Die Uufgab isch erfolgriich als \"Fertig\" markiert wordä.",
|
||||
"undoneSuccess": "Die Uufgaab isch nüme als fertig markiert.",
|
||||
"undo": "Rückgängig",
|
||||
"openDetail": "Uufgab i de Detailaahsicht öffne",
|
||||
"checklistTotal": "{checked} von {total} Aufgaben",
|
||||
"checklistAllDone": "{total} Aufgaben",
|
||||
|
@ -619,7 +618,7 @@
|
|||
"chooseDueDate": "Druck da, um es Fälligkeitsdatum z'setze",
|
||||
"chooseStartDate": "Druck dah, um es Startdatum z'setze",
|
||||
"chooseEndDate": "Druck da, um es Enddatum z'setze",
|
||||
"move": "Move task to a different project",
|
||||
"move": "Schieb die Uufgab in e anderi Liste",
|
||||
"done": "Als erledigt markieren!",
|
||||
"undone": "Als unerledigt markierä",
|
||||
"created": "Erstellt am {0} vo {1}",
|
||||
|
@ -627,7 +626,7 @@
|
|||
"doneAt": "{0} erledigt",
|
||||
"updateSuccess": "Die Uufgab isch erfolgriich g'speichered wore.",
|
||||
"deleteSuccess": "Die Uufgab isch erfolgriich g'chüblet wore.",
|
||||
"belongsToProject": "This task belongs to project '{project}'",
|
||||
"belongsToList": "Die Uufgab ghlrt zu de \"{list}\" Liste",
|
||||
"due": "Fällig bis {at}",
|
||||
"closePopup": "Popup schließen",
|
||||
"delete": {
|
||||
|
@ -647,7 +646,7 @@
|
|||
"percentDone": "Fortschritt einstellen",
|
||||
"attachments": "Anhänge hinzufügen",
|
||||
"relatedTasks": "Beziehung hinzufügen",
|
||||
"moveProject": "Move",
|
||||
"moveList": "Verschieben",
|
||||
"color": "Farbe setzen",
|
||||
"delete": "Löschen",
|
||||
"favorite": "Zu Favoriten hinzufügen",
|
||||
|
@ -674,21 +673,21 @@
|
|||
"updated": "Aktualisiert"
|
||||
},
|
||||
"subscription": {
|
||||
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||
"subscribedListThroughParentNamespace": "Du kannst hier nicht de-abonnieren, da du diese Liste über ihren Namespace abonniert hast.",
|
||||
"subscribedTaskThroughParentNamespace": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihren Namespace abonniert hast.",
|
||||
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||
"subscribedTaskThroughParentList": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihre Liste abonniert hast.",
|
||||
"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.",
|
||||
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||
"subscribedList": "Du hast diese Liste abonniert und erhältst Benachrichtigungen über Änderungen.",
|
||||
"notSubscribedList": "Du hast diese Liste nicht abonniert und erhältst keine 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.",
|
||||
"subscribe": "Abooniere",
|
||||
"unsubscribe": "Deabonniere",
|
||||
"subscribeSuccessNamespace": "Du hast diesen Namespace jetzt abonniert",
|
||||
"unsubscribeSuccessNamespace": "Du hast diesen Namespace jetzt nicht mehr abonniert",
|
||||
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||
"subscribeSuccessList": "Du hast diese Liste jetzt abonniert",
|
||||
"unsubscribeSuccessList": "Du hast diese Liste jetzt nicht mehr abonniert",
|
||||
"subscribeSuccessTask": "Du hast diese Aufgabe jetzt abonniert",
|
||||
"unsubscribeSuccessTask": "Du hast diese Aufgabe jetzt nicht mehr abonniert"
|
||||
},
|
||||
|
@ -762,7 +761,7 @@
|
|||
"new": "Neui Uufgabe Beziehig",
|
||||
"searchPlaceholder": "Schriib, um e neui Uufgab als Zueghörigkeit hinzuezfüege…",
|
||||
"createPlaceholder": "Das als en neui Zueghörigkeit hinzuefüege",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentList": "Die Uufgab ghöört zu ere andere Liste.",
|
||||
"differentNamespace": "Diese Aufgabe gehört zu einem anderen Namespace.",
|
||||
"noneYet": "S'git kei Uufgabe Beziehige.",
|
||||
"delete": "Uufgabe Beziehig chüble",
|
||||
|
@ -812,10 +811,10 @@
|
|||
"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.",
|
||||
"assignees": "Um die Aufgabe direkt jemandem zuzuweisen, füge vor dem Anmeldenamen der Person ein {prefix} Zeichen ein.",
|
||||
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||
"list1": "Um e Liste ahzgeh, wo de Task drin erschiine set, gib de name vo de liste mit emne {prefix} ah.",
|
||||
"list2": "Das wird en Fehler werfe, wenn d'Liste nid existiert.",
|
||||
"list3": "Um Leerzeichen zu verwenden, füge einfach ein \" oder ' um den Namen der Liste hinzu.",
|
||||
"list4": "Zum Beispiel: {prefix}\"Liste mit Leerzeichen\".",
|
||||
"dateAndTime": "Datum und Ziit",
|
||||
"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",
|
||||
|
@ -848,19 +847,19 @@
|
|||
"delete": {
|
||||
"header": "Das Team chüble",
|
||||
"text1": "Bischder sicher, dasst wetsch da Team mit allne Mitglieder lösche?",
|
||||
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"text2": "Alle Teammitglieder verlieren den Zugriff auf Listen und Namespaces, die mit diesem Team geteilt sind. Dies KANN NICHT Rückgängig gemacht werden!",
|
||||
"success": "Da Team isch erfolgriich g'chüblet wore."
|
||||
},
|
||||
"deleteUser": {
|
||||
"header": "Benutzer usem Team entferne",
|
||||
"text1": "Bisch du dir sicher, dass du de Benutzer usm Team werfe wetsch?",
|
||||
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"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!",
|
||||
"success": "Benutzer erfolgriich usegworfe."
|
||||
},
|
||||
"leave": {
|
||||
"title": "Team verlassen",
|
||||
"text1": "Bist du sicher, dass du dieses Team verlassen willst?",
|
||||
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
||||
"text2": "Du 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.",
|
||||
"success": "Du hast das Team erfolgreich verlassen."
|
||||
}
|
||||
},
|
||||
|
@ -892,22 +891,22 @@
|
|||
"attachment": "En Aahang dere Uufgab hinzuefüege",
|
||||
"related": "Beziehige vo dere Uufgab bearbeite",
|
||||
"color": "Die Farbe dieser Aufgabe ändern",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Diese Aufgabe in eine andere Liste verschieben",
|
||||
"reminder": "Erinnerungen für diese Aufgabe verwalten",
|
||||
"description": "Aufgabenbeschreibung bearbeiten"
|
||||
},
|
||||
"project": {
|
||||
"title": "Project Views",
|
||||
"switchToListView": "Switch to list view",
|
||||
"switchToGanttView": "Switch to gantt view",
|
||||
"switchToKanbanView": "Switch to kanban view",
|
||||
"switchToTableView": "Switch to table view"
|
||||
"list": {
|
||||
"title": "Listenansicht",
|
||||
"switchToListView": "Zur Listenansicht wechseln",
|
||||
"switchToGanttView": "Zur Ganttansicht wechseln",
|
||||
"switchToKanbanView": "Zur Kanbanansicht wechseln",
|
||||
"switchToTableView": "Zur Tabellenansicht wechseln"
|
||||
},
|
||||
"navigation": {
|
||||
"title": "Navigation",
|
||||
"overview": "Die Startseite aufrufen",
|
||||
"upcoming": "Anstehende Aufgaben aufrufen",
|
||||
"namespaces": "Navigate to namespaces & projects",
|
||||
"namespaces": "Namespaces & Listen aufrufen",
|
||||
"labels": "Labels aufrufen",
|
||||
"teams": "Teams aufrufen"
|
||||
}
|
||||
|
@ -924,7 +923,7 @@
|
|||
"unarchive": "Ent-archiviere",
|
||||
"setBackground": "Hintergrund iihstelle",
|
||||
"share": "Teilä",
|
||||
"newProject": "New project"
|
||||
"newList": "Neui Listä"
|
||||
},
|
||||
"apiConfig": {
|
||||
"url": "Vikunja URL",
|
||||
|
@ -943,24 +942,24 @@
|
|||
"notification": {
|
||||
"title": "Benachrichtigunge",
|
||||
"none": "Du hesch kei neui Benachrichtunge. Heb e schös Tägli!",
|
||||
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||
"explainer": "Benachrichtigunge landed do, wenn eppis bi de Namensrüüm, Liste oder Uufgabe passiert, welche du abonniert hesch."
|
||||
},
|
||||
"quickActions": {
|
||||
"commands": "Befehl",
|
||||
"placeholder": "Schriib en Befehl oder suech…",
|
||||
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
|
||||
"hint": "Du 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.",
|
||||
"tasks": "Uufgabe",
|
||||
"projects": "Projects",
|
||||
"lists": "Listene",
|
||||
"teams": "Teams",
|
||||
"newProject": "Enter the title of the new project…",
|
||||
"newList": "Gib en Titl für die neu Liste iih…",
|
||||
"newTask": "Gib en Titl für die neu Uufgab iih…",
|
||||
"newNamespace": "Gib en Titl für de neu Namensruum iih…",
|
||||
"newTeam": "Gib en Name für da neui Team iih…",
|
||||
"createTask": "Create a task in the current project ({title})",
|
||||
"createProject": "Create a project in the current namespace ({title})",
|
||||
"createTask": "Erstell e Uufgab i de momentane Listä ({title})",
|
||||
"createList": "Erstell e Liste im momentane Namensruum ({title})",
|
||||
"cmds": {
|
||||
"newTask": "Neui Uufgab",
|
||||
"newProject": "New project",
|
||||
"newList": "Neui Liste",
|
||||
"newNamespace": "Neue Namensruum",
|
||||
"newTeam": "Neus Team"
|
||||
}
|
||||
|
@ -992,15 +991,15 @@
|
|||
"1018": "Die Benutzer Profilbild Iihstellige sind nid gültig.",
|
||||
"2001": "ID chann nid leer oder 0 sii.",
|
||||
"2002": "Ebbis vo de Ahfragedate isch ungültig.",
|
||||
"3001": "The project does not exist.",
|
||||
"3004": "You need to have read permissions on that project to perform that action.",
|
||||
"3005": "The project title cannot be empty.",
|
||||
"3006": "The project share does not exist.",
|
||||
"3007": "A project with this identifier already exists.",
|
||||
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
|
||||
"4001": "The project task text cannot be empty.",
|
||||
"4002": "The project task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same project.",
|
||||
"3001": "Die Liste giz nid.",
|
||||
"3004": "Du hesch kei Läseberächtigung für die Liste um das durezfüehre.",
|
||||
"3005": "De Titl cha nid leer sii.",
|
||||
"3006": "Die Freigab giz nid.",
|
||||
"3007": "E Liste mit dere Identifizierig giz scho.",
|
||||
"3008": "Die Liste isch archiviert und chan desshalb nur glese werde. Das gliiche gilt für alli Uufgabe i dere Liste.",
|
||||
"4001": "De Liste Uufgabe Titl cha nid leer sii.",
|
||||
"4002": "Die Liste Uufgab giz nid.",
|
||||
"4003": "Alli Massebearbeitige a Uufgabe müend i de selbe Liste passiere.",
|
||||
"4004": "Es bruucht mindestens ei Uufgab, um e Masseänderig durezfüehre.",
|
||||
"4005": "Du hesch kei Berechtigung, um die Uufgab ahzzeige.",
|
||||
"4006": "Du chasch kei übergordneti Uufgab uf sich selbst refferenziere.",
|
||||
|
@ -1026,21 +1025,21 @@
|
|||
"5012": "De Namensruum isch momentan schriibgschützt weil er archiviert isch.",
|
||||
"6001": "Der Teamname kann nicht leer sein.",
|
||||
"6002": "Da Team giz nid.",
|
||||
"6004": "The team already has access to that namespace or project.",
|
||||
"6004": "Da Team het scho Zuegang zu dem Namensruum oder Liste.",
|
||||
"6005": "De Benutzer isch scho bi dem Team.",
|
||||
"6006": "Du chasch nid de letschti Benutzer vom Team lösche.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "The user already has access to that project.",
|
||||
"7003": "You do not have access to that project.",
|
||||
"6007": "Da Team het kei Zuegriff uf die Liste, um das durezfüehre.",
|
||||
"7002": "De Benutzer het scho Zuegriff uf die Liste.",
|
||||
"7003": "Du hesch kei Zuegriff uf die Liste.",
|
||||
"8001": "Da Label existiert scho für die Uufgab.",
|
||||
"8002": "Das Label giz nid.",
|
||||
"8003": "Du hesch kei Zuegriff uf da Label.",
|
||||
"9001": "Die Berechtigung isch ungültig.",
|
||||
"10001": "De Chübl gits nid.",
|
||||
"10002": "The bucket does not belong to that project.",
|
||||
"10003": "You cannot remove the last bucket on a project.",
|
||||
"10002": "De Chübl ghört nid i die Liste.",
|
||||
"10003": "Du chasch de letscht Chübl nid vo de Liste neh.",
|
||||
"10004": "Du chasch die Uufgab nid dem Chübl zue wiise, weil er d'Limite für Uufgabe erreicht het.",
|
||||
"10005": "There can be only one done bucket per project.",
|
||||
"10005": "Es chan nur ein Fertig Chübl pro Liste geh.",
|
||||
"11001": "De g'speicheret Filter giz nid.",
|
||||
"11002": "G'speichereti Filter chend nid Teilt werde.",
|
||||
"12001": "De Abonnement Entitätstyp isch ungültig.",
|
||||
|
|
|
@ -5,10 +5,10 @@
|
|||
"welcomeDay": "Hi {username}!",
|
||||
"welcomeEvening": "Good Evening {username}!",
|
||||
"lastViewed": "Last viewed",
|
||||
"project": {
|
||||
"newText": "You can create a new project for your new tasks:",
|
||||
"new": "New project",
|
||||
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||
"list": {
|
||||
"newText": "You can create a new list for your new tasks:",
|
||||
"new": "New list",
|
||||
"importText": "Or import your lists and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
}
|
||||
},
|
||||
|
@ -85,7 +85,7 @@
|
|||
"weekStartSunday": "Sunday",
|
||||
"weekStartMonday": "Monday",
|
||||
"language": "Language",
|
||||
"defaultProject": "Default Project",
|
||||
"defaultList": "Default List",
|
||||
"timezone": "Time Zone",
|
||||
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
||||
},
|
||||
|
@ -143,7 +143,7 @@
|
|||
},
|
||||
"deletion": {
|
||||
"title": "Delete your Vikunja Account",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, lists, tasks and everything associated with it.",
|
||||
"text2": "To proceed, please enter your password. You will receive an email with further instructions.",
|
||||
"confirm": "Delete my account",
|
||||
"requestSuccess": "The request was successful. You'll receive an email with further instructions.",
|
||||
|
@ -157,39 +157,40 @@
|
|||
},
|
||||
"export": {
|
||||
"title": "Export your Vikunja data",
|
||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
||||
"description": "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.",
|
||||
"descriptionPasswordRequired": "Please enter your password to proceed:",
|
||||
"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.",
|
||||
"downloadTitle": "Download your exported Vikunja data"
|
||||
}
|
||||
},
|
||||
"project": {
|
||||
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Project Title",
|
||||
"list": {
|
||||
"archived": "This list is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "List Title",
|
||||
"color": "Color",
|
||||
"projects": "Projects",
|
||||
"search": "Type to search for a project…",
|
||||
"searchSelect": "Click or press enter to select this project",
|
||||
"shared": "Shared Projects",
|
||||
"noDescriptionAvailable": "No project description is available.",
|
||||
"lists": "Lists",
|
||||
"list": "List",
|
||||
"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": {
|
||||
"header": "New project",
|
||||
"titlePlaceholder": "The project's title goes here…",
|
||||
"header": "New list",
|
||||
"titlePlaceholder": "The list's title goes here…",
|
||||
"addTitleRequired": "Please specify a title.",
|
||||
"createdSuccess": "The project was successfully created.",
|
||||
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||
"createdSuccess": "The list was successfully created.",
|
||||
"addListRequired": "Please specify a list or set a default list in the settings."
|
||||
},
|
||||
"archive": {
|
||||
"title": "Archive \"{project}\"",
|
||||
"archive": "Archive this project",
|
||||
"unarchive": "Un-Archive this project",
|
||||
"title": "Archive \"{list}\"",
|
||||
"archive": "Archive this list",
|
||||
"unarchive": "Un-Archive this list",
|
||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||
"success": "The project was successfully archived."
|
||||
"archiveText": "You won't be able to edit this list or create new tasks until you un-archive it.",
|
||||
"success": "The list was successfully archived."
|
||||
},
|
||||
"background": {
|
||||
"title": "Set project background",
|
||||
"title": "Set list background",
|
||||
"remove": "Remove Background",
|
||||
"upload": "Choose a background from your pc",
|
||||
"searchPlaceholder": "Search for a background…",
|
||||
|
@ -199,40 +200,40 @@
|
|||
"removeSuccess": "The background has been removed successfully!"
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{project}\"",
|
||||
"header": "Delete this project",
|
||||
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||
"title": "Delete \"{list}\"",
|
||||
"header": "Delete this list",
|
||||
"text1": "Are you sure you want to delete this list and all of its contents?",
|
||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||
"success": "The project was successfully deleted.",
|
||||
"success": "The list was successfully deleted.",
|
||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||
"noTasksToDelete": "This list does not contain any tasks, it should be safe to delete."
|
||||
},
|
||||
"duplicate": {
|
||||
"title": "Duplicate this project",
|
||||
"title": "Duplicate this list",
|
||||
"label": "Duplicate",
|
||||
"text": "Select a namespace which should hold the duplicated project:",
|
||||
"success": "The project was successfully duplicated."
|
||||
"text": "Select a namespace which should hold the duplicated list:",
|
||||
"success": "The list was successfully duplicated."
|
||||
},
|
||||
"edit": {
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifier": "Project Identifier",
|
||||
"identifierPlaceholder": "The project identifier goes here…",
|
||||
"header": "Edit This List",
|
||||
"title": "Edit \"{list}\"",
|
||||
"titlePlaceholder": "The list 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.",
|
||||
"identifier": "List Identifier",
|
||||
"identifierPlaceholder": "The list identifier goes here…",
|
||||
"description": "Description",
|
||||
"descriptionPlaceholder": "The projects description goes here…",
|
||||
"descriptionPlaceholder": "The lists description goes here…",
|
||||
"color": "Color",
|
||||
"success": "The project was successfully updated."
|
||||
"success": "The list was successfully updated."
|
||||
},
|
||||
"share": {
|
||||
"header": "Share this project",
|
||||
"title": "Share \"{project}\"",
|
||||
"header": "Share this list",
|
||||
"title": "Share \"{list}\"",
|
||||
"share": "Share",
|
||||
"links": {
|
||||
"title": "Share Links",
|
||||
"what": "What is a share link?",
|
||||
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||
"explanation": "Share Links allow you to easily share a list with other users who don't have an account on Vikunja.",
|
||||
"create": "Create a new link share",
|
||||
"name": "Name (optional)",
|
||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||
|
@ -241,7 +242,7 @@
|
|||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||
"noName": "No name set",
|
||||
"remove": "Remove a link share",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"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!",
|
||||
"createSuccess": "The link share was successfully created.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"view": "View",
|
||||
|
@ -274,7 +275,7 @@
|
|||
"title": "List",
|
||||
"add": "Add",
|
||||
"addPlaceholder": "Add a new task…",
|
||||
"empty": "This project is currently empty.",
|
||||
"empty": "This list is currently empty.",
|
||||
"newTaskCta": "Create a new task.",
|
||||
"editTask": "Edit Task"
|
||||
},
|
||||
|
@ -322,36 +323,36 @@
|
|||
}
|
||||
},
|
||||
"namespace": {
|
||||
"title": "Namespaces & Projects",
|
||||
"title": "Namespaces & Lists",
|
||||
"namespace": "Namespace",
|
||||
"showArchived": "Show Archived",
|
||||
"noneAvailable": "You don't have any namespaces right now.",
|
||||
"unarchive": "Un-Archive",
|
||||
"archived": "Archived",
|
||||
"noProjects": "This namespace does not contain any projects.",
|
||||
"createProject": "Create a new project in this namespace.",
|
||||
"noLists": "This namespace does not contain any lists.",
|
||||
"createList": "Create a new list in this namespace.",
|
||||
"namespaces": "Namespaces",
|
||||
"search": "Type to search for a namespace…",
|
||||
"create": {
|
||||
"title": "New namespace",
|
||||
"titleRequired": "Please specify a title.",
|
||||
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
|
||||
"explanation": "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.",
|
||||
"tooltip": "What's a namespace?",
|
||||
"success": "The namespace was successfully created."
|
||||
},
|
||||
"archive": {
|
||||
"titleArchive": "Archive \"{namespace}\"",
|
||||
"titleUnarchive": "Un-Archive \"{namespace}\"",
|
||||
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
|
||||
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||
"archiveText": "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.",
|
||||
"unarchiveText": "You will be able to create new lists or edit it.",
|
||||
"success": "The namespace was successfully archived.",
|
||||
"unarchiveSuccess": "The namespace was successfully un-archived.",
|
||||
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||
"description": "If a namespace is archived, you cannot create new lists or edit it."
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{namespace}\"",
|
||||
"text1": "Are you sure you want to delete this namespace and all of its contents?",
|
||||
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||
"text2": "This includes all lists and tasks and CANNOT BE UNDONE!",
|
||||
"success": "The namespace was successfully deleted."
|
||||
},
|
||||
"edit": {
|
||||
|
@ -371,8 +372,8 @@
|
|||
"isArchived": "This namespace is archived"
|
||||
},
|
||||
"pseudo": {
|
||||
"sharedProjects": {
|
||||
"title": "Shared Projects"
|
||||
"sharedLists": {
|
||||
"title": "Shared Lists"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "Favorites"
|
||||
|
@ -403,7 +404,7 @@
|
|||
},
|
||||
"create": {
|
||||
"title": "New Saved Filter",
|
||||
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
||||
"description": "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.",
|
||||
"action": "Create new saved filter",
|
||||
"titleRequired": "Please provide a title for the filter."
|
||||
},
|
||||
|
@ -435,7 +436,7 @@
|
|||
"label": {
|
||||
"title": "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 project 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 list you have access.",
|
||||
"newCTA": "You currently do not have any labels.",
|
||||
"search": "Type to search for a label…",
|
||||
"create": {
|
||||
|
@ -460,7 +461,7 @@
|
|||
},
|
||||
"sharing": {
|
||||
"authenticating": "Authenticating…",
|
||||
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||
"passwordRequired": "This shared list requires a password. Please enter it below:",
|
||||
"error": "An error occured.",
|
||||
"invalidPassword": "The password is invalid."
|
||||
},
|
||||
|
@ -529,7 +530,7 @@
|
|||
"code": "Code",
|
||||
"quote": "Quote",
|
||||
"unorderedList": "Unordered List",
|
||||
"orderedList ": "Ordered List",
|
||||
"orderedList": "Ordered List",
|
||||
"cleanBlock": "Clean Block",
|
||||
"link": "Link",
|
||||
"image": "Image",
|
||||
|
@ -605,7 +606,6 @@
|
|||
"addReminder": "Add a new reminder…",
|
||||
"doneSuccess": "The task was successfully marked as done.",
|
||||
"undoneSuccess": "The task was successfully un-marked as done.",
|
||||
"undo": "Undo",
|
||||
"openDetail": "Open task detail view",
|
||||
"checklistTotal": "{checked} of {total} tasks",
|
||||
"checklistAllDone": "{total} tasks",
|
||||
|
@ -622,7 +622,7 @@
|
|||
"chooseDueDate": "Click here to set a due date",
|
||||
"chooseStartDate": "Click here to set a start date",
|
||||
"chooseEndDate": "Click here to set an end date",
|
||||
"move": "Move task to a different project",
|
||||
"move": "Move task to a different list",
|
||||
"done": "Mark task done!",
|
||||
"undone": "Mark as undone",
|
||||
"created": "Created {0} by {1}",
|
||||
|
@ -630,7 +630,7 @@
|
|||
"doneAt": "Done {0}",
|
||||
"updateSuccess": "The task was saved successfully.",
|
||||
"deleteSuccess": "The task has been deleted successfully.",
|
||||
"belongsToProject": "This task belongs to project '{project}'",
|
||||
"belongsToList": "This task belongs to list '{list}'",
|
||||
"due": "Due {at}",
|
||||
"closePopup": "Close popup",
|
||||
"delete": {
|
||||
|
@ -650,7 +650,7 @@
|
|||
"percentDone": "Set Progress",
|
||||
"attachments": "Add Attachments",
|
||||
"relatedTasks": "Add Relation",
|
||||
"moveProject": "Move",
|
||||
"moveList": "Move",
|
||||
"color": "Set Color",
|
||||
"delete": "Delete",
|
||||
"favorite": "Add to Favorites",
|
||||
|
@ -677,21 +677,21 @@
|
|||
"updated": "Updated"
|
||||
},
|
||||
"subscription": {
|
||||
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||
"subscribedListThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this list through its namespace.",
|
||||
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
|
||||
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||
"subscribedTaskThroughParentList": "You can't unsubscribe here because you are subscribed to this task through its list.",
|
||||
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
|
||||
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
|
||||
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||
"subscribedList": "You are currently subscribed to this list and will receive notifications for changes.",
|
||||
"notSubscribedList": "You are not subscribed to this list and won't receive notifications for changes.",
|
||||
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
|
||||
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
|
||||
"subscribe": "Subscribe",
|
||||
"unsubscribe": "Unsubscribe",
|
||||
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
||||
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
||||
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||
"subscribeSuccessList": "You are now subscribed to this list",
|
||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||
},
|
||||
|
@ -765,7 +765,7 @@
|
|||
"new": "New Task Relation",
|
||||
"searchPlaceholder": "Type search for a new task to add as related…",
|
||||
"createPlaceholder": "Add this as new related task",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentList": "This task belongs to a different list.",
|
||||
"differentNamespace": "This task belongs to a different namespace.",
|
||||
"noneYet": "No task relations yet.",
|
||||
"delete": "Delete Task Relation",
|
||||
|
@ -815,10 +815,10 @@
|
|||
"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.",
|
||||
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
||||
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||
"list1": "To set a list for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"list2": "This will return an error if the list does not exist.",
|
||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
||||
"list4": "For example: {prefix}\"List with spaces\".",
|
||||
"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:",
|
||||
"dateWeekday": "any weekday, will use the next date with that date",
|
||||
|
@ -851,19 +851,19 @@
|
|||
"delete": {
|
||||
"header": "Delete the team",
|
||||
"text1": "Are you sure you want to delete this team and all of its members?",
|
||||
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"text2": "All team members will lose access to lists and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"success": "The team was successfully deleted."
|
||||
},
|
||||
"deleteUser": {
|
||||
"header": "Remove a user from the team",
|
||||
"text1": "Are you sure you want to remove this user from the team?",
|
||||
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"text2": "They will lose access to all lists and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"success": "The user was successfully deleted from the team."
|
||||
},
|
||||
"leave": {
|
||||
"title": "Leave team",
|
||||
"text1": "Are you sure you want to leave this team?",
|
||||
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
||||
"text2": "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.",
|
||||
"success": "You have successfully left the team."
|
||||
}
|
||||
},
|
||||
|
@ -895,12 +895,12 @@
|
|||
"attachment": "Add an attachment to this task",
|
||||
"related": "Modify related tasks of this task",
|
||||
"color": "Change the color of this task",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Move this task to another list",
|
||||
"reminder": "Manage reminders of this task",
|
||||
"description": "Toggle editing of the task description"
|
||||
},
|
||||
"project": {
|
||||
"title": "Project Views",
|
||||
"list": {
|
||||
"title": "List Views",
|
||||
"switchToListView": "Switch to list view",
|
||||
"switchToGanttView": "Switch to gantt view",
|
||||
"switchToKanbanView": "Switch to kanban view",
|
||||
|
@ -910,7 +910,7 @@
|
|||
"title": "Navigation",
|
||||
"overview": "Navigate to overview",
|
||||
"upcoming": "Navigate to upcoming tasks",
|
||||
"namespaces": "Navigate to namespaces & projects",
|
||||
"namespaces": "Navigate to namespaces & lists",
|
||||
"labels": "Navigate to labels",
|
||||
"teams": "Navigate to teams"
|
||||
}
|
||||
|
@ -927,7 +927,7 @@
|
|||
"unarchive": "Un-Archive",
|
||||
"setBackground": "Set background",
|
||||
"share": "Share",
|
||||
"newProject": "New project"
|
||||
"newList": "New list"
|
||||
},
|
||||
"apiConfig": {
|
||||
"url": "Vikunja URL",
|
||||
|
@ -946,24 +946,24 @@
|
|||
"notification": {
|
||||
"title": "Notifications",
|
||||
"none": "You don't have any notifications. Have a nice day!",
|
||||
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||
"explainer": "Notifications will appear here when actions on namespaces, lists or tasks you subscribed to happen."
|
||||
},
|
||||
"quickActions": {
|
||||
"commands": "Commands",
|
||||
"placeholder": "Type a command or search…",
|
||||
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
|
||||
"hint": "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.",
|
||||
"tasks": "Tasks",
|
||||
"projects": "Projects",
|
||||
"lists": "Lists",
|
||||
"teams": "Teams",
|
||||
"newProject": "Enter the title of the new project…",
|
||||
"newList": "Enter the title of the new list…",
|
||||
"newTask": "Enter the title of the new task…",
|
||||
"newNamespace": "Enter the title of the new namespace…",
|
||||
"newTeam": "Enter the name of the new team…",
|
||||
"createTask": "Create a task in the current project ({title})",
|
||||
"createProject": "Create a project in the current namespace ({title})",
|
||||
"createTask": "Create a task in the current list ({title})",
|
||||
"createList": "Create a list in the current namespace ({title})",
|
||||
"cmds": {
|
||||
"newTask": "New task",
|
||||
"newProject": "New project",
|
||||
"newList": "New list",
|
||||
"newNamespace": "New namespace",
|
||||
"newTeam": "New team"
|
||||
}
|
||||
|
@ -995,15 +995,15 @@
|
|||
"1018": "The user avatar type setting is invalid.",
|
||||
"2001": "ID cannot be empty or 0.",
|
||||
"2002": "Some of the request data was invalid.",
|
||||
"3001": "The project does not exist.",
|
||||
"3004": "You need to have read permissions on that project to perform that action.",
|
||||
"3005": "The project title cannot be empty.",
|
||||
"3006": "The project share does not exist.",
|
||||
"3007": "A project with this identifier already exists.",
|
||||
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
|
||||
"4001": "The project task text cannot be empty.",
|
||||
"4002": "The project task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same project.",
|
||||
"3001": "The list does not exist.",
|
||||
"3004": "You need to have read permissions on that list to perform that action.",
|
||||
"3005": "The list title cannot be empty.",
|
||||
"3006": "The list share does not exist.",
|
||||
"3007": "A list 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.",
|
||||
"4001": "The list task text cannot be empty.",
|
||||
"4002": "The list task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same list.",
|
||||
"4004": "Need at least one task when bulk editing tasks.",
|
||||
"4005": "You do not have the right to see the task.",
|
||||
"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.",
|
||||
"6001": "The team name cannot be empty.",
|
||||
"6002": "The team does not exist.",
|
||||
"6004": "The team already has access to that namespace or project.",
|
||||
"6004": "The team already has access to that namespace or list.",
|
||||
"6005": "The user is already a member of that team.",
|
||||
"6006": "Cannot delete the last team member.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "The user already has access to that project.",
|
||||
"7003": "You do not have access to that project.",
|
||||
"6007": "The team does not have access to the list to perform that action.",
|
||||
"7002": "The user already has access to that list.",
|
||||
"7003": "You do not have access to that list.",
|
||||
"8001": "This label already exists on that task.",
|
||||
"8002": "The label does not exist.",
|
||||
"8003": "You do not have access to this label.",
|
||||
"9001": "The right is invalid.",
|
||||
"10001": "The bucket does not exist.",
|
||||
"10002": "The bucket does not belong to that project.",
|
||||
"10003": "You cannot remove the last bucket on a project.",
|
||||
"10002": "The bucket does not belong to that list.",
|
||||
"10003": "You cannot remove the last bucket on a list.",
|
||||
"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 project.",
|
||||
"10005": "There can be only one done bucket per list.",
|
||||
"11001": "The saved filter does not exist.",
|
||||
"11002": "Saved filters are not available for link shares.",
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
"welcomeDay": "¡Hola {username}!",
|
||||
"welcomeEvening": "¡Buenas Tardes {username}!",
|
||||
"lastViewed": "Visto por última vez",
|
||||
"project": {
|
||||
"newText": "You can create a new project for your new tasks:",
|
||||
"new": "New project",
|
||||
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
"list": {
|
||||
"newText": "Puedes crear una nueva lista para las tareas nuevas:",
|
||||
"new": "Nueva lista",
|
||||
"importText": "O importa tus listas y tareas de otros servicios a Vikunja:",
|
||||
"import": "Importa tus datos a Vikunja"
|
||||
}
|
||||
},
|
||||
"404": {
|
||||
|
@ -85,7 +85,7 @@
|
|||
"weekStartSunday": "Domingo",
|
||||
"weekStartMonday": "Lunes",
|
||||
"language": "Idioma",
|
||||
"defaultProject": "Default Project",
|
||||
"defaultList": "Lista Predeterminada",
|
||||
"timezone": "Zona Horaria",
|
||||
"overdueTasksRemindersTime": "Hora de envío del correo electrónico de tareas pendientes"
|
||||
},
|
||||
|
@ -143,7 +143,7 @@
|
|||
},
|
||||
"deletion": {
|
||||
"title": "Eliminar tu Cuenta de Vikunja",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
|
||||
"text1": "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.",
|
||||
"text2": "Para continuar, por favor, introduce tu contraseña. Recibirás un correo electrónico con más instrucciones.",
|
||||
"confirm": "Eliminar mi cuenta",
|
||||
"requestSuccess": "La solicitud ha sido exitosa. Recibirás un correo electrónico con más instrucciones.",
|
||||
|
@ -157,201 +157,201 @@
|
|||
},
|
||||
"export": {
|
||||
"title": "Exportar tus datos de Vikunja",
|
||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
||||
"description": "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.",
|
||||
"descriptionPasswordRequired": "Por favor, introduce tu contraseña para continuar:",
|
||||
"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.",
|
||||
"downloadTitle": "Descargar tus datos de Vikunja exportados"
|
||||
}
|
||||
},
|
||||
"project": {
|
||||
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Project Title",
|
||||
"list": {
|
||||
"archived": "La lista está archivada. No es posible crear nuevas tareas, ni editarlas.",
|
||||
"title": "Título de Lista",
|
||||
"color": "Color",
|
||||
"projects": "Projects",
|
||||
"search": "Type to search for a project…",
|
||||
"searchSelect": "Click or press enter to select this project",
|
||||
"shared": "Shared Projects",
|
||||
"noDescriptionAvailable": "No project description is available.",
|
||||
"lists": "Listas",
|
||||
"list": {
|
||||
"title": "Lista",
|
||||
"add": "Añadir",
|
||||
"addPlaceholder": "Añadir una nueva tarea…",
|
||||
"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": {
|
||||
"header": "New project",
|
||||
"titlePlaceholder": "The project's title goes here…",
|
||||
"addTitleRequired": "Please specify a title.",
|
||||
"createdSuccess": "The project was successfully created.",
|
||||
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||
"header": "Nueva lista",
|
||||
"titlePlaceholder": "El título de la lista va aquí…",
|
||||
"addTitleRequired": "Por favor, especifica un título.",
|
||||
"createdSuccess": "La lista se ha creado correctamente.",
|
||||
"addListRequired": "Por favor, especifica una lista o establece una lista por defecto en la configuración."
|
||||
},
|
||||
"archive": {
|
||||
"title": "Archive \"{project}\"",
|
||||
"archive": "Archive this project",
|
||||
"unarchive": "Un-Archive this project",
|
||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||
"success": "The project was successfully archived."
|
||||
"title": "Archivar \"{list}\"",
|
||||
"archive": "Archivar esta lista",
|
||||
"unarchive": "Desarchivar esta lista",
|
||||
"unarchiveText": "Podrás crear tareas nuevas o editarlas.",
|
||||
"archiveText": "No podrás editar esta lista ni crear nuevas tareas hasta que la desarchives.",
|
||||
"success": "La lista fue archivada con éxito."
|
||||
},
|
||||
"background": {
|
||||
"title": "Set project background",
|
||||
"remove": "Remove Background",
|
||||
"upload": "Choose a background from your pc",
|
||||
"searchPlaceholder": "Search for a background…",
|
||||
"poweredByUnsplash": "Powered by Unsplash",
|
||||
"loadMore": "Load more photos",
|
||||
"success": "The background has been set successfully!",
|
||||
"removeSuccess": "The background has been removed successfully!"
|
||||
"title": "Establecer fondo para la lista",
|
||||
"remove": "Eliminar Fondo",
|
||||
"upload": "Elige un fondo desde tu pc",
|
||||
"searchPlaceholder": "Buscar un fondo…",
|
||||
"poweredByUnsplash": "Con tecnología de Unsplash",
|
||||
"loadMore": "Cargar más fotos",
|
||||
"success": "¡El fondo se ha establecido con éxito!",
|
||||
"removeSuccess": "¡El fondo se ha eliminado con éxito!"
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{project}\"",
|
||||
"header": "Delete this project",
|
||||
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||
"success": "The project was successfully deleted.",
|
||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||
"title": "Eliminar \"{list}\"",
|
||||
"header": "Eliminar esta lista",
|
||||
"text1": "¿Estás seguro de que quieres eliminar esta lista y todo su contenido?",
|
||||
"text2": "¡Esto incluye todas las tareas y NO SE PUEDE DESHACER!",
|
||||
"success": "La lista se ha eliminado con éxito.",
|
||||
"tasksToDelete": "Esto eliminará irrevocablemente aprox. {count} tareas.",
|
||||
"noTasksToDelete": "Esta lista no contiene ninguna tarea, debería ser segura de eliminar."
|
||||
},
|
||||
"duplicate": {
|
||||
"title": "Duplicate this project",
|
||||
"label": "Duplicate",
|
||||
"text": "Select a namespace which should hold the duplicated project:",
|
||||
"success": "The project was successfully duplicated."
|
||||
"title": "Duplicar esta lista",
|
||||
"label": "Duplicar",
|
||||
"text": "Seleccione un proyecto que debería contener la lista duplicada:",
|
||||
"success": "La lista se ha duplicado con éxito."
|
||||
},
|
||||
"edit": {
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifier": "Project Identifier",
|
||||
"identifierPlaceholder": "The project identifier goes here…",
|
||||
"description": "Description",
|
||||
"descriptionPlaceholder": "The projects description goes here…",
|
||||
"header": "Editar Esta Lista",
|
||||
"title": "Editar \"{list}\"",
|
||||
"titlePlaceholder": "El título de la lista va aquí…",
|
||||
"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.",
|
||||
"identifier": "Identificador de la lista",
|
||||
"identifierPlaceholder": "El identificador de la lista va aquí…",
|
||||
"description": "Descripción",
|
||||
"descriptionPlaceholder": "La descripción de la lista va aquí…",
|
||||
"color": "Color",
|
||||
"success": "The project was successfully updated."
|
||||
"success": "La lista se ha actualizado correctamente."
|
||||
},
|
||||
"share": {
|
||||
"header": "Share this project",
|
||||
"title": "Share \"{project}\"",
|
||||
"share": "Share",
|
||||
"header": "Compartir esta lista",
|
||||
"title": "Compartir \"{list}\"",
|
||||
"share": "Compartir",
|
||||
"links": {
|
||||
"title": "Share Links",
|
||||
"what": "What is a share link?",
|
||||
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||
"create": "Create a new link share",
|
||||
"name": "Name (optional)",
|
||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||
"password": "Password (optional)",
|
||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||
"noName": "No name set",
|
||||
"remove": "Remove a link share",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"createSuccess": "The link share was successfully created.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"view": "View",
|
||||
"sharedBy": "Shared by {0}"
|
||||
"title": "Compartir enlaces",
|
||||
"what": "¿Qué es un enlace compartido?",
|
||||
"explanation": "Enlaces compartidos te permiten compartir fácilmente una lista con otros usuarios que no tienen una cuenta de Vikunja.",
|
||||
"create": "Crear un nuevo enlace compartido",
|
||||
"name": "Nombre (opcional)",
|
||||
"namePlaceholder": "ej. Lorem Ipsum",
|
||||
"nameExplanation": "Todas las acciones realizadas por este enlace compartido se mostrarán con el nombre.",
|
||||
"password": "Contraseña (opcional)",
|
||||
"passwordExplanation": "Al autenticarse, el usuario deberá introducir esta contraseña.",
|
||||
"noName": "Sin nombre establecido",
|
||||
"remove": "Eliminar un enlace compartido",
|
||||
"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!",
|
||||
"createSuccess": "El enlace compartido se ha creado correctamente.",
|
||||
"deleteSuccess": "El enlace compartido se ha eliminado correctamente",
|
||||
"view": "Vista",
|
||||
"sharedBy": "Compartido por {0}"
|
||||
},
|
||||
"userTeam": {
|
||||
"typeUser": "user | users",
|
||||
"typeTeam": "team | teams",
|
||||
"shared": "Shared with these {type}",
|
||||
"you": "You",
|
||||
"notShared": "Not shared with any {type} yet.",
|
||||
"removeHeader": "Remove a {type} from the {sharable}",
|
||||
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||
"typeUser": "usuario | usuarios",
|
||||
"typeTeam": "equipo | equipos",
|
||||
"shared": "Compartido con estos {type}",
|
||||
"you": "Tú",
|
||||
"notShared": "No compartido con ningún {type} aún.",
|
||||
"removeHeader": "Eliminar un {type} de la {sharable}",
|
||||
"removeText": "¿Estás seguro de que quieres eliminar este {sharable} del {type}? ¡Esto no se puede deshacer!",
|
||||
"removeSuccess": "El {sharable} fue eliminado correctamente de {type}.",
|
||||
"addedSuccess": "The {type} was successfully added.",
|
||||
"updatedSuccess": "The {type} was successfully added."
|
||||
"updatedSuccess": "El {type} fue añadido correctamente."
|
||||
},
|
||||
"right": {
|
||||
"title": "Permission",
|
||||
"read": "Read only",
|
||||
"readWrite": "Read & write",
|
||||
"title": "Permiso",
|
||||
"read": "Solo lectura",
|
||||
"readWrite": "Lectura y escritura",
|
||||
"admin": "Admin"
|
||||
},
|
||||
"attributes": {
|
||||
"link": "Link",
|
||||
"delete": "Delete"
|
||||
"link": "Enlace",
|
||||
"delete": "Eliminar"
|
||||
}
|
||||
},
|
||||
"list": {
|
||||
"title": "List",
|
||||
"add": "Add",
|
||||
"addPlaceholder": "Add a new task…",
|
||||
"empty": "This project is currently empty.",
|
||||
"newTaskCta": "Create a new task.",
|
||||
"editTask": "Edit Task"
|
||||
},
|
||||
"gantt": {
|
||||
"title": "Gantt",
|
||||
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||
"size": "Size",
|
||||
"default": "Default",
|
||||
"month": "Month",
|
||||
"day": "Day",
|
||||
"hour": "Hour",
|
||||
"range": "Date Range",
|
||||
"noDates": "This task has no dates set."
|
||||
"showTasksWithoutDates": "Mostrar tareas que no tienen fechas establecidas",
|
||||
"size": "Tamaño",
|
||||
"default": "Predeterminado",
|
||||
"month": "Mes",
|
||||
"day": "Día",
|
||||
"hour": "Hora",
|
||||
"range": "Rango de fechas",
|
||||
"noDates": "Esta tarea no tiene fechas establecidas."
|
||||
},
|
||||
"table": {
|
||||
"title": "Table",
|
||||
"columns": "Columns"
|
||||
"title": "Tabla",
|
||||
"columns": "Columnas"
|
||||
},
|
||||
"kanban": {
|
||||
"title": "Kanban",
|
||||
"limit": "Limit: {limit}",
|
||||
"noLimit": "Not Set",
|
||||
"doneBucket": "Done bucket",
|
||||
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
|
||||
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||
"deleteLast": "You cannot remove the last bucket.",
|
||||
"addTaskPlaceholder": "Enter the new task title…",
|
||||
"addTask": "Add a task",
|
||||
"addAnotherTask": "Add another task",
|
||||
"addBucket": "Create a new bucket",
|
||||
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||
"deleteHeaderBucket": "Delete the bucket",
|
||||
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"limit": "Límite: {limit}",
|
||||
"noLimit": "No Establecido",
|
||||
"doneBucket": "Contenedor Hecho",
|
||||
"doneBucketHint": "Todas las tareas movidas a este contenedor se marcarán automáticamente como hechas.",
|
||||
"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.",
|
||||
"doneBucketSavedSuccess": "El cubo finalizado ha sido guardado correctamente.",
|
||||
"deleteLast": "No puedes eliminar el último contenedor.",
|
||||
"addTaskPlaceholder": "Introduce el nuevo título de la tarea…",
|
||||
"addTask": "Añadir una tarea",
|
||||
"addAnotherTask": "Añadir otra tarea",
|
||||
"addBucket": "Crear un nuevo contenedor",
|
||||
"addBucketPlaceholder": "Introduzca el nuevo título del contenedor…",
|
||||
"deleteHeaderBucket": "Eliminar el contenedor",
|
||||
"deleteBucketText1": "¿Estás seguro de que quieres eliminar este contenedor?",
|
||||
"deleteBucketText2": "Esto no eliminará ninguna tarea pero las moverá al contenedor por defecto.",
|
||||
"deleteBucketSuccess": "El contenedor se ha eliminado con éxito.",
|
||||
"bucketTitleSavedSuccess": "El título del contenedor se ha guardado con éxito.",
|
||||
"bucketLimitSavedSuccess": "El límite del contenedor se ha guardado con éxito.",
|
||||
"collapse": "Contraer este contenedor"
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
"title": "Favorites"
|
||||
"title": "Favoritos"
|
||||
}
|
||||
}
|
||||
},
|
||||
"namespace": {
|
||||
"title": "Namespaces & Projects",
|
||||
"title": "Proyectos y listas",
|
||||
"namespace": "Proyecto",
|
||||
"showArchived": "Mostrar Archivados",
|
||||
"noneAvailable": "No tienes ningún proyecto en este momento.",
|
||||
"unarchive": "Desarchivar",
|
||||
"archived": "Archivado",
|
||||
"noProjects": "This namespace does not contain any projects.",
|
||||
"createProject": "Create a new project in this namespace.",
|
||||
"noLists": "Este proyecto no contiene ninguna lista.",
|
||||
"createList": "Crear una nueva lista en este proyecto.",
|
||||
"namespaces": "Proyectos",
|
||||
"search": "Escribe para buscar un proyecto…",
|
||||
"create": {
|
||||
"title": "Nuevo proyecto",
|
||||
"titleRequired": "Por favor, especifica un título.",
|
||||
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
|
||||
"explanation": "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.",
|
||||
"tooltip": "¿Qué es un proyecto?",
|
||||
"success": "El proyecto se ha creado correctamente."
|
||||
},
|
||||
"archive": {
|
||||
"titleArchive": "Archivar \"{namespace}\"",
|
||||
"titleUnarchive": "Desarchivar \"{namespace}\"",
|
||||
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
|
||||
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||
"archiveText": "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.",
|
||||
"unarchiveText": "Podrás crear listas nuevas o editarlas.",
|
||||
"success": "El proyecto fue archivado con éxito.",
|
||||
"unarchiveSuccess": "El proyecto se ha desarchivado con éxito.",
|
||||
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||
"description": "Si un proyecto está archivado, no podrás crear nuevas listas o editarlo."
|
||||
},
|
||||
"delete": {
|
||||
"title": "Eliminar \"{namespace}\"",
|
||||
"text1": "¿Estás seguro de que deseas eliminar este proyecto y todo su contenido?",
|
||||
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||
"text2": "¡Esto incluye todas las listas y tareas y NO SE PUEDE DESHACER!",
|
||||
"success": "El proyecto se ha eliminado con éxito."
|
||||
},
|
||||
"edit": {
|
||||
|
@ -371,8 +371,8 @@
|
|||
"isArchived": "Este proyecto está archivado"
|
||||
},
|
||||
"pseudo": {
|
||||
"sharedProjects": {
|
||||
"title": "Shared Projects"
|
||||
"sharedLists": {
|
||||
"title": "Listas compartidas"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "Favoritos"
|
||||
|
@ -403,7 +403,7 @@
|
|||
},
|
||||
"create": {
|
||||
"title": "New Saved Filter",
|
||||
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
||||
"description": "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.",
|
||||
"action": "Create new saved filter",
|
||||
"titleRequired": "Please provide a title for the filter."
|
||||
},
|
||||
|
@ -435,7 +435,7 @@
|
|||
"label": {
|
||||
"title": "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 project 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 list you have access.",
|
||||
"newCTA": "You currently do not have any labels.",
|
||||
"search": "Type to search for a label…",
|
||||
"create": {
|
||||
|
@ -460,7 +460,7 @@
|
|||
},
|
||||
"sharing": {
|
||||
"authenticating": "Authenticating…",
|
||||
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||
"passwordRequired": "This shared list requires a password. Please enter it below:",
|
||||
"error": "Ha ocurrido un error.",
|
||||
"invalidPassword": "La contraseña es inválida."
|
||||
},
|
||||
|
@ -529,7 +529,7 @@
|
|||
"code": "Código",
|
||||
"quote": "Cita",
|
||||
"unorderedList": "Lista no ordenada",
|
||||
"orderedList ": "Ordered List",
|
||||
"orderedList": "Lista ordenada",
|
||||
"cleanBlock": "Borrar Bloque",
|
||||
"link": "Enlace",
|
||||
"image": "Imagen",
|
||||
|
@ -602,7 +602,6 @@
|
|||
"addReminder": "Add a new reminder…",
|
||||
"doneSuccess": "La tarea fue marcada con éxito como realizada.",
|
||||
"undoneSuccess": "La tarea fue marcada correctamente como incompleta.",
|
||||
"undo": "Undo",
|
||||
"openDetail": "Open task detail view",
|
||||
"checklistTotal": "{checked} of {total} tasks",
|
||||
"checklistAllDone": "{total} tasks",
|
||||
|
@ -619,7 +618,7 @@
|
|||
"chooseDueDate": "Click here to set a due date",
|
||||
"chooseStartDate": "Click here to set a start date",
|
||||
"chooseEndDate": "Click here to set an end date",
|
||||
"move": "Move task to a different project",
|
||||
"move": "Move task to a different list",
|
||||
"done": "Mark task done!",
|
||||
"undone": "Mark as undone",
|
||||
"created": "Created {0} by {1}",
|
||||
|
@ -627,7 +626,7 @@
|
|||
"doneAt": "Done {0}",
|
||||
"updateSuccess": "The task was saved successfully.",
|
||||
"deleteSuccess": "La tarea se ha eliminado con éxito.",
|
||||
"belongsToProject": "This task belongs to project '{project}'",
|
||||
"belongsToList": "This task belongs to list '{list}'",
|
||||
"due": "Due {at}",
|
||||
"closePopup": "Close popup",
|
||||
"delete": {
|
||||
|
@ -647,7 +646,7 @@
|
|||
"percentDone": "Definir Progreso",
|
||||
"attachments": "Añadir Adjuntos",
|
||||
"relatedTasks": "Añadir una Relación",
|
||||
"moveProject": "Move",
|
||||
"moveList": "Mover",
|
||||
"color": "Definir Color",
|
||||
"delete": "Eliminar",
|
||||
"favorite": "Añadir a Favoritos",
|
||||
|
@ -674,21 +673,21 @@
|
|||
"updated": "Actualizado"
|
||||
},
|
||||
"subscription": {
|
||||
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||
"subscribedListThroughParentNamespace": "No puede cancelar la suscripción aquí porque está suscrito a esta lista 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.",
|
||||
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||
"subscribedTaskThroughParentList": "No puedes darte de baja aquí porque estás suscrito a esta tarea a través de su lista.",
|
||||
"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.",
|
||||
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||
"subscribedList": "Actualmente estás suscrito a esta lista y recibirás notificaciones de cambios.",
|
||||
"notSubscribedList": "No estás suscrito a esta lista y no 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.",
|
||||
"subscribe": "Suscribirse",
|
||||
"unsubscribe": "Desuscribirse",
|
||||
"subscribeSuccessNamespace": "Ahora está suscrito a este proyecto",
|
||||
"unsubscribeSuccessNamespace": "Ya no está suscrito a este proyecto",
|
||||
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||
"subscribeSuccessList": "Ahora estás suscrito a esta lista",
|
||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||
},
|
||||
|
@ -762,7 +761,7 @@
|
|||
"new": "Nueva Tarea Relacionada",
|
||||
"searchPlaceholder": "Escriba para buscar una nueva tarea a añadir como relacionada…",
|
||||
"createPlaceholder": "Añadir esto como nueva tarea relacionada",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentList": "Esta tarea pertenece a una lista diferente.",
|
||||
"differentNamespace": "Esta tarea pertenece a un proyecto diferente.",
|
||||
"noneYet": "Aún no hay tareas relacionadas.",
|
||||
"delete": "Eliminar Relación de Tarea",
|
||||
|
@ -812,10 +811,10 @@
|
|||
"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.",
|
||||
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
||||
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||
"list1": "To set a list for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"list2": "This will return an error if the list does not exist.",
|
||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
||||
"list4": "For example: {prefix}\"List with spaces\".",
|
||||
"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:",
|
||||
"dateWeekday": "any weekday, will use the next date with that date",
|
||||
|
@ -848,19 +847,19 @@
|
|||
"delete": {
|
||||
"header": "Delete the team",
|
||||
"text1": "Are you sure you want to delete this team and all of its members?",
|
||||
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"text2": "All team members will lose access to lists and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"success": "El equipo fue eliminado con éxito."
|
||||
},
|
||||
"deleteUser": {
|
||||
"header": "Remove a user from the team",
|
||||
"text1": "Are you sure you want to remove this user from the team?",
|
||||
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"text2": "They will lose access to all lists and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"success": "El usuario fue quitado del equipo con éxito."
|
||||
},
|
||||
"leave": {
|
||||
"title": "Leave team",
|
||||
"text1": "Are you sure you want to leave this team?",
|
||||
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
||||
"text2": "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.",
|
||||
"success": "Has abandonado el equipo con éxito."
|
||||
}
|
||||
},
|
||||
|
@ -892,22 +891,22 @@
|
|||
"attachment": "Añadir un adjunto a esta tarea",
|
||||
"related": "Modificar tareas relacionadas de esta tarea",
|
||||
"color": "Cambia el color de esta tarea",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Mover esta tarea a otra lista",
|
||||
"reminder": "Administrar recordatorios de esta tarea",
|
||||
"description": "Editar la descripción de la tarea"
|
||||
},
|
||||
"project": {
|
||||
"title": "Project Views",
|
||||
"switchToListView": "Switch to list view",
|
||||
"switchToGanttView": "Switch to gantt view",
|
||||
"switchToKanbanView": "Switch to kanban view",
|
||||
"switchToTableView": "Switch to table view"
|
||||
"list": {
|
||||
"title": "Lista de vistas",
|
||||
"switchToListView": "Cambiar a vista de lista",
|
||||
"switchToGanttView": "Cambiar a vista gantt",
|
||||
"switchToKanbanView": "Cambiar a vista kanban",
|
||||
"switchToTableView": "Cambiar a vista de tabla"
|
||||
},
|
||||
"navigation": {
|
||||
"title": "Secciones",
|
||||
"overview": "Ir a resumen",
|
||||
"upcoming": "Ir a tareas próximas",
|
||||
"namespaces": "Navigate to namespaces & projects",
|
||||
"namespaces": "Ir a proyectos y listas",
|
||||
"labels": "Ir a etiquetas",
|
||||
"teams": "Ir a equipos"
|
||||
}
|
||||
|
@ -924,7 +923,7 @@
|
|||
"unarchive": "Desarchivar",
|
||||
"setBackground": "Establecer fondo",
|
||||
"share": "Compartir",
|
||||
"newProject": "New project"
|
||||
"newList": "Nueva lista"
|
||||
},
|
||||
"apiConfig": {
|
||||
"url": "URL de Vikunja",
|
||||
|
@ -943,24 +942,24 @@
|
|||
"notification": {
|
||||
"title": "Notificaciones",
|
||||
"none": "No tienes notificaciones. ¡Que tengas un buen día!",
|
||||
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||
"explainer": "Notifications will appear here when actions on namespaces, lists or tasks you subscribed to happen."
|
||||
},
|
||||
"quickActions": {
|
||||
"commands": "Commands",
|
||||
"placeholder": "Type a command or search…",
|
||||
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
|
||||
"hint": "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.",
|
||||
"tasks": "Tasks",
|
||||
"projects": "Projects",
|
||||
"lists": "Lists",
|
||||
"teams": "Teams",
|
||||
"newProject": "Enter the title of the new project…",
|
||||
"newList": "Enter the title of the new list…",
|
||||
"newTask": "Enter the title of the new task…",
|
||||
"newNamespace": "Enter the title of the new namespace…",
|
||||
"newTeam": "Enter the name of the new team…",
|
||||
"createTask": "Create a task in the current project ({title})",
|
||||
"createProject": "Create a project in the current namespace ({title})",
|
||||
"createTask": "Create a task in the current list ({title})",
|
||||
"createList": "Create a list in the current namespace ({title})",
|
||||
"cmds": {
|
||||
"newTask": "New task",
|
||||
"newProject": "New project",
|
||||
"newList": "New list",
|
||||
"newNamespace": "New namespace",
|
||||
"newTeam": "New team"
|
||||
}
|
||||
|
@ -992,15 +991,15 @@
|
|||
"1018": "The user avatar type setting is invalid.",
|
||||
"2001": "ID cannot be empty or 0.",
|
||||
"2002": "Some of the request data was invalid.",
|
||||
"3001": "The project does not exist.",
|
||||
"3004": "You need to have read permissions on that project to perform that action.",
|
||||
"3005": "The project title cannot be empty.",
|
||||
"3006": "The project share does not exist.",
|
||||
"3007": "A project with this identifier already exists.",
|
||||
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
|
||||
"4001": "The project task text cannot be empty.",
|
||||
"4002": "The project task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same project.",
|
||||
"3001": "The list does not exist.",
|
||||
"3004": "You need to have read permissions on that list to perform that action.",
|
||||
"3005": "The list title cannot be empty.",
|
||||
"3006": "The list share does not exist.",
|
||||
"3007": "A list 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.",
|
||||
"4001": "The list task text cannot be empty.",
|
||||
"4002": "The list task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same list.",
|
||||
"4004": "Se necesita al menos una tarea cuando se editan tareas masivamente.",
|
||||
"4005": "No tiene permiso para ver la tarea.",
|
||||
"4006": "No se puede establecer como tarea padre la propia tarea.",
|
||||
|
@ -1026,21 +1025,21 @@
|
|||
"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.",
|
||||
"6002": "Este equipo no existe.",
|
||||
"6004": "The team already has access to that namespace or project.",
|
||||
"6004": "El equipo ya tiene acceso a ese proyecto o lista.",
|
||||
"6005": "El usuario ya es miembro de ese equipo.",
|
||||
"6006": "No se puede quitar al último miembro del equipo.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "The user already has access to that project.",
|
||||
"7003": "You do not have access to that project.",
|
||||
"6007": "El equipo no tiene acceso a la lista para realizar esa acción.",
|
||||
"7002": "El usuario ya tiene acceso a esa lista.",
|
||||
"7003": "No tiene acceso a esta lista.",
|
||||
"8001": "Esta etiqueta ya existe en esta tarea.",
|
||||
"8002": "La etiqueta no existe.",
|
||||
"8003": "No tiene acceso a esta etiqueta.",
|
||||
"9001": "El permiso es inválido.",
|
||||
"10001": "El contenedor no existe.",
|
||||
"10002": "The bucket does not belong to that project.",
|
||||
"10003": "You cannot remove the last bucket on a project.",
|
||||
"10002": "El contenedor no pertenece a esa lista.",
|
||||
"10003": "No puede eliminar el último contenedor de una lista.",
|
||||
"10004": "No se puede añadir la tarea a este contenedor, ya que ya ha superado el límite de tareas establecido.",
|
||||
"10005": "There can be only one done bucket per project.",
|
||||
"10005": "Solo puede haber un contenedor hecho por lista.",
|
||||
"11001": "El filtro guardado no existe.",
|
||||
"11002": "Los filtros guardados no están disponibles para enlaces compartidos.",
|
||||
"12001": "El tipo de entidad de suscripción es inválido.",
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
"welcomeDay": "Hi {username}!",
|
||||
"welcomeEvening": "Good Evening {username}!",
|
||||
"lastViewed": "Dernière consultation",
|
||||
"project": {
|
||||
"newText": "You can create a new project for your new tasks:",
|
||||
"new": "New project",
|
||||
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
"list": {
|
||||
"newText": "Tu peux créer une nouvelle liste pour tes nouvelles tâches :",
|
||||
"new": "Nouvelle liste",
|
||||
"importText": "Ou importe tes listes et tâches d’autres services dans Vikunja :",
|
||||
"import": "Importer tes données dans Vikunja"
|
||||
}
|
||||
},
|
||||
"404": {
|
||||
|
@ -85,7 +85,7 @@
|
|||
"weekStartSunday": "dimanche",
|
||||
"weekStartMonday": "lundi",
|
||||
"language": "Langue",
|
||||
"defaultProject": "Default Project",
|
||||
"defaultList": "Liste par défaut",
|
||||
"timezone": "Fuseau horaire",
|
||||
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
||||
},
|
||||
|
@ -143,7 +143,7 @@
|
|||
},
|
||||
"deletion": {
|
||||
"title": "Supprimer ton compte Vikunja",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
|
||||
"text1": "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.",
|
||||
"text2": "Pour continuer, entre ton mot de passe. Tu recevras un courriel contenant les instructions suivantes.",
|
||||
"confirm": "Supprimer mon compte",
|
||||
"requestSuccess": "La demande a réussi. Tu recevras un courriel avec des instructions supplémentaires.",
|
||||
|
@ -157,201 +157,201 @@
|
|||
},
|
||||
"export": {
|
||||
"title": "Exporter tes données Vikunja",
|
||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
||||
"description": "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.",
|
||||
"descriptionPasswordRequired": "Entre ton mot de passe pour continuer :",
|
||||
"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.",
|
||||
"downloadTitle": "Télécharger tes données exportées de Vikunja"
|
||||
}
|
||||
},
|
||||
"project": {
|
||||
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Project Title",
|
||||
"color": "Color",
|
||||
"projects": "Projects",
|
||||
"search": "Type to search for a project…",
|
||||
"searchSelect": "Click or press enter to select this project",
|
||||
"shared": "Shared Projects",
|
||||
"noDescriptionAvailable": "No project description is available.",
|
||||
"list": {
|
||||
"archived": "Cette liste est archivée. Il n’est pas possible d’y créer de nouvelles tâches ou de les modifier.",
|
||||
"title": "Nom de la liste",
|
||||
"color": "Couleur",
|
||||
"lists": "Listes",
|
||||
"list": {
|
||||
"title": "Liste",
|
||||
"add": "Ajouter",
|
||||
"addPlaceholder": "Ajouter une nouvelle tâche…",
|
||||
"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": {
|
||||
"header": "New project",
|
||||
"titlePlaceholder": "The project's title goes here…",
|
||||
"addTitleRequired": "Please specify a title.",
|
||||
"createdSuccess": "The project was successfully created.",
|
||||
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||
"header": "Nouvelle liste",
|
||||
"titlePlaceholder": "Entre le nom de la liste…",
|
||||
"addTitleRequired": "Indique un nom.",
|
||||
"createdSuccess": "Liste créée.",
|
||||
"addListRequired": "Indique une liste ou définis une liste par défaut dans les paramètres."
|
||||
},
|
||||
"archive": {
|
||||
"title": "Archive \"{project}\"",
|
||||
"archive": "Archive this project",
|
||||
"unarchive": "Un-Archive this project",
|
||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||
"success": "The project was successfully archived."
|
||||
"title": "Archiver « {list} »",
|
||||
"archive": "Archiver cette liste",
|
||||
"unarchive": "Désarchiver cette liste",
|
||||
"unarchiveText": "Tu pourras créer de nouvelles tâches ou les modifier.",
|
||||
"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.",
|
||||
"success": "Liste archivée."
|
||||
},
|
||||
"background": {
|
||||
"title": "Set project background",
|
||||
"remove": "Remove Background",
|
||||
"upload": "Choose a background from your pc",
|
||||
"searchPlaceholder": "Search for a background…",
|
||||
"poweredByUnsplash": "Powered by Unsplash",
|
||||
"loadMore": "Load more photos",
|
||||
"success": "The background has been set successfully!",
|
||||
"removeSuccess": "The background has been removed successfully!"
|
||||
"title": "Définir l’arrière-plan de la liste",
|
||||
"remove": "Retirer l’arrière-plan",
|
||||
"upload": "Choisis un arrière-plan depuis ton ordinateur",
|
||||
"searchPlaceholder": "Rechercher un arrière-plan…",
|
||||
"poweredByUnsplash": "Propulsé par Unsplash",
|
||||
"loadMore": "Charger plus de photos",
|
||||
"success": "Arrière-plan défini.",
|
||||
"removeSuccess": "Arrière-plan supprimé."
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{project}\"",
|
||||
"header": "Delete this project",
|
||||
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||
"success": "The project was successfully deleted.",
|
||||
"title": "Supprimer « {list} »",
|
||||
"header": "Supprimer cette liste",
|
||||
"text1": "Supprimer cette liste et tout son contenu ?",
|
||||
"text2": "Ceci inclut toutes les tâches et ne peut pas être annulé !",
|
||||
"success": "Liste supprimée.",
|
||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||
"noTasksToDelete": "This list does not contain any tasks, it should be safe to delete."
|
||||
},
|
||||
"duplicate": {
|
||||
"title": "Duplicate this project",
|
||||
"label": "Duplicate",
|
||||
"text": "Select a namespace which should hold the duplicated project:",
|
||||
"success": "The project was successfully duplicated."
|
||||
"title": "Dupliquer cette liste",
|
||||
"label": "Dupliquer",
|
||||
"text": "Sélectionne un espace de noms qui doit contenir la liste dupliquée :",
|
||||
"success": "Liste dupliquée."
|
||||
},
|
||||
"edit": {
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifier": "Project Identifier",
|
||||
"identifierPlaceholder": "The project identifier goes here…",
|
||||
"header": "Modifier cette liste",
|
||||
"title": "Modifier « {list} »",
|
||||
"titlePlaceholder": "Entre le nom de la liste…",
|
||||
"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.",
|
||||
"identifier": "Identifiant de la liste",
|
||||
"identifierPlaceholder": "L’identifiant de la liste va ici…",
|
||||
"description": "Description",
|
||||
"descriptionPlaceholder": "The projects description goes here…",
|
||||
"color": "Color",
|
||||
"success": "The project was successfully updated."
|
||||
"descriptionPlaceholder": "Entre la description de la liste…",
|
||||
"color": "Couleur",
|
||||
"success": "Liste mise à jour."
|
||||
},
|
||||
"share": {
|
||||
"header": "Share this project",
|
||||
"title": "Share \"{project}\"",
|
||||
"share": "Share",
|
||||
"header": "Partager cette liste",
|
||||
"title": "Partager « {list} »",
|
||||
"share": "Partager",
|
||||
"links": {
|
||||
"title": "Share Links",
|
||||
"what": "What is a share link?",
|
||||
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||
"create": "Create a new link share",
|
||||
"name": "Name (optional)",
|
||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||
"password": "Password (optional)",
|
||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||
"noName": "No name set",
|
||||
"remove": "Remove a link share",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"createSuccess": "The link share was successfully created.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"title": "Liens de partage",
|
||||
"what": "Qu’est-ce qu’un lien de partage ?",
|
||||
"explanation": "Permet de partager une liste avec les personnes qui n’ont pas de compte sur Vikunja.",
|
||||
"create": "Créer un nouveau lien de partage",
|
||||
"name": "Nom (facultatif)",
|
||||
"namePlaceholder": "p. ex. Lorem Ipsum",
|
||||
"nameExplanation": "Toutes les actions effectuées par ce partage de lien apparaîtront avec le nom.",
|
||||
"password": "Mot de passe (facultatif)",
|
||||
"passwordExplanation": "L’utilisateur·rice doit saisir ce mot de passe pour se connecter.",
|
||||
"noName": "Aucun nom défini",
|
||||
"remove": "Retirer un lien de partage",
|
||||
"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 !",
|
||||
"createSuccess": "Partage créé.",
|
||||
"deleteSuccess": "Lien supprimé",
|
||||
"view": "View",
|
||||
"sharedBy": "Shared by {0}"
|
||||
},
|
||||
"userTeam": {
|
||||
"typeUser": "user | users",
|
||||
"typeTeam": "team | teams",
|
||||
"shared": "Shared with these {type}",
|
||||
"you": "You",
|
||||
"notShared": "Not shared with any {type} yet.",
|
||||
"removeHeader": "Remove a {type} from the {sharable}",
|
||||
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||
"addedSuccess": "The {type} was successfully added.",
|
||||
"updatedSuccess": "The {type} was successfully added."
|
||||
"typeUser": "utilisateur·rice | utilisateur·rice·s",
|
||||
"typeTeam": "équipe | équipes",
|
||||
"shared": "Partagé avec ces {type}",
|
||||
"you": "Toi",
|
||||
"notShared": "Pas encore partagé avec des {type}.",
|
||||
"removeHeader": "Retirer un {type} de la liste {sharable}",
|
||||
"removeText": "Retirer ce {sharable} du {type} ? Ceci ne peut pas être annulé !",
|
||||
"removeSuccess": "{sharable} retiré de {type}.",
|
||||
"addedSuccess": "{type} ajouté.",
|
||||
"updatedSuccess": "{type} ajouté."
|
||||
},
|
||||
"right": {
|
||||
"title": "Permission",
|
||||
"read": "Read only",
|
||||
"readWrite": "Read & write",
|
||||
"read": "Lecture seule",
|
||||
"readWrite": "Lecture et écriture",
|
||||
"admin": "Admin"
|
||||
},
|
||||
"attributes": {
|
||||
"link": "Link",
|
||||
"delete": "Delete"
|
||||
"link": "Lien",
|
||||
"delete": "Supprimer"
|
||||
}
|
||||
},
|
||||
"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": {
|
||||
"title": "Gantt",
|
||||
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||
"size": "Size",
|
||||
"default": "Default",
|
||||
"month": "Month",
|
||||
"day": "Day",
|
||||
"showTasksWithoutDates": "Afficher les tâches pour lesquelles aucune date n’a été fixée",
|
||||
"size": "Taille",
|
||||
"default": "Par défaut",
|
||||
"month": "Mois",
|
||||
"day": "Jour",
|
||||
"hour": "Hour",
|
||||
"range": "Date Range",
|
||||
"noDates": "This task has no dates set."
|
||||
"noDates": "Aucune date n’a été fixée pour cette tâche."
|
||||
},
|
||||
"table": {
|
||||
"title": "Table",
|
||||
"columns": "Columns"
|
||||
"title": "Tableau",
|
||||
"columns": "Colonnes"
|
||||
},
|
||||
"kanban": {
|
||||
"title": "Kanban",
|
||||
"limit": "Limit: {limit}",
|
||||
"noLimit": "Not Set",
|
||||
"doneBucket": "Done bucket",
|
||||
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
|
||||
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||
"deleteLast": "You cannot remove the last bucket.",
|
||||
"addTaskPlaceholder": "Enter the new task title…",
|
||||
"addTask": "Add a task",
|
||||
"addAnotherTask": "Add another task",
|
||||
"addBucket": "Create a new bucket",
|
||||
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||
"deleteHeaderBucket": "Delete the bucket",
|
||||
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"limit": "Limite : {limit}",
|
||||
"noLimit": "Non défini",
|
||||
"doneBucket": "Seau des terminés",
|
||||
"doneBucketHint": "Toutes les tâches déplacées dans ce seau seront automatiquement marquées comme faites.",
|
||||
"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.",
|
||||
"doneBucketSavedSuccess": "Seau des terminés enregistré.",
|
||||
"deleteLast": "Tu ne peux pas supprimer le dernier seau.",
|
||||
"addTaskPlaceholder": "Entre le nom de la tâche…",
|
||||
"addTask": "Ajouter une tâche",
|
||||
"addAnotherTask": "Ajouter une autre tâche",
|
||||
"addBucket": "Créer un nouveau seau",
|
||||
"addBucketPlaceholder": "Entre le nouveau nom du seau…",
|
||||
"deleteHeaderBucket": "Supprimer le seau",
|
||||
"deleteBucketText1": "Supprimer ce seau ?",
|
||||
"deleteBucketText2": "Ceci ne supprimera pas les tâches mais les déplacera dans le seau par défaut.",
|
||||
"deleteBucketSuccess": "Seau supprimé.",
|
||||
"bucketTitleSavedSuccess": "Nom du seau enregistré.",
|
||||
"bucketLimitSavedSuccess": "Limite du seau enregistrée.",
|
||||
"collapse": "Réduire ce seau"
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
"title": "Favorites"
|
||||
"title": "Favoris"
|
||||
}
|
||||
}
|
||||
},
|
||||
"namespace": {
|
||||
"title": "Namespaces & Projects",
|
||||
"title": "Espaces de noms et listes",
|
||||
"namespace": "Espace de noms",
|
||||
"showArchived": "Montrer les archivés",
|
||||
"noneAvailable": "Tu n’as pas d’espace de noms pour le moment.",
|
||||
"unarchive": "Désarchiver",
|
||||
"archived": "Archivé",
|
||||
"noProjects": "This namespace does not contain any projects.",
|
||||
"createProject": "Create a new project in this namespace.",
|
||||
"noLists": "Cet espace de noms ne contient pas de listes.",
|
||||
"createList": "Créer une nouvelle liste dans cet espace de noms.",
|
||||
"namespaces": "Espaces de noms",
|
||||
"search": "Écris pour rechercher un espace de noms…",
|
||||
"create": {
|
||||
"title": "Nouvel espace de noms",
|
||||
"titleRequired": "Indique un nom.",
|
||||
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
|
||||
"explanation": "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.",
|
||||
"tooltip": "Qu’est-ce qu’un espace de noms ?",
|
||||
"success": "Espace de noms créé."
|
||||
},
|
||||
"archive": {
|
||||
"titleArchive": "Archiver « {namespace} »",
|
||||
"titleUnarchive": "Désarchiver « {namespace} »",
|
||||
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
|
||||
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||
"archiveText": "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.",
|
||||
"unarchiveText": "Tu pourras créer de nouvelles listes ou les modifier.",
|
||||
"success": "Espace de noms archivé.",
|
||||
"unarchiveSuccess": "Espace de noms archivé.",
|
||||
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||
"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."
|
||||
},
|
||||
"delete": {
|
||||
"title": "Supprimer « {namespace} »",
|
||||
"text1": "Supprimer cet espace de noms et tout son contenu ?",
|
||||
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||
"text2": "Ceci inclut toutes les listes et les tâches et ne peut être annulé !",
|
||||
"success": "Espace de noms supprimé."
|
||||
},
|
||||
"edit": {
|
||||
|
@ -371,8 +371,8 @@
|
|||
"isArchived": "Cet espace de noms est archivé"
|
||||
},
|
||||
"pseudo": {
|
||||
"sharedProjects": {
|
||||
"title": "Shared Projects"
|
||||
"sharedLists": {
|
||||
"title": "Listes partagées"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "Favoris"
|
||||
|
@ -403,7 +403,7 @@
|
|||
},
|
||||
"create": {
|
||||
"title": "Nouveau filtre enregistré",
|
||||
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
||||
"description": "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.",
|
||||
"action": "Créer un nouveau filtre enregistré",
|
||||
"titleRequired": "Please provide a title for the filter."
|
||||
},
|
||||
|
@ -435,7 +435,7 @@
|
|||
"label": {
|
||||
"title": "Étiquettes",
|
||||
"manage": "Gérer les étiquettes",
|
||||
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
|
||||
"description": "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.",
|
||||
"newCTA": "Tu n’as actuellement aucune étiquette.",
|
||||
"search": "Écris pour rechercher une étiquette…",
|
||||
"create": {
|
||||
|
@ -460,7 +460,7 @@
|
|||
},
|
||||
"sharing": {
|
||||
"authenticating": "Authentification…",
|
||||
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||
"passwordRequired": "Cette liste partagée nécessite un mot de passe. Entre-le ci-dessous :",
|
||||
"error": "Une erreur s’est produite.",
|
||||
"invalidPassword": "Le mot de passe est invalide."
|
||||
},
|
||||
|
@ -529,7 +529,7 @@
|
|||
"code": "Code",
|
||||
"quote": "Citation",
|
||||
"unorderedList": "Liste non ordonnée",
|
||||
"orderedList ": "Ordered List",
|
||||
"orderedList": "Liste ordonnée",
|
||||
"cleanBlock": "Bloc propre",
|
||||
"link": "Lien",
|
||||
"image": "Image",
|
||||
|
@ -602,7 +602,6 @@
|
|||
"addReminder": "Ajouter un nouveau rappel…",
|
||||
"doneSuccess": "Tâche marquée comme terminée.",
|
||||
"undoneSuccess": "Tâche marquée comme non terminée.",
|
||||
"undo": "Undo",
|
||||
"openDetail": "Ouvrir la vue détaillée de la tâche",
|
||||
"checklistTotal": "{checked} sur {total} tâches",
|
||||
"checklistAllDone": "{total} tâches",
|
||||
|
@ -619,7 +618,7 @@
|
|||
"chooseDueDate": "Clique ici pour définir une date d’échéance",
|
||||
"chooseStartDate": "Clique ici pour fixer une date de début",
|
||||
"chooseEndDate": "Clique ici pour fixer une date de fin",
|
||||
"move": "Move task to a different project",
|
||||
"move": "Déplacer une tâche vers une autre liste",
|
||||
"done": "Marquer la tâche comme terminée !",
|
||||
"undone": "Marquer comme inachevé",
|
||||
"created": "Créé {0} par {1}",
|
||||
|
@ -627,7 +626,7 @@
|
|||
"doneAt": "Terminé {0}",
|
||||
"updateSuccess": "Tâche enregistrée.",
|
||||
"deleteSuccess": "Tâche supprimée.",
|
||||
"belongsToProject": "This task belongs to project '{project}'",
|
||||
"belongsToList": "Cette tâche appartient à la liste « {list} »",
|
||||
"due": "Échéance {at}",
|
||||
"closePopup": "Fermer la fenêtre",
|
||||
"delete": {
|
||||
|
@ -647,7 +646,7 @@
|
|||
"percentDone": "Définir la progression",
|
||||
"attachments": "Ajouter des pièces jointes",
|
||||
"relatedTasks": "Ajouter une relation",
|
||||
"moveProject": "Move",
|
||||
"moveList": "Déplacer",
|
||||
"color": "Définir la couleur",
|
||||
"delete": "Supprimer",
|
||||
"favorite": "Ajouter aux favoris",
|
||||
|
@ -674,21 +673,21 @@
|
|||
"updated": "Mis à jour"
|
||||
},
|
||||
"subscription": {
|
||||
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||
"subscribedListThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this list through its namespace.",
|
||||
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
|
||||
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||
"subscribedTaskThroughParentList": "You can't unsubscribe here because you are subscribed to this task through its list.",
|
||||
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
|
||||
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
|
||||
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||
"subscribedList": "You are currently subscribed to this list and will receive notifications for changes.",
|
||||
"notSubscribedList": "You are not subscribed to this list and won't receive notifications for changes.",
|
||||
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
|
||||
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
|
||||
"subscribe": "S’abonner",
|
||||
"unsubscribe": "Se désabonner",
|
||||
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
||||
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
||||
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||
"subscribeSuccessList": "You are now subscribed to this list",
|
||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||
},
|
||||
|
@ -762,7 +761,7 @@
|
|||
"new": "Nouvelle relation de tâche",
|
||||
"searchPlaceholder": "Écris la recherche d’une nouvelle tâche à ajouter comme connexe…",
|
||||
"createPlaceholder": "Ajouter cette tâche comme nouvelle tâche connexe",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentList": "Cette tâche appartient à une autre liste.",
|
||||
"differentNamespace": "Cette tâche fait partie d'un espace de noms différent.",
|
||||
"noneYet": "Pas encore de relations de tâches.",
|
||||
"delete": "Supprimer la relation de tâche",
|
||||
|
@ -812,10 +811,10 @@
|
|||
"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.",
|
||||
"assignees": "Pour assigner directement la tâche à un utilisateur, ajoutez son nom d'utilisateur préfixé avec {prefix} à la tâche.",
|
||||
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||
"list1": "Pour définir une liste dans laquelle la tâche doit apparaître, entrez son nom précédé de {prefix}.",
|
||||
"list2": "Ceci renverra une erreur si la liste n’existe pas.",
|
||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
||||
"list4": "For example: {prefix}\"List with spaces\".",
|
||||
"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 :",
|
||||
"dateWeekday": "n’importe quel jour de la semaine, utilisera la date suivante avec cette date",
|
||||
|
@ -848,19 +847,19 @@
|
|||
"delete": {
|
||||
"header": "Supprimer l’équipe",
|
||||
"text1": "Supprimer cette équipe et tous ses membres ?",
|
||||
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"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É !",
|
||||
"success": "Équipe supprimée."
|
||||
},
|
||||
"deleteUser": {
|
||||
"header": "Retirer un·e utilisateur·rice de l’équipe",
|
||||
"text1": "Retirer cette personne de l’équipe ?",
|
||||
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"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É !",
|
||||
"success": "Utilisateur·rice retiré·e de l’équipe."
|
||||
},
|
||||
"leave": {
|
||||
"title": "Leave team",
|
||||
"text1": "Are you sure you want to leave this team?",
|
||||
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
||||
"text2": "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.",
|
||||
"success": "You have successfully left the team."
|
||||
}
|
||||
},
|
||||
|
@ -892,22 +891,22 @@
|
|||
"attachment": "Ajouter une pièce jointe à cette tâche",
|
||||
"related": "Modifier les tâches connexes de cette tâche",
|
||||
"color": "Changer la couleur de cette tâche",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Déplacer cette tâche dans une autre liste",
|
||||
"reminder": "Manage reminders of this task",
|
||||
"description": "Toggle editing of the task description"
|
||||
},
|
||||
"project": {
|
||||
"title": "Project Views",
|
||||
"switchToListView": "Switch to list view",
|
||||
"switchToGanttView": "Switch to gantt view",
|
||||
"switchToKanbanView": "Switch to kanban view",
|
||||
"switchToTableView": "Switch to table view"
|
||||
"list": {
|
||||
"title": "Vues en liste",
|
||||
"switchToListView": "Passer en vue liste",
|
||||
"switchToGanttView": "Passer en vue Gantt",
|
||||
"switchToKanbanView": "Passer en vue kanban",
|
||||
"switchToTableView": "Passer en vue tableau"
|
||||
},
|
||||
"navigation": {
|
||||
"title": "Navigation",
|
||||
"overview": "Navigate to overview",
|
||||
"upcoming": "Navigate to upcoming tasks",
|
||||
"namespaces": "Navigate to namespaces & projects",
|
||||
"namespaces": "Navigate to namespaces & lists",
|
||||
"labels": "Accéder aux étiquettes",
|
||||
"teams": "Accéder aux équipes"
|
||||
}
|
||||
|
@ -924,7 +923,7 @@
|
|||
"unarchive": "Désarchiver",
|
||||
"setBackground": "Définir l’arrière-plan",
|
||||
"share": "Partager",
|
||||
"newProject": "New project"
|
||||
"newList": "Nouvelle liste"
|
||||
},
|
||||
"apiConfig": {
|
||||
"url": "URL Vikunja",
|
||||
|
@ -943,24 +942,24 @@
|
|||
"notification": {
|
||||
"title": "Notifications",
|
||||
"none": "Tu n’as pas de notifications. Passe une bonne journée !",
|
||||
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||
"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."
|
||||
},
|
||||
"quickActions": {
|
||||
"commands": "Commandes",
|
||||
"placeholder": "Écris une commande ou une recherche…",
|
||||
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
|
||||
"hint": "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.",
|
||||
"tasks": "Tâches",
|
||||
"projects": "Projects",
|
||||
"lists": "Listes",
|
||||
"teams": "Équipes",
|
||||
"newProject": "Enter the title of the new project…",
|
||||
"newList": "Entre le nom de la liste…",
|
||||
"newTask": "Entre le nom de la tâche…",
|
||||
"newNamespace": "Entre le nom de l’espace de noms…",
|
||||
"newTeam": "Entre le nom de la nouvelle équipe…",
|
||||
"createTask": "Create a task in the current project ({title})",
|
||||
"createProject": "Create a project in the current namespace ({title})",
|
||||
"createTask": "Créer une tâche dans la liste actuelle ({title})",
|
||||
"createList": "Créer une liste dans l’espace de noms actuel ({title})",
|
||||
"cmds": {
|
||||
"newTask": "Nouvelle tâche",
|
||||
"newProject": "New project",
|
||||
"newList": "Nouvelle liste",
|
||||
"newNamespace": "Nouvel espace de noms",
|
||||
"newTeam": "Nouvelle équipe"
|
||||
}
|
||||
|
@ -992,15 +991,15 @@
|
|||
"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.",
|
||||
"2002": "Certaines des données de la requête étaient invalides.",
|
||||
"3001": "The project does not exist.",
|
||||
"3004": "You need to have read permissions on that project to perform that action.",
|
||||
"3005": "The project title cannot be empty.",
|
||||
"3006": "The project share does not exist.",
|
||||
"3007": "A project with this identifier already exists.",
|
||||
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
|
||||
"4001": "The project task text cannot be empty.",
|
||||
"4002": "The project task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same project.",
|
||||
"3001": "La liste n’existe pas.",
|
||||
"3004": "Tu dois avoir des droits de lecture sur cette liste pour effectuer cette action.",
|
||||
"3005": "Tu dois entrer un nom de liste.",
|
||||
"3006": "Le partage de liste n’existe pas.",
|
||||
"3007": "Une liste avec cet identifiant existe déjà.",
|
||||
"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.",
|
||||
"4001": "Le texte de la tâche de liste ne peut pas être vide.",
|
||||
"4002": "La tâche de liste n’existe pas.",
|
||||
"4003": "Toutes les tâches de modification en bloc doivent appartenir à la même liste.",
|
||||
"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.",
|
||||
"4006": "Tu ne peux pas définir une tâche parente comme tâche elle-même.",
|
||||
|
@ -1026,21 +1025,21 @@
|
|||
"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.",
|
||||
"6002": "L’équipe n’existe pas.",
|
||||
"6004": "The team already has access to that namespace or project.",
|
||||
"6004": "L’équipe a déjà accès à cet espace de noms ou à cette liste.",
|
||||
"6005": "L’utilisateur·rice est déjà membre de cette équipe.",
|
||||
"6006": "Impossible de supprimer le dernier membre de l’équipe.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "The user already has access to that project.",
|
||||
"7003": "You do not have access to that project.",
|
||||
"6007": "L’équipe n’a pas accès à la liste pour effectuer cette action.",
|
||||
"7002": "L’utilisateur·rice a déjà accès à cette liste.",
|
||||
"7003": "Tu n’as pas accès à cette liste.",
|
||||
"8001": "Cette étiquette existe déjà sur cette tâche.",
|
||||
"8002": "L’étiquette n’existe pas.",
|
||||
"8003": "Tu n’as pas accès à cette étiquette.",
|
||||
"9001": "Le droit est invalide.",
|
||||
"10001": "Le seau n’existe pas.",
|
||||
"10002": "The bucket does not belong to that project.",
|
||||
"10003": "You cannot remove the last bucket on a project.",
|
||||
"10002": "Le seau ne fait pas partie de cette liste.",
|
||||
"10003": "Tu ne peux pas supprimer le dernier seau d’une liste.",
|
||||
"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": "There can be only one done bucket per project.",
|
||||
"10005": "Il peut y avoir seulement un seau des terminés par liste.",
|
||||
"11001": "Le filtre enregistré n’existe pas.",
|
||||
"11002": "Les filtres enregistrés ne sont pas disponibles pour les partages de liens.",
|
||||
"12001": "Le type d’entité d’abonnement est invalide.",
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
"welcomeDay": "Ciao {username}!",
|
||||
"welcomeEvening": "Buonasera {username}!",
|
||||
"lastViewed": "Ultima visualizzazione",
|
||||
"project": {
|
||||
"newText": "You can create a new project for your new tasks:",
|
||||
"new": "New project",
|
||||
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
"list": {
|
||||
"newText": "È possibile creare una nuova lista per le nuove attività:",
|
||||
"new": "Nuova lista",
|
||||
"importText": "O importare le liste e le attività da altri servizi in Vikunja:",
|
||||
"import": "Importa i tuoi dati in Vikunja"
|
||||
}
|
||||
},
|
||||
"404": {
|
||||
|
@ -85,7 +85,7 @@
|
|||
"weekStartSunday": "Domenica",
|
||||
"weekStartMonday": "Lunedì",
|
||||
"language": "Lingua",
|
||||
"defaultProject": "Default Project",
|
||||
"defaultList": "Lista predefinita",
|
||||
"timezone": "Fuso Orario",
|
||||
"overdueTasksRemindersTime": "Orario email attività in scadute"
|
||||
},
|
||||
|
@ -143,7 +143,7 @@
|
|||
},
|
||||
"deletion": {
|
||||
"title": "Elimina il tuo Account Vikunja",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
|
||||
"text1": "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.",
|
||||
"text2": "Per continuare, inserisci la tua password. Riceverai un'e-mail con ulteriori istruzioni.",
|
||||
"confirm": "Elimina il mio profilo",
|
||||
"requestSuccess": "Richiesta riuscita. Riceverai un'e-mail con ulteriori istruzioni.",
|
||||
|
@ -157,201 +157,201 @@
|
|||
},
|
||||
"export": {
|
||||
"title": "Esporta i tuoi dati Vikunja",
|
||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
||||
"description": "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.",
|
||||
"descriptionPasswordRequired": "Inserisci la tua password per procedere:",
|
||||
"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.",
|
||||
"downloadTitle": "Scarica i tuoi dati Vikunja esportati"
|
||||
}
|
||||
},
|
||||
"project": {
|
||||
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Project Title",
|
||||
"color": "Color",
|
||||
"projects": "Projects",
|
||||
"search": "Type to search for a project…",
|
||||
"searchSelect": "Click or press enter to select this project",
|
||||
"shared": "Shared Projects",
|
||||
"noDescriptionAvailable": "No project description is available.",
|
||||
"list": {
|
||||
"archived": "Questa lista è archiviata. Non è possibile creare nuove attività o modificarle.",
|
||||
"title": "Titolo della Lista",
|
||||
"color": "Colore",
|
||||
"lists": "Liste",
|
||||
"list": {
|
||||
"title": "Lista",
|
||||
"add": "Aggiungi",
|
||||
"addPlaceholder": "Aggiungi una nuova attività…",
|
||||
"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": {
|
||||
"header": "New project",
|
||||
"titlePlaceholder": "The project's title goes here…",
|
||||
"addTitleRequired": "Please specify a title.",
|
||||
"createdSuccess": "The project was successfully created.",
|
||||
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||
"header": "Nuova lista",
|
||||
"titlePlaceholder": "Il titolo della lista va qui…",
|
||||
"addTitleRequired": "Specifica un titolo.",
|
||||
"createdSuccess": "La lista è stata creata correttamente.",
|
||||
"addListRequired": "Specifica una lista o imposta una lista predefinita nelle impostazioni."
|
||||
},
|
||||
"archive": {
|
||||
"title": "Archive \"{project}\"",
|
||||
"archive": "Archive this project",
|
||||
"unarchive": "Un-Archive this project",
|
||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||
"success": "The project was successfully archived."
|
||||
"title": "Archivia \"{list}\"",
|
||||
"archive": "Archivia questa lista",
|
||||
"unarchive": "Estrai questa lista dall'archivio",
|
||||
"unarchiveText": "Potrai creare nuove attività o modificarle.",
|
||||
"archiveText": "Non sarà possibile modificare questa lista o creare nuove attività fino a quando non verrà estratta dall'archivio.",
|
||||
"success": "Lista archiviata con successo."
|
||||
},
|
||||
"background": {
|
||||
"title": "Set project background",
|
||||
"remove": "Remove Background",
|
||||
"upload": "Choose a background from your pc",
|
||||
"searchPlaceholder": "Search for a background…",
|
||||
"poweredByUnsplash": "Powered by Unsplash",
|
||||
"loadMore": "Load more photos",
|
||||
"success": "The background has been set successfully!",
|
||||
"removeSuccess": "The background has been removed successfully!"
|
||||
"title": "Imposta sfondo lista",
|
||||
"remove": "Rimuovi Sfondo",
|
||||
"upload": "Scegli uno sfondo dal tuo pc",
|
||||
"searchPlaceholder": "Cerca uno sfondo…",
|
||||
"poweredByUnsplash": "Realizzato con Unsplash",
|
||||
"loadMore": "Carica altre foto",
|
||||
"success": "Lo sfondo è stato impostato con successo!",
|
||||
"removeSuccess": "Lo sfondo è stato rimosso con successo!"
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{project}\"",
|
||||
"header": "Delete this project",
|
||||
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||
"success": "The project was successfully deleted.",
|
||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||
"title": "Elimina \"{list}\"",
|
||||
"header": "Elimina questa lista",
|
||||
"text1": "Sei sicuro di voler eliminare questa lista e tutti i suoi contenuti?",
|
||||
"text2": "Questo include tutte le attività e NON PUÒ ESSERE RIPRISTINATO!",
|
||||
"success": "La lista è stata eliminata con successo.",
|
||||
"tasksToDelete": "Questo eliminerà definitivamente circa {count} attività.",
|
||||
"noTasksToDelete": "Questo elenco non contiene alcuna attività, puoi eliminarlo in sicurezza."
|
||||
},
|
||||
"duplicate": {
|
||||
"title": "Duplicate this project",
|
||||
"label": "Duplicate",
|
||||
"text": "Select a namespace which should hold the duplicated project:",
|
||||
"success": "The project was successfully duplicated."
|
||||
"title": "Duplica questa lista",
|
||||
"label": "Duplica",
|
||||
"text": "Seleziona un namespace che dovrebbe contenere l'elenco duplicato:",
|
||||
"success": "Lista duplicata."
|
||||
},
|
||||
"edit": {
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifier": "Project Identifier",
|
||||
"identifierPlaceholder": "The project identifier goes here…",
|
||||
"description": "Description",
|
||||
"descriptionPlaceholder": "The projects description goes here…",
|
||||
"color": "Color",
|
||||
"success": "The project was successfully updated."
|
||||
"header": "Modifica Questa Lista",
|
||||
"title": "Modifica \"{list}\"",
|
||||
"titlePlaceholder": "Il titolo della lista va qui…",
|
||||
"identifierTooltip": "L'identificatore della lista può essere usato per identificare univocamente un'attività tra le varie liste. Puoi lasciarlo vuoto per disabilitarlo.",
|
||||
"identifier": "Identificatore Della Lista",
|
||||
"identifierPlaceholder": "L'identificatore della lista va qui…",
|
||||
"description": "Descrizione",
|
||||
"descriptionPlaceholder": "La descrizione della lista va qui…",
|
||||
"color": "Colore",
|
||||
"success": "Lista aggiornata."
|
||||
},
|
||||
"share": {
|
||||
"header": "Share this project",
|
||||
"title": "Share \"{project}\"",
|
||||
"share": "Share",
|
||||
"header": "Condividi questa lista",
|
||||
"title": "Condividi \"{list}\"",
|
||||
"share": "Condividi",
|
||||
"links": {
|
||||
"title": "Share Links",
|
||||
"what": "What is a share link?",
|
||||
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||
"create": "Create a new link share",
|
||||
"name": "Name (optional)",
|
||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||
"password": "Password (optional)",
|
||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||
"noName": "No name set",
|
||||
"remove": "Remove a link share",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"createSuccess": "The link share was successfully created.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"view": "View",
|
||||
"sharedBy": "Shared by {0}"
|
||||
"title": "Link di condivisione",
|
||||
"what": "Cos'è un link di condivisione?",
|
||||
"explanation": "I link di condivisione consentono di condividere facilmente una lista con altri utenti che non hanno un account su Vikunja.",
|
||||
"create": "Crea nuovo link di condivisione",
|
||||
"name": "Nome (facoltativo)",
|
||||
"namePlaceholder": "es. Lorem Ipsum",
|
||||
"nameExplanation": "Tutte le azioni svolte tramite questo link di condivisione verranno visualizzate con questo nome.",
|
||||
"password": "Password (facoltativo)",
|
||||
"passwordExplanation": "Durante l'autenticazione, l'utente dovrà inserire questa password.",
|
||||
"noName": "Nessun nome impostato",
|
||||
"remove": "Rimuovi un link di condivisione",
|
||||
"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!",
|
||||
"createSuccess": "Link di condivisione creato.",
|
||||
"deleteSuccess": "Link di condivisione elimitato",
|
||||
"view": "Mostra",
|
||||
"sharedBy": "Condiviso da {0}"
|
||||
},
|
||||
"userTeam": {
|
||||
"typeUser": "user | users",
|
||||
"typeTeam": "team | teams",
|
||||
"shared": "Shared with these {type}",
|
||||
"you": "You",
|
||||
"notShared": "Not shared with any {type} yet.",
|
||||
"removeHeader": "Remove a {type} from the {sharable}",
|
||||
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||
"addedSuccess": "The {type} was successfully added.",
|
||||
"updatedSuccess": "The {type} was successfully added."
|
||||
"typeUser": "utente | utenti",
|
||||
"typeTeam": "gruppo | gruppi",
|
||||
"shared": "Condiviso con questi {type}",
|
||||
"you": "Tu",
|
||||
"notShared": "Non ancora condiviso con nessun {type}.",
|
||||
"removeHeader": "Rimuovi un {type} dal {sharable}",
|
||||
"removeText": "Sei sicuro di voler rimuovere questo {sharable} dal {type}? Non può essere ripristinato!",
|
||||
"removeSuccess": "{sharable} rimosso dal {type}.",
|
||||
"addedSuccess": "{type} aggiunto.",
|
||||
"updatedSuccess": "{type} aggiunto."
|
||||
},
|
||||
"right": {
|
||||
"title": "Permission",
|
||||
"read": "Read only",
|
||||
"readWrite": "Read & write",
|
||||
"admin": "Admin"
|
||||
"title": "Permessi",
|
||||
"read": "Sola lettura",
|
||||
"readWrite": "Lettura e scrittura",
|
||||
"admin": "Amministratore"
|
||||
},
|
||||
"attributes": {
|
||||
"link": "Link",
|
||||
"delete": "Delete"
|
||||
"delete": "Elimina"
|
||||
}
|
||||
},
|
||||
"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": {
|
||||
"title": "Gantt",
|
||||
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||
"size": "Size",
|
||||
"default": "Default",
|
||||
"month": "Month",
|
||||
"day": "Day",
|
||||
"hour": "Hour",
|
||||
"range": "Date Range",
|
||||
"noDates": "This task has no dates set."
|
||||
"showTasksWithoutDates": "Mostra attività che non hanno date impostate",
|
||||
"size": "Dimensione",
|
||||
"default": "Predefinito",
|
||||
"month": "Mese",
|
||||
"day": "Giorno",
|
||||
"hour": "Ora",
|
||||
"range": "Intervallo date",
|
||||
"noDates": "Questa attività non ha date impostate."
|
||||
},
|
||||
"table": {
|
||||
"title": "Table",
|
||||
"columns": "Columns"
|
||||
"title": "Tabella",
|
||||
"columns": "Colonne"
|
||||
},
|
||||
"kanban": {
|
||||
"title": "Kanban",
|
||||
"limit": "Limit: {limit}",
|
||||
"noLimit": "Not Set",
|
||||
"doneBucket": "Done bucket",
|
||||
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
|
||||
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||
"deleteLast": "You cannot remove the last bucket.",
|
||||
"addTaskPlaceholder": "Enter the new task title…",
|
||||
"addTask": "Add a task",
|
||||
"addAnotherTask": "Add another task",
|
||||
"addBucket": "Create a new bucket",
|
||||
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||
"deleteHeaderBucket": "Delete the bucket",
|
||||
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"limit": "Limite: {limit}",
|
||||
"noLimit": "Non Impostato",
|
||||
"doneBucket": "Colonna attività completate",
|
||||
"doneBucketHint": "Tutte le attività spostate in questa colonna verranno automaticamente contrassegnate come completate.",
|
||||
"doneBucketHintExtended": "Tutte le attività spostate nella colonna attività completate saranno contrassegnate automaticamente come completate. Tutte le attività contrassegnate come completate altrove verranno anche spostate.",
|
||||
"doneBucketSavedSuccess": "Colonna attività completate salvata.",
|
||||
"deleteLast": "Impossibile eliminare l'ultima colonna.",
|
||||
"addTaskPlaceholder": "Inserisci il nuovo titolo dell'attività…",
|
||||
"addTask": "Aggiungi un'attività",
|
||||
"addAnotherTask": "Aggiungi un'altra attività",
|
||||
"addBucket": "Crea una nuova colonna",
|
||||
"addBucketPlaceholder": "Inserisci il titolo della nuova colonna…",
|
||||
"deleteHeaderBucket": "Elimina la colonna",
|
||||
"deleteBucketText1": "Confermi di voler eliminare questa colonna?",
|
||||
"deleteBucketText2": "Questo non eliminerà nessuna attività, ma la sposterà nel bucket predefinito.",
|
||||
"deleteBucketSuccess": "Colonna eliminata.",
|
||||
"bucketTitleSavedSuccess": "Titolo della colonna salvato.",
|
||||
"bucketLimitSavedSuccess": "Limite della colonna salvato.",
|
||||
"collapse": "Comprimi questa colonna"
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
"title": "Favorites"
|
||||
"title": "Preferiti"
|
||||
}
|
||||
}
|
||||
},
|
||||
"namespace": {
|
||||
"title": "Namespaces & Projects",
|
||||
"title": "Namespace e Liste",
|
||||
"namespace": "Namespace",
|
||||
"showArchived": "Mostra Archiviati",
|
||||
"noneAvailable": "Non hai alcun namespace in questo momento.",
|
||||
"unarchive": "De-Archivia",
|
||||
"archived": "Archiviato",
|
||||
"noProjects": "This namespace does not contain any projects.",
|
||||
"createProject": "Create a new project in this namespace.",
|
||||
"noLists": "Questo namespace non contiene alcuna lista.",
|
||||
"createList": "Crea una nuova lista in questo namespace.",
|
||||
"namespaces": "Namespace",
|
||||
"search": "Digita per cercare un namespace…",
|
||||
"create": {
|
||||
"title": "Nuovo namespace",
|
||||
"titleRequired": "Specifica un titolo.",
|
||||
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
|
||||
"explanation": "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.",
|
||||
"tooltip": "Che cos'è un namespace?",
|
||||
"success": "Namespace creato."
|
||||
},
|
||||
"archive": {
|
||||
"titleArchive": "Archivia \"{namespace}\"",
|
||||
"titleUnarchive": "Disarchivia \"{namespace}\"",
|
||||
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
|
||||
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||
"archiveText": "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.",
|
||||
"unarchiveText": "Potrai creare nuove liste o modificarle.",
|
||||
"success": "Namespace creato.",
|
||||
"unarchiveSuccess": "Namespace estratto dall'archivio.",
|
||||
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||
"description": "Se un namespace è archiviato, non è possibile creare nuove liste o modificarlo."
|
||||
},
|
||||
"delete": {
|
||||
"title": "Elimina \"{namespace}\"",
|
||||
"text1": "Sei sicuro di voler rimuovere questo namespace e tutto il relativo contenuto?",
|
||||
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||
"text2": "Questo include tutte le liste e le attività e NON PUÒ ESSERE RIPRISTINATO!",
|
||||
"success": "Namespace eliminato."
|
||||
},
|
||||
"edit": {
|
||||
|
@ -371,8 +371,8 @@
|
|||
"isArchived": "Questo namespace è archiviato"
|
||||
},
|
||||
"pseudo": {
|
||||
"sharedProjects": {
|
||||
"title": "Shared Projects"
|
||||
"sharedLists": {
|
||||
"title": "Liste Condivise"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "Preferiti"
|
||||
|
@ -403,9 +403,9 @@
|
|||
},
|
||||
"create": {
|
||||
"title": "Nuovo Filtro Salvato",
|
||||
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
||||
"description": "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.",
|
||||
"action": "Crea nuovo filtro salvato",
|
||||
"titleRequired": "È necessario un titolo per il filtro."
|
||||
"titleRequired": "Please provide a title for the filter."
|
||||
},
|
||||
"delete": {
|
||||
"header": "Elimina questo filtro salvato",
|
||||
|
@ -435,7 +435,7 @@
|
|||
"label": {
|
||||
"title": "Etichette",
|
||||
"manage": "Gestione etichette",
|
||||
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
|
||||
"description": "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.",
|
||||
"newCTA": "Non hai nessuna etichetta.",
|
||||
"search": "Digita per cercare un'etichetta…",
|
||||
"create": {
|
||||
|
@ -460,7 +460,7 @@
|
|||
},
|
||||
"sharing": {
|
||||
"authenticating": "Autenticazione…",
|
||||
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||
"passwordRequired": "Questo elenco condiviso richiede una password. Inseriscila qui sotto:",
|
||||
"error": "Si è verificato un errore.",
|
||||
"invalidPassword": "La password non è valida."
|
||||
},
|
||||
|
@ -529,7 +529,7 @@
|
|||
"code": "Codice",
|
||||
"quote": "Citazione",
|
||||
"unorderedList": "Elenco puntato",
|
||||
"orderedList ": "Ordered List",
|
||||
"orderedList": "Elenco numerato",
|
||||
"cleanBlock": "Pulisci Blocco",
|
||||
"link": "Link",
|
||||
"image": "Immagine",
|
||||
|
@ -602,7 +602,6 @@
|
|||
"addReminder": "Aggiungi un nuovo promemoria…",
|
||||
"doneSuccess": "Attività segnata come completata.",
|
||||
"undoneSuccess": "Attività segnata come non completata.",
|
||||
"undo": "Undo",
|
||||
"openDetail": "Apri vista dettagli attività",
|
||||
"checklistTotal": "{checked} di {total} attività",
|
||||
"checklistAllDone": "{total} attività",
|
||||
|
@ -619,7 +618,7 @@
|
|||
"chooseDueDate": "Clicca qui per impostare una data di scadenza",
|
||||
"chooseStartDate": "Clicca qui per impostare una data di inizio",
|
||||
"chooseEndDate": "Clicca qui per impostare una data di fine",
|
||||
"move": "Move task to a different project",
|
||||
"move": "Sposta attività in un'altra lista",
|
||||
"done": "Segna attività fatta!",
|
||||
"undone": "Segna come non completato",
|
||||
"created": "Creato {0} da {1}",
|
||||
|
@ -627,7 +626,7 @@
|
|||
"doneAt": "Fatto {0}",
|
||||
"updateSuccess": "Attività salvata con successo.",
|
||||
"deleteSuccess": "L'attività è stata eliminata con successo.",
|
||||
"belongsToProject": "This task belongs to project '{project}'",
|
||||
"belongsToList": "Questa attività appartiene alla lista '{list}'",
|
||||
"due": "Scadenza {at}",
|
||||
"closePopup": "Chiudi popup",
|
||||
"delete": {
|
||||
|
@ -647,7 +646,7 @@
|
|||
"percentDone": "Imposta Progresso",
|
||||
"attachments": "Aggiungi Allegati",
|
||||
"relatedTasks": "Aggiungi Relazione",
|
||||
"moveProject": "Move",
|
||||
"moveList": "Sposta",
|
||||
"color": "Imposta Colore",
|
||||
"delete": "Elimina",
|
||||
"favorite": "Aggiungi ai Preferiti",
|
||||
|
@ -674,21 +673,21 @@
|
|||
"updated": "Aggiornato"
|
||||
},
|
||||
"subscription": {
|
||||
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||
"subscribedListThroughParentNamespace": "Non puoi annullare l'iscrizione perché sei iscritto al namespace di questa lista.",
|
||||
"subscribedTaskThroughParentNamespace": "Non puoi annullare l'iscrizione perché sei iscritto al namespace di questa attività.",
|
||||
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||
"subscribedTaskThroughParentList": "Non puoi annullare l'iscrizione perché sei iscritto alla lista di questa attività.",
|
||||
"subscribedNamespace": "Sei iscritto a questo namespace e verrai notificato delle modifiche.",
|
||||
"notSubscribedNamespace": "Non sei iscritto a questo namespace e non verrai notificato delle modifiche.",
|
||||
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||
"subscribedList": "Sei iscritto a questa lista e verrai notificato delle modifiche.",
|
||||
"notSubscribedList": "Non sei iscritto a questa lista e non 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.",
|
||||
"subscribe": "Iscriviti",
|
||||
"unsubscribe": "Disiscriviti",
|
||||
"subscribeSuccessNamespace": "Sei iscritto a questo namespace",
|
||||
"unsubscribeSuccessNamespace": "Non sei più iscritto a questo namespace",
|
||||
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||
"subscribeSuccessList": "Sei iscritto a questa lista",
|
||||
"unsubscribeSuccessList": "Non sei più iscritto a questa lista",
|
||||
"subscribeSuccessTask": "Sei iscritto a questa attività",
|
||||
"unsubscribeSuccessTask": "Non sei più iscritto a questa attività"
|
||||
},
|
||||
|
@ -762,7 +761,7 @@
|
|||
"new": "Nuova Attività Collegata",
|
||||
"searchPlaceholder": "Digita per cercare un'attività da aggiungere come collegata…",
|
||||
"createPlaceholder": "Aggiungi come attività collegata",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentList": "Questa attività è di una lista diversa.",
|
||||
"differentNamespace": "Questa attività appartiene ad un namespace diverso.",
|
||||
"noneYet": "Nessuna attività collegata.",
|
||||
"delete": "Elimina Collegamento Attività",
|
||||
|
@ -812,10 +811,10 @@
|
|||
"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à.",
|
||||
"assignees": "Per assegnare direttamente l'attività a un utente, aggiungere il suo nome utente preceduto da {prefix} all'attività.",
|
||||
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||
"list1": "Per impostare una lista di appartenenza all'attività, inserisci il suo nome prefisso con {prefix}.",
|
||||
"list2": "Ciò restituirà un errore se la lista non esiste.",
|
||||
"list3": "Per usare gli spazi, basta aggiungere un \" o ' prima e dopo il nome della lista.",
|
||||
"list4": "Per esempio: {prefix}\"Etichetta con spazi\".",
|
||||
"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:",
|
||||
"dateWeekday": "qualsiasi giorno della settimana, userà la data più vicina",
|
||||
|
@ -848,19 +847,19 @@
|
|||
"delete": {
|
||||
"header": "Elimina il gruppo",
|
||||
"text1": "Sei sicuro di voler eliminare questo gruppo e tutti i suoi membri?",
|
||||
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"text2": "Tutti i membri del gruppo perderanno l'accesso alle liste e ai namespace condivisi con questo gruppo. NON PUÒ ESSERE RIPRISTINATO!",
|
||||
"success": "Gruppo eliminato."
|
||||
},
|
||||
"deleteUser": {
|
||||
"header": "Rimuovi un utente dal gruppo",
|
||||
"text1": "Confermi di voler rimuovere questo utente dal gruppo?",
|
||||
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"text2": "Perderanno l'accesso a tutte le liste e i namespace a cui questo gruppo ha accesso. NON PUÒ ESSERE RIPRISTINATO!",
|
||||
"success": "Utente rimosso dal gruppo."
|
||||
},
|
||||
"leave": {
|
||||
"title": "Abbandona il gruppo",
|
||||
"text1": "Sei sicuro di voler abbandonare questo 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.",
|
||||
"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.",
|
||||
"success": "Hai abbandonato il gruppo."
|
||||
}
|
||||
},
|
||||
|
@ -892,22 +891,22 @@
|
|||
"attachment": "Aggiungi un allegato a questa attività",
|
||||
"related": "Modifica le attività collegate a questa",
|
||||
"color": "Cambia il colore di questa attività",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Sposta questa attività in un altro elenco",
|
||||
"reminder": "Gestisci i promemoria di questa attività",
|
||||
"description": "Attiva/Disattiva modifica della descrizione dell'attività"
|
||||
},
|
||||
"project": {
|
||||
"title": "Project Views",
|
||||
"switchToListView": "Switch to list view",
|
||||
"switchToGanttView": "Switch to gantt view",
|
||||
"switchToKanbanView": "Switch to kanban view",
|
||||
"switchToTableView": "Switch to table view"
|
||||
"list": {
|
||||
"title": "Viste Liste",
|
||||
"switchToListView": "Passa alla vista Lista",
|
||||
"switchToGanttView": "Passa alla vista Gantt",
|
||||
"switchToKanbanView": "Passa alla vista Kanban",
|
||||
"switchToTableView": "Passa alla vista Tabella"
|
||||
},
|
||||
"navigation": {
|
||||
"title": "Navigazione",
|
||||
"overview": "Passa a \"Panoramica\"",
|
||||
"upcoming": "Passa a \"Prossimamente\"",
|
||||
"namespaces": "Navigate to namespaces & projects",
|
||||
"namespaces": "Passa a \"Namespace e Liste\"",
|
||||
"labels": "Passa a \"Etichette\"",
|
||||
"teams": "Passa a \"Gruppi\""
|
||||
}
|
||||
|
@ -924,7 +923,7 @@
|
|||
"unarchive": "Disarchivia",
|
||||
"setBackground": "Imposta sfondo",
|
||||
"share": "Condividi",
|
||||
"newProject": "New project"
|
||||
"newList": "Nuova lista"
|
||||
},
|
||||
"apiConfig": {
|
||||
"url": "URL Vikunja",
|
||||
|
@ -943,24 +942,24 @@
|
|||
"notification": {
|
||||
"title": "Notifiche",
|
||||
"none": "Nessuna notifica. Buona giornata!",
|
||||
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||
"explainer": "Le notifiche appariranno qui quando le azioni su Namespace, liste o attività a cui hai sottoscritto la sottoscrizione avvengono."
|
||||
},
|
||||
"quickActions": {
|
||||
"commands": "Comandi",
|
||||
"placeholder": "Digita un comando o cerca…",
|
||||
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
|
||||
"hint": "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.",
|
||||
"tasks": "Attivitá",
|
||||
"projects": "Projects",
|
||||
"lists": "Liste",
|
||||
"teams": "Gruppi",
|
||||
"newProject": "Enter the title of the new project…",
|
||||
"newList": "Inserisci il titolo della nuova lista…",
|
||||
"newTask": "Inserisci il titolo della nuova attività…",
|
||||
"newNamespace": "Inserisci il titolo del nuovo namespace…",
|
||||
"newTeam": "Inserisci il nome del nuovo gruppo…",
|
||||
"createTask": "Create a task in the current project ({title})",
|
||||
"createProject": "Create a project in the current namespace ({title})",
|
||||
"createTask": "Crea un'attività nella lista attuale ({title})",
|
||||
"createList": "Crea una lista nel namespace attuale ({title})",
|
||||
"cmds": {
|
||||
"newTask": "Nuova attività",
|
||||
"newProject": "New project",
|
||||
"newList": "Nuova lista",
|
||||
"newNamespace": "Nuovo Namespace",
|
||||
"newTeam": "Nuovo gruppo"
|
||||
}
|
||||
|
@ -992,15 +991,15 @@
|
|||
"1018": "L'impostazione del tipo di avatar utente non è valida.",
|
||||
"2001": "L'ID non può essere vuoto o 0.",
|
||||
"2002": "Alcuni dati della richiesta non erano validi.",
|
||||
"3001": "The project does not exist.",
|
||||
"3004": "You need to have read permissions on that project to perform that action.",
|
||||
"3005": "The project title cannot be empty.",
|
||||
"3006": "The project share does not exist.",
|
||||
"3007": "A project with this identifier already exists.",
|
||||
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
|
||||
"4001": "The project task text cannot be empty.",
|
||||
"4002": "The project task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same project.",
|
||||
"3001": "La lista non esiste.",
|
||||
"3004": "Devi avere i permessi di lettura su quella lista per eseguire quell'azione.",
|
||||
"3005": "Il titolo della lista non può essere vuoto.",
|
||||
"3006": "La condivisione della lista non esiste.",
|
||||
"3007": "Esiste già una lista con questo identificatore.",
|
||||
"3008": "La lista è archiviata e può quindi essere consultata solo in sola lettura. Questo vale anche per tutte le attività associate a questa lista.",
|
||||
"4001": "Il testo delle attività della lista non può essere vuoto.",
|
||||
"4002": "Lista di attività non esistente.",
|
||||
"4003": "Tutte le attività di modifica in blocco devono appartenere alla stessa lista.",
|
||||
"4004": "Hai bisogno di almeno un'attività quando si modificano in blocco le attività.",
|
||||
"4005": "Non hai il permesso di vedere l'attività.",
|
||||
"4006": "Non è possibile impostare un'attività principale come l'attività stessa.",
|
||||
|
@ -1026,21 +1025,21 @@
|
|||
"5012": "Il namespace è archiviato e può quindi essere accessibile solo in sola lettura.",
|
||||
"6001": "Il nome del gruppo non può essere vuoto.",
|
||||
"6002": "Gruppo non esistente.",
|
||||
"6004": "The team already has access to that namespace or project.",
|
||||
"6004": "Il team ha già accesso a questo namespace o lista.",
|
||||
"6005": "L'utente è già membro di quel gruppo.",
|
||||
"6006": "Non è possibile eliminare l'ultimo membro del gruppo.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "The user already has access to that project.",
|
||||
"7003": "You do not have access to that project.",
|
||||
"6007": "Il gruppo non ha accesso alla lista per eseguire quell'azione.",
|
||||
"7002": "L'utente ha già accesso a quella lista.",
|
||||
"7003": "Non hai accesso a quella lista.",
|
||||
"8001": "Questa etichetta esiste già in quell'attività.",
|
||||
"8002": "L'etichetta non esiste.",
|
||||
"8003": "Non hai accesso a questa etichetta.",
|
||||
"9001": "Permesso non valido.",
|
||||
"10001": "Colonna non esistente.",
|
||||
"10002": "The bucket does not belong to that project.",
|
||||
"10003": "You cannot remove the last bucket on a project.",
|
||||
"10002": "La colonna non appartiene a quella lista.",
|
||||
"10003": "Non puoi rimuovere l'ultima colonna di una lista.",
|
||||
"10004": "Non puoi aggiungere l'attività a questa colonna perché ha già superato il limite di attività che può contenere.",
|
||||
"10005": "There can be only one done bucket per project.",
|
||||
"10005": "Ci può essere solo una colonna completati per lista.",
|
||||
"11001": "Filtro salvato non esistente.",
|
||||
"11002": "I filtri salvati non sono disponibili per i link di condivisione.",
|
||||
"12001": "Il tipo di entità sottoscritto non è valido.",
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
"welcomeDay": "Hi {username}!",
|
||||
"welcomeEvening": "Good Evening {username}!",
|
||||
"lastViewed": "Laatst bekeken",
|
||||
"project": {
|
||||
"newText": "You can create a new project for your new tasks:",
|
||||
"new": "New project",
|
||||
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
"list": {
|
||||
"newText": "Je kan een nieuwe lijst maken voor je nieuwe taken:",
|
||||
"new": "Nieuwe lijst",
|
||||
"importText": "Of importeer je lijsten en taken van andere diensten naar Vikunja:",
|
||||
"import": "Importeer je gegevens in Vikunja"
|
||||
}
|
||||
},
|
||||
"404": {
|
||||
|
@ -85,7 +85,7 @@
|
|||
"weekStartSunday": "Zondag",
|
||||
"weekStartMonday": "Maandag",
|
||||
"language": "Taal",
|
||||
"defaultProject": "Default Project",
|
||||
"defaultList": "Standaard lijst",
|
||||
"timezone": "Time Zone",
|
||||
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
||||
},
|
||||
|
@ -143,7 +143,7 @@
|
|||
},
|
||||
"deletion": {
|
||||
"title": "Verwijder je Vikunja account",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
|
||||
"text1": "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.",
|
||||
"text2": "Graag je wachtwoord invullen om verder te gaan. Je zult een e-mail ontvangen met verdere instructies.",
|
||||
"confirm": "Verwijder mijn account",
|
||||
"requestSuccess": "Het verzoek was succesvol. Je ontvangt een e-mail met verdere instructies.",
|
||||
|
@ -157,154 +157,154 @@
|
|||
},
|
||||
"export": {
|
||||
"title": "Je Vikunja gegevens exporteren",
|
||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
||||
"description": "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.",
|
||||
"descriptionPasswordRequired": "Voer je wachtwoord in om door te gaan:",
|
||||
"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.",
|
||||
"downloadTitle": "Download je geëxporteerde Vikunja gegevens"
|
||||
}
|
||||
},
|
||||
"project": {
|
||||
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Project Title",
|
||||
"color": "Color",
|
||||
"projects": "Projects",
|
||||
"search": "Type to search for a project…",
|
||||
"searchSelect": "Click or press enter to select this project",
|
||||
"shared": "Shared Projects",
|
||||
"noDescriptionAvailable": "No project description is available.",
|
||||
"list": {
|
||||
"archived": "This list is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Lijst titel",
|
||||
"color": "Kleur",
|
||||
"lists": "Lijsten",
|
||||
"list": {
|
||||
"title": "Lijst",
|
||||
"add": "Toevoegen",
|
||||
"addPlaceholder": "Voeg een nieuwe taak toe…",
|
||||
"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": {
|
||||
"header": "New project",
|
||||
"titlePlaceholder": "The project's title goes here…",
|
||||
"addTitleRequired": "Please specify a title.",
|
||||
"createdSuccess": "The project was successfully created.",
|
||||
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||
"header": "Nieuwe lijst",
|
||||
"titlePlaceholder": "De titel van de lijst komt hier…",
|
||||
"addTitleRequired": "Voer alsjeblieft een titel in.",
|
||||
"createdSuccess": "Lijst is succesvol aangemaakt.",
|
||||
"addListRequired": "Please specify a list or set a default list in the settings."
|
||||
},
|
||||
"archive": {
|
||||
"title": "Archive \"{project}\"",
|
||||
"archive": "Archive this project",
|
||||
"unarchive": "Un-Archive this project",
|
||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||
"success": "The project was successfully archived."
|
||||
"title": "Archiveer \"{list}\"",
|
||||
"archive": "Archiveer deze lijst",
|
||||
"unarchive": "Archivering van deze lijst opheffen",
|
||||
"unarchiveText": "Je kan nieuwe taken maken of bewerken.",
|
||||
"archiveText": "You won't be able to edit this list or create new tasks until you un-archive it.",
|
||||
"success": "De lijst is succesvol gearchiveerd."
|
||||
},
|
||||
"background": {
|
||||
"title": "Set project background",
|
||||
"remove": "Remove Background",
|
||||
"upload": "Choose a background from your pc",
|
||||
"searchPlaceholder": "Search for a background…",
|
||||
"poweredByUnsplash": "Powered by Unsplash",
|
||||
"loadMore": "Load more photos",
|
||||
"success": "The background has been set successfully!",
|
||||
"removeSuccess": "The background has been removed successfully!"
|
||||
"title": "Achtergrond van lijst instellen",
|
||||
"remove": "Verwijder achtergrond",
|
||||
"upload": "Kies een achtergrond vanuit je pc",
|
||||
"searchPlaceholder": "Naar een achtergrond zoeken…",
|
||||
"poweredByUnsplash": "Mogelijk gemaakt door Unsplash",
|
||||
"loadMore": "Meer foto's laden",
|
||||
"success": "De achtergrond is succesvol ingesteld!",
|
||||
"removeSuccess": "De achtergrond is succesvol verwijderd!"
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{project}\"",
|
||||
"header": "Delete this project",
|
||||
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||
"success": "The project was successfully deleted.",
|
||||
"title": "Verwijder \"{list}\"",
|
||||
"header": "Verwijder deze lijst",
|
||||
"text1": "Are you sure you want to delete this list and all of its contents?",
|
||||
"text2": "Dit omvat alle taken en KAN NIET ONGEDAAN GEMAAKT WORDEN!",
|
||||
"success": "De lijst is succesvol verwijderd.",
|
||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||
"noTasksToDelete": "This list does not contain any tasks, it should be safe to delete."
|
||||
},
|
||||
"duplicate": {
|
||||
"title": "Duplicate this project",
|
||||
"label": "Duplicate",
|
||||
"text": "Select a namespace which should hold the duplicated project:",
|
||||
"success": "The project was successfully duplicated."
|
||||
"title": "Deze lijst dupliceren",
|
||||
"label": "Dupliceer",
|
||||
"text": "Select a namespace which should hold the duplicated list:",
|
||||
"success": "De lijst is succesvol gedupliceerd."
|
||||
},
|
||||
"edit": {
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifier": "Project Identifier",
|
||||
"identifierPlaceholder": "The project identifier goes here…",
|
||||
"description": "Description",
|
||||
"descriptionPlaceholder": "The projects description goes here…",
|
||||
"color": "Color",
|
||||
"success": "The project was successfully updated."
|
||||
"header": "Bewerk deze lijst",
|
||||
"title": "Bewerk \"{list}\"",
|
||||
"titlePlaceholder": "De titel van de lijst komt hier…",
|
||||
"identifierTooltip": "The list identifier can be used to uniquely identify a task across lists. You can set it to empty to disable it.",
|
||||
"identifier": "List Identifier",
|
||||
"identifierPlaceholder": "The list identifier goes here…",
|
||||
"description": "Beschrijving",
|
||||
"descriptionPlaceholder": "The lists description goes here…",
|
||||
"color": "Kleur",
|
||||
"success": "De lijst is succesvol bijgewerkt."
|
||||
},
|
||||
"share": {
|
||||
"header": "Share this project",
|
||||
"title": "Share \"{project}\"",
|
||||
"share": "Share",
|
||||
"header": "Deel deze lijst",
|
||||
"title": "Deel \"{list}\"",
|
||||
"share": "Delen",
|
||||
"links": {
|
||||
"title": "Share Links",
|
||||
"what": "What is a share link?",
|
||||
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||
"explanation": "Share Links allow you to easily share a list with other users who don't have an account on Vikunja.",
|
||||
"create": "Create a new link share",
|
||||
"name": "Name (optional)",
|
||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||
"name": "Naam (optioneel)",
|
||||
"namePlaceholder": "bv. Lorem Ipsum",
|
||||
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||
"password": "Password (optional)",
|
||||
"password": "Wachtwoord (optioneel)",
|
||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||
"noName": "No name set",
|
||||
"noName": "Geen naam ingesteld",
|
||||
"remove": "Remove a link share",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"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!",
|
||||
"createSuccess": "The link share was successfully created.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"view": "View",
|
||||
"sharedBy": "Shared by {0}"
|
||||
},
|
||||
"userTeam": {
|
||||
"typeUser": "user | users",
|
||||
"typeUser": "gebruiker | gebruikers",
|
||||
"typeTeam": "team | teams",
|
||||
"shared": "Shared with these {type}",
|
||||
"you": "You",
|
||||
"you": "Jij",
|
||||
"notShared": "Not shared with any {type} yet.",
|
||||
"removeHeader": "Remove a {type} from the {sharable}",
|
||||
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||
"addedSuccess": "The {type} was successfully added.",
|
||||
"addedSuccess": "Het {type} is succesvol toegevoegd.",
|
||||
"updatedSuccess": "The {type} was successfully added."
|
||||
},
|
||||
"right": {
|
||||
"title": "Permission",
|
||||
"read": "Read only",
|
||||
"readWrite": "Read & write",
|
||||
"admin": "Admin"
|
||||
"read": "Alleen lezen",
|
||||
"readWrite": "Lezen & schrijven",
|
||||
"admin": "Beheerder"
|
||||
},
|
||||
"attributes": {
|
||||
"link": "Link",
|
||||
"delete": "Delete"
|
||||
"delete": "Verwijderen"
|
||||
}
|
||||
},
|
||||
"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": {
|
||||
"title": "Gantt",
|
||||
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||
"size": "Size",
|
||||
"default": "Default",
|
||||
"month": "Month",
|
||||
"day": "Day",
|
||||
"showTasksWithoutDates": "Toon taken waarvoor geen datums zijn ingesteld",
|
||||
"size": "Grootte",
|
||||
"default": "Standaard",
|
||||
"month": "Maand",
|
||||
"day": "Dag",
|
||||
"hour": "Hour",
|
||||
"range": "Date Range",
|
||||
"noDates": "This task has no dates set."
|
||||
},
|
||||
"table": {
|
||||
"title": "Table",
|
||||
"columns": "Columns"
|
||||
"title": "Tabel",
|
||||
"columns": "Kolommen"
|
||||
},
|
||||
"kanban": {
|
||||
"title": "Kanban",
|
||||
"limit": "Limit: {limit}",
|
||||
"noLimit": "Not Set",
|
||||
"limit": "Limiet: {limit}",
|
||||
"noLimit": "Niet ingesteld",
|
||||
"doneBucket": "Done bucket",
|
||||
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
|
||||
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||
"deleteLast": "You cannot remove the last bucket.",
|
||||
"addTaskPlaceholder": "Enter the new task title…",
|
||||
"addTask": "Add a task",
|
||||
"addAnotherTask": "Add another task",
|
||||
"addTaskPlaceholder": "Voer de nieuwe taak titel in…",
|
||||
"addTask": "Taak toevoegen",
|
||||
"addAnotherTask": "Nog een taak toevoegen",
|
||||
"addBucket": "Create a new bucket",
|
||||
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||
"deleteHeaderBucket": "Delete the bucket",
|
||||
|
@ -317,41 +317,41 @@
|
|||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
"title": "Favorites"
|
||||
"title": "Favorieten"
|
||||
}
|
||||
}
|
||||
},
|
||||
"namespace": {
|
||||
"title": "Namespaces & Projects",
|
||||
"title": "Namespaces & lijsten",
|
||||
"namespace": "Namespace",
|
||||
"showArchived": "Toon gearchiveerd",
|
||||
"noneAvailable": "Je hebt op dit moment geen Namespaces.",
|
||||
"unarchive": "Archivering opheffen",
|
||||
"archived": "Gearchiveerd",
|
||||
"noProjects": "This namespace does not contain any projects.",
|
||||
"createProject": "Create a new project in this namespace.",
|
||||
"noLists": "Deze namespace bevat geen lijsten.",
|
||||
"createList": "Maak een nieuwe lijst in deze namespace.",
|
||||
"namespaces": "Namespaces",
|
||||
"search": "Begin met typen om een Namespace te zoeken…",
|
||||
"create": {
|
||||
"title": "Nieuwe namespace",
|
||||
"titleRequired": "Voer een titel in.",
|
||||
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
|
||||
"explanation": "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.",
|
||||
"tooltip": "Wat is een namespace?",
|
||||
"success": "De Namespace is succesvol gemaakt."
|
||||
},
|
||||
"archive": {
|
||||
"titleArchive": "Archiveer \"{namespace}\"",
|
||||
"titleUnarchive": "Archivering \"{namespace}\" ongedaan maken",
|
||||
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
|
||||
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||
"archiveText": "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.",
|
||||
"unarchiveText": "Je kan nieuwe lijsten maken of deze bewerken.",
|
||||
"success": "The namespace was successfully archived.",
|
||||
"unarchiveSuccess": "The namespace was successfully un-archived.",
|
||||
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||
"description": "If a namespace is archived, you cannot create new lists or edit it."
|
||||
},
|
||||
"delete": {
|
||||
"title": "\"{namespace}\" verwijderen",
|
||||
"text1": "Weet je zeker dat je deze Namespace en alle inhoud ervan wilt verwijderen?",
|
||||
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||
"text2": "Dit omvat alle lijsten en taken en KAN NIET ONGEDAAN GEMAAKT WORDEN!",
|
||||
"success": "De Namespace is succesvol verwijderd."
|
||||
},
|
||||
"edit": {
|
||||
|
@ -371,8 +371,8 @@
|
|||
"isArchived": "This namespace is archived"
|
||||
},
|
||||
"pseudo": {
|
||||
"sharedProjects": {
|
||||
"title": "Shared Projects"
|
||||
"sharedLists": {
|
||||
"title": "Gedeelde lijsten"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "Favorieten"
|
||||
|
@ -403,7 +403,7 @@
|
|||
},
|
||||
"create": {
|
||||
"title": "New Saved Filter",
|
||||
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
||||
"description": "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.",
|
||||
"action": "Create new saved filter",
|
||||
"titleRequired": "Please provide a title for the filter."
|
||||
},
|
||||
|
@ -435,7 +435,7 @@
|
|||
"label": {
|
||||
"title": "Labels",
|
||||
"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 project 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 list you have access.",
|
||||
"newCTA": "Je hebt momenteel geen labels.",
|
||||
"search": "Type to search for a label…",
|
||||
"create": {
|
||||
|
@ -460,7 +460,7 @@
|
|||
},
|
||||
"sharing": {
|
||||
"authenticating": "Authenticeren…",
|
||||
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||
"passwordRequired": "Deze gedeelde lijst vereist een wachtwoord. Gelieve hieronder in te voeren:",
|
||||
"error": "Er is een fout opgetreden.",
|
||||
"invalidPassword": "Het wachtwoord is ongeldig."
|
||||
},
|
||||
|
@ -529,7 +529,7 @@
|
|||
"code": "Code",
|
||||
"quote": "Citaat",
|
||||
"unorderedList": "Ongesorteerde lijst",
|
||||
"orderedList ": "Ordered List",
|
||||
"orderedList": "Ordered List",
|
||||
"cleanBlock": "Clean Block",
|
||||
"link": "Link",
|
||||
"image": "Afbeelding",
|
||||
|
@ -602,7 +602,6 @@
|
|||
"addReminder": "Nieuwe herinnering toevoegen…",
|
||||
"doneSuccess": "The task was successfully marked as done.",
|
||||
"undoneSuccess": "The task was successfully un-marked as done.",
|
||||
"undo": "Undo",
|
||||
"openDetail": "Open task detail view",
|
||||
"checklistTotal": "{checked} van {total} taken",
|
||||
"checklistAllDone": "{total} taken",
|
||||
|
@ -619,7 +618,7 @@
|
|||
"chooseDueDate": "Klik hier om een vervaldatum in te stellen",
|
||||
"chooseStartDate": "Klik hier om een begindatum in te stellen",
|
||||
"chooseEndDate": "Klik hier om een einddatum in te stellen",
|
||||
"move": "Move task to a different project",
|
||||
"move": "Verplaats taak naar een andere lijst",
|
||||
"done": "Mark task done!",
|
||||
"undone": "Markeer als niet voltooid",
|
||||
"created": "Created {0} by {1}",
|
||||
|
@ -627,7 +626,7 @@
|
|||
"doneAt": "Done {0}",
|
||||
"updateSuccess": "De taak is succesvol opgeslagen.",
|
||||
"deleteSuccess": "De taak is succesvol verwijderd.",
|
||||
"belongsToProject": "This task belongs to project '{project}'",
|
||||
"belongsToList": "Deze taak hoort bij de lijst '{list}'",
|
||||
"due": "Vervalt {at}",
|
||||
"closePopup": "Close popup",
|
||||
"delete": {
|
||||
|
@ -647,7 +646,7 @@
|
|||
"percentDone": "Set Progress",
|
||||
"attachments": "Add Attachments",
|
||||
"relatedTasks": "Add Relation",
|
||||
"moveProject": "Move",
|
||||
"moveList": "Move",
|
||||
"color": "Set Color",
|
||||
"delete": "Verwijder",
|
||||
"favorite": "Toevoegen aan favorieten",
|
||||
|
@ -674,21 +673,21 @@
|
|||
"updated": "Bijgewerkt"
|
||||
},
|
||||
"subscription": {
|
||||
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||
"subscribedListThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this list through its namespace.",
|
||||
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
|
||||
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||
"subscribedTaskThroughParentList": "You can't unsubscribe here because you are subscribed to this task through its list.",
|
||||
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
|
||||
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
|
||||
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||
"subscribedList": "You are currently subscribed to this list and will receive notifications for changes.",
|
||||
"notSubscribedList": "You are not subscribed to this list and won't receive notifications for changes.",
|
||||
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
|
||||
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
|
||||
"subscribe": "Subscribe",
|
||||
"unsubscribe": "Unsubscribe",
|
||||
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
||||
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
||||
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||
"subscribeSuccessList": "You are now subscribed to this list",
|
||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||
},
|
||||
|
@ -762,7 +761,7 @@
|
|||
"new": "Nieuwe taakrelatie",
|
||||
"searchPlaceholder": "Type search for a new task to add as related…",
|
||||
"createPlaceholder": "Voeg dit toe als nieuwe gerelateerde taak",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentList": "Deze taak hoort bij een andere lijst.",
|
||||
"differentNamespace": "This task belongs to a different namespace.",
|
||||
"noneYet": "Nog geen taakrelaties.",
|
||||
"delete": "Taak relatie verwijderen",
|
||||
|
@ -812,10 +811,10 @@
|
|||
"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.",
|
||||
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
||||
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||
"list1": "To set a list for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"list2": "Dit geeft een foutmelding als de lijst niet bestaat.",
|
||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
||||
"list4": "For example: {prefix}\"List with spaces\".",
|
||||
"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:",
|
||||
"dateWeekday": "any weekday, will use the next date with that date",
|
||||
|
@ -848,19 +847,19 @@
|
|||
"delete": {
|
||||
"header": "Verwijder het team",
|
||||
"text1": "Are you sure you want to delete this team and all of its members?",
|
||||
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"text2": "All team members will lose access to lists and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"success": "The team was successfully deleted."
|
||||
},
|
||||
"deleteUser": {
|
||||
"header": "Verwijder een gebruiker uit het team",
|
||||
"text1": "Weet je zeker dat je deze gebruiker wilt verwijderen uit het team?",
|
||||
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"text2": "They will lose access to all lists and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"success": "The user was successfully deleted from the team."
|
||||
},
|
||||
"leave": {
|
||||
"title": "Leave team",
|
||||
"text1": "Are you sure you want to leave this team?",
|
||||
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
||||
"text2": "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.",
|
||||
"success": "You have successfully left the team."
|
||||
}
|
||||
},
|
||||
|
@ -892,12 +891,12 @@
|
|||
"attachment": "Add an attachment to this task",
|
||||
"related": "Modify related tasks of this task",
|
||||
"color": "Change the color of this task",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Move this task to another list",
|
||||
"reminder": "Manage reminders of this task",
|
||||
"description": "Toggle editing of the task description"
|
||||
},
|
||||
"project": {
|
||||
"title": "Project Views",
|
||||
"list": {
|
||||
"title": "List Views",
|
||||
"switchToListView": "Switch to list view",
|
||||
"switchToGanttView": "Switch to gantt view",
|
||||
"switchToKanbanView": "Switch to kanban view",
|
||||
|
@ -907,7 +906,7 @@
|
|||
"title": "Navigation",
|
||||
"overview": "Navigate to overview",
|
||||
"upcoming": "Navigate to upcoming tasks",
|
||||
"namespaces": "Navigate to namespaces & projects",
|
||||
"namespaces": "Navigate to namespaces & lists",
|
||||
"labels": "Navigate to labels",
|
||||
"teams": "Navigate to teams"
|
||||
}
|
||||
|
@ -924,7 +923,7 @@
|
|||
"unarchive": "Archivering opheffen",
|
||||
"setBackground": "Achtergrond instellen",
|
||||
"share": "Delen",
|
||||
"newProject": "New project"
|
||||
"newList": "Nieuwe lijst"
|
||||
},
|
||||
"apiConfig": {
|
||||
"url": "Vikunja URL",
|
||||
|
@ -943,24 +942,24 @@
|
|||
"notification": {
|
||||
"title": "Notificaties",
|
||||
"none": "Je hebt geen meldingen. Fijne dag!",
|
||||
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||
"explainer": "Notifications will appear here when actions on namespaces, lists or tasks you subscribed to happen."
|
||||
},
|
||||
"quickActions": {
|
||||
"commands": "Commands",
|
||||
"placeholder": "Type a command or search…",
|
||||
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
|
||||
"hint": "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.",
|
||||
"tasks": "Taken",
|
||||
"projects": "Projects",
|
||||
"lists": "Lijsten",
|
||||
"teams": "Teams",
|
||||
"newProject": "Enter the title of the new project…",
|
||||
"newList": "Enter the title of the new list…",
|
||||
"newTask": "Enter the title of the new task…",
|
||||
"newNamespace": "Enter the title of the new namespace…",
|
||||
"newTeam": "Enter the name of the new team…",
|
||||
"createTask": "Create a task in the current project ({title})",
|
||||
"createProject": "Create a project in the current namespace ({title})",
|
||||
"createTask": "Create a task in the current list ({title})",
|
||||
"createList": "Create a list in the current namespace ({title})",
|
||||
"cmds": {
|
||||
"newTask": "Nieuwe taak",
|
||||
"newProject": "New project",
|
||||
"newList": "Nieuwe lijst",
|
||||
"newNamespace": "Nieuwe namespace",
|
||||
"newTeam": "Nieuw team"
|
||||
}
|
||||
|
@ -992,15 +991,15 @@
|
|||
"1018": "The user avatar type setting is invalid.",
|
||||
"2001": "ID cannot be empty or 0.",
|
||||
"2002": "Some of the request data was invalid.",
|
||||
"3001": "The project does not exist.",
|
||||
"3004": "You need to have read permissions on that project to perform that action.",
|
||||
"3005": "The project title cannot be empty.",
|
||||
"3006": "The project share does not exist.",
|
||||
"3007": "A project with this identifier already exists.",
|
||||
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
|
||||
"4001": "The project task text cannot be empty.",
|
||||
"4002": "The project task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same project.",
|
||||
"3001": "De lijst bestaat niet.",
|
||||
"3004": "Je moet leesrechten hebben op die lijst om die actie uit te voeren.",
|
||||
"3005": "De titel van de lijst mag niet leeg zijn.",
|
||||
"3006": "The list share does not exist.",
|
||||
"3007": "A list 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.",
|
||||
"4001": "The list task text cannot be empty.",
|
||||
"4002": "The list task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same list.",
|
||||
"4004": "Need at least one task when bulk editing tasks.",
|
||||
"4005": "You do not have the right to see the task.",
|
||||
"4006": "You can't set a parent task as the task itself.",
|
||||
|
@ -1026,21 +1025,21 @@
|
|||
"5012": "The namespace is archived and can therefore only be accessed read only.",
|
||||
"6001": "The team name cannot be empty.",
|
||||
"6002": "Het team bestaat niet.",
|
||||
"6004": "The team already has access to that namespace or project.",
|
||||
"6004": "Het team heeft al toegang tot die namespace of lijst.",
|
||||
"6005": "The user is already a member of that team.",
|
||||
"6006": "Kan het laatste teamlid niet verwijderen.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "The user already has access to that project.",
|
||||
"7003": "You do not have access to that project.",
|
||||
"6007": "Het team heeft geen toegang tot de lijst om die actie uit te voeren.",
|
||||
"7002": "De gebruiker heeft al toegang tot deze lijst.",
|
||||
"7003": "Je hebt geen toegang tot die lijst.",
|
||||
"8001": "Dit label bestaat al voor die taak.",
|
||||
"8002": "Het label bestaat niet.",
|
||||
"8003": "Je hebt geen toegang tot dit label.",
|
||||
"9001": "Ongeldige rechten.",
|
||||
"10001": "The bucket does not exist.",
|
||||
"10002": "The bucket does not belong to that project.",
|
||||
"10003": "You cannot remove the last bucket on a project.",
|
||||
"10002": "The bucket does not belong to that list.",
|
||||
"10003": "You cannot remove the last bucket on a list.",
|
||||
"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 project.",
|
||||
"10005": "There can be only one done bucket per list.",
|
||||
"11001": "Het opgeslagen filter bestaat niet.",
|
||||
"11002": "Saved filters are not available for link shares.",
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
"welcomeDay": "Hei {username}!",
|
||||
"welcomeEvening": "God Morgen {username}!",
|
||||
"lastViewed": "Sist sett",
|
||||
"project": {
|
||||
"newText": "You can create a new project for your new tasks:",
|
||||
"new": "New project",
|
||||
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
"list": {
|
||||
"newText": "Du kan opprette en ny liste for dine nye oppgaver:",
|
||||
"new": "Ny liste",
|
||||
"importText": "Eller importer lister og oppgaver fra andre tjenester til Vikunja:",
|
||||
"import": "Importer dine data til Vikunja"
|
||||
}
|
||||
},
|
||||
"404": {
|
||||
|
@ -85,7 +85,7 @@
|
|||
"weekStartSunday": "Søndag",
|
||||
"weekStartMonday": "Mandag",
|
||||
"language": "Språk",
|
||||
"defaultProject": "Default Project",
|
||||
"defaultList": "Standardliste",
|
||||
"timezone": "Tidssone",
|
||||
"overdueTasksRemindersTime": "Utløpte påminnelses-tid for oppgaver"
|
||||
},
|
||||
|
@ -143,7 +143,7 @@
|
|||
},
|
||||
"deletion": {
|
||||
"title": "Slett kontoen din",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
|
||||
"text1": "Sletting av kontoen din er permanent og kan ikke reverseres. Vi vil slette alle navnefeltene, lister, oppgaver og alt knyttet til den.",
|
||||
"text2": "For å fortsette, skriv inn passordet ditt. Du vil motta en e-post med ytterligere instruksjoner.",
|
||||
"confirm": "Slett min konto",
|
||||
"requestSuccess": "Forespørselen var vellykket. Du vil motta en e-post med ytterligere instruksjoner.",
|
||||
|
@ -157,201 +157,201 @@
|
|||
},
|
||||
"export": {
|
||||
"title": "Eksporter dine kontodata",
|
||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
||||
"description": "Du kan be om en kopi av alle Vikunja dataene dine. Dette inkluderer navneområder, lister, oppgaver og alt tilknyttet dem.",
|
||||
"descriptionPasswordRequired": "Skriv inn passordet for å fortsette:",
|
||||
"request": "Be om kopi av mine Vikunja Data",
|
||||
"success": "Du har spurt om dine Vikunja data! Vi sender deg en e-post når den er klar til å laste ned.",
|
||||
"downloadTitle": "Last ned dine eksporterte Vikunja data"
|
||||
}
|
||||
},
|
||||
"project": {
|
||||
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Project Title",
|
||||
"color": "Color",
|
||||
"projects": "Projects",
|
||||
"search": "Type to search for a project…",
|
||||
"searchSelect": "Click or press enter to select this project",
|
||||
"shared": "Shared Projects",
|
||||
"noDescriptionAvailable": "No project description is available.",
|
||||
"list": {
|
||||
"archived": "Denne listen er arkivert. Det er ikke mulig å opprette nye eller redigere oppgaver for den.",
|
||||
"title": "Listenavn",
|
||||
"color": "Farge",
|
||||
"lists": "Lister",
|
||||
"list": {
|
||||
"title": "Liste",
|
||||
"add": "Legg til",
|
||||
"addPlaceholder": "Legg til ny oppgave…",
|
||||
"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": {
|
||||
"header": "New project",
|
||||
"titlePlaceholder": "The project's title goes here…",
|
||||
"addTitleRequired": "Please specify a title.",
|
||||
"createdSuccess": "The project was successfully created.",
|
||||
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||
"header": "Ny liste",
|
||||
"titlePlaceholder": "Listens tittel går her…",
|
||||
"addTitleRequired": "Angi den nye tittelen.",
|
||||
"createdSuccess": "Applisten ble opprettet.",
|
||||
"addListRequired": "Vennligst spesifiser en liste eller angi en standardliste i innstillingene."
|
||||
},
|
||||
"archive": {
|
||||
"title": "Archive \"{project}\"",
|
||||
"archive": "Archive this project",
|
||||
"unarchive": "Un-Archive this project",
|
||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||
"success": "The project was successfully archived."
|
||||
"title": "Arkiv \"{list}\"",
|
||||
"archive": "Arkiver denne listen",
|
||||
"unarchive": "Ikke-arkiver denne listen",
|
||||
"unarchiveText": "Du vil kunne opprette nye oppgaver eller redigere den.",
|
||||
"archiveText": "Du vil ikke være i stand til å redigere denne listen eller opprette nye oppgaver før du fjerner arkiveringen.",
|
||||
"success": "Listen ble arkivert."
|
||||
},
|
||||
"background": {
|
||||
"title": "Set project background",
|
||||
"remove": "Remove Background",
|
||||
"upload": "Choose a background from your pc",
|
||||
"searchPlaceholder": "Search for a background…",
|
||||
"poweredByUnsplash": "Powered by Unsplash",
|
||||
"loadMore": "Load more photos",
|
||||
"success": "The background has been set successfully!",
|
||||
"removeSuccess": "The background has been removed successfully!"
|
||||
"title": "Angi bakgrunn",
|
||||
"remove": "Fjern bakgrunn",
|
||||
"upload": "Velg en bakgrunn fra din pc",
|
||||
"searchPlaceholder": "Søk etter en bakgrunn…",
|
||||
"poweredByUnsplash": "Drevet av Unsplash",
|
||||
"loadMore": "Laste inn flere bilder",
|
||||
"success": "Bakgrunnen er satt vellykket!",
|
||||
"removeSuccess": "Bakgrunnen har blitt fjernet!"
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{project}\"",
|
||||
"header": "Delete this project",
|
||||
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||
"success": "The project was successfully deleted.",
|
||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||
"title": "Slett \"{list}",
|
||||
"header": "Slett denne listen",
|
||||
"text1": "Er du sikker på at du vil slette denne listen og alt innholdet?",
|
||||
"text2": "Dette inkluderer alle oppgaver og KAN IKKE ANGRES!",
|
||||
"success": "Listen ble slettet.",
|
||||
"tasksToDelete": "Dette vil ugjenkallelig fjerne ca. {count} oppgaver.",
|
||||
"noTasksToDelete": "Denne listen inneholder ingen oppgaver, det bør være trygt å slette."
|
||||
},
|
||||
"duplicate": {
|
||||
"title": "Duplicate this project",
|
||||
"label": "Duplicate",
|
||||
"text": "Select a namespace which should hold the duplicated project:",
|
||||
"success": "The project was successfully duplicated."
|
||||
"title": "Dupliser denne listen",
|
||||
"label": "Dupliser",
|
||||
"text": "Velg et navneområde som skal inneholde den dupliserte listen:",
|
||||
"success": "Listen ble duplisert."
|
||||
},
|
||||
"edit": {
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifier": "Project Identifier",
|
||||
"identifierPlaceholder": "The project identifier goes here…",
|
||||
"description": "Description",
|
||||
"descriptionPlaceholder": "The projects description goes here…",
|
||||
"color": "Color",
|
||||
"success": "The project was successfully updated."
|
||||
"header": "Rediger denne listen",
|
||||
"title": "Rediger \"{list}",
|
||||
"titlePlaceholder": "Listens tittel kommer her…",
|
||||
"identifierTooltip": "Liste-identifikatoren kan brukes til å entydig identifisere en oppgave på tvers av lister. Du kan sette den til tom å deaktivere den.",
|
||||
"identifier": "Liste identifikator",
|
||||
"identifierPlaceholder": "Listens tittel kommer her…",
|
||||
"description": "Beskrivelse",
|
||||
"descriptionPlaceholder": "Listens tittel kommer her…",
|
||||
"color": "Farger",
|
||||
"success": "Listen ble oppdatert."
|
||||
},
|
||||
"share": {
|
||||
"header": "Share this project",
|
||||
"title": "Share \"{project}\"",
|
||||
"share": "Share",
|
||||
"header": "Del denne listen",
|
||||
"title": "Del \"{list}",
|
||||
"share": "Del",
|
||||
"links": {
|
||||
"title": "Share Links",
|
||||
"what": "What is a share link?",
|
||||
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||
"create": "Create a new link share",
|
||||
"name": "Name (optional)",
|
||||
"title": "Del link",
|
||||
"what": "Hva er en lenke for deling?",
|
||||
"explanation": "Lenker lar deg enkelt dele en liste med andre brukere som ikke har en konto på Vikunja.",
|
||||
"create": "Opprett en ny lenkedeling",
|
||||
"name": "Navn (valgfritt)",
|
||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||
"password": "Password (optional)",
|
||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||
"noName": "No name set",
|
||||
"remove": "Remove a link share",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"createSuccess": "The link share was successfully created.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"view": "View",
|
||||
"sharedBy": "Shared by {0}"
|
||||
"nameExplanation": "Alle handlinger utført av denne koblingsdelingen vises med navnet.",
|
||||
"password": "Passord (valgfritt)",
|
||||
"passwordExplanation": "Når brukeren autentiseres, må vedkommende angi dette passordet.",
|
||||
"noName": "Ingen navn satt",
|
||||
"remove": "Fjern en link deling",
|
||||
"removeText": "Er du sikker på at du vil fjerne denne lenkedelen? Det vil ikke lenger være mulig å åpne denne listen med denne lenkedelingen. Dette kan ikke angres!",
|
||||
"createSuccess": "Delingen ble opprettet.",
|
||||
"deleteSuccess": "Delingen ble slettet",
|
||||
"view": "Vis",
|
||||
"sharedBy": "Delt av {0}"
|
||||
},
|
||||
"userTeam": {
|
||||
"typeUser": "user | users",
|
||||
"typeUser": "bruker | bukere",
|
||||
"typeTeam": "team | teams",
|
||||
"shared": "Shared with these {type}",
|
||||
"you": "You",
|
||||
"notShared": "Not shared with any {type} yet.",
|
||||
"removeHeader": "Remove a {type} from the {sharable}",
|
||||
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||
"addedSuccess": "The {type} was successfully added.",
|
||||
"updatedSuccess": "The {type} was successfully added."
|
||||
"shared": "Delt med disse {type}",
|
||||
"you": "Du",
|
||||
"notShared": "Ikke delt med noen {type} ennå.",
|
||||
"removeHeader": "Fjern en {type} fra {sharable}",
|
||||
"removeText": "Er du sikker på at du vil fjerne denne {sharable} fra {type}? Dette kan ikke angres!",
|
||||
"removeSuccess": "{sharable} ble fjernet fra {type}.",
|
||||
"addedSuccess": "{type} ble lagt til.",
|
||||
"updatedSuccess": "{type} ble lagt til."
|
||||
},
|
||||
"right": {
|
||||
"title": "Permission",
|
||||
"read": "Read only",
|
||||
"readWrite": "Read & write",
|
||||
"admin": "Admin"
|
||||
"title": "Rettighet",
|
||||
"read": "Skrivebeskyttet",
|
||||
"readWrite": "Les / Skriv",
|
||||
"admin": "Administrator"
|
||||
},
|
||||
"attributes": {
|
||||
"link": "Link",
|
||||
"delete": "Delete"
|
||||
"delete": "Slett"
|
||||
}
|
||||
},
|
||||
"list": {
|
||||
"title": "List",
|
||||
"add": "Add",
|
||||
"addPlaceholder": "Add a new task…",
|
||||
"empty": "This project is currently empty.",
|
||||
"newTaskCta": "Create a new task.",
|
||||
"editTask": "Edit Task"
|
||||
},
|
||||
"gantt": {
|
||||
"title": "Gantt",
|
||||
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||
"size": "Size",
|
||||
"default": "Default",
|
||||
"month": "Month",
|
||||
"day": "Day",
|
||||
"hour": "Hour",
|
||||
"range": "Date Range",
|
||||
"noDates": "This task has no dates set."
|
||||
"showTasksWithoutDates": "Vis oppgaver som ikke har datoer angitt",
|
||||
"size": "Størrelse",
|
||||
"default": "Standard",
|
||||
"month": "Måned",
|
||||
"day": "Dag",
|
||||
"hour": "Time",
|
||||
"range": "Datointervall",
|
||||
"noDates": "Denne oppgaven har ingen datoer satt."
|
||||
},
|
||||
"table": {
|
||||
"title": "Table",
|
||||
"columns": "Columns"
|
||||
"title": "Tabell",
|
||||
"columns": "Kolonner"
|
||||
},
|
||||
"kanban": {
|
||||
"title": "Kanban",
|
||||
"limit": "Limit: {limit}",
|
||||
"noLimit": "Not Set",
|
||||
"doneBucket": "Done bucket",
|
||||
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
|
||||
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||
"deleteLast": "You cannot remove the last bucket.",
|
||||
"addTaskPlaceholder": "Enter the new task title…",
|
||||
"addTask": "Add a task",
|
||||
"addAnotherTask": "Add another task",
|
||||
"addBucket": "Create a new bucket",
|
||||
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||
"deleteHeaderBucket": "Delete the bucket",
|
||||
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"limit": "Grense: {limit}",
|
||||
"noLimit": "Ikke Angitt",
|
||||
"doneBucket": "Ferdig bøtte",
|
||||
"doneBucketHint": "Alle oppgaver som flyttet til denne bøtte vil automatisk bli markert som ferdig.",
|
||||
"doneBucketHintExtended": "Alle oppgaver som er flyttet inn i den utførte bøtten, vil bli merket som utført automatisk. Alle oppgaver merket som gjort fra andre steder vil også bli flyttet.",
|
||||
"doneBucketSavedSuccess": "Hendelsen er lagret.",
|
||||
"deleteLast": "Du kan ikke fjerne den siste bøtten.",
|
||||
"addTaskPlaceholder": "Skriv den nye oppgavens tittel…",
|
||||
"addTask": "Legg til oppgave",
|
||||
"addAnotherTask": "Legg til en annen oppgave",
|
||||
"addBucket": "Lag en ny bøtte",
|
||||
"addBucketPlaceholder": "Angi den nye bøtte-tittelen…",
|
||||
"deleteHeaderBucket": "Slett bøtte",
|
||||
"deleteBucketText1": "Er du sikker på at du vil slette denne bøtte?",
|
||||
"deleteBucketText2": "Dette vil ikke slette noen oppgaver, men flytte dem til standard bøtte.",
|
||||
"deleteBucketSuccess": "Bøtten er slettet.",
|
||||
"bucketTitleSavedSuccess": "Bøtten er lagret.",
|
||||
"bucketLimitSavedSuccess": "Grensen på bøtte er lagret.",
|
||||
"collapse": "Skjul denne bøtten"
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
"title": "Favorites"
|
||||
"title": "Favoritter"
|
||||
}
|
||||
}
|
||||
},
|
||||
"namespace": {
|
||||
"title": "Namespaces & Projects",
|
||||
"title": "Navneområder & lister",
|
||||
"namespace": "Navneområde",
|
||||
"showArchived": "Vis arkiverte",
|
||||
"noneAvailable": "Du har ingen navneområder akkurat nå.",
|
||||
"unarchive": "Av-arkiver",
|
||||
"archived": "Arkivert",
|
||||
"noProjects": "This namespace does not contain any projects.",
|
||||
"createProject": "Create a new project in this namespace.",
|
||||
"noLists": "Dette navneområdet inneholder ikke noen lister.",
|
||||
"createList": "Opprett en ny liste i dette navneområdet.",
|
||||
"namespaces": "Navnerom",
|
||||
"search": "Skriv for å søke etter en etikett…",
|
||||
"create": {
|
||||
"title": "Nytt navneområde",
|
||||
"titleRequired": "Angi den nye tittelen.",
|
||||
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
|
||||
"explanation": "Et navneområde er en samling av lister du kan dele og bruke til å organisere listene dine med. I realiteten hører hver liste til et navneområde.",
|
||||
"tooltip": "Hva er et navneområde?",
|
||||
"success": "Navneområdet ble opprettet."
|
||||
},
|
||||
"archive": {
|
||||
"titleArchive": "Arkiv \"{namespace}\"",
|
||||
"titleUnarchive": "Av-Arkiv \"{namespace}\"",
|
||||
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
|
||||
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||
"archiveText": "Du vil ikke kunne redigere dette navneområdet eller opprette nye lister før du avlaster arkivet. Dette vil også arkivere alle lister i dette navneområdet.",
|
||||
"unarchiveText": "Du vil kunne opprette nye oppgaver eller redigere den.",
|
||||
"success": "Navnerommet ble arkivert.",
|
||||
"unarchiveSuccess": "Navnerommet ble vellykket fjernet fra arkivet.",
|
||||
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||
"description": "Hvis navneområdet er arkivert, kan du ikke opprette nye lister eller redigere det."
|
||||
},
|
||||
"delete": {
|
||||
"title": "Slett \"{namespace}",
|
||||
"text1": "Er du sikker på at du vil slette dette navneområdet og alt innholdet?",
|
||||
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||
"text2": "Dette inkluderer alle oppgaver og KAN IKKE ANGRES!",
|
||||
"success": "Navnområdet ble slettet."
|
||||
},
|
||||
"edit": {
|
||||
|
@ -371,8 +371,8 @@
|
|||
"isArchived": "Dette navneområdet er arkivert"
|
||||
},
|
||||
"pseudo": {
|
||||
"sharedProjects": {
|
||||
"title": "Shared Projects"
|
||||
"sharedLists": {
|
||||
"title": "Delte lister"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "Favoritter"
|
||||
|
@ -403,7 +403,7 @@
|
|||
},
|
||||
"create": {
|
||||
"title": "Nytt lagret filter",
|
||||
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
||||
"description": "Et lagret filter er en virtuell liste som beregnes fra et sett med filtre hver gang det åpnes. Når du er opprettet, vil det vises i et eget navneområde.",
|
||||
"action": "Opprett nytt filter",
|
||||
"titleRequired": "Please provide a title for the filter."
|
||||
},
|
||||
|
@ -435,7 +435,7 @@
|
|||
"label": {
|
||||
"title": "Etiketter",
|
||||
"manage": "Behandle etiketter",
|
||||
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
|
||||
"description": "Klikk på en etikett for å redigere den. Du kan redigere alle etikettene du lagde, du kan bruke alle etikettene som er tilknyttet en oppgave som du har tilgang til.",
|
||||
"newCTA": "Du har ingen etiketter for øyeblikket.",
|
||||
"search": "Skriv for å søke etter en etikett…",
|
||||
"create": {
|
||||
|
@ -460,7 +460,7 @@
|
|||
},
|
||||
"sharing": {
|
||||
"authenticating": "Autentiserer…",
|
||||
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||
"passwordRequired": "Denne delte listen krever et passord. Vennligst skriv det nedenfor:",
|
||||
"error": "En feil oppsto.",
|
||||
"invalidPassword": "Det oppgitte passordet er ugyldig."
|
||||
},
|
||||
|
@ -529,7 +529,7 @@
|
|||
"code": "Kode",
|
||||
"quote": "Sitat",
|
||||
"unorderedList": "Uordnet liste",
|
||||
"orderedList ": "Ordered List",
|
||||
"orderedList": "Sortert liste",
|
||||
"cleanBlock": "Tøm blokk",
|
||||
"link": "Link",
|
||||
"image": "Bilde",
|
||||
|
@ -602,7 +602,6 @@
|
|||
"addReminder": "Legg til en ny påminnelse…",
|
||||
"doneSuccess": "Oppgaven ble markert som ferdig.",
|
||||
"undoneSuccess": "Oppgaven ble fjernet som ferdig.",
|
||||
"undo": "Undo",
|
||||
"openDetail": "Åpne detaljvisning",
|
||||
"checklistTotal": "{checked} av {total} oppgaver",
|
||||
"checklistAllDone": "{total} oppgaver",
|
||||
|
@ -619,7 +618,7 @@
|
|||
"chooseDueDate": "Klikk her for å angi en forfallsdato",
|
||||
"chooseStartDate": "Klikk her for å angi en startdato",
|
||||
"chooseEndDate": "Klikk her for å angi en sluttdato",
|
||||
"move": "Move task to a different project",
|
||||
"move": "Flytt oppgaven til en annen liste",
|
||||
"done": "Marker som utført!",
|
||||
"undone": "Merk som uferdig",
|
||||
"created": "Opprettet {0} av {1}",
|
||||
|
@ -627,7 +626,7 @@
|
|||
"doneAt": "Ferdig {0}",
|
||||
"updateSuccess": "Oppgaven ble lagret.",
|
||||
"deleteSuccess": "Oppgaven har blitt slettet.",
|
||||
"belongsToProject": "This task belongs to project '{project}'",
|
||||
"belongsToList": "Denne oppgaven tilhører listen '{list}'",
|
||||
"due": "Forfallsdato {at}",
|
||||
"closePopup": "Lukk popup",
|
||||
"delete": {
|
||||
|
@ -647,7 +646,7 @@
|
|||
"percentDone": "Angi fremdrift",
|
||||
"attachments": "Legg til vedlegg",
|
||||
"relatedTasks": "Legg til relasjon",
|
||||
"moveProject": "Move",
|
||||
"moveList": "Flytt",
|
||||
"color": "Sett Farge",
|
||||
"delete": "Slett",
|
||||
"favorite": "Legg til i favoritter",
|
||||
|
@ -674,21 +673,21 @@
|
|||
"updated": "Oppdatert"
|
||||
},
|
||||
"subscription": {
|
||||
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||
"subscribedListThroughParentNamespace": "Du kan ikke slutte å abonnere her fordi du abonnerer på denne listen gjennom dens navneområde.",
|
||||
"subscribedTaskThroughParentNamespace": "Du kan ikke slutte å abonnere her fordi du abonnerer på denne oppgaven gjennom navneområdet.",
|
||||
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||
"subscribedTaskThroughParentList": "Du kan ikke melde deg ut her, fordi du abonnerer på denne oppgaven gjennom listen.",
|
||||
"subscribedNamespace": "Du abonnerer for øyeblikket på dette navneområdet og vil motta varsler for endringer.",
|
||||
"notSubscribedNamespace": "Du abonnerer ikke på dette navneområdet og vil ikke motta varsler for endringer.",
|
||||
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||
"subscribedList": "Du abonnerer for øyeblikket på denne listen og vil motta varsler for endringer.",
|
||||
"notSubscribedList": "Du abonnerer ikke på denne listen og vil ikke motta varsler for endringer.",
|
||||
"subscribedTask": "Du abonnerer for øyeblikket på denne oppgaven og vil motta varsler for endringer.",
|
||||
"notSubscribedTask": "Du abonnerer ikke på denne oppgaven og vil ikke motta varsler for endringer.",
|
||||
"subscribe": "Abonnerer",
|
||||
"unsubscribe": "Avslutt abonnement",
|
||||
"subscribeSuccessNamespace": "Du abonnerer nå på dette navneområdet",
|
||||
"unsubscribeSuccessNamespace": "Du blir nå avmeldt dette navneområdet",
|
||||
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||
"subscribeSuccessList": "Du abonnerer nå på denne listen",
|
||||
"unsubscribeSuccessList": "Du har nå avsluttet abonnementet for denne listen",
|
||||
"subscribeSuccessTask": "Du abonnerer nå på denne oppgaven",
|
||||
"unsubscribeSuccessTask": "Du har nå avsluttet abonnementet for denne oppgaven"
|
||||
},
|
||||
|
@ -762,7 +761,7 @@
|
|||
"new": "Ny oppgaveforbindelse",
|
||||
"searchPlaceholder": "Skriv søk etter en ny oppgave å legge til som relatert…",
|
||||
"createPlaceholder": "Legg til denne som ny relatert oppgave",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentList": "Denne oppgaven tilhører en annen liste.",
|
||||
"differentNamespace": "Denne oppgaven tilhører en annen navneområde.",
|
||||
"noneYet": "Ingen arbeidsrelasjoner ennå.",
|
||||
"delete": "Slett relasjon",
|
||||
|
@ -812,10 +811,10 @@
|
|||
"priority1": "For å angi en oppgaves prioritet, legg til et nummer 1-5, med en {prefix} som prefiks.",
|
||||
"priority2": "Jo høyere tallet er, desto høyere prioritet.",
|
||||
"assignees": "For å direkte tilordne oppgaven til en bruker må du legge til brukernavnet deres med {prefix} som er prefikset på oppgaven.",
|
||||
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||
"list1": "For å angi en liste for oppgaven som skal vises i, skriv inn dens navn med {prefix}.",
|
||||
"list2": "Dette vil returnere en feil dersom listen ikke finnes.",
|
||||
"list3": "For å bruke mellomrom, legg bare til en \" eller ' rundt listenavnet.",
|
||||
"list4": "For eksempel: {prefix}\"Liste med mellomrom\".",
|
||||
"dateAndTime": "Dato og tid",
|
||||
"date": "Hvilken som helst dato vil bli brukt som forfallsdato for den nye oppgaven. Du kan bruke datoer i hvilket som helst format:",
|
||||
"dateWeekday": "hver ukedag vil bruke neste dato med den datoen",
|
||||
|
@ -848,19 +847,19 @@
|
|||
"delete": {
|
||||
"header": "Slett gruppen",
|
||||
"text1": "Er du sikker på at du vil slette denne gruppen og alle dets medlemmer?",
|
||||
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"text2": "Alle medlemmer vil miste tilgang til lister og navneområder som deles med denne gruppen. DETTE KAN IKKE ANGRES!",
|
||||
"success": "Gruppen ble slettet."
|
||||
},
|
||||
"deleteUser": {
|
||||
"header": "Fjerne en bruker fra gruppen",
|
||||
"text1": "Er du sikker på at du vil fjerne bruker fra denne gruppen?",
|
||||
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"text2": "De vil miste tilgang til alle lister og navneområder denne gruppen har tilgang til. DETTE KAN IKKE ANGRES!",
|
||||
"success": "Brukeren ble slettet fra gruppen."
|
||||
},
|
||||
"leave": {
|
||||
"title": "Forlat gruppen",
|
||||
"text1": "Er du sikker på at du vil forlate denne gruppen?",
|
||||
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
||||
"text2": "Du vil miste tilgang til alle lister og navneområder denne gruppen har tilgang til. Hvis du ombestemmer deg, må du ha en lagadministrator for å legge deg til igjen.",
|
||||
"success": "Du har forlatt gruppen."
|
||||
}
|
||||
},
|
||||
|
@ -892,22 +891,22 @@
|
|||
"attachment": "Legg til et vedlegg til denne oppgaven",
|
||||
"related": "Endre relaterte oppgaver for denne oppgaven",
|
||||
"color": "Endre fargen på denne oppgaven",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Flytt denne oppgaven til en annen liste",
|
||||
"reminder": "Behandle påminnelser om denne oppgaven",
|
||||
"description": "Veksle redigering av oppgavebeskrivelsen"
|
||||
},
|
||||
"project": {
|
||||
"title": "Project Views",
|
||||
"switchToListView": "Switch to list view",
|
||||
"switchToGanttView": "Switch to gantt view",
|
||||
"switchToKanbanView": "Switch to kanban view",
|
||||
"switchToTableView": "Switch to table view"
|
||||
"list": {
|
||||
"title": "Listevisning",
|
||||
"switchToListView": "Byttet til listevisning",
|
||||
"switchToGanttView": "Bytt til gantt-visning",
|
||||
"switchToKanbanView": "Bytt til kanban visning",
|
||||
"switchToTableView": "Bytt til tabellvisning"
|
||||
},
|
||||
"navigation": {
|
||||
"title": "Navigasjon",
|
||||
"overview": "Naviger til oversikt",
|
||||
"upcoming": "Gå til kommende oppgaver",
|
||||
"namespaces": "Navigate to namespaces & projects",
|
||||
"namespaces": "Gå til navneområder og lister",
|
||||
"labels": "Naviger til etiketter",
|
||||
"teams": "Naviger til gruppe"
|
||||
}
|
||||
|
@ -924,7 +923,7 @@
|
|||
"unarchive": "Av-arkiver",
|
||||
"setBackground": "Bruk som bakgrunn",
|
||||
"share": "Del",
|
||||
"newProject": "New project"
|
||||
"newList": "Ny liste"
|
||||
},
|
||||
"apiConfig": {
|
||||
"url": "Vikunja URL",
|
||||
|
@ -943,24 +942,24 @@
|
|||
"notification": {
|
||||
"title": "Varsler",
|
||||
"none": "Du har ingen varsler på dette tidspunktet!",
|
||||
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||
"explainer": "Varsler vil vises her når handlinger på navneområder, lister eller oppgaver du abonnerer på."
|
||||
},
|
||||
"quickActions": {
|
||||
"commands": "Kommandoer",
|
||||
"placeholder": "Skriv en kommando eller søk…",
|
||||
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
|
||||
"hint": "Du kan bruke {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.",
|
||||
"tasks": "Oppgaver",
|
||||
"projects": "Projects",
|
||||
"lists": "Lister",
|
||||
"teams": "Grupper",
|
||||
"newProject": "Enter the title of the new project…",
|
||||
"newList": "Skriv tittelen på den nye listen…",
|
||||
"newTask": "Skriv tittelen på den nye oppgaven…",
|
||||
"newNamespace": "Skriv inn tittelen på det nye navneområdet…",
|
||||
"newTeam": "Skriv inn navnet på den nye gruppen…",
|
||||
"createTask": "Create a task in the current project ({title})",
|
||||
"createProject": "Create a project in the current namespace ({title})",
|
||||
"createTask": "Opprett en oppgave i den gjeldende listen ({title})",
|
||||
"createList": "Opprett en liste i gjeldende navneområde ({title})",
|
||||
"cmds": {
|
||||
"newTask": "Ny oppgave",
|
||||
"newProject": "New project",
|
||||
"newList": "Ny liste",
|
||||
"newNamespace": "Nytt navneområde",
|
||||
"newTeam": "Ny gruppe"
|
||||
}
|
||||
|
@ -992,15 +991,15 @@
|
|||
"1018": "Innstillingen av brukerens avatartype er ugyldig.",
|
||||
"2001": "ID kan ikke være tom eller 0.",
|
||||
"2002": "Noen av forespørselsdataene var ugyldig.",
|
||||
"3001": "The project does not exist.",
|
||||
"3004": "You need to have read permissions on that project to perform that action.",
|
||||
"3005": "The project title cannot be empty.",
|
||||
"3006": "The project share does not exist.",
|
||||
"3007": "A project with this identifier already exists.",
|
||||
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
|
||||
"4001": "The project task text cannot be empty.",
|
||||
"4002": "The project task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same project.",
|
||||
"3001": "Listen eksisterer ikke.",
|
||||
"3004": "Du må ha lesetilgang på den listen for å utføre den handlingen.",
|
||||
"3005": "Tittelen kan ikke være tom.",
|
||||
"3006": "Listedelingen finnes ikke.",
|
||||
"3007": "En liste med denne identifikatoren finnes allerede.",
|
||||
"3008": "Listen er arkivert og kan derfor bare leses om. Dette gjelder også for alle oppgaver som er tilknyttet denne listen.",
|
||||
"4001": "Tittelen kan ikke være tom.",
|
||||
"4002": "Listedelingen finnes ikke.",
|
||||
"4003": "Alle sammenkoblede redigeringsoppgaver må tilhøre samme liste.",
|
||||
"4004": "Trenger minst én oppgave når masseredigeringsoppgaver skal utføres.",
|
||||
"4005": "Du har ikke rettigheter til å redigere denne siden.",
|
||||
"4006": "Du kan ikke sette en overordnet oppgave som oppgaven selv.",
|
||||
|
@ -1026,21 +1025,21 @@
|
|||
"5012": "Navneområdet er arkivert og kan derfor kun leses på.",
|
||||
"6001": "Gruppe nanvet kan ikke være tomt.",
|
||||
"6002": "Gruppen finnes ikke.",
|
||||
"6004": "The team already has access to that namespace or project.",
|
||||
"6004": "Gruppen har allerede tilgang til dette navneområdet eller listen.",
|
||||
"6005": "Brukeren er allerede medlem av gruppen.",
|
||||
"6006": "Kan ikke slette siste gruppemedlem.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "The user already has access to that project.",
|
||||
"7003": "You do not have access to that project.",
|
||||
"6007": "Gruppen har ikke tilgang til listen for å utføre den handlingen.",
|
||||
"7002": "Brukeren har allerede tilgang til denne listen.",
|
||||
"7003": "Du har ikke tilgang til dette.",
|
||||
"8001": "Denne etiketten finnes allerede på den oppgaven.",
|
||||
"8002": "Etiketten finnes ikke.",
|
||||
"8003": "Du har ikke tilgang til denne etiketten.",
|
||||
"9001": "Linken er ugyldig.",
|
||||
"10001": "Bøtten finnes ikke.",
|
||||
"10002": "The bucket does not belong to that project.",
|
||||
"10003": "You cannot remove the last bucket on a project.",
|
||||
"10002": "Bøtten tilhører ikke den listen.",
|
||||
"10003": "Du kan ikke fjerne den siste bøtten.",
|
||||
"10004": "Du kan ikke legge til oppgaven i denne bøtte fordi den allerede overskrider grensen på oppgaver som den kan holde.",
|
||||
"10005": "There can be only one done bucket per project.",
|
||||
"10005": "Det kan bare være en ferdig bøtte per liste.",
|
||||
"11001": "Det lagrede filteret finnes ikke.",
|
||||
"11002": "Lagrede filtre er ikke tilgjengelige for lenke delinger.",
|
||||
"12001": "Abonnement enhetstypen er ugyldig.",
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
"welcomeDay": "Hi {username}!",
|
||||
"welcomeEvening": "Good Evening {username}!",
|
||||
"lastViewed": "Ostatnio oglądane",
|
||||
"project": {
|
||||
"newText": "You can create a new project for your new tasks:",
|
||||
"new": "New project",
|
||||
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
"list": {
|
||||
"newText": "Możesz stworzyć nową listę dla swoich nowych zadań:",
|
||||
"new": "Nowa lista",
|
||||
"importText": "Lub zaimportować swoje listy i zadania z innych usług do Vikunja:",
|
||||
"import": "Zaimportuj swoje dane do Vikunja"
|
||||
}
|
||||
},
|
||||
"404": {
|
||||
|
@ -85,7 +85,7 @@
|
|||
"weekStartSunday": "niedzieli",
|
||||
"weekStartMonday": "poniedziałku",
|
||||
"language": "Język",
|
||||
"defaultProject": "Default Project",
|
||||
"defaultList": "Domyślna lista",
|
||||
"timezone": "Strefa czasowa",
|
||||
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
||||
},
|
||||
|
@ -143,7 +143,7 @@
|
|||
},
|
||||
"deletion": {
|
||||
"title": "Usuń swoje konto Vikunja",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
|
||||
"text1": "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.",
|
||||
"text2": "Aby kontynuować, wprowadź swoje hasło. Otrzymasz wiadomość e-mail z dalszymi instrukcjami.",
|
||||
"confirm": "Usuń moje konto",
|
||||
"requestSuccess": "Żądanie powiodło się. Otrzymasz wiadomość e-mail z dalszymi instrukcjami.",
|
||||
|
@ -157,201 +157,201 @@
|
|||
},
|
||||
"export": {
|
||||
"title": "Eksportuj swoje dane Vikunja",
|
||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
||||
"description": "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.",
|
||||
"descriptionPasswordRequired": "Wprowadź hasło, aby kontynuować:",
|
||||
"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.",
|
||||
"downloadTitle": "Pobierz wyeksportowane dane Vikunja"
|
||||
}
|
||||
},
|
||||
"project": {
|
||||
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Project Title",
|
||||
"color": "Color",
|
||||
"projects": "Projects",
|
||||
"search": "Type to search for a project…",
|
||||
"searchSelect": "Click or press enter to select this project",
|
||||
"shared": "Shared Projects",
|
||||
"noDescriptionAvailable": "No project description is available.",
|
||||
"list": {
|
||||
"archived": "Ta lista jest zarchiwizowana. Nie można w niej tworzyć ani edytować zadań.",
|
||||
"title": "Tytuł listy",
|
||||
"color": "Kolor",
|
||||
"lists": "Listy",
|
||||
"list": {
|
||||
"title": "Lista",
|
||||
"add": "Dodaj",
|
||||
"addPlaceholder": "Dodaj nowe zadanie…",
|
||||
"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": {
|
||||
"header": "New project",
|
||||
"titlePlaceholder": "The project's title goes here…",
|
||||
"addTitleRequired": "Please specify a title.",
|
||||
"createdSuccess": "The project was successfully created.",
|
||||
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||
"header": "Nowa lista",
|
||||
"titlePlaceholder": "Tu wpisz tytuł listy…",
|
||||
"addTitleRequired": "Proszę podaj tytuł.",
|
||||
"createdSuccess": "Lista została pomyślnie utworzona.",
|
||||
"addListRequired": "Proszę, wybierz listę lub ustaw listę domyślną w ustawieniach."
|
||||
},
|
||||
"archive": {
|
||||
"title": "Archive \"{project}\"",
|
||||
"archive": "Archive this project",
|
||||
"unarchive": "Un-Archive this project",
|
||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||
"success": "The project was successfully archived."
|
||||
"title": "Archiwizuj \"{list}\"",
|
||||
"archive": "Zarchiwizuj tę listę",
|
||||
"unarchive": "Cofnij archiwizację tej listy",
|
||||
"unarchiveText": "Będziesz mógł tworzyć nowe zadania lub je edytować.",
|
||||
"archiveText": "Nie będziesz mógł edytować tej listy ani tworzyć nowych zadań, dopóki nie cofniesz jej archiwizacji.",
|
||||
"success": "Lista została pomyślnie zarchiwizowana."
|
||||
},
|
||||
"background": {
|
||||
"title": "Set project background",
|
||||
"remove": "Remove Background",
|
||||
"upload": "Choose a background from your pc",
|
||||
"searchPlaceholder": "Search for a background…",
|
||||
"poweredByUnsplash": "Powered by Unsplash",
|
||||
"loadMore": "Load more photos",
|
||||
"success": "The background has been set successfully!",
|
||||
"removeSuccess": "The background has been removed successfully!"
|
||||
"title": "Ustaw tło listy",
|
||||
"remove": "Usuń tło",
|
||||
"upload": "Prześlij tło ze swojego komputera",
|
||||
"searchPlaceholder": "Wyszukiwanie tła…",
|
||||
"poweredByUnsplash": "Wspierane przez Unsplash",
|
||||
"loadMore": "Załaduj więcej zdjęć",
|
||||
"success": "Tło zostało ustawione pomyślnie!",
|
||||
"removeSuccess": "Tło zostało pomyślnie usunięte!"
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{project}\"",
|
||||
"header": "Delete this project",
|
||||
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||
"success": "The project was successfully deleted.",
|
||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||
"title": "Usuń \"{list}\"",
|
||||
"header": "Usuń tę listę",
|
||||
"text1": "Czy na pewno chcesz usunąć tę listę i całą jej zawartość?",
|
||||
"text2": "Obejmuje to wszystkie zadania i tego NIE DA SIĘ COFNĄĆ!",
|
||||
"success": "Lista została pomyślnie usunięta.",
|
||||
"tasksToDelete": "To nieodwołalnie usunie około {count} zadań.",
|
||||
"noTasksToDelete": "Ta lista nie zawiera żadnych zadań, usunięcie powinno być bezpieczne."
|
||||
},
|
||||
"duplicate": {
|
||||
"title": "Duplicate this project",
|
||||
"label": "Duplicate",
|
||||
"text": "Select a namespace which should hold the duplicated project:",
|
||||
"success": "The project was successfully duplicated."
|
||||
"title": "Duplikuj tę listę",
|
||||
"label": "Duplikuj",
|
||||
"text": "Wybierz sekcję, do której powinna trafić zduplikowana lista:",
|
||||
"success": "Lista została pomyślnie zduplikowana."
|
||||
},
|
||||
"edit": {
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifier": "Project Identifier",
|
||||
"identifierPlaceholder": "The project identifier goes here…",
|
||||
"description": "Description",
|
||||
"descriptionPlaceholder": "The projects description goes here…",
|
||||
"color": "Color",
|
||||
"success": "The project was successfully updated."
|
||||
"header": "Edytuj tę listę",
|
||||
"title": "Edytuj \"{list}\"",
|
||||
"titlePlaceholder": "Tu wpisz tytuł listy…",
|
||||
"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ć.",
|
||||
"identifier": "Identyfikator listy",
|
||||
"identifierPlaceholder": "Tu wpisz identyfikator listy…",
|
||||
"description": "Opis",
|
||||
"descriptionPlaceholder": "Tu wpisz opis listy…",
|
||||
"color": "Kolor",
|
||||
"success": "Lista została pomyślnie zaktualizowana."
|
||||
},
|
||||
"share": {
|
||||
"header": "Share this project",
|
||||
"title": "Share \"{project}\"",
|
||||
"share": "Share",
|
||||
"header": "Udostępnij tę listę",
|
||||
"title": "Udostępnij \"{list}\"",
|
||||
"share": "Udostępnij",
|
||||
"links": {
|
||||
"title": "Share Links",
|
||||
"what": "What is a share link?",
|
||||
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||
"create": "Create a new link share",
|
||||
"name": "Name (optional)",
|
||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||
"nameExplanation": "All actions done by this link share will show up with the name.",
|
||||
"password": "Password (optional)",
|
||||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||
"noName": "No name set",
|
||||
"remove": "Remove a link share",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"createSuccess": "The link share was successfully created.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"title": "Udostępnij linki",
|
||||
"what": "Co to jest udostępnianie linków?",
|
||||
"explanation": "Udostępnianie linków umożliwia łatwe udostępnianie listy innym użytkownikom, którzy nie mają konta na Vikunja.",
|
||||
"create": "Utwórz nowy link do udostępnienia",
|
||||
"name": "Nazwa: (opcjonalnie)",
|
||||
"namePlaceholder": "np. Lorem Ipsum",
|
||||
"nameExplanation": "Wszystkie działania wykonane przez ten link będą wyświetlane pod tą nazwą.",
|
||||
"password": "Hasło (opcjonalnie)",
|
||||
"passwordExplanation": "Podczas uwierzytelniania użytkownik będzie musiał wprowadzić to hasło.",
|
||||
"noName": "Nie ustawiono nazwy",
|
||||
"remove": "Usuń link",
|
||||
"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ąć!",
|
||||
"createSuccess": "Pomyślnie utworzono udostępniony link.",
|
||||
"deleteSuccess": "Udostępniony link został pomyślnie usunięty",
|
||||
"view": "View",
|
||||
"sharedBy": "Shared by {0}"
|
||||
},
|
||||
"userTeam": {
|
||||
"typeUser": "user | users",
|
||||
"typeTeam": "team | teams",
|
||||
"shared": "Shared with these {type}",
|
||||
"you": "You",
|
||||
"notShared": "Not shared with any {type} yet.",
|
||||
"removeHeader": "Remove a {type} from the {sharable}",
|
||||
"removeText": "Are you sure you want to remove this {sharable} from the {type}? This cannot be undone!",
|
||||
"removeSuccess": "The {sharable} was successfully removed from the {type}.",
|
||||
"addedSuccess": "The {type} was successfully added.",
|
||||
"updatedSuccess": "The {type} was successfully added."
|
||||
"typeUser": "użytkownik(a) | użytkownikom",
|
||||
"typeTeam": "zespół | zespołom",
|
||||
"shared": "Udostępniono tym {type}",
|
||||
"you": "Ty",
|
||||
"notShared": "Nie udostępniono jeszcze żadnym {type}.",
|
||||
"removeHeader": "Usuń {type} z {sharable}",
|
||||
"removeText": "Czy na pewno chcesz usunąć {type} z {sharable}? Tego nie da się cofnąć!",
|
||||
"removeSuccess": "{type} został pomyślnie usunięty z {sharable}.",
|
||||
"addedSuccess": "{type} został pomyślnie dodany.",
|
||||
"updatedSuccess": "{type} został pomyślnie dodany."
|
||||
},
|
||||
"right": {
|
||||
"title": "Permission",
|
||||
"read": "Read only",
|
||||
"readWrite": "Read & write",
|
||||
"admin": "Admin"
|
||||
"read": "Tylko do odczytu",
|
||||
"readWrite": "Odczyt i zapis",
|
||||
"admin": "Administrator"
|
||||
},
|
||||
"attributes": {
|
||||
"link": "Link",
|
||||
"delete": "Delete"
|
||||
"delete": "Usuń"
|
||||
}
|
||||
},
|
||||
"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": {
|
||||
"title": "Gantt",
|
||||
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||
"size": "Size",
|
||||
"default": "Default",
|
||||
"month": "Month",
|
||||
"day": "Day",
|
||||
"showTasksWithoutDates": "Pokaż zadania, które nie mają ustawionych dat",
|
||||
"size": "Rozmiar",
|
||||
"default": "Domyślny",
|
||||
"month": "Miesiąc",
|
||||
"day": "Dzień",
|
||||
"hour": "Hour",
|
||||
"range": "Date Range",
|
||||
"noDates": "This task has no dates set."
|
||||
"noDates": "To zadanie nie ma ustawionych dat."
|
||||
},
|
||||
"table": {
|
||||
"title": "Table",
|
||||
"columns": "Columns"
|
||||
"title": "Tabela",
|
||||
"columns": "Kolumny"
|
||||
},
|
||||
"kanban": {
|
||||
"title": "Kanban",
|
||||
"limit": "Limit: {limit}",
|
||||
"noLimit": "Not Set",
|
||||
"doneBucket": "Done bucket",
|
||||
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
|
||||
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||
"deleteLast": "You cannot remove the last bucket.",
|
||||
"addTaskPlaceholder": "Enter the new task title…",
|
||||
"addTask": "Add a task",
|
||||
"addAnotherTask": "Add another task",
|
||||
"addBucket": "Create a new bucket",
|
||||
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||
"deleteHeaderBucket": "Delete the bucket",
|
||||
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"noLimit": "Nie ustawiony",
|
||||
"doneBucket": "Zasobnik ukończonych zadań",
|
||||
"doneBucketHint": "Wszystkie zadania przeniesione do tego zasobnika zostaną automatycznie oznaczone jako ukończone.",
|
||||
"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.",
|
||||
"doneBucketSavedSuccess": "Zasobnik ukończonych zadań został pomyślnie zapisany.",
|
||||
"deleteLast": "Nie możesz usunąć ostatniego zasobnika.",
|
||||
"addTaskPlaceholder": "Wpisz tytuł nowego zadania…",
|
||||
"addTask": "Dodaj zadanie",
|
||||
"addAnotherTask": "Dodaj kolejne zadanie",
|
||||
"addBucket": "Utwórz nowy zasobnik",
|
||||
"addBucketPlaceholder": "Wpisz tytuł nowego zasobnika…",
|
||||
"deleteHeaderBucket": "Usuń zasobnik",
|
||||
"deleteBucketText1": "Czy na pewno chcesz usunąć ten zasobnik?",
|
||||
"deleteBucketText2": "Nie spowoduje to usunięcia żadnych zadań, ale przeniesie je do domyślnego zasobnika.",
|
||||
"deleteBucketSuccess": "Zasobnik został pomyślnie usunięty.",
|
||||
"bucketTitleSavedSuccess": "Tytuł zasobnika został pomyślnie zapisany.",
|
||||
"bucketLimitSavedSuccess": "Limit zasobnika został pomyślnie zapisany.",
|
||||
"collapse": "Zwiń ten zasobnik"
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
"title": "Favorites"
|
||||
"title": "Ulubione"
|
||||
}
|
||||
}
|
||||
},
|
||||
"namespace": {
|
||||
"title": "Namespaces & Projects",
|
||||
"title": "Sekcje i Listy",
|
||||
"namespace": "Sekcja",
|
||||
"showArchived": "Pokaż zarchiwizowane",
|
||||
"noneAvailable": "W tej chwili nie masz żadnych sekcji.",
|
||||
"unarchive": "Cofnij archiwizację",
|
||||
"archived": "Zarchiwizowane",
|
||||
"noProjects": "This namespace does not contain any projects.",
|
||||
"createProject": "Create a new project in this namespace.",
|
||||
"noLists": "Ta sekcja nie zawiera żadnych list.",
|
||||
"createList": "Utwórz nową listę w tej sekcji.",
|
||||
"namespaces": "Sekcje",
|
||||
"search": "Wpisz, aby wyszukać sekcję…",
|
||||
"create": {
|
||||
"title": "Nowa sekcja",
|
||||
"titleRequired": "Proszę, podaj tytuł.",
|
||||
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
|
||||
"explanation": "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.",
|
||||
"tooltip": "Co to jest sekcja?",
|
||||
"success": "Sekcja została pomyślnie utworzona."
|
||||
},
|
||||
"archive": {
|
||||
"titleArchive": "Archiwizuj \"{namespace}\"",
|
||||
"titleUnarchive": "Cofnij archiwizację \"{namespace}\"",
|
||||
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
|
||||
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||
"archiveText": "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.",
|
||||
"unarchiveText": "Będziesz mógł tworzyć nowe listy i je edytować.",
|
||||
"success": "Sekcja została pomyślnie zarchiwizowana.",
|
||||
"unarchiveSuccess": "Archiwizacja sekcji została pomyślnie cofnięta.",
|
||||
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||
"description": "Jeśli sekcja jest zarchiwizowana, nie można edytować ani tworzyć nowych list."
|
||||
},
|
||||
"delete": {
|
||||
"title": "Usuń \"{namespace}\"",
|
||||
"text1": "Czy na pewno chcesz usunąć tę sekcję i całą jej zawartość?",
|
||||
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||
"text2": "Dotyczy to wszystkich list i zadań i tego NIE DA SIĘ COFNĄĆ!",
|
||||
"success": "Sekcja została pomyślnie usunięta."
|
||||
},
|
||||
"edit": {
|
||||
|
@ -371,8 +371,8 @@
|
|||
"isArchived": "Ta sekcja jest zarchiwizowana"
|
||||
},
|
||||
"pseudo": {
|
||||
"sharedProjects": {
|
||||
"title": "Shared Projects"
|
||||
"sharedLists": {
|
||||
"title": "Współdzielone listy"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "Ulubione"
|
||||
|
@ -403,7 +403,7 @@
|
|||
},
|
||||
"create": {
|
||||
"title": "Nowy filtr stały",
|
||||
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
||||
"description": "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.",
|
||||
"action": "Utwórz nowy filtr stały",
|
||||
"titleRequired": "Please provide a title for the filter."
|
||||
},
|
||||
|
@ -435,7 +435,7 @@
|
|||
"label": {
|
||||
"title": "Etykiety",
|
||||
"manage": "Zarządzaj etykietami",
|
||||
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
|
||||
"description": "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.",
|
||||
"newCTA": "Obecnie nie masz żadnych etykiet.",
|
||||
"search": "Wpisz, aby wyszukać etykietę…",
|
||||
"create": {
|
||||
|
@ -460,7 +460,7 @@
|
|||
},
|
||||
"sharing": {
|
||||
"authenticating": "Uwierzytelnianie…",
|
||||
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||
"passwordRequired": "Ta współdzielona lista wymaga hasła. Wpisz je poniżej:",
|
||||
"error": "Wystąpił błąd.",
|
||||
"invalidPassword": "Hasło jest nieprawidłowe."
|
||||
},
|
||||
|
@ -529,7 +529,7 @@
|
|||
"code": "Kod",
|
||||
"quote": "Cytat",
|
||||
"unorderedList": "Lista nieuporządkowana",
|
||||
"orderedList ": "Ordered List",
|
||||
"orderedList": "Lista uporządkowana",
|
||||
"cleanBlock": "Wyczyść blok",
|
||||
"link": "Link",
|
||||
"image": "Obraz",
|
||||
|
@ -602,7 +602,6 @@
|
|||
"addReminder": "Dodaj nowe przypomnienie…",
|
||||
"doneSuccess": "Zadanie zostało pomyślnie oznaczone jako ukończone.",
|
||||
"undoneSuccess": "Zadanie zostało pomyślnie otwarte ponownie.",
|
||||
"undo": "Undo",
|
||||
"openDetail": "Otwórz szczegółowy widok zadania",
|
||||
"checklistTotal": "{checked} z {total} zadań",
|
||||
"checklistAllDone": "{total} zadań",
|
||||
|
@ -619,7 +618,7 @@
|
|||
"chooseDueDate": "Kliknij tutaj, aby ustawić termin",
|
||||
"chooseStartDate": "Kliknij tutaj, aby ustawić datę rozpoczęcia",
|
||||
"chooseEndDate": "Kliknij tutaj, aby ustawić datę zakończenia",
|
||||
"move": "Move task to a different project",
|
||||
"move": "Przenieś zadanie na inną listę",
|
||||
"done": "Oznacz zadanie jako ukończone!",
|
||||
"undone": "Otwórz zadanie ponownie",
|
||||
"created": "Utworzono {0} przez {1}",
|
||||
|
@ -627,7 +626,7 @@
|
|||
"doneAt": "Ukończone {0}",
|
||||
"updateSuccess": "Zadanie zostało pomyślnie zapisane.",
|
||||
"deleteSuccess": "Zadanie zostało pomyślnie usunięte.",
|
||||
"belongsToProject": "This task belongs to project '{project}'",
|
||||
"belongsToList": "To zadanie należy do listy '{list}'",
|
||||
"due": "Termin {at}",
|
||||
"closePopup": "Zamknij okno",
|
||||
"delete": {
|
||||
|
@ -647,7 +646,7 @@
|
|||
"percentDone": "Ustaw postęp",
|
||||
"attachments": "Dodaj załączniki",
|
||||
"relatedTasks": "Dodaj powiązanie",
|
||||
"moveProject": "Move",
|
||||
"moveList": "Przenieś",
|
||||
"color": "Ustaw kolor",
|
||||
"delete": "Usuń",
|
||||
"favorite": "Dodaj do ulubionych",
|
||||
|
@ -674,21 +673,21 @@
|
|||
"updated": "Zaktualizowano"
|
||||
},
|
||||
"subscription": {
|
||||
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||
"subscribedListThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this list through its namespace.",
|
||||
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
|
||||
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||
"subscribedTaskThroughParentList": "You can't unsubscribe here because you are subscribed to this task through its list.",
|
||||
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
|
||||
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
|
||||
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||
"subscribedList": "You are currently subscribed to this list and will receive notifications for changes.",
|
||||
"notSubscribedList": "You are not subscribed to this list and won't receive notifications for changes.",
|
||||
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
|
||||
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
|
||||
"subscribe": "Subskrybuj",
|
||||
"unsubscribe": "Anuluj subskrypcję",
|
||||
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
||||
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
||||
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||
"subscribeSuccessList": "You are now subscribed to this list",
|
||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||
},
|
||||
|
@ -762,7 +761,7 @@
|
|||
"new": "Nowe powiązane zadanie",
|
||||
"searchPlaceholder": "Wpisz, aby wyszukać zadanie, które chcesz dodać jako powiązane…",
|
||||
"createPlaceholder": "Dodaj jako nowe powiązane zadanie",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentList": "To zadanie należy do innej listy.",
|
||||
"differentNamespace": "To zadanie należy do innej sekcji.",
|
||||
"noneYet": "Nie ma jeszcze powiązanych zadań.",
|
||||
"delete": "Usuń powiązane zadanie",
|
||||
|
@ -812,10 +811,10 @@
|
|||
"priority1": "Aby ustawić priorytet zadania, dodaj liczbę 1-5 poprzedzoną {prefix}.",
|
||||
"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.",
|
||||
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||
"list1": "Aby ustawić listę, do której ma zostać przypisane zadanie, wprowadź jego nazwę z prefiksem {prefix}.",
|
||||
"list2": "Jeśli lista nie istnieje zostanie zwrócony błąd.",
|
||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
||||
"list4": "For example: {prefix}\"List with spaces\".",
|
||||
"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:",
|
||||
"dateWeekday": "dowolny dzień tygodnia spowoduje wybranie najbliższej daty przypadającej na podany dzień tygodnia",
|
||||
|
@ -848,19 +847,19 @@
|
|||
"delete": {
|
||||
"header": "Usuń zespół",
|
||||
"text1": "Czy na pewno chcesz usunąć ten zespół i wszystkich jego członków?",
|
||||
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"text2": "Wszyscy członkowie zespołu stracą dostęp do list i sekcji udostępnionych temu zespołowi. Tego NIE DA SIĘ COFNĄĆ!",
|
||||
"success": "Zespół został pomyślnie usunięty."
|
||||
},
|
||||
"deleteUser": {
|
||||
"header": "Usuń użytkownika z zespołu",
|
||||
"text1": "Czy na pewno chcesz usunąć tego użytkownika z zespołu?",
|
||||
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"text2": "Utraci on dostęp do wszystkich list i sekcji, do których ma dostęp ten zespół. Tego NIE DA SIĘ COFNĄĆ!",
|
||||
"success": "Użytkownik został pomyślnie usunięty z zespołu."
|
||||
},
|
||||
"leave": {
|
||||
"title": "Leave team",
|
||||
"text1": "Are you sure you want to leave this team?",
|
||||
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
||||
"text2": "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.",
|
||||
"success": "You have successfully left the team."
|
||||
}
|
||||
},
|
||||
|
@ -892,22 +891,22 @@
|
|||
"attachment": "Dodaj załącznik do tego zadania",
|
||||
"related": "Zmodyfikuj zadania powiązane z tym zadaniem",
|
||||
"color": "Zmień kolor tego zadania",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Przenieś to zadanie do innej listy",
|
||||
"reminder": "Zarządzaj przypomnieniami o tym zadaniu",
|
||||
"description": "Toggle editing of the task description"
|
||||
},
|
||||
"project": {
|
||||
"title": "Project Views",
|
||||
"switchToListView": "Switch to list view",
|
||||
"switchToGanttView": "Switch to gantt view",
|
||||
"switchToKanbanView": "Switch to kanban view",
|
||||
"switchToTableView": "Switch to table view"
|
||||
"list": {
|
||||
"title": "Widoki listy",
|
||||
"switchToListView": "Przełącz na widok listy",
|
||||
"switchToGanttView": "Przełącz na widok Gantta",
|
||||
"switchToKanbanView": "Przełącz na widok Kanban",
|
||||
"switchToTableView": "Przełącz na widok tabeli"
|
||||
},
|
||||
"navigation": {
|
||||
"title": "Nawigacja",
|
||||
"overview": "Przejdź do przeglądu",
|
||||
"upcoming": "Przejdź do nadchodzących zadań",
|
||||
"namespaces": "Navigate to namespaces & projects",
|
||||
"namespaces": "Przejdź do sekcji i list",
|
||||
"labels": "Przejdź do etykiet",
|
||||
"teams": "Przejdź do zespołów"
|
||||
}
|
||||
|
@ -924,7 +923,7 @@
|
|||
"unarchive": "Cofnij archiwizację",
|
||||
"setBackground": "Ustaw tło",
|
||||
"share": "Udostępnij",
|
||||
"newProject": "New project"
|
||||
"newList": "Nowa lista"
|
||||
},
|
||||
"apiConfig": {
|
||||
"url": "URL Vikunji",
|
||||
|
@ -943,24 +942,24 @@
|
|||
"notification": {
|
||||
"title": "Powiadomienia",
|
||||
"none": "Nie masz żadnych powiadomień. Miłego dnia!",
|
||||
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||
"explainer": "Powiadomienia pojawią się tutaj, gdy będą miały miejsce akcje na sekcjach, listach lub zadaniach, które subskrybujesz."
|
||||
},
|
||||
"quickActions": {
|
||||
"commands": "Polecenia",
|
||||
"placeholder": "Wpisz polecenie lub wyszukiwaną frazę…",
|
||||
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
|
||||
"hint": "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.",
|
||||
"tasks": "Zadania",
|
||||
"projects": "Projects",
|
||||
"lists": "Listy",
|
||||
"teams": "Zespoły",
|
||||
"newProject": "Enter the title of the new project…",
|
||||
"newList": "Wpisz tytuł nowej listy…",
|
||||
"newTask": "Wpisz tytuł nowego zadania…",
|
||||
"newNamespace": "Wpisz tytuł nowej sekcji…",
|
||||
"newTeam": "Wpisz nazwę nowego zespołu…",
|
||||
"createTask": "Create a task in the current project ({title})",
|
||||
"createProject": "Create a project in the current namespace ({title})",
|
||||
"createTask": "Utwórz zadanie na bieżącej liście ({title})",
|
||||
"createList": "Utwórz listę w bieżącej sekcji ({title})",
|
||||
"cmds": {
|
||||
"newTask": "Nowe zadanie",
|
||||
"newProject": "New project",
|
||||
"newList": "Nowa lista",
|
||||
"newNamespace": "Nowa sekcja",
|
||||
"newTeam": "Nowy zespół"
|
||||
}
|
||||
|
@ -992,15 +991,15 @@
|
|||
"1018": "Ustawienie typu awatara użytkownika jest nieprawidłowe.",
|
||||
"2001": "ID nie może być puste lub równe 0.",
|
||||
"2002": "Niektóre dane żądania były nieprawidłowe.",
|
||||
"3001": "The project does not exist.",
|
||||
"3004": "You need to have read permissions on that project to perform that action.",
|
||||
"3005": "The project title cannot be empty.",
|
||||
"3006": "The project share does not exist.",
|
||||
"3007": "A project with this identifier already exists.",
|
||||
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
|
||||
"4001": "The project task text cannot be empty.",
|
||||
"4002": "The project task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same project.",
|
||||
"3001": "Lista nie istnieje.",
|
||||
"3004": "Aby wykonać tę akcję, musisz mieć uprawnienia do odczytu tej listy.",
|
||||
"3005": "Tytuł listy nie może być pusty.",
|
||||
"3006": "Współdzielona lista nie istnieje.",
|
||||
"3007": "Lista o tym identyfikatorze już istnieje.",
|
||||
"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ą.",
|
||||
"4001": "Tekst zadania listy nie może być pusty.",
|
||||
"4002": "Zadanie listy nie istnieje.",
|
||||
"4003": "Wszystkie zadania edycji zbiorczej muszą należeć do tej samej listy.",
|
||||
"4004": "Potrzebujesz co najmniej jednego zadania do edycji zbiorczej zadań.",
|
||||
"4005": "Nie masz uprawnień, aby zobaczyć to zadanie.",
|
||||
"4006": "Zadanie nie może zostać ustawione jako nadrzędne dla samego siebie.",
|
||||
|
@ -1026,21 +1025,21 @@
|
|||
"5012": "Sekcja jest zarchiwizowana, dlatego może być dostępna tylko do odczytu.",
|
||||
"6001": "Nazwa zespołu nie może być pusta.",
|
||||
"6002": "Zespół nie istnieje.",
|
||||
"6004": "The team already has access to that namespace or project.",
|
||||
"6004": "Zespół ma już dostęp do tej sekcji lub listy.",
|
||||
"6005": "Użytkownik jest już członkiem tego zespołu.",
|
||||
"6006": "Nie można usunąć ostatniego członka zespołu.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "The user already has access to that project.",
|
||||
"7003": "You do not have access to that project.",
|
||||
"6007": "Zespół nie ma dostępu do listy, aby wykonać tę akcję.",
|
||||
"7002": "Użytkownik ma już dostęp do tej listy.",
|
||||
"7003": "Nie masz dostępu do tej listy.",
|
||||
"8001": "Ta etykieta już istnieje w tym zadaniu.",
|
||||
"8002": "Etykieta nie istnieje.",
|
||||
"8003": "Nie masz dostępu do tej etykiety.",
|
||||
"9001": "Nieprawidłowe uprawnienia.",
|
||||
"10001": "Zasobnik nie istnieje.",
|
||||
"10002": "The bucket does not belong to that project.",
|
||||
"10003": "You cannot remove the last bucket on a project.",
|
||||
"10002": "Zasobnik nie należy do tej listy.",
|
||||
"10003": "Nie możesz usunąć ostatniego zasobnika z listy.",
|
||||
"10004": "Nie możesz dodać zadania do tego zasobnika, ponieważ przekroczyło już limit zadań, które może pomieścić.",
|
||||
"10005": "There can be only one done bucket per project.",
|
||||
"10005": "Na liście może znajdować się tylko jeden zasobnik ukończonych zadań.",
|
||||
"11001": "Filtr stały nie istnieje.",
|
||||
"11002": "Filtry stałe nie są dostępne dla udostępnionych linków.",
|
||||
"12001": "Typ subskrypcji jest nieprawidłowy.",
|
||||
|
|
|
@ -5,10 +5,10 @@
|
|||
"welcomeDay": "Olá, {username}!",
|
||||
"welcomeEvening": "Boa noite, {username}!",
|
||||
"lastViewed": "Visto por último",
|
||||
"project": {
|
||||
"newText": "You can create a new project for your new tasks:",
|
||||
"new": "New project",
|
||||
"importText": "Or import your projects and tasks from other services into Vikunja:",
|
||||
"list": {
|
||||
"newText": "Você pode criar uma nova lista para suas novas tarefas:",
|
||||
"new": "Nova lista",
|
||||
"importText": "Or import your lists and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
}
|
||||
},
|
||||
|
@ -85,7 +85,7 @@
|
|||
"weekStartSunday": "Sunday",
|
||||
"weekStartMonday": "Monday",
|
||||
"language": "Language",
|
||||
"defaultProject": "Default Project",
|
||||
"defaultList": "Default List",
|
||||
"timezone": "Fuso horário",
|
||||
"overdueTasksRemindersTime": "Overdue tasks reminder email time"
|
||||
},
|
||||
|
@ -143,7 +143,7 @@
|
|||
},
|
||||
"deletion": {
|
||||
"title": "Delete your Vikunja Account",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
|
||||
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, lists, tasks and everything associated with it.",
|
||||
"text2": "To proceed, please enter your password. You will receive an email with further instructions.",
|
||||
"confirm": "Delete my account",
|
||||
"requestSuccess": "The request was successful. You'll receive an email with further instructions.",
|
||||
|
@ -157,39 +157,47 @@
|
|||
},
|
||||
"export": {
|
||||
"title": "Export your Vikunja data",
|
||||
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
|
||||
"description": "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.",
|
||||
"descriptionPasswordRequired": "Please enter your password to proceed:",
|
||||
"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.",
|
||||
"downloadTitle": "Download your exported Vikunja data"
|
||||
}
|
||||
},
|
||||
"project": {
|
||||
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "Project Title",
|
||||
"list": {
|
||||
"archived": "This list is archived. It is not possible to create new or edit tasks for it.",
|
||||
"title": "List Title",
|
||||
"color": "Color",
|
||||
"projects": "Projects",
|
||||
"search": "Type to search for a project…",
|
||||
"searchSelect": "Click or press enter to select this project",
|
||||
"shared": "Shared Projects",
|
||||
"noDescriptionAvailable": "No project description is available.",
|
||||
"lists": "Lists",
|
||||
"list": {
|
||||
"title": "List",
|
||||
"add": "Add",
|
||||
"addPlaceholder": "Add a new task…",
|
||||
"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": {
|
||||
"header": "New project",
|
||||
"titlePlaceholder": "The project's title goes here…",
|
||||
"header": "Nova lista",
|
||||
"titlePlaceholder": "The list's title goes here…",
|
||||
"addTitleRequired": "Please specify a title.",
|
||||
"createdSuccess": "The project was successfully created.",
|
||||
"addProjectRequired": "Please specify a project or set a default project in the settings."
|
||||
"createdSuccess": "The list was successfully created.",
|
||||
"addListRequired": "Please specify a list or set a default list in the settings."
|
||||
},
|
||||
"archive": {
|
||||
"title": "Archive \"{project}\"",
|
||||
"archive": "Archive this project",
|
||||
"unarchive": "Un-Archive this project",
|
||||
"title": "Archive \"{list}\"",
|
||||
"archive": "Archive this list",
|
||||
"unarchive": "Un-Archive this list",
|
||||
"unarchiveText": "You will be able to create new tasks or edit it.",
|
||||
"archiveText": "You won't be able to edit this project or create new tasks until you un-archive it.",
|
||||
"success": "The project was successfully archived."
|
||||
"archiveText": "You won't be able to edit this list or create new tasks until you un-archive it.",
|
||||
"success": "The list was successfully archived."
|
||||
},
|
||||
"background": {
|
||||
"title": "Set project background",
|
||||
"title": "Set list background",
|
||||
"remove": "Remove Background",
|
||||
"upload": "Choose a background from your pc",
|
||||
"searchPlaceholder": "Search for a background…",
|
||||
|
@ -199,40 +207,40 @@
|
|||
"removeSuccess": "The background has been removed successfully!"
|
||||
},
|
||||
"delete": {
|
||||
"title": "Delete \"{project}\"",
|
||||
"header": "Delete this project",
|
||||
"text1": "Are you sure you want to delete this project and all of its contents?",
|
||||
"title": "Delete \"{list}\"",
|
||||
"header": "Delete this list",
|
||||
"text1": "Are you sure you want to delete this list and all of its contents?",
|
||||
"text2": "This includes all tasks and CANNOT BE UNDONE!",
|
||||
"success": "The project was successfully deleted.",
|
||||
"tasksToDelete": "This will irrevocably remove approx. {count} tasks.",
|
||||
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
|
||||
"success": "The list was successfully deleted.",
|
||||
"tasksToDelete": "Isto irá remover irrevogavelmente aprox. {count} tarefas.",
|
||||
"noTasksToDelete": "Esta lista não contém tarefas, deve ser segura para excluir."
|
||||
},
|
||||
"duplicate": {
|
||||
"title": "Duplicate this project",
|
||||
"title": "Duplicate this list",
|
||||
"label": "Duplicate",
|
||||
"text": "Select a namespace which should hold the duplicated project:",
|
||||
"success": "The project was successfully duplicated."
|
||||
"text": "Select a namespace which should hold the duplicated list:",
|
||||
"success": "The list was successfully duplicated."
|
||||
},
|
||||
"edit": {
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifier": "Project Identifier",
|
||||
"identifierPlaceholder": "The project identifier goes here…",
|
||||
"header": "Edit This List",
|
||||
"title": "Edit \"{list}\"",
|
||||
"titlePlaceholder": "The list 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.",
|
||||
"identifier": "List Identifier",
|
||||
"identifierPlaceholder": "The list identifier goes here…",
|
||||
"description": "Description",
|
||||
"descriptionPlaceholder": "The projects description goes here…",
|
||||
"descriptionPlaceholder": "The lists description goes here…",
|
||||
"color": "Color",
|
||||
"success": "The project was successfully updated."
|
||||
"success": "The list was successfully updated."
|
||||
},
|
||||
"share": {
|
||||
"header": "Share this project",
|
||||
"title": "Share \"{project}\"",
|
||||
"header": "Share this list",
|
||||
"title": "Share \"{list}\"",
|
||||
"share": "Share",
|
||||
"links": {
|
||||
"title": "Share Links",
|
||||
"what": "What is a share link?",
|
||||
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
|
||||
"explanation": "Share Links allow you to easily share a list with other users who don't have an account on Vikunja.",
|
||||
"create": "Create a new link share",
|
||||
"name": "Name (optional)",
|
||||
"namePlaceholder": "e.g. Lorem Ipsum",
|
||||
|
@ -241,7 +249,7 @@
|
|||
"passwordExplanation": "When authenticating, the user will be required to enter this password.",
|
||||
"noName": "No name set",
|
||||
"remove": "Remove a link share",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"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!",
|
||||
"createSuccess": "The link share was successfully created.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"view": "View",
|
||||
|
@ -260,7 +268,7 @@
|
|||
"updatedSuccess": "The {type} was successfully added."
|
||||
},
|
||||
"right": {
|
||||
"title": "Permission",
|
||||
"title": "Permissão",
|
||||
"read": "Read only",
|
||||
"readWrite": "Read & write",
|
||||
"admin": "Admin"
|
||||
|
@ -270,88 +278,80 @@
|
|||
"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": {
|
||||
"title": "Gantt",
|
||||
"showTasksWithoutDates": "Show tasks which don't have dates set",
|
||||
"size": "Size",
|
||||
"default": "Default",
|
||||
"month": "Month",
|
||||
"day": "Day",
|
||||
"showTasksWithoutDates": "Mostrar tarefas que não possuem datas definidas",
|
||||
"size": "Tamanho",
|
||||
"default": "Padrão",
|
||||
"month": "Mês",
|
||||
"day": "Dia",
|
||||
"hour": "Hour",
|
||||
"range": "Date Range",
|
||||
"noDates": "This task has no dates set."
|
||||
"noDates": "Esta tarefa não tem datas definidas."
|
||||
},
|
||||
"table": {
|
||||
"title": "Table",
|
||||
"columns": "Columns"
|
||||
"title": "Tabela",
|
||||
"columns": "Colunas"
|
||||
},
|
||||
"kanban": {
|
||||
"title": "Kanban",
|
||||
"limit": "Limit: {limit}",
|
||||
"noLimit": "Not Set",
|
||||
"doneBucket": "Done bucket",
|
||||
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.",
|
||||
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.",
|
||||
"doneBucketSavedSuccess": "The done bucket has been saved successfully.",
|
||||
"deleteLast": "You cannot remove the last bucket.",
|
||||
"addTaskPlaceholder": "Enter the new task title…",
|
||||
"addTask": "Add a task",
|
||||
"addAnotherTask": "Add another task",
|
||||
"addBucket": "Create a new bucket",
|
||||
"addBucketPlaceholder": "Enter the new bucket title…",
|
||||
"deleteHeaderBucket": "Delete the bucket",
|
||||
"deleteBucketText1": "Are you sure you want to delete this bucket?",
|
||||
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.",
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"limit": "Limite: {limit}",
|
||||
"noLimit": "Não definido",
|
||||
"doneBucket": "Bucket concluído",
|
||||
"doneBucketHint": "Todas as tarefas movidas para este bucket serão marcadas automaticamente como concluídas.",
|
||||
"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.",
|
||||
"doneBucketSavedSuccess": "O bucket foi marcado como concluído com sucesso.",
|
||||
"deleteLast": "Você não pode remover o último bucket.",
|
||||
"addTaskPlaceholder": "Digite o novo título da tarefa…",
|
||||
"addTask": "Adicionar uma tarefa",
|
||||
"addAnotherTask": "Adicionar outra tarefa",
|
||||
"addBucket": "Criar um novo bucket",
|
||||
"addBucketPlaceholder": "Digite o novo título do bucket…",
|
||||
"deleteHeaderBucket": "Excluir o bucket",
|
||||
"deleteBucketText1": "Tem certeza que deseja excluir este bucket?",
|
||||
"deleteBucketText2": "Isto não vai apagar nenhuma tarefa, mas as moverá para o bucket padrão.",
|
||||
"deleteBucketSuccess": "O bucket foi excluído com sucesso.",
|
||||
"bucketTitleSavedSuccess": "O título do bucket foi salvo com sucesso.",
|
||||
"bucketLimitSavedSuccess": "O limite do bucket foi salvo com sucesso.",
|
||||
"collapse": "Recolher este bucket"
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
"title": "Favorites"
|
||||
"title": "Favoritos"
|
||||
}
|
||||
}
|
||||
},
|
||||
"namespace": {
|
||||
"title": "Namespaces & Projects",
|
||||
"title": "Listas & Namespaces",
|
||||
"namespace": "Namespace",
|
||||
"showArchived": "Show Archived",
|
||||
"noneAvailable": "Você não tem nenhum namespace no momento.",
|
||||
"unarchive": "Desarquivar",
|
||||
"archived": "Arquivado",
|
||||
"noProjects": "This namespace does not contain any projects.",
|
||||
"createProject": "Create a new project in this namespace.",
|
||||
"noLists": "Este namespace não contém nenhuma lista.",
|
||||
"createList": "Criar uma nova lista neste namespace.",
|
||||
"namespaces": "Namespaces",
|
||||
"search": "Digite para procurar por um namespace…",
|
||||
"create": {
|
||||
"title": "Novo namespace",
|
||||
"titleRequired": "Por favor, especifique um título.",
|
||||
"explanation": "A namespace is a collection of projects you can share and use to organize your projects with. In fact, every project belongs to a namespace.",
|
||||
"explanation": "Um 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.",
|
||||
"tooltip": "O que é um namespace?",
|
||||
"success": "O namespace foi criado com sucesso."
|
||||
},
|
||||
"archive": {
|
||||
"titleArchive": "Arquivar \"{namespace}\"",
|
||||
"titleUnarchive": "Desarquivar \"{namespace}\"",
|
||||
"archiveText": "You won't be able to edit this namespace or create new projects until you un-archive it. This will also archive all projects in this namespace.",
|
||||
"unarchiveText": "You will be able to create new projects or edit it.",
|
||||
"archiveText": "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.",
|
||||
"unarchiveText": "Você será capaz de criar novas listas ou editá-las.",
|
||||
"success": "O namespace foi arquivado com sucesso.",
|
||||
"unarchiveSuccess": "O namespace foi desarquivado com sucesso.",
|
||||
"description": "If a namespace is archived, you cannot create new projects or edit it."
|
||||
"description": "If a namespace is archived, you cannot create new lists or edit it."
|
||||
},
|
||||
"delete": {
|
||||
"title": "Excluir \"{namespace}\"",
|
||||
"text1": "Are you sure you want to delete this namespace and all of its contents?",
|
||||
"text2": "This includes all projects and tasks and CANNOT BE UNDONE!",
|
||||
"text2": "This includes all lists and tasks and CANNOT BE UNDONE!",
|
||||
"success": "O namespace foi excluído com sucesso."
|
||||
},
|
||||
"edit": {
|
||||
|
@ -371,8 +371,8 @@
|
|||
"isArchived": "Este namespace está arquivado"
|
||||
},
|
||||
"pseudo": {
|
||||
"sharedProjects": {
|
||||
"title": "Shared Projects"
|
||||
"sharedLists": {
|
||||
"title": "Listas Compartilhadas"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "Favoritos"
|
||||
|
@ -403,7 +403,7 @@
|
|||
},
|
||||
"create": {
|
||||
"title": "Novo filtro salvo",
|
||||
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
|
||||
"description": "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.",
|
||||
"action": "Create new saved filter",
|
||||
"titleRequired": "Please provide a title for the filter."
|
||||
},
|
||||
|
@ -435,7 +435,7 @@
|
|||
"label": {
|
||||
"title": "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 project 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 list you have access.",
|
||||
"newCTA": "Você não tem nenhuma etiqueta atualmente.",
|
||||
"search": "Digite para procurar por uma etiqueta…",
|
||||
"create": {
|
||||
|
@ -460,7 +460,7 @@
|
|||
},
|
||||
"sharing": {
|
||||
"authenticating": "Autenticando…",
|
||||
"passwordRequired": "This shared project requires a password. Please enter it below:",
|
||||
"passwordRequired": "Esta lista compartilhada requer uma senha. Por favor, digite-a abaixo:",
|
||||
"error": "Ocorreu um erro.",
|
||||
"invalidPassword": "A senha é inválida."
|
||||
},
|
||||
|
@ -529,7 +529,7 @@
|
|||
"code": "Código",
|
||||
"quote": "Citação",
|
||||
"unorderedList": "Lista não ordenada",
|
||||
"orderedList ": "Ordered List",
|
||||
"orderedList": "Lista ordenada",
|
||||
"cleanBlock": "Clean Block",
|
||||
"link": "Link",
|
||||
"image": "Imagem",
|
||||
|
@ -602,7 +602,6 @@
|
|||
"addReminder": "Adicionar um novo lembrete…",
|
||||
"doneSuccess": "A tarefa foi marcada como feita com sucesso.",
|
||||
"undoneSuccess": "A tarefa foi desmarcada como feita com sucesso.",
|
||||
"undo": "Undo",
|
||||
"openDetail": "Abrir detalhes da tarefa",
|
||||
"checklistTotal": "{checked} de {total} tarefas",
|
||||
"checklistAllDone": "{total} tarefas",
|
||||
|
@ -619,7 +618,7 @@
|
|||
"chooseDueDate": "Click here to set a due date",
|
||||
"chooseStartDate": "Clique aqui para definir uma data de início",
|
||||
"chooseEndDate": "Click here to set an end date",
|
||||
"move": "Move task to a different project",
|
||||
"move": "Move task to a different list",
|
||||
"done": "Marcar tarefa como concluída!",
|
||||
"undone": "Marcar como não concluído",
|
||||
"created": "Criado {0} por {1}",
|
||||
|
@ -627,7 +626,7 @@
|
|||
"doneAt": "Concluído {0}",
|
||||
"updateSuccess": "A tarefa foi salva com sucesso.",
|
||||
"deleteSuccess": "A tarefa foi excluída com sucesso.",
|
||||
"belongsToProject": "This task belongs to project '{project}'",
|
||||
"belongsToList": "This task belongs to list '{list}'",
|
||||
"due": "Due {at}",
|
||||
"closePopup": "Fechar janela",
|
||||
"delete": {
|
||||
|
@ -647,7 +646,7 @@
|
|||
"percentDone": "Definir progresso",
|
||||
"attachments": "Adicionar anexos",
|
||||
"relatedTasks": "Add Relation",
|
||||
"moveProject": "Move",
|
||||
"moveList": "Mover",
|
||||
"color": "Definir cor",
|
||||
"delete": "Excluir",
|
||||
"favorite": "Adicionar aos favoritos",
|
||||
|
@ -674,21 +673,21 @@
|
|||
"updated": "Atualizado"
|
||||
},
|
||||
"subscription": {
|
||||
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
|
||||
"subscribedListThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this list through its namespace.",
|
||||
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
|
||||
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
|
||||
"subscribedTaskThroughParentList": "You can't unsubscribe here because you are subscribed to this task through its list.",
|
||||
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
|
||||
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
|
||||
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
|
||||
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
|
||||
"subscribedList": "You are currently subscribed to this list and will receive notifications for changes.",
|
||||
"notSubscribedList": "You are not subscribed to this list and won't receive notifications for changes.",
|
||||
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
|
||||
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
|
||||
"subscribe": "Inscrever-se",
|
||||
"unsubscribe": "Desinscrever-se",
|
||||
"subscribeSuccessNamespace": "You are now subscribed to this namespace",
|
||||
"unsubscribeSuccessNamespace": "You are now unsubscribed to this namespace",
|
||||
"subscribeSuccessProject": "You are now subscribed to this project",
|
||||
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
|
||||
"subscribeSuccessList": "You are now subscribed to this list",
|
||||
"unsubscribeSuccessList": "You are now unsubscribed to this list",
|
||||
"subscribeSuccessTask": "You are now subscribed to this task",
|
||||
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
|
||||
},
|
||||
|
@ -762,7 +761,7 @@
|
|||
"new": "New Task Relation",
|
||||
"searchPlaceholder": "Type search for a new task to add as related…",
|
||||
"createPlaceholder": "Add this as new related task",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentList": "This task belongs to a different list.",
|
||||
"differentNamespace": "This task belongs to a different namespace.",
|
||||
"noneYet": "No task relations yet.",
|
||||
"delete": "Delete Task Relation",
|
||||
|
@ -812,10 +811,10 @@
|
|||
"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.",
|
||||
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.",
|
||||
"project1": "To set a project for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
"project3": "To use spaces, simply add a \" or ' around the project name.",
|
||||
"project4": "For example: {prefix}\"Project with spaces\".",
|
||||
"list1": "To set a list for the task to appear in, enter its name prefixed with {prefix}.",
|
||||
"list2": "This will return an error if the list does not exist.",
|
||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
||||
"list4": "For example: {prefix}\"List with spaces\".",
|
||||
"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:",
|
||||
"dateWeekday": "any weekday, will use the next date with that date",
|
||||
|
@ -848,19 +847,19 @@
|
|||
"delete": {
|
||||
"header": "Excluir a equipe",
|
||||
"text1": "Are you sure you want to delete this team and all of its members?",
|
||||
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"text2": "All team members will lose access to lists and namespaces shared with this team. This CANNOT BE UNDONE!",
|
||||
"success": "A equipe foi excluída com sucesso."
|
||||
},
|
||||
"deleteUser": {
|
||||
"header": "Remove a user from the team",
|
||||
"text1": "Are you sure you want to remove this user from the team?",
|
||||
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"text2": "They will lose access to all lists and namespaces this team has access to. This CANNOT BE UNDONE!",
|
||||
"success": "O usuário foi removido da equipe com sucesso."
|
||||
},
|
||||
"leave": {
|
||||
"title": "Leave team",
|
||||
"text1": "Are you sure you want to leave this team?",
|
||||
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
|
||||
"text2": "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.",
|
||||
"success": "You have successfully left the team."
|
||||
}
|
||||
},
|
||||
|
@ -892,12 +891,12 @@
|
|||
"attachment": "Add an attachment to this task",
|
||||
"related": "Modify related tasks of this task",
|
||||
"color": "Change the color of this task",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Move this task to another list",
|
||||
"reminder": "Manage reminders of this task",
|
||||
"description": "Toggle editing of the task description"
|
||||
},
|
||||
"project": {
|
||||
"title": "Project Views",
|
||||
"list": {
|
||||
"title": "List Views",
|
||||
"switchToListView": "Switch to list view",
|
||||
"switchToGanttView": "Switch to gantt view",
|
||||
"switchToKanbanView": "Switch to kanban view",
|
||||
|
@ -907,7 +906,7 @@
|
|||
"title": "Navigation",
|
||||
"overview": "Navigate to overview",
|
||||
"upcoming": "Navigate to upcoming tasks",
|
||||
"namespaces": "Navigate to namespaces & projects",
|
||||
"namespaces": "Navigate to namespaces & lists",
|
||||
"labels": "Navigate to labels",
|
||||
"teams": "Navigate to teams"
|
||||
}
|
||||
|
@ -924,7 +923,7 @@
|
|||
"unarchive": "Un-Archive",
|
||||
"setBackground": "Set background",
|
||||
"share": "Share",
|
||||
"newProject": "New project"
|
||||
"newList": "New list"
|
||||
},
|
||||
"apiConfig": {
|
||||
"url": "Vikunja URL",
|
||||
|
@ -943,24 +942,24 @@
|
|||
"notification": {
|
||||
"title": "Notificações",
|
||||
"none": "You don't have any notifications. Have a nice day!",
|
||||
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
|
||||
"explainer": "Notifications will appear here when actions on namespaces, lists or tasks you subscribed to happen."
|
||||
},
|
||||
"quickActions": {
|
||||
"commands": "Comandos",
|
||||
"placeholder": "Digite um comando ou pesquise…",
|
||||
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
|
||||
"hint": "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.",
|
||||
"tasks": "Tarefas",
|
||||
"projects": "Projects",
|
||||
"lists": "Listas",
|
||||
"teams": "Equipes",
|
||||
"newProject": "Enter the title of the new project…",
|
||||
"newList": "Digite o título da nova lista…",
|
||||
"newTask": "Enter the title of the new task…",
|
||||
"newNamespace": "Enter the title of the new namespace…",
|
||||
"newTeam": "Enter the name of the new team…",
|
||||
"createTask": "Create a task in the current project ({title})",
|
||||
"createProject": "Create a project in the current namespace ({title})",
|
||||
"createTask": "Create a task in the current list ({title})",
|
||||
"createList": "Create a list in the current namespace ({title})",
|
||||
"cmds": {
|
||||
"newTask": "Nova tarefa",
|
||||
"newProject": "New project",
|
||||
"newList": "Nova lista",
|
||||
"newNamespace": "Novo namespace",
|
||||
"newTeam": "Nova equipe"
|
||||
}
|
||||
|
@ -992,15 +991,15 @@
|
|||
"1018": "The user avatar type setting is invalid.",
|
||||
"2001": "ID cannot be empty or 0.",
|
||||
"2002": "Some of the request data was invalid.",
|
||||
"3001": "The project does not exist.",
|
||||
"3004": "You need to have read permissions on that project to perform that action.",
|
||||
"3005": "The project title cannot be empty.",
|
||||
"3006": "The project share does not exist.",
|
||||
"3007": "A project with this identifier already exists.",
|
||||
"3008": "The project is archived and can therefore only be accessed read only. This is also true for all tasks associated with this project.",
|
||||
"4001": "The project task text cannot be empty.",
|
||||
"4002": "The project task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same project.",
|
||||
"3001": "The list does not exist.",
|
||||
"3004": "You need to have read permissions on that list to perform that action.",
|
||||
"3005": "The list title cannot be empty.",
|
||||
"3006": "The list share does not exist.",
|
||||
"3007": "A list 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.",
|
||||
"4001": "The list task text cannot be empty.",
|
||||
"4002": "The list task does not exist.",
|
||||
"4003": "All bulk editing tasks must belong to the same list.",
|
||||
"4004": "Need at least one task when bulk editing tasks.",
|
||||
"4005": "You do not have the right to see the task.",
|
||||
"4006": "You can't set a parent task as the task itself.",
|
||||
|
@ -1026,21 +1025,21 @@
|
|||
"5012": "The namespace is archived and can therefore only be accessed read only.",
|
||||
"6001": "The team name cannot be empty.",
|
||||
"6002": "The team does not exist.",
|
||||
"6004": "The team already has access to that namespace or project.",
|
||||
"6004": "The team already has access to that namespace or list.",
|
||||
"6005": "The user is already a member of that team.",
|
||||
"6006": "Cannot delete the last team member.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "The user already has access to that project.",
|
||||
"7003": "You do not have access to that project.",
|
||||
"6007": "The team does not have access to the list to perform that action.",
|
||||
"7002": "The user already has access to that list.",
|
||||
"7003": "You do not have access to that list.",
|
||||
"8001": "This label already exists on that task.",
|
||||
"8002": "The label does not exist.",
|
||||
"8003": "You do not have access to this label.",
|
||||
"9001": "The right is invalid.",
|
||||
"10001": "The bucket does not exist.",
|
||||
"10002": "The bucket does not belong to that project.",
|
||||
"10003": "You cannot remove the last bucket on a project.",
|
||||
"10002": "The bucket does not belong to that list.",
|
||||
"10003": "You cannot remove the last bucket on a list.",
|
||||
"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 project.",
|
||||
"10005": "There can be only one done bucket per list.",
|
||||
"11001": "The saved filter does not exist.",
|
||||
"11002": "Saved filters are not available for link shares.",
|
||||
"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
Block a user