Compare commits

..

1 Commits

166 changed files with 14703 additions and 7086 deletions

View File

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

14
.npmrc
View File

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

2
.nvmrc
View File

@ -1 +1 @@
18.16.0
18.15.0

View File

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

View File

@ -3,7 +3,7 @@
# │─││ │││ │ │
# ┘─┘┘─┘┘┘─┘┘─┘
FROM --platform=$BUILDPLATFORM node:20-alpine AS builder
FROM --platform=$BUILDPLATFORM node:18-alpine AS builder
WORKDIR /build
@ -54,8 +54,6 @@ ENV VIKUNJA_LOG_FORMAT main
ENV VIKUNJA_API_URL /api/v1
ENV VIKUNJA_SENTRY_ENABLED false
ENV VIKUNJA_SENTRY_DSN https://85694a2d757547cbbc90cd4b55c5a18d@o1047380.ingest.sentry.io/6024480
ENV VIKUNJA_PROJECT_INFINITE_NESTING_ENABLED false
ENV VIKUNJA_ALLOW_ICON_CHANGES true
COPY docker/injector.sh /docker-entrypoint.d/50-injector.sh
COPY docker/ipv6-disable.sh /docker-entrypoint.d/60-ipv6-disable.sh

View File

@ -24,5 +24,4 @@ export default defineConfig({
},
viewportWidth: 1600,
viewportHeight: 900,
experimentalMemoryManagement: true,
})

View File

@ -2,6 +2,7 @@ import {createFakeUserAndLogin} from '../../support/authenticateUser'
import {TaskFactory} from '../../factories/task'
import {ProjectFactory} from '../../factories/project'
import {NamespaceFactory} from '../../factories/namespace'
import {UserProjectFactory} from '../../factories/users_project'
import {BucketFactory} from '../../factories/bucket'
@ -9,6 +10,7 @@ describe('Editor', () => {
createFakeUserAndLogin()
beforeEach(() => {
NamespaceFactory.create(1)
ProjectFactory.create(1)
BucketFactory.create(1)
TaskFactory.truncate()

View File

@ -8,20 +8,20 @@ describe('The Menu', () => {
})
it('Is visible by default on desktop', () => {
cy.get('.menu-container')
cy.get('.namespace-container')
.should('have.class', 'is-active')
})
it('Can be hidden on desktop', () => {
cy.get('button.menu-show-button:visible')
.click()
cy.get('.menu-container')
cy.get('.namespace-container')
.should('not.have.class', 'is-active')
})
it('Is hidden by default on mobile', () => {
cy.viewport('iphone-8')
cy.get('.menu-container')
cy.get('.namespace-container')
.should('not.have.class', 'is-active')
})
@ -29,7 +29,7 @@ describe('The Menu', () => {
cy.viewport('iphone-8')
cy.get('button.menu-show-button:visible')
.click()
cy.get('.menu-container')
cy.get('.namespace-container')
.should('have.class', 'is-active')
})
})

View File

@ -0,0 +1,145 @@
import {createFakeUserAndLogin} from '../../support/authenticateUser'
import {ProjectFactory} from '../../factories/project'
import {NamespaceFactory} from '../../factories/namespace'
describe('Namepaces', () => {
createFakeUserAndLogin()
let namespaces
beforeEach(() => {
namespaces = NamespaceFactory.create(1)
ProjectFactory.create(1)
})
it('Should be all there', () => {
cy.visit('/namespaces')
cy.get('[data-cy="namespace-title"]')
.should('contain', namespaces[0].title)
})
it('Should create a new Namespace', () => {
const newNamespaceTitle = 'New Namespace'
cy.visit('/namespaces')
cy.get('[data-cy="new-namespace"]')
.should('contain', 'New namespace')
.click()
cy.url()
.should('contain', '/namespaces/new')
cy.get('.card-header-title')
.should('contain', 'New namespace')
cy.get('input.input')
.type(newNamespaceTitle)
cy.get('.button')
.contains('Create')
.click()
cy.get('.global-notification')
.should('contain', 'Success')
cy.get('.namespace-container')
.should('contain', newNamespaceTitle)
cy.url()
.should('contain', '/namespaces')
})
it('Should rename the namespace all places', () => {
const newNamespaces = NamespaceFactory.create(5)
const newNamespaceName = 'New namespace name'
cy.visit('/namespaces')
cy.get(`.namespace-container .menu.namespaces-lists .namespace-title:contains(${newNamespaces[0].title}) .dropdown .dropdown-trigger`)
.click()
cy.get('.namespace-container .menu.namespaces-lists .namespace-title .dropdown .dropdown-content')
.contains('Edit')
.click()
cy.url()
.should('contain', '/settings/edit')
cy.get('#namespacetext')
.invoke('val')
.should('equal', newNamespaces[0].title) // wait until the namespace data is loaded
cy.get('#namespacetext')
.type(`{selectall}${newNamespaceName}`)
cy.get('footer.card-footer .button')
.contains('Save')
.click()
cy.get('.global-notification', { timeout: 1000 })
.should('contain', 'Success')
cy.get('.namespace-container .menu.namespaces-lists')
.should('contain', newNamespaceName)
.should('not.contain', newNamespaces[0].title)
cy.get('[data-cy="namespaces-list"]')
.should('contain', newNamespaceName)
.should('not.contain', newNamespaces[0].title)
})
it('Should remove a namespace when deleting it', () => {
const newNamespaces = NamespaceFactory.create(5)
cy.visit('/')
cy.get(`.namespace-container .menu.namespaces-lists .namespace-title:contains(${newNamespaces[0].title}) .dropdown .dropdown-trigger`)
.click()
cy.get('.namespace-container .menu.namespaces-lists .namespace-title .dropdown .dropdown-content')
.contains('Delete')
.click()
cy.url()
.should('contain', '/settings/delete')
cy.get('[data-cy="modalPrimary"]')
.contains('Do it')
.click()
cy.get('.global-notification')
.should('contain', 'Success')
cy.get('.namespace-container .menu.namespaces-lists')
.should('not.contain', newNamespaces[0].title)
})
it('Should not show archived projects & namespaces if the filter is not checked', () => {
const n = NamespaceFactory.create(1, {
id: 2,
is_archived: true,
}, false)
ProjectFactory.create(1, {
id: 2,
namespace_id: n[0].id,
}, false)
ProjectFactory.create(1, {
id: 3,
is_archived: true,
}, false)
// Initial
cy.visit('/namespaces')
cy.get('.namespace')
.should('not.contain', 'Archived')
// Show archived
cy.get('[data-cy="show-archived-check"] label.check span')
.should('be.visible')
.click()
cy.get('[data-cy="show-archived-check"] input')
.should('be.checked')
cy.get('.namespace')
.should('contain', 'Archived')
// Don't show archived
cy.get('[data-cy="show-archived-check"] label.check span')
.should('be.visible')
.click()
cy.get('[data-cy="show-archived-check"] input')
.should('not.be.checked')
// Second time visiting after unchecking
cy.visit('/namespaces')
cy.get('[data-cy="show-archived-check"] input')
.should('not.be.checked')
cy.get('.namespace')
.should('not.contain', 'Archived')
})
})

View File

@ -1,7 +1,9 @@
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'
})

View File

@ -8,30 +8,37 @@ describe('Project History', () => {
prepareProjects()
it('should show a project history on the home page', () => {
cy.intercept(Cypress.env('API_URL') + '/projects*').as('loadProjectArray')
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('@loadProjectArray')
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')

View File

@ -58,6 +58,7 @@ describe('Project View Project', () => {
})
const projects = ProjectFactory.create(2, {
owner_id: '{increment}',
namespace_id: '{increment}',
})
cy.visit(`/projects/${projects[1].id}/`)

View File

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

View File

@ -1,7 +1,6 @@
import {createFakeUserAndLogin} from '../../support/authenticateUser'
import {TaskFactory} from '../../factories/task'
import {ProjectFactory} from '../../factories/project'
import {prepareProjects} from './prepareProjects'
describe('Projects', () => {
@ -11,20 +10,23 @@ describe('Projects', () => {
prepareProjects((newProjects) => (projects = newProjects))
it('Should create a new project', () => {
cy.visit('/projects')
cy.get('.project-header [data-cy=new-project]')
cy.visit('/')
cy.get('.namespace-title .dropdown-trigger')
.click()
cy.get('.namespace-title .dropdown .dropdown-item')
.contains('New project')
.click()
cy.url()
.should('contain', '/projects/new')
.should('contain', '/projects/new/1')
cy.get('.card-header-title')
.contains('New project')
cy.get('input[name=projectTitle]')
cy.get('input.input')
.type('New Project')
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 project is done
.should('contain', 'Success')
cy.url()
.should('contain', '/projects/')
@ -54,9 +56,9 @@ describe('Projects', () => {
cy.get('.project-title')
.should('contain', 'First Project')
cy.get('.menu-container .menu-list li:first-child .dropdown .menu-list-dropdown-trigger')
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child .dropdown .menu-list-dropdown-trigger')
.click()
cy.get('.menu-container .menu-list li:first-child .dropdown .dropdown-content')
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child .dropdown .dropdown-content')
.contains('Edit')
.click()
cy.get('#title')
@ -70,21 +72,21 @@ describe('Projects', () => {
cy.get('.project-title')
.should('contain', newProjectName)
.should('not.contain', projects[0].title)
cy.get('.menu-container .menu-list li:first-child')
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child')
.should('contain', newProjectName)
.should('not.contain', projects[0].title)
cy.visit('/')
cy.get('.project-grid')
cy.get('.card-content')
.should('contain', newProjectName)
.should('not.contain', projects[0].title)
})
it('Should remove a project when deleting it', () => {
it('Should remove a project', () => {
cy.visit(`/projects/${projects[0].id}`)
cy.get('.menu-container .menu-list li:first-child .dropdown .menu-list-dropdown-trigger')
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child .dropdown .menu-list-dropdown-trigger')
.click()
cy.get('.menu-container .menu-list li:first-child .dropdown .dropdown-content')
cy.get('.namespace-container .menu.namespaces-lists .menu-list li:first-child .dropdown .dropdown-content')
.contains('Delete')
.click()
cy.url()
@ -95,15 +97,15 @@ describe('Projects', () => {
cy.get('.global-notification')
.should('contain', 'Success')
cy.get('.menu-container .menu-list')
cy.get('.namespace-container .menu.namespaces-lists .menu-list')
.should('not.contain', projects[0].title)
cy.location('pathname')
.should('equal', '/')
})
it('Should archive a project', () => {
cy.visit(`/projects/${projects[0].id}`)
cy.get('.project-title-dropdown')
.click()
cy.get('.project-title-dropdown .dropdown-menu .dropdown-item')
@ -113,59 +115,10 @@ describe('Projects', () => {
.should('contain.text', 'Archive this project')
cy.get('.modal-content [data-cy=modalPrimary]')
.click()
cy.get('.menu-container .menu-list')
cy.get('.namespace-container .menu.namespaces-lists .menu-list')
.should('not.contain', projects[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.')
})
it('Should show all projects on the projects page', () => {
const projects = ProjectFactory.create(10)
cy.visit('/projects')
projects.forEach(p => {
cy.get('[data-cy="projects-list"]')
.should('contain', p.title)
})
})
it('Should not show archived projects if the filter is not checked', () => {
ProjectFactory.create(1, {
id: 2,
}, false)
ProjectFactory.create(1, {
id: 3,
is_archived: true,
}, false)
// Initial
cy.visit('/projects')
cy.get('.project-grid')
.should('not.contain', 'Archived')
// Show archived
cy.get('[data-cy="show-archived-check"] label span')
.should('be.visible')
.click()
cy.get('[data-cy="show-archived-check"] input')
.should('be.checked')
cy.get('.project-grid')
.should('contain', 'Archived')
// Don't show archived
cy.get('[data-cy="show-archived-check"] label span')
.should('be.visible')
.click()
cy.get('[data-cy="show-archived-check"] input')
.should('not.be.checked')
// Second time visiting after unchecking
cy.visit('/projects')
cy.get('[data-cy="show-archived-check"] input')
.should('not.be.checked')
cy.get('.project-grid')
.should('not.contain', 'Archived')
})
})

View File

@ -3,10 +3,12 @@ import {createFakeUserAndLogin} from '../../support/authenticateUser'
import {ProjectFactory} from '../../factories/project'
import {seed} from '../../support/seed'
import {TaskFactory} from '../../factories/task'
import {NamespaceFactory} from '../../factories/namespace'
import {BucketFactory} from '../../factories/bucket'
import {updateUserSettings} from '../../support/updateUserSettings'
function seedTasks(numberOfTasks = 50, startDueDate = new Date()) {
NamespaceFactory.create(1)
const project = ProjectFactory.create()[0]
BucketFactory.create(1, {
project_id: project.id,
@ -135,7 +137,8 @@ describe('Home Page Task Overview', () => {
cy.visit('/')
cy.get('.home.app-content .content')
.should('contain.text', 'Import your projects and tasks from other services into Vikunja:')
.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:')
})
it('Should not show the cta buttons for new project when there are tasks', () => {

View File

@ -4,6 +4,7 @@ import {TaskFactory} from '../../factories/task'
import {ProjectFactory} from '../../factories/project'
import {TaskCommentFactory} from '../../factories/task_comment'
import {UserFactory} from '../../factories/user'
import {NamespaceFactory} from '../../factories/namespace'
import {UserProjectFactory} from '../../factories/users_project'
import {TaskAssigneeFactory} from '../../factories/task_assignee'
import {LabelFactory} from '../../factories/labels'
@ -46,11 +47,13 @@ function uploadAttachmentAndVerify(taskId: number) {
describe('Task', () => {
createFakeUserAndLogin()
let namespaces
let projects
let buckets
beforeEach(() => {
// UserFactory.create(1)
namespaces = NamespaceFactory.create(1)
projects = ProjectFactory.create(1)
buckets = BucketFactory.create(1, {
project_id: projects[0].id,
@ -93,7 +96,7 @@ describe('Task', () => {
TaskFactory.create(1)
cy.visit('/projects/1/list')
cy.get('.tasks .task .fancycheckbox')
cy.get('.tasks .task .fancycheckbox label.check')
.first()
.click()
cy.get('.global-notification')
@ -107,7 +110,7 @@ describe('Task', () => {
cy.get('.tasks .task .favorite')
.first()
.click()
cy.get('.menu-container')
cy.get('.menu.namespaces-lists')
.should('contain', 'Favorites')
})
@ -130,6 +133,7 @@ describe('Task', () => {
cy.get('.task-view h1.title.task-id')
.should('contain', '#1')
cy.get('.task-view h6.subtitle')
.should('contain', namespaces[0].title)
.should('contain', projects[0].title)
cy.get('.task-view .details.content.description')
.should('contain', tasks[0].description)
@ -256,6 +260,7 @@ describe('Task', () => {
.click()
cy.get('.task-view h6.subtitle')
.should('contain', namespaces[0].title)
.should('contain', projects[1].title)
cy.get('.global-notification')
.should('contain', 'Success')

View File

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

View File

@ -0,0 +1,18 @@
import {faker} from '@faker-js/faker'
import {Factory} from '../support/factory'
export class NamespaceFactory extends Factory {
static table = 'namespaces'
static factory() {
const now = new Date()
return {
id: '{increment}',
title: faker.lorem.words(3),
owner_id: 1,
created: now.toISOString(),
updated: now.toISOString(),
}
}
}

View File

@ -11,6 +11,7 @@ export class ProjectFactory extends Factory {
id: '{increment}',
title: faker.lorem.words(3),
owner_id: 1,
namespace_id: 1,
created: now.toISOString(),
updated: now.toISOString(),
}

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

@ -11,7 +11,5 @@ VIKUNJA_SENTRY_DSN="$(echo "$VIKUNJA_SENTRY_DSN" | sed -r 's/([:;])/\\\1/g')"
sed -ri "s:^(\s*window.API_URL\s*=)\s*.+:\1 '${VIKUNJA_API_URL}':g" /usr/share/nginx/html/index.html
sed -ri "s:^(\s*window.SENTRY_ENABLED\s*=)\s*.+:\1 ${VIKUNJA_SENTRY_ENABLED}:g" /usr/share/nginx/html/index.html
sed -ri "s:^(\s*window.SENTRY_DSN\s*=)\s*.+:\1 '${VIKUNJA_SENTRY_DSN}':g" /usr/share/nginx/html/index.html
sed -ri "s:^(\s*window.PROJECT_INFINITE_NESTING_ENABLED\s*=)\s*.+:\1 '${VIKUNJA_PROJECT_INFINITE_NESTING_ENABLED}':g" /usr/share/nginx/html/index.html
sed -ri "s:^(\s*window.ALLOW_ICON_CHANGES\s*=)\s*.+:\1 '${VIKUNJA_ALLOW_ICON_CHANGES}':g" /usr/share/nginx/html/index.html
date -uIseconds | xargs echo 'info: started at'

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

View File

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

10
env.d.ts vendored
View File

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

View File

@ -2,11 +2,11 @@
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1685498995,
"narHash": "sha256-rdyjnkq87tJp+T2Bm1OD/9NXKSsh/vLlPeqCc/mm7qs=",
"lastModified": 1664753041,
"narHash": "sha256-0ogaD8PaGHluARFeupofvk1Nq9gpVeZdlFM0Kcwguys=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "9cfaa8a1a00830d17487cb60a19bb86f96f09b27",
"rev": "a62844b302507c7531ad68a86cb7aa54704c9cb4",
"type": "github"
},
"original": {

View File

@ -27,11 +27,6 @@
// our sentry instance to notify us of potential problems.
window.SENTRY_ENABLED = false
window.SENTRY_DSN = 'https://85694a2d757547cbbc90cd4b55c5a18d@o1047380.ingest.sentry.io/6024480'
// If enabled, allows the user to nest projects infinitely, instead of the default 2 levels.
// This setting might change in the future or be removed completely.
window.PROJECT_INFINITE_NESTING_ENABLED = false
// Allow changing the logo and other icons based on various occasions throughout the year.
window.ALLOW_ICON_CHANGES = true
</script>
</body>
</html>

Binary file not shown.

Binary file not shown.

View File

@ -13,7 +13,7 @@
},
"homepage": "https://vikunja.io/",
"funding": "https://opencollective.com/vikunja",
"packageManager": "pnpm@8.6.0",
"packageManager": "pnpm@7.29.3",
"keywords": [
"todo",
"productivity",
@ -45,102 +45,103 @@
"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.11.0",
"@kyvg/vue3-notification": "2.9.1",
"@sentry/tracing": "7.54.0",
"@sentry/vue": "7.54.0",
"@vueuse/core": "10.1.2",
"axios": "1.4.0",
"@intlify/unplugin-vue-i18n": "0.9.2",
"@kyvg/vue3-notification": "2.9.0",
"@sentry/tracing": "7.43.0",
"@sentry/vue": "7.43.0",
"@types/is-touch-device": "1.0.0",
"@types/lodash.clonedeep": "4.5.7",
"@types/sortablejs": "1.15.1",
"@vueuse/core": "9.13.0",
"axios": "1.3.4",
"blurhash": "2.0.5",
"bulma-css-variables": "0.9.33",
"camel-case": "4.1.2",
"codemirror": "5.65.13",
"date-fns": "2.30.0",
"dayjs": "1.11.8",
"dompurify": "3.0.3",
"codemirror": "5.65.12",
"date-fns": "2.29.3",
"dayjs": "1.11.7",
"dompurify": "3.0.1",
"easymde": "2.18.0",
"fast-deep-equal": "3.1.3",
"flatpickr": "4.6.13",
"flexsearch": "0.7.31",
"floating-vue": "2.0.0-beta.20",
"highlight.js": "11.8.0",
"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": "5.0.4",
"pinia": "2.0.36",
"marked": "4.2.12",
"pinia": "2.0.33",
"register-service-worker": "1.7.2",
"snake-case": "3.0.4",
"sortablejs": "1.15.0",
"ufo": "1.1.2",
"ufo": "1.1.1",
"vue": "3.2.47",
"vue-advanced-cropper": "2.8.8",
"vue-flatpickr-component": "11.0.3",
"vue-i18n": "9.2.2",
"vue-router": "4.2.2",
"workbox-precaching": "7.0.0",
"vue-router": "4.1.6",
"workbox-precaching": "6.5.4",
"zhyswan-vuedraggable": "4.1.3"
},
"devDependencies": {
"@4tw/cypress-drag-drop": "2.2.4",
"@cypress/vite-dev-server": "5.0.5",
"@cypress/vue": "5.0.5",
"@faker-js/faker": "8.0.2",
"@histoire/plugin-screenshot": "0.16.1",
"@histoire/plugin-vue": "0.16.1",
"@rushstack/eslint-patch": "1.3.0",
"@tsconfig/node18": "2.0.1",
"@4tw/cypress-drag-drop": "2.2.3",
"@cypress/vite-dev-server": "5.0.4",
"@cypress/vue": "5.0.4",
"@faker-js/faker": "7.6.0",
"@histoire/plugin-screenshot": "0.15.8",
"@histoire/plugin-vue": "0.15.8",
"@rushstack/eslint-patch": "1.2.0",
"@types/codemirror": "5.60.7",
"@types/dompurify": "3.0.2",
"@types/dompurify": "3.0.0",
"@types/flexsearch": "0.7.3",
"@types/is-touch-device": "1.0.0",
"@types/focus-within": "1.0.1",
"@types/lodash.debounce": "4.0.7",
"@types/marked": "5.0.0",
"@types/node": "18.16.16",
"@types/marked": "4.0.8",
"@types/node": "18.15.3",
"@types/postcss-preset-env": "7.7.0",
"@types/sortablejs": "1.15.1",
"@typescript-eslint/eslint-plugin": "5.59.8",
"@typescript-eslint/parser": "5.59.8",
"@vitejs/plugin-legacy": "4.0.4",
"@vitejs/plugin-vue": "4.2.3",
"@vue/eslint-config-typescript": "11.0.3",
"@vue/test-utils": "2.3.2",
"@vue/tsconfig": "0.4.0",
"@typescript-eslint/eslint-plugin": "5.55.0",
"@typescript-eslint/parser": "5.55.0",
"@vitejs/plugin-legacy": "4.0.2",
"@vitejs/plugin-vue": "4.1.0",
"@vue/eslint-config-typescript": "11.0.2",
"@vue/test-utils": "2.3.1",
"@vue/tsconfig": "0.1.3",
"autoprefixer": "10.4.14",
"browserslist": "4.21.5",
"caniuse-lite": "1.0.30001489",
"css-has-pseudo": "5.0.2",
"csstype": "3.1.2",
"cypress": "12.13.0",
"esbuild": "0.17.19",
"eslint": "8.42.0",
"eslint-plugin-vue": "9.13.0",
"happy-dom": "9.20.1",
"histoire": "0.16.1",
"postcss": "8.4.24",
"caniuse-lite": "1.0.30001465",
"csstype": "3.1.1",
"cypress": "12.8.1",
"esbuild": "0.17.11",
"eslint": "8.36.0",
"eslint-plugin-vue": "9.9.0",
"happy-dom": "8.9.0",
"histoire": "0.15.8",
"netlify-cli": "13.1.2",
"postcss": "8.4.21",
"postcss-easing-gradients": "3.0.1",
"postcss-easings": "3.0.1",
"postcss-focus-within": "7.0.2",
"postcss-preset-env": "8.4.2",
"rollup": "3.23.1",
"postcss-preset-env": "8.0.1",
"rollup": "3.19.1",
"rollup-plugin-visualizer": "5.9.0",
"sass": "1.62.1",
"sass": "1.59.3",
"start-server-and-test": "2.0.0",
"typescript": "5.1.3",
"vite": "4.3.9",
"typescript": "4.9.5",
"vite": "4.2.0",
"vite-plugin-inject-preload": "1.3.1",
"vite-plugin-pwa": "0.16.3",
"vite-plugin-pwa": "0.14.4",
"vite-svg-loader": "4.0.0",
"vitest": "0.31.4",
"vue-tsc": "1.6.5",
"vitest": "0.29.3",
"vue-tsc": "1.2.0",
"wait-on": "7.0.1",
"workbox-cli": "7.0.0"
"workbox-cli": "6.5.4"
},
"pnpm": {
"patchedDependencies": {

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

Binary file not shown.

View File

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

Before

Width:  |  Height:  |  Size: 420 B

View File

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

View File

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

View File

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

View File

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

View File

@ -4,12 +4,9 @@ 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 Logo = computed(() => window.ALLOW_ICON_CHANGES && now.value.getMonth() === 5 ? LogoFullPride : LogoFull)
const now = useNow()
const Logo = computed(() => now.value.getMonth() === 5 ? LogoFullPride : LogoFull)
</script>
<template>

View File

@ -1,107 +0,0 @@
<template>
<draggable
v-model="availableProjects"
animation="100"
ghostClass="ghost"
group="projects"
@start="() => drag = true"
@end="saveProjectPosition"
handle=".handle"
tag="menu"
item-key="id"
:disabled="!canEditOrder"
:component-data="{
type: 'transition-group',
name: !drag ? 'flip-list' : null,
class: [
'menu-list can-be-hidden',
{ 'dragging-disabled': !canEditOrder }
]
}"
>
<template #item="{element: project}">
<ProjectsNavigationItem
:project="project"
:is-loading="projectUpdating[project.id]"
:can-collapse="canCollapse"
:level="level"
:data-project-id="project.id"
/>
</template>
</draggable>
</template>
<script lang="ts" setup>
import {ref, watch} from 'vue'
import draggable from 'zhyswan-vuedraggable'
import type {SortableEvent} from 'sortablejs'
import ProjectsNavigationItem from '@/components/home/ProjectsNavigationItem.vue'
import {calculateItemPosition} from '@/helpers/calculateItemPosition'
import type {IProject} from '@/modelTypes/IProject'
import {useProjectStore} from '@/stores/projects'
const props = defineProps<{
modelValue?: IProject[],
canEditOrder: boolean,
canCollapse?: boolean,
level?: number,
}>()
const emit = defineEmits<{
(e: 'update:modelValue', projects: IProject[]): void
}>()
const drag = ref(false)
const projectStore = useProjectStore()
// Vue draggable will modify the projects list as it changes their position which will not work on a prop.
// Hence, we'll clone the prop and work on the clone.
const availableProjects = ref<IProject[]>([])
watch(
() => props.modelValue,
projects => {
availableProjects.value = projects || []
},
{immediate: true},
)
const projectUpdating = ref<{ [id: IProject['id']]: boolean }>({})
async function saveProjectPosition(e: SortableEvent) {
if (!e.newIndex && e.newIndex !== 0) return
const projectsActive = availableProjects.value
// 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.
// 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 projectId = parseInt(e.item.dataset.projectId)
const project = projectStore.projects[projectId]
const parentProjectId = e.to.parentNode.dataset.projectId ? parseInt(e.to.parentNode.dataset.projectId) : 0
const projectBefore = projectsActive[newIndex - 1] ?? null
const projectAfter = projectsActive[newIndex + 1] ?? null
projectUpdating.value[project.id] = true
const position = calculateItemPosition(
projectBefore !== null ? projectBefore.position : null,
projectAfter !== null ? projectAfter.position : null,
)
try {
// create a copy of the project in order to not violate pinia manipulation
await projectStore.updateProject({
...project,
position,
parentProjectId,
})
emit('update:modelValue', availableProjects.value)
} finally {
projectUpdating.value[project.id] = false
}
}
</script>

View File

@ -1,156 +0,0 @@
<template>
<li
class="list-menu loader-container is-loading-small"
:class="{'is-loading': isLoading}"
>
<div>
<BaseButton
v-if="canCollapse && childProjects?.length > 0"
@click="childProjectsOpen = !childProjectsOpen"
class="collapse-project-button"
>
<icon icon="chevron-down" :class="{ 'project-is-collapsed': !childProjectsOpen }"/>
</BaseButton>
<BaseButton
:to="{ name: 'project.index', params: { projectId: project.id} }"
class="list-menu-link"
:class="{'router-link-exact-active': currentProject?.id === project.id}"
>
<span
v-if="!canCollapse || childProjects?.length === 0"
class="collapse-project-button-placeholder"
></span>
<div class="color-bubble-handle-wrapper">
<ColorBubble
v-if="project.hexColor !== ''"
:color="project.hexColor"
/>
<span
class="icon menu-item-icon handle lines-handle"
:class="{'has-color-bubble': project.hexColor !== ''}"
>
<icon icon="grip-lines"/>
</span>
</div>
<span class="list-menu-title">{{ getProjectTitle(project) }}</span>
</BaseButton>
<BaseButton
v-if="project.id > 0"
class="favorite"
:class="{'is-favorite': project.isFavorite}"
@click="projectStore.toggleProjectFavorite(project)"
>
<icon :icon="project.isFavorite ? 'star' : ['far', 'star']"/>
</BaseButton>
<ProjectSettingsDropdown
v-if="project.id > 0"
class="menu-list-dropdown"
:project="project"
:level="level"
>
<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>
</div>
<ProjectsNavigation
v-if="canNestDeeper && childProjectsOpen && canCollapse"
:model-value="childProjects"
:can-edit-order="true"
:can-collapse="canCollapse"
:level="level + 1"
/>
</li>
</template>
<script setup lang="ts">
import {computed, ref} from 'vue'
import {useProjectStore} from '@/stores/projects'
import {useBaseStore} from '@/stores/base'
import type {IProject} from '@/modelTypes/IProject'
import BaseButton from '@/components/base/BaseButton.vue'
import ProjectSettingsDropdown from '@/components/project/project-settings-dropdown.vue'
import {getProjectTitle} from '@/helpers/getProjectTitle'
import ColorBubble from '@/components/misc/colorBubble.vue'
import ProjectsNavigation from '@/components/home/ProjectsNavigation.vue'
import {canNestProjectDeeper} from '@/helpers/canNestProjectDeeper'
const props = withDefaults(defineProps<{
project: IProject,
isLoading?: boolean,
canCollapse?: boolean,
level?: number,
}>(), {
level: 0,
})
const projectStore = useProjectStore()
const baseStore = useBaseStore()
const currentProject = computed(() => baseStore.currentProject)
const childProjectsOpen = ref(true)
const childProjects = computed(() => {
if (!canNestDeeper.value) {
return []
}
return projectStore.getChildProjects(props.project.id)
.sort((a, b) => a.position - b.position)
})
const canNestDeeper = computed(() => canNestProjectDeeper(props.level))
</script>
<style lang="scss" scoped>
.list-setting-spacer {
width: 5rem;
flex-shrink: 0;
}
.project-is-collapsed {
transform: rotate(-90deg);
}
.favorite {
transition: opacity $transition, color $transition;
opacity: 0;
&:hover,
&.is-favorite {
opacity: 1;
color: var(--warning);
}
}
.list-menu:hover > div > .favorite {
opacity: 1;
}
.list-menu:hover > div > a > .color-bubble-handle-wrapper > .color-bubble {
opacity: 0;
}
.color-bubble-handle-wrapper {
position: relative;
width: 1rem;
height: 1rem;
display: flex;
align-items: center;
justify-content: flex-start;
margin-right: .25rem;
.color-bubble, .icon {
transition: all $transition;
position: absolute;
width: 12px;
margin: 0 !important;
padding: 0 !important;
}
}
</style>

View File

@ -7,9 +7,8 @@
<MenuButton class="menu-button" />
<div v-if="currentProject?.id" class="project-title-wrapper">
<h1 class="project-title">
{{ currentProject.title === '' ? $t('misc.loading') : getProjectTitle(currentProject) }}
<div v-if="currentProject.id" class="project-title-wrapper">
<h1 class="project-title">{{ currentProject.title === '' ? $t('misc.loading') : getProjectTitle(currentProject) }}
</h1>
<BaseButton :to="{ name: 'project.info', params: { projectId: currentProject.id } }" class="project-title-button">
@ -90,7 +89,7 @@ import { useAuthStore } from '@/stores/auth'
const baseStore = useBaseStore()
const currentProject = computed(() => baseStore.currentProject)
const background = computed(() => baseStore.background)
const canWriteCurrentProject = computed(() => baseStore.currentProject?.maxRight > Rights.READ)
const canWriteCurrentProject = computed(() => baseStore.currentProject.maxRight > Rights.READ)
const menuActive = computed(() => baseStore.menuActive)
const authStore = useAuthStore()

View File

@ -69,7 +69,6 @@ import BaseButton from '@/components/base/BaseButton.vue'
import {useBaseStore} from '@/stores/base'
import {useLabelStore} from '@/stores/labels'
import {useProjectStore} from '@/stores/projects'
import {useRouteWithModal} from '@/composables/useRouteWithModal'
import {useRenewTokenOnFocus} from '@/composables/useRenewTokenOnFocus'
@ -95,13 +94,14 @@ watch(() => route.name as string, (routeName) => {
(
[
'home',
'namespace.edit',
'teams.index',
'teams.edit',
'tasks.range',
'labels.index',
'migrate.start',
'migrate.wunderlist',
'projects.index',
'namespaces.index',
].includes(routeName) ||
routeName.startsWith('user.settings')
)
@ -116,9 +116,6 @@ useRenewTokenOnFocus()
const labelStore = useLabelStore()
labelStore.loadAllLabels()
const projectStore = useProjectStore()
projectStore.loadProjects()
</script>
<style lang="scss" scoped>

View File

@ -9,9 +9,9 @@
<Logo class="logo" v-if="logoVisible"/>
<h1
:class="{'m-0': !logoVisible}"
:style="{ 'opacity': currentProject?.title === '' ? '0': '1' }"
:style="{ 'opacity': currentProject.title === '' ? '0': '1' }"
class="title">
{{ currentProject?.title === '' ? $t('misc.loading') : currentProject?.title }}
{{ currentProject.title === '' ? $t('misc.loading') : currentProject.title }}
</h1>
<div class="box has-text-left view">
<router-view/>

View File

@ -1,10 +1,10 @@
<template>
<aside :class="{'is-active': baseStore.menuActive}" class="menu-container">
<aside :class="{'is-active': menuActive}" class="namespace-container">
<nav class="menu top-menu">
<router-link :to="{name: 'home'}" class="logo">
<Logo width="164" height="48"/>
</router-link>
<menu class="menu-list other-menu-items">
<ul class="menu-list">
<li>
<router-link :to="{ name: 'home'}" v-shortcut="'g o'">
<span class="menu-item-icon icon">
@ -22,11 +22,11 @@
</router-link>
</li>
<li>
<router-link :to="{ name: 'projects.index'}" v-shortcut="'g p'">
<router-link :to="{ name: 'namespaces.index'}" v-shortcut="'g n'">
<span class="menu-item-icon icon">
<icon icon="layer-group"/>
</span>
{{ $t('project.projects') }}
{{ $t('namespace.title') }}
</router-link>
</li>
<li>
@ -45,51 +45,238 @@
{{ $t('team.title') }}
</router-link>
</li>
</menu>
</ul>
</nav>
<Loading
v-if="projectStore.isLoading"
variant="small"
/>
<template v-else>
<nav class="menu" v-if="favoriteProjects">
<ProjectsNavigation :model-value="favoriteProjects" :can-edit-order="false" :can-collapse="false"/>
</nav>
<nav class="menu">
<ProjectsNavigation
:model-value="projects"
:can-edit-order="true"
:can-collapse="true"
:level="1"
/>
</nav>
</template>
<nav class="menu namespaces-lists loader-container is-loading-small" :class="{'is-loading': loading}">
<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)"
class="menu-label"
v-tooltip="namespaceTitles[nk]"
>
<ColorBubble
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}"
>
<icon icon="chevron-down"/>
</div>
<span class="count" :class="{'ml-2 mr-0': n.id > 0}">
({{ namespaceProjectsCount[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"
v-bind="dragOptions"
:modelValue="activeProjects[nk]"
@update:modelValue="(projects) => updateActiveProjects(n, projects)"
group="namespace-lists"
@start="() => drag = true"
@end="saveListPosition"
handle=".handle"
:disabled="n.id < 0 || undefined"
tag="ul"
item-key="id"
:data-namespace-id="n.id"
:data-namespace-index="nk"
:component-data="{
type: 'transition-group',
name: !drag ? 'flip-list' : null,
class: [
'menu-list can-be-hidden',
{ '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}"
>
<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>
</template>
</nav>
<PoweredByLink/>
</aside>
</template>
<script setup lang="ts">
import {computed} from 'vue'
import {ref, computed, onBeforeMount} from 'vue'
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 NamespaceSettingsDropdown from '@/components/namespace/namespace-settings-dropdown.vue'
import PoweredByLink from '@/components/home/PoweredByLink.vue'
import Logo from '@/components/home/Logo.vue'
import Loading from '@/components/misc/loading.vue'
import {calculateItemPosition} from '@/helpers/calculateItemPosition'
import {getNamespaceTitle} from '@/helpers/getNamespaceTitle'
import {getProjectTitle} from '@/helpers/getProjectTitle'
import type {IProject} from '@/modelTypes/IProject'
import type {INamespace} from '@/modelTypes/INamespace'
import ColorBubble from '@/components/misc/colorBubble.vue'
import {useBaseStore} from '@/stores/base'
import {useProjectStore} from '@/stores/projects'
import ProjectsNavigation from '@/components/home/ProjectsNavigation.vue'
import {useNamespaceStore} from '@/stores/namespaces'
const drag = ref(false)
const dragOptions = {
animation: 100,
ghostClass: 'ghost',
}
const baseStore = useBaseStore()
const namespaceStore = useNamespaceStore()
const currentProject = computed(() => baseStore.currentProject)
const menuActive = computed(() => baseStore.menuActive)
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 => {
return typeof item !== 'undefined' && !item.isArchived
})
})
})
const namespaceTitles = computed(() => {
return namespaces.value.map((namespace) => getNamespaceTitle(namespace))
})
const namespaceProjectsCount = computed(() => {
return namespaces.value.map((_, index) => activeProjects.value[index]?.length ?? 0)
})
const projectStore = useProjectStore()
const projects = computed(() => projectStore.notArchivedRootProjects)
const favoriteProjects = computed(() => projectStore.favoriteProjects)
function toggleProjects(namespaceId: INamespace['id']) {
projectsVisible.value[namespaceId] = !projectsVisible.value[namespaceId]
}
const projectsVisible = 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
}
})
})
function updateActiveProjects(namespace: INamespace, activeProjects: IProject[]) {
// 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
// later when showing them anyway, and it makes the merging happening here a lot easier.
const projects = [
...activeProjects,
...namespace.projects.filter(l => l.isArchived),
]
namespaceStore.setNamespaceById({
...namespace,
projects,
})
}
const projectUpdating = ref<{ [id: INamespace['id']]: boolean }>({})
async function saveListPosition(e: SortableEvent) {
if (!e.newIndex && e.newIndex !== 0) return
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.
// 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 position = calculateItemPosition(
projectBefore !== null ? projectBefore.position : null,
projectAfter !== null ? projectAfter.position : null,
)
try {
// create a copy of the project in order to not violate pinia manipulation
await projectStore.updateProject({
...project,
position,
namespaceId,
})
} finally {
projectUpdating.value[project.id] = false
}
}
</script>
<style lang="scss" scoped>
$navbar-padding: 2rem;
$vikunja-nav-background: var(--site-background);
$vikunja-nav-color: var(--grey-700);
$vikunja-nav-selected-width: 0.4rem;
.logo {
display: block;
@ -102,8 +289,8 @@ const favoriteProjects = computed(() => projectStore.favoriteProjects)
}
}
.menu-container {
background: var(--site-background);
.namespace-container {
background: $vikunja-nav-background;
color: $vikunja-nav-color;
padding: 0 0 1rem;
transition: transform $transition-duration ease-in;
@ -114,7 +301,6 @@ const favoriteProjects = computed(() => projectStore.favoriteProjects)
transform: translateX(-100%);
overflow-x: auto;
width: $navbar-width;
margin-top: 1rem;
@media screen and (max-width: $tablet) {
top: 0;
@ -128,24 +314,252 @@ const favoriteProjects = computed(() => projectStore.favoriteProjects)
}
}
.top-menu .menu-list {
li {
font-weight: 600;
font-family: $vikunja-font;
// these are general menu styles
// should be in own components
.menu {
.menu-label,
.menu-list .list-menu-link,
.menu-list a {
display: flex;
align-items: center;
justify-content: space-between;
cursor: pointer;
.color-bubble {
height: 12px;
flex: 0 0 12px;
}
}
.list-menu-link,
li > a {
padding-left: 2rem;
display: inline-block;
.menu-list {
li {
height: 44px;
display: flex;
align-items: center;
.icon {
padding-bottom: .25rem;
&:hover {
background: var(--white);
}
.menu-list-dropdown {
opacity: 1;
transition: $transition;
}
@media(hover: hover) and (pointer: fine) {
.menu-list-dropdown {
opacity: 0;
}
&:hover .menu-list-dropdown {
opacity: 1;
}
}
}
.menu-item-icon {
color: var(--grey-400);
}
.menu-list-dropdown-trigger {
display: flex;
padding: 0.5rem;
}
.flip-list-move {
transition: transform $transition-duration;
}
.ghost {
background: var(--grey-200);
* {
opacity: 0;
}
}
a:hover {
background: transparent;
}
.list-menu-link,
li > a {
color: $vikunja-nav-color;
padding: 0.75rem .5rem 0.75rem ($navbar-padding * 1.5 - 1.75rem);
transition: all 0.2s ease;
border-radius: 0;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
width: 100%;
border-left: $vikunja-nav-selected-width solid transparent;
&:hover {
border-left: $vikunja-nav-selected-width solid var(--primary);
}
&.router-link-exact-active {
color: var(--primary);
border-left: $vikunja-nav-selected-width solid var(--primary);
}
.icon {
height: 1rem;
vertical-align: middle;
padding-right: 0.5rem;
}
&.router-link-exact-active .icon:not(.handle) {
color: var(--primary);
}
.handle {
opacity: 0;
transition: opacity $transition;
margin-right: .25rem;
}
&:hover .handle {
opacity: 1;
}
}
&:not(.dragging-disabled) .handle {
cursor: grab;
}
}
}
.menu + .menu {
.top-menu {
margin-top: math.div($navbar-padding, 2);
.menu-list {
li {
font-weight: 600;
font-family: $vikunja-font;
}
.list-menu-link,
li > a {
padding-left: 2rem;
display: inline-block;
.icon {
padding-bottom: .25rem;
}
}
}
}
.namespaces-lists {
padding-top: math.div($navbar-padding, 2);
.menu-label {
font-size: 1rem;
font-weight: 700;
font-weight: bold;
font-family: $vikunja-font;
color: $vikunja-nav-color;
font-weight: 600;
min-height: 2.5rem;
padding-top: 0;
padding-left: $navbar-padding;
overflow: hidden;
margin-bottom: 0;
flex: 1 1 auto;
.name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-right: auto;
}
.count {
color: var(--grey-500);
margin-right: .5rem;
// align brackets with number
font-feature-settings: "case";
}
}
.favorite {
margin-left: .25rem;
transition: opacity $transition, color $transition;
opacity: 1;
&.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;
}
}
.list-menu-title {
overflow: hidden;
text-overflow: ellipsis;
width: 100%;
}
.color-bubble {
width: 14px;
height: 14px;
flex-basis: auto;
}
.is-archived {
min-width: 85px;
}
}
.namespace-title {
display: flex;
align-items: center;
justify-content: space-between;
color: $vikunja-nav-color;
padding: 0 .25rem;
.toggle-lists-icon {
svg {
transition: all $transition;
transform: rotate(90deg);
opacity: 1;
}
&.active svg {
transform: rotate(0deg);
opacity: 0;
}
}
&:hover .toggle-lists-icon svg {
opacity: 1;
}
&:not(.has-menu) .toggle-lists-icon {
padding-right: 1rem;
}
}
.list-setting-spacer {
width: 2.5rem;
flex-shrink: 0;
}
.namespaces-list.loader-container.is-loading {
min-height: calc(100vh - #{$navbar-height + 1.5rem + 1rem + 1.5rem});
}
</style>

View File

@ -0,0 +1,63 @@
<template>
<multiselect
v-model="selectedNamespaces"
:search-results="foundNamespaces"
:loading="namespaceService.loading"
:multiple="true"
:placeholder="$t('namespace.search')"
label="namespace"
@search="findNamespaces"
/>
</template>
<script setup lang="ts">
import {computed, ref, shallowReactive, watchEffect, type PropType} from 'vue'
import Multiselect from '@/components/input/multiselect.vue'
import type {INamespace} from '@/modelTypes/INamespace'
import NamespaceService from '@/services/namespace'
import {includesById} from '@/helpers/utils'
const props = defineProps({
modelValue: {
type: Array as PropType<INamespace[]>,
default: () => [],
},
})
const emit = defineEmits<{
(e: 'update:modelValue', value: INamespace[]): void
}>()
const namespaces = ref<INamespace[]>([])
watchEffect(() => {
namespaces.value = props.modelValue
})
const selectedNamespaces = computed({
get() {
return namespaces.value
},
set: (value) => {
namespaces.value = value
emit('update:modelValue', value)
},
})
const namespaceService = shallowReactive(new NamespaceService())
const foundNamespaces = ref<INamespace[]>([])
async function findNamespaces(query: string) {
if (query === '') {
foundNamespaces.value = []
return
}
const response = await namespaceService.getAll({}, {s: query}) as INamespace[]
// Filter selected items from the results
foundNamespaces.value = response.filter(({id}) => !includesById(namespaces.value, id))
}
</script>

View File

@ -158,12 +158,7 @@ const flatPickerConfig = computed(() => ({
// Since flatpickr dates are strings, we need to convert them to native date objects.
// To make that work, we need a separate variable since flatpickr does not have a change event.
const flatPickrDate = computed({
set(newValue: string | Date | null) {
if (newValue === null) {
date.value = null
return
}
set(newValue: string | Date) {
date.value = createDateFromString(newValue)
updateData()
},

View File

@ -4,7 +4,7 @@
<vue-easymde
:configs="config"
@change="() => bubbleNow()"
@change="() => bubble()"
@update:modelValue="handleInput"
class="content"
v-if="isEditActive"
@ -35,7 +35,7 @@
</BaseButton>
<BaseButton
v-else-if="isEditActive"
@click="bubbleSaveClick"
@click="toggleEdit"
class="done-edit">
{{ $t('misc.save') }}
</BaseButton>
@ -56,7 +56,7 @@
</ul>
<x-button
v-else-if="isEditActive"
@click="bubbleSaveClick"
@click="toggleEdit"
variant="secondary"
:shadow="false"
v-cy="'saveEditor'">
@ -84,8 +84,8 @@ import {createRandomID} from '@/helpers/randomId'
import BaseButton from '@/components/base/BaseButton.vue'
import ButtonLink from '@/components/misc/ButtonLink.vue'
import type {IAttachment} from '@/modelTypes/IAttachment'
import type {ITask} from '@/modelTypes/ITask'
import type { IAttachment } from '@/modelTypes/IAttachment'
import type { ITask } from '@/modelTypes/ITask'
const props = defineProps({
modelValue: {
@ -115,7 +115,7 @@ const props = defineProps({
default: true,
},
bottomActions: {
type: Array,
type: Array,
default: () => [],
},
emptyText: {
@ -134,9 +134,10 @@ const props = defineProps({
},
})
const emit = defineEmits(['update:modelValue', 'save'])
const emit = defineEmits(['update:modelValue'])
const text = ref('')
const changeTimeout = ref<ReturnType<typeof setTimeout> | null>(null)
const isEditActive = ref(false)
const isPreviewActive = ref(true)
@ -147,7 +148,7 @@ const preview = ref('')
const attachmentService = new AttachmentService()
type CacheKey = `${ITask['id']}-${IAttachment['id']}`
const loadedAttachments = ref<{ [key: CacheKey]: string }>({})
const loadedAttachments = ref<{[key: CacheKey]: string}>({})
const config = ref(createEasyMDEConfig({
placeholder: props.placeholder,
uploadImage: props.uploadEnabled,
@ -174,7 +175,7 @@ watch(
if (oldVal === '' && text.value === modelValue.value) {
return
}
bubbleNow()
bubble()
},
)
@ -207,11 +208,17 @@ function handleInput(val: string) {
}
text.value = val
bubbleNow()
bubble(1000)
}
function bubbleNow() {
emit('update:modelValue', text.value)
function bubble(timeout = 500) {
if (changeTimeout.value !== null) {
clearTimeout(changeTimeout.value)
}
changeTimeout.value = setTimeout(() => {
emit('update:modelValue', text.value)
}, timeout)
}
function replaceAt(str: string, index: number, replacement: string) {
@ -280,26 +287,24 @@ function handleCheckboxClick(e: Event) {
return
}
const projectPrefix = text.value.substring(index, index + 1)
console.debug({index, projectPrefix, checked, text: text.value})
text.value = replaceAt(text.value, index, `${projectPrefix} ${checked ? '[x]' : '[ ]'} `)
bubbleNow()
emit('save', text.value)
bubble()
renderPreview()
}
function toggleEdit() {
isPreviewActive.value = false
isEditActive.value = true
}
function bubbleSaveClick() {
isPreviewActive.value = true
isEditActive.value = false
renderPreview()
bubbleNow()
emit('save', text.value)
if (isEditActive.value) {
isPreviewActive.value = true
isEditActive.value = false
renderPreview()
bubble(0) // save instantly
} else {
isPreviewActive.value = false
isEditActive.value = true
}
}
</script>

View File

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

View File

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

View File

@ -24,12 +24,12 @@
}"
>
<div :class="{'content': hasContent}">
<slot/>
<slot />
</div>
</div>
<footer v-if="$slots.footer" class="card-footer">
<slot name="footer"/>
<slot name="footer" />
</footer>
</div>
</template>
@ -76,27 +76,22 @@ defineEmits(['close'])
<style lang="scss" scoped>
.card {
background-color: var(--white);
border-radius: $radius;
margin-bottom: 1rem;
border: 1px solid var(--card-border-color);
box-shadow: var(--shadow-sm);
@media print {
box-shadow: none;
border: none;
}
background-color: var(--white);
border-radius: $radius;
margin-bottom: 1rem;
border: 1px solid var(--card-border-color);
box-shadow: var(--shadow-sm);
}
.card-header {
box-shadow: none;
border-bottom: 1px solid var(--card-border-color);
border-radius: $radius $radius 0 0;
box-shadow: none;
border-bottom: 1px solid var(--card-border-color);
border-radius: $radius $radius 0 0;
}
.card-footer {
background-color: var(--grey-50);
border-top: 0;
background-color: var(--grey-50);
border-top: 0;
padding: var(--modal-card-head-padding);
display: flex;
justify-content: flex-end;

View File

@ -44,8 +44,8 @@ export const KEYBOARD_SHORTCUTS : ShortcutGroup[] = [
combination: 'then',
},
{
title: 'keyboardShortcuts.navigation.projects',
keys: ['g', 'p'],
title: 'keyboardShortcuts.navigation.namespaces',
keys: ['g', 'n'],
combination: 'then',
},
{
@ -140,18 +140,6 @@ export const KEYBOARD_SHORTCUTS : ShortcutGroup[] = [
title: 'keyboardShortcuts.task.description',
keys: ['e'],
},
{
title: 'keyboardShortcuts.task.priority',
keys: ['p'],
},
{
title: 'keyboardShortcuts.task.delete',
keys: ['shift', 'delete'],
},
{
title: 'keyboardShortcuts.task.favorite',
keys: ['s'],
},
],
},
]
]

View File

@ -1,21 +1,13 @@
<template>
<div class="loader-container is-loading" :class="{'is-small': variant === 'small'}"></div>
<div class="loader-container is-loading"></div>
</template>
<script lang="ts">
export default {
inheritAttrs: true,
inheritAttrs: false,
}
</script>
<script lang="ts" setup>
const {
variant = 'default',
} = defineProps<{
variant?: 'default' | 'small'
}>()
</script>
<style scoped lang="scss">
.loader-container {
height: 100%;
@ -28,18 +20,5 @@ const {
min-height: 50px;
min-width: 100px;
}
&.is-small {
min-width: 100%;
height: 150px;
&.is-loading::after {
width: 3rem;
height: 3rem;
top: calc(50% - 1.5rem);
left: calc(50% - 1.5rem);
border-width: 3px;
}
}
}
</style>

View File

@ -193,17 +193,16 @@ $modal-width: 1024px;
}
.close {
$close-button-min-space: 84px;
$close-button-padding: 26px;
position: fixed;
top: 5px;
right: $close-button-padding;
color: var(--grey-900);
font-size: 2rem;
@media screen and (min-width: $desktop) and (max-width: calc(#{$desktop } + #{$close-button-min-space})) {
top: calc(5px + $modal-margin);
right: 50%;
right: 50%;
// we align the close button to the modal until there is enough space outside for it
transform: translateX(calc((#{$modal-width} / 2) - #{$close-button-padding}));
}

View File

@ -47,7 +47,7 @@ import {success} from '@/message'
import type { IconProp } from '@fortawesome/fontawesome-svg-core'
const props = defineProps({
entity: String as ISubscription['entity'],
entity: String,
entityId: Number,
isButton: {
type: Boolean,
@ -73,6 +73,12 @@ 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 === 'task' && subscriptionEntity.value === 'namespace') {
return t('task.subscription.subscribedTaskThroughParentNamespace')
}
if (props.entity === 'task' && subscriptionEntity.value === 'project') {
return t('task.subscription.subscribedTaskThroughParentProject')
}
@ -81,6 +87,10 @@ const tooltipText = computed(() => {
}
switch (props.entity) {
case 'namespace':
return props.modelValue !== null ?
t('task.subscription.subscribedNamespace') :
t('task.subscription.notSubscribedNamespace')
case 'project':
return props.modelValue !== null ?
t('task.subscription.subscribedProject') :
@ -120,6 +130,9 @@ async function subscribe() {
let message = ''
switch (props.entity) {
case 'namespace':
message = t('task.subscription.subscribeSuccessNamespace')
break
case 'project':
message = t('task.subscription.subscribeSuccessProject')
break
@ -140,6 +153,9 @@ async function unsubscribe() {
let message = ''
switch (props.entity) {
case 'namespace':
message = t('task.subscription.unsubscribeSuccessNamespace')
break
case 'project':
message = t('task.subscription.unsubscribeSuccessProject')
break

View File

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

View File

@ -0,0 +1,103 @@
<template>
<dropdown>
<template #trigger="triggerProps">
<slot name="trigger" v-bind="triggerProps">
<BaseButton class="dropdown-trigger" @click="triggerProps.toggleOpen">
<icon icon="ellipsis-h" class="icon"/>
</BaseButton>
</slot>
</template>
<template v-if="namespace.isArchived">
<dropdown-item
:to="{ name: 'namespace.settings.archive', params: { id: namespace.id } }"
icon="archive"
>
{{ $t('menu.unarchive') }}
</dropdown-item>
</template>
<template v-else>
<dropdown-item
:to="{ name: 'namespace.settings.edit', params: { id: namespace.id } }"
icon="pen"
>
{{ $t('menu.edit') }}
</dropdown-item>
<dropdown-item
:to="{ name: 'namespace.settings.share', params: { namespaceId: namespace.id } }"
icon="share-alt"
>
{{ $t('menu.share') }}
</dropdown-item>
<dropdown-item
:to="{ name: 'project.create', params: { namespaceId: namespace.id } }"
icon="plus"
>
{{ $t('menu.newProject') }}
</dropdown-item>
<dropdown-item
:to="{ name: 'namespace.settings.archive', params: { id: namespace.id } }"
icon="archive"
>
{{ $t('menu.archive') }}
</dropdown-item>
<Subscription
class="has-no-shadow"
:is-button="false"
entity="namespace"
:entity-id="namespace.id"
:model-value="subscription"
@update:model-value="setSubscriptionInStore"
type="dropdown"
/>
<dropdown-item
:to="{ name: 'namespace.settings.delete', params: { id: namespace.id } }"
icon="trash-alt"
class="has-text-danger"
>
{{ $t('menu.delete') }}
</dropdown-item>
</template>
</dropdown>
</template>
<script setup lang="ts">
import {ref, onMounted, type PropType} from 'vue'
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 {INamespace} from '@/modelTypes/INamespace'
import type {ISubscription} from '@/modelTypes/ISubscription'
import {useNamespaceStore} from '@/stores/namespaces'
const props = defineProps({
namespace: {
type: Object as PropType<INamespace>,
required: true,
},
})
const namespaceStore = useNamespaceStore()
const subscription = ref<ISubscription | null>(null)
onMounted(() => {
subscription.value = props.namespace.subscription
})
function setSubscriptionInStore(sub: ISubscription) {
subscription.value = sub
namespaceStore.setNamespaceById({
...props.namespace,
subscription: sub,
})
}
</script>
<style scoped lang="scss">
.dropdown-trigger {
padding: 0.5rem;
display: flex;
}
</style>

View File

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

View File

@ -1,13 +1,9 @@
<template>
<div
:class="{ 'is-loading': projectService.loading, 'is-archived': currentProject?.isArchived}"
:class="{ 'is-loading': projectService.loading, 'is-archived': currentProject.isArchived}"
class="loader-container"
>
<h1 class="project-title-print">
{{ getProjectTitle(currentProject) }}
</h1>
<div class="switch-view-container d-print-none">
<div class="switch-view-container">
<div class="switch-view">
<BaseButton
v-shortcut="'g l'"
@ -49,8 +45,8 @@
<slot name="header" />
</div>
<CustomTransition name="fade">
<Message variant="warning" v-if="currentProject?.isArchived" class="mb-4">
{{ $t('project.archivedMessage') }}
<Message variant="warning" v-if="currentProject.isArchived" class="mb-4">
{{ $t('project.archived') }}
</Message>
</CustomTransition>
@ -102,7 +98,7 @@ const currentProject = computed(() => {
maxRight: null,
} : baseStore.currentProject
})
useTitle(() => currentProject.value?.id ? getProjectTitle(currentProject.value) : '')
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.
@ -122,7 +118,7 @@ watch(
(
projectIdToLoad === loadedProjectId.value ||
typeof projectIdToLoad === 'undefined' ||
projectIdToLoad === currentProject.value?.id
projectIdToLoad === currentProject.value.id
)
&& typeof currentProject.value !== 'undefined' && currentProject.value.maxRight !== null
) {
@ -134,8 +130,8 @@ watch(
// 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.projects[projectData.id]
if (projectFromStore) {
const projectFromStore = projectStore.getProjectById(projectData.id)
if (projectFromStore !== null) {
baseStore.setBackground(null)
baseStore.setBlurHash(null)
baseStore.handleSetCurrentProject({project: projectFromStore})
@ -201,15 +197,4 @@ watch(
.is-archived .notification.is-warning {
margin-bottom: 1rem;
}
.project-title-print {
display: none;
font-size: 1.75rem;
text-align: center;
margin-bottom: .5rem;
@media print {
display: block;
}
}
</style>

View File

@ -15,7 +15,7 @@
:class="{'is-visible': background}"
:style="{'background-image': background !== null ? `url(${background})` : undefined}"
/>
<span v-if="project.isArchived" class="is-archived" >{{ $t('project.archived') }}</span>
<span v-if="project.isArchived" class="is-archived" >{{ $t('namespace.archived') }}</span>
<div class="project-title" aria-hidden="true">{{ project.title }}</div>
<BaseButton

View File

@ -147,7 +147,6 @@
<label class="label">{{ $t('task.attributes.labels') }}</label>
<div class="control labels-list">
<edit-labels
:creatable="false"
v-model="entities.labels"
@update:model-value="changeLabelFilter"
/>
@ -166,6 +165,16 @@
/>
</div>
</div>
<div class="field">
<label class="label">{{ $t('namespace.namespaces') }}</label>
<div class="control">
<SelectNamespace
v-model="entities.namespace"
@select="changeMultiselectFilter('namespace', 'namespace')"
@remove="changeMultiselectFilter('namespace', 'namespace')"
/>
</div>
</div>
</template>
</card>
</template>
@ -180,6 +189,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 {useLabelStore} from '@/stores/labels'
@ -191,6 +201,7 @@ 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 SelectNamespace from '@/components/input/SelectNamespace.vue'
import {parseDateOrString} from '@/helpers/time/parseDateOrString'
import {dateIsValid, formatISO} from '@/helpers/time/formatDate'
@ -198,6 +209,7 @@ import {objectToSnakeCase} from '@/helpers/case'
import UserService from '@/services/user'
import ProjectService from '@/services/project'
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'
@ -228,6 +240,7 @@ const DEFAULT_FILTERS = {
assignees: '',
labels: '',
project_id: '',
namespace: '',
} as const
const props = defineProps({
@ -252,20 +265,23 @@ const filters = ref({...DEFAULT_FILTERS})
const services = {
users: shallowReactive(new UserService()),
projects: shallowReactive(new ProjectService()),
namespace: shallowReactive(new NamespaceService()),
}
interface Entities {
users: IUser[]
labels: ILabel[]
projects: IProject[]
namespace: INamespace[]
}
type EntityType = 'users' | 'labels' | 'projects'
type EntityType = 'users' | 'labels' | 'projects' | 'namespace'
const entities: Entities = reactive({
users: [],
labels: [],
projects: [],
namespace: [],
})
onMounted(() => {
@ -312,6 +328,7 @@ function prepareFilters() {
prepareDate('reminders')
prepareRelatedObjectFilter('users', 'assignees')
prepareRelatedObjectFilter('projects', 'project_id')
prepareRelatedObjectFilter('namespace')
prepareSingleValue('labels')

View File

@ -72,13 +72,6 @@
@update:model-value="setSubscriptionInStore"
type="dropdown"
/>
<dropdown-item
v-if="level < 2"
:to="{ name: 'project.createFromParent', params: { parentProjectId: project.id } }"
icon="layer-group"
>
{{ $t('menu.createProject') }}
</dropdown-item>
<dropdown-item
:to="{ name: 'project.settings.delete', params: { projectId: project.id } }"
icon="trash-alt"
@ -103,18 +96,17 @@ import type {ISubscription} from '@/modelTypes/ISubscription'
import {isSavedFilter} from '@/services/savedFilter'
import {useConfigStore} from '@/stores/config'
import {useProjectStore} from '@/stores/projects'
import {useNamespaceStore} from '@/stores/namespaces'
const props = defineProps({
project: {
type: Object as PropType<IProject>,
required: true,
},
level: {
type: Number,
},
})
const projectStore = useProjectStore()
const namespaceStore = useNamespaceStore()
const subscription = ref<ISubscription | null>(null)
watchEffect(() => {
subscription.value = props.project.subscription ?? null
@ -130,5 +122,6 @@ function setSubscriptionInStore(sub: ISubscription) {
subscription: sub,
}
projectStore.setProject(updatedProject)
namespaceStore.setProjectInNamespaceById(updatedProject)
}
</script>

View File

@ -61,6 +61,7 @@ import {useRouter} from 'vue-router'
import TaskService from '@/services/task'
import TeamService from '@/services/team'
import NamespaceModel from '@/models/namespace'
import TeamModel from '@/models/team'
import ProjectModel from '@/models/project'
@ -69,6 +70,7 @@ import QuickAddMagic from '@/components/tasks/partials/quick-add-magic.vue'
import {useBaseStore} from '@/stores/base'
import {useProjectStore} from '@/stores/projects'
import {useNamespaceStore} from '@/stores/namespaces'
import {useLabelStore} from '@/stores/labels'
import {useTaskStore} from '@/stores/tasks'
@ -79,6 +81,7 @@ 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'
const {t} = useI18n({useScope: 'global'})
@ -86,6 +89,7 @@ const router = useRouter()
const baseStore = useBaseStore()
const projectStore = useProjectStore()
const namespaceStore = useNamespaceStore()
const labelStore = useLabelStore()
const taskStore = useTaskStore()
@ -101,6 +105,7 @@ enum ACTION_TYPE {
enum COMMAND_TYPE {
NEW_TASK = 'newTask',
NEW_PROJECT = 'newProject',
NEW_NAMESPACE = 'newNamespace',
NEW_TEAM = 'newTeam',
}
@ -142,15 +147,24 @@ const foundProjects = computed(() => {
return []
}
const ncache: { [id: ProjectModel['id']]: INamespace } = {}
const history = getHistory()
const allProjects = [
...new Set([
...history.map((l) => projectStore.projects[l.id]),
...history.map((l) => projectStore.getProjectById(l.id)),
...projectStore.searchProject(project),
]),
]
return allProjects.filter(l => Boolean(l))
return allProjects.filter((l) => {
if (typeof l === 'undefined' || l === null) {
return false
}
if (typeof ncache[l.namespaceId] === 'undefined') {
ncache[l.namespaceId] = namespaceStore.getNamespaceById(l.namespaceId)
}
return !ncache[l.namespaceId].isArchived
})
})
// FIXME: use fuzzysearch
@ -191,6 +205,7 @@ const results = computed<Result[]>(() => {
const loading = computed(() =>
taskService.loading ||
namespaceStore.isLoading ||
projectStore.isLoading ||
teamService.loading,
)
@ -215,6 +230,12 @@ const commands = computed<{ [key in COMMAND_TYPE]: Command }>(() => ({
placeholder: t('quickActions.newProject'),
action: newProject,
},
newNamespace: {
type: COMMAND_TYPE.NEW_NAMESPACE,
title: t('quickActions.cmds.newNamespace'),
placeholder: t('quickActions.newNamespace'),
action: newNamespace,
},
newTeam: {
type: COMMAND_TYPE.NEW_TEAM,
title: t('quickActions.cmds.newTeam'),
@ -231,6 +252,7 @@ const currentProject = computed(() => Object.keys(baseStore.currentProject).leng
)
const hintText = computed(() => {
let namespace
if (selectedCmd.value !== null && currentProject.value !== null) {
switch (selectedCmd.value.type) {
case COMMAND_TYPE.NEW_TASK:
@ -238,7 +260,12 @@ const hintText = computed(() => {
title: currentProject.value.title,
})
case COMMAND_TYPE.NEW_PROJECT:
return t('quickActions.createProject')
namespace = namespaceStore.getNamespaceById(
currentProject.value.namespaceId,
)
return t('quickActions.createProject', {
title: namespace?.title,
})
}
}
const prefixes =
@ -251,7 +278,7 @@ const availableCmds = computed(() => {
if (currentProject.value !== null) {
cmds.push(commands.value.newTask, commands.value.newProject)
}
cmds.push(commands.value.newTeam)
cmds.push(commands.value.newNamespace, commands.value.newTeam)
return cmds
})
@ -369,7 +396,7 @@ function searchTasks() {
const r = await taskService.getAll({}, params) as DoAction<ITask>[]
foundTasks.value = r.map((t) => {
t.type = ACTION_TYPE.TASK
const project = projectStore.projects[t.projectId]
const project = projectStore.getProjectById(t.projectId)
if (project !== null) {
t.title = `${t.title} (${project.title})`
}
@ -477,10 +504,21 @@ async function newProject() {
if (currentProject.value === null) {
return
}
await projectStore.createProject(new ProjectModel({
const newProject = await projectStore.createProject(new ProjectModel({
title: query.value,
namespaceId: currentProject.value.namespaceId,
}))
success({ message: t('project.create.createdSuccess')})
await router.push({
name: 'project.index',
params: { projectId: newProject.id },
})
}
async function newNamespace() {
const newNamespace = new NamespaceModel({ title: query.value })
await namespaceStore.createNamespace(newNamespace)
success({ message: t('namespace.create.success') })
}
async function newTeam() {

View File

@ -139,6 +139,10 @@ import {ref, reactive, computed, shallowReactive, type Ref} from 'vue'
import type {PropType} from 'vue'
import {useI18n} from 'vue-i18n'
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'
@ -147,6 +151,10 @@ import UserService from '@/services/user'
import UserModel, { getDisplayName } from '@/models/user'
import type {IUser} from '@/modelTypes/IUser'
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'
@ -162,15 +170,13 @@ import Nothing from '@/components/misc/nothing.vue'
import {success} from '@/message'
import {useAuthStore} from '@/stores/auth'
// FIXME: I think this whole thing can now only manage user/team sharing for projects? Maybe remove a little generalization?
const props = defineProps({
type: {
type: String as PropType<'project'>,
type: String as PropType<'project' | 'namespace'>,
default: '',
},
shareType: {
type: String as PropType<'user' | 'team'>,
type: String as PropType<'user' | 'team' | 'namespace'>,
default: '',
},
id: {
@ -185,9 +191,9 @@ const props = defineProps({
const {t} = useI18n({useScope: 'global'})
// This user service is a userProjectService, depending on the type we are using
let stuffService: UserProjectService | TeamProjectService
let stuffModel: IUserProject | ITeamProject
// 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
let searchService: UserService | TeamService
let sharable: Ref<IUser | ITeam>
@ -225,6 +231,10 @@ const sharableName = computed(() => {
return t('project.list.title')
}
if (props.shareType === 'namespace') {
return t('namespace.namespace')
}
return ''
})
@ -237,6 +247,11 @@ if (props.shareType === 'user') {
if (props.type === 'project') {
stuffService = shallowReactive(new UserProjectService())
stuffModel = reactive(new UserProjectModel({projectId: props.id}))
} else if (props.type === 'namespace') {
stuffService = shallowReactive(new UserNamespaceService())
stuffModel = reactive(new UserNamespaceModel({
namespaceId: props.id,
}))
} else {
throw new Error('Unknown type: ' + props.type)
}
@ -249,6 +264,11 @@ if (props.shareType === 'user') {
if (props.type === 'project') {
stuffService = shallowReactive(new TeamProjectService())
stuffModel = reactive(new TeamProjectModel({projectId: props.id}))
} else if (props.type === 'namespace') {
stuffService = shallowReactive(new TeamNamespaceService())
stuffModel = reactive(new TeamNamespaceModel({
namespaceId: props.id,
}))
} else {
throw new Error('Unknown type: ' + props.type)
}

View File

@ -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'
@ -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() &&

View File

@ -74,13 +74,9 @@
@update:model-value="
() => {
toggleEdit(c)
editCommentWithDelay()
editComment()
}
"
@save="() => {
toggleEdit(c)
editComment()
}"
:bottom-actions="actions[c.id]"
:show-save="true"
/>
@ -283,26 +279,10 @@ function toggleDelete(commentId: ITaskComment['id']) {
commentToDelete.id = commentId
}
const changeTimeout = ref<ReturnType<typeof setTimeout> | null>(null)
async function editCommentWithDelay() {
if (changeTimeout.value !== null) {
clearTimeout(changeTimeout.value)
}
changeTimeout.value = setTimeout(async () => {
await editComment()
}, 5000)
}
async function editComment() {
if (commentEdit.comment === '') {
return
}
if (changeTimeout.value !== null) {
clearTimeout(changeTimeout.value)
}
saving.value = commentEdit.id

View File

@ -25,8 +25,7 @@
:show-save="true"
edit-shortcut="e"
v-model="task.description"
@update:model-value="saveWithDelay"
@save="save"
@update:model-value="save"
/>
</div>
</template>
@ -41,6 +40,7 @@ import type {ITask} from '@/modelTypes/ITask'
import {useTaskStore} from '@/stores/tasks'
import TaskModel from '@/models/task'
const props = defineProps({
modelValue: {
type: Object as PropType<ITask>,
@ -74,23 +74,7 @@ watch(
{immediate: true},
)
const changeTimeout = ref<ReturnType<typeof setTimeout> | null>(null)
async function saveWithDelay() {
if (changeTimeout.value !== null) {
clearTimeout(changeTimeout.value)
}
changeTimeout.value = setTimeout(async () => {
await save()
}, 5000)
}
async function save() {
if (changeTimeout.value !== null) {
clearTimeout(changeTimeout.value)
}
saving.value = true
try {

View File

@ -7,7 +7,7 @@
:search-results="foundLabels"
@select="addLabel"
label="title"
:creatable="creatable"
:creatable="true"
@create="createAndAddLabel"
:create-placeholder="$t('task.label.createPlaceholder')"
v-model="labels"
@ -65,10 +65,6 @@ const props = defineProps({
disabled: {
default: false,
},
creatable: {
type: Boolean,
default: true,
},
})
const emit = defineEmits(['update:modelValue'])

View File

@ -113,7 +113,7 @@ async function save(title: string) {
<style lang="scss" scoped>
.heading {
display: flex;
justify-content: space-between;
justify-content: flex-start;
text-transform: none;
align-items: center;
@ -134,6 +134,10 @@ async function save(title: string) {
@media screen and (max-width: $tablet) {
margin: 0 -.3rem .5rem -.3rem; // the title has 0.3rem padding - this make the text inside of it align with the rest
}
@media screen and (min-width: $tablet) and (max-width: #{$desktop + $close-button-min-space}) {
width: calc(100% - 5rem);
}
}
.title.task-id {

View File

@ -11,10 +11,8 @@
@search="findProjects"
>
<template #searchResult="{option}">
<span class="has-text-grey" v-if="projectStore.getAncestors(option).length > 1">
{{ projectStore.getAncestors(option).filter(p => p.id !== option.id).map(p => getProjectTitle(p)).join(' &gt; ') }} &gt;
</span>
{{ getProjectTitle(option) }}
<span class="project-namespace-title search-result">{{ namespace((option as IProject).namespaceId) }} ></span>
{{ (option as IProject).title }}
</template>
</Multiselect>
</template>
@ -22,11 +20,13 @@
<script lang="ts" setup>
import {reactive, ref, watch} from 'vue'
import type {PropType} from 'vue'
import {useI18n} from 'vue-i18n'
import type {IProject} from '@/modelTypes/IProject'
import type {INamespace} from '@/modelTypes/INamespace'
import {useProjectStore} from '@/stores/projects'
import {getProjectTitle} from '@/helpers/getProjectTitle'
import {useNamespaceStore} from '@/stores/namespaces'
import ProjectModel from '@/models/project'
@ -40,6 +40,8 @@ const props = defineProps({
})
const emit = defineEmits(['update:modelValue'])
const {t} = useI18n({useScope: 'global'})
const project: IProject = reactive(new ProjectModel())
watch(
@ -52,6 +54,7 @@ watch(
)
const projectStore = useProjectStore()
const namespaceStore = useNamespaceStore()
const foundProjects = ref<IProject[]>([])
function findProjects(query: string) {
if (query === '') {
@ -67,4 +70,17 @@ function select(l: IProject | null) {
Object.assign(project, l)
emit('update:modelValue', project)
}
function namespace(namespaceId: INamespace['id']) {
const namespace = namespaceStore.getNamespaceById(namespaceId)
return namespace !== null
? namespace.title
: t('project.shared')
}
</script>
<style lang="scss" scoped>
.project-namespace-title {
color: var(--grey-500);
}
</style>

View File

@ -46,6 +46,11 @@
class="different-project"
v-if="task.projectId !== projectId"
>
<span
v-if="task.differentNamespace !== null"
v-tooltip="$t('task.relation.differentNamespace')">
{{ task.differentNamespace }} >
</span>
<span
v-if="task.differentProject !== null"
v-tooltip="$t('task.relation.differentProject')">
@ -96,6 +101,11 @@
class="different-project"
v-if="t.projectId !== projectId"
>
<span
v-if="t.differentNamespace !== null"
v-tooltip="$t('task.relation.differentNamespace')">
{{ t.differentNamespace }} >
</span>
<span
v-if="t.differentProject !== null"
v-tooltip="$t('task.relation.differentProject')">
@ -158,9 +168,10 @@ import BaseButton from '@/components/base/BaseButton.vue'
import Multiselect from '@/components/input/multiselect.vue'
import Fancycheckbox from '@/components/input/fancycheckbox.vue'
import {useNamespaceStore} from '@/stores/namespaces'
import {error, success} from '@/message'
import {useTaskStore} from '@/stores/tasks'
import {useProjectStore} from '@/stores/projects'
const props = defineProps({
taskId: {
@ -185,7 +196,7 @@ const props = defineProps({
})
const taskStore = useTaskStore()
const projectStore = useProjectStore()
const namespaceStore = useNamespaceStore()
const route = useRoute()
const {t} = useI18n({useScope: 'global'})
@ -219,15 +230,26 @@ async function findTasks(newQuery: string) {
foundTasks.value = await taskService.getAll({}, {s: newQuery})
}
const getProjectAndNamespaceById = (projectId: number) => namespaceStore.getProjectAndNamespaceById(projectId, true)
const namespace = computed(() => getProjectAndNamespaceById(props.projectId)?.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 = projectStore.projects[task.ProjectId]
const {
project,
namespace: taskNamespace,
} = getProjectAndNamespaceById(task.projectId) || {project: null, namespace: null}
return {
...task,
differentNamespace:
(taskNamespace !== null &&
taskNamespace.id !== namespace.value.id &&
taskNamespace?.title) || null,
differentProject:
(project &&
(project !== null &&
task.projectId !== props.projectId &&
project?.title) || null,
}
@ -420,6 +442,5 @@ async function toggleTaskDone(task: ITask) {
.task-done-checkbox {
padding: 0;
height: 18px; // The exact height of the checkbox in the container
margin-right: .75rem;
}
</style>

View File

@ -1,25 +1,28 @@
<template>
<div :class="{'is-loading': taskService.loading}" class="task loader-container">
<router-link
:to="taskDetailRoute"
:class="{'is-loading': taskService.loading}"
class="task loader-container"
>
<fancycheckbox
:disabled="(isArchived || disabled) && !canMarkAsDone"
@update:model-value="markAsDone"
@change="markAsDone"
v-model="task.done"
/>
<ColorBubble
v-if="showProjectColor && projectColor !== '' && currentProject?.id !== task.projectId"
v-if="showProjectColor && projectColor !== '' && currentProject.id !== task.projectId"
:color="projectColor"
class="mr-1"
/>
<router-link
:to="taskDetailRoute"
:class="{ 'done': task.done, 'show-project': showProject && project}"
<div
:class="{ 'done': task.done, 'show-project': showProject && project !== null}"
class="tasktext"
>
<span>
<router-link
v-if="showProject && typeof project !== 'undefined'"
v-if="showProject && project !== null"
:to="{ name: 'project.list', params: { projectId: task.projectId } }"
class="task-project"
:class="{'mr-2': task.hexColor !== ''}"
@ -34,7 +37,7 @@
/>
<!-- Show any parent tasks to make it clear this task is a sub task of something -->
<span class="parent-tasks" v-if="typeof task.relatedTasks?.parenttask !== 'undefined'">
<span class="parent-tasks" v-if="typeof task.relatedTasks.parenttask !== 'undefined'">
<template v-for="(pt, i) in task.relatedTasks.parenttask">
{{ pt.title }}<template v-if="(i + 1) < task.relatedTasks.parenttask.length">,&nbsp;</template>
</template>
@ -93,7 +96,7 @@
</span>
<checklist-summary :task="task"/>
</router-link>
</div>
<progress
class="progress is-small"
@ -104,7 +107,7 @@
</progress>
<router-link
v-if="!showProject && currentProject?.id !== task.projectId && project"
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})"
@ -114,14 +117,14 @@
<BaseButton
:class="{'is-favorite': task.isFavorite}"
@click="toggleFavorite"
@click.prevent="toggleFavorite"
class="favorite"
>
<icon icon="star" v-if="task.isFavorite"/>
<icon :icon="['far', 'star']" v-else/>
</BaseButton>
<slot />
</div>
</router-link>
</template>
<script setup lang="ts">
@ -149,6 +152,7 @@ import {formatDateSince, formatISO, formatDateLong} from '@/helpers/time/formatD
import {success} from '@/message'
import {useProjectStore} from '@/stores/projects'
import {useNamespaceStore} from '@/stores/namespaces'
import {useBaseStore} from '@/stores/base'
import {useTaskStore} from '@/stores/tasks'
@ -208,9 +212,10 @@ onBeforeUnmount(() => {
const baseStore = useBaseStore()
const projectStore = useProjectStore()
const taskStore = useTaskStore()
const namespaceStore = useNamespaceStore()
const project = computed(() => projectStore.projects[task.value.projectId])
const projectColor = computed(() => project.value ? project.value?.hexColor : '')
const project = computed(() => projectStore.getProjectById(task.value.projectId))
const projectColor = computed(() => project.value !== null ? project.value.hexColor : '')
const currentProject = computed(() => {
return typeof baseStore.currentProject === 'undefined' ? {
@ -255,8 +260,10 @@ function undoDone(checked: boolean) {
}
async function toggleFavorite() {
task.value = await taskStore.toggleFavorite(task.value)
task.value.isFavorite = !task.value.isFavorite
task.value = await taskService.update(task.value)
emit('task-updated', task.value)
namespaceStore.loadNamespacesIfFavoritesDontExist()
}
const deferDueDate = ref<typeof DeferTask | null>(null)
@ -281,7 +288,11 @@ function hideDeferDueDatePopup(e) {
border-radius: $radius;
border: 2px solid transparent;
color: var(--text);
transition: color ease $transition-duration;
&:hover {
color: var(--grey-900);
background-color: var(--grey-100);
}
@ -327,15 +338,6 @@ function hideDeferDueDatePopup(e) {
}
a {
color: var(--text);
transition: color ease $transition-duration;
&:hover {
color: var(--grey-900);
}
}
.favorite {
opacity: 1;
text-align: center;

View File

@ -1,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)

View File

@ -0,0 +1,19 @@
import {ref, computed} from 'vue'
import {useNamespaceStore} from '@/stores/namespaces'
export function useNamespaceSearch() {
const query = ref('')
const namespaceStore = useNamespaceStore()
const namespaces = computed(() => namespaceStore.searchNamespace(query.value))
function findNamespaces(newQuery: string) {
query.value = newQuery
}
return {
namespaces,
findNamespaces,
}
}

View File

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

View File

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

View File

@ -1,7 +0,0 @@
export function canNestProjectDeeper(level: number) {
if (level < 2) {
return true
}
return level >= 2 && window.PROJECT_INFINITE_NESTING_ENABLED
}

View File

@ -6,16 +6,16 @@ export const ERROR_NO_API_URL = 'noApiUrlProvided'
export const checkAndSetApiUrl = (url: string): Promise<string> => {
if (url.startsWith('/')) {
if(url.startsWith('/')) {
url = window.location.host + url
}
// Check if the url has 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)
@ -41,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
@ -57,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()
@ -64,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') &&
@ -85,7 +118,7 @@ export const checkAndSetApiUrl = (url: string): Promise<string> => {
localStorage.setItem('API_URL', window.API_URL)
return window.API_URL
}
throw new Error(ERROR_NO_API_URL)
})
}

View File

@ -0,0 +1,15 @@
import {i18n} from '@/i18n'
import type {INamespace} from '@/modelTypes/INamespace'
export const getNamespaceTitle = (n: INamespace) => {
if (n.id === -1) {
return i18n.global.t('namespace.pseudo.sharedProjects.title')
}
if (n.id === -2) {
return i18n.global.t('namespace.pseudo.favorites.title')
}
if (n.id === -3) {
return i18n.global.t('namespace.pseudo.savedFilters.title')
}
return n.title
}

View File

@ -1,14 +1,9 @@
import {i18n} from '@/i18n'
import type {IProject} from '@/modelTypes/IProject'
export function getProjectTitle(project: IProject) {
if (project.id === -1) {
export function getProjectTitle(l: IProject) {
if (l.id === -1) {
return i18n.global.t('project.pseudo.favorites.title')
}
if (project.title === 'Inbox') {
return i18n.global.t('project.inboxTitle')
}
return project.title
return l.title
}

View File

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

View File

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

View File

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

View File

@ -15,7 +15,7 @@ export const SUPPORTED_LOCALES = {
'pt-PT': 'Português',
'zh-CN': 'Chinese',
'no-NO': 'Norsk Bokmål',
} as 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
}

View File

@ -6,7 +6,9 @@
"welcomeEvening": "Good Evening {username}!",
"lastViewed": "Last viewed",
"project": {
"importText": "Import your projects and tasks from other services into Vikunja:",
"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"
}
},
@ -141,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 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, projects, 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.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Export your Vikunja data",
"description": "You can request a copy of all your Vikunja data. This includes 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, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Please enter your password to proceed:",
"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.",
@ -163,18 +165,14 @@
}
},
"project": {
"archivedMessage": "This project is archived. It is not possible to create new or edit tasks for it.",
"archived": "Archived",
"showArchived": "Show Archived",
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
"title": "Project Title",
"color": "Color",
"projects": "Projects",
"parent": "Parent Project",
"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.",
"inboxTitle": "Inbox",
"create": {
"header": "New project",
"titlePlaceholder": "The project's title goes here…",
@ -212,7 +210,7 @@
"duplicate": {
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a parent project which should hold the duplicated project:",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
@ -323,6 +321,67 @@
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"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.",
"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.",
"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.",
"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."
},
"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!",
"success": "The namespace was successfully deleted."
},
"edit": {
"title": "Edit \"{namespace}\"",
"success": "The namespace was successfully updated."
},
"share": {
"title": "Share \"{namespace}\""
},
"attributes": {
"title": "Namespace Title",
"titlePlaceholder": "The namespace title goes here…",
"description": "Description",
"descriptionPlaceholder": "The namespaces description goes here…",
"color": "Color",
"archived": "Is Archived",
"isArchived": "This namespace is archived"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Favorites"
},
"savedFilters": {
"title": "Filters"
}
}
},
"filters": {
"title": "Filters",
"clear": "Clear Filters",
@ -344,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.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
@ -470,7 +529,7 @@
"code": "Code",
"quote": "Quote",
"unorderedList": "Unordered List",
"orderedList": "Ordered List",
"orderedList ": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Image",
@ -507,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -615,13 +674,19 @@
"updated": "Updated"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
"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",
"subscribeSuccessTask": "You are now subscribed to this task",
@ -698,6 +763,7 @@
"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.",
"differentNamespace": "This task belongs to a different namespace.",
"noneYet": "No task relations yet.",
"delete": "Delete Task Relation",
"deleteText1": "Are you sure you want to delete this task relation?",
@ -782,19 +848,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 shared with this team. This CANNOT BE UNDONE!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "The team was successfully deleted."
},
"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 this team has access to. This CANNOT BE UNDONE!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "The user was successfully deleted from the team."
},
"leave": {
"title": "Leave team",
"text1": "Are you sure you want to leave this team?",
"text2": "You will lose access to all projects this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "You have successfully left the team."
}
},
@ -828,10 +894,7 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
"description": "Toggle editing of the task description"
},
"project": {
"title": "Project Views",
@ -844,9 +907,9 @@
"title": "Navigation",
"overview": "Navigate to overview",
"upcoming": "Navigate to upcoming tasks",
"namespaces": "Navigate to namespaces & projects",
"labels": "Navigate to labels",
"teams": "Navigate to teams",
"projects": "Navigate to projects"
"teams": "Navigate to teams"
}
},
"update": {
@ -861,8 +924,7 @@
"unarchive": "Un-Archive",
"setBackground": "Set background",
"share": "Share",
"newProject": "New project",
"createProject": "Create project"
"newProject": "New project"
},
"apiConfig": {
"url": "Vikunja URL",
@ -881,7 +943,7 @@
"notification": {
"title": "Notifications",
"none": "You don't have any notifications. Have a nice day!",
"explainer": "Notifications will appear here when actions projects or tasks you subscribed to happen."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Commands",
@ -892,12 +954,14 @@
"teams": "Teams",
"newProject": "Enter the title of the new project…",
"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",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "New task",
"newProject": "New project",
"newNamespace": "New namespace",
"newTeam": "New team"
}
},
@ -953,9 +1017,16 @@
"4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatenator.",
"4019": "Invalid task filter value.",
"5001": "The namespace does not exist.",
"5003": "You do not have access to the specified namespace.",
"5006": "The namespace name cannot be empty.",
"5009": "You need to have namespace read access to perform that action.",
"5010": "This team does not have access to that namespace.",
"5011": "This user has already access to that namespace.",
"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 project.",
"6004": "The team already has access to that namespace or project.",
"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.",
@ -982,4 +1053,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -6,7 +6,9 @@
"welcomeEvening": "Dobrý večer {username}!",
"lastViewed": "Naposledy zobrazeno",
"project": {
"importText": "Import your projects and tasks from other services into Vikunja:",
"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"
}
},
@ -141,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 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, projects, tasks and everything associated with it.",
"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.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Exportovat data účtu",
"description": "You can request a copy of all your Vikunja data. This includes 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, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Pokračujte zadáním vašeho hesla:",
"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.",
@ -163,18 +165,14 @@
}
},
"project": {
"archivedMessage": "This project is archived. It is not possible to create new or edit tasks for it.",
"archived": "Archived",
"showArchived": "Show Archived",
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
"title": "Project Title",
"color": "Color",
"projects": "Projects",
"parent": "Parent Project",
"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.",
"inboxTitle": "Inbox",
"create": {
"header": "New project",
"titlePlaceholder": "The project's title goes here…",
@ -212,7 +210,7 @@
"duplicate": {
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a parent project which should hold the duplicated project:",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
@ -323,6 +321,67 @@
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"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.",
"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.",
"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.",
"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."
},
"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!",
"success": "Prostor byl úspěšně smazán."
},
"edit": {
"title": "Upravit \"{namespace}\"",
"success": "Prostor byl úspěšně aktualizován."
},
"share": {
"title": "Sdílet \"{namespace}\""
},
"attributes": {
"title": "Název prostoru",
"titlePlaceholder": "Název seznamu přijde sem…",
"description": "Popis",
"descriptionPlaceholder": "Popis seznamu přijde sem…",
"color": "Barva",
"archived": "Archivováno",
"isArchived": "Tento prostor je archivován"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Oblíbené"
},
"savedFilters": {
"title": "Filtry"
}
}
},
"filters": {
"title": "Filtry",
"clear": "Vymazat filtry",
@ -344,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.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Vytvořit uložený filtr",
"titleRequired": "Please provide a title for the filter."
},
@ -470,7 +529,7 @@
"code": "Kód",
"quote": "Citace",
"unorderedList": "Seznam s odrážkami",
"orderedList": "Ordered List",
"orderedList ": "Ordered List",
"cleanBlock": "Čistý blok",
"link": "Odkaz",
"image": "Obrázek",
@ -507,14 +566,14 @@
"canuse": "Můžete použít vzorec pro filtrování podle relativních datumů.",
"learnhow": "Podívejte se, jak to funguje",
"title": "Datumový vzorec",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Datumový vzorec umožňuje určit relativní data, která jsou při použití filtru vyřešena za běhu Vikunjou.",
"expression": "Každý datumový matematický výraz začíná datem ukotvení, které může být buď {0}, nebo datový řetězec končící {1}. Po tomto ukotvení může volitelně následovat jeden nebo více matematických výrazů.",
"similar": "Tyto výrazy jsou podobné výrazům poskytnutým {0} a {1}.",
"add1Day": "Přidat jeden den",
"minus1Day": "Odečíst jeden den",
"roundDay": "Zaokrouhlit dolů na nejbližší den",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"supportedUnits": "Podporované časové jednotky jsou:",
"someExamples": "Některé příklady časových výrazů:",
"units": {
"seconds": "Sekundy",
"minutes": "Minuty",
@ -615,13 +674,19 @@
"updated": "Aktualizováno"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "Zde se nemůžete odhlásit, protože jste přihlášeni k odběru tohoto úkolu prostřednictvím jeho prostoru.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "Nyní jste přihlášeni k odběru tohoto prostoru a budete dostávat oznámení o změnách.",
"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.",
"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",
"subscribeSuccessTask": "Nyní jste přihlášeni k tomuto úkolu",
@ -698,6 +763,7 @@
"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.",
"differentNamespace": "Tento úkol patří do jiného prostoru.",
"noneYet": "Zatím žádné vztahy mezi úkoly.",
"delete": "Odstranit vztah k úloze",
"deleteText1": "Jste si jisti, že chcete odstranit tento vztah úkolu?",
@ -782,19 +848,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 shared with this team. This CANNOT BE UNDONE!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "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 this team has access to. This CANNOT BE UNDONE!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "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 this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "Úspěšně jste opustili tým."
}
},
@ -828,10 +894,7 @@
"color": "Změnit barvu tohoto úkolu",
"move": "Move this task to another project",
"reminder": "Spravovat připomenutí této úlohy",
"description": "Přepnout úpravy popisu úkolu",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
"description": "Přepnout úpravy popisu úkolu"
},
"project": {
"title": "Project Views",
@ -844,9 +907,9 @@
"title": "Navigace",
"overview": "Přejít na přehled",
"upcoming": "Přejít na nadcházející úkoly",
"namespaces": "Navigate to namespaces & projects",
"labels": "Přejít na štítky",
"teams": "Přejít na týmy",
"projects": "Navigate to projects"
"teams": "Přejít na týmy"
}
},
"update": {
@ -861,8 +924,7 @@
"unarchive": "Zrušit archivaci",
"setBackground": "Nastavit pozadí",
"share": "Sdílet",
"newProject": "New project",
"createProject": "Create project"
"newProject": "New project"
},
"apiConfig": {
"url": "Vikunja URL",
@ -881,7 +943,7 @@
"notification": {
"title": "Oznámení",
"none": "Nemáte žádná oznámení. Mějte příjemný den!",
"explainer": "Notifications will appear here when actions projects or tasks you subscribed to happen."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Příkazy",
@ -892,12 +954,14 @@
"teams": "Týmy",
"newProject": "Enter the title of the new project…",
"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",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "Nový úkol",
"newProject": "New project",
"newNamespace": "Nový prostor",
"newTeam": "Nový tým"
}
},
@ -953,9 +1017,16 @@
"4017": "Neplatný komparátor filtru úkolů.",
"4018": "Neplatné zřetězení filtru úkolů.",
"4019": "Neplatná hodnota filtru úkolů.",
"5001": "Prostor neexistuje.",
"5003": "Nemáte přístup ke zvolenému prostoru.",
"5006": "Název prostoru nemůže být prázdný.",
"5009": "Pro provedení této akce musíte mít k prostoru přístup ke čtení.",
"5010": "Tento tým nemá k tomuto prostoru přístup.",
"5011": "Tento uživatel již má přístup k tomuto prostoru.",
"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 project.",
"6004": "The team already has access to that namespace or project.",
"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.",
@ -982,4 +1053,4 @@
"frontendVersion": "Verze frontendu: {version}",
"apiVersion": "Verze API: {version}"
}
}
}

View File

@ -6,7 +6,9 @@
"welcomeEvening": "Godaften {username}!",
"lastViewed": "Sidst vist",
"project": {
"importText": "Import your projects and tasks from other services into Vikunja:",
"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"
}
},
@ -141,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 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, projects, tasks and everything associated with it.",
"text2": "For at fortsætte, skal du indtaste din adgangskode. Du vil modtage en e-mail med yderligere instruktioner.",
"confirm": "Slet min konto",
"requestSuccess": "Anmodningen blev gennemført. Du vil modtage en e-mail med yderligere instruktioner.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Eksporter dine Vikunja-data",
"description": "You can request a copy of all your Vikunja data. This includes 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, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Indtast venligst din adgangskode for at fortsætte:",
"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.",
@ -163,18 +165,14 @@
}
},
"project": {
"archivedMessage": "This project is archived. It is not possible to create new or edit tasks for it.",
"archived": "Archived",
"showArchived": "Show Archived",
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
"title": "Project Title",
"color": "Color",
"projects": "Projects",
"parent": "Parent Project",
"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.",
"inboxTitle": "Inbox",
"create": {
"header": "New project",
"titlePlaceholder": "The project's title goes here…",
@ -212,7 +210,7 @@
"duplicate": {
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a parent project which should hold the duplicated project:",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
@ -323,6 +321,67 @@
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"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.",
"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.",
"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.",
"success": "Navneområdet blev arkiveret.",
"unarchiveSuccess": "Navneområdet blev tilbagekaldt.",
"description": "If a namespace is archived, you cannot create new projects or edit it."
},
"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!",
"success": "Navneområdet blev slettet."
},
"edit": {
"title": "Rediger \"{namespace}\"",
"success": "Navneområdet blev opdateret."
},
"share": {
"title": "Del \"{namespace}\""
},
"attributes": {
"title": "Navneområde Titel",
"titlePlaceholder": "Navneområdets titel skrives her…",
"description": "Beskrivelse",
"descriptionPlaceholder": "Navneområdets beskrivelse skrives her…",
"color": "Farve",
"archived": "Er Arkiveret",
"isArchived": "Dette navneområde er arkiveret"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Favoritter"
},
"savedFilters": {
"title": "Filtre"
}
}
},
"filters": {
"title": "Filtre",
"clear": "Ryd Filtre",
@ -344,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.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Opret nyt gemt filter",
"titleRequired": "Please provide a title for the filter."
},
@ -470,7 +529,7 @@
"code": "Kode",
"quote": "Citat",
"unorderedList": "Usorteret liste",
"orderedList": "Ordered List",
"orderedList ": "Ordered List",
"cleanBlock": "Ryd Blok",
"link": "Link",
"image": "Billede",
@ -507,14 +566,14 @@
"canuse": "Du kan bruge datomatematik til at filtrere for relative datoer.",
"learnhow": "Se hvordan det virker",
"title": "Datomatematik",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Dato Matematik giver dig mulighed for at angive relative datoer, som er løst løbende af Vikunja, når du anvender filteret.",
"expression": "Hver Datomatematik udtryk starter med en ankerdato, som enten kan være {0} eller en datostreng, der slutter med {1}. Denneanker dato kan eventuelt efterfølges af en eller flere matematik udtryk.",
"similar": "Disse udtryk ligner dem fra {0} og {1}.",
"add1Day": "Læg en dag til",
"minus1Day": "Træk en dag fra",
"roundDay": "Rund ned til nærmeste dag",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"supportedUnits": "Understøttede tidsenheder er:",
"someExamples": "Eksempler på tidsudtryk:",
"units": {
"seconds": "Sekunder",
"minutes": "Minutter",
@ -615,13 +674,19 @@
"updated": "Opdateret"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "Du kan ikke afmelde dig her, fordi du abonnerer på denne opgave gennem dens navneområde.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "Du abonnerer i øjeblikket på dette navneområde og vil modtage notifikationer om ændringer.",
"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.",
"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",
"subscribeSuccessTask": "Du abonnerer nu på denne opgave",
@ -698,6 +763,7 @@
"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.",
"differentNamespace": "Denne opgave hører til et andet navneområde.",
"noneYet": "Ingen opgaverelationer endnu.",
"delete": "Slet Opgaverelation",
"deleteText1": "Er du sikker på, at du vil slette denne opgaverelation?",
@ -782,19 +848,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 shared with this team. This CANNOT BE UNDONE!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "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 this team has access to. This CANNOT BE UNDONE!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "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 this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "Du har forladt holdet."
}
},
@ -828,10 +894,7 @@
"color": "Skift farven på denne opgave",
"move": "Move this task to another project",
"reminder": "Administrer påmindelser om denne opgave",
"description": "Slå redigering af opgavebeskrivelse til/fra",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
"description": "Slå redigering af opgavebeskrivelse til/fra"
},
"project": {
"title": "Project Views",
@ -844,9 +907,9 @@
"title": "Navigation",
"overview": "Gå til oversigt",
"upcoming": "Gå til kommende opgaver",
"namespaces": "Navigate to namespaces & projects",
"labels": "Naviger til etiketter",
"teams": "Naviger til hold",
"projects": "Navigate to projects"
"teams": "Naviger til hold"
}
},
"update": {
@ -861,8 +924,7 @@
"unarchive": "Tilbagekald",
"setBackground": "Indstil baggrund",
"share": "Del",
"newProject": "New project",
"createProject": "Create project"
"newProject": "New project"
},
"apiConfig": {
"url": "Vikunja URL",
@ -881,7 +943,7 @@
"notification": {
"title": "Notifikationer",
"none": "Du har ingen notifikationer. Hav en dejlig dag!",
"explainer": "Notifications will appear here when actions projects or tasks you subscribed to happen."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Kommandoer",
@ -892,12 +954,14 @@
"teams": "Hold",
"newProject": "Enter the title of the new project…",
"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",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "Ny Opgave",
"newProject": "New project",
"newNamespace": "Nyt navneområde",
"newTeam": "Nyt hold"
}
},
@ -953,9 +1017,16 @@
"4017": "Ugyldig komparator til opgavefilter.",
"4018": "Ugyldig sammenkædning til opgavefilter.",
"4019": "Ugyldig værdi til opgavefilter.",
"5001": "Navneområdet findes ikke.",
"5003": "Du har ikke adgang til det angivne navneområde.",
"5006": "Navneområdets navn må ikke være tomt.",
"5009": "Du skal have navneområde læseadgang for at udføre denne handling.",
"5010": "Dette hold har ikke adgang til dette navneområde.",
"5011": "Denne bruger har allerede adgang til dette navneområde.",
"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 project.",
"6004": "The team already has access to that namespace or project.",
"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.",
@ -982,4 +1053,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -6,8 +6,10 @@
"welcomeEvening": "Guten Abend, {username}!",
"lastViewed": "Zuletzt angesehen",
"project": {
"importText": "Importiere deine Projekte und Aufgaben aus anderen Diensten in Vikunja:",
"import": "Importiere deine Daten in Vikunja"
"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"
}
},
"404": {
@ -83,7 +85,7 @@
"weekStartSunday": "Sonntag",
"weekStartMonday": "Montag",
"language": "Sprache",
"defaultProject": "Standard-Projekt",
"defaultProject": "Default Project",
"timezone": "Zeitzone",
"overdueTasksRemindersTime": "Zeit der E-Mail-Zusammenfassung der überfälligen Aufgaben"
},
@ -141,7 +143,7 @@
},
"deletion": {
"title": "Lösche deinen Vikunja-Account",
"text1": "Das Löschen deines Accounts ist dauerhaft und unwiderruflich. Alle Projekte, Aufgaben und zugehörige Daten werden gelöscht.",
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
"text2": "Zum Fortfahren gib bitte dein Passwort ein. Du erhältst eine E-Mail mit weiteren Anweisungen.",
"confirm": "Meinen Account löschen",
"requestSuccess": "Die Anfrage war erfolgreich. Du erhältst eine E-Mail mit weiteren Anweisungen.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Exportiere deine Vikunja-Daten",
"description": "Du kannst eine Kopie deiner Daten bei Vikunja anfordern. Dazu gehören Projekte, Aufgaben und alles, was damit zusammenhängt. Du kannst diese Daten dann in jeder Vikunja-Instanz über die Migrationsfunktion importieren.",
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Bitte gib dein Passwort ein, um fortzufahren:",
"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.",
@ -163,163 +165,220 @@
}
},
"project": {
"archivedMessage": "Dieses Projekt ist archiviert. Es ist nicht möglich, neue Aufgaben zu erstellen oder es zu bearbeiten.",
"archived": "Archiviert",
"showArchived": "Archivierte anzeigen",
"title": "Projekttitel",
"color": "Farbe",
"projects": "Projekte",
"parent": "Übergeordnetes Projekt",
"search": "Tippe, um nach einem Projekt zu suchen…",
"searchSelect": "Klicke oder drücke die Eingabetaste, um dieses Projekt auszuwählen",
"shared": "Geteilte Projekte",
"noDescriptionAvailable": "Keine Projektbeschreibung verfügbar.",
"inboxTitle": "Eingang",
"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.",
"create": {
"header": "Neues Projekt",
"titlePlaceholder": "Der Titel des Projekts kommt hier hin…",
"addTitleRequired": "Bitte gebe einen Titel an.",
"createdSuccess": "Das Projekt wurde erfolgreich erstellt.",
"addProjectRequired": "Bitte gebe ein Projekt an oder lege ein Standard-Projekt in den Einstellungen fest."
"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."
},
"archive": {
"title": "„{project}“ archivieren",
"archive": "Dieses Projekt archivieren",
"unarchive": "Archivierung dieses Projekts aufheben",
"unarchiveText": "Du wirst neue Aufgaben erstellen oder sie bearbeiten können.",
"archiveText": "Du kannst dieses Projekt nicht bearbeiten oder neue Aufgaben erstellen, bis du die Archivierung aufhebst.",
"success": "Das Projekt wurde erfolgreich archiviert."
"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."
},
"background": {
"title": "Projekthintergrund festlegen",
"remove": "Hintergrund entfernen",
"upload": "Wähle einen Hintergrund von deinem Computer",
"searchPlaceholder": "Nach einem Hintergrund suchen…",
"title": "Set project background",
"remove": "Remove Background",
"upload": "Choose a background from your pc",
"searchPlaceholder": "Search for a background…",
"poweredByUnsplash": "Powered by Unsplash",
"loadMore": "Weitere Bilder laden",
"success": "Der Hintergrund wurde erfolgreich eingestellt!",
"removeSuccess": "Der Hintergrund wurde erfolgreich entfernt!"
"loadMore": "Load more photos",
"success": "The background has been set successfully!",
"removeSuccess": "The background has been removed successfully!"
},
"delete": {
"title": "„{project}“ löschen",
"header": "Dieses Projekt löschen",
"text1": "Bist du sicher, dass du dieses Projekt und alle seine Inhalte löschen willst?",
"text2": "Dies umfasst alle Aufgaben und kann NICHT rückgängig gemacht werden!",
"success": "Das Projekt wurde erfolgreich gelöscht.",
"tasksToDelete": "Dies löscht unwiderruflich ca. {count} Aufgaben.",
"noTasksToDelete": "Dieses Projekt enthält keine Aufgaben, es kann sicher gelöscht werden."
"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."
},
"duplicate": {
"title": "Dupliziere dieses Projekt",
"label": "Duplizieren",
"text": "Wähle ein übergeordnetes Projekt aus, welches das duplizierte Projekt enthalten soll:",
"success": "Das Projekt wurde erfolgreich dupliziert."
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
"header": "Dieses Projekt bearbeiten",
"title": "„{project}“ bearbeiten",
"titlePlaceholder": "Der Titel des Projekts kommt hier hin…",
"identifierTooltip": "Der Projektbezeichner kann zur eindeutigen Identifizierung einer Aufgabe über mehrere Projekte hinweg verwendet werden. Du kannst ihn auf leer setzen, um ihn zu deaktivieren.",
"identifier": "Projektbezeichner",
"identifierPlaceholder": "Der Projektbezeichner kommt hierhin…",
"description": "Beschreibung",
"descriptionPlaceholder": "Projektbeschreibung eingeben…",
"color": "Farbe",
"success": "Das Projekt wurde erfolgreich aktualisiert."
"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."
},
"share": {
"header": "Projekt teilen",
"title": "„{project}“ teilen",
"share": "Teilen",
"header": "Share this project",
"title": "Share \"{project}\"",
"share": "Share",
"links": {
"title": "Linkfreigaben",
"what": "Was ist eine Linkfreigabe?",
"explanation": "Mit Linkfreigaben kannst Projekt du Listen mit Benutzer:innen ohne Vikunja-Account teilen.",
"create": "Erstelle ein neue Linkfreigabe",
"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": "z.B. Lorem Ipsum",
"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 festgelegt",
"remove": "Linkfreigabe entfernen",
"removeText": "Bist du sicher, dass du diese Linkfreigabe unwiderruflich löschen möchtest? Über die Linkfreigabe ist danach der Zugriff auf dieses Projekt nicht mehr möglich!",
"createSuccess": "Die Linkfreigabe wurde erfolgreich erstellt.",
"deleteSuccess": "Die Linkfreigabe wurde erfolgreich gelöscht",
"view": "Ansicht",
"sharedBy": "Von {0} geteilt"
"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}"
},
"userTeam": {
"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."
"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."
},
"right": {
"title": "Berechtigung",
"read": "Nur Leserechte",
"readWrite": "Lesen & Schreiben",
"title": "Permission",
"read": "Read only",
"readWrite": "Read & write",
"admin": "Admin"
},
"attributes": {
"link": "Link",
"delete": "Löschen"
"delete": "Delete"
}
},
"list": {
"title": "Liste",
"add": "Hinzufügen",
"addPlaceholder": "Neue Aufgabe hinzufügen…",
"empty": "Dieses Project ist derzeit leer.",
"newTaskCta": "Eine neue Aufgabe erstellen.",
"editTask": "Aufgabe bearbeiten"
"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": "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."
"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."
},
"table": {
"title": "Tabelle",
"columns": "Spalten"
"title": "Table",
"columns": "Columns"
},
"kanban": {
"title": "Kanban",
"limit": "Limit: {limit}",
"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 Aufgabentitel ein …",
"addTask": "Eine Aufgabe hinzufügen",
"addAnotherTask": "Weitere Aufgabe hinzufügen",
"addBucket": "Eine neue Spalte erstellen",
"addBucketPlaceholder": "Gebe einen Spaltentitel 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 Standardspalte.",
"deleteBucketSuccess": "Die Spalte wurde erfolgreich gelöscht.",
"bucketTitleSavedSuccess": "Der Spaltenname wurde erfolgreich gespeichert.",
"bucketLimitSavedSuccess": "Das Spaltenlimit wurde erfolgreich gespeichert.",
"collapse": "Spalte einklappen"
"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"
},
"pseudo": {
"favorites": {
"title": "Favorites"
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"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.",
"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.",
"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.",
"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."
},
"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!",
"success": "Der Namespace wurde erfolgreich gelöscht."
},
"edit": {
"title": "„{namespace}“ bearbeiten",
"success": "Der Namespace wurde erfolgreich aktualisiert."
},
"share": {
"title": "„{namespace}“ teilen"
},
"attributes": {
"title": "Namespace Titel",
"titlePlaceholder": "Titel des Namespace angeben…",
"description": "Beschreibung",
"descriptionPlaceholder": "Beschreibung für den Namespace eingeben…",
"color": "Farbe",
"archived": "Ist archiviert",
"isArchived": "Dieser Namespace ist archiviert"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Favoriten"
},
"savedFilters": {
"title": "Filter"
}
}
},
@ -344,7 +403,7 @@
},
"create": {
"title": "Neuer gespeicherter Filter",
"description": "Ein gespeicherter Filter ist ein virtuelles Projekt, das bei jedem Zugriff aus einem Satz von Filtern errechnet wird.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Neuen gespeicherten Filter erstellen",
"titleRequired": "Bitte gib den Titel für den Filter an."
},
@ -376,7 +435,7 @@
"label": {
"title": "Labels",
"manage": "Label verwalten",
"description": "Klicke auf ein Label um es zu editieren. Du kannst alle Labels, welche du erstellt hast, editieren. Du kannst alle Labels, welche mit einer Aufgabe verknüpft sind, auf die du Zugriff hast, benutzen.",
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
"newCTA": "Du hast momentan keine Labels.",
"search": "Beginne zu schreiben, um nach einem Label zu suchen…",
"create": {
@ -401,7 +460,7 @@
},
"sharing": {
"authenticating": "Authentifizierung …",
"passwordRequired": "Dieses geteilte Projekt benötigt ein Passwort. Bitte gebe es unten ein:",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"error": "Es ist ein Fehler aufgetreten.",
"invalidPassword": "Das Passwort ist ungültig."
},
@ -470,7 +529,7 @@
"code": "Code",
"quote": "Zitat",
"unorderedList": "Ungeordnete Liste",
"orderedList": "Geordnete Liste",
"orderedList ": "Ordered List",
"cleanBlock": "Formatierung löschen",
"link": "Link",
"image": "Bild",
@ -507,14 +566,14 @@
"canuse": "Du kannst Datumsberechnung verwenden, um nach relativen Daten zu filtern.",
"learnhow": "Sieh dir an, wie es funktioniert",
"title": "Datumsberechnung",
"intro": "Du kannst relative Daten angeben, die bei der Anwendung des Filters von Vikunja aufgelöst werden.",
"intro": "Die Datumsberechnung erlaubt es, relative Daten anzugeben, die bei der Anwendung des Filters von Vikunja aufgelöst werden.",
"expression": "Jeder Ausdruck der Datumsberechnung beginnt mit einem Datumswert, welcher entweder {0} sein kann oder mit {1} endet. Auf diesen Datumswert kann optional ein oder mehrere mathematische Ausdrücke folgen.",
"similar": "Diese Ausdrücke ähneln denen von {0} und {1}.",
"add1Day": "Einen Tag hinzufügen",
"minus1Day": "Einen Tag abziehen",
"roundDay": "Auf den nächsten Tag abrunden",
"supportedUnits": "Unterstützte Zeiteinheiten",
"someExamples": "Beispiele für Zeitausdrücke",
"supportedUnits": "Unterstützte Zeiteinheiten sind:",
"someExamples": "Einige Beispiele für Zeitausdrücke:",
"units": {
"seconds": "Sekunden",
"minutes": "Minuten",
@ -560,7 +619,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": "Aufgabe in ein anderes Projekt verschieben",
"move": "Move task to a different project",
"done": "Als erledigt markieren!",
"undone": "Als nicht erledigt markieren",
"created": "Erstellt {0} von {1}",
@ -568,7 +627,7 @@
"doneAt": "Erledigt {0}",
"updateSuccess": "Die Aufgabe wurde erfolgreich gespeichert.",
"deleteSuccess": "Die Aufgabe wurde erfolgreich gelöscht.",
"belongsToProject": "Diese Aufgabe gehört zum Projekt „{project}“",
"belongsToProject": "This task belongs to project '{project}'",
"due": "Fällig {at}",
"closePopup": "Popup schließen",
"delete": {
@ -588,7 +647,7 @@
"percentDone": "Fortschritt einstellen",
"attachments": "Anhänge hinzufügen",
"relatedTasks": "Beziehung hinzufügen",
"moveProject": "Verschieben",
"moveProject": "Move",
"color": "Farbe setzen",
"delete": "Löschen",
"favorite": "Zu Favoriten hinzufügen",
@ -615,15 +674,21 @@
"updated": "Aktualisiert"
},
"subscription": {
"subscribedTaskThroughParentProject": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihr Projekt abonniert hast.",
"subscribedProject": "Du hast dieses Projekt abonniert und erhältst Benachrichtigungen über Änderungen.",
"notSubscribedProject": "Du hast dieses Projekt nicht abonniert und erhältst keine Benachrichtigungen über Änderungen.",
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihren Namespace abonniert hast.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "Du hast diesen Namespace abonniert und erhältst Benachrichtigungen über Änderungen.",
"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.",
"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",
"subscribeSuccessProject": "Du hast dieses Projekt jetzt abonniert",
"unsubscribeSuccessProject": "Du hast dieses Projekt jetzt nicht mehr abonniert",
"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",
"subscribeSuccessTask": "Du hast diese Aufgabe jetzt abonniert",
"unsubscribeSuccessTask": "Du hast diese Aufgabe jetzt nicht mehr abonniert"
},
@ -697,7 +762,8 @@
"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": "Diese Aufgabe gehört zu einem anderen Projekt.",
"differentProject": "This task belongs to a different project.",
"differentNamespace": "Diese Aufgabe gehört zu einem anderen Namespace.",
"noneYet": "Keine Aufgabenbeziehung vorhanden.",
"delete": "Aufgabenbeziehung entfernen",
"deleteText1": "Willst du diese Aufgabenbeziehung wirklich entfernen?",
@ -746,10 +812,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": "Um ein Projekt für die Aufgabe festzulegen, gib seinen Namen mit einem vorangestellten {prefix} ein.",
"project2": "Dies gibt einen Fehler zurück, wenn das Projekt nicht existiert.",
"project3": "Um Leerzeichen zu verwenden, füge einfach ein \" oder ' um den Namen des Projekts hinzu.",
"project4": "Zum Beispiel: {prefix}\"Projekt mit Leerzeichen\".",
"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\".",
"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",
@ -782,19 +848,19 @@
"delete": {
"header": "Team löschen",
"text1": "Bist du sicher, dass du dieses Team und alle seine Mitglieder löschen willst?",
"text2": "Alle Teammitglieder verlieren den Zugriff auf Projekte, die mit diesem Team geteilt sind. Dies KANN NICHT rückgängig gemacht werden!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "Das Team wurde erfolgreich gelöscht."
},
"deleteUser": {
"header": "Benutzer:innen aus dem Team entfernen",
"text1": "Bist du sicher, dass du diese:n Benutzer:in aus dem Team entfernen willst?",
"text2": "Diese:r Benutzer:in verliert den Zugriff auf alle Projekte, auf die dieses Team Zugriff hat. Dies kann nicht rückgängig gemacht werden!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "Der:die Benutzer:in wurde erfolgreich aus dem Team gelöscht."
},
"leave": {
"title": "Team verlassen",
"text1": "Bist du sicher, dass du dieses Team verlassen willst?",
"text2": "Du wirst Zugriff auf alle Projekte verlieren, auf die dieses Team Zugriff hat. Wenn du deine Meinung änderst, musst du durch einen Team-Admin wieder hinzugefügt werden.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "Du hast das Team erfolgreich verlassen."
}
},
@ -826,27 +892,24 @@
"attachment": "Einen Anhang dieser Aufgabe hinzufügen",
"related": "Ändere die Abhängigen Aufgaben dieser Aufgabe",
"color": "Die Farbe dieser Aufgabe ändern",
"move": "Aufgabe in ein anderes Projekt verschieben",
"move": "Move this task to another project",
"reminder": "Erinnerungen für diese Aufgabe verwalten",
"description": "Aufgabenbeschreibung bearbeiten",
"delete": "Diese Aufgabe löschen",
"priority": "Die Priorität dieser Aufgabe ändern",
"favorite": "Diese Aufgabe zum Favoriten machen / von Favoriten entfernen"
"description": "Aufgabenbeschreibung bearbeiten"
},
"project": {
"title": "Projektansichten",
"switchToListView": "Zu Listenansicht wechseln",
"switchToGanttView": "Zur Ganttansicht wechseln",
"switchToKanbanView": "Zur Kanbanansicht wechseln",
"switchToTableView": "Zur Tabellenansicht wechseln"
"title": "Project Views",
"switchToListView": "Switch to list view",
"switchToGanttView": "Switch to gantt view",
"switchToKanbanView": "Switch to kanban view",
"switchToTableView": "Switch to table view"
},
"navigation": {
"title": "Navigation",
"overview": "Die Startseite aufrufen",
"upcoming": "Anstehende Aufgaben aufrufen",
"namespaces": "Navigate to namespaces & projects",
"labels": "Labels aufrufen",
"teams": "Teams aufrufen",
"projects": "Projekte aufrufen"
"teams": "Teams aufrufen"
}
},
"update": {
@ -861,8 +924,7 @@
"unarchive": "Archivierung aufheben",
"setBackground": "Hintergrund einstellen",
"share": "Teilen",
"newProject": "Neues Projekt",
"createProject": "Projekt erstellen"
"newProject": "New project"
},
"apiConfig": {
"url": "Vikunja-URL",
@ -881,23 +943,25 @@
"notification": {
"title": "Benachrichtigungen",
"none": "Du hast keine Benachrichtigungen. Einen schönen Tag noch!",
"explainer": "Benachrichtigungen werden hier angezeigt, wenn Aktionen für Projekte oder Aufgaben, die du abonniert hast, ausgeführt werden."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Befehle",
"placeholder": "Gib einen Befehl oder eine Suche ein …",
"hint": "Du kannst {project} verwenden, um die Suche auf ein Projekt zu beschränken. Kombiniere {project} oder {label} (Labels) mit einer Suchabfrage, um eine Aufgabe mit diesen Labels oder auf diesem Projekt zu suchen. Verwende {assignee}, um nur nach Teams zu suchen.",
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
"tasks": "Aufgaben",
"projects": "Projekte",
"projects": "Projects",
"teams": "Teams",
"newProject": "Gib den Titel des neuen Projekts ein…",
"newProject": "Enter the title of the new project…",
"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": "Eine Aufgabe im aktuellen Projekt erstellen ({title})",
"createProject": "Projekt erstellen",
"createTask": "Create a task in the current project ({title})",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "Neue Aufgabe",
"newProject": "Neues Projekt",
"newProject": "New project",
"newNamespace": "Neuer Namespace",
"newTeam": "Neues Team"
}
},
@ -928,15 +992,15 @@
"1018": "Die Avatareinstellungen sind falsch.",
"2001": "Die ID kann nicht leer oder 0 sein.",
"2002": "Ein Teil der Anfragedaten ist ungültig.",
"3001": "Das Projekt ist nicht vorhanden.",
"3004": "Um das zu machen, benötigst du eine Leseberechtigung für dieses Projekt.",
"3005": "Der Projekttitel darf nicht leer sein.",
"3006": "Diese Linkfreigabe existiert nicht.",
"3007": "Ein Projekt mit diesem Bezeichner existiert bereits.",
"3008": "Dieses Projekt ist archiviert und kann deshalb nur gelesen werden. Dies gilt auch für alle Aufgaben, die mit diesem Projekt verbunden sind.",
"4001": "Der Aufgabentitel kann nicht leer sein.",
"4002": "Diese Aufgabe existiert nicht.",
"4003": "Alle Massenbearbeitungen an Aufgaben müssen zum selben Projekt gehören.",
"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.",
"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.",
@ -953,23 +1017,30 @@
"4017": "Ungültiger Aufgabenfilter (Vergleichskriterium).",
"4018": "Ungültige Verkettung von Aufgabenfiltern.",
"4019": "Ungültiger Aufgabenfilter (Wert).",
"5001": "Dieser Namespace existiert nicht.",
"5003": "Du hast keinen Zugriff auf den Namespace.",
"5006": "Der Namespace Titel kann nicht leer sein.",
"5009": "Du benötigst Leserechte in diesem Namespace, um diese Aktion durchzuführen.",
"5010": "Dieses Team hat keinen Zugriff auf diesen Namespace.",
"5011": "Diese:r Benutzer:in hat bereits Zugriff auf diesen Namespace.",
"5012": "Dieser Namespace ist archiviert und kann deshalb nur gelesen werden.",
"6001": "Der Teamname kann nicht leer sein.",
"6002": "Das Team existiert nicht.",
"6004": "Das Team hat bereits Zugriff auf dieses Projekt.",
"6004": "The team already has access to that namespace or project.",
"6005": "Diese:r Benutzer:in ist bereits dem Team beigetreten.",
"6006": "Du kannst den:die letzten Benutzer:in dieses Teams nicht löschen.",
"6007": "Das Team hat keine Berechtigungen auf diesem Projekt, um das durchzuführen.",
"7002": "Der:die Benutzer:in hat bereits Zugriff auf dieses Projekt",
"7003": "Du hast keinen Zugriff auf dieses Projekt.",
"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.",
"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": "Diese Spalte gehört nicht zu diesem Projekt.",
"10003": "Du kannst die letze Spalte in einem Projekt nicht entfernen.",
"10002": "The bucket does not belong to that project.",
"10003": "You cannot remove the last bucket on a project.",
"10004": "Du kannst die Aufgabe nicht in diese Spalte legen, da sie schon die maximale Anzahl an Aufgaben enthält.",
"10005": "Es kann nur eine Erledigt-Spalte pro Projekt geben.",
"10005": "There can be only one done bucket per project.",
"11001": "Der gespeicherte Filter existiert nicht.",
"11002": "Gespeicherte Ansichten sind für Linkfreigaben nicht verfügbar.",
"12001": "Der Abonnement-Typ ist ungültig.",
@ -982,4 +1053,4 @@
"frontendVersion": "Frontend-Version: {version}",
"apiVersion": "API-Version: {version}"
}
}
}

View File

@ -6,8 +6,10 @@
"welcomeEvening": "Guten Abend, {username}!",
"lastViewed": "Zletscht ahglueget",
"project": {
"importText": "Importiere deine Projekte und Aufgaben aus anderen Diensten in Vikunja:",
"import": "Importiere deine Daten in Vikunja"
"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"
}
},
"404": {
@ -83,7 +85,7 @@
"weekStartSunday": "Sunntig",
"weekStartMonday": "Määntig",
"language": "Sproch",
"defaultProject": "Standard-Projekt",
"defaultProject": "Default Project",
"timezone": "Zeitzone",
"overdueTasksRemindersTime": "Zeit der E-Mail-Zusammenfassung der überfälligen Aufgaben"
},
@ -141,7 +143,7 @@
},
"deletion": {
"title": "Lösche deinen Vikunja-Account",
"text1": "Das Löschen deines Accounts ist dauerhaft und unwiderruflich. Alle Projekte, Aufgaben und zugehörige Daten werden gelöscht.",
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, projects, tasks and everything associated with it.",
"text2": "Zum Fortfahren gib bitte dein Passwort ein. Du erhältst eine E-Mail mit weiteren Anweisungen.",
"confirm": "Meinen Account löschen",
"requestSuccess": "Die Anfrage war erfolgreich. Du erhältst eine E-Mail mit weiteren Anweisungen.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Exportiere deine Vikunja-Daten",
"description": "Du kannst eine Kopie deiner Daten bei Vikunja anfordern. Dazu gehören Projekte, Aufgaben und alles, was damit zusammenhängt. Du kannst diese Daten dann in jeder Vikunja-Instanz über die Migrationsfunktion importieren.",
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Bitte gib dein Passwort ein, um fortzufahren:",
"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.",
@ -163,163 +165,220 @@
}
},
"project": {
"archivedMessage": "Dieses Projekt ist archiviert. Es ist nicht möglich, neue Aufgaben zu erstellen oder es zu bearbeiten.",
"archived": "Archiviert",
"showArchived": "Archivierte anzeigen",
"title": "Projekttitel",
"color": "Farbe",
"projects": "Projekte",
"parent": "Übergeordnetes Projekt",
"search": "Tippe, um nach einem Projekt zu suchen…",
"searchSelect": "Klicke oder drücke die Eingabetaste, um dieses Projekt auszuwählen",
"shared": "Geteilte Projekte",
"noDescriptionAvailable": "Keine Projektbeschreibung verfügbar.",
"inboxTitle": "Eingang",
"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.",
"create": {
"header": "Neues Projekt",
"titlePlaceholder": "Der Titel des Projekts kommt hier hin…",
"addTitleRequired": "Bitte gebe einen Titel an.",
"createdSuccess": "Das Projekt wurde erfolgreich erstellt.",
"addProjectRequired": "Bitte gebe ein Projekt an oder lege ein Standard-Projekt in den Einstellungen fest."
"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."
},
"archive": {
"title": "„{project}“ archivieren",
"archive": "Dieses Projekt archivieren",
"unarchive": "Archivierung dieses Projekts aufheben",
"unarchiveText": "Du wirst neue Aufgaben erstellen oder sie bearbeiten können.",
"archiveText": "Du kannst dieses Projekt nicht bearbeiten oder neue Aufgaben erstellen, bis du die Archivierung aufhebst.",
"success": "Das Projekt wurde erfolgreich archiviert."
"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."
},
"background": {
"title": "Projekthintergrund festlegen",
"remove": "Hintergrund entfernen",
"upload": "Wähle einen Hintergrund von deinem Computer",
"searchPlaceholder": "Nach einem Hintergrund suchen…",
"title": "Set project background",
"remove": "Remove Background",
"upload": "Choose a background from your pc",
"searchPlaceholder": "Search for a background…",
"poweredByUnsplash": "Powered by Unsplash",
"loadMore": "Weitere Bilder laden",
"success": "Der Hintergrund wurde erfolgreich eingestellt!",
"removeSuccess": "Der Hintergrund wurde erfolgreich entfernt!"
"loadMore": "Load more photos",
"success": "The background has been set successfully!",
"removeSuccess": "The background has been removed successfully!"
},
"delete": {
"title": "„{project}“ löschen",
"header": "Dieses Projekt löschen",
"text1": "Bist du sicher, dass du dieses Projekt und alle seine Inhalte löschen willst?",
"text2": "Dies umfasst alle Aufgaben und kann NICHT rückgängig gemacht werden!",
"success": "Das Projekt wurde erfolgreich gelöscht.",
"tasksToDelete": "Dies löscht unwiderruflich ca. {count} Aufgaben.",
"noTasksToDelete": "Dieses Projekt enthält keine Aufgaben, es kann sicher gelöscht werden."
"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."
},
"duplicate": {
"title": "Dupliziere dieses Projekt",
"label": "Duplizieren",
"text": "Wähle ein übergeordnetes Projekt aus, welches das duplizierte Projekt enthalten soll:",
"success": "Das Projekt wurde erfolgreich dupliziert."
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
"header": "Dieses Projekt bearbeiten",
"title": "„{project}“ bearbeiten",
"titlePlaceholder": "Der Titel des Projekts kommt hier hin…",
"identifierTooltip": "Der Projektbezeichner kann zur eindeutigen Identifizierung einer Aufgabe über mehrere Projekte hinweg verwendet werden. Du kannst ihn auf leer setzen, um ihn zu deaktivieren.",
"identifier": "Projektbezeichner",
"identifierPlaceholder": "Der Projektbezeichner kommt hierhin…",
"description": "Beschreibung",
"descriptionPlaceholder": "Projektbeschreibung eingeben…",
"color": "Farbe",
"success": "Das Projekt wurde erfolgreich aktualisiert."
"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."
},
"share": {
"header": "Projekt teilen",
"title": "„{project}“ teilen",
"share": "Teilen",
"header": "Share this project",
"title": "Share \"{project}\"",
"share": "Share",
"links": {
"title": "Linkfreigaben",
"what": "Was ist eine Linkfreigabe?",
"explanation": "Mit Linkfreigaben kannst Projekt du Listen mit Benutzer:innen ohne Vikunja-Account teilen.",
"create": "Erstelle ein neue Linkfreigabe",
"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": "z.B. Lorem Ipsum",
"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 festgelegt",
"remove": "Linkfreigabe entfernen",
"removeText": "Bist du sicher, dass du diese Linkfreigabe unwiderruflich löschen möchtest? Über die Linkfreigabe ist danach der Zugriff auf dieses Projekt nicht mehr möglich!",
"createSuccess": "Die Linkfreigabe wurde erfolgreich erstellt.",
"deleteSuccess": "Die Linkfreigabe wurde erfolgreich gelöscht",
"view": "Ansicht",
"sharedBy": "Von {0} geteilt"
"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}"
},
"userTeam": {
"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."
"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."
},
"right": {
"title": "Berechtigung",
"read": "Nur Leserechte",
"readWrite": "Lesen & Schreiben",
"title": "Permission",
"read": "Read only",
"readWrite": "Read & write",
"admin": "Admin"
},
"attributes": {
"link": "Link",
"delete": "Löschen"
"delete": "Delete"
}
},
"list": {
"title": "Liste",
"add": "Hinzufügen",
"addPlaceholder": "Neue Aufgabe hinzufügen…",
"empty": "Dieses Project ist derzeit leer.",
"newTaskCta": "Eine neue Aufgabe erstellen.",
"editTask": "Aufgabe bearbeiten"
"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": "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."
"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."
},
"table": {
"title": "Tabelle",
"columns": "Spalten"
"title": "Table",
"columns": "Columns"
},
"kanban": {
"title": "Kanban",
"limit": "Limit: {limit}",
"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 Aufgabentitel ein …",
"addTask": "Eine Aufgabe hinzufügen",
"addAnotherTask": "Weitere Aufgabe hinzufügen",
"addBucket": "Eine neue Spalte erstellen",
"addBucketPlaceholder": "Gebe einen Spaltentitel 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 Standardspalte.",
"deleteBucketSuccess": "Die Spalte wurde erfolgreich gelöscht.",
"bucketTitleSavedSuccess": "Der Spaltenname wurde erfolgreich gespeichert.",
"bucketLimitSavedSuccess": "Das Spaltenlimit wurde erfolgreich gespeichert.",
"collapse": "Spalte einklappen"
"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"
},
"pseudo": {
"favorites": {
"title": "Favoriten"
"title": "Favorites"
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"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.",
"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.",
"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.",
"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."
},
"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!",
"success": "Namensruum g'chüblet."
},
"edit": {
"title": "\"{namespace}\" bearbeite",
"success": "Namensruum aktualisiert."
},
"share": {
"title": "\"{namespace}\" teile"
},
"attributes": {
"title": "Namensruumtitl",
"titlePlaceholder": "De Namensruumtitl chunt da ahne…",
"description": "Beschriibig",
"descriptionPlaceholder": "D'Namensruum Beschriibig chunt da ahne…",
"color": "Farb",
"archived": "Isch archiviert",
"isArchived": "De Namensruum isch archiviert"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Favorite"
},
"savedFilters": {
"title": "Filter"
}
}
},
@ -344,7 +403,7 @@
},
"create": {
"title": "Neuer gespeicherter Filter",
"description": "Ein gespeicherter Filter ist ein virtuelles Projekt, das bei jedem Zugriff aus einem Satz von Filtern errechnet wird.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Neue gspeicherete Filter erstelle",
"titleRequired": "Bitte gib den Titel für den Filter an."
},
@ -376,7 +435,7 @@
"label": {
"title": "Labels",
"manage": "Label migriere",
"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 verknüpft sind, auf die du Zugriff hast, benutzen.",
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
"newCTA": "Du hesch momentan kei Labels.",
"search": "Schriib, um nachemne Label z'sueche…",
"create": {
@ -401,7 +460,7 @@
},
"sharing": {
"authenticating": "Authentifiziere…",
"passwordRequired": "Dieses geteilte Projekt benötigt ein Passwort. Bitte gebe es unten ein:",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"error": "Het en Fähler geh. :(",
"invalidPassword": "Da Passwort isch ungültig."
},
@ -470,7 +529,7 @@
"code": "Code",
"quote": "Zitaat",
"unorderedList": "Ungordnedi Listä",
"orderedList": "Geordnete Liste",
"orderedList ": "Ordered List",
"cleanBlock": "Formatierig Lösche",
"link": "Link",
"image": "Bild",
@ -507,14 +566,14 @@
"canuse": "Du kannst Datumsberechnung verwenden, um nach relativen Daten zu filtern.",
"learnhow": "Sieh dir an, wie es funktioniert",
"title": "Datumsberechnung",
"intro": "Du kannst relative Daten angeben, die bei der Anwendung des Filters von Vikunja aufgelöst werden.",
"intro": "Die Datumsberechnung erlaubt es, relative Daten anzugeben, die bei der Anwendung des Filters von Vikunja aufgelöst werden.",
"expression": "Jeder Ausdruck der Datumsberechnung beginnt mit einem Datumswert, welcher entweder {0} sein kann oder mit {1} endet. Auf diesen Datumswert kann optional ein oder mehrere mathematische Ausdrücke folgen.",
"similar": "Diese Ausdrücke ähneln denen von {0} und {1}.",
"add1Day": "Einen Tag hinzufügen",
"minus1Day": "Einen Tag abziehen",
"roundDay": "Auf den nächsten Tag abrunden",
"supportedUnits": "Unterstützte Zeiteinheiten",
"someExamples": "Beispiele für Zeitausdrücke",
"supportedUnits": "Unterstützte Zeiteinheiten sind:",
"someExamples": "Einige Beispiele für Zeitausdrücke:",
"units": {
"seconds": "Sekunden",
"minutes": "Minuten",
@ -560,7 +619,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": "Aufgabe in ein anderes Projekt verschieben",
"move": "Move task to a different project",
"done": "Als erledigt markieren!",
"undone": "Als unerledigt markierä",
"created": "Erstellt am {0} vo {1}",
@ -568,7 +627,7 @@
"doneAt": "{0} erledigt",
"updateSuccess": "Die Uufgab isch erfolgriich g'speichered wore.",
"deleteSuccess": "Die Uufgab isch erfolgriich g'chüblet wore.",
"belongsToProject": "Diese Aufgabe gehört zum Projekt „{project}“",
"belongsToProject": "This task belongs to project '{project}'",
"due": "Fällig bis {at}",
"closePopup": "Popup schließen",
"delete": {
@ -588,7 +647,7 @@
"percentDone": "Fortschritt einstellen",
"attachments": "Anhänge hinzufügen",
"relatedTasks": "Beziehung hinzufügen",
"moveProject": "Verschieben",
"moveProject": "Move",
"color": "Farbe setzen",
"delete": "Löschen",
"favorite": "Zu Favoriten hinzufügen",
@ -615,15 +674,21 @@
"updated": "Aktualisiert"
},
"subscription": {
"subscribedTaskThroughParentProject": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihr Projekt abonniert hast.",
"subscribedProject": "Du hast dieses Projekt abonniert und erhältst Benachrichtigungen über Änderungen.",
"notSubscribedProject": "Du hast dieses Projekt nicht abonniert und erhältst keine Benachrichtigungen über Änderungen.",
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "Du kannst hier nicht de-abonnieren, da du diese Aufgabe über ihren Namespace abonniert hast.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "Du hast diesen Namespace abonniert und erhältst Benachrichtigungen über Änderungen.",
"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.",
"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",
"subscribeSuccessProject": "Du hast dieses Projekt jetzt abonniert",
"unsubscribeSuccessProject": "Du hast dieses Projekt jetzt nicht mehr abonniert",
"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",
"subscribeSuccessTask": "Du hast diese Aufgabe jetzt abonniert",
"unsubscribeSuccessTask": "Du hast diese Aufgabe jetzt nicht mehr abonniert"
},
@ -697,7 +762,8 @@
"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": "Diese Aufgabe gehört zu einem anderen Projekt.",
"differentProject": "This task belongs to a different project.",
"differentNamespace": "Diese Aufgabe gehört zu einem anderen Namespace.",
"noneYet": "S'git kei Uufgabe Beziehige.",
"delete": "Uufgabe Beziehig chüble",
"deleteText1": "Bisch du dir sicher, dass du die Zueghörigkeit chüblä wetsch?",
@ -746,10 +812,10 @@
"priority1": "Um e Task Priorität z'setze: füeg e nummere zwüsched 1 und 5, mit em {prefix} als Prefix iih.",
"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": "Um ein Projekt für die Aufgabe festzulegen, gib seinen Namen mit einem vorangestellten {prefix} ein.",
"project2": "Dies gibt einen Fehler zurück, wenn das Projekt nicht existiert.",
"project3": "Um Leerzeichen zu verwenden, füge einfach ein \" oder ' um den Namen des Projekts hinzu.",
"project4": "Zum Beispiel: {prefix}\"Projekt mit Leerzeichen\".",
"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\".",
"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",
@ -782,19 +848,19 @@
"delete": {
"header": "Das Team chüble",
"text1": "Bischder sicher, dasst wetsch da Team mit allne Mitglieder lösche?",
"text2": "Alle Teammitglieder verlieren den Zugriff auf Projekte, die mit diesem Team geteilt sind. Dies KANN NICHT rückgängig gemacht werden!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "Da Team isch erfolgriich g'chüblet wore."
},
"deleteUser": {
"header": "Benutzer usem Team entferne",
"text1": "Bisch du dir sicher, dass du de Benutzer usm Team werfe wetsch?",
"text2": "Diese:r Benutzer:in verliert den Zugriff auf alle Projekte, auf die dieses Team Zugriff hat. Dies kann nicht rückgängig gemacht werden!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "Benutzer erfolgriich usegworfe."
},
"leave": {
"title": "Team verlassen",
"text1": "Bist du sicher, dass du dieses Team verlassen willst?",
"text2": "Du wirst Zugriff auf alle Projekte verlieren, auf die dieses Team Zugriff hat. Wenn du deine Meinung änderst, musst du durch einen Team-Admin wieder hinzugefügt werden.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "Du hast das Team erfolgreich verlassen."
}
},
@ -826,27 +892,24 @@
"attachment": "En Aahang dere Uufgab hinzuefüege",
"related": "Beziehige vo dere Uufgab bearbeite",
"color": "Die Farbe dieser Aufgabe ändern",
"move": "Aufgabe in ein anderes Projekt verschieben",
"move": "Move this task to another project",
"reminder": "Erinnerungen für diese Aufgabe verwalten",
"description": "Aufgabenbeschreibung bearbeiten",
"delete": "Diese Aufgabe löschen",
"priority": "Die Priorität dieser Aufgabe ändern",
"favorite": "Diese Aufgabe zum Favoriten machen / von Favoriten entfernen"
"description": "Aufgabenbeschreibung bearbeiten"
},
"project": {
"title": "Projektansichten",
"switchToListView": "Zu Listenansicht wechseln",
"switchToGanttView": "Zur Ganttansicht wechseln",
"switchToKanbanView": "Zur Kanbanansicht wechseln",
"switchToTableView": "Zur Tabellenansicht wechseln"
"title": "Project Views",
"switchToListView": "Switch to list view",
"switchToGanttView": "Switch to gantt view",
"switchToKanbanView": "Switch to kanban view",
"switchToTableView": "Switch to table view"
},
"navigation": {
"title": "Navigation",
"overview": "Die Startseite aufrufen",
"upcoming": "Anstehende Aufgaben aufrufen",
"namespaces": "Navigate to namespaces & projects",
"labels": "Labels aufrufen",
"teams": "Teams aufrufen",
"projects": "Projekte aufrufen"
"teams": "Teams aufrufen"
}
},
"update": {
@ -861,8 +924,7 @@
"unarchive": "Ent-archiviere",
"setBackground": "Hintergrund iihstelle",
"share": "Teilä",
"newProject": "Neues Projekt",
"createProject": "Projekt erstellen"
"newProject": "New project"
},
"apiConfig": {
"url": "Vikunja URL",
@ -881,23 +943,25 @@
"notification": {
"title": "Benachrichtigunge",
"none": "Du hesch kei neui Benachrichtunge. Heb e schös Tägli!",
"explainer": "Benachrichtigungen werden hier angezeigt, wenn Aktionen für Projekte oder Aufgaben, die du abonniert hast, ausgeführt werden."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Befehl",
"placeholder": "Schriib en Befehl oder suech…",
"hint": "Du kannst {project} verwenden, um die Suche auf ein Projekt zu beschränken. Kombiniere {project} oder {label} (Labels) mit einer Suchabfrage, um eine Aufgabe mit diesen Labels oder auf diesem Projekt zu suchen. Verwende {assignee}, um nur nach Teams zu suchen.",
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
"tasks": "Uufgabe",
"projects": "Projekte",
"projects": "Projects",
"teams": "Teams",
"newProject": "Gib den Titel des neuen Projekts ein…",
"newProject": "Enter the title of the new project…",
"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": "Eine Aufgabe im aktuellen Projekt erstellen ({title})",
"createProject": "Projekt erstellen",
"createTask": "Create a task in the current project ({title})",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "Neui Uufgab",
"newProject": "Neues Projekt",
"newProject": "New project",
"newNamespace": "Neue Namensruum",
"newTeam": "Neus Team"
}
},
@ -928,15 +992,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": "Das Projekt ist nicht vorhanden.",
"3004": "Um das zu machen, benötigst du eine Leseberechtigung für dieses Projekt.",
"3005": "Der Projekttitel darf nicht leer sein.",
"3006": "Diese Linkfreigabe existiert nicht.",
"3007": "Ein Projekt mit diesem Bezeichner existiert bereits.",
"3008": "Dieses Projekt ist archiviert und kann deshalb nur gelesen werden. Dies gilt auch für alle Aufgaben, die mit diesem Projekt verbunden sind.",
"4001": "Der Aufgabentitel kann nicht leer sein.",
"4002": "Diese Aufgabe existiert nicht.",
"4003": "Alle Massenbearbeitungen an Aufgaben müssen zum selben Projekt gehören.",
"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.",
"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.",
@ -953,23 +1017,30 @@
"4017": "Ungültige Uufgabefilter vergliich.",
"4018": "Ungültige Verkettung von Aufgabenfiltern.",
"4019": "Ungültigi Uufgabe Filter Wert.",
"5001": "De Namensruum existiert nid.",
"5003": "Du hesch kei Zuegriff zu dem Namensruum.",
"5006": "De Namensruum Name cha nid leer sii.",
"5009": "Du bruuchsch Läsezuegriff uf de Namensruum, um das durezfüehre.",
"5010": "Da Team hett kei zuegriff uf de Namensruum.",
"5011": "De Benutzer hett bereits zuegriff uf de Namensruum.",
"5012": "De Namensruum isch momentan schriibgschützt weil er archiviert isch.",
"6001": "Der Teamname kann nicht leer sein.",
"6002": "Da Team giz nid.",
"6004": "Das Team hat bereits Zugriff auf dieses Projekt.",
"6004": "The team already has access to that namespace or project.",
"6005": "De Benutzer isch scho bi dem Team.",
"6006": "Du chasch nid de letschti Benutzer vom Team lösche.",
"6007": "Das Team hat keine Berechtigungen auf diesem Projekt, um das durchzuführen.",
"7002": "Der:die Benutzer:in hat bereits Zugriff auf dieses Projekt",
"7003": "Du hast keinen Zugriff auf dieses Projekt.",
"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.",
"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": "Diese Spalte gehört nicht zu diesem Projekt.",
"10003": "Du kannst die letze Spalte in einem Projekt nicht entfernen.",
"10002": "The bucket does not belong to that project.",
"10003": "You cannot remove the last bucket on a project.",
"10004": "Du chasch die Uufgab nid dem Chübl zue wiise, weil er d'Limite für Uufgabe erreicht het.",
"10005": "Es kann nur eine Erledigt-Spalte pro Projekt geben.",
"10005": "There can be only one done bucket per project.",
"11001": "De g'speicheret Filter giz nid.",
"11002": "G'speichereti Filter chend nid Teilt werde.",
"12001": "De Abonnement Entitätstyp isch ungültig.",
@ -982,4 +1053,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -6,7 +6,9 @@
"welcomeEvening": "Good Evening {username}!",
"lastViewed": "Last viewed",
"project": {
"importText": "Import your projects and tasks from other services into Vikunja:",
"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"
}
},
@ -141,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 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, projects, 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.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Export your Vikunja data",
"description": "You can request a copy of all your Vikunja data. This includes 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, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Please enter your password to proceed:",
"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.",
@ -163,18 +165,14 @@
}
},
"project": {
"archivedMessage": "This project is archived. It is not possible to create new or edit tasks for it.",
"archived": "Archived",
"showArchived": "Show Archived",
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
"title": "Project Title",
"color": "Color",
"projects": "Projects",
"parent": "Parent Project",
"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.",
"inboxTitle": "Inbox",
"create": {
"header": "New project",
"titlePlaceholder": "The project's title goes here…",
@ -212,7 +210,7 @@
"duplicate": {
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a parent project which should hold the duplicated project:",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
@ -323,6 +321,67 @@
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"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.",
"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.",
"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.",
"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."
},
"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!",
"success": "The namespace was successfully deleted."
},
"edit": {
"title": "Edit \"{namespace}\"",
"success": "The namespace was successfully updated."
},
"share": {
"title": "Share \"{namespace}\""
},
"attributes": {
"title": "Namespace Title",
"titlePlaceholder": "The namespace title goes here…",
"description": "Description",
"descriptionPlaceholder": "The namespaces description goes here…",
"color": "Color",
"archived": "Is Archived",
"isArchived": "This namespace is archived"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Favorites"
},
"savedFilters": {
"title": "Filters"
}
}
},
"filters": {
"title": "Filters",
"clear": "Clear Filters",
@ -344,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.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
@ -470,7 +529,7 @@
"code": "Code",
"quote": "Quote",
"unorderedList": "Unordered List",
"orderedList": "Ordered List",
"orderedList ": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Image",
@ -510,14 +569,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -618,13 +677,19 @@
"updated": "Updated"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
"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",
"subscribeSuccessTask": "You are now subscribed to this task",
@ -701,6 +766,7 @@
"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.",
"differentNamespace": "This task belongs to a different namespace.",
"noneYet": "No task relations yet.",
"delete": "Delete Task Relation",
"deleteText1": "Are you sure you want to delete this task relation?",
@ -785,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 shared with this team. This CANNOT BE UNDONE!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "The team was successfully deleted."
},
"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 this team has access to. This CANNOT BE UNDONE!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "The user was successfully deleted from the team."
},
"leave": {
"title": "Leave team",
"text1": "Are you sure you want to leave this team?",
"text2": "You will lose access to all projects this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "You have successfully left the team."
}
},
@ -831,10 +897,7 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
"description": "Toggle editing of the task description"
},
"project": {
"title": "Project Views",
@ -847,9 +910,9 @@
"title": "Navigation",
"overview": "Navigate to overview",
"upcoming": "Navigate to upcoming tasks",
"namespaces": "Navigate to namespaces & projects",
"labels": "Navigate to labels",
"teams": "Navigate to teams",
"projects": "Navigate to projects"
"teams": "Navigate to teams"
}
},
"update": {
@ -864,8 +927,7 @@
"unarchive": "Un-Archive",
"setBackground": "Set background",
"share": "Share",
"newProject": "New project",
"createProject": "Create project"
"newProject": "New project"
},
"apiConfig": {
"url": "Vikunja URL",
@ -884,7 +946,7 @@
"notification": {
"title": "Notifications",
"none": "You don't have any notifications. Have a nice day!",
"explainer": "Notifications will appear here when actions projects or tasks you subscribed to happen."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Commands",
@ -895,12 +957,14 @@
"teams": "Teams",
"newProject": "Enter the title of the new project…",
"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",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "New task",
"newProject": "New project",
"newNamespace": "New namespace",
"newTeam": "New team"
}
},
@ -956,9 +1020,16 @@
"4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatenator.",
"4019": "Invalid task filter value.",
"5001": "The namespace does not exist.",
"5003": "You do not have access to the specified namespace.",
"5006": "The namespace name cannot be empty.",
"5009": "You need to have namespace read access to perform that action.",
"5010": "This team does not have access to that namespace.",
"5011": "This user has already access to that namespace.",
"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 project.",
"6004": "The team already has access to that namespace or project.",
"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.",
@ -985,4 +1056,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

@ -6,7 +6,9 @@
"welcomeEvening": "¡Buenas Tardes {username}!",
"lastViewed": "Visto por última vez",
"project": {
"importText": "Import your projects and tasks from other services into Vikunja:",
"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"
}
},
@ -141,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 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, projects, tasks and everything associated with it.",
"text2": "Para continuar, por favor, introduce tu contraseña. Recibirás un correo electrónico con más instrucciones.",
"confirm": "Eliminar mi cuenta",
"requestSuccess": "La solicitud ha sido exitosa. Recibirás un correo electrónico con más instrucciones.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Exportar tus datos de Vikunja",
"description": "You can request a copy of all your Vikunja data. This includes 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, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Por favor, introduce tu contraseña para continuar:",
"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.",
@ -163,18 +165,14 @@
}
},
"project": {
"archivedMessage": "This project is archived. It is not possible to create new or edit tasks for it.",
"archived": "Archived",
"showArchived": "Show Archived",
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
"title": "Project Title",
"color": "Color",
"projects": "Projects",
"parent": "Parent Project",
"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.",
"inboxTitle": "Inbox",
"create": {
"header": "New project",
"titlePlaceholder": "The project's title goes here…",
@ -212,7 +210,7 @@
"duplicate": {
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a parent project which should hold the duplicated project:",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
@ -323,6 +321,67 @@
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"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.",
"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.",
"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.",
"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."
},
"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!",
"success": "El proyecto se ha eliminado con éxito."
},
"edit": {
"title": "Editar \"{namespace}\"",
"success": "El proyecto se actualizó con éxito."
},
"share": {
"title": "Compartir \"{namespace}\""
},
"attributes": {
"title": "Título del proyecto",
"titlePlaceholder": "El título del proyecto va aquí…",
"description": "Descripción",
"descriptionPlaceholder": "La descripción del proyecto va aquí…",
"color": "Color",
"archived": "Está archivado",
"isArchived": "Este proyecto está archivado"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Favoritos"
},
"savedFilters": {
"title": "Filtros"
}
}
},
"filters": {
"title": "Filtros",
"clear": "Limpiar Filtros",
@ -344,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.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
@ -470,7 +529,7 @@
"code": "Código",
"quote": "Cita",
"unorderedList": "Lista no ordenada",
"orderedList": "Ordered List",
"orderedList ": "Ordered List",
"cleanBlock": "Borrar Bloque",
"link": "Enlace",
"image": "Imagen",
@ -507,14 +566,14 @@
"canuse": "Puedes usar ecuaciones para filtrar por fechas relacionadas.",
"learnhow": "Mira cómo funciona",
"title": "Ecuaciones",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Las Ecuaciones permiten determinar qué fechas relacionadas te mostrará Vikunja al aplicar este filtro.",
"expression": "Cada expresión matemática empieza con una fecha ancla, que puede ser {0}, o una cadena de texto que acabe en {1}. Opcionalmente, esta fecha puede estar seguida de una o más expresiones.",
"similar": "Estas expresiones son similares a las definidas en {0} y {1}.",
"add1Day": "Añadir un día",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -615,13 +674,19 @@
"updated": "Actualizado"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "No puede cancelar la suscripción aquí porque está suscrito a esta tarea a través de su proyecto.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "Actualmente está suscrito a este proyecto y recibirás notificaciones de cambios.",
"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.",
"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",
"subscribeSuccessTask": "You are now subscribed to this task",
@ -698,6 +763,7 @@
"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.",
"differentNamespace": "Esta tarea pertenece a un proyecto diferente.",
"noneYet": "Aún no hay tareas relacionadas.",
"delete": "Eliminar Relación de Tarea",
"deleteText1": "¿Está seguro que desea eliminar esta relación de la tarea?",
@ -782,19 +848,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 shared with this team. This CANNOT BE UNDONE!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "El equipo fue eliminado con éxito."
},
"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 this team has access to. This CANNOT BE UNDONE!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "El usuario fue quitado del equipo con éxito."
},
"leave": {
"title": "Leave team",
"text1": "Are you sure you want to leave this team?",
"text2": "You will lose access to all projects this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "Has abandonado el equipo con éxito."
}
},
@ -828,10 +894,7 @@
"color": "Cambia el color de esta tarea",
"move": "Move this task to another project",
"reminder": "Administrar recordatorios de esta tarea",
"description": "Editar la descripción de la tarea",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
"description": "Editar la descripción de la tarea"
},
"project": {
"title": "Project Views",
@ -844,9 +907,9 @@
"title": "Secciones",
"overview": "Ir a resumen",
"upcoming": "Ir a tareas próximas",
"namespaces": "Navigate to namespaces & projects",
"labels": "Ir a etiquetas",
"teams": "Ir a equipos",
"projects": "Navigate to projects"
"teams": "Ir a equipos"
}
},
"update": {
@ -861,8 +924,7 @@
"unarchive": "Desarchivar",
"setBackground": "Establecer fondo",
"share": "Compartir",
"newProject": "New project",
"createProject": "Create project"
"newProject": "New project"
},
"apiConfig": {
"url": "URL de Vikunja",
@ -881,7 +943,7 @@
"notification": {
"title": "Notificaciones",
"none": "No tienes notificaciones. ¡Que tengas un buen día!",
"explainer": "Notifications will appear here when actions projects or tasks you subscribed to happen."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Commands",
@ -892,12 +954,14 @@
"teams": "Teams",
"newProject": "Enter the title of the new project…",
"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",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "New task",
"newProject": "New project",
"newNamespace": "New namespace",
"newTeam": "New team"
}
},
@ -953,9 +1017,16 @@
"4017": "Comparador de filtro de tarea inválido.",
"4018": "Concatenador de filtro de tarea inválido.",
"4019": "Valor de filtro de tarea inválido.",
"5001": "El proyecto no existe.",
"5003": "No tiene acceso al proyecto especificado.",
"5006": "El nombre del proyecto no puede estar vacío.",
"5009": "Necesita tener acceso de lectura al proyecto para realizar esa acción.",
"5010": "Este equipo no tiene acceso a ese proyecto.",
"5011": "Este usuario ya tiene acceso a ese proyecto.",
"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 project.",
"6004": "The team already has access to that namespace or project.",
"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.",
@ -982,4 +1053,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "Versión de la API: {version}"
}
}
}

View File

@ -6,7 +6,9 @@
"welcomeEvening": "Good Evening {username}!",
"lastViewed": "Dernière consultation",
"project": {
"importText": "Import your projects and tasks from other services into Vikunja:",
"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"
}
},
@ -141,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 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, projects, tasks and everything associated with it.",
"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.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Exporter tes données Vikunja",
"description": "You can request a copy of all your Vikunja data. This includes 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, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Entre ton mot de passe pour continuer :",
"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.",
@ -163,18 +165,14 @@
}
},
"project": {
"archivedMessage": "This project is archived. It is not possible to create new or edit tasks for it.",
"archived": "Archived",
"showArchived": "Show Archived",
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
"title": "Project Title",
"color": "Color",
"projects": "Projects",
"parent": "Parent Project",
"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.",
"inboxTitle": "Inbox",
"create": {
"header": "New project",
"titlePlaceholder": "The project's title goes here…",
@ -212,7 +210,7 @@
"duplicate": {
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a parent project which should hold the duplicated project:",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
@ -323,6 +321,67 @@
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"namespace": "Espace de noms",
"showArchived": "Montrer les archivés",
"noneAvailable": "Tu nas pas despace 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.",
"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.",
"tooltip": "Quest-ce quun 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.",
"success": "Espace de noms archivé.",
"unarchiveSuccess": "Espace de noms archivé.",
"description": "If a namespace is archived, you cannot create new projects or edit it."
},
"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!",
"success": "Espace de noms supprimé."
},
"edit": {
"title": "Modifier « {namespace} »",
"success": "Espace de noms mis à jour."
},
"share": {
"title": "Partager « {namespace} »"
},
"attributes": {
"title": "Nom de lespace de noms",
"titlePlaceholder": "Entre le nom de lespace de noms…",
"description": "Description",
"descriptionPlaceholder": "Entre la description de lespace de noms…",
"color": "Couleur",
"archived": "Est archivé",
"isArchived": "Cet espace de noms est archivé"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Favoris"
},
"savedFilters": {
"title": "Filtres"
}
}
},
"filters": {
"title": "Filtres",
"clear": "Effacer les filtres",
@ -344,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.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Créer un nouveau filtre enregistré",
"titleRequired": "Please provide a title for the filter."
},
@ -470,7 +529,7 @@
"code": "Code",
"quote": "Citation",
"unorderedList": "Liste non ordonnée",
"orderedList": "Ordered List",
"orderedList ": "Ordered List",
"cleanBlock": "Bloc propre",
"link": "Lien",
"image": "Image",
@ -507,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -615,13 +674,19 @@
"updated": "Mis à jour"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
"subscribe": "Sabonner",
"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",
"subscribeSuccessTask": "You are now subscribed to this task",
@ -698,6 +763,7 @@
"searchPlaceholder": "Écris la recherche dune nouvelle tâche à ajouter comme connexe…",
"createPlaceholder": "Ajouter cette tâche comme nouvelle tâche connexe",
"differentProject": "This task belongs to a different project.",
"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",
"deleteText1": "Supprimer cette relation de tâche ?",
@ -782,19 +848,19 @@
"delete": {
"header": "Supprimer léquipe",
"text1": "Supprimer cette équipe et tous ses membres ?",
"text2": "All team members will lose access to projects shared with this team. This CANNOT BE UNDONE!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "É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 this team has access to. This CANNOT BE UNDONE!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "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 this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "You have successfully left the team."
}
},
@ -828,10 +894,7 @@
"color": "Changer la couleur de cette tâche",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
"description": "Toggle editing of the task description"
},
"project": {
"title": "Project Views",
@ -844,9 +907,9 @@
"title": "Navigation",
"overview": "Navigate to overview",
"upcoming": "Navigate to upcoming tasks",
"namespaces": "Navigate to namespaces & projects",
"labels": "Accéder aux étiquettes",
"teams": "Accéder aux équipes",
"projects": "Navigate to projects"
"teams": "Accéder aux équipes"
}
},
"update": {
@ -861,8 +924,7 @@
"unarchive": "Désarchiver",
"setBackground": "Définir larrière-plan",
"share": "Partager",
"newProject": "New project",
"createProject": "Create project"
"newProject": "New project"
},
"apiConfig": {
"url": "URL Vikunja",
@ -881,7 +943,7 @@
"notification": {
"title": "Notifications",
"none": "Tu nas pas de notifications. Passe une bonne journée !",
"explainer": "Notifications will appear here when actions projects or tasks you subscribed to happen."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Commandes",
@ -892,12 +954,14 @@
"teams": "Équipes",
"newProject": "Enter the title of the new project…",
"newTask": "Entre le nom de la tâche…",
"newNamespace": "Entre le nom de lespace de noms…",
"newTeam": "Entre le nom de la nouvelle équipe…",
"createTask": "Create a task in the current project ({title})",
"createProject": "Create a project",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "Nouvelle tâche",
"newProject": "New project",
"newNamespace": "Nouvel espace de noms",
"newTeam": "Nouvelle équipe"
}
},
@ -953,9 +1017,16 @@
"4017": "Comparateur de filtre de tâche invalide.",
"4018": "Concaténateur de filtre de tâche invalide.",
"4019": "Valeur de filtre de tâche invalide.",
"5001": "Lespace de noms nexiste pas.",
"5003": "Tu nas pas accès à lespace de noms indiqué.",
"5006": "Le nom de lespace de noms ne peut pas être vide.",
"5009": "Accès en lecture à lespace de noms nécessaire pour effectuer cette action.",
"5010": "Cette équipe na pas accès à cet espace de noms.",
"5011": "Cet·e utilisateur·rice a déjà accès à cet espace de noms.",
"5012": "Lespace de noms est archivé et ne peut donc être consulté quen lecture seule.",
"6001": "Le nom de l'équipe ne peut pas être vide.",
"6002": "Léquipe nexiste pas.",
"6004": "The team already has access to that project.",
"6004": "The team already has access to that namespace or project.",
"6005": "Lutilisateur·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.",
@ -982,4 +1053,4 @@
"frontendVersion": "Version : {version}",
"apiVersion": "Version de lAPI : {version}"
}
}
}

View File

@ -6,8 +6,10 @@
"welcomeEvening": "Buonasera {username}!",
"lastViewed": "Ultima visualizzazione",
"project": {
"importText": "Import your projects and tasks from other services into Vikunja:",
"import": "Importa i tuoi dati in Vikunja"
"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"
}
},
"404": {
@ -83,7 +85,7 @@
"weekStartSunday": "Domenica",
"weekStartMonday": "Lunedì",
"language": "Lingua",
"defaultProject": "Progetto Predefinito",
"defaultProject": "Default Project",
"timezone": "Fuso Orario",
"overdueTasksRemindersTime": "Orario email attività in scadute"
},
@ -141,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 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, projects, tasks and everything associated with it.",
"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.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Esporta i tuoi dati Vikunja",
"description": "You can request a copy of all your Vikunja data. This includes 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, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Inserisci la tua password per procedere:",
"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.",
@ -163,46 +165,42 @@
}
},
"project": {
"archivedMessage": "This project is archived. It is not possible to create new or edit tasks for it.",
"archived": "Archived",
"showArchived": "Show Archived",
"title": "Titolo Progetto",
"color": "Colore",
"projects": "Progetti",
"parent": "Parent 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": "Progetti Condivisi",
"shared": "Shared Projects",
"noDescriptionAvailable": "No project description is available.",
"inboxTitle": "Inbox",
"create": {
"header": "Nuovo progetto",
"titlePlaceholder": "Titolo del progetto…",
"addTitleRequired": "Specifica un titolo.",
"createdSuccess": "Progetto creato.",
"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."
},
"archive": {
"title": "Archivia \"{project}\"",
"archive": "Archivia questo progetto",
"unarchive": "Estrai questo progetto dall'archivio",
"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": "Progetto archiviato."
"success": "The project was successfully archived."
},
"background": {
"title": "Imposta lo sfondo del progetto",
"remove": "Rimuovi lo sfondo",
"upload": "Scegli uno sfondo dal tuo PC",
"searchPlaceholder": "Cerca uno sfondo…",
"poweredByUnsplash": "Alimentato da Unsplash",
"loadMore": "Carica altre foto",
"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!"
},
"delete": {
"title": "Elimina \"{project}\"",
"header": "Elimina questo progetto",
"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.",
@ -210,27 +208,27 @@
"noTasksToDelete": "This project does not contain any tasks, it should be safe to delete."
},
"duplicate": {
"title": "Duplica il progetto",
"label": "Duplica",
"text": "Select a parent project which should hold the duplicated project:",
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
"header": "Modifica Questo Progetto",
"title": "Modifica \"{project}\"",
"titlePlaceholder": "Titolo del progetto…",
"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": "Descrizione",
"descriptionPlaceholder": "Descrizione del progetto…",
"color": "Colore",
"description": "Description",
"descriptionPlaceholder": "The projects description goes here…",
"color": "Color",
"success": "The project was successfully updated."
},
"share": {
"header": "Condividi questo progetto",
"title": "Condividi \"{project}\"",
"share": "Condividi",
"header": "Share this project",
"title": "Share \"{project}\"",
"share": "Share",
"links": {
"title": "Share Links",
"what": "What is a share link?",
@ -323,6 +321,67 @@
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"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.",
"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.",
"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.",
"success": "Namespace creato.",
"unarchiveSuccess": "Namespace estratto dall'archivio.",
"description": "If a namespace is archived, you cannot create new projects or edit it."
},
"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!",
"success": "Namespace eliminato."
},
"edit": {
"title": "Modifica \"{namespace}\"",
"success": "Namespace aggiornato."
},
"share": {
"title": "Condividi \"{namespace}\""
},
"attributes": {
"title": "Titolo del Namespace",
"titlePlaceholder": "Il titolo del namespace va qui…",
"description": "Descrizione",
"descriptionPlaceholder": "La descrizione del namespace va qui…",
"color": "Colore",
"archived": "Archiviato",
"isArchived": "Questo namespace è archiviato"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Preferiti"
},
"savedFilters": {
"title": "Filtri"
}
}
},
"filters": {
"title": "Filtri",
"clear": "Pulisci Filtri",
@ -344,7 +403,7 @@
},
"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.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Crea nuovo filtro salvato",
"titleRequired": "È necessario un titolo per il filtro."
},
@ -470,7 +529,7 @@
"code": "Codice",
"quote": "Citazione",
"unorderedList": "Elenco puntato",
"orderedList": "Ordered List",
"orderedList ": "Ordered List",
"cleanBlock": "Pulisci Blocco",
"link": "Link",
"image": "Immagine",
@ -507,14 +566,14 @@
"canuse": "Puoi usare le date calcolate per filtrare per date relative.",
"learnhow": "Scopri come funziona",
"title": "Date Calcolate",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Le Date Calcolate ti permettono di specificare date relative che vengono calcolate al volo da Vikunja quando viene applicato il filtro.",
"expression": "Ogni Data Calcolata inizia con una data base, che può essere {0}, o una data con {1} alla fine. Questa data base può essere seguita da una o più espressioni matematiche.",
"similar": "Queste espressioni sono simili a quelle fornite da {0} e {1}.",
"add1Day": "Aggiungi un giorno",
"minus1Day": "Sottrai un giorno",
"roundDay": "Arrotonda per difetto al giorno più vicino",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"supportedUnits": "Le unità di tempo supportate sono:",
"someExamples": "Alcuni esempi di espressione temporale:",
"units": {
"seconds": "Secondi",
"minutes": "Minuti",
@ -615,13 +674,19 @@
"updated": "Aggiornato"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "Non puoi annullare l'iscrizione perché sei iscritto al namespace di questa attività.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "Sei iscritto a questo namespace e verrai notificato delle modifiche.",
"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.",
"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",
"subscribeSuccessTask": "Sei iscritto a questa attività",
@ -698,6 +763,7 @@
"searchPlaceholder": "Digita per cercare un'attività da aggiungere come collegata…",
"createPlaceholder": "Aggiungi come attività collegata",
"differentProject": "This task belongs to a different project.",
"differentNamespace": "Questa attività appartiene ad un namespace diverso.",
"noneYet": "Nessuna attività collegata.",
"delete": "Elimina Collegamento Attività",
"deleteText1": "Confermi di voler eliminare questo collegamento attività?",
@ -782,19 +848,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 shared with this team. This CANNOT BE UNDONE!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "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 this team has access to. This CANNOT BE UNDONE!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "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 this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "Hai abbandonato il gruppo."
}
},
@ -828,10 +894,7 @@
"color": "Cambia il colore di questa attività",
"move": "Move this task to another project",
"reminder": "Gestisci i promemoria di questa attività",
"description": "Attiva/Disattiva modifica della descrizione dell'attività",
"delete": "Elimina questa attività",
"priority": "Modifica la priorità di questa attività",
"favorite": "Segna questa attività come preferita o non preferita"
"description": "Attiva/Disattiva modifica della descrizione dell'attività"
},
"project": {
"title": "Project Views",
@ -844,9 +907,9 @@
"title": "Navigazione",
"overview": "Passa a \"Panoramica\"",
"upcoming": "Passa a \"Prossimamente\"",
"namespaces": "Navigate to namespaces & projects",
"labels": "Passa a \"Etichette\"",
"teams": "Passa a \"Gruppi\"",
"projects": "Navigate to projects"
"teams": "Passa a \"Gruppi\""
}
},
"update": {
@ -861,8 +924,7 @@
"unarchive": "Disarchivia",
"setBackground": "Imposta sfondo",
"share": "Condividi",
"newProject": "New project",
"createProject": "Create project"
"newProject": "New project"
},
"apiConfig": {
"url": "URL Vikunja",
@ -881,7 +943,7 @@
"notification": {
"title": "Notifiche",
"none": "Nessuna notifica. Buona giornata!",
"explainer": "Notifications will appear here when actions projects or tasks you subscribed to happen."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Comandi",
@ -892,12 +954,14 @@
"teams": "Gruppi",
"newProject": "Enter the title of the new project…",
"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",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "Nuova attività",
"newProject": "New project",
"newNamespace": "Nuovo Namespace",
"newTeam": "Nuovo gruppo"
}
},
@ -953,9 +1017,16 @@
"4017": "Comparatore di filtri attività non valido.",
"4018": "Concatenatore filtro attività non valido.",
"4019": "Filtro attività non valido.",
"5001": "Il namespace non esiste.",
"5003": "Non hai accesso a questo namespace.",
"5006": "Il nome del namespace non può essere vuoto.",
"5009": "Devi avere accesso in lettura al namespace per effettuare questa operazione.",
"5010": "Il tuo gruppo non ha accesso a questo namespace.",
"5011": "Questo utente ha già accesso a quel namespace.",
"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 project.",
"6004": "The team already has access to that namespace or project.",
"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.",
@ -982,4 +1053,4 @@
"frontendVersion": "Versione Frontend: {version}",
"apiVersion": "Versione API: {version}"
}
}
}

View File

@ -1,985 +0,0 @@
{
"home": {
"welcomeNight": "おやすみなさい、{username}さん",
"welcomeMorning": "おはようございます、{username}さん",
"welcomeDay": "こんにちは、{username}さん",
"welcomeEvening": "こんばんは、{username}さん",
"lastViewed": "最近の表示",
"project": {
"importText": "他のサービスからVikunjaにプロジェクトやタスクをインポートします:",
"import": "Vikunjaへのデータのインポート"
}
},
"404": {
"title": "Not found",
"text": "リクエストされたページは存在しません。"
},
"ready": {
"loading": "Vikunjaを読み込み中…",
"errorOccured": "エラーが発生しました:",
"checkApiUrl": "API URLをご確認ください",
"noApiUrlConfigured": "API URLが設定されていません。以下の項目を設定してください:"
},
"offline": {
"title": "オフライン",
"text": "ネットワーク接続を確認し、再度お試しください。"
},
"user": {
"auth": {
"username": "ユーザー名",
"usernameEmail": "ユーザー名またはメールアドレス",
"usernamePlaceholder": "例: frederick",
"email": "メールアドレス",
"emailPlaceholder": "例: frederic{'@'}vikunja.io",
"password": "パスワード",
"passwordPlaceholder": "例: •••••••••••",
"forgotPassword": "パスワードをお忘れですか?",
"resetPassword": "パスワードの再設定",
"resetPasswordAction": "パスワード再設定リンクの送信",
"resetPasswordSuccess": "受信トレイをご確認ください。パスワードの再設定方法を記載したメールが届くはずです。",
"passwordsDontMatch": "パスワードが一致しません",
"confirmEmailSuccess": "メールの確認に成功しました!ログインの準備が整いました。",
"totpTitle": "2要素認証コード",
"totpPlaceholder": "例: 123456",
"login": "ログイン",
"createAccount": "アカウントの作成",
"loginWith": "{provider}でログイン",
"authenticating": "認証中…",
"openIdStateError": "stateパラメータが一致しないため処理を中断しました。",
"openIdGeneralError": "認証中にエラーが発生しました。",
"logout": "ログアウト",
"emailInvalid": "有効なメールアドレスを入力してください。",
"usernameRequired": "ユーザー名を入力してください。",
"passwordRequired": "パスワードを入力してください。",
"showPassword": "パスワードの表示",
"hidePassword": "パスワードの非表示",
"noAccountYet": "まだアカウントをお持ちでないですか?",
"alreadyHaveAnAccount": "すでにアカウントをお持ちですか?",
"remember": "ログインしたままにする"
},
"settings": {
"title": "設定",
"newPasswordTitle": "パスワードの更新",
"newPassword": "新しいパスワード",
"newPasswordConfirm": "新しいパスワードの確認",
"currentPassword": "現在のパスワード",
"currentPasswordPlaceholder": "現在のパスワード",
"passwordsDontMatch": "新しいパスワードとその確認が一致しません。",
"passwordUpdateSuccess": "パスワードは正常に更新されました。",
"updateEmailTitle": "メールアドレスの更新",
"updateEmailNew": "新しいメールアドレス",
"updateEmailSuccess": "メールアドレスは正常に更新されました。確認のためのリンクを送信しました。",
"general": {
"title": "一般設定",
"name": "名前",
"newName": "新しい名前",
"savedSuccess": "設定の更新に成功しました。",
"emailReminders": "タスクのリマインダーをメールで送信する",
"overdueReminders": "期限切れタスクのリマインダーを毎日メールで送信する",
"discoverableByName": "名前で検索したとき他のユーザーから見つけられるようにする",
"discoverableByEmail": "メールアドレスで検索したとき他のユーザーから見つけられるようにする",
"playSoundWhenDone": "タスクを完了したとき音を鳴らす",
"weekStart": "週の始まり",
"weekStartSunday": "日曜日",
"weekStartMonday": "月曜日",
"language": "言語",
"defaultProject": "デフォルトのプロジェクト",
"timezone": "タイムゾーン",
"overdueTasksRemindersTime": "期限切れタスクのリマインダー送信時間"
},
"totp": {
"title": "2要素認証",
"enroll": "登録",
"finishSetupPart1": "セットアップを完了するには、Google AuthenticatorなどのTime-based One-Time Password (TOTP) アプリで次のシークレットを使用します:",
"finishSetupPart2": "その後、TOTPアプリの認証コードを入力してください。",
"scanQR": "あるいは、TOTPアプリでこのQRコードをスキャンして認証コードを入力してください:",
"passcode": "認証コード",
"passcodePlaceholder": "TOTPアプリで生成された認証コード",
"setupSuccess": "2要素認証は正常に設定されました。",
"enterPassword": "パスワードを入力してください",
"disable": "2要素認証の無効化",
"confirmSuccess": "2要素認証のセットアップを完了しました。",
"disableSuccess": "2要素認証は無効化されました。"
},
"caldav": {
"title": "CalDAV",
"howTo": "VikunjaをCalDAVクライアントと連携することでさまざまなクライアントからのすべてのタスクを表示および管理できます。CalDAVクライアントから接続するには次のエンドポイントをコピーしてクライアントに入力します:",
"more": "VikunjaのCalDAVに関する詳細情報",
"tokens": "CalDAVトークン",
"tokensHowTo": "上記のエンドポイントからログインする際にパスワードの代わりにCalDAVトークンを使用できます。",
"createToken": "トークンの生成",
"tokenCreated": "トークン: {token}",
"wontSeeItAgain": "このトークンをコピーしてください。二度と見ることができなくなります。",
"mustUseToken": "サードパーティーのクライアントからCalDAVを使用する場合、パスワードの代わりにCalDAVトークンを生成して使用する必要があります。",
"usernameIs": "ユーザー名: {0}"
},
"avatar": {
"title": "プロフィール画像",
"initials": "初期値",
"gravatar": "Gravatar",
"marble": "Marble",
"upload": "アップロード",
"uploadAvatar": "画像のアップロード",
"statusUpdateSuccess": "プロフィール画像を更新しました。",
"setSuccess": "プロフィール画像を設定しました。"
},
"quickAddMagic": {
"title": "Quick Add Magic Mode",
"disabled": "無効",
"todoist": "Todoist",
"vikunja": "Vikunja"
},
"appearance": {
"title": "カラースキーム",
"setSuccess": "カラースキームを{colorScheme}に変更しました。",
"colorScheme": {
"light": "ライト",
"system": "システム既定",
"dark": "ダーク"
}
}
},
"deletion": {
"title": "Vikunjaアカウントの削除",
"text1": "アカウントの削除は永久的なものであり、元に戻すことはできません。あなたのプロジェクト、タスク、それらに関連するすべてのものを削除します。",
"text2": "続行するにはパスワードを入力してください。詳しい案内の記載したメールを送信します。",
"confirm": "アカウントの削除",
"requestSuccess": "リクエストは成功しました。詳しい案内はメールでお知らせします。",
"passwordRequired": "パスワードを入力してください。",
"confirmSuccess": "アカウントの削除を承認しました。3日後にアカウントは削除されます。",
"scheduled": "{date} ({dateSince}) にVikunjaアカウントは削除されます。",
"scheduledCancel": "アカウントの削除を取り消す場合はこちらをご覧ください。",
"scheduledCancelText": "アカウントの削除を取り消すにはパスワードを入力してください:",
"scheduledCancelConfirm": "アカウント削除の取り消し",
"scheduledCancelSuccess": "アカウント削除は行われません。"
},
"export": {
"title": "Vikunjaデータのエクスポート",
"description": "利用しているVikunjaの全データのダウンロードをリクエストできます。これにはプロジェクト、タスク、およびそれらに関連するすべてを含みます。このデータはどのVikunjaインスタンスでもインポートすることができます。",
"descriptionPasswordRequired": "続行するにはパスワードを入力してください:",
"request": "Vikunjaデータのリクエスト",
"success": "Vikunjaデータのリクエストに成功しましたダウンロードの準備が整い次第、メールでお知らせします。",
"downloadTitle": "エクスポートされたVikunjaデータのダウンロード"
}
},
"project": {
"archivedMessage": "アーカイブ済みプロジェクトです。タスクの作成や編集を行うことはできません。",
"archived": "アーカイブ済み",
"showArchived": "アーカイブ済みプロジェクトを表示",
"title": "プロジェクト名",
"color": "色",
"projects": "プロジェクト",
"parent": "Parent Project",
"search": "プロジェクトのキーワードを入力…",
"searchSelect": "クリックするかEnterキーを押してプロジェクトを選択",
"shared": "共有プロジェクト",
"noDescriptionAvailable": "プロジェクトの説明はありません。",
"inboxTitle": "Inbox",
"create": {
"header": "新しいプロジェクトの作成",
"titlePlaceholder": "プロジェクト名を入力…",
"addTitleRequired": "プロジェクト名を入力してください。",
"createdSuccess": "プロジェクトは正常に作成されました。",
"addProjectRequired": "プロジェクトを指定するか、あらかじめデフォルトのプロジェクトを設定してください。"
},
"archive": {
"title": "「{project}」のアーカイブ",
"archive": "プロジェクトのアーカイブ",
"unarchive": "プロジェクトのアーカイブの取り消し",
"unarchiveText": "新しいタスクの作成や編集を行えるようになります。",
"archiveText": "アーカイブを取り消すまで、このプロジェクトでは新しいタスクの作成や編集を行うことができません。",
"success": "プロジェクトは正常にアーカイブされました。"
},
"background": {
"title": "プロジェクトの背景画像を設定",
"remove": "背景画像の削除",
"upload": "画像の選択",
"searchPlaceholder": "背景画像を検索…",
"poweredByUnsplash": "Powered by Unsplash",
"loadMore": "写真をもっと読み込む",
"success": "背景画像は正常に設定されました。",
"removeSuccess": "背景画像は正常に削除されました。"
},
"delete": {
"title": "「{project}」の削除",
"header": "プロジェクトの削除",
"text1": "このプロジェクトを削除して本当によろしいですか?",
"text2": "このプロジェクトに含まれるタスクはすべて削除されます。この操作は元に戻せません。",
"success": "プロジェクトは正常に削除されました。",
"tasksToDelete": "約{count}件のタスクが抹消されます。",
"noTasksToDelete": "このプロジェクトにはタスクが含まれていないので問題なく削除できます。"
},
"duplicate": {
"title": "プロジェクトの複製",
"label": "複製",
"text": "Select a parent project which should hold the duplicated project:",
"success": "プロジェクトは正常に複製されました。"
},
"edit": {
"header": "プロジェクトの編集",
"title": "「{project}」の編集",
"titlePlaceholder": "プロジェクト名を入力…",
"identifierTooltip": "プロジェクトIDは、プロジェクト間でタスクを一意に識別するために使用できます。空に設定すると無効化されます。",
"identifier": "プロジェクトID",
"identifierPlaceholder": "プロジェクトIDを入力…",
"description": "説明",
"descriptionPlaceholder": "プロジェクトの説明を入力…",
"color": "色",
"success": "プロジェクトは正常に更新されました。"
},
"share": {
"header": "プロジェクトの共有",
"title": "「{project}」の共有",
"share": "共有",
"links": {
"title": "リンクの共有",
"what": "共有リンクとは何ですか?",
"explanation": "共有リンクとは、Vikunjaのアカウントを持たない他のユーザーとプロジェクトを簡単に共有することができる機能です。",
"create": "新しい共有リンクの作成",
"name": "名前 (オプション)",
"namePlaceholder": "例: Lorem Ipsum",
"nameExplanation": "この共有リンクで行われた操作はすべてこの名前で表示されるようになります。",
"password": "パスワード (オプション)",
"passwordExplanation": "認証の際にユーザーはこのパスワードの入力を求められます。",
"noName": "名称未設定",
"remove": "共有リンクの削除",
"removeText": "この共有リンクを削除して本当によろしいですか?この共有リンクを使ってプロジェクトにアクセスすることができなくなります。この操作は元に戻せません。",
"createSuccess": "共有リンクは正常に作成されました。",
"deleteSuccess": "共有リンクは正常に削除されました。",
"view": "表示",
"sharedBy": "{0}によって共有されました"
},
"userTeam": {
"typeUser": "ユーザー",
"typeTeam": "チーム",
"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."
},
"right": {
"title": "権限",
"read": "読み取り専用",
"readWrite": "読み取りと書き込み",
"admin": "管理者"
},
"attributes": {
"link": "リンク",
"delete": "削除"
}
},
"list": {
"title": "リスト",
"add": "追加",
"addPlaceholder": "新しいタスクを追加…",
"empty": "このプロジェクトにはタスクが存在しません。",
"newTaskCta": "新しいタスクを作成してください。",
"editTask": "タスクの編集"
},
"gantt": {
"title": "ガント",
"showTasksWithoutDates": "指定日が未設定のタスクを表示",
"size": "大きさ",
"default": "デフォルト",
"month": "月",
"day": "日",
"hour": "時間",
"range": "期間",
"noDates": "指定日が未設定のタスクです。"
},
"table": {
"title": "テーブル",
"columns": "列"
},
"kanban": {
"title": "カンバン",
"limit": "Limit: {limit}",
"noLimit": "未設定",
"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": "タスクの追加",
"addAnotherTask": "他のタスクを追加",
"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"
},
"pseudo": {
"favorites": {
"title": "お気に入り"
}
}
},
"filters": {
"title": "絞り込み",
"clear": "絞り込みの解除",
"attributes": {
"title": "Title",
"titlePlaceholder": "The saved filter title goes here…",
"description": "説明",
"descriptionPlaceholder": "The description goes here…",
"includeNulls": "Include Tasks which don't have a value set",
"requireAll": "Require all filters to be true for a task to show up",
"showDoneTasks": "完了したタスクを表示",
"sortAlphabetically": "Sort Alphabetically",
"enablePriority": "Enable Filter By Priority",
"enablePercentDone": "Enable Filter By Progress",
"dueDateRange": "Due Date Range",
"startDateRange": "Start Date Range",
"endDateRange": "End Date Range",
"reminderRange": "Reminder Date Range"
},
"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.",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
"delete": {
"header": "Delete this saved filter",
"text": "Are you sure you want to delete this saved filter?",
"success": "The filter was deleted successfully."
},
"edit": {
"title": "Edit This Saved Filter",
"success": "The filter was saved successfully."
}
},
"migrate": {
"title": "他のサービスからのインポート",
"titleService": "{name}からVikunjaへのデータのインポート",
"import": "Vikunjaへのデータのインポート",
"description": "以下のいずれかのサービスのロゴをクリックして始めましょう。",
"descriptionDo": "アクセス可能なリスト、タスク、メモ、リマインダー、ファイルをすべてVikunjaにインポートします。",
"authorize": "Vikunjaはあなたの{name}アカウントにアクセスします。よろしければ以下のボタンをクリックして許可してください。",
"getStarted": "さっそく始めましょう",
"inProgress": "インポート中…",
"alreadyMigrated1": "すでに{name}からは{date}にインポート済みのようです。",
"alreadyMigrated2": "再びインポートすることも可能ですが、重複する可能性があります。インポートして本当によろしいですか?",
"confirm": "了解!インポート開始なのだ!",
"importUpload": "{name}からVikunjaにデータをインポートするには、以下のボタンをクリックしてファイルを選択してください。",
"upload": "ファイルのアップロード"
},
"label": {
"title": "ラベル",
"manage": "ラベルの管理",
"description": "ラベルをクリックして編集します。ラベルはアクセス可能なプロジェクトのタスクで使用できます。",
"newCTA": "利用可能なラベルは存在しません。",
"search": "ラベルのキーワードを入力…",
"create": {
"header": "新しいラベルの作成",
"title": "新しいラベルの作成",
"titleRequired": "ラベル名を入力してください。",
"success": "ラベルは正常に作成されました。"
},
"edit": {
"header": "ラベルの編集",
"forbidden": "このラベルはあなたのものではないので編集することはできません。",
"success": "ラベルは正常に更新されました。"
},
"deleteSuccess": "ラベルは正常に削除されました。",
"attributes": {
"title": "ラベル名",
"titlePlaceholder": "ラベル名を入力…",
"description": "説明",
"descriptionPlaceholder": "ラベルの説明",
"color": "色"
}
},
"sharing": {
"authenticating": "認証中…",
"passwordRequired": "この共有プロジェクトにはパスワードが必要です。パスワードを入力してください:",
"error": "エラーが発生しました。",
"invalidPassword": "無効なパスワードです。"
},
"navigation": {
"overview": "概要",
"upcoming": "今後の予定",
"settings": "設定",
"imprint": "運営情報",
"privacy": "プライバシーポリシー"
},
"misc": {
"loading": "読み込み中…",
"save": "保存",
"delete": "削除",
"confirm": "確定",
"cancel": "キャンセル",
"refresh": "更新",
"disable": "無効化",
"copy": "コピー",
"copyError": "クリップボードへのコピーに失敗",
"search": "検索",
"searchPlaceholder": "キーワードを入力…",
"previous": "前へ",
"next": "次へ",
"poweredBy": "Powered by Vikunja",
"info": "Info",
"create": "作成",
"doit": "続行",
"saving": "保存中…",
"saved": "保存しました!",
"default": "デフォルト",
"close": "閉じる",
"download": "ダウンロード",
"showMenu": "メニューの表示",
"hideMenu": "メニューの非表示",
"forExample": "例:",
"welcomeBack": "おかえりなさい",
"custom": "カスタム",
"id": "ID",
"created": "Created at",
"actions": "Actions",
"cannotBeUndone": "この操作は元に戻せません!"
},
"input": {
"resetColor": "色のリセット",
"datepicker": {
"today": "今日",
"tomorrow": "明日",
"nextMonday": "次の月曜日",
"thisWeekend": "週末",
"laterThisWeek": "今週中",
"nextWeek": "来週",
"chooseDate": "日付の選択"
},
"editor": {
"edit": "編集",
"done": "完了",
"heading1": "見出し1",
"heading2": "見出し2",
"heading3": "見出し3",
"headingSmaller": "見出しを小さくする",
"headingBigger": "見出しを大きくする",
"bold": "太字",
"italic": "斜体",
"strikethrough": "打ち消し線",
"code": "コード",
"quote": "引用",
"unorderedList": "順序なしリスト",
"orderedList": "順序付きリスト",
"cleanBlock": "Clean Block",
"link": "リンク",
"image": "画像",
"table": "テーブル",
"horizontalRule": "横罫",
"sideBySide": "Side By Side",
"guide": "説明書"
},
"multiselect": {
"createPlaceholder": "新規作成",
"selectPlaceholder": "クリックするかEnterキーを押して選択"
},
"datepickerRange": {
"to": "終了",
"from": "開始",
"fromto": "{from} 〜 {to} まで",
"ranges": {
"today": "今日",
"thisWeek": "今週",
"restOfThisWeek": "現在日時から週末まで",
"nextWeek": "来週",
"next7Days": "7日間",
"lastWeek": "先週",
"thisMonth": "今月",
"restOfThisMonth": "現在日時から月末まで",
"nextMonth": "来月",
"next30Days": "30日間",
"lastMonth": "先月",
"thisYear": "今年",
"restOfThisYear": "現在日時から年末まで"
}
},
"datemathHelp": {
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"units": {
"seconds": "秒",
"minutes": "分",
"hours": "時間",
"days": "日",
"weeks": "週間",
"months": "月",
"years": "年"
},
"examples": {
"now": "現在",
"in24h": "24時間以内",
"today": "本日00:00",
"beginningOfThisWeek": "今週の初めの00:00",
"endOfThisWeek": "今週の終わり",
"in30Days": "30日間以内",
"datePlusMonth": "{0} 00:00の1ヶ月後"
}
}
},
"task": {
"task": "タスク",
"new": "新しいタスクの作成",
"delete": "タスクの削除",
"createSuccess": "タスクは正常に作成されました。",
"addReminder": "新しいリマイダーを作成…",
"doneSuccess": "タスクを完了にしました。",
"undoneSuccess": "タスクを未完了に戻しました。",
"undo": "元に戻す",
"openDetail": "タスクの詳細を表示",
"checklistTotal": "{total}件中{checked}件のタスク",
"checklistAllDone": "{total}件のタスク",
"show": {
"titleCurrent": "現在のタスク",
"titleDates": "{from} 〜 {to} までのタスク",
"noDates": "指定日が未設定のタスクを表示",
"overdue": "期限切れタスクを表示",
"fromuntil": "{from} 〜 {until} までのタスク",
"select": "期間の選択",
"noTasks": "タスクはありません — それではよい一日を!"
},
"detail": {
"chooseDueDate": "期日を設定…",
"chooseStartDate": "開始日を設定…",
"chooseEndDate": "終了日を設定…",
"move": "別のプロジェクトにタスクを移動",
"done": "タスクを完了",
"undone": "未完了に戻す",
"created": "Created {0} by {1}",
"updated": "Updated {0}",
"doneAt": "完了 {0}",
"updateSuccess": "タスクは正常に保存されました。",
"deleteSuccess": "タスクは正常に削除されました。",
"belongsToProject": "このタスクはプロジェクト「{project}」に含まれています。",
"due": "Due {at}",
"closePopup": "閉じる",
"delete": {
"header": "タスクの削除",
"text1": "このタスクを削除して本当によろしいですか?",
"text2": "このタスクに含まれるすべての添付ファイル、リマインダー、関連付けは削除されます。この操作は元に戻せません。"
},
"actions": {
"assign": "担当者の割り当て",
"label": "ラベルの追加",
"priority": "優先度の設定",
"dueDate": "期日の設定",
"startDate": "開始日の設定",
"endDate": "終了日の設定",
"reminders": "リマインダーの設定",
"repeatAfter": "繰り返し間隔の設定",
"percentDone": "進捗状況の設定",
"attachments": "添付ファイルの追加",
"relatedTasks": "関連タスクの追加",
"moveProject": "移動",
"color": "色の設定",
"delete": "削除",
"favorite": "お気に入りに追加",
"unfavorite": "お気に入りから削除"
}
},
"attributes": {
"assignees": "担当",
"color": "色",
"created": "Created",
"createdBy": "Created By",
"description": "説明",
"done": "完了",
"dueDate": "期日",
"endDate": "終了日",
"labels": "ラベル",
"percentDone": "進捗状況",
"priority": "優先度",
"relatedTasks": "関連タスク",
"reminders": "リマインダー",
"repeat": "繰り返し間隔",
"startDate": "開始日",
"title": "タスク名",
"updated": "Updated"
},
"subscription": {
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
"subscribe": "購読",
"unsubscribe": "購読解除",
"subscribeSuccessProject": "You are now subscribed to this project",
"unsubscribeSuccessProject": "You are now unsubscribed to this project",
"subscribeSuccessTask": "You are now subscribed to this task",
"unsubscribeSuccessTask": "You are now unsubscribed to this task"
},
"attachment": {
"title": "添付ファイル",
"createdBy": "created {0} by {1}",
"downloadTooltip": "添付ファイルをダウンロード",
"upload": "添付ファイルのアップロード",
"drop": "ここにアップロードするファイルをドロップ",
"delete": "添付ファイルの削除",
"deleteTooltip": "添付ファイルを削除",
"deleteText1": "添付ファイル「{filename}」を削除して本当によろしいですか?",
"copyUrl": "URLのコピー",
"copyUrlTooltip": "添付ファイルのURLをコピー",
"setAsCover": "カバー画像にする",
"unsetAsCover": "カバー画像から取り外す",
"successfullyChangedCoverImage": "カバー画像は正常に変更されました。",
"usedAsCover": "カバー画像"
},
"comment": {
"title": "コメント",
"loading": "コメントを読み込み中…",
"edited": "edited {date}",
"creating": "コメントを作成中…",
"placeholder": "Add your comment…",
"comment": "コメント",
"delete": "コメントの削除",
"deleteText1": "このコメントを削除して本当によろしいですか?",
"deleteSuccess": "コメントは正常に削除されました。",
"addedSuccess": "コメントは正常に追加されました。"
},
"deferDueDate": {
"title": "延期",
"1day": "1日後",
"3days": "3日後",
"1week": "1週間後"
},
"description": {
"placeholder": "クリックして説明を入力…",
"empty": "説明文はありません。"
},
"assignee": {
"placeholder": "Type to assign a user…",
"selectPlaceholder": "Assign this user",
"assignSuccess": "The user has been assigned successfully.",
"unassignSuccess": "The user has been unassigned successfully."
},
"label": {
"placeholder": "Type to add a new label…",
"createPlaceholder": "Add this as new label",
"addSuccess": "The label has been added successfully.",
"createSuccess": "The label has been created successfully.",
"removeSuccess": "The label has been removed successfully.",
"addCreateSuccess": "The label has been created and added successfully.",
"delete": {
"header": "Delete this label",
"text1": "Are you sure you want to delete this label?",
"text2": "This will remove it from all tasks and cannot be restored."
}
},
"priority": {
"unset": "未設定",
"low": "低",
"medium": "中",
"high": "高",
"urgent": "至急",
"doNow": "大至急"
},
"relation": {
"add": "新しい関連タスクの追加",
"new": "新しい関連タスクの作成",
"searchPlaceholder": "追加する関連タスクのキーワードを入力…",
"createPlaceholder": "Add this as new related task",
"differentProject": "This task belongs to a different project.",
"noneYet": "関連タスクはまだありません。",
"delete": "関連タスクの削除",
"deleteText1": "Are you sure you want to delete this task relation?",
"select": "Select a relation kind",
"taskRequired": "Please select a task or enter a new task title.",
"kinds": {
"subtask": "サブタスク",
"parenttask": "親タスク",
"related": "関連タスク",
"duplicateof": "Duplicate Of | Duplicates Of",
"duplicates": "Duplicates | Duplicates",
"blocking": "Blocking | Blocking",
"blocked": "Blocked By | Blocked By",
"precedes": "Precedes | Precedes",
"follows": "Follows | Follows",
"copiedfrom": "Copied From | Copied From",
"copiedto": "Copied To | Copied To"
}
},
"repeat": {
"everyDay": "毎日",
"everyWeek": "毎週",
"everyMonth": "毎月",
"mode": "繰り返しモード",
"monthly": "毎月",
"fromCurrentDate": "現在時刻からの間隔",
"each": "隔",
"specifyAmount": "数字を入力…",
"hours": "時間ごと",
"days": "日ごと",
"weeks": "週間ごと",
"months": "ヶ月ごと",
"years": "年ごと",
"invalidAmount": "0以上を入力してください。"
},
"quickAddMagic": {
"hint": "You can use Quick Add Magic",
"what": "What?",
"title": "Quick Add Magic",
"intro": "When creating a task, you can use special keywords to directly add attributes to the newly created task. This allows to add commonly used attributes to tasks much faster.",
"multiple": "You can use this multiple times.",
"label1": "To add a label, simply prefix the name of the label with {prefix}.",
"label2": "Vikunja will first check if the label already exist and create it if not.",
"label3": "To use spaces, simply add a \" or ' around the label name.",
"label4": "For example: {prefix}\"Label with spaces\".",
"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\".",
"dateAndTime": "日付と時刻",
"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",
"dateCurrentYear": "will use the current year",
"dateNth": "will use the {day}th of the current month",
"dateTime": "Combine any of the date formats with \"{time}\" (or {timePM}) to set a time.",
"repeats": "Repeating tasks",
"repeatsDescription": "To set a task as repeating in an interval, simply add '{suffix}' to the task text. The amount needs to be a number and can be omitted to use just the type (see examples)."
}
},
"team": {
"title": "チーム",
"noTeams": "現在どのチームにも所属していません。",
"create": {
"title": "新しいチームの作成",
"success": "チームは正常に作成されました。"
},
"edit": {
"title": "チーム「{team}」の編集",
"members": "チームメンバー",
"search": "ユーザーのキーワードを入力…",
"addUser": "チームに追加",
"makeMember": "メンバーにする",
"makeAdmin": "管理者にする",
"success": "チームは正常に更新されました。",
"userAddedSuccess": "チームメンバーは正常に追加されました。",
"madeMember": "チームメンバーはメンバーになりました。",
"madeAdmin": "チームメンバーは管理者になりました。",
"mustSelectUser": "ユーザーを選択してください。",
"delete": {
"header": "チームの削除",
"text1": "このチームと所属するチームメンバー全員を削除して本当によろしいですか?",
"text2": "All team members will lose access to projects shared with this team. This CANNOT BE UNDONE!",
"success": "チームは正常に削除されました。"
},
"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 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 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."
}
},
"attributes": {
"name": "Team Name",
"namePlaceholder": "The team's name goes here…",
"nameRequired": "Please specify a name.",
"description": "説明",
"descriptionPlaceholder": "The teams description goes here…",
"admin": "管理者",
"member": "メンバー"
}
},
"keyboardShortcuts": {
"title": "キーボードショートカット",
"general": "General",
"allPages": "These shortcuts work on all pages.",
"currentPageOnly": "These shortcuts work only on the current page.",
"somePagesOnly": "These shortcuts work only on some pages.",
"toggleMenu": "Toggle The Menu",
"quickSearch": "Open the search/quick action bar",
"then": "then",
"task": {
"title": "Task Page",
"done": "タスクの完了/取り消し",
"assign": "Assign this task to a user",
"labels": "Add labels to this task",
"dueDate": "Change the due date of this task",
"attachment": "このタスクに添付ファイルを追加",
"related": "Modify related tasks of this task",
"color": "タスクの色の変更",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description",
"delete": "タスクの削除",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
},
"project": {
"title": "Project Views",
"switchToListView": "リストで表示",
"switchToGanttView": "ガントチャートで表示",
"switchToKanbanView": "カンバンボードで表示",
"switchToTableView": "テーブルで表示"
},
"navigation": {
"title": "Navigation",
"overview": "Navigate to overview",
"upcoming": "Navigate to upcoming tasks",
"labels": "Navigate to labels",
"teams": "Navigate to teams",
"projects": "Navigate to projects"
}
},
"update": {
"available": "There is an update available!",
"do": "Update Now"
},
"menu": {
"edit": "編集",
"archive": "アーカイブ",
"duplicate": "Duplicate",
"delete": "削除",
"unarchive": "アーカイブの取り消し",
"setBackground": "Set background",
"share": "共有",
"newProject": "新しいプロジェクトの作成",
"createProject": "Create project"
},
"apiConfig": {
"url": "Vikunja URL",
"urlPlaceholder": "例: https://localhost:3456",
"change": "変更",
"use": "{0} に設置されたVikunjaを使用します。",
"error": "\"{domain}\" にはVikunjaは存在しないか使用できない状態です。別のURLでお試しください。",
"success": "\"{domain}\" に設置されたVikunjaを使用します。",
"urlRequired": "URLは必須です。"
},
"loadingError": {
"failed": "Loading failed, please {0}. If the error persists, please {1}.",
"tryAgain": "try again",
"contact": "contact us"
},
"notification": {
"title": "Notifications",
"none": "You don't have any notifications. Have a nice day!",
"explainer": "Notifications will appear here when actions projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "コマンド",
"placeholder": "コマンドまたはキーワードを入力…",
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
"tasks": "タスク",
"projects": "プロジェクト",
"teams": "チーム",
"newProject": "新しいプロジェクト名を入力…",
"newTask": "新しいタスク名を入力…",
"newTeam": "新しいチーム名を入力…",
"createTask": "現在のプロジェクト ({title}) にタスクを作成",
"createProject": "Create a project",
"cmds": {
"newTask": "新しいタスクの作成",
"newProject": "新しいプロジェクトの作成",
"newTeam": "新しいチームの作成"
}
},
"date": {
"locale": "ja",
"altFormatLong": "Y/n/j H:i",
"altFormatShort": "Y/n/j"
},
"error": {
"error": "Error",
"success": "Success",
"0001": "You're not allowed to do that.",
"1001": "A user with this username already exists.",
"1002": "A user with this email address already exists.",
"1004": "No username and password specified.",
"1005": "そのユーザーは存在しません。",
"1006": "Could not get the user id.",
"1008": "No password reset token provided.",
"1009": "無効なパスワードリセット用トークンです。",
"1010": "無効なメール確認用トークンです。",
"1011": "ユーザー名またはパスワードが正しくありません。",
"1012": "Email address of the user not confirmed.",
"1013": "New password is empty.",
"1014": "Old password is empty.",
"1015": "このユーザーはすでにTOTPが有効になっています。",
"1016": "このユーザーはTOTPが有効ではありません。",
"1017": "無効なTOTP認証コードです。",
"1018": "The user avatar type setting is invalid.",
"2001": "ID cannot be empty or 0.",
"2002": "Some of the request data was invalid.",
"3001": "そのプロジェクトは存在しません。",
"3004": "You need to have read permissions on that project to perform that action.",
"3005": "The project title cannot be empty.",
"3006": "その共有プロジェクトは存在しません。",
"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": "そのプロジェクトのタスクは存在しません。",
"4003": "All bulk editing tasks must belong to the same project.",
"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.",
"4007": "You can't create a task relation with an invalid kind of relation.",
"4008": "You can't create a task relation which already exists.",
"4009": "その関連タスクは存在しません。",
"4010": "Cannot relate a task with itself.",
"4011": "その添付ファイルは存在しません。",
"4012": "添付ファイルが大きすぎます。",
"4013": "The task sort param is invalid.",
"4014": "The task sort order is invalid.",
"4015": "そのコメントは存在しません。",
"4016": "Invalid task field.",
"4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatenator.",
"4019": "Invalid task filter value.",
"6001": "The team name cannot be empty.",
"6002": "そのチームは存在しません。",
"6004": "The team already has access to that project.",
"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.",
"8001": "This label already exists on that task.",
"8002": "そのラベルは存在しません。",
"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.",
"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.",
"11001": "The saved filter does not exist.",
"11002": "Saved filters are not available for link shares.",
"12001": "The subscription entity type is invalid.",
"12002": "You are already subscribed to the entity itself or a parent entity.",
"13001": "This link share requires a password for authentication, but none was provided.",
"13002": "The provided link share password was invalid."
},
"about": {
"title": "Vikunjaについて",
"frontendVersion": "フロントエンドのバージョン: {version}",
"apiVersion": "APIのバージョン: {version}"
}
}

View File

@ -6,7 +6,9 @@
"welcomeEvening": "Good Evening {username}!",
"lastViewed": "Laatst bekeken",
"project": {
"importText": "Import your projects and tasks from other services into Vikunja:",
"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"
}
},
@ -141,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 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, projects, tasks and everything associated with it.",
"text2": "Graag je wachtwoord invullen om verder te gaan. Je zult een e-mail ontvangen met verdere instructies.",
"confirm": "Verwijder mijn account",
"requestSuccess": "Het verzoek was succesvol. Je ontvangt een e-mail met verdere instructies.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Je Vikunja gegevens exporteren",
"description": "You can request a copy of all your Vikunja data. This includes 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, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Voer je wachtwoord in om door te gaan:",
"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.",
@ -163,18 +165,14 @@
}
},
"project": {
"archivedMessage": "This project is archived. It is not possible to create new or edit tasks for it.",
"archived": "Archived",
"showArchived": "Show Archived",
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
"title": "Project Title",
"color": "Color",
"projects": "Projects",
"parent": "Parent Project",
"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.",
"inboxTitle": "Inbox",
"create": {
"header": "New project",
"titlePlaceholder": "The project's title goes here…",
@ -212,7 +210,7 @@
"duplicate": {
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a parent project which should hold the duplicated project:",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
@ -323,6 +321,67 @@
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"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.",
"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.",
"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.",
"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."
},
"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!",
"success": "De Namespace is succesvol verwijderd."
},
"edit": {
"title": "Bewerk \"{namespace}\"",
"success": "The namespace was successfully updated."
},
"share": {
"title": "\"{namespace}\" delen"
},
"attributes": {
"title": "Namespace titel",
"titlePlaceholder": "The namespace title goes here…",
"description": "Beschrijving",
"descriptionPlaceholder": "The namespaces description goes here…",
"color": "Kleur",
"archived": "Is gearchiveerd",
"isArchived": "This namespace is archived"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Favorieten"
},
"savedFilters": {
"title": "Filters"
}
}
},
"filters": {
"title": "Filters",
"clear": "Clear Filters",
@ -344,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.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
@ -470,7 +529,7 @@
"code": "Code",
"quote": "Citaat",
"unorderedList": "Ongesorteerde lijst",
"orderedList": "Ordered List",
"orderedList ": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Afbeelding",
@ -507,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -615,13 +674,19 @@
"updated": "Bijgewerkt"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
"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",
"subscribeSuccessTask": "You are now subscribed to this task",
@ -698,6 +763,7 @@
"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.",
"differentNamespace": "This task belongs to a different namespace.",
"noneYet": "Nog geen taakrelaties.",
"delete": "Taak relatie verwijderen",
"deleteText1": "Weet je zeker dat je deze taakrelatie wilt verwijderen?",
@ -782,19 +848,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 shared with this team. This CANNOT BE UNDONE!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "The team was successfully deleted."
},
"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 this team has access to. This CANNOT BE UNDONE!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "The user was successfully deleted from the team."
},
"leave": {
"title": "Leave team",
"text1": "Are you sure you want to leave this team?",
"text2": "You will lose access to all projects this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "You have successfully left the team."
}
},
@ -828,10 +894,7 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
"description": "Toggle editing of the task description"
},
"project": {
"title": "Project Views",
@ -844,9 +907,9 @@
"title": "Navigation",
"overview": "Navigate to overview",
"upcoming": "Navigate to upcoming tasks",
"namespaces": "Navigate to namespaces & projects",
"labels": "Navigate to labels",
"teams": "Navigate to teams",
"projects": "Navigate to projects"
"teams": "Navigate to teams"
}
},
"update": {
@ -861,8 +924,7 @@
"unarchive": "Archivering opheffen",
"setBackground": "Achtergrond instellen",
"share": "Delen",
"newProject": "New project",
"createProject": "Create project"
"newProject": "New project"
},
"apiConfig": {
"url": "Vikunja URL",
@ -881,7 +943,7 @@
"notification": {
"title": "Notificaties",
"none": "Je hebt geen meldingen. Fijne dag!",
"explainer": "Notifications will appear here when actions projects or tasks you subscribed to happen."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Commands",
@ -892,12 +954,14 @@
"teams": "Teams",
"newProject": "Enter the title of the new project…",
"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",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "Nieuwe taak",
"newProject": "New project",
"newNamespace": "Nieuwe namespace",
"newTeam": "Nieuw team"
}
},
@ -953,9 +1017,16 @@
"4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatenator.",
"4019": "Ongeldige taakfilter waarde.",
"5001": "Deze Namespace bestaat niet.",
"5003": "Je hebt geen toegang tot de opgegeven Namespace.",
"5006": "De naam van de namespace mag niet leeg zijn.",
"5009": "You need to have namespace read access to perform that action.",
"5010": "This team does not have access to that namespace.",
"5011": "This user has already access to that namespace.",
"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 project.",
"6004": "The team already has access to that namespace or project.",
"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.",
@ -982,4 +1053,4 @@
"frontendVersion": "Frontend versie: {version}",
"apiVersion": "API Versie: {version}"
}
}
}

View File

@ -6,8 +6,10 @@
"welcomeEvening": "God Morgen {username}!",
"lastViewed": "Sist sett",
"project": {
"importText": "Import your projects and tasks from other services into Vikunja:",
"import": "Importer dine data til Vikunja"
"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"
}
},
"404": {
@ -83,7 +85,7 @@
"weekStartSunday": "Søndag",
"weekStartMonday": "Mandag",
"language": "Språk",
"defaultProject": "Standard prosjekt",
"defaultProject": "Default Project",
"timezone": "Tidssone",
"overdueTasksRemindersTime": "Utløpte påminnelses-tid for oppgaver"
},
@ -141,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 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, projects, tasks and everything associated with it.",
"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.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Eksporter dine kontodata",
"description": "You can request a copy of all your Vikunja data. This includes 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, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Skriv inn passordet for å fortsette:",
"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.",
@ -163,163 +165,220 @@
}
},
"project": {
"archivedMessage": "This project is archived. It is not possible to create new or edit tasks for it.",
"archived": "Archived",
"showArchived": "Show Archived",
"title": "Prosjekt tittel",
"color": "Farger",
"projects": "Prosjekter",
"parent": "Parent Project",
"search": "Tast for å søke etter et prosjekt…",
"searchSelect": "Klikk eller trykk enter for å velge dette prosjektet",
"shared": "Delte prosjekter",
"noDescriptionAvailable": "Ingen prosjektbeskrivelse er tilgjengelig.",
"inboxTitle": "Inbox",
"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.",
"create": {
"header": "Nytt prosjekt",
"titlePlaceholder": "Prosjektets tittel er her…",
"addTitleRequired": "Angi den nye tittelen.",
"createdSuccess": "Prosjektet ble opprettet.",
"addProjectRequired": "Vennligst spesifiser et prosjekt eller angi et standardprosjekt i innstillingene."
"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."
},
"archive": {
"title": "Arkiver{project}\"",
"archive": "Arkiver dette prosjektet",
"unarchive": "Av-arkivere dette prosjektet",
"unarchiveText": "Du vil kunne opprette nye oppgaver eller redigere den.",
"archiveText": "Du vil ikke være i stand til å redigere denne listen eller opprette nye oppgaver før du fjerner arkiveringen.",
"success": "Prosjektet ble vellykket arkivert."
"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."
},
"background": {
"title": "Angi prosjektbakgrunn",
"remove": "Fjern bakgrunn",
"upload": "Velg en bakgrunn fra din pc",
"searchPlaceholder": "Søk etter en bakgrunn…",
"poweredByUnsplash": "Drevet av Unsplash",
"loadMore": "Laste inn flere bilder",
"success": "Bakgrunnen er satt vellykket!",
"removeSuccess": "Bakgrunnen har blitt fjernet!"
"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!"
},
"delete": {
"title": "Slett \"{project}",
"header": "Slett dette prosjektet",
"text1": "Er du sikker på at du vil slette dette prosjektet og alle relaterte data?",
"text2": "Dette inkluderer alle oppgaver og KAN IKKE ANGRES!",
"success": "Prosjektet ble slettet.",
"tasksToDelete": "Dette vil ugjenkallelig fjerne ca. {count} oppgaver.",
"noTasksToDelete": "Dette prosjektet inneholder ingen oppgaver, det bør være trygt å slette."
"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."
},
"duplicate": {
"title": "Dupliser dette prosjektet",
"label": "Dupliser",
"text": "Select a parent project which should hold the duplicated project:",
"success": "Prosjektet ble duplisert."
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
"header": "Rediger prosjekt",
"title": "Rediger \"{project}",
"titlePlaceholder": "Prosjekttittelen går her…",
"identifierTooltip": "Prosjektidentifikatoren kan brukes til å identifisere en oppgave på tvers av prosjekter. Du kan sette den til tom for å deaktivere den.",
"identifier": "Prosjekt identifikator",
"identifierPlaceholder": "Prosjektidentifikatoren kommer her…",
"description": "Beskrivelse",
"descriptionPlaceholder": "Beskrivelsen gis her…",
"color": "Farger",
"success": "Prosjektet ble opprettet."
"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."
},
"share": {
"header": "Del dette prosjektet",
"title": "Del \"{project}\"",
"share": "Del",
"header": "Share this project",
"title": "Share \"{project}\"",
"share": "Share",
"links": {
"title": "Del link",
"what": "Hva er en lenke for deling?",
"explanation": "Lenker lar deg enkelt dele et prosjekt med andre brukere som ikke har en konto på Vikunja.",
"create": "Opprett en ny lenkedeling",
"name": "Navn (valgfritt)",
"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": "Alle handlinger utført av denne koblingsdelingen vises med navnet.",
"password": "Passord (valgfritt)",
"passwordExplanation": "Når brukeren autentiseres, må vedkommende angi dette passordet.",
"noName": "Ingen navn satt",
"remove": "Fjern en link deling",
"removeText": "Er du sikker på at du vil fjerne denne lenkedelen? Det vil ikke lenger være mulig å åpne dette prosjektet med denne lenkedelingen. Dette kan ikke angres!",
"createSuccess": "Delingen ble opprettet.",
"deleteSuccess": "Delingen ble slettet",
"view": "Vis",
"sharedBy": "Delt av {0}"
"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}"
},
"userTeam": {
"typeUser": "bruker | brukere",
"typeUser": "user | users",
"typeTeam": "team | teams",
"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."
"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."
},
"right": {
"title": "Rettighet",
"read": "Kun lese",
"readWrite": "Lese og skrive",
"admin": "Administrator"
"title": "Permission",
"read": "Read only",
"readWrite": "Read & write",
"admin": "Admin"
},
"attributes": {
"link": "Link",
"delete": "Slett"
"delete": "Delete"
}
},
"list": {
"title": "Liste",
"add": "Legg til",
"addPlaceholder": "Legg til ny oppgave…",
"empty": "Dette prosjektet er for øyeblikket tomt.",
"newTaskCta": "Lage en ny oppgave.",
"editTask": "Endre oppgave"
"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": "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."
"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."
},
"table": {
"title": "Tabell",
"columns": "Kolonner"
"title": "Table",
"columns": "Columns"
},
"kanban": {
"title": "Kanban",
"limit": "Grense: {limit}",
"noLimit": "Ikke Angitt",
"doneBucket": "Ferdig bøtte",
"doneBucketHint": "Alle oppgaver som flyttet til denne bøtte vil automatisk bli markert som ferdig.",
"doneBucketHintExtended": "Alle oppgaver som er flyttet inn i den utførte bøtten, vil bli merket som utført automatisk. Alle oppgaver merket som gjort fra andre steder vil også bli flyttet.",
"doneBucketSavedSuccess": "Bøtten er lagret.",
"deleteLast": "Du kan ikke fjerne den siste bøtten.",
"addTaskPlaceholder": "Angi den nye oppgavens tittel…",
"addTask": "Legg til oppgave",
"addAnotherTask": "Legg til en annen oppgave",
"addBucket": "Lag en ny bøtte",
"addBucketPlaceholder": "Angi den nye bøtte tittelen…",
"deleteHeaderBucket": "Slett bøtte",
"deleteBucketText1": "Er du sikker på at du vil slette denne bøtte?",
"deleteBucketText2": "Dette vil ikke slette noen oppgaver, men flytte dem til standard bøtte.",
"deleteBucketSuccess": "Bøtten er slettet.",
"bucketTitleSavedSuccess": "Bøtten er lagret.",
"bucketLimitSavedSuccess": "Grensen på bøtte er lagret.",
"collapse": "Skjul denne bøtten"
"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"
},
"pseudo": {
"favorites": {
"title": "Favorites"
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"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.",
"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.",
"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.",
"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."
},
"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!",
"success": "Navnområdet ble slettet."
},
"edit": {
"title": "Rediger \"{namespace}",
"success": "Navnerommet ble oppdatert."
},
"share": {
"title": "Del \"{namespace}"
},
"attributes": {
"title": "Navneområdes Tittel",
"titlePlaceholder": "Navneområdets tittel går her…",
"description": "Beskrivelse",
"descriptionPlaceholder": "Beskrivelsen av navneområdene gis her…",
"color": "Farger",
"archived": "Arkivert",
"isArchived": "Dette navneområdet er arkivert"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Favoritter"
},
"savedFilters": {
"title": "Filtre"
}
}
},
@ -344,9 +403,9 @@
},
"create": {
"title": "Nytt lagret filter",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Opprett nytt filter",
"titleRequired": "Skriv inn en tittel for filteret."
"titleRequired": "Please provide a title for the filter."
},
"delete": {
"header": "Slett dette lagrede filteret",
@ -376,7 +435,7 @@
"label": {
"title": "Etiketter",
"manage": "Behandle etiketter",
"description": "Klikk på en etikett for å redigere den. Du kan redigere alle etikettene du lagde, du kan bruke alle etikettene som er tilknyttet en oppgave som du har tilgang til.",
"description": "Click on a label to edit it. You can edit all labels you created, you can use all labels which are associated with a task to whose project you have access.",
"newCTA": "Du har ingen etiketter for øyeblikket.",
"search": "Skriv for å søke etter en etikett…",
"create": {
@ -401,7 +460,7 @@
},
"sharing": {
"authenticating": "Autentiserer…",
"passwordRequired": "Denne delte listen krever et passord. Vennligst skriv det nedenfor:",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"error": "En feil oppsto.",
"invalidPassword": "Det oppgitte passordet er ugyldig."
},
@ -470,7 +529,7 @@
"code": "Kode",
"quote": "Sitat",
"unorderedList": "Uordnet liste",
"orderedList": "Sortert liste",
"orderedList ": "Ordered List",
"cleanBlock": "Tøm blokk",
"link": "Link",
"image": "Bilde",
@ -513,8 +572,8 @@
"add1Day": "Legg til en dag",
"minus1Day": "Trekk fra en dag",
"roundDay": "Rund ned til nærmeste verdi",
"supportedUnits": "Støttede tidsenheter",
"someExamples": "Noen eksempler på tidsuttrykk",
"supportedUnits": "Støttede tidsenheter er:",
"someExamples": "Noen eksempler på tidsuttrykk:",
"units": {
"seconds": "Sekunder",
"minutes": "Minutter",
@ -543,7 +602,7 @@
"addReminder": "Legg til en ny påminnelse…",
"doneSuccess": "Oppgaven ble markert som ferdig.",
"undoneSuccess": "Oppgaven ble fjernet som ferdig.",
"undo": "Angre",
"undo": "Undo",
"openDetail": "Åpne detaljvisning",
"checklistTotal": "{checked} av {total} oppgaver",
"checklistAllDone": "{total} oppgaver",
@ -560,7 +619,7 @@
"chooseDueDate": "Klikk her for å angi en forfallsdato",
"chooseStartDate": "Klikk her for å angi en startdato",
"chooseEndDate": "Klikk her for å angi en sluttdato",
"move": "Flytt oppgaven til en annen liste",
"move": "Move task to a different project",
"done": "Marker som utført!",
"undone": "Merk som uferdig",
"created": "Opprettet {0} av {1}",
@ -568,7 +627,7 @@
"doneAt": "Ferdig {0}",
"updateSuccess": "Oppgaven ble lagret.",
"deleteSuccess": "Oppgaven har blitt slettet.",
"belongsToProject": "Denne oppgaven tilhører listen '{project}'",
"belongsToProject": "This task belongs to project '{project}'",
"due": "Forfallsdato {at}",
"closePopup": "Lukk popup",
"delete": {
@ -588,7 +647,7 @@
"percentDone": "Angi fremdrift",
"attachments": "Legg til vedlegg",
"relatedTasks": "Legg til relasjon",
"moveProject": "Flytt",
"moveProject": "Move",
"color": "Sett Farge",
"delete": "Slett",
"favorite": "Legg til i favoritter",
@ -615,15 +674,21 @@
"updated": "Oppdatert"
},
"subscription": {
"subscribedTaskThroughParentProject": "Du kan ikke melde deg ut her fordi du abonnerer på denne oppgaven gjennom prosjektet.",
"subscribedProject": "Du abonnerer for øyeblikket på dette prosjektet og vil motta varsler for endringer.",
"notSubscribedProject": "Du abonnerer ikke på dette prosjektet og vil ikke motta varsler for endringer.",
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "Du kan ikke slutte å abonnere her fordi du abonnerer på denne oppgaven gjennom navneområdet.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "Du abonnerer for øyeblikket på dette navneområdet og vil motta varsler for endringer.",
"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.",
"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",
"subscribeSuccessProject": "Du abonnerer nå på dette prosjektet",
"unsubscribeSuccessProject": "Du har nå avsluttet abonnementet for dette prosjektet",
"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",
"subscribeSuccessTask": "Du abonnerer nå på denne oppgaven",
"unsubscribeSuccessTask": "Du har nå avsluttet abonnementet for denne oppgaven"
},
@ -697,7 +762,8 @@
"new": "Ny oppgaveforbindelse",
"searchPlaceholder": "Skriv søk etter en ny oppgave å legge til som relatert…",
"createPlaceholder": "Legg til denne som ny relatert oppgave",
"differentProject": "Denne oppgaven tilhører et annet prosjekt.",
"differentProject": "This task belongs to a different project.",
"differentNamespace": "Denne oppgaven tilhører en annen navneområde.",
"noneYet": "Ingen arbeidsrelasjoner ennå.",
"delete": "Slett relasjon",
"deleteText1": "Er du sikker på at du vil slette denne relasjonen?",
@ -746,10 +812,10 @@
"priority1": "For å angi en oppgaves prioritet, legg til et nummer 1-5, med en {prefix} som prefiks.",
"priority2": "Jo høyere tallet er, desto høyere prioritet.",
"assignees": "For å direkte tilordne oppgaven til en bruker må du legge til brukernavnet deres med {prefix} som er prefikset på oppgaven.",
"project1": "For å angi et prosjekt for oppgaven som skal vises i, angi dets navn med {prefix}.",
"project2": "Dette vil returnere en feil dersom prosjektet ikke finnes.",
"project3": "For å bruke mellomrom, legg bare til en \" eller ' rundt navnet på prosjektet.",
"project4": "For eksempel: {prefix}\"Prosjekt med mellomrom\".",
"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\".",
"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",
@ -782,19 +848,19 @@
"delete": {
"header": "Slett gruppen",
"text1": "Er du sikker på at du vil slette denne gruppen og alle dets medlemmer?",
"text2": "All team members will lose access to projects shared with this team. This CANNOT BE UNDONE!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "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 this team has access to. This CANNOT BE UNDONE!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "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 this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "Du har forlatt gruppen."
}
},
@ -826,27 +892,24 @@
"attachment": "Legg til et vedlegg til denne oppgaven",
"related": "Endre relaterte oppgaver for denne oppgaven",
"color": "Endre fargen på denne oppgaven",
"move": "Flytt denne oppgaven til et annet prosjekt",
"move": "Move this task to another project",
"reminder": "Behandle påminnelser om denne oppgaven",
"description": "Veksle redigering av oppgavebeskrivelsen",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
"description": "Veksle redigering av oppgavebeskrivelsen"
},
"project": {
"title": "Prosjektvisning",
"switchToListView": "Byttet til listevisning",
"switchToGanttView": "Bytt til gantt-visning",
"switchToKanbanView": "Bytt til kanban visning",
"switchToTableView": "Bytt til tabellvisning"
"title": "Project Views",
"switchToListView": "Switch to list view",
"switchToGanttView": "Switch to gantt view",
"switchToKanbanView": "Switch to kanban view",
"switchToTableView": "Switch to table view"
},
"navigation": {
"title": "Navigasjon",
"overview": "Naviger til oversikt",
"upcoming": "Gå til kommende oppgaver",
"namespaces": "Navigate to namespaces & projects",
"labels": "Naviger til etiketter",
"teams": "Naviger til gruppe",
"projects": "Navigate to projects"
"teams": "Naviger til gruppe"
}
},
"update": {
@ -861,8 +924,7 @@
"unarchive": "Av-arkiver",
"setBackground": "Bruk som bakgrunn",
"share": "Del",
"newProject": "Nytt prosjekt",
"createProject": "Create project"
"newProject": "New project"
},
"apiConfig": {
"url": "Vikunja URL",
@ -881,23 +943,25 @@
"notification": {
"title": "Varsler",
"none": "Du har ingen varsler på dette tidspunktet!",
"explainer": "Notifications will appear here when actions projects or tasks you subscribed to happen."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Kommandoer",
"placeholder": "Skriv en kommando eller søk…",
"hint": "Du kan bruke {project} for å begrense søket til en liste. Kombiner {project} eller {label} (etiketter) med et søk for å søke etter en oppgave med disse etikettene eller på den listen. Bruk {assignee} for bare å søke etter lag.",
"hint": "You can use {project} to limit the search to a project. Combine {project} or {label} (labels) with a search query to search for a task with these labels or on that project. Use {assignee} to only search for teams.",
"tasks": "Oppgaver",
"projects": "Prosjekter",
"projects": "Projects",
"teams": "Grupper",
"newProject": "Skriv tittelen på det nye prosjektet…",
"newProject": "Enter the title of the new project…",
"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": "Opprett en oppgave i det gjeldende prosjektet ({title})",
"createProject": "Create a project",
"createTask": "Create a task in the current project ({title})",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "Ny oppgave",
"newProject": "Nytt prosjekt",
"newProject": "New project",
"newNamespace": "Nytt navneområde",
"newTeam": "Ny gruppe"
}
},
@ -928,15 +992,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": "Prosjektet finnes ikke.",
"3004": "Du må ha lesetilgang til prosjektet for å utføre den handlingen.",
"3005": "Tittelen kan ikke være tom.",
"3006": "Prosjektdeling finnes ikke.",
"3007": "Et prosjekt med denne identifikatoren eksisterer allerede.",
"3008": "Prosjektet er arkivert og kan derfor bare leses inn. Dette gjelder også for alle oppgaver som er tilknyttet dette prosjektet.",
"4001": "Prosjektets oppgavetekst kan ikke være tom.",
"4002": "Prosjektoppgaven finnes ikke.",
"4003": "Alle bulkredigering oppgaver må tilhøre samme prosjekt.",
"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.",
"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.",
@ -953,23 +1017,30 @@
"4017": "Ugyldig oppgave filter.",
"4018": "Ugyldig oppgave filter.",
"4019": "Ugyldig oppgave filterverdi.",
"5001": "Navneområdet finnes ikke.",
"5003": "Du har ikke tilgang til det angitte navneområdet.",
"5006": "Navneområde-navnet kan ikke være tomt.",
"5009": "Du må ha lesetilgang til navneområdet for å utføre den handlingen.",
"5010": "Denne gruppen har ikke tilgang til det navneområdet.",
"5011": "Denne brukeren har allerede tilgang til det navneområdet.",
"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 project.",
"6004": "The team already has access to that namespace or project.",
"6005": "Brukeren er allerede medlem av gruppen.",
"6006": "Kan ikke slette siste gruppemedlem.",
"6007": "Gruppen har ikke tilgang til prosjektet for å utføre den handlingen.",
"7002": "Brukeren har allerede tilgang til det prosjektet.",
"7003": "Du har ikke tilgang til det prosjektet.",
"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.",
"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": "Denne bøtte tilhører ikke det prosjektet.",
"10003": "Du kan ikke fjerne den siste bøtten på et prosjekt.",
"10002": "The bucket does not belong to that project.",
"10003": "You cannot remove the last bucket on a project.",
"10004": "Du kan ikke legge til oppgaven i denne bøtte fordi den allerede overskrider grensen på oppgaver som den kan holde.",
"10005": "Det kan bare finnes én ferdigstilt bøtte per prosjekt.",
"10005": "There can be only one done bucket per project.",
"11001": "Det lagrede filteret finnes ikke.",
"11002": "Lagrede filtre er ikke tilgjengelige for lenke delinger.",
"12001": "Abonnement enhetstypen er ugyldig.",
@ -982,4 +1053,4 @@
"frontendVersion": "Frontend versjon: {version}",
"apiVersion": "API versjon: {version}"
}
}
}

View File

@ -6,7 +6,9 @@
"welcomeEvening": "Good Evening {username}!",
"lastViewed": "Ostatnio oglądane",
"project": {
"importText": "Import your projects and tasks from other services into Vikunja:",
"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"
}
},
@ -141,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 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, projects, tasks and everything associated with it.",
"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.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Eksportuj swoje dane Vikunja",
"description": "You can request a copy of all your Vikunja data. This includes 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, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Wprowadź hasło, aby kontynuować:",
"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.",
@ -163,18 +165,14 @@
}
},
"project": {
"archivedMessage": "This project is archived. It is not possible to create new or edit tasks for it.",
"archived": "Archived",
"showArchived": "Show Archived",
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
"title": "Project Title",
"color": "Color",
"projects": "Projects",
"parent": "Parent Project",
"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.",
"inboxTitle": "Inbox",
"create": {
"header": "New project",
"titlePlaceholder": "The project's title goes here…",
@ -212,7 +210,7 @@
"duplicate": {
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a parent project which should hold the duplicated project:",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
@ -323,6 +321,67 @@
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"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.",
"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.",
"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.",
"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."
},
"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!",
"success": "Sekcja została pomyślnie usunięta."
},
"edit": {
"title": "Edytuj \"{namespace}\"",
"success": "Sekcja została pomyślnie zaktualizowana."
},
"share": {
"title": "Udostępnij \"{namespace}\""
},
"attributes": {
"title": "Tytuł sekcji",
"titlePlaceholder": "Tu wpisz tytuł sekcji…",
"description": "Opis",
"descriptionPlaceholder": "Tu wpisz opis sekcji…",
"color": "Kolor",
"archived": "Archiwizacja",
"isArchived": "Ta sekcja jest zarchiwizowana"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Ulubione"
},
"savedFilters": {
"title": "Filtry"
}
}
},
"filters": {
"title": "Filtry",
"clear": "Wyczyść filtry",
@ -344,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.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Utwórz nowy filtr stały",
"titleRequired": "Please provide a title for the filter."
},
@ -470,7 +529,7 @@
"code": "Kod",
"quote": "Cytat",
"unorderedList": "Lista nieuporządkowana",
"orderedList": "Ordered List",
"orderedList ": "Ordered List",
"cleanBlock": "Wyczyść blok",
"link": "Link",
"image": "Obraz",
@ -507,14 +566,14 @@
"canuse": "Możesz użyć kalkulacji dat do względnego filtrowania dat.",
"learnhow": "Sprawdź jak to działa",
"title": "Kalkulacja daty",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Kalkulacja daty pozwala względnie określić daty, które są przetwarzane przez Vikunję w locie, w czasie stosowania filtra.",
"expression": "Każde wyrażenie kalkulacji daty rozpoczyna się datą zakotwiczenia, którą może być {0} lub wyrażeniem daty zakończonym {1}. Po tej dacie zakotwiczenia opcjonalnie może następować jedno lub więcej wyrażeń matematycznych.",
"similar": "Te wyrażenia są podobne do tych dostarczonych przez {0} i {1}.",
"add1Day": "Dodaj jeden dzień",
"minus1Day": "Odejmij jeden dzień",
"roundDay": "Zaokrąglij w dół do najbliższego dnia",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"supportedUnits": "Obsługiwane jednostki czasu to:",
"someExamples": "Kilka przykładów wyrażeń czasowych:",
"units": {
"seconds": "Sekundy",
"minutes": "Minuty",
@ -615,13 +674,19 @@
"updated": "Zaktualizowano"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
"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",
"subscribeSuccessTask": "You are now subscribed to this task",
@ -698,6 +763,7 @@
"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.",
"differentNamespace": "To zadanie należy do innej sekcji.",
"noneYet": "Nie ma jeszcze powiązanych zadań.",
"delete": "Usuń powiązane zadanie",
"deleteText1": "Czy na pewno chcesz usunąć to powiązane zadanie?",
@ -782,19 +848,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 shared with this team. This CANNOT BE UNDONE!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "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 this team has access to. This CANNOT BE UNDONE!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "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 this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "You have successfully left the team."
}
},
@ -828,10 +894,7 @@
"color": "Zmień kolor tego zadania",
"move": "Move this task to another project",
"reminder": "Zarządzaj przypomnieniami o tym zadaniu",
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
"description": "Toggle editing of the task description"
},
"project": {
"title": "Project Views",
@ -844,9 +907,9 @@
"title": "Nawigacja",
"overview": "Przejdź do przeglądu",
"upcoming": "Przejdź do nadchodzących zadań",
"namespaces": "Navigate to namespaces & projects",
"labels": "Przejdź do etykiet",
"teams": "Przejdź do zespołów",
"projects": "Navigate to projects"
"teams": "Przejdź do zespołów"
}
},
"update": {
@ -861,8 +924,7 @@
"unarchive": "Cofnij archiwizację",
"setBackground": "Ustaw tło",
"share": "Udostępnij",
"newProject": "New project",
"createProject": "Create project"
"newProject": "New project"
},
"apiConfig": {
"url": "URL Vikunji",
@ -881,7 +943,7 @@
"notification": {
"title": "Powiadomienia",
"none": "Nie masz żadnych powiadomień. Miłego dnia!",
"explainer": "Notifications will appear here when actions projects or tasks you subscribed to happen."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Polecenia",
@ -892,12 +954,14 @@
"teams": "Zespoły",
"newProject": "Enter the title of the new project…",
"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",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "Nowe zadanie",
"newProject": "New project",
"newNamespace": "Nowa sekcja",
"newTeam": "Nowy zespół"
}
},
@ -953,9 +1017,16 @@
"4017": "Nieprawidłowe porównanie filtra zadań.",
"4018": "Nieprawidłowe połączenie filtra zadań.",
"4019": "Nieprawidłowa wartość filtra zadań.",
"5001": "Sekcja nie istnieje.",
"5003": "Nie masz dostępu do określonej sekcji.",
"5006": "Nazwa sekcji nie może być pusta.",
"5009": "Aby wykonać tę akcję, musisz mieć uprawnienia do odczytu sekcji.",
"5010": "Ten zespół nie ma dostępu do tej sekcji.",
"5011": "Ten użytkownik ma już dostęp do tej sekcji.",
"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 project.",
"6004": "The team already has access to that namespace or project.",
"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.",
@ -982,4 +1053,4 @@
"frontendVersion": "Wersja frontendu: {version}",
"apiVersion": "Wersja API: {version}"
}
}
}

View File

@ -6,7 +6,9 @@
"welcomeEvening": "Boa noite, {username}!",
"lastViewed": "Visto por último",
"project": {
"importText": "Import your projects and tasks from other services into Vikunja:",
"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"
}
},
@ -141,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 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, projects, 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.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Export your Vikunja data",
"description": "You can request a copy of all your Vikunja data. This includes 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, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Please enter your password to proceed:",
"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.",
@ -163,18 +165,14 @@
}
},
"project": {
"archivedMessage": "This project is archived. It is not possible to create new or edit tasks for it.",
"archived": "Archived",
"showArchived": "Show Archived",
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
"title": "Project Title",
"color": "Color",
"projects": "Projects",
"parent": "Parent Project",
"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.",
"inboxTitle": "Inbox",
"create": {
"header": "New project",
"titlePlaceholder": "The project's title goes here…",
@ -212,7 +210,7 @@
"duplicate": {
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a parent project which should hold the duplicated project:",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
@ -323,6 +321,67 @@
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"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.",
"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.",
"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.",
"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."
},
"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!",
"success": "O namespace foi excluído com sucesso."
},
"edit": {
"title": "Editar \"{namespace}\"",
"success": "O namespace foi atualizado com sucesso."
},
"share": {
"title": "Compartilhar \"{namespace}\""
},
"attributes": {
"title": "Título do Namespace",
"titlePlaceholder": "O título do namespace fica aqui…",
"description": "Descrição",
"descriptionPlaceholder": "A descrição do namespace fica aqui…",
"color": "Cor",
"archived": "Está arquivado",
"isArchived": "Este namespace está arquivado"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Favoritos"
},
"savedFilters": {
"title": "Filtros"
}
}
},
"filters": {
"title": "Filtros",
"clear": "Limpar Filtros",
@ -344,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.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
@ -470,7 +529,7 @@
"code": "Código",
"quote": "Citação",
"unorderedList": "Lista não ordenada",
"orderedList": "Ordered List",
"orderedList ": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Imagem",
@ -507,14 +566,14 @@
"canuse": "Você pode usar matemática de data para filtrar datas relativas.",
"learnhow": "Veja como funciona",
"title": "Matemática de Data",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "A matemática de data permite que você especifique datas relativas que são resolvidas em tempo real pelo Vikunja ao aplicar o filtro.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Adicionar um dia",
"minus1Day": "Subtrair um dia",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"supportedUnits": "As unidades de tempo suportadas são:",
"someExamples": "Alguns exemplos de expressões temporais:",
"units": {
"seconds": "Segundos",
"minutes": "Minutos",
@ -615,13 +674,19 @@
"updated": "Atualizado"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
"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",
"subscribeSuccessTask": "You are now subscribed to this task",
@ -698,6 +763,7 @@
"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.",
"differentNamespace": "This task belongs to a different namespace.",
"noneYet": "No task relations yet.",
"delete": "Delete Task Relation",
"deleteText1": "Are you sure you want to delete this task relation?",
@ -782,19 +848,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 shared with this team. This CANNOT BE UNDONE!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "A equipe foi excluída com sucesso."
},
"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 this team has access to. This CANNOT BE UNDONE!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "O usuário foi removido da equipe com sucesso."
},
"leave": {
"title": "Leave team",
"text1": "Are you sure you want to leave this team?",
"text2": "You will lose access to all projects this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "You have successfully left the team."
}
},
@ -828,10 +894,7 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
"description": "Toggle editing of the task description"
},
"project": {
"title": "Project Views",
@ -844,9 +907,9 @@
"title": "Navigation",
"overview": "Navigate to overview",
"upcoming": "Navigate to upcoming tasks",
"namespaces": "Navigate to namespaces & projects",
"labels": "Navigate to labels",
"teams": "Navigate to teams",
"projects": "Navigate to projects"
"teams": "Navigate to teams"
}
},
"update": {
@ -861,8 +924,7 @@
"unarchive": "Un-Archive",
"setBackground": "Set background",
"share": "Share",
"newProject": "New project",
"createProject": "Create project"
"newProject": "New project"
},
"apiConfig": {
"url": "Vikunja URL",
@ -881,7 +943,7 @@
"notification": {
"title": "Notificações",
"none": "You don't have any notifications. Have a nice day!",
"explainer": "Notifications will appear here when actions projects or tasks you subscribed to happen."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Comandos",
@ -892,12 +954,14 @@
"teams": "Equipes",
"newProject": "Enter the title of the new project…",
"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",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "Nova tarefa",
"newProject": "New project",
"newNamespace": "Novo namespace",
"newTeam": "Nova equipe"
}
},
@ -953,9 +1017,16 @@
"4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatenator.",
"4019": "Invalid task filter value.",
"5001": "The namespace does not exist.",
"5003": "You do not have access to the specified namespace.",
"5006": "The namespace name cannot be empty.",
"5009": "You need to have namespace read access to perform that action.",
"5010": "This team does not have access to that namespace.",
"5011": "This user has already access to that namespace.",
"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 project.",
"6004": "The team already has access to that namespace or project.",
"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.",
@ -982,4 +1053,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

View File

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

View File

@ -6,7 +6,9 @@
"welcomeEvening": "Good Evening {username}!",
"lastViewed": "Last viewed",
"project": {
"importText": "Import your projects and tasks from other services into Vikunja:",
"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"
}
},
@ -141,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 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, projects, 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.",
@ -155,7 +157,7 @@
},
"export": {
"title": "Export your Vikunja data",
"description": "You can request a copy of all your Vikunja data. This includes 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, Projects, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.",
"descriptionPasswordRequired": "Please enter your password to proceed:",
"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.",
@ -163,18 +165,14 @@
}
},
"project": {
"archivedMessage": "This project is archived. It is not possible to create new or edit tasks for it.",
"archived": "Archived",
"showArchived": "Show Archived",
"archived": "This project is archived. It is not possible to create new or edit tasks for it.",
"title": "Project Title",
"color": "Color",
"projects": "Projects",
"parent": "Parent Project",
"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.",
"inboxTitle": "Inbox",
"create": {
"header": "New project",
"titlePlaceholder": "The project's title goes here…",
@ -212,7 +210,7 @@
"duplicate": {
"title": "Duplicate this project",
"label": "Duplicate",
"text": "Select a parent project which should hold the duplicated project:",
"text": "Select a namespace which should hold the duplicated project:",
"success": "The project was successfully duplicated."
},
"edit": {
@ -323,6 +321,67 @@
}
}
},
"namespace": {
"title": "Namespaces & Projects",
"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.",
"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.",
"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.",
"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."
},
"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!",
"success": "The namespace was successfully deleted."
},
"edit": {
"title": "Edit \"{namespace}\"",
"success": "The namespace was successfully updated."
},
"share": {
"title": "Share \"{namespace}\""
},
"attributes": {
"title": "Namespace Title",
"titlePlaceholder": "The namespace title goes here…",
"description": "Description",
"descriptionPlaceholder": "The namespaces description goes here…",
"color": "Color",
"archived": "Is Archived",
"isArchived": "This namespace is archived"
},
"pseudo": {
"sharedProjects": {
"title": "Shared Projects"
},
"favorites": {
"title": "Favorites"
},
"savedFilters": {
"title": "Filters"
}
}
},
"filters": {
"title": "Filters",
"clear": "Clear Filters",
@ -344,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.",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
@ -470,7 +529,7 @@
"code": "Code",
"quote": "Quote",
"unorderedList": "Unordered List",
"orderedList": "Ordered List",
"orderedList ": "Ordered List",
"cleanBlock": "Clean Block",
"link": "Link",
"image": "Image",
@ -507,14 +566,14 @@
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Check out how it works",
"title": "Date Math",
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
"add1Day": "Add one day",
"minus1Day": "Subtract one day",
"roundDay": "Round down to the nearest day",
"supportedUnits": "Supported time units",
"someExamples": "Examples of time expressions",
"supportedUnits": "Supported time units are:",
"someExamples": "Some examples of time expressions:",
"units": {
"seconds": "Seconds",
"minutes": "Minutes",
@ -615,13 +674,19 @@
"updated": "Updated"
},
"subscription": {
"subscribedProjectThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this project through its namespace.",
"subscribedTaskThroughParentNamespace": "You can't unsubscribe here because you are subscribed to this task through its namespace.",
"subscribedTaskThroughParentProject": "You can't unsubscribe here because you are subscribed to this task through its project.",
"subscribedNamespace": "You are currently subscribed to this namespace and will receive notifications for changes.",
"notSubscribedNamespace": "You are not subscribed to this namespace and won't receive notifications for changes.",
"subscribedProject": "You are currently subscribed to this project and will receive notifications for changes.",
"notSubscribedProject": "You are not subscribed to this project and won't receive notifications for changes.",
"subscribedTask": "You are currently subscribed to this task and will receive notifications for changes.",
"notSubscribedTask": "You are not subscribed to this task and won't receive notifications for changes.",
"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",
"subscribeSuccessTask": "You are now subscribed to this task",
@ -698,6 +763,7 @@
"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.",
"differentNamespace": "This task belongs to a different namespace.",
"noneYet": "No task relations yet.",
"delete": "Delete Task Relation",
"deleteText1": "Are you sure you want to delete this task relation?",
@ -782,19 +848,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 shared with this team. This CANNOT BE UNDONE!",
"text2": "All team members will lose access to projects and namespaces shared with this team. This CANNOT BE UNDONE!",
"success": "The team was successfully deleted."
},
"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 this team has access to. This CANNOT BE UNDONE!",
"text2": "They will lose access to all projects and namespaces this team has access to. This CANNOT BE UNDONE!",
"success": "The user was successfully deleted from the team."
},
"leave": {
"title": "Leave team",
"text1": "Are you sure you want to leave this team?",
"text2": "You will lose access to all projects this team has access to. If you change your mind you'll need a team admin to add you again.",
"text2": "You will lose access to all projects and namespaces this team has access to. If you change your mind you'll need a team admin to add you again.",
"success": "You have successfully left the team."
}
},
@ -828,10 +894,7 @@
"color": "Change the color of this task",
"move": "Move this task to another project",
"reminder": "Manage reminders of this task",
"description": "Toggle editing of the task description",
"delete": "Delete this task",
"priority": "Change the priority of this task",
"favorite": "Mark this task as favorite / unfavorite"
"description": "Toggle editing of the task description"
},
"project": {
"title": "Project Views",
@ -844,9 +907,9 @@
"title": "Navigation",
"overview": "Navigate to overview",
"upcoming": "Navigate to upcoming tasks",
"namespaces": "Navigate to namespaces & projects",
"labels": "Navigate to labels",
"teams": "Navigate to teams",
"projects": "Navigate to projects"
"teams": "Navigate to teams"
}
},
"update": {
@ -861,8 +924,7 @@
"unarchive": "Un-Archive",
"setBackground": "Set background",
"share": "Share",
"newProject": "New project",
"createProject": "Create project"
"newProject": "New project"
},
"apiConfig": {
"url": "Vikunja URL",
@ -881,7 +943,7 @@
"notification": {
"title": "Notifications",
"none": "You don't have any notifications. Have a nice day!",
"explainer": "Notifications will appear here when actions projects or tasks you subscribed to happen."
"explainer": "Notifications will appear here when actions on namespaces, projects or tasks you subscribed to happen."
},
"quickActions": {
"commands": "Commands",
@ -892,12 +954,14 @@
"teams": "Teams",
"newProject": "Enter the title of the new project…",
"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",
"createProject": "Create a project in the current namespace ({title})",
"cmds": {
"newTask": "New task",
"newProject": "New project",
"newNamespace": "New namespace",
"newTeam": "New team"
}
},
@ -953,9 +1017,16 @@
"4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatenator.",
"4019": "Invalid task filter value.",
"5001": "The namespace does not exist.",
"5003": "You do not have access to the specified namespace.",
"5006": "The namespace name cannot be empty.",
"5009": "You need to have namespace read access to perform that action.",
"5010": "This team does not have access to that namespace.",
"5011": "This user has already access to that namespace.",
"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 project.",
"6004": "The team already has access to that namespace or project.",
"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.",
@ -982,4 +1053,4 @@
"frontendVersion": "Frontend Version: {version}",
"apiVersion": "API Version: {version}"
}
}
}

Some files were not shown because too many files have changed in this diff Show More