Compare commits

..

No commits in common. "main" and "main" have entirely different histories.
main ... main

185 changed files with 11159 additions and 17147 deletions

View File

@ -139,7 +139,7 @@ steps:
event: [ push, tag, pull_request ]
- name: api-lint
image: golangci/golangci-lint:v1.57.2
image: golangci/golangci-lint:v1.56.2
pull: always
environment:
GOPROXY: 'https://goproxy.kolaente.de'
@ -364,7 +364,7 @@ steps:
- api-build
- name: frontend-dependencies
image: node:20.12.2-alpine
image: node:20.11.1-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -378,7 +378,7 @@ steps:
# - restore-cache
- name: frontend-lint
image: node:20.12.2-alpine
image: node:20.11.1-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -390,7 +390,7 @@ steps:
- frontend-dependencies
- name: frontend-build-prod
image: node:20.12.2-alpine
image: node:20.11.1-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -402,7 +402,7 @@ steps:
- frontend-dependencies
- name: frontend-test-unit
image: node:20.12.2-alpine
image: node:20.11.1-alpine
pull: always
commands:
- cd frontend
@ -413,7 +413,7 @@ steps:
- name: frontend-typecheck
failure: ignore
image: node:20.12.2-alpine
image: node:20.11.1-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -544,7 +544,7 @@ steps:
- git fetch --tags
- name: frontend-dependencies
image: node:20.12.2-alpine
image: node:20.11.1-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -556,7 +556,7 @@ steps:
- pnpm install --fetch-timeout 100000
- name: frontend-build
image: node:20.12.2-alpine
image: node:20.11.1-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -716,7 +716,7 @@ steps:
# Build os packages and push it to our bucket
- name: build-os-packages-unstable
image: goreleaser/nfpm:v2.36.1
image: goreleaser/nfpm:v2.35.3
pull: always
commands:
- apk add git go
@ -732,7 +732,7 @@ steps:
depends_on: [ after-build-compress ]
- name: build-os-packages-version
image: goreleaser/nfpm:v2.36.1
image: goreleaser/nfpm:v2.35.3
pull: always
commands:
- apk add git go
@ -901,7 +901,7 @@ steps:
- git fetch --tags
- name: build
image: node:20.12.2-alpine
image: node:20.11.1-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -962,7 +962,7 @@ steps:
- git fetch --tags
- name: build
image: node:20.12.2-alpine
image: node:20.11.1-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -1120,7 +1120,7 @@ steps:
- sed -i 's/\\/api\\/v1//g' frontend/index.html
- ./bumpp.sh
- yarn install
- yarn dist --linux zip
- yarn dist --linux --windows
# - name: rebuild-cache
# image: meltwater/drone-cache:dev
@ -1400,6 +1400,6 @@ steps:
- failure
---
kind: signature
hmac: 16b8cd92b0c32f4821b45858464e645ba053f15e9eed85926589c4d9bc503864
hmac: c312afe632177a2d45f47c429bf6c7528af3c51a097430956558532ccdcc42b9
...

1
.gitignore vendored
View File

@ -28,4 +28,3 @@ vendor/
os-packages/
mage_output_file.go
mage-static
.direnv/

View File

@ -18,7 +18,6 @@ linters:
- scopelint # Obsolete, using exportloopref instead
- durationcheck
- goconst
- musttag
presets:
- bugs
- unused
@ -104,7 +103,3 @@ issues:
text: "parameter 'tx' seems to be unused, consider removing or renaming it as"
linters:
- revive
- path: pkg/models/typesense.go
text: 'structtag: struct field Position repeats json tag "position" also at'
linters:
- govet

View File

@ -5,7 +5,7 @@
"eslint.packageManager": "pnpm",
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.fixAll": "explicit"
"source.fixAll": true
},
"eslint.format.enable": true,
"[javascript]": {

View File

@ -1,5 +1,5 @@
# syntax=docker/dockerfile:1
FROM --platform=$BUILDPLATFORM node:20.12.2-alpine AS frontendbuilder
FROM --platform=$BUILDPLATFORM node:20.11.1-alpine AS frontendbuilder
WORKDIR /build

View File

@ -29,7 +29,7 @@ If you find any security-related issues you don't want to disclose publicly, ple
## Features
See [the features page](https://vikunja.io/features/) on our website for a more exhaustive list or
See [the features page](https://vikunja.io/features/) on our website for a more exaustive list or
try it on [try.vikunja.io](https://try.vikunja.io)!
## Docs

View File

@ -156,7 +156,7 @@ mailer:
username: "user"
# SMTP password
password: ""
# Whether to skip verification of the tls certificate on the server
# Wether to skip verification of the tls certificate on the server
skiptlsverify: false
# The default from address when sending emails
fromemail: "mail@vikunja"
@ -306,7 +306,7 @@ auth:
# The provider needs to support the `openid`, `profile` and `email` scopes.<br/>
# **Note:** Some openid providers (like Gitlab) only make the email of the user available through OpenID if they have set it to be publicly visible.
# If the email is not public in those cases, authenticating will fail.
# +**Note 2:** The frontend expects the third party to redirect the user <frontend-url>/auth/openid/<auth key> after authentication. Please make sure to configure the redirect url in your third party auth service accordingly if you're using the default vikunja frontend.
# **Note 2:** The frontend expects the third party to rediect the user <frontend-url>/auth/openid/<auth key> after authentication. Please make sure to configure the redirect url in your third party auth service accordingly if you're using the default vikunja frontend.
# The frontend will automatically provide the API with the redirect url, composed from the current url where it's hosted.
# If you want to use the desktop client with OpenID, make sure to allow redirects to `127.0.0.1`.
# Take a look at the [default config file](https://kolaente.dev/vikunja/vikunja/src/branch/main/config.yml.sample) for more information about how to configure openid authentication.
@ -368,8 +368,8 @@ defaultsettings:
webhooks:
# Whether to enable support for webhooks
enabled: true
# The timeout in seconds until a webhook request fails when no response has been received.
timeoutseconds: 30
# The timout in seconds until a webhook request fails when no response has been received.
timoutseconds: 30
# The URL of [a mole instance](https://github.com/frain-dev/mole) to use to proxy outgoing webhook requests. You should use this and configure appropriately if you're not the only one using your Vikunja instance. More info about why: https://webhooks.fyi/best-practices/webhook-providers#implement-security-on-egress-communication. Must be used in combination with `webhooks.password` (see below).
proxyurl:
# The proxy password to use when authenticating against the proxy.

9
desktop/default.nix Normal file
View File

@ -0,0 +1,9 @@
{ pkgs ? import <nixpkgs> {}
}:
pkgs.mkShell {
name="electron-dev";
buildInputs = [
pkgs.electron
];
}

View File

@ -51,7 +51,7 @@
}
},
"devDependencies": {
"electron": "29.3.3",
"electron": "29.1.4",
"electron-builder": "24.13.3"
},
"dependencies": {

File diff suppressed because it is too large Load Diff

2028
desktop/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,7 @@ In other packages, use the `db.NewSession()` method to get a new database sessio
To add a new table to the database, create the struct and [add a migration for it]({{< ref "db-migrations.md" >}}).
To learn more about how to configure your struct to create "good" tables, refer to [the xorm documentation](https://xorm.io/docs/).
To learn more about how to configure your struct to create "good" tables, refer to [the xorm documentaion](https://xorm.io/docs/).
In most cases you will also need to implement the `TableName() string` method on the new struct to make sure the table name matches the rest of the tables - plural.

View File

@ -26,15 +26,6 @@ If you plan to do a bigger change, it is better to open an issue for discussion
The main repo is [`vikunja/vikunja`](https://kolaente.dev/vikunja/vikunja), it contains all code for the api, frontend and desktop applications.
## Where to file issues
You can file issues on [the Gitea repo](https://kolaente.dev/vikunja/vikunja) or [on the GitHub mirror](https://github.com/go-vikunja/vikunja), when you don't want to create an account on the Gitea instance.
Please note that due to a spam problem, we need to manually enable accounts on Gitea after you've registered there.
To get that started, please reach out on another channel with your username.
Another option is [the community forum](https://community.vikunja.io), especially if you want to discuss a feature in more detail.
## API
You'll need at least Go 1.21 to build Vikunja's api.

View File

@ -101,7 +101,7 @@ You should also document the routes with [swagger annotations]({{< ref "swagger-
There is a method available in the `migration` package which takes a fully nested Vikunja structure and creates it with all relations.
This means you start by adding a project, then add projects inside that project, then tasks in the lists and so on.
In general, it is recommended to have one root project with all projects of the other service as child projects.
In general, it is reccommended to have one root project with all projects of the other service as child projects.
The root structure must be present as `[]*models.ProjectWithTasksAndBuckets`. It allows to represent all of Vikunja's hierarchy as a single data structure.

View File

@ -16,7 +16,7 @@ menu:
The following parts are about the kinds of tests in the API package and how to run them.
### Prerequisites
### Prerequesites
To run any kind of test, you need to specify Vikunja's [root path](https://vikunja.io/docs/config-options/#rootpath).
This is required to make sure all test fixtures are correctly loaded.
@ -39,7 +39,7 @@ This definition is a bit blurry, but we haven't found a better one yet.
All integration tests live in `pkg/integrations`.
You can run them by executing `mage test:integration`.
The integration tests use the same config and fixtures as the unit tests and therefore have the same options available,
The integration tests use the same config and fixtures as the unit tests and therefor have the same options available,
see at the beginning of this document.
To run integration tests, use `mage test:integration`.

View File

@ -18,7 +18,6 @@ To fully build Vikunja from source files, you need to build the api and frontend
1. Make sure you have git installed
2. Clone the repo with `git clone https://code.vikunja.io/vikunja` and switch into the directory.
3. Check out the version you want to build with `git checkout VERSION` - replace `VERSION` with the version want to use. If you don't do this, you'll build the [latest unstable build]({{< ref "versions.md">}}), which might contain bugs.
## Frontend
@ -36,7 +35,7 @@ That means compiling it boils down to these steps:
1. Make sure [Go](https://golang.org/doc/install) is properly installed on your system. You'll need at least Go `1.21`.
2. Make sure [Mage](https://magefile.org) is properly installed on your system.
3. If you did not build the frontend in the steps before, you need to either do that or create a dummy index file with `mkdir -p frontend/dist && touch frontend/dist/index.html`.
3. If you did not build the frontend in the steps before, you need to either do that or create a dummy index file with `mkdir -p frontend/dist && touch index.html`.
4. Run `mage build` in the source of the main repo. This will build a binary in the root of the repo which will be able to run on your system.
### Build for different architectures

View File

@ -22,6 +22,7 @@ export VIKUNJA_FIRST_CHILD=true
is the same as defining it in a `config.yml` like so:
```yaml
```yaml
first:
child: true
@ -347,7 +348,6 @@ Environment path: `VIKUNJA_SERVICE_CUSTOMLOGOURL`
### enablepublicteams
Enables the public team feature. If enabled, it is possible to configure teams to be public, which makes them
discoverable when sharing a project, therefore not only showing teams the user is member of.
Default: `false`
@ -779,7 +779,7 @@ Environment path: `VIKUNJA_MAILER_PASSWORD`
### skiptlsverify
Whether to skip verification of the tls certificate on the server
Wether to skip verification of the tls certificate on the server
Default: `false`
@ -1222,7 +1222,7 @@ OpenID configuration will allow users to authenticate through a third-party Open
The provider needs to support the `openid`, `profile` and `email` scopes.<br/>
**Note:** Some openid providers (like Gitlab) only make the email of the user available through OpenID if they have set it to be publicly visible.
If the email is not public in those cases, authenticating will fail.
+**Note 2:** The frontend expects the third party to redirect the user <frontend-url>/auth/openid/<auth key> after authentication. Please make sure to configure the redirect url in your third party auth service accordingly if you're using the default vikunja frontend.
**Note 2:** The frontend expects the third party to rediect the user <frontend-url>/auth/openid/<auth key> after authentication. Please make sure to configure the redirect url in your third party auth service accordingly if you're using the default vikunja frontend.
The frontend will automatically provide the API with the redirect url, composed from the current url where it's hosted.
If you want to use the desktop client with OpenID, make sure to allow redirects to `127.0.0.1`.
Take a look at the [default config file](https://kolaente.dev/vikunja/vikunja/src/branch/main/config.yml.sample) for more information about how to configure openid authentication.
@ -1421,15 +1421,15 @@ Full path: `webhooks.enabled`
Environment path: `VIKUNJA_WEBHOOKS_ENABLED`
### timeoutseconds
### timoutseconds
The timeout in seconds until a webhook request fails when no response has been received.
The timout in seconds until a webhook request fails when no response has been received.
Default: `30`
Full path: `webhooks.timeoutseconds`
Full path: `webhooks.timoutseconds`
Environment path: `VIKUNJA_WEBHOOKS_TIMEOUTSECONDS`
Environment path: `VIKUNJA_WEBHOOKS_TIMOUTSECONDS`
### proxyurl

View File

@ -40,7 +40,7 @@ chown 1000 $PWD/files
You'll need to do this before running any of the examples on this page.
Vikunja will not try to acquire ownership of the files folder, as that would mean it had to run as root.
Vikunja will not try to aquire ownership of the files folder, as that would mean it had to run as root.
## PostgreSQL
@ -312,7 +312,7 @@ To do that, you can
* Either activate SSH and paste the adapted compose file in a terminal (using Putty or similar)
* Without activating SSH as a "custom script" (go to Control Panel / Task Scheduler / Create / Scheduled Task / User-defined script)
* Without activating SSH, by using Portainer (you have to install first, check out [this tutorial](https://www.portainer.io/blog/how-to-install-portainer-on-a-synology-nas) for example):
* Without activating SSH, by using Portainer (you have to install first, check out [this tutorial](https://www.portainer.io/blog/how-to-install-portainer-on-a-synology-nas) for exmple):
1. Go to **Dashboard / Stacks** click the button **"Add Stack"**
2. Give it the name Vikunja and paste the adapted docker compose file
3. Deploy the Stack with the "Deploy Stack" button:

View File

@ -37,7 +37,7 @@ This document provides an overview and instructions for the different methods:
* [FreeBSD](#freebsd--freenas)
* [Kubernetes]({{< ref "k8s.md" >}})
And after you installed Vikunja, you may want to check out these other resources:
And after you installed Vikunja, you may want to check out these other ressources:
* [Configuration]({{< ref "config.md">}})
* [UTF-8 Settings]({{< ref "utf-8.md">}})
@ -225,13 +225,10 @@ go install github.com/magefile/mage
```
mkdir /mnt/GO/code.vikunja.io
cd /mnt/GO/code.vikunja.io
git clone https://code.vikunja.io/vikunja
cd vikunja
git clone https://code.vikunja.io/api
cd /mnt/GO/code.vikunja.io/api
```
**Note:** Check out the version you want to build with `git checkout VERSION` - replace `VERSION` with the version want to use.
If you don't do this, you'll build the [latest unstable build]({{< ref "versions.md">}}), which might contain bugs.
### Compile binaries
```

View File

@ -17,7 +17,7 @@ Vikunja allows for authentication with an external identity source such as Authe
## OpenID Connect Overview
OpenID Connect is a standardized identity layer built on top of the more generic OAuth 2.0 specification, simplifying interaction between the involved parties significantly.
OpenID Connect is a standardized identity layer built on top of the more generic OAuth 2.0 specification, simplying interaction between the involved parties significantly.
While the [OpenID specification](https://openid.net/specs/openid-connect-core-1_0.html#Overview) is worth a read, we summarize the most important basics here.
The involved parties are:
@ -103,7 +103,7 @@ auth:
## Automatically assign users to teams
Starting with version 0.24.0, Vikunja is capable of automatically adding users to a team based on OIDC claims added by the identity provider.
Vikunja is capable of automatically adding users to a team based on OIDC claims added by the identity provider.
If configured, Vikunja will sync teams, automatically create new ones and make sure the members are part of the configured teams.
Teams which exist only because they were created from oidc attributes are not editable in Vikunja.

View File

@ -17,7 +17,7 @@ However, you can still run it in a subdirectory but need to build the frontend y
First, make sure you're able to build the frontend from source.
Check [the guide about building from source]({{< ref "build-from-source.md">}}#frontend) about that.
### Dynamically set with build command
### Dynamicly set with build command
Run the build with the `VIKUNJA_FRONTEND_BASE` variable specified.

View File

@ -10,7 +10,7 @@ menu:
# Vikunja Versions
Vikunja api is available in two different release flavors.
The Vikunja api and frontend are available in two different release flavors.
{{< table_of_contents >}}
@ -30,9 +30,6 @@ There might be multiple new such builds a day.
Versions contain the last stable version, the number of commits since then and the commit the currently running binary was built from.
They look like this: `v0.18.1+269-5cc4927b9e`
Since a release is also cut from the main branch at some point, features from unstable will eventually become available in stable releases.
At the point in time of a new version release, the unstable build is the same exact thing.
The demo instance at [try.vikunja.io](https://try.vikunja.io) automatically updates and always runs the last unstable build.
## Switching between versions

View File

@ -72,7 +72,6 @@ Vikunja **currently does not** support these properties:
* [Evolution](https://wiki.gnome.org/Apps/Evolution/)
* [OpenTasks](https://opentasks.app/) & [DAVx⁵](https://www.davx5.com/)
* [Tasks (Android)](https://tasks.org/)
* [Korganizer](https://apps.kde.org/korganizer/)
### Not working

View File

@ -10,9 +10,17 @@ menu:
# Command line interface
You can interact with Vikunja using its `cli` interface.
You can interact with Vikunja using its `cli` interface.<br />
The following commands are available:
{{< table_of_contents >}}
* [dump](#dump)
* [help](#help)
* [migrate](#migrate)
* [restore](#restore)
* [testmail](#testmail)
* [user](#user)
* [version](#version)
* [web](#web)
If you don't specify a command, the [`web`](#web) command will be executed.
@ -20,22 +28,14 @@ All commands use the same standard [config file]({{< ref "../setup/config.md">}}
## Using the cli in docker
When running Vikunja in docker, you'll need to execute all commands in the `vikunja` container.
When running Vikunja in docker, you'll need to execute all commands in the `api` container.
Instead of running the `vikunja` binary directly, run it like this:
```sh
docker exec <name of the vikunja container> /app/vikunja/vikunja <subcommand>
docker exec <name of the vikunja api container> /app/vikunja/vikunja <subcommand>
```
If you need to run a bunch of Vikunja commands, you can also create a shell alias for it:
```sh
alias vikunja-docker='docker exec <name of the vikunja container> /app/vikunja/vikunja'
```
Then use it as `vikunja-docker <subcommand>`.
## `dump`
### `dump`
Creates a zip file with all vikunja-related files.
This includes config, version, all files and the full database.
@ -45,21 +45,7 @@ Usage:
$ vikunja dump
```
## `index`
Perform a full reindex of all tasks into Typesense. This will clear all tasks already present in the index unless the `--partial` flag is provided, see below.
The command will only work if Typesense is enabled.
Flags:
* `-p`, `--partial`: If provided, Vikunja will only index tasks which are not present in the index yet.
Usage:
```
$ vikunja index [flags]
```
## `help`
### `help`
Shows more detailed help about any command.
@ -69,7 +55,7 @@ Usage:
$ vikunja help [command]
```
## `migrate`
### `migrate`
Run all database migrations which didn't already run.
@ -79,7 +65,7 @@ $ vikunja migrate [flags]
$ vikunja migrate [command]
```
### `migrate list`
#### `migrate list`
Shows a list with all database migrations.
@ -88,7 +74,7 @@ Usage:
$ vikunja migrate list
```
### `migrate rollback`
#### `migrate rollback`
Roll migrations back until a certain point.
@ -100,42 +86,42 @@ $ vikunja migrate rollback [flags]
Flags:
* `-n`, `--name` string: The id of the migration you want to roll back until.
## `restore`
### `restore`
Restores a previously created dump from a zip file, see `dump`.
Usage:
```
$ vikunja restore [path to dump zip file]
$ vikunja restore <path to dump zip file>
```
## `testmail`
### `testmail`
Sends a test mail using the configured smtp connection.
Usage:
```
$ vikunja testmail [email to send the test mail to]
$ vikunja testmail <email to send the test mail to>
```
## `user`
### `user`
Bundles a few commands to manage users.
### `user change-status`
#### `user change-status`
Enable or disable a user. Will toggle the current status if no flag (`--enable` or `--disable`) is provided.
Usage:
```
$ vikunja user change-status [user id] [flags]
$ vikunja user change-status <user id> <flags>
```
Flags:
* `-d`, `--disable`: Disable the user.
* `-e`, `--enable`: Enable the user.
### `user create`
#### `user create`
Create a new user.
@ -150,22 +136,22 @@ Flags:
* `-p`, `--password`: The password of the new user. You will be asked to enter it if not provided through the flag.
* `-u`, `--username`: The username of the new user.
### `user delete`
#### `user delete`
Start the user deletion process.
If called without the `--now` flag, this command will only trigger an email to the user in order for them to confirm and start the deletion process (this is the same behavior as if the user requested their deletion via the web interface).
If called without the `--now` flag, this command will only trigger an email to the user in order for them to confirm and start the deletion process (this is the same behavoir as if the user requested their deletion via the web interface).
With the flag the user is deleted **immediately**.
**USE WITH CAUTION.**
```
$ vikunja user delete [id] [flags]
$ vikunja user delete <id> <flags>
```
Flags:
* `-n`, `--now` If provided, deletes the user immediately instead of emailing them first.
### `user list`
#### `user list`
Shows a list of all users.
@ -174,26 +160,26 @@ Usage:
$ vikunja user list
```
### `user reset-password`
#### `user reset-password`
Reset a users password, either through mailing them a reset link or directly.
Usage:
```
$ vikunja user reset-password [flags]
$ vikunja user reset-password <flags>
```
Flags:
* `-d`, `--direct`: If provided, reset the password directly instead of sending the user a reset mail.
* `-p`, `--password`: The new password of the user. Only used in combination with --direct. You will be asked to enter it if not provided through the flag.
### `user update`
#### `user update`
Update an existing user.
Usage:
```
$ vikunja user update [user id]
$ vikunja user update <user id>
```
Flags:
@ -201,19 +187,19 @@ Flags:
* `-e`, `--email`: The new email address of the user.
* `-u`, `--username`: The new username of the user.
## `version`
### `version`
Prints the version of Vikunja.
This is either the semantic version (something like `0.24.0`) or version + git commit hash.
This is either the semantic version (something like `0.7`) or version + git commit hash.
Usage:
```
$ vikunja version
```
## `web`
### `web`
Starts Vikunja's web server, serving the api and frontend.
Starts Vikunja's REST api server.
Usage:
```

View File

@ -51,7 +51,7 @@ This document describes the different errors Vikunja can return.
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 2001 | 400 | ID cannot be empty or 0. |
| 2002 | 400 | Some of the request data was invalid. The response contains an additional array with all invalid fields. |
| 2002 | 400 | Some of the request data was invalid. The response contains an aditional array with all invalid fields. |
## Project

View File

@ -61,7 +61,7 @@ Here are some examples of filter queries:
* `priority = 4`: Matches tasks with priority level 4
* `dueDate < now`: Matches tasks with a due date in the past
* `done = false && priority >= 3`: Matches undone tasks with priority level 3 or higher
* `assignees in user1, user2`: Matches tasks assigned to either "user1" or "user2
* `assignees in [user1, user2]`: Matches tasks assigned to either "user1" or "user2
* `(priority = 1 || priority = 2) && dueDate <= now`: Matches tasks with priority level 1 or 2 and a due date in the past

View File

@ -18,7 +18,7 @@ Starting with version 0.22.0, Vikunja allows you to define webhooks to notify ot
To create a webhook, in the project options select "Webhooks". The form will allow you to create and modify webhooks.
Check out [the api docs](https://try.vikunja.io/api/v1/docs#tag/webhooks) for information about how to create webhooks programmatically.
Check out [the api docs](https://try.vikunja.io/api/v1/docs#tag/webhooks) for information about how to create webhooks programatically.
## Available events and their payload

View File

@ -1,20 +0,0 @@
{
description = "Vikunja dev environment";
outputs = { self, nixpkgs }:
let pkgs = nixpkgs.legacyPackages.x86_64-linux;
in {
defaultPackage.x86_64-linux =
pkgs.mkShell { buildInputs = with pkgs; [
# General tools
git-cliff
# Frontend tools
nodePackages.pnpm cypress
# API tools
go golangci-lint mage
# Desktop
electron
];
};
};
}

1
frontend/.gitignore vendored
View File

@ -13,6 +13,7 @@ node_modules
/dist*
coverage
*.zip
.direnv/
# Test files
cypress/screenshots

View File

@ -1 +1 @@
20.13.0
20.11.1

View File

@ -12,7 +12,7 @@ describe('Project History', () => {
cy.intercept(Cypress.env('API_URL') + '/projects*').as('loadProjectArray')
cy.intercept(Cypress.env('API_URL') + '/projects/*').as('loadProject')
const projects = ProjectFactory.create(7)
const projects = ProjectFactory.create(6)
ProjectViewFactory.truncate()
projects.forEach(p => ProjectViewFactory.create(1, {
id: p.id,
@ -36,8 +36,6 @@ describe('Project History', () => {
cy.wait('@loadProject')
cy.visit(`/projects/${projects[5].id}/${projects[5].id}`)
cy.wait('@loadProject')
cy.visit(`/projects/${projects[6].id}/${projects[6].id}`)
cy.wait('@loadProject')
// cy.visit('/')
// Not using cy.visit here to work around the redirect issue fixed in #1337
@ -54,6 +52,5 @@ describe('Project History', () => {
.should('contain', projects[3].title)
.should('contain', projects[4].title)
.should('contain', projects[5].title)
.should('contain', projects[6].title)
})
})

View File

@ -68,7 +68,7 @@ describe('Project View List', () => {
cy.get('.project-title-wrapper .icon')
.should('not.exist')
cy.get('input.input[placeholder="Add a task..."')
cy.get('input.input[placeholder="Add a new task..."')
.should('not.exist')
})

View File

@ -27,7 +27,7 @@ describe('Link shares', () => {
cy.get('h1.title')
.should('contain', project.title)
cy.get('input.input[placeholder="Add a task..."')
cy.get('input.input[placeholder="Add a new task..."')
.should('not.exist')
cy.get('.tasks')
.should('contain', tasks[0].title)
@ -42,7 +42,7 @@ describe('Link shares', () => {
cy.get('h1.title')
.should('contain', project.title)
cy.get('input.input[placeholder="Add a task..."')
cy.get('input.input[placeholder="Add a new task..."')
.should('not.exist')
cy.get('.tasks')
.should('contain', tasks[0].title)

View File

@ -14,12 +14,12 @@ describe('Team', () => {
const newTeamName = 'New Team'
cy.get('a.button')
.contains('Create a team')
.contains('Create a new team')
.click()
cy.url()
.should('contain', '/teams/new')
cy.get('.card-header-title')
.contains('Create a team')
.contains('Create a new team')
cy.get('input.input')
.type(newTeamName)
cy.get('.button')

View File

@ -13,7 +13,6 @@ import {BucketFactory} from '../../factories/bucket'
import {TaskAttachmentFactory} from '../../factories/task_attachments'
import {TaskReminderFactory} from '../../factories/task_reminders'
import {createDefaultViews} from "../project/prepareProjects";
import { TaskBucketFactory } from '../../factories/task_buckets'
function addLabelToTaskAndVerify(labelTitle: string) {
cy.get('.task-view .action-buttons .button')
@ -42,14 +41,14 @@ function uploadAttachmentAndVerify(taskId: number) {
.selectFile('cypress/fixtures/image.jpg', {force: true}) // The input is not visible, but on purpose
cy.wait('@uploadAttachment')
cy.get('.attachments .attachments .files button.attachment')
cy.get('.attachments .attachments .files a.attachment')
.should('exist')
}
describe('Task', () => {
createFakeUserAndLogin()
let projects: {}[]
let projects
let buckets
beforeEach(() => {
@ -65,7 +64,7 @@ describe('Task', () => {
it('Should be created new', () => {
cy.visit('/projects/1/1')
cy.get('.input[placeholder="Add a task…"')
cy.get('.input[placeholder="Add a new task…"')
.type('New Task')
cy.get('.button')
.contains('Add')
@ -81,7 +80,7 @@ describe('Task', () => {
cy.visit('/projects/1/1')
cy.get('.project-is-empty-notice')
.should('not.exist')
cy.get('.input[placeholder="Add a task…"')
cy.get('.input[placeholder="Add a new task…"')
.type('New Task')
cy.get('.button')
.contains('Add')
@ -471,10 +470,6 @@ describe('Task', () => {
})
const labels = LabelFactory.create(1)
LabelTaskFactory.truncate()
TaskBucketFactory.create(1, {
task_id: tasks[0].id,
bucket_id: buckets[0].id,
})
cy.visit(`/projects/${projects[0].id}/4`)
@ -640,7 +635,7 @@ describe('Task', () => {
.contains('Set Reminders')
.click()
cy.get('.task-view .columns.details .column button')
.contains('Add a reminder')
.contains('Add a new reminder')
.click()
cy.get('.datepicker__quick-select-date')
.contains('Tomorrow')
@ -665,7 +660,7 @@ describe('Task', () => {
.contains('Set Reminders')
.click()
cy.get('.task-view .columns.details .column button')
.contains('Add a reminder')
.contains('Add a new reminder')
.click()
cy.get('.datepicker__quick-select-date')
.should('not.exist')
@ -694,7 +689,7 @@ describe('Task', () => {
.contains('Set Reminders')
.click()
cy.get('.task-view .columns.details .column button')
.contains('Add a reminder')
.contains('Add a new reminder')
.click()
cy.get('.datepicker__quick-select-date')
.should('not.exist')
@ -723,7 +718,7 @@ describe('Task', () => {
.contains('Set Reminders')
.click()
cy.get('.task-view .columns.details .column button')
.contains('Add a reminder')
.contains('Add a new reminder')
.click()
cy.get('.datepicker__quick-select-date')
.should('not.exist')
@ -759,7 +754,7 @@ describe('Task', () => {
.contains('Set Reminders')
.click()
cy.get('.task-view .columns.details .column button')
.contains('Add a reminder')
.contains('Add a new reminder')
.click()
cy.get('.datepicker__quick-select-date')
.should('not.exist')

View File

@ -2,11 +2,11 @@
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1712449641,
"narHash": "sha256-U9DDWMexN6o5Td2DznEgguh8TRIUnIl9levmit43GcI=",
"lastModified": 1701336116,
"narHash": "sha256-kEmpezCR/FpITc6yMbAh4WrOCiT2zg5pSjnKrq51h5Y=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "600b15aea1b36eeb43833a50b0e96579147099ff",
"rev": "f5c27c6136db4d76c30e533c20517df6864c46ee",
"type": "github"
},
"original": {

10
frontend/flake.nix Normal file
View File

@ -0,0 +1,10 @@
{
description = "Vikunja frontend dev environment";
outputs = { self, nixpkgs }:
let pkgs = nixpkgs.legacyPackages.x86_64-linux;
in {
defaultPackage.x86_64-linux =
pkgs.mkShell { buildInputs = [ pkgs.nodePackages.pnpm pkgs.cypress pkgs.git-cliff ]; };
};
}

View File

@ -13,7 +13,7 @@
},
"homepage": "https://vikunja.io/",
"funding": "https://opencollective.com/vikunja",
"packageManager": "pnpm@9.1.0",
"packageManager": "pnpm@8.15.5",
"keywords": [
"todo",
"productivity",
@ -50,49 +50,49 @@
"story:preview": "histoire preview"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "6.5.2",
"@fortawesome/free-regular-svg-icons": "6.5.2",
"@fortawesome/free-solid-svg-icons": "6.5.2",
"@fortawesome/fontawesome-svg-core": "6.5.1",
"@fortawesome/free-regular-svg-icons": "6.5.1",
"@fortawesome/free-solid-svg-icons": "6.5.1",
"@fortawesome/vue-fontawesome": "3.0.6",
"@github/hotkey": "3.1.0",
"@infectoone/vue-ganttastic": "2.3.2",
"@intlify/unplugin-vue-i18n": "4.0.0",
"@infectoone/vue-ganttastic": "2.3.1",
"@intlify/unplugin-vue-i18n": "3.0.1",
"@kyvg/vue3-notification": "3.2.1",
"@sentry/tracing": "7.114.0",
"@sentry/vue": "7.114.0",
"@tiptap/core": "2.3.2",
"@tiptap/extension-blockquote": "2.3.2",
"@tiptap/extension-bold": "2.3.2",
"@tiptap/extension-bullet-list": "2.3.2",
"@tiptap/extension-code": "2.3.2",
"@tiptap/extension-code-block-lowlight": "2.3.2",
"@tiptap/extension-document": "2.3.2",
"@tiptap/extension-dropcursor": "2.3.2",
"@tiptap/extension-gapcursor": "2.3.2",
"@tiptap/extension-hard-break": "2.3.2",
"@tiptap/extension-heading": "2.3.2",
"@tiptap/extension-history": "2.3.2",
"@tiptap/extension-horizontal-rule": "2.3.2",
"@tiptap/extension-image": "2.3.2",
"@tiptap/extension-italic": "2.3.2",
"@tiptap/extension-link": "2.3.2",
"@tiptap/extension-list-item": "2.3.2",
"@tiptap/extension-ordered-list": "2.3.2",
"@tiptap/extension-paragraph": "2.3.2",
"@tiptap/extension-placeholder": "2.3.2",
"@tiptap/extension-strike": "2.3.2",
"@tiptap/extension-table": "2.3.2",
"@tiptap/extension-table-cell": "2.3.2",
"@tiptap/extension-table-header": "2.3.2",
"@tiptap/extension-table-row": "2.3.2",
"@tiptap/extension-task-item": "2.3.2",
"@tiptap/extension-task-list": "2.3.2",
"@tiptap/extension-text": "2.3.2",
"@tiptap/extension-typography": "2.3.2",
"@tiptap/extension-underline": "2.3.2",
"@tiptap/pm": "2.3.2",
"@tiptap/suggestion": "2.3.2",
"@tiptap/vue-3": "2.3.2",
"@sentry/tracing": "7.109.0",
"@sentry/vue": "7.109.0",
"@tiptap/core": "2.2.4",
"@tiptap/extension-blockquote": "2.2.4",
"@tiptap/extension-bold": "2.2.4",
"@tiptap/extension-bullet-list": "2.2.4",
"@tiptap/extension-code": "2.2.4",
"@tiptap/extension-code-block-lowlight": "2.2.4",
"@tiptap/extension-document": "2.2.4",
"@tiptap/extension-dropcursor": "2.2.4",
"@tiptap/extension-gapcursor": "2.2.4",
"@tiptap/extension-hard-break": "2.2.4",
"@tiptap/extension-heading": "2.2.4",
"@tiptap/extension-history": "2.2.4",
"@tiptap/extension-horizontal-rule": "2.2.4",
"@tiptap/extension-image": "2.2.4",
"@tiptap/extension-italic": "2.2.4",
"@tiptap/extension-link": "2.2.4",
"@tiptap/extension-list-item": "2.2.4",
"@tiptap/extension-ordered-list": "2.2.4",
"@tiptap/extension-paragraph": "2.2.4",
"@tiptap/extension-placeholder": "2.2.4",
"@tiptap/extension-strike": "2.2.4",
"@tiptap/extension-table": "2.2.4",
"@tiptap/extension-table-cell": "2.2.4",
"@tiptap/extension-table-header": "2.2.4",
"@tiptap/extension-table-row": "2.2.4",
"@tiptap/extension-task-item": "2.2.4",
"@tiptap/extension-task-list": "2.2.4",
"@tiptap/extension-text": "2.2.4",
"@tiptap/extension-typography": "2.2.4",
"@tiptap/extension-underline": "2.2.4",
"@tiptap/pm": "2.2.4",
"@tiptap/suggestion": "2.2.4",
"@tiptap/vue-3": "2.2.4",
"@types/is-touch-device": "1.0.2",
"@types/lodash.clonedeep": "4.5.9",
"@vueuse/core": "10.9.0",
@ -102,8 +102,8 @@
"bulma-css-variables": "0.9.33",
"camel-case": "4.1.2",
"date-fns": "3.6.0",
"dayjs": "1.11.11",
"dompurify": "3.1.2",
"dayjs": "1.11.10",
"dompurify": "3.0.11",
"fast-deep-equal": "3.1.3",
"flatpickr": "4.6.13",
"flexsearch": "0.7.31",
@ -118,13 +118,13 @@
"sortablejs": "1.15.2",
"tippy.js": "6.3.7",
"ufo": "1.5.3",
"vue": "3.4.27",
"vue": "3.4.21",
"vue-advanced-cropper": "2.8.8",
"vue-flatpickr-component": "11.0.5",
"vue-i18n": "9.13.1",
"vue-router": "4.3.2",
"vue-i18n": "9.10.2",
"vue-router": "4.3.0",
"vuemoji-picker": "0.2.1",
"workbox-precaching": "7.1.0",
"workbox-precaching": "7.0.0",
"zhyswan-vuedraggable": "4.1.3"
},
"devDependencies": {
@ -132,56 +132,56 @@
"@cypress/vite-dev-server": "5.0.7",
"@cypress/vue": "6.0.0",
"@faker-js/faker": "8.4.1",
"@histoire/plugin-screenshot": "0.17.17",
"@histoire/plugin-vue": "0.17.17",
"@rushstack/eslint-patch": "1.10.2",
"@tsconfig/node18": "18.2.4",
"@histoire/plugin-screenshot": "0.17.14",
"@histoire/plugin-vue": "0.17.14",
"@rushstack/eslint-patch": "1.8.0",
"@tsconfig/node18": "18.2.2",
"@types/codemirror": "5.60.15",
"@types/dompurify": "3.0.5",
"@types/flexsearch": "0.7.6",
"@types/is-touch-device": "1.0.2",
"@types/lodash.debounce": "4.0.9",
"@types/marked": "5.0.2",
"@types/node": "20.12.11",
"@types/node": "20.11.30",
"@types/postcss-preset-env": "7.7.0",
"@types/sortablejs": "1.15.8",
"@typescript-eslint/eslint-plugin": "7.8.0",
"@typescript-eslint/parser": "7.8.0",
"@vitejs/plugin-legacy": "5.4.0",
"@typescript-eslint/eslint-plugin": "7.3.1",
"@typescript-eslint/parser": "7.3.1",
"@vitejs/plugin-legacy": "5.3.2",
"@vitejs/plugin-vue": "5.0.4",
"@vue/eslint-config-typescript": "13.0.0",
"@vue/test-utils": "2.4.6",
"@vue/test-utils": "2.4.5",
"@vue/tsconfig": "0.5.1",
"autoprefixer": "10.4.19",
"autoprefixer": "10.4.18",
"browserslist": "4.23.0",
"caniuse-lite": "1.0.30001617",
"css-has-pseudo": "6.0.3",
"caniuse-lite": "1.0.30001599",
"css-has-pseudo": "6.0.2",
"csstype": "3.1.3",
"cypress": "13.9.0",
"esbuild": "0.21.1",
"cypress": "13.7.0",
"esbuild": "0.20.2",
"eslint": "8.57.0",
"eslint-plugin-vue": "9.26.0",
"happy-dom": "14.10.1",
"histoire": "0.17.17",
"postcss": "8.4.38",
"eslint-plugin-vue": "9.23.0",
"happy-dom": "14.0.0",
"histoire": "0.17.14",
"postcss": "8.4.37",
"postcss-easing-gradients": "3.0.1",
"postcss-easings": "4.0.0",
"postcss-focus-within": "8.0.1",
"postcss-preset-env": "9.5.11",
"rollup": "4.17.2",
"postcss-preset-env": "9.5.2",
"rollup": "4.13.0",
"rollup-plugin-visualizer": "5.12.0",
"sass": "1.77.0",
"sass": "1.72.0",
"start-server-and-test": "2.0.3",
"typescript": "5.4.5",
"vite": "5.2.11",
"typescript": "5.4.2",
"vite": "5.1.6",
"vite-plugin-inject-preload": "1.3.3",
"vite-plugin-pwa": "0.20.0",
"vite-plugin-pwa": "0.19.5",
"vite-plugin-sentry": "1.4.0",
"vite-svg-loader": "5.1.0",
"vitest": "1.6.0",
"vue-tsc": "2.0.16",
"vitest": "1.4.0",
"vue-tsc": "2.0.6",
"wait-on": "7.2.0",
"workbox-cli": "7.1.0"
"workbox-cli": "7.0.0"
},
"pnpm": {
"patchedDependencies": {

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 313 KiB

View File

@ -9,7 +9,7 @@ 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 Logo = computed(() => window.ALLOW_ICON_CHANGES && now.value.getMonth() === 6 ? LogoFullPride : LogoFull)
const CustomLogo = computed(() => window.CUSTOM_LOGO_URL)
</script>

View File

@ -26,6 +26,7 @@
:project="project"
:is-loading="projectUpdating[project.id]"
:can-collapse="canCollapse"
:level="level"
:data-project-id="project.id"
/>
</template>
@ -48,6 +49,7 @@ const props = defineProps<{
modelValue?: IProject[],
canEditOrder: boolean,
canCollapse?: boolean,
level?: number,
}>()
const emit = defineEmits<{
(e: 'update:modelValue', projects: IProject[]): void

View File

@ -58,6 +58,7 @@
<ProjectSettingsDropdown
class="menu-list-dropdown"
:project="project"
:level="level"
>
<template #trigger="{toggleOpen}">
<BaseButton
@ -77,6 +78,7 @@
:model-value="childProjects"
:can-edit-order="true"
:can-collapse="canCollapse"
:level="level + 1"
/>
</li>
</template>
@ -99,10 +101,12 @@ const {
project,
isLoading,
canCollapse,
level = 0,
} = defineProps<{
project: IProject,
isLoading?: boolean,
canCollapse?: boolean,
level?: number,
}>()
const projectStore = useProjectStore()

View File

@ -162,7 +162,7 @@ projectStore.loadAllProjects()
.app-content {
z-index: 10;
position: relative;
padding: 1.5rem 0.5rem 0;
padding: 1.5rem 0.5rem 1rem;
// TODO refactor: DRY `transition-timing-function` with `./navigation.vue`.
transition: margin-left $transition-duration;
@ -172,7 +172,7 @@ projectStore.loadAllProjects()
}
@media screen and (min-width: $tablet) {
padding: $navbar-height + 1.5rem 1.5rem 0 1.5rem;
padding: $navbar-height + 1.5rem 1.5rem 1rem 1.5rem;
}
&.is-menu-enabled {

View File

@ -1,27 +1,26 @@
<template>
<div
:class="{
'has-background': background,
'link-share-is-fullwidth': isFullWidth,
}"
:class="[background ? 'has-background' : '', $route.name as string +'-view']"
:style="{'background-image': `url(${background})`}"
class="link-share-container"
>
<div class="has-text-centered link-share-view">
<Logo
v-if="logoVisible"
class="logo"
/>
<h1
:class="{'m-0': !logoVisible}"
:style="{ 'opacity': currentProject?.title === '' ? '0': '1' }"
class="title"
>
{{ currentProject?.title === '' ? $t('misc.loading') : currentProject?.title }}
</h1>
<div class="box has-text-left view">
<router-view />
<PoweredByLink />
<div class="container has-text-centered link-share-view">
<div class="column is-10 is-offset-1">
<Logo
v-if="logoVisible"
class="logo"
/>
<h1
:class="{'m-0': !logoVisible}"
:style="{ 'opacity': currentProject?.title === '' ? '0': '1' }"
class="title"
>
{{ currentProject?.title === '' ? $t('misc.loading') : currentProject?.title }}
</h1>
<div class="box has-text-left view">
<router-view />
<PoweredByLink />
</div>
</div>
</div>
</div>
@ -31,13 +30,10 @@
import {computed} from 'vue'
import {useBaseStore} from '@/stores/base'
import {useRoute} from 'vue-router'
import Logo from '@/components/home/Logo.vue'
import PoweredByLink from './PoweredByLink.vue'
import {useProjectStore} from '@/stores/projects'
import {useLabelStore} from '@/stores/labels'
import {PROJECT_VIEW_KINDS} from '@/modelTypes/IProjectView'
const baseStore = useBaseStore()
const currentProject = computed(() => baseStore.currentProject)
@ -46,23 +42,6 @@ const logoVisible = computed(() => baseStore.logoVisible)
const projectStore = useProjectStore()
projectStore.loadAllProjects()
const labelStore = useLabelStore()
labelStore.loadAllLabels()
const route = useRoute()
const isFullWidth = computed(() => {
const viewId = route.params?.viewId ?? null
const projectId = route.params?.projectId ?? null
if (!viewId || !projectId) {
return false
}
const view = projectStore.projects[Number(projectId)]?.views.find(v => v.id === Number(viewId))
return view?.viewKind === PROJECT_VIEW_KINDS.KANBAN ||
view?.viewKind === PROJECT_VIEW_KINDS.GANTT
})
</script>
<style lang="scss" scoped>
@ -74,34 +53,20 @@ const isFullWidth = computed(() => {
.logo {
max-width: 300px;
width: 90%;
margin: 1rem auto 2rem;
margin: 2rem 0 1.5rem;
height: 100px;
}
.column {
max-width: 100%;
}
.title {
text-shadow: 0 0 1rem var(--white);
}
.link-share-view {
width: 100%;
max-width: $desktop;
margin: 0 auto;
}
.link-share-container.link-share-is-fullwidth {
.link-share-view {
max-width: 100vw;
}
}
.link-share-container:not(.has-background) {
:deep(.loader-container, .gantt-chart-container > .card) {
box-shadow: none !important;
border: none;
.task-add {
padding: 1rem 0 0;
}
}
// FIXME: this should be defined somewhere deep
.link-share-view .card {
background-color: var(--white);
}
</style>

View File

@ -155,8 +155,8 @@ const savedFilterProjects = computed(() => projectStore.savedFilterProjects)
bottom: 0;
left: 0;
transform: translateX(-100%);
overflow-x: auto;
width: $navbar-width;
overflow-y: auto;
@media screen and (max-width: $tablet) {
top: 0;

View File

@ -67,7 +67,6 @@
class="tiptap__editor"
:class="{'tiptap__editor-is-edit-enabled': isEditing}"
:editor="editor"
@dblclick="setEditIfApplicable()"
@click="focusIfEditing()"
/>
@ -172,7 +171,7 @@ import {OrderedList} from '@tiptap/extension-ordered-list'
import {Paragraph} from '@tiptap/extension-paragraph'
import {Strike} from '@tiptap/extension-strike'
import {Text} from '@tiptap/extension-text'
import {BubbleMenu, EditorContent, type Extensions, useEditor} from '@tiptap/vue-3'
import {BubbleMenu, EditorContent, useEditor} from '@tiptap/vue-3'
import {Node} from '@tiptap/pm/model'
import Commands from './commands'
@ -190,7 +189,7 @@ import BaseButton from '@/components/base/BaseButton.vue'
import XButton from '@/components/input/button.vue'
import {Placeholder} from '@tiptap/extension-placeholder'
import {eventToHotkeyString} from '@github/hotkey'
import {Extension, mergeAttributes} from '@tiptap/core'
import {mergeAttributes} from '@tiptap/core'
import {isEditorContentEmpty} from '@/helpers/editorContentEmpty'
import inputPrompt from '@/helpers/inputPrompt'
import {setLinkInEditor} from '@/components/input/editor/setLinkInEditor'
@ -203,7 +202,6 @@ const {
showSave = false,
placeholder = '',
editShortcut = '',
enableDiscardShortcut = false,
} = defineProps<{
modelValue: string,
uploadCallback?: UploadCallback,
@ -212,7 +210,6 @@ const {
showSave?: boolean,
placeholder?: string,
editShortcut?: string,
enableDiscardShortcut?: boolean,
}>()
const emit = defineEmits(['update:modelValue', 'save'])
@ -314,8 +311,6 @@ const internalMode = ref<Mode>('preview')
const isEditing = computed(() => internalMode.value === 'edit' && isEditEnabled)
const contentHasChanged = ref<boolean>(false)
let lastSavedState = modelValue
watch(
() => internalMode.value,
mode => {
@ -325,127 +320,107 @@ watch(
},
)
const extensions : Extensions = [
// Starterkit:
Blockquote,
Bold,
BulletList,
Code,
CodeBlockLowlight.configure({
lowlight,
}),
Document,
Dropcursor,
Gapcursor,
HardBreak.extend({
addKeyboardShortcuts() {
return {
'Shift-Enter': () => this.editor.commands.setHardBreak(),
'Mod-Enter': () => {
if (contentHasChanged.value) {
bubbleSave()
}
return true
},
}
},
}),
Heading,
History,
HorizontalRule,
Italic,
ListItem,
OrderedList,
Paragraph,
Strike,
Text,
Placeholder.configure({
placeholder: ({editor}) => {
if (!isEditing.value) {
return ''
}
if (editor.getText() !== '' && !editor.isFocused) {
return ''
}
return placeholder !== ''
? placeholder
: t('input.editor.placeholder')
},
}),
Typography,
Underline,
Link.configure({
openOnClick: false,
validate: (href: string) => /^https?:\/\//.test(href),
}),
Table.configure({
resizable: true,
}),
TableRow,
TableHeader,
// Custom TableCell with backgroundColor attribute
CustomTableCell,
CustomImage,
TaskList,
TaskItem.configure({
nested: true,
onReadOnlyChecked: (node: Node, checked: boolean): boolean => {
if (!isEditEnabled) {
return false
}
// The following is a workaround for this bug:
// https://github.com/ueberdosis/tiptap/issues/4521
// https://github.com/ueberdosis/tiptap/issues/3676
editor.value!.state.doc.descendants((subnode, pos) => {
if (node.eq(subnode)) {
const {tr} = editor.value!.state
tr.setNodeMarkup(pos, undefined, {
...node.attrs,
checked,
})
editor.value!.view.dispatch(tr)
bubbleSave()
}
})
return true
},
}),
Commands.configure({
suggestion: suggestionSetup(t),
}),
BubbleMenu,
]
// Add a custom extension for the Escape key
if (enableDiscardShortcut) {
extensions.push(Extension.create({
name: 'escapeKey',
addKeyboardShortcuts() {
return {
'Escape': () => {
exitEditMode()
return true
},
}
},
}))
}
const editor = useEditor({
// eslint-disable-next-line vue/no-ref-object-destructure
editable: isEditing.value,
extensions: extensions,
extensions: [
// Starterkit:
Blockquote,
Bold,
BulletList,
Code,
CodeBlockLowlight.configure({
lowlight,
}),
Document,
Dropcursor,
Gapcursor,
HardBreak.extend({
addKeyboardShortcuts() {
return {
'Mod-Enter': () => {
if (contentHasChanged.value) {
bubbleSave()
}
},
}
},
}),
Heading,
History,
HorizontalRule,
Italic,
ListItem,
OrderedList,
Paragraph,
Strike,
Text,
Placeholder.configure({
placeholder: ({editor}) => {
if (!isEditing.value) {
return ''
}
if (editor.getText() !== '' && !editor.isFocused) {
return ''
}
return placeholder !== ''
? placeholder
: t('input.editor.placeholder')
},
}),
Typography,
Underline,
Link.configure({
openOnClick: false,
validate: (href: string) => /^https?:\/\//.test(href),
}),
Table.configure({
resizable: true,
}),
TableRow,
TableHeader,
// Custom TableCell with backgroundColor attribute
CustomTableCell,
CustomImage,
TaskList,
TaskItem.configure({
nested: true,
onReadOnlyChecked: (node: Node, checked: boolean): boolean => {
if (!isEditEnabled) {
return false
}
// The following is a workaround for this bug:
// https://github.com/ueberdosis/tiptap/issues/4521
// https://github.com/ueberdosis/tiptap/issues/3676
editor.value!.state.doc.descendants((subnode, pos) => {
if (node.eq(subnode)) {
const {tr} = editor.value!.state
tr.setNodeMarkup(pos, undefined, {
...node.attrs,
checked,
})
editor.value!.view.dispatch(tr)
bubbleSave()
}
})
return true
},
}),
Commands.configure({
suggestion: suggestionSetup(t),
}),
BubbleMenu,
],
onUpdate: () => {
bubbleNow()
},
@ -484,27 +459,12 @@ function bubbleNow() {
function bubbleSave() {
bubbleNow()
lastSavedState = editor.value?.getHTML() ?? ''
emit('save', lastSavedState)
emit('save', editor.value?.getHTML())
if (isEditing.value) {
internalMode.value = 'preview'
}
}
function exitEditMode() {
editor.value?.commands.setContent(lastSavedState, false)
if (isEditing.value) {
internalMode.value = 'preview'
}
}
function setEditIfApplicable() {
if (!isEditEnabled) return
if (isEditing.value) return
setEdit()
}
function setEdit(focus: boolean = true) {
internalMode.value = 'edit'
if (focus) {
@ -856,7 +816,7 @@ watch(
td,
th {
min-width: 1em;
border: 2px solid var(--grey-300) !important;
border: 2px solid #ced4da;
padding: 3px 5px;
vertical-align: top;
box-sizing: border-box;
@ -870,7 +830,7 @@ watch(
th {
font-weight: bold;
text-align: left;
background-color: var(--grey-200);
background-color: #f1f3f5;
}
.selectedCell:after {
@ -931,14 +891,8 @@ ul[data-type='taskList'] {
padding: 0;
margin-left: 0;
li[data-checked='true'] {
color: var(--grey-500);
text-decoration: line-through;
}
li {
display: flex;
margin-top: 0.25rem;
> label {
flex: 0 0 auto;

View File

@ -24,15 +24,11 @@ import {
faCocktail,
faCoffee,
faCog,
faCopy,
faDownload,
faEllipsisH,
faEllipsisV,
faExclamation,
faEye,
faEyeSlash,
faFile,
faFileImage,
faFillDrip,
faFilter,
faForward,
@ -85,6 +81,7 @@ import {
faCheckSquare,
faClock,
faComments,
faFileImage,
faSave,
faSquareCheck,
faStar,
@ -105,7 +102,6 @@ library.add(faUnlink)
library.add(faParagraph)
library.add(faSquareCheck)
library.add(faTable)
library.add(faFile)
library.add(faFileImage)
library.add(faCheckSquare)
library.add(faStrikethrough)
@ -134,8 +130,6 @@ library.add(faCocktail)
library.add(faCoffee)
library.add(faCog)
library.add(faComments)
library.add(faCopy)
library.add(faDownload)
library.add(faEllipsisH)
library.add(faEllipsisV)
library.add(faExclamation)

View File

@ -188,6 +188,12 @@ $modal-width: 1024px;
.info {
font-style: italic;
}
p {
display: flex;
justify-content: space-between;
align-items: center;
}
}
}

View File

@ -88,7 +88,7 @@ const currentProject = computed<IProject>(() => {
})
useTitle(() => currentProject.value?.id ? getProjectTitle(currentProject.value) : '')
const views = computed(() => projectStore.projects[projectId]?.views)
const views = computed(() => currentProject.value?.views)
// 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.
@ -161,7 +161,6 @@ function getViewTitle(view: IProjectView) {
display: flex;
justify-content: space-between;
align-items: center;
gap: 1rem;
@media screen and (max-width: $tablet) {
justify-content: center;

View File

@ -35,11 +35,6 @@ const {
const emit = defineEmits(['update:modelValue', 'blur'])
const userService = new UserService()
const projectUserService = new ProjectUserService()
const labelStore = useLabelStore()
const projectStore = useProjectStore()
const filterQuery = ref<string>('')
const {
textarea: filterInput,
@ -65,6 +60,9 @@ watch(
},
)
const userService = new UserService()
const projectUserService = new ProjectUserService()
function escapeHtml(unsafe: string): string {
return unsafe
.replace(/&/g, '&amp;')
@ -93,15 +91,7 @@ const highlightedFilterQuery = computed(() => {
value = ''
}
let endPadding = ''
if(value.endsWith(' ')) {
const fullLength = value.length
value = value.trimEnd()
const numberOfRemovedSpaces = fullLength - value.length
endPadding = endPadding.padEnd(numberOfRemovedSpaces, ' ')
}
return `${o}${spacesBefore}${token}${spacesAfter}<button class="is-primary filter-query__date_value" data-position="${position}">${value}</button><span class="filter-query__date_value_placeholder">${value}</span>${endPadding}`
return `${o}${spacesBefore}${token}${spacesAfter}<button class="is-primary filter-query__date_value" data-position="${position}">${value}</button><span class="filter-query__date_value_placeholder">${value}</span>`
})
})
ASSIGNEE_FIELDS
@ -198,6 +188,8 @@ const autocompleteMatchText = ref('')
const autocompleteResultType = ref<'labels' | 'assignees' | 'projects' | null>(null)
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const autocompleteResults = ref<any[]>([])
const labelStore = useLabelStore()
const projectStore = useProjectStore()
function handleFieldInput() {
const cursorPosition = filterInput.value.selectionStart
@ -288,7 +280,6 @@ const blurDebounced = useDebounceFn(() => emit('blur'), 500)
@input="handleFieldInput"
@focus="onFocusField"
@keydown="onKeydown"
@keydown.enter.prevent="blurDebounced"
@blur="blurDebounced"
/>
<div
@ -326,11 +317,6 @@ const blurDebounced = useDebounceFn(() => emit('blur'), 500)
<style lang="scss">
.filter-input-highlight {
&, button.filter-query__date_value {
color: var(--card-color);
}
span {
&.filter-query__field {
color: var(--code-literal);

View File

@ -57,7 +57,7 @@ const showDocs = ref(false)
<code>done = false &amp;&amp; priority &gt;= 3</code>:
{{ $t('filters.query.help.examples.undoneHighPriority') }}
</li>
<li><code>assignees in user1, user2</code>: {{ $t('filters.query.help.examples.assigneesIn') }}</li>
<li><code>assignees in [user1, user2]</code>: {{ $t('filters.query.help.examples.assigneesIn') }}</li>
<li>
<code>(priority = 1 || priority = 2) &amp;&amp; dueDate &lt;= now</code>:
{{ $t('filters.query.help.examples.priorityOneOrTwoPastDue') }}

View File

@ -30,7 +30,7 @@
>
<icon icon="filter" />
</span>
{{ getProjectTitle(project) }}
{{ project.title }}
</div>
<BaseButton
class="project-button"
@ -59,7 +59,6 @@ import BaseButton from '@/components/base/BaseButton.vue'
import {useProjectBackground} from './useProjectBackground'
import {useProjectStore} from '@/stores/projects'
import {getProjectTitle} from '@/helpers/getProjectTitle'
const {
project,

View File

@ -63,10 +63,6 @@ const filteredProjects = computed(() => {
@media screen and (min-width: $widescreen) {
--project-grid-columns: 5;
.project-grid-item:nth-child(6) {
display: none;
}
}
}

View File

@ -30,27 +30,45 @@ import {computed, ref, watch} from 'vue'
import Filters from '@/components/project/partials/filters.vue'
import {type TaskFilterParams} from '@/services/taskCollection'
import {getDefaultTaskFilterParams, type TaskFilterParams} from '@/services/taskCollection'
import {useRouteQuery} from '@vueuse/router'
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
const modelValue = defineModel<TaskFilterParams>({})
const value = ref<TaskFilterParams>({})
const filter = useRouteQuery('filter')
watch(
() => props.modelValue,
() => modelValue.value,
(modelValue: TaskFilterParams) => {
value.value = modelValue
if (value.value.filter !== '' && value.value.filter !== getDefaultTaskFilterParams().filter) {
filter.value = value.value.filter
}
},
{immediate: true},
)
watch(
() => filter.value,
val => {
if (modelValue.value?.filter === val || typeof val === 'undefined') {
return
}
modelValue.value.filter = val
},
{immediate: true},
)
function emitChanges(newValue: TaskFilterParams) {
emit('update:modelValue', {
...value.value,
filter: newValue.filter,
s: newValue.s,
})
filter.value = newValue.filter
if (modelValue.value?.filter === newValue.filter && modelValue.value?.s === newValue.s) {
return
}
modelValue.value.filter = newValue.filter
modelValue.value.s = newValue.s
}
const hasFilters = computed(() => {

View File

@ -5,7 +5,7 @@
role="search"
>
<FilterInput
v-model="filterQuery"
v-model="params.filter"
:project-id="projectId"
@blur="change()"
/>
@ -28,7 +28,7 @@
<x-button
variant="secondary"
class="mr-2"
:disabled="filterQuery === ''"
:disabled="params.filter === ''"
@click.prevent.stop="clearFiltersAndEmit"
>
{{ $t('filters.clear') }}
@ -87,16 +87,6 @@ const params = ref<TaskFilterParams>({
s: '',
})
const filterQuery = ref('')
watch(
() => [params.value.filter, params.value.s],
() => {
const filter = params.value.filter || ''
const s = params.value.s || ''
filterQuery.value = filter || s
},
)
// Using watchDebounced to prevent the filter re-triggering itself.
watch(
() => modelValue,
@ -117,7 +107,7 @@ const projectStore = useProjectStore()
function change() {
const filter = transformFilterStringForApi(
filterQuery.value,
params.value.filter,
labelTitle => labelStore.filterLabelsByQuery([], labelTitle)[0]?.id || null,
projectTitle => {
const found = projectStore.findProjectByExactname(projectTitle)
@ -152,7 +142,7 @@ function changeAndEmitButton() {
}
function clearFiltersAndEmit() {
filterQuery.value = ''
params.value.filter = ''
changeAndEmitButton()
}
</script>

View File

@ -96,6 +96,7 @@
{{ $t('project.webhooks.title') }}
</DropdownItem>
<DropdownItem
v-if="level < 2"
:to="{ name: 'project.createFromParent', params: { parentProjectId: project.id } }"
icon="layer-group"
>
@ -134,6 +135,9 @@ const props = defineProps({
type: Object as PropType<IProject>,
required: true,
},
level: {
type: Number,
},
})
const projectStore = useProjectStore()

View File

@ -41,7 +41,7 @@
@click="() => unCollapseBucket(bucket)"
>
<span
v-if="view?.doneBucketId === bucket.id"
v-if="project?.doneBucketId === bucket.id"
v-tooltip="$t('project.kanban.doneBucketHint')"
class="icon is-small has-text-success mr-2"
>
@ -109,7 +109,7 @@
</DropdownItem>
<DropdownItem
v-tooltip="$t('project.kanban.doneBucketHintExtended')"
:icon-class="{'has-text-success': bucket.id === view?.doneBucketId}"
:icon-class="{'has-text-success': bucket.id === project?.doneBucketId}"
icon="check-double"
@click.stop="toggleDoneBucket(bucket)"
>
@ -117,7 +117,7 @@
</DropdownItem>
<DropdownItem
v-tooltip="$t('project.kanban.defaultBucketHint')"
:icon-class="{'has-text-primary': bucket.id === view?.defaultBucketId}"
:icon-class="{'has-text-primary': bucket.id === project.defaultBucketId}"
icon="th"
@click.stop="toggleDefaultBucket(bucket)"
>
@ -304,8 +304,6 @@ import type {IProjectView} from '@/modelTypes/IProjectView'
import TaskPositionService from '@/services/taskPosition'
import TaskPositionModel from '@/models/taskPosition'
import {i18n} from '@/i18n'
import ProjectViewService from '@/services/projectViews'
import ProjectViewModel from '@/models/projectView'
const {
projectId,
@ -395,8 +393,6 @@ const project = computed(() => projectId ? projectStore.projects[projectId] : nu
const buckets = computed(() => kanbanStore.buckets)
const loading = computed(() => kanbanStore.isLoading)
const view = computed<IProjectView | null>(() => project.value?.views.find(v => v.id === viewId) || null)
const taskLoading = computed(() => taskStore.isLoading || taskPositionService.value.loading)
watch(
@ -486,8 +482,8 @@ async function updateTaskPosition(e) {
const newTask = klona(task) // cloning the task to avoid pinia store manipulation
newTask.bucketId = newBucket.id
const position = calculateItemPosition(
taskBefore !== null ? taskBefore.position : null,
taskAfter !== null ? taskAfter.position : null,
taskBefore !== null ? taskBefore.kanbanPosition : null,
taskAfter !== null ? taskAfter.kanbanPosition : null,
)
if (
oldBucket !== undefined && // This shouldn't actually be `undefined`, but let's play it safe.
@ -525,13 +521,13 @@ async function updateTaskPosition(e) {
}
// Make sure the first and second task don't both get position 0 assigned
if (newTaskIndex === 0 && taskAfter !== null && taskAfter.position === 0) {
if (newTaskIndex === 0 && taskAfter !== null && taskAfter.kanbanPosition === 0) {
const taskAfterAfter = newBucket.tasks[newTaskIndex + 2] ?? null
const newTaskAfter = klona(taskAfter) // cloning the task to avoid pinia store manipulation
newTaskAfter.bucketId = newBucket.id
newTaskAfter.position = calculateItemPosition(
newTaskAfter.kanbanPosition = calculateItemPosition(
0,
taskAfterAfter !== null ? taskAfterAfter.position : null,
taskAfterAfter !== null ? taskAfterAfter.kanbanPosition : null,
)
await taskStore.update(newTaskAfter)
@ -705,46 +701,26 @@ function dragstart(bucket: IBucket) {
}
async function toggleDefaultBucket(bucket: IBucket) {
const defaultBucketId = view.value?.defaultBucketId === bucket.id
const defaultBucketId = project.value.defaultBucketId === bucket.id
? 0
: bucket.id
const projectViewService = new ProjectViewService()
const updatedView = await projectViewService.update(new ProjectViewModel({
...view.value,
defaultBucketId,
}))
const views = project.value.views.map(v => v.id === view.value?.id ? updatedView : v)
const updatedProject = {
await projectStore.updateProject({
...project.value,
views,
}
projectStore.setProject(updatedProject)
defaultBucketId,
})
success({message: t('project.kanban.defaultBucketSavedSuccess')})
}
async function toggleDoneBucket(bucket: IBucket) {
const doneBucketId = view.value?.doneBucketId === bucket.id
const doneBucketId = project.value?.doneBucketId === bucket.id
? 0
: bucket.id
const projectViewService = new ProjectViewService()
const updatedView = await projectViewService.update(new ProjectViewModel({
...view.value,
doneBucketId,
}))
const views = project.value.views.map(v => v.id === view.value?.id ? updatedView : v)
const updatedProject = {
await projectStore.updateProject({
...project.value,
views,
}
projectStore.setProject(updatedProject)
doneBucketId,
})
success({message: t('project.kanban.doneBucketSavedSuccess')})
}
@ -773,6 +749,11 @@ $crazy-height-calculation: '100vh - 4.5rem - 1.5rem - 1rem - 1.5rem - 11px';
$crazy-height-calculation-tasks: '#{$crazy-height-calculation} - 1rem - 2.5rem - 2rem - #{$button-height} - 1rem';
$filter-container-height: '1rem - #{$switch-view-height}';
// FIXME:
.app-content.project\.kanban, .app-content.task\.detail {
padding-bottom: 0 !important;
}
.kanban {
overflow-x: auto;
overflow-y: hidden;
@ -780,10 +761,6 @@ $filter-container-height: '1rem - #{$switch-view-height}';
margin: 0 -1.5rem;
padding: 0 1.5rem;
&:focus, .bucket .tasks:focus {
box-shadow: none;
}
@media screen and (max-width: $tablet) {
height: calc(#{$crazy-height-calculation} - #{$filter-container-height});
scroll-snap-type: x mandatory;

View File

@ -66,7 +66,7 @@
<SingleTaskInProject
:show-list-color="false"
:disabled="!canWrite"
:can-mark-as-done="canWrite || isPseudoProject"
:can-mark-as-done="canWrite || isSavedFilter(project)"
:the-task="t"
:all-tasks="allTasks"
@taskUpdated="updateTasks"
@ -195,8 +195,6 @@ const canWrite = computed(() => {
return project.value.maxRight > Rights.READ && project.value.id > 0
})
const isPseudoProject = computed(() => (project.value && isSavedFilter(project.value)) || project.value?.id === -1)
onMounted(async () => {
await nextTick()
ctaVisible.value = true
@ -308,12 +306,4 @@ function prepareFiltersAndLoadTasks() {
}
}
}
.list-view {
padding-bottom: 1rem;
:deep(.card) {
margin-bottom: 0;
}
}
</style>

View File

@ -267,7 +267,7 @@
</template>
<script setup lang="ts">
import {computed, type Ref, watch} from 'vue'
import {computed, type Ref} from 'vue'
import {useStorage} from '@vueuse/core'
@ -337,12 +337,6 @@ Object.assign(params.value, {
filter: '',
})
watch(
() => activeColumns.value,
() => setActiveColumnsSortParam(),
{deep: true},
)
// FIXME: by doing this we can have multiple sort orders
function sort(property: keyof SortBy) {
const order = sortBy.value[property]
@ -353,16 +347,7 @@ function sort(property: keyof SortBy) {
} else {
delete sortBy.value[property]
}
setActiveColumnsSortParam()
}
function setActiveColumnsSortParam() {
sortByParam.value = Object.keys(sortBy.value)
.filter(prop => activeColumns.value[prop])
.reduce((obj, key) => {
obj[key] = sortBy.value[key]
return obj
}, {})
sortByParam.value = sortBy.value
}
// TODO: re-enable opening task detail in modal

View File

@ -2,86 +2,70 @@
import type {IProjectView} from '@/modelTypes/IProjectView'
import XButton from '@/components/input/button.vue'
import FilterInput from '@/components/project/partials/FilterInput.vue'
import {ref, onBeforeMount} from 'vue'
import {ref, watch} from 'vue'
import {transformFilterStringForApi, transformFilterStringFromApi} from '@/helpers/filters'
import {useLabelStore} from '@/stores/labels'
import {useProjectStore} from '@/stores/projects'
const {
modelValue,
loading = false,
showSaveButtons = false,
} = defineProps<{
modelValue: IProjectView,
loading?: bool,
showSaveButtons?: bool,
}>()
const emit = defineEmits(['update:modelValue', 'cancel'])
const emit = defineEmits(['update:modelValue'])
const view = ref<IProjectView>()
const labelStore = useLabelStore()
const projectStore = useProjectStore()
onBeforeMount(() => {
const transform = filterString => transformFilterStringFromApi(
filterString,
labelId => labelStore.getLabelById(labelId)?.title,
projectId => projectStore.projects[projectId]?.title || null,
)
watch(
() => modelValue,
newValue => {
const transformed = {
...newValue,
filter: transformFilterStringFromApi(
newValue.filter,
labelId => labelStore.getLabelById(labelId)?.title,
projectId => projectStore.projects[projectId]?.title || null,
),
}
const transformed = {
...modelValue,
filter: transform(modelValue.filter),
bucketConfiguration: modelValue.bucketConfiguration.map(bc => ({
title: bc.title,
filter: transform(bc.filter),
})),
}
if (JSON.stringify(view.value) !== JSON.stringify(transformed)) {
view.value = transformed
}
},
{immediate: true, deep: true},
)
if (JSON.stringify(view.value) !== JSON.stringify(transformed)) {
view.value = transformed
}
})
function save() {
const transformFilter = filterQuery => transformFilterStringForApi(
filterQuery,
labelTitle => labelStore.filterLabelsByQuery([], labelTitle)[0]?.id || null,
projectTitle => {
const found = projectStore.findProjectByExactname(projectTitle)
return found?.id || null
},
)
emit('update:modelValue', {
...view.value,
filter: transformFilter(view.value?.filter),
bucketConfiguration: view.value?.bucketConfiguration.map(bc => ({
title: bc.title,
filter: transformFilter(bc.filter),
})),
})
}
watch(
() => view.value,
newView => {
emit('update:modelValue', {
...newView,
filter: transformFilterStringForApi(
newView.filter,
labelTitle => labelStore.filterLabelsByQuery([], labelTitle)[0]?.id || null,
projectTitle => {
const found = projectStore.findProjectByExactname(projectTitle)
return found?.id || null
},
),
})
},
{deep: true},
)
const titleValid = ref(true)
function validateTitle() {
titleValid.value = view.value?.title !== ''
}
function handleBubbleSave() {
if (showSaveButtons) {
return
}
save()
}
</script>
<template>
<form @focusout="handleBubbleSave">
<form>
<div class="field">
<label
class="label"
@ -139,7 +123,6 @@ function handleBubbleSave() {
<FilterInput
v-model="view.filter"
:project-id="view.projectId"
:input-label="$t('project.views.filter')"
/>
@ -209,7 +192,6 @@ function handleBubbleSave() {
<FilterInput
v-model="view.bucketConfiguration[index].filter"
:project-id="view.projectId"
:input-label="$t('project.views.filter')"
/>
</div>
@ -225,24 +207,6 @@ function handleBubbleSave() {
</div>
</div>
</div>
<div
v-if="showSaveButtons"
class="is-flex is-justify-content-end"
>
<XButton
variant="tertiary"
class="mr-2"
@click="emit('cancel')"
>
{{ $t('misc.cancel') }}
</XButton>
<XButton
:loading="loading"
@click="save"
>
{{ $t('misc.save') }}
</XButton>
</div>
</form>
</template>

View File

@ -27,87 +27,83 @@
v-if="attachments.length > 0"
class="files"
>
<button
<!-- FIXME: don't use a for element that wraps other links / buttons
Instead: overlay element with button that is inside.
-->
<a
v-for="a in attachments"
:key="a.id"
class="attachment"
@click="viewOrDownload(a)"
>
<div class="preview-column">
<FilePreview
class="attachment-preview"
:model-value="a"
/>
<div class="filename">
{{ a.file.name }}
<span
v-if="task.coverImageAttachmentId === a.id"
class="is-task-cover"
>
{{ $t('task.attachment.usedAsCover') }}
</span>
</div>
<div class="attachment-info-column">
<div class="filename">
{{ a.file.name }}
<span
v-if="task.coverImageAttachmentId === a.id"
class="is-task-cover"
<div class="info">
<p class="attachment-info-meta">
<i18n-t
keypath="task.attachment.createdBy"
scope="global"
>
{{ $t('task.attachment.usedAsCover') }}
<span v-tooltip="formatDateLong(a.created)">
{{ formatDateSince(a.created) }}
</span>
<User
:avatar-size="24"
:user="a.createdBy"
:is-inline="true"
/>
</i18n-t>
<span>
{{ getHumanSize(a.file.size) }}
</span>
</div>
<div class="info">
<p class="attachment-info-meta">
<i18n-t
keypath="task.attachment.createdBy"
scope="global"
>
<span v-tooltip="formatDateLong(a.created)">
{{ formatDateSince(a.created) }}
</span>
<User
:avatar-size="24"
:user="a.createdBy"
:is-inline="true"
/>
</i18n-t>
<span>
{{ getHumanSize(a.file.size) }}
</span>
<span v-if="a.file.mime">
{{ a.file.mime }}
</span>
</p>
<p>
<BaseButton
v-tooltip="$t('task.attachment.downloadTooltip')"
class="attachment-info-meta-button"
@click.prevent.stop="downloadAttachment(a)"
>
<icon icon="download" />
</BaseButton>
<BaseButton
v-tooltip="$t('task.attachment.copyUrlTooltip')"
class="attachment-info-meta-button"
@click.stop="copyUrl(a)"
>
<icon icon="copy" />
</BaseButton>
<BaseButton
v-if="editEnabled"
v-tooltip="$t('task.attachment.deleteTooltip')"
class="attachment-info-meta-button"
@click.prevent.stop="setAttachmentToDelete(a)"
>
<icon icon="trash-alt" />
</BaseButton>
<BaseButton
v-if="editEnabled && canPreview(a)"
v-tooltip="task.coverImageAttachmentId === a.id
<span v-if="a.file.mime">
{{ a.file.mime }}
</span>
</p>
<p>
<BaseButton
v-tooltip="$t('task.attachment.downloadTooltip')"
class="attachment-info-meta-button"
@click.prevent.stop="downloadAttachment(a)"
>
{{ $t('misc.download') }}
</BaseButton>
<BaseButton
v-tooltip="$t('task.attachment.copyUrlTooltip')"
class="attachment-info-meta-button"
@click.stop="copyUrl(a)"
>
{{ $t('task.attachment.copyUrl') }}
</BaseButton>
<BaseButton
v-if="editEnabled"
v-tooltip="$t('task.attachment.deleteTooltip')"
class="attachment-info-meta-button"
@click.prevent.stop="setAttachmentToDelete(a)"
>
{{ $t('misc.delete') }}
</BaseButton>
<BaseButton
v-if="editEnabled"
class="attachment-info-meta-button"
@click.prevent.stop="setCoverImage(task.coverImageAttachmentId === a.id ? null : a)"
>
{{
task.coverImageAttachmentId === a.id
? $t('task.attachment.unsetAsCover')
: $t('task.attachment.setAsCover')"
class="attachment-info-meta-button"
@click.prevent.stop="setCoverImage(task.coverImageAttachmentId === a.id ? null : a)"
>
<icon :icon="task.coverImageAttachmentId === a.id ? 'eye-slash' : 'eye'" />
</BaseButton>
</p>
</div>
: $t('task.attachment.setAsCover')
}}
</BaseButton>
</p>
</div>
</button>
</a>
</div>
<x-button
@ -192,7 +188,6 @@ import {useCopyToClipboard} from '@/composables/useCopyToClipboard'
import {error, success} from '@/message'
import {useTaskStore} from '@/stores/tasks'
import {useI18n} from 'vue-i18n'
import FilePreview from '@/components/tasks/partials/file-preview.vue'
const {
task,
@ -265,17 +260,13 @@ async function deleteAttachment() {
const attachmentImageBlobUrl = ref<string | null>(null)
async function viewOrDownload(attachment: IAttachment) {
if (canPreview(attachment)) {
if (SUPPORTED_IMAGE_SUFFIX.some((suffix) => attachment.file.name.endsWith(suffix))) {
attachmentImageBlobUrl.value = await attachmentService.getBlobUrl(attachment)
} else {
downloadAttachment(attachment)
}
}
function canPreview(attachment: IAttachment): boolean {
return SUPPORTED_IMAGE_SUFFIX.some((suffix) => attachment.file.name.toLowerCase().endsWith(suffix))
}
const copy = useCopyToClipboard()
function copyUrl(attachment: IAttachment) {
@ -307,18 +298,11 @@ async function setCoverImage(attachment: IAttachment | null) {
}
.attachment {
display: grid;
grid-template-columns: 9rem 1fr;
align-items: center;
width: 100%;
padding: .5rem;
margin-bottom: .5rem;
display: block;
transition: background-color $transition;
background-color: transparent;
border: transparent;
border-radius: $radius;
padding: .5rem;
&:hover {
background-color: var(--grey-200);
@ -326,25 +310,22 @@ async function setCoverImage(attachment: IAttachment | null) {
}
.filename {
display: flex;
align-items: center;
font-weight: bold;
height: 2rem;
margin-bottom: .25rem;
color: var(--text);
}
.info {
color: var(--grey-500);
font-size: .9rem;
display: flex;
flex-direction: column;
p {
margin-bottom: 0;
display: flex;
> span,
> span:not(:last-child):after,
> button:not(:last-child):after {
content: '·';
padding: 0 .25rem;
}
}
@ -395,12 +376,6 @@ async function setCoverImage(attachment: IAttachment | null) {
}
}
.attachment-info-column {
display: flex;
flex-flow: column wrap;
align-self: start;
}
.attachment-info-meta {
display: flex;
align-items: center;
@ -432,7 +407,6 @@ async function setCoverImage(attachment: IAttachment | null) {
.attachment-info-meta-button {
color: var(--link);
padding: 0 .25rem;
}
@keyframes bounce {
@ -461,19 +435,9 @@ async function setCoverImage(attachment: IAttachment | null) {
}
}
.preview-column {
max-width: 8rem;
height: 5.2rem;
}
.attachment-preview {
height: 100%;
}
.is-task-cover {
background: var(--primary);
color: var(--white);
margin-left: .25rem;
padding: .25rem .35rem;
border-radius: 4px;
font-size: .75rem;

View File

@ -85,7 +85,6 @@
:upload-enabled="true"
:bottom-actions="actions[c.id]"
:show-save="true"
:enable-discard-shortcut="true"
initial-mode="preview"
@update:modelValue="
() => {

View File

@ -30,7 +30,6 @@
:placeholder="$t('task.description.placeholder')"
:show-save="true"
edit-shortcut="e"
:enable-discard-shortcut="true"
@update:modelValue="saveWithDelay"
@save="save"
/>

View File

@ -1,58 +0,0 @@
<template>
<!-- Preview image -->
<img
v-if="blobUrl"
:src="blobUrl"
alt="Attachment preview"
>
<!-- Fallback -->
<div
v-else
class="icon-wrapper"
>
<icon
size="6x"
icon="file"
/>
</div>
</template>
<script setup lang="ts">
import {type PropType, ref, shallowReactive, watchEffect} from 'vue'
import AttachmentService from '@/services/attachment'
import type {IAttachment} from '@/modelTypes/IAttachment'
import {SUPPORTED_IMAGE_SUFFIX} from '@/models/attachment'
const props = defineProps({
modelValue: {
type: Object as PropType<IAttachment>,
default: undefined,
},
})
const attachmentService = shallowReactive(new AttachmentService())
const blobUrl = ref<string | undefined>(undefined)
watchEffect(async () => {
if (props.modelValue && canPreview(props.modelValue)) {
blobUrl.value = await attachmentService.getBlobUrl(props.modelValue)
}
})
function canPreview(attachment: IAttachment): boolean {
return SUPPORTED_IMAGE_SUFFIX.some((suffix) => attachment.file.name.toLowerCase().endsWith(suffix))
}
</script>
<style scoped lang="scss">
img {
width: 100%;
border-radius: $radius;
object-fit: cover;
}
.icon-wrapper {
color: var(--grey-500);
}
</style>

View File

@ -162,7 +162,7 @@ async function maybeDownloadCoverImage() {
}
const attachment = task.attachments.find(a => a.id === task.coverImageAttachmentId)
if (!attachment || !SUPPORTED_IMAGE_SUFFIX.some((suffix) => attachment.file.name.toLowerCase().endsWith(suffix))) {
if (!attachment || !SUPPORTED_IMAGE_SUFFIX.some((suffix) => attachment.file.name.endsWith(suffix))) {
return
}

View File

@ -111,7 +111,7 @@
<icon icon="align-left" />
</span>
<span
v-if="task.repeatAfter.amount > 0 || (task.repeatAfter.amount === 0 && task.repeatMode === TASK_REPEAT_MODES.REPEAT_MODE_MONTH)"
v-if="task.repeatAfter.amount > 0"
class="project-task-icon"
>
<icon icon="history" />
@ -207,7 +207,6 @@ import {useIntervalFn} from '@vueuse/core'
import {playPopSound} from '@/helpers/playPop'
import {useAuthStore} from '@/stores/auth'
import {isEditorContentEmpty} from '@/helpers/editorContentEmpty'
import {TASK_REPEAT_MODES} from '@/types/IRepeatMode'
const {
theTask,

View File

@ -1,5 +1,5 @@
import {ref, shallowReactive, watch, computed, type ComputedGetter} from 'vue'
import {useRoute, useRouter} from 'vue-router'
import {useRoute} from 'vue-router'
import {useRouteQuery} from '@vueuse/router'
import TaskCollectionService, {getDefaultTaskFilterParams, type TaskFilterParams} from '@/services/taskCollection'
@ -66,6 +66,7 @@ export function useTaskList(
const params = ref<TaskFilterParams>({...getDefaultTaskFilterParams()})
const search = ref('')
const page = useRouteQuery('page', '1', { transform: Number })
const sortBy = ref({ ...sortByDefault })
@ -73,6 +74,10 @@ export function useTaskList(
const allParams = computed(() => {
const loadParams = {...params.value}
if (search.value !== '') {
loadParams.s = search.value
}
return formatSortOrder(sortBy.value, loadParams)
})
@ -117,38 +122,16 @@ export function useTaskList(
const route = useRoute()
watch(() => route.query, (query) => {
const {
page: pageQueryValue,
s,
filter,
} = query
if (s !== undefined) {
params.value.s = s as string
const { page: pageQueryValue, search: searchQuery } = query
if (searchQuery !== undefined) {
search.value = searchQuery as string
}
if (pageQueryValue !== undefined) {
page.value = Number(pageQueryValue)
}
if (filter !== undefined) {
params.value.filter = filter
}
}, { immediate: true })
const router = useRouter()
watch(
() => [page.value, params.value.filter, params.value.s],
() => {
router.replace({
name: route.name,
params: route.params,
query: {
page: page.value,
filter: params.value.filter || undefined,
s: params.value.s || undefined,
},
})
},
{ deep: true },
)
// Only listen for query path changes
watch(() => JSON.stringify(getAllTasksParams.value), (newParams, oldParams) => {
@ -165,6 +148,7 @@ export function useTaskList(
totalPages,
currentPage: page,
loadTasks,
searchTerm: search,
params,
sortByParam: sortBy,
}

View File

@ -107,7 +107,7 @@ describe('Filter Transformation', () => {
expect(transformed).toBe('project = 1')
})
it('should resolve project and labels independently', () => {
const transformed = transformFilterStringForApi(
'project = lorem && labels = ipsum',
@ -117,16 +117,6 @@ describe('Filter Transformation', () => {
expect(transformed).toBe('project = 1 && labels = 2')
})
it('should transform the same attribute multiple times', () => {
const transformed = transformFilterStringForApi(
'dueDate = now/d || dueDate > now/w+1w',
nullTitleToIdResolver,
nullTitleToIdResolver,
)
expect(transformed).toBe('due_date = now/d || due_date > now/w+1w')
})
})
describe('To API', () => {
@ -208,15 +198,5 @@ describe('Filter Transformation', () => {
expect(transformed).toBe('project in lorem, ipsum')
})
it('should transform the same attribute multiple times', () => {
const transformed = transformFilterStringFromApi(
'due_date = now/d || due_date > now/w+1w',
nullIdToTitleResolver,
nullIdToTitleResolver,
)
expect(transformed).toBe('dueDate = now/d || dueDate > now/w+1w')
})
})
})

View File

@ -127,7 +127,7 @@ export function transformFilterStringForApi(
// Transform all attributes to snake case
AVAILABLE_FILTER_FIELDS.forEach(f => {
filter = filter.replaceAll(f, snakeCase(f))
filter = filter.replace(f, snakeCase(f))
})
return filter
@ -145,7 +145,7 @@ export function transformFilterStringFromApi(
// Transform all attributes from snake case
AVAILABLE_FILTER_FIELDS.forEach(f => {
filter = filter.replaceAll(snakeCase(f), f)
filter = filter.replace(snakeCase(f), f)
})
// Transform labels to their titles

View File

@ -2,7 +2,7 @@ import {calculateDayInterval} from './calculateDayInterval'
import {calculateNearestHours} from './calculateNearestHours'
import {replaceAll} from '../replaceAll'
export interface dateParseResult {
interface dateParseResult {
newText: string,
date: Date | null,
}
@ -12,7 +12,7 @@ interface dateFoundResult {
date: Date | null,
}
const monthsRegexGroup = '(january|february|march|april|june|july|august|september|october|november|december|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)'
const monthsRegexGroup = '(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)'
function matchesDateExpr(text: string, dateExpr: string): boolean {
return text.match(new RegExp('(^| )' + dateExpr, 'gi')) !== null
@ -60,12 +60,12 @@ export const parseDate = (text: string, now: Date = new Date()): dateParseResult
return addTimeToDate(text, date, 'end of month')
}
let parsed = getDateFromWeekday(text, now)
let parsed = getDateFromWeekday(text)
if (parsed.date !== null) {
return addTimeToDate(text, parsed.date, parsed.foundText)
}
parsed = getDayFromText(text, now)
parsed = getDayFromText(text)
if (parsed.date !== null) {
const month = getMonthFromText(text, parsed.date)
return addTimeToDate(month.newText, month.date, parsed.foundText)
@ -76,15 +76,9 @@ export const parseDate = (text: string, now: Date = new Date()): dateParseResult
return addTimeToDate(text, parsed.date, parsed.foundText)
}
parsed = getDateFromText(text, now)
parsed = getDateFromText(text)
if (parsed.date === null) {
const time = addTimeToDate(text, new Date(now), parsed.foundText)
if (time.date !== null && +now !== +time.date) {
return time
}
return {
newText: replaceAll(text, parsed.foundText, ''),
date: parsed.date,
@ -128,7 +122,7 @@ const addTimeToDate = (text: string, date: Date, previousMatch: string | null):
const replace = results !== null ? results[0] : previousMatch
return {
newText: replaceAll(text, replace, '').trim(),
date,
date: date,
}
}
@ -236,7 +230,7 @@ export const getDateFromTextIn = (text: string, now: Date = new Date()) => {
}
}
const getDateFromWeekday = (text: string, date: Date = new Date()): dateFoundResult => {
const getDateFromWeekday = (text: string): dateFoundResult => {
const matcher = /(^| )(next )?(monday|mon|tuesday|tue|wednesday|wed|thursday|thu|friday|fri|saturday|sat|sunday|sun)($| )/g
const results: string[] | null = matcher.exec(text.toLowerCase()) // The i modifier does not seem to work.
if (results === null) {
@ -246,6 +240,7 @@ const getDateFromWeekday = (text: string, date: Date = new Date()): dateFoundRes
}
}
const date: Date = new Date()
const currentDay: number = date.getDay()
let day = 0
@ -301,7 +296,7 @@ const getDateFromWeekday = (text: string, date: Date = new Date()): dateFoundRes
}
}
const getDayFromText = (text: string, now: Date = new Date()) => {
const getDayFromText = (text: string) => {
const matcher = /(^| )(([1-2][0-9])|(3[01])|(0?[1-9]))(st|nd|rd|th|\.)($| )/ig
const results = matcher.exec(text)
if (results === null) {
@ -311,6 +306,7 @@ const getDayFromText = (text: string, now: Date = new Date()) => {
}
}
const now = new Date()
const date = new Date(now)
const day = parseInt(results[0])
date.setDate(day)

View File

@ -19,16 +19,9 @@ export function secondsToPeriod(seconds: number): { unit: PeriodUnit, amount: nu
}
}
if (seconds % SECONDS_A_HOUR === 0) {
return {
unit: 'hours',
amount: seconds / SECONDS_A_HOUR,
}
}
return {
unit: 'minutes',
amount: seconds / SECONDS_A_MINUTE,
unit: 'hours',
amount: seconds / SECONDS_A_HOUR,
}
}

View File

@ -1,5 +1,4 @@
import {createI18n} from 'vue-i18n'
import type {PluralizationRule} from 'vue-i18n'
import langEN from './lang/en.json'
export const SUPPORTED_LOCALES = {
@ -23,7 +22,6 @@ export const SUPPORTED_LOCALES = {
'ar-SA': 'اَلْعَرَبِيَّةُ',
'sl-SI': 'Slovenščina',
'pt-BR': 'Português Brasileiro',
'hr-HR': 'Hrvatski',
// IMPORTANT: Also add new languages to useDayjsLanguageSync
} as const
@ -37,24 +35,6 @@ export type ISOLanguage = string
export const i18n = createI18n({
fallbackLocale: DEFAULT_LANGUAGE,
legacy: false,
pluralRules: {
'ru-RU': (choice: number, choicesLength: number, orgRule?: PluralizationRule) => {
if (choicesLength !== 3) {
return orgRule ? orgRule(choice, choicesLength) : 0
}
const n = Math.abs(choice) % 100
if (n > 10 && n < 20) {
return 2
}
if (n % 10 === 1) {
return 0
}
if (n % 10 >= 2 && n % 10 <= 4) {
return 1
}
return 2
},
},
messages: {
[DEFAULT_LANGUAGE]: langEN,
// eslint-disable-next-line @typescript-eslint/no-explicit-any

View File

@ -53,7 +53,7 @@
"loginWith": "تسجيل الدخول باستخدام {provider}",
"authenticating": "جاري التحقق…",
"openIdStateError": "حالة التحقق غير متطابقة، لا يمكن المتابعة!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "حدث خطأ أثناء التحقق مع الطرف الثالث.",
"logout": "تسجيل الخروج",
"emailInvalid": "الرجاء إدخال عنوان بريد إلكتروني صحيح.",
"usernameRequired": "الرجاء إدخال اسم المستخدم.",
@ -66,8 +66,7 @@
"hidePassword": "إخفاء كلمة المرور",
"noAccountYet": "ليس لديك حساب بعد؟",
"alreadyHaveAnAccount": "لديك حساب مسبقا؟",
"remember": "البقاء متصلاً",
"registrationDisabled": "Registration is disabled."
"remember": "البقاء متصلاً"
},
"settings": {
"title": "الإعدادات",
@ -96,7 +95,6 @@
"weekStartMonday": "الإثنين",
"language": "اللّغة",
"defaultProject": "المشروع الافتراضي",
"defaultView": "Default View",
"timezone": "منطقة التوقيت",
"overdueTasksRemindersTime": "وقت تذكير للمهام المتأخرة بالبريد الإلكتروني",
"filterUsedOnOverview": "الفلتر المحفوظ والمستخدم في صفحة العرض العام"
@ -229,8 +227,8 @@
"title": "أرشفة \"{project}\"",
"archive": "أرشفة هذا المشروع",
"unarchive": "إلغاء أرشفة هذا المشروع",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"unarchiveText": "ستتمكن من إنشاء مهام جديدة أو تعديلها.",
"archiveText": "لن تتمكن من تعديل هذا المشروع أو إنشاء مهام جديدة حتى تقوم بإلغاء أرشفته.",
"success": "تم أرشفة المشروع بنجاح."
},
"background": {
@ -279,7 +277,7 @@
"title": "روابط المشاركة",
"what": "ما هو رابط المشاركة؟",
"explanation": "تتيح لك روابط المشاركة سهولة مشاركة مشروع مع المستخدمين الآخرين الذين ليس لديهم حساب في Vikunja.",
"create": "Create a link share",
"create": "إنشاء رابط مشاركة جديد",
"name": "الاسم (اختياري)",
"namePlaceholder": "مثال: Lorem Ipsum",
"nameExplanation": "ستظهر جميع الإجراءات التي يقوم بها رابط المشاركة مع الاسم.",
@ -316,15 +314,12 @@
"delete": "حذف"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "القائمة",
"add": "إضافة",
"addPlaceholder": "Add a task…",
"addPlaceholder": "إضافة مهمة جديدة…",
"empty": "هذا المشروع فارغ حاليا.",
"newTaskCta": "Create a task.",
"newTaskCta": "إنشاء مهمة جديدة.",
"editTask": "تعديل المهمة"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "أدخل عنوان المهمة الجديدة…",
"addTask": "إضافة مهمة",
"addAnotherTask": "إضافة مهمة أخرى",
"addBucket": "Create a bucket",
"addBucket": "إنشاء حافظة جديدة",
"addBucketPlaceholder": "أدخل عنوان الحافظة الجديدة…",
"deleteHeaderBucket": "حذف الحافظة",
"deleteBucketText1": "هل أنت متأكد من رغبتك في حذف هذه الحافظة؟",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,7 @@
"create": {
"title": "فلتر جديد محفوظ",
"description": "الفلتر المحفوظ هو مشروع افتراضي يتم حسابه من مجموعة من الفلاتر في كل مرة يتم الوصول إليها.",
"action": "Create saved filter",
"action": "إنشاء فلتر جديد محفوظ",
"titleRequired": "يرجى تحديد عنوان للفلتر."
},
"delete": {
@ -512,7 +506,7 @@
"search": "اكتب للبحث عن تسمية…",
"create": {
"header": "تسمية جديدة",
"title": "Create a label",
"title": "إنشاء تسمية جديدة",
"titleRequired": "الرجاء تحديد العنوان.",
"success": "تم إنشاء التسمية بنجاح."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "جاري التحقق…",
"passwordRequired": "هذا المشروع المشترك يتطلب كلمة مرور. الرجاء إدخالها أدناه:",
"error": "An error occurred.",
"error": "حدث خطأ.",
"invalidPassword": "كلمة المرور غير صحيحة."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "إنشاء جديد",
"selectPlaceholder": "انقر أو اضغط على إدخال للاختيار"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "مهمة",
"new": "Create a task",
"new": "إنشاء مهمة جديدة",
"delete": "حذف هذه المهمة",
"createSuccess": "تم إنشاء المهمة بنجاح.",
"addReminder": "Add a reminder…",
"addReminder": "إضافة تذكير جديد…",
"doneSuccess": "تم بنجاح وضع علامة مكتملة على المهمة.",
"undoneSuccess": "تم بنجاح إلغاء وضع علامة مكتملة على المهمة.",
"undo": "تراجع",
@ -865,7 +859,7 @@
"unassignSuccess": "تم إلغاء تعيين المستخدم بنجاح."
},
"label": {
"placeholder": "Type to add a label…",
"placeholder": "اكتب لإضافة تسمية جديدة…",
"createPlaceholder": "أضف هذا كتسمية جديدة",
"addSuccess": "تمت إضافة التسمية بنجاح.",
"createSuccess": "تم إنشاء التسمية بنجاح.",
@ -888,8 +882,8 @@
"relation": {
"add": "أضف علاقة لمهمة جديدة",
"new": "علاقة لمهمة جديدة",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"searchPlaceholder": "ابحث عن مهمة جديدة لإضافتها كـمهمة مرتبطة…",
"createPlaceholder": "إضافة هذه كمهمة ذات علاقة جديدة",
"differentProject": "هذه المهمة تنتمي إلى مشروع آخر.",
"noneYet": "لا توجد علاقات للمهام حتى الآن.",
"delete": "حذف علاقة المهمة",
@ -927,7 +921,7 @@
"every30d": "كل 30 يوماً",
"mode": "وضع التكرار",
"monthly": "شهرياً",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "من التاريخ الحالي",
"each": "كل",
"specifyAmount": "حدد قيمة…",
"hours": "الساعات",
@ -967,7 +961,7 @@
"title": "الفِرق",
"noTeams": "أنت حاليا لست جزءا من أي فريق.",
"create": {
"title": "Create a team",
"title": "إنشاء فريق جديد",
"success": "تم إنشاء الفريق بنجاح."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "تكرار",
"delete": "حذف",
"unarchive": "إلغاء الأرشفة",
"setBackground": "Background settings",
"setBackground": "تعيين خلفية",
"share": "مشاركة",
"newProject": "مشروع جديد",
"createProject": "إنشاء مشروع",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "en",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Log in with {provider}",
"authenticating": "Authenticating…",
"openIdStateError": "State does not match, refusing to continue!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "An error occured while authenticating against the third party.",
"logout": "Logout",
"emailInvalid": "Please enter a valid email address.",
"usernameRequired": "Please provide a username.",
@ -66,8 +66,7 @@
"hidePassword": "Hide the password",
"noAccountYet": "Don't have an account yet?",
"alreadyHaveAnAccount": "Already have an account?",
"remember": "Stay logged in",
"registrationDisabled": "Registration is disabled."
"remember": "Stay logged in"
},
"settings": {
"title": "Settings",
@ -96,7 +95,6 @@
"weekStartMonday": "Monday",
"language": "Language",
"defaultProject": "Default Project",
"defaultView": "Default View",
"timezone": "Time Zone",
"overdueTasksRemindersTime": "Overdue tasks reminder email time",
"filterUsedOnOverview": "Saved filter used on the overview page"
@ -229,8 +227,8 @@
"title": "Archive \"{project}\"",
"archive": "Archive this project",
"unarchive": "Un-Archive this project",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"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": {
@ -279,7 +277,7 @@
"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 link share",
"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.",
@ -316,15 +314,12 @@
"delete": "Delete"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "List",
"add": "Add",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Add a new task…",
"empty": "This project is currently empty.",
"newTaskCta": "Create a task.",
"newTaskCta": "Create a new task.",
"editTask": "Edit Task"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Enter the new task title…",
"addTask": "Add a task",
"addAnotherTask": "Add another task",
"addBucket": "Create a bucket",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,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.",
"action": "Create saved filter",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Type to search for a label…",
"create": {
"header": "New label",
"title": "Create a label",
"title": "Create a new label",
"titleRequired": "Please specify a title.",
"success": "The label was successfully created."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Authenticating…",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"error": "An error occurred.",
"error": "An error occured.",
"invalidPassword": "The password is invalid."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Create new",
"selectPlaceholder": "Click or press enter to select"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Task",
"new": "Create a task",
"new": "Create a new task",
"delete": "Delete this task",
"createSuccess": "The task was successfully created.",
"addReminder": "Add a reminder…",
"addReminder": "Add a new reminder…",
"doneSuccess": "The task was successfully marked as done.",
"undoneSuccess": "The task was successfully un-marked as done.",
"undo": "Undo",
@ -865,7 +859,7 @@
"unassignSuccess": "The user has been unassigned successfully."
},
"label": {
"placeholder": "Type to add a 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.",
@ -888,8 +882,8 @@
"relation": {
"add": "Add a New Task Relation",
"new": "New Task Relation",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"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.",
"noneYet": "No task relations yet.",
"delete": "Delete Task Relation",
@ -927,7 +921,7 @@
"every30d": "Every 30 Days",
"mode": "Repeat mode",
"monthly": "Monthly",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "From Current Date",
"each": "Each",
"specifyAmount": "Specify an amount…",
"hours": "Hours",
@ -967,7 +961,7 @@
"title": "Teams",
"noTeams": "You are currently not part of any teams.",
"create": {
"title": "Create a team",
"title": "Create a new team",
"success": "The team was successfully created."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Duplicate",
"delete": "Delete",
"unarchive": "Un-Archive",
"setBackground": "Background settings",
"setBackground": "Set background",
"share": "Share",
"newProject": "New project",
"createProject": "Create project",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "en",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -66,8 +66,7 @@
"hidePassword": "Skrýt heslo",
"noAccountYet": "Ještě nemáte účet?",
"alreadyHaveAnAccount": "Už máte svůj účet?",
"remember": "Zůstat trvale přihlášen",
"registrationDisabled": "Registration is disabled."
"remember": "Zůstat trvale přihlášen"
},
"settings": {
"title": "Nastavení",
@ -96,7 +95,6 @@
"weekStartMonday": "Pondělí",
"language": "Jazyk",
"defaultProject": "Výchozí projekt",
"defaultView": "Default View",
"timezone": "Časové pásmo",
"overdueTasksRemindersTime": "Čas odeslání emailu o zpožděných úkolech",
"filterUsedOnOverview": "Uložený filtr použitý na stránce přehledu"
@ -229,8 +227,8 @@
"title": "Archivovat \"{project}\"",
"archive": "Archivovat tento projekt",
"unarchive": "Zrušit archivaci tohoto projektu",
"unarchiveText": "Budete moci vytvářet úkoly nebo je upravovat.",
"archiveText": "Tento projekt nebudete moci upravovat ani v něm vytvářet nové úkoly, dokud jej neobnovíte z archivu.",
"unarchiveText": "Budete moci vytvářet nové úkoly nebo je upravovat.",
"archiveText": "Tento projekt nebudete moci upravovat ani v něm vytvářet nové úkoly, dokud jej neodarchivujete.",
"success": "Projekt byl úspěšně archivován."
},
"background": {
@ -316,13 +314,10 @@
"delete": "Smazat"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "Seznam",
"add": "Přidat",
"addPlaceholder": "Přidat úkol…",
"addPlaceholder": "Přidat nový úkol…",
"empty": "Tento projekt je zatím prázdný.",
"newTaskCta": "Vytvořit nový úkol.",
"editTask": "Upravit úkol"
@ -388,21 +383,20 @@
"secretDocs": "Další podrobnosti o používání tajných klíčů naleznete v dokumentaci."
},
"views": {
"header": "Upravit pohled",
"title": "Název",
"actions": "Akce",
"kind": "Druh",
"bucketConfigMode": "Režim nastavení sloupce",
"bucketConfig": "Nastavení sloupce",
"bucketConfigManual": "Manuál",
"filter": "Filtr",
"create": "Vytvořit pohled",
"createSuccess": "Pohled byl úspěšně vytvořen.",
"titleRequired": "Zadejte prosím název.",
"delete": "Odstranit tento pohled",
"deleteText": "Jste si jisti, že chcete odstranit tento pohled? Nebude již možné jej použít k zobrazení úkolů v tomto projektu. Tato akce neodstraní žádné úkoly. Toto nelze vrátit zpět!",
"deleteSuccess": "Pohled byl úspěšně odstraněn",
"onlyAdminsCanEdit": "Pohledy mohou upravovat pouze správci projektu."
"header": "Edit views",
"title": "Title",
"actions": "Actions",
"kind": "Kind",
"bucketConfigMode": "Bucket configuration mode",
"bucketConfig": "Bucket configuration",
"bucketConfigManual": "Manual",
"filter": "Filter",
"create": "Create view",
"createSuccess": "The view was created successfully.",
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -512,7 +506,7 @@
"search": "Zadejte hledaný štítek…",
"create": {
"header": "Nový štítek",
"title": "Vytvořit štítek",
"title": "Vytvořit nový štítek",
"titleRequired": "Zadejte název prosím.",
"success": "Štítek byl úspěšně vytvořen."
},
@ -647,7 +641,7 @@
"placeholder": "Zadejte nějaký text nebo stiskněte '/' pro zobrazení více možností…"
},
"multiselect": {
"createPlaceholder": "Vytvořit",
"createPlaceholder": "Vytvořit nový",
"selectPlaceholder": "Kliknutím nebo stisknutím klávesy Enter vyberte"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Úkol",
"new": "Vytvořit úkol",
"new": "Vytvořit nový úkol",
"delete": "Smazat tento úkol",
"createSuccess": "Úkol byl úspěšně vytvořen.",
"addReminder": "Přidat připomínku…",
"addReminder": "Přidat novou připomínku…",
"doneSuccess": "Úkol byl úspěšně označen jako dokončený.",
"undoneSuccess": "Úkol byl úspěšně znovu otevřen.",
"undo": "Vrátit zpět",
@ -865,7 +859,7 @@
"unassignSuccess": "Uživatel byl úspěšně vyloučen."
},
"label": {
"placeholder": "Pište pro přidání nového štítku…",
"placeholder": "Zadejte pro přidání nového štítku…",
"createPlaceholder": "Přidat toto jako nový štítek",
"addSuccess": "Štítek byl úspěšně přidán.",
"createSuccess": "Štítek byl úspěšně vytvořen.",
@ -888,8 +882,8 @@
"relation": {
"add": "Přidat nový vztah úkolu",
"new": "Nový vztah k úkolu",
"searchPlaceholder": "Hledejte úkol, který chcete přidat jako související…",
"createPlaceholder": "Přidat jako související úkol",
"searchPlaceholder": "Hledejte nový úkol, který chcete přidat jako související…",
"createPlaceholder": "Přidat toto jako nový související úkol",
"differentProject": "Tento úkol patří do jiného projektu.",
"noneYet": "Zatím žádné vztahy mezi úkoly.",
"delete": "Odstranit vztah k úloze",
@ -927,7 +921,7 @@
"every30d": "Každých 30 dní",
"mode": "Režim opakování",
"monthly": "Měsíčně",
"fromCurrentDate": "Od data dokončení",
"fromCurrentDate": "Od aktuálního data",
"each": "Každý",
"specifyAmount": "Zadejte množství…",
"hours": "Hodin",
@ -967,7 +961,7 @@
"title": "Týmy",
"noTeams": "Momentálně nejste v žádném týmu.",
"create": {
"title": "Vytvořit tým",
"title": "Vytvořit nový tým",
"success": "Tým byl úspěšně vytvořen."
},
"edit": {
@ -1065,13 +1059,13 @@
"duplicate": "Duplikovat",
"delete": "Smazat",
"unarchive": "Zrušit archivaci",
"setBackground": "Nastavení pozadí",
"setBackground": "Nastavit pozadí",
"share": "Sdílet",
"newProject": "Nový projekt",
"createProject": "Vytvořit projekt",
"cantArchiveIsDefault": "Nemůžete archivovat svůj výchozí projekt.",
"cantDeleteIsDefault": "Nemůžete smazat svůj výchozí projekt.",
"views": "Pohledy"
"views": "Views"
},
"apiConfig": {
"url": "Vikunja URL",
@ -1115,14 +1109,14 @@
},
"date": {
"locale": "cs",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {
"reactedWith": "{user} zareagoval s {value}",
"reactedWithAnd": "{users} a {lastUser} zareagovali s {value}",
"reactedWithAndMany": "{users} a {num} zareagovali s {value}",
"add": "Přidejte svou reakci"
"reactedWith": "{user} reacted with {value}",
"reactedWithAnd": "{users} and {lastUser} reacted with {value}",
"reactedWithAndMany": "{users} and {num} more reacted reacted with {value}",
"add": "Add your reaction"
},
"error": {
"error": "Chyba",

View File

@ -53,7 +53,7 @@
"loginWith": "Log ind med {provider}",
"authenticating": "Godkender…",
"openIdStateError": "Indholdet stemmer ikke overens, nægter at fortsætte!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "Der opstod en fejl under godkendelse mod tredjeparten.",
"logout": "Log ud",
"emailInvalid": "Indtast venligst en gyldig e-mailadresse.",
"usernameRequired": "Angiv venligst et brugernavn.",
@ -66,8 +66,7 @@
"hidePassword": "Skjul adgangskoden",
"noAccountYet": "Har du ikke en konto endnu?",
"alreadyHaveAnAccount": "Har du allerede en konto?",
"remember": "Forbliv logget ind",
"registrationDisabled": "Registration is disabled."
"remember": "Forbliv logget ind"
},
"settings": {
"title": "Indstillinger",
@ -96,7 +95,6 @@
"weekStartMonday": "Mandag",
"language": "Sprog",
"defaultProject": "Default Project",
"defaultView": "Default View",
"timezone": "Tidszone",
"overdueTasksRemindersTime": "Forfaldne opgaver påmindelse e-mail tidspunkt",
"filterUsedOnOverview": "Saved filter used on the overview page"
@ -229,8 +227,8 @@
"title": "Archive \"{project}\"",
"archive": "Archive this project",
"unarchive": "Un-Archive this project",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"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": {
@ -279,7 +277,7 @@
"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 link share",
"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.",
@ -316,15 +314,12 @@
"delete": "Delete"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "List",
"add": "Add",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Add a new task…",
"empty": "This project is currently empty.",
"newTaskCta": "Create a task.",
"newTaskCta": "Create a new task.",
"editTask": "Edit Task"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Enter the new task title…",
"addTask": "Add a task",
"addAnotherTask": "Add another task",
"addBucket": "Create a bucket",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,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.",
"action": "Create saved filter",
"action": "Opret nyt gemt filter",
"titleRequired": "Please provide a title for the filter."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Skriv for at søge efter en etiket…",
"create": {
"header": "Ny etiket",
"title": "Create a label",
"title": "Opret ny etiket",
"titleRequired": "Angiv venligst en titel.",
"success": "Etiketten blev oprettet."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Godkender…",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"error": "An error occurred.",
"error": "Der opstod en fejl.",
"invalidPassword": "Adgangskoden er ugyldig."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Opret ny",
"selectPlaceholder": "Klik eller tryk på Enter for at vælge"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Opgave",
"new": "Create a task",
"new": "Opret en ny opgave",
"delete": "Slet denne opgave",
"createSuccess": "Opgaven blev oprettet.",
"addReminder": "Add a reminder…",
"addReminder": "Tilføj en ny påmindelse…",
"doneSuccess": "Opgaven blev markeret som udført.",
"undoneSuccess": "Opgaven fik fjernet sin udført-markering.",
"undo": "Undo",
@ -865,7 +859,7 @@
"unassignSuccess": "Brugeren er blevet frakoblet."
},
"label": {
"placeholder": "Type to add a label…",
"placeholder": "Skriv for at tilføje en ny etiket…",
"createPlaceholder": "Tilføj dette som ny etiket",
"addSuccess": "Etiketten er blevet tilføjet.",
"createSuccess": "Etiketten er blevet oprettet.",
@ -888,8 +882,8 @@
"relation": {
"add": "Tilføj en ny opgaverelation",
"new": "Ny Opgaverelation",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"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.",
"noneYet": "Ingen opgaverelationer endnu.",
"delete": "Slet Opgaverelation",
@ -927,7 +921,7 @@
"every30d": "Every 30 Days",
"mode": "Gentagelsestilstand",
"monthly": "Månedligt",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "Fra Nuværende Dato",
"each": "Hver",
"specifyAmount": "Angiv et beløb…",
"hours": "Timer",
@ -967,7 +961,7 @@
"title": "Hold",
"noTeams": "Du er i øjeblikket ikke en del af et hold.",
"create": {
"title": "Create a team",
"title": "Opret et nyt hold",
"success": "Holdet blev oprettet."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Dupliker",
"delete": "Slet",
"unarchive": "Tilbagekald",
"setBackground": "Background settings",
"setBackground": "Indstil baggrund",
"share": "Del",
"newProject": "New project",
"createProject": "Create project",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "da",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "d m Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Mit {provider} anmelden",
"authenticating": "Authentifizierung…",
"openIdStateError": "Zustand stimmt nicht überein, fahre nicht fort!",
"openIdGeneralError": "Es ist ein Fehler bei der externen Authentifizierung aufgetreten.",
"openIdGeneralError": "Es ist ein Fehler bei der externen Authentisierung aufgetreten.",
"logout": "Abmelden",
"emailInvalid": "Bitte gib eine gültige E-Mail-Adresse ein.",
"usernameRequired": "Bitte gib einen Anmeldenamen ein.",
@ -66,8 +66,7 @@
"hidePassword": "Passwort verbergen",
"noAccountYet": "Noch kein Account?",
"alreadyHaveAnAccount": "Hast du bereits einen Account?",
"remember": "Angemeldet bleiben",
"registrationDisabled": "Registrierung ist deaktiviert."
"remember": "Angemeldet bleiben"
},
"settings": {
"title": "Einstellungen",
@ -96,7 +95,6 @@
"weekStartMonday": "Montag",
"language": "Sprache",
"defaultProject": "Standard-Projekt",
"defaultView": "Standardansicht",
"timezone": "Zeitzone",
"overdueTasksRemindersTime": "Zeit der E-Mail-Zusammenfassung der überfälligen Aufgaben",
"filterUsedOnOverview": "Gespeicherter Filter, der für die Startseite verwendet wird"
@ -229,8 +227,8 @@
"title": "„{project}“ archivieren",
"archive": "Dieses Projekt archivieren",
"unarchive": "Archivierung dieses Projekts aufheben",
"unarchiveText": "Du kannst Aufgaben erstellen oder diese bearbeiten.",
"archiveText": "Du kannst dieses Projekt nicht bearbeiten oder Aufgaben erstellen, bis du die Archivierung aufhebst.",
"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."
},
"background": {
@ -279,7 +277,7 @@
"title": "Linkfreigaben",
"what": "Was ist eine Linkfreigabe?",
"explanation": "Mit Linkfreigaben kannst Projekt du Listen mit Benutzer:innen ohne Vikunja-Account teilen.",
"create": "Erstelle ein Linkfreigabe",
"create": "Erstelle ein neue Linkfreigabe",
"name": "Name (optional)",
"namePlaceholder": "z.B. Lorem Ipsum",
"nameExplanation": "Alle Aktionen, die mit dieser Linkfreigabe durchgeführt werden, werden mit diesem Namen angezeigt.",
@ -316,15 +314,12 @@
"delete": "Löschen"
}
},
"first": {
"title": "Erste Ansicht"
},
"list": {
"title": "Liste",
"add": "Hinzufügen",
"addPlaceholder": "Aufgabe hinzufügen…",
"addPlaceholder": "Neue Aufgabe hinzufügen…",
"empty": "Dieses Project ist derzeit leer.",
"newTaskCta": "Aufgabe erstellen.",
"newTaskCta": "Eine neue Aufgabe erstellen.",
"editTask": "Aufgabe bearbeiten"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Gebe einen Aufgabentitel ein …",
"addTask": "Eine Aufgabe hinzufügen",
"addAnotherTask": "Weitere Aufgabe hinzufügen",
"addBucket": "Bucket erstellen",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Nur Projektadministrator:innen können Ansichten bearbeiten."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,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.",
"action": "Gespeicherten Filter erstellen",
"action": "Neuen gespeicherten Filter erstellen",
"titleRequired": "Bitte gib den Titel für den Filter an."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Beginne zu schreiben, um nach einem Label zu suchen…",
"create": {
"header": "Neues Label",
"title": "Label erstellen",
"title": "Erstelle ein neues Label",
"titleRequired": "Bitte gebe einen Titel an.",
"success": "Das Label wurde erfolgreich erstellt."
},
@ -647,7 +641,7 @@
"placeholder": "Gib Text ein, drücke '/' für mehr Optionen…"
},
"multiselect": {
"createPlaceholder": "Erstellen",
"createPlaceholder": "Neu erstellen",
"selectPlaceholder": "Klicken oder Enter drücken zum Auswählen"
},
"datepickerRange": {
@ -726,7 +720,7 @@
},
"task": {
"task": "Aufgabe",
"new": "Aufgabe erstellen",
"new": "Eine neue Aufgabe erstellen",
"delete": "Diese Aufgabe löschen",
"createSuccess": "Die Aufgabe wurde erfolgreich erstellt.",
"addReminder": "Eine Erinnerung hinzufügen…",
@ -865,7 +859,7 @@
"unassignSuccess": "Benutzer:innenzuweisung aufgehoben."
},
"label": {
"placeholder": "Beginne zu schreiben, um ein Label hinzuzufügen…",
"placeholder": "Tippen, um ein neues Label hinzuzufügen…",
"createPlaceholder": "Dies als neues Label hinzufügen",
"addSuccess": "Das Label wurde erfolgreich hinzugefügt.",
"createSuccess": "Das Label wurde erfolgreich erstellt.",
@ -888,8 +882,8 @@
"relation": {
"add": "Neue Aufgabenbeziehung hinzufügen",
"new": "Neue Aufgabenbeziehung",
"searchPlaceholder": "Suche nach einer Aufgabe für diese Beziehung…",
"createPlaceholder": "Füge diese Aufgabe als Aufgabenbeziehung hinzu",
"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.",
"noneYet": "Keine Aufgabenbeziehung vorhanden.",
"delete": "Aufgabenbeziehung entfernen",
@ -927,7 +921,7 @@
"every30d": "Alle 30 Tage",
"mode": "Wiederholungsmodus",
"monthly": "Monatlich",
"fromCurrentDate": "Ab Fertigstellungsdatum",
"fromCurrentDate": "Ab dem aktuellen Datum",
"each": "Alle",
"specifyAmount": "Gib einen Anzahl an …",
"hours": "Stunden",
@ -967,7 +961,7 @@
"title": "Teams",
"noTeams": "Du bist derzeit in keinem Team.",
"create": {
"title": "Team erstellen",
"title": "Erstelle ein neues Team",
"success": "Das Team wurde erfolgreich erstellt."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Duplizieren",
"delete": "Löschen",
"unarchive": "Archivierung aufheben",
"setBackground": "Hintergrundeinstellungen",
"setBackground": "Hintergrund einstellen",
"share": "Teilen",
"newProject": "Neues Projekt",
"createProject": "Projekt erstellen",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "de",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Iihlogge mit {provider}",
"authenticating": "Authentifiziere…",
"openIdStateError": "Status stimmt nid überiih, ich verweigerä wiiter zmache!",
"openIdGeneralError": "Es ist ein Fehler bei der externen Authentifizierung aufgetreten.",
"openIdGeneralError": "Es ist ein Fehler bei der externen Authentisierung aufgetreten.",
"logout": "Uuslogge",
"emailInvalid": "Bitte gib eine gültige E-Mail-Adresse ein.",
"usernameRequired": "Bitte gib einen Anmeldenamen ein.",
@ -66,8 +66,7 @@
"hidePassword": "Passwort verbergen",
"noAccountYet": "Noch kein Account?",
"alreadyHaveAnAccount": "Hast du bereits einen Account?",
"remember": "Angemeldet bleiben",
"registrationDisabled": "Registrierung ist deaktiviert."
"remember": "Angemeldet bleiben"
},
"settings": {
"title": "Iihstellige",
@ -96,7 +95,6 @@
"weekStartMonday": "Määntig",
"language": "Sproch",
"defaultProject": "Standard-Projekt",
"defaultView": "Standardansicht",
"timezone": "Zeitzone",
"overdueTasksRemindersTime": "Zeit der E-Mail-Zusammenfassung der überfälligen Aufgaben",
"filterUsedOnOverview": "Gespeicherter Filter, der für die Startseite verwendet wird"
@ -229,8 +227,8 @@
"title": "„{project}“ archivieren",
"archive": "Dieses Projekt archivieren",
"unarchive": "Archivierung dieses Projekts aufheben",
"unarchiveText": "Du kannst Aufgaben erstellen oder diese bearbeiten.",
"archiveText": "Du kannst dieses Projekt nicht bearbeiten oder Aufgaben erstellen, bis du die Archivierung aufhebst.",
"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."
},
"background": {
@ -279,7 +277,7 @@
"title": "Linkfreigaben",
"what": "Was ist eine Linkfreigabe?",
"explanation": "Mit Linkfreigaben kannst Projekt du Listen mit Benutzer:innen ohne Vikunja-Account teilen.",
"create": "Erstelle ein Linkfreigabe",
"create": "Erstelle ein neue Linkfreigabe",
"name": "Name (optional)",
"namePlaceholder": "z.B. Lorem Ipsum",
"nameExplanation": "Alle Aktionen, die mit dieser Linkfreigabe durchgeführt werden, werden mit diesem Namen angezeigt.",
@ -316,15 +314,12 @@
"delete": "Löschen"
}
},
"first": {
"title": "Erste Ansicht"
},
"list": {
"title": "Liste",
"add": "Hinzufügen",
"addPlaceholder": "Aufgabe hinzufügen…",
"addPlaceholder": "Neue Aufgabe hinzufügen…",
"empty": "Dieses Project ist derzeit leer.",
"newTaskCta": "Aufgabe erstellen.",
"newTaskCta": "Eine neue Aufgabe erstellen.",
"editTask": "Aufgabe bearbeiten"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Gebe einen Aufgabentitel ein …",
"addTask": "Eine Aufgabe hinzufügen",
"addAnotherTask": "Weitere Aufgabe hinzufügen",
"addBucket": "Bucket erstellen",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Nur Projektadministrator:innen können Ansichten bearbeiten."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,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.",
"action": "Gespeicherten Filter erstellen",
"action": "Neue gspeicherete Filter erstelle",
"titleRequired": "Bitte gib den Titel für den Filter an."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Schriib, um nachemne Label z'sueche…",
"create": {
"header": "Neus Label",
"title": "Label erstellen",
"title": "Neus Label erstelle",
"titleRequired": "Bitte gib en Titl ah.",
"success": "Da Label isch erfolgriich erstellt wore."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Authentifiziere…",
"passwordRequired": "Dieses geteilte Projekt benötigt ein Passwort. Bitte gebe es unten ein:",
"error": "Es ist ein Fehler aufgetreten.",
"error": "Het en Fähler geh. :(",
"invalidPassword": "Da Passwort isch ungültig."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Gib Text ein, drücke '/' für mehr Optionen…"
},
"multiselect": {
"createPlaceholder": "Erstellen",
"createPlaceholder": "Neu erstelle",
"selectPlaceholder": "Druck uf Enter zum uuswähle"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Uufgab",
"new": "Aufgabe erstellen",
"new": "Neui Uufgab erstelle",
"delete": "Die Uufgab chüble",
"createSuccess": "Die Uufgab isch erfolgriich erstellt wordä.",
"addReminder": "Eine Erinnerung hinzufügen…",
"addReminder": "Neui Errinnerig erstelle…",
"doneSuccess": "Die Uufgab isch erfolgriich als \"Fertig\" markiert wordä.",
"undoneSuccess": "Die Uufgaab isch nüme als fertig markiert.",
"undo": "Rückgängig",
@ -865,7 +859,7 @@
"unassignSuccess": "D'Zuewiisig vom Benutzer isch erfolgriich entfernt worde."
},
"label": {
"placeholder": "Beginne zu schreiben, um ein Label hinzuzufügen…",
"placeholder": "Schriib, um es neues Label hinzuezfüege…",
"createPlaceholder": "Das als neues Label hinzuefüege",
"addSuccess": "Das Label isch erfolgriich hinzuegfüegt worde.",
"createSuccess": "Das Label isch erfolgriich erstellt worde.",
@ -888,8 +882,8 @@
"relation": {
"add": "Neui Uufgabe Beziehig hinzuefüege",
"new": "Neui Uufgabe Beziehig",
"searchPlaceholder": "Suche nach einer Aufgabe für diese Beziehung…",
"createPlaceholder": "Füge diese Aufgabe als Aufgabenbeziehung hinzu",
"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.",
"noneYet": "S'git kei Uufgabe Beziehige.",
"delete": "Uufgabe Beziehig chüble",
@ -927,7 +921,7 @@
"every30d": "Alle 30 Tage",
"mode": "Widerholigs Modus",
"monthly": "Monatlich",
"fromCurrentDate": "Ab Fertigstellungsdatum",
"fromCurrentDate": "Vom Hüttige Datum",
"each": "Jedä",
"specifyAmount": "Gib e Ahzahl ah…",
"hours": "Stundä",
@ -967,7 +961,7 @@
"title": "Teams",
"noTeams": "Du hesch momentan kei Team Ahghörigkeit.",
"create": {
"title": "Team erstellen",
"title": "E neus Team erstelle",
"success": "Da Team isch erfolgriich erstellt wordä."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Dublizierä",
"delete": "Chüble",
"unarchive": "Ent-archiviere",
"setBackground": "Hintergrundeinstellungen",
"setBackground": "Hintergrund iihstelle",
"share": "Teilä",
"newProject": "Neues Projekt",
"createProject": "Projekt erstellen",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "ch",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Log in with {provider}",
"authenticating": "Authenticating…",
"openIdStateError": "State does not match, refusing to continue!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "An error occured while authenticating against the third party.",
"logout": "Logout",
"emailInvalid": "Please enter a valid email address.",
"usernameRequired": "Please provide a username.",
@ -66,8 +66,7 @@
"hidePassword": "Hide the password",
"noAccountYet": "Don't have an account yet?",
"alreadyHaveAnAccount": "Already have an account?",
"remember": "Stay logged in",
"registrationDisabled": "Registration is disabled."
"remember": "Stay logged in"
},
"settings": {
"title": "Settings",
@ -96,7 +95,6 @@
"weekStartMonday": "Monday",
"language": "Language",
"defaultProject": "Default Project",
"defaultView": "Default View",
"timezone": "Time Zone",
"overdueTasksRemindersTime": "Overdue tasks reminder email time",
"filterUsedOnOverview": "Saved filter used on the overview page"
@ -229,8 +227,8 @@
"title": "Archive \"{project}\"",
"archive": "Archive this project",
"unarchive": "Un-Archive this project",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"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": {
@ -279,7 +277,7 @@
"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 link share",
"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.",
@ -316,15 +314,12 @@
"delete": "Delete"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "List",
"add": "Add",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Add a new task…",
"empty": "This project is currently empty.",
"newTaskCta": "Create a task.",
"newTaskCta": "Create a new task.",
"editTask": "Edit Task"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Enter the new task title…",
"addTask": "Add a task",
"addAnotherTask": "Add another task",
"addBucket": "Create a bucket",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,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.",
"action": "Create saved filter",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Type to search for a label…",
"create": {
"header": "New label",
"title": "Create a label",
"title": "Create a new label",
"titleRequired": "Please specify a title.",
"success": "The label was successfully created."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Authenticating…",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"error": "An error occurred.",
"error": "An error occured.",
"invalidPassword": "The password is invalid."
},
"navigation": {
@ -648,7 +642,7 @@
}
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Create new",
"selectPlaceholder": "Click or press enter to select"
},
"datepickerRange": {
@ -727,10 +721,10 @@
},
"task": {
"task": "Task",
"new": "Create a task",
"new": "Create a new task",
"delete": "Delete this task",
"createSuccess": "The task was successfully created.",
"addReminder": "Add a reminder…",
"addReminder": "Add a new reminder…",
"doneSuccess": "The task was successfully marked as done.",
"undoneSuccess": "The task was successfully un-marked as done.",
"undo": "Undo",
@ -866,7 +860,7 @@
"unassignSuccess": "The user has been unassigned successfully."
},
"label": {
"placeholder": "Type to add a 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.",
@ -889,8 +883,8 @@
"relation": {
"add": "Add a New Task Relation",
"new": "New Task Relation",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"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.",
"noneYet": "No task relations yet.",
"delete": "Delete Task Relation",
@ -928,7 +922,7 @@
"every30d": "Every 30 Days",
"mode": "Repeat mode",
"monthly": "Monthly",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "From Current Date",
"each": "Each",
"specifyAmount": "Specify an amount…",
"hours": "Hours",
@ -968,7 +962,7 @@
"title": "Teams",
"noTeams": "You are currently not part of any teams.",
"create": {
"title": "Create a team",
"title": "Create a new team",
"success": "The team was successfully created."
},
"edit": {
@ -1066,7 +1060,7 @@
"duplicate": "Duplicate",
"delete": "Delete",
"unarchive": "Un-Archive",
"setBackground": "Background settings",
"setBackground": "Set background",
"share": "Share",
"newProject": "New project",
"createProject": "Create project",
@ -1116,7 +1110,7 @@
},
"date": {
"locale": "en",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Log in with {provider}",
"authenticating": "Authenticating…",
"openIdStateError": "State does not match, refusing to continue!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "An error occured while authenticating against the third party.",
"logout": "Logout",
"emailInvalid": "Please enter a valid email address.",
"usernameRequired": "Please provide a username.",
@ -66,8 +66,7 @@
"hidePassword": "Hide the password",
"noAccountYet": "Don't have an account yet?",
"alreadyHaveAnAccount": "Already have an account?",
"remember": "Stay logged in",
"registrationDisabled": "Registration is disabled."
"remember": "Stay logged in"
},
"settings": {
"title": "Settings",
@ -96,7 +95,6 @@
"weekStartMonday": "Monday",
"language": "Language",
"defaultProject": "Default Project",
"defaultView": "Default View",
"timezone": "Time Zone",
"overdueTasksRemindersTime": "Overdue tasks reminder email time",
"filterUsedOnOverview": "Saved filter used on the overview page"
@ -229,8 +227,8 @@
"title": "Archive \"{project}\"",
"archive": "Archive this project",
"unarchive": "Un-Archive this project",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"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": {
@ -279,7 +277,7 @@
"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 link share",
"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.",
@ -316,15 +314,12 @@
"delete": "Delete"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "List",
"add": "Add",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Add a new task…",
"empty": "This project is currently empty.",
"newTaskCta": "Create a task.",
"newTaskCta": "Create a new task.",
"editTask": "Edit Task"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Enter the new task title…",
"addTask": "Add a task",
"addAnotherTask": "Add another task",
"addBucket": "Create a bucket",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,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.",
"action": "Create saved filter",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Type to search for a label…",
"create": {
"header": "New label",
"title": "Create a label",
"title": "Create a new label",
"titleRequired": "Please specify a title.",
"success": "The label was successfully created."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Authenticating…",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"error": "An error occurred.",
"error": "An error occured.",
"invalidPassword": "The password is invalid."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Create new",
"selectPlaceholder": "Click or press enter to select"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Task",
"new": "Create a task",
"new": "Create a new task",
"delete": "Delete this task",
"createSuccess": "The task was successfully created.",
"addReminder": "Add a reminder…",
"addReminder": "Add a new reminder…",
"doneSuccess": "The task was successfully marked as done.",
"undoneSuccess": "The task was successfully un-marked as done.",
"undo": "Undo",
@ -865,7 +859,7 @@
"unassignSuccess": "The user has been unassigned successfully."
},
"label": {
"placeholder": "Type to add a 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.",
@ -888,8 +882,8 @@
"relation": {
"add": "Add a New Task Relation",
"new": "New Task Relation",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"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.",
"noneYet": "No task relations yet.",
"delete": "Delete Task Relation",
@ -927,7 +921,7 @@
"every30d": "Every 30 Days",
"mode": "Repeat mode",
"monthly": "Monthly",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "From Current Date",
"each": "Each",
"specifyAmount": "Specify an amount…",
"hours": "Hours",
@ -967,7 +961,7 @@
"title": "Teams",
"noTeams": "You are currently not part of any teams.",
"create": {
"title": "Create a team",
"title": "Create a new team",
"success": "The team was successfully created."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Duplicate",
"delete": "Delete",
"unarchive": "Un-Archive",
"setBackground": "Background settings",
"setBackground": "Set background",
"share": "Share",
"newProject": "New project",
"createProject": "Create project",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "en",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Inicie sesión con {provider}",
"authenticating": "Autenticando…",
"openIdStateError": "El estado no coincide, ¡negándose a continuar!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "Se ha producido un error al autenticarse contra terceros.",
"logout": "Cerrar sesión",
"emailInvalid": "Por favor, introduce una dirección de correo electrónico válida.",
"usernameRequired": "Por favor, proporciona un nombre de usuario.",
@ -66,8 +66,7 @@
"hidePassword": "Ocultar la contraseña",
"noAccountYet": "¿Aún no tienes una cuenta?",
"alreadyHaveAnAccount": "¿Ya tienes una cuenta?",
"remember": "Mantener la sesión abierta",
"registrationDisabled": "Registration is disabled."
"remember": "Mantener la sesión abierta"
},
"settings": {
"title": "Ajustes",
@ -96,7 +95,6 @@
"weekStartMonday": "Lunes",
"language": "Idioma",
"defaultProject": "Proyecto por defecto",
"defaultView": "Default View",
"timezone": "Zona Horaria",
"overdueTasksRemindersTime": "Hora de envío del correo electrónico de tareas pendientes",
"filterUsedOnOverview": "Filtro guardado utilizado en la página de resumen"
@ -229,8 +227,8 @@
"title": "Archivar \"{project}\"",
"archive": "Archiva este proyecto",
"unarchive": "Desarchivar este proyecto",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"unarchiveText": "Desde aquí podrás crear nuevas tareas o editarlas.",
"archiveText": "No será posible editar este proyecto o crear nuevas tareas hasta que deje de estar archivado.",
"success": "El proyecto ha sido archivado con éxito."
},
"background": {
@ -279,7 +277,7 @@
"title": "Compartir Enlaces",
"what": "¿Qué es un enlace compartido?",
"explanation": "Los Enlaces Compartidos te permiten compartir fácilmente un proyecto con otros usuarios que no tienen una cuenta en Vikunja.",
"create": "Create a link share",
"create": "Crear un nuevo enlace compartido",
"name": "Nombre (opcional)",
"namePlaceholder": "ej. Lorem Ipsum",
"nameExplanation": "Todas las acciones realizadas por este enlace compartido se mostrarán con el nombre.",
@ -316,15 +314,12 @@
"delete": "Eliminar"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "Lista",
"add": "Añadir",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Añadir una nueva tarea…",
"empty": "Este proyecto está actualmente vacío.",
"newTaskCta": "Create a task.",
"newTaskCta": "Crear una nueva tarea.",
"editTask": "Editar Tarea"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Introduce el nuevo título de la tarea…",
"addTask": "Añadir una tarea",
"addAnotherTask": "Añadir otra tarea",
"addBucket": "Create a bucket",
"addBucket": "Crear un nuevo contenedor",
"addBucketPlaceholder": "Introduzca el nuevo título del contenedor…",
"deleteHeaderBucket": "Eliminar el contenedor",
"deleteBucketText1": "¿Estás seguro de que quieres eliminar este contenedor?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,7 @@
"create": {
"title": "Nuevo Filtro Guardado",
"description": "Un filtro guardado es un proyecto virtual que se calcula a partir de un conjunto de filtros cada vez que se accede.",
"action": "Create saved filter",
"action": "Crear nuevo filtro guardado",
"titleRequired": "Por favor, introduce un título para el filtro."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Escribe para buscar una etiqueta…",
"create": {
"header": "Nueva etiqueta",
"title": "Create a label",
"title": "Crear una nueva etiqueta",
"titleRequired": "Por favor, especifica un título.",
"success": "La etiqueta se ha creado correctamente."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Autenticando…",
"passwordRequired": "Este proyecto compartido requiere una contraseña. Por favor introdúcelo debajo:",
"error": "An error occurred.",
"error": "Ha ocurrido un error.",
"invalidPassword": "La contraseña es inválida."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Crear nuevo",
"selectPlaceholder": "Clic o Enter para seleccionar"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Tarea",
"new": "Create a task",
"new": "Crear una nueva tarea",
"delete": "Eliminar esta tarea",
"createSuccess": "La tarea se ha creado con éxito.",
"addReminder": "Add a reminder…",
"addReminder": "Añadir un nuevo recordatorio…",
"doneSuccess": "La tarea fue marcada con éxito como realizada.",
"undoneSuccess": "La tarea fue marcada correctamente como incompleta.",
"undo": "Deshacer",
@ -865,7 +859,7 @@
"unassignSuccess": "El usuario ha sido desasignado con éxito."
},
"label": {
"placeholder": "Type to add a label…",
"placeholder": "Escriba para añadir una nueva etiqueta…",
"createPlaceholder": "Añadir esto como nueva etiqueta",
"addSuccess": "La etiqueta ha sido añadida con éxito.",
"createSuccess": "La etiqueta ha sido creada con éxito.",
@ -888,8 +882,8 @@
"relation": {
"add": "Añadir una Nueva Tarea Relacionada",
"new": "Nueva Tarea Relacionada",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"searchPlaceholder": "Escriba para buscar una nueva tarea a añadir como relacionada…",
"createPlaceholder": "Añadir esto como nueva tarea relacionada",
"differentProject": "Esta tarea pertenece a un proyecto diferente.",
"noneYet": "Aún no hay tareas relacionadas.",
"delete": "Eliminar Relación de Tarea",
@ -927,7 +921,7 @@
"every30d": "Every 30 Days",
"mode": "Modo de repetición",
"monthly": "Mensualmente",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "Desde la Fecha Actual",
"each": "Cada",
"specifyAmount": "Especifique una cantidad…",
"hours": "Horas",
@ -967,7 +961,7 @@
"title": "Equipos",
"noTeams": "Actualmente no formas parte de ningún equipo.",
"create": {
"title": "Create a team",
"title": "Crear un nuevo equipo",
"success": "El equipo fue creado con éxito."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Duplicar",
"delete": "Eliminar",
"unarchive": "Desarchivar",
"setBackground": "Background settings",
"setBackground": "Establecer fondo",
"share": "Compartir",
"newProject": "Nuevo proyecto",
"createProject": "Crear proyecto",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "es",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Se connecter avec {provider}",
"authenticating": "Authentification…",
"openIdStateError": "Létat ne correspond pas, impossible de continuer !",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "Une erreur s'est produite lors de l'authentification contre un tiers.",
"logout": "Se déconnecter",
"emailInvalid": "Veuillez saisir une adresse courriel valide.",
"usernameRequired": "Veuillez saisir un nom d'utilisateur.",
@ -66,8 +66,7 @@
"hidePassword": "Masquer le mot de passe",
"noAccountYet": "Vous n'avez pas encore de compte?",
"alreadyHaveAnAccount": "Vous avez déjà un compte?",
"remember": "Rester connecté(e)",
"registrationDisabled": "Registration is disabled."
"remember": "Rester connecté(e)"
},
"settings": {
"title": "Paramètres",
@ -96,7 +95,6 @@
"weekStartMonday": "lundi",
"language": "Langue",
"defaultProject": "Projet par défaut",
"defaultView": "Default View",
"timezone": "Fuseau horaire",
"overdueTasksRemindersTime": "Heure du courriel de rappel des tâches en retard",
"filterUsedOnOverview": "Filtre enregistré utilisé sur la vue densemble"
@ -229,8 +227,8 @@
"title": "Archiver « {project} »",
"archive": "Archiver ce projet",
"unarchive": "Désarchiver ce projet",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"unarchiveText": "Vous serez en mesure de créer de nouvelles tâches ou de les modifier.",
"archiveText": "Vous ne pourrez pas modifier ce projet ou créer de nouvelles tâches si vous ne le désarchivez pas.",
"success": "Le projet a bien été archivé."
},
"background": {
@ -279,7 +277,7 @@
"title": "Liens de partage",
"what": "Quest-ce quun lien de partage ?",
"explanation": "Les liens de partage permettent de partager facilement un projet avec dautres personnes qui nont pas de compte sur Vikunja.",
"create": "Create a link share",
"create": "Créer un nouveau lien de partage",
"name": "Nom (facultatif)",
"namePlaceholder": "par ex., Lorem Ipsum",
"nameExplanation": "Toutes les actions effectuées par ce partage de lien apparaîtront avec le nom.",
@ -316,15 +314,12 @@
"delete": "Supprimer"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "Liste",
"add": "Ajouter",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Ajouter une nouvelle tâche…",
"empty": "Ce projet est actuellement vide.",
"newTaskCta": "Create a task.",
"newTaskCta": "Créer une nouvelle tâche.",
"editTask": "Modifier la tâche"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Saisir le nouveau nom de la tâche…",
"addTask": "Ajouter une tâche",
"addAnotherTask": "Ajouter une autre tâche",
"addBucket": "Create a bucket",
"addBucket": "Créer une nouvelle colonne",
"addBucketPlaceholder": "Saisir le titre de la nouvelle colonne…",
"deleteHeaderBucket": "Supprimer la colonne",
"deleteBucketText1": "Voulez-vous supprimer cette colonne ?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,7 @@
"create": {
"title": "Nouveau filtre enregistré",
"description": "Un filtre sauvegardé est un projet virtuel qui est calculé à partir dun ensemble de filtres à chaque fois quil est consulté.",
"action": "Create saved filter",
"action": "Créer un nouveau filtre enregistré",
"titleRequired": "Veuillez donner un nom au filtre."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Taper pour rechercher une étiquette…",
"create": {
"header": "Nouvelle étiquette",
"title": "Create a label",
"title": "Créer une nouvelle étiquette",
"titleRequired": "Indiquer un nom.",
"success": "Étiquette créée."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Authentification…",
"passwordRequired": "Ce projet partagé nécessite un mot de passe. Saisissez-le ci-dessous :",
"error": "An error occurred.",
"error": "Une erreur sest produite.",
"invalidPassword": "Le mot de passe est invalide."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Créer un nouveau",
"selectPlaceholder": "Cliquer ou appuyer sur la touche Entrée pour sélectionner"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Tâche",
"new": "Create a task",
"new": "Créer une nouvelle tâche",
"delete": "Supprimer cette tâche",
"createSuccess": "Tâche créée.",
"addReminder": "Add a reminder…",
"addReminder": "Ajouter un nouveau rappel…",
"doneSuccess": "Tâche marquée comme terminée.",
"undoneSuccess": "Tâche marquée comme non terminée.",
"undo": "Annuler",
@ -865,7 +859,7 @@
"unassignSuccess": "Désaffectation réussie."
},
"label": {
"placeholder": "Type to add a label…",
"placeholder": "Taper pour ajouter une nouvelle étiquette…",
"createPlaceholder": "Ajouter ceci comme nouvelle étiquette",
"addSuccess": "Étiquette ajoutée.",
"createSuccess": "Étiquette créée.",
@ -888,8 +882,8 @@
"relation": {
"add": "Ajouter une nouvelle relation de tâche",
"new": "Nouvelle relation de tâche",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"searchPlaceholder": "Saisir une nouvelle tâche à ajouter comme connexe…",
"createPlaceholder": "Ajouter cette tâche comme nouvelle tâche connexe",
"differentProject": "Cette tâche appartient à un autre projet.",
"noneYet": "Pas encore de relations de tâches.",
"delete": "Supprimer la relation de tâche",
@ -927,7 +921,7 @@
"every30d": "Every 30 Days",
"mode": "Mode de répétition",
"monthly": "Mensuel",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "À partir de la date actuelle",
"each": "Tous ou toutes les",
"specifyAmount": "Indiquer un nombre…",
"hours": "Heures",
@ -967,7 +961,7 @@
"title": "Équipes",
"noTeams": "Vous ne faites actuellement partie daucune équipe.",
"create": {
"title": "Create a team",
"title": "Créer une nouvelle équipe",
"success": "Équipe créée."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Dupliquer",
"delete": "Supprimer",
"unarchive": "Désarchiver",
"setBackground": "Background settings",
"setBackground": "Définir larrière-plan",
"share": "Partager",
"newProject": "Nouveau projet",
"createProject": "Créer un projet",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "fr",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

File diff suppressed because it is too large Load Diff

View File

@ -53,7 +53,7 @@
"loginWith": "Bejelentkezés {provider}-profillal",
"authenticating": "Hitelesítés…",
"openIdStateError": "Állapot nem egyezik, nem lehet folytatni!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "Hiba történt a harmadik féllel szembeni hitelesítés során.",
"logout": "Kijelentkezés",
"emailInvalid": "Kérjük, adjon meg egy valós email címet!",
"usernameRequired": "Kérjük adjon meg egy felhasználónevet.",
@ -66,8 +66,7 @@
"hidePassword": "A jelszó elrejtése",
"noAccountYet": "Még nincs fiókja?",
"alreadyHaveAnAccount": "Már rendelkezik fiókkal?",
"remember": "Maradjon bejelentkezve",
"registrationDisabled": "Registration is disabled."
"remember": "Maradjon bejelentkezve"
},
"settings": {
"title": "Beállítások",
@ -96,7 +95,6 @@
"weekStartMonday": "Hétfő",
"language": "Nyelv",
"defaultProject": "Alapértelmezett projekt",
"defaultView": "Default View",
"timezone": "Időzóna",
"overdueTasksRemindersTime": "Esedékes feladatokra emlékeztető e-mail küldésének ideje",
"filterUsedOnOverview": "Az áttekintő oldalon használt mentett szűrő"
@ -229,8 +227,8 @@
"title": "\"{project}\" archiválása.",
"archive": "Archiválja ezt a projektet",
"unarchive": "Projekt archiválásának visszaállítása",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"unarchiveText": "Új feladatokat hozhat létre, vagy szerkeszthet.",
"archiveText": "Addig nem szerkesztheti ezt a projektet, és nem hozhat létre új feladatokat, amíg nem állítja vissza az archiválást.",
"success": "A projekt sikeresen archiválva."
},
"background": {
@ -279,7 +277,7 @@
"title": "Hivatkozások megosztása",
"what": "Mi az a megosztási link?",
"explanation": "A Linkek megosztása segítségével egyszerűen megoszthat egy projektet más felhasználókkal, akik nem rendelkeznek fiókkal a Vikunján.",
"create": "Create a link share",
"create": "Hozzon létre egy új linkmegosztást",
"name": "Név (nem kötelező)",
"namePlaceholder": "Például: Kis Géza",
"nameExplanation": "A link megosztása által végzett összes művelet a névvel együtt fog megjelenni.",
@ -316,15 +314,12 @@
"delete": "Törlés"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "Lista",
"add": "Új hozzáadása",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Új feladat hozzáadása...",
"empty": "Ez a projekt jelenleg üres.",
"newTaskCta": "Create a task.",
"newTaskCta": "Új feladat létrehozása.",
"editTask": "Feladat szerkesztése."
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Adja meg az új feladatcímet…",
"addTask": "Feladat hozzáadása",
"addAnotherTask": "Adjon hozzá egy másik feladatot",
"addBucket": "Create a bucket",
"addBucket": "Új vödör létrehozása",
"addBucketPlaceholder": "Adja meg az új vödör címét…",
"deleteHeaderBucket": "Vödör törlése",
"deleteBucketText1": "Biztosan törli ezt az vödröt?",
@ -401,8 +396,7 @@
"titleRequired": "Kérjük, adjon meg egy címet.",
"delete": "Törölje ezt a nézetet",
"deleteText": "Biztosan eltávolítja ezt a nézetet? A továbbiakban nem lesz használható a projektben szereplő feladatok megtekintésére. Ez a művelet nem töröl semmilyen feladatot. Ezt nem lehet visszacsinálni!",
"deleteSuccess": "A nézet sikeresen törölve",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "A nézet sikeresen törölve"
}
},
"filters": {
@ -428,7 +422,7 @@
"create": {
"title": "Új mentett szűrő",
"description": "A mentett szűrő egy virtuális projekt, amely szűrőkészletből kerül kiszámításra minden alkalommal, amikor hozzáfér.",
"action": "Create saved filter",
"action": "Új mentett szűrő létrehozása",
"titleRequired": "Adja meg a szűrő címét."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Címke kereséséhez írja be…",
"create": {
"header": "Új címke",
"title": "Create a label",
"title": "Új címke létrehozása",
"titleRequired": "Kérjük, adjon meg egy címet.",
"success": "A címke sikeresen létrehozva."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Hitelesítés…",
"passwordRequired": "Ehhez a megosztott projekthez jelszó szükséges. Kérjük, írja be alább:",
"error": "An error occurred.",
"error": "Hiba lépett fel.",
"invalidPassword": "A jelszó érvénytelen."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Írjon be egy szöveget, vagy nyomja meg a „/” gombot a további lehetőségek megtekintéséhez…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Új létrehozása",
"selectPlaceholder": "Kattintson, vagy nyomja meg az Enter billentyűt a kiválasztáshoz"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Feladat",
"new": "Create a task",
"new": "Új feladat létrehozása",
"delete": "Feladat törlése",
"createSuccess": "A feladat sikeresen létrehozva.",
"addReminder": "Add a reminder…",
"addReminder": "Új emlékeztető hozzáadása...",
"doneSuccess": "A feladat sikeresen meg lett jelölve elkészültként.",
"undoneSuccess": "A feladat sikeresen meg lett jelölve nem elkészültként.",
"undo": "Visszavonás",
@ -865,7 +859,7 @@
"unassignSuccess": "A felhasználó sikeresen leiratkozott!"
},
"label": {
"placeholder": "Type to add a label…",
"placeholder": "Új címke hozzáadásához írjon be…",
"createPlaceholder": "Adja hozzá ezt új címkeként",
"addSuccess": "A címke sikeresen hozzáadva.",
"createSuccess": "A címke sikeresen létrehozva.",
@ -888,8 +882,8 @@
"relation": {
"add": "Új feladatkapcsolat hozzáadása",
"new": "Új feladatkapcsolat",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"searchPlaceholder": "A kapcsolódóként hozzáadandó új feladathoz írja be a keresést…",
"createPlaceholder": "Adja hozzá ezt új kapcsolódó feladatként",
"differentProject": "Ez a feladat egy másik projekthez tartozik.",
"noneYet": "Még nincsenek feladatkapcsolatok.",
"delete": "Feladatkapcsolat törlése",
@ -927,7 +921,7 @@
"every30d": "30 naponta",
"mode": "Ismétlés típusa",
"monthly": "Havi",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "Aktuális dátumtól",
"each": "Minden egyes",
"specifyAmount": "Adja meg a mennyiséget…",
"hours": "Órák",
@ -967,7 +961,7 @@
"title": "Csapatok",
"noTeams": "Jelenleg nem tagja egyetlen csapatnak sem.",
"create": {
"title": "Create a team",
"title": "Új csapat létrehozása",
"success": "A csapat sikeresen létrehozva."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Duplikálás",
"delete": "Törlés",
"unarchive": "Archiválás visszavonása",
"setBackground": "Background settings",
"setBackground": "Háttérkép beállítása",
"share": "Megosztás",
"newProject": "Új projekt",
"createProject": "Projekt létrehozása",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "en",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Accedi con {provider}",
"authenticating": "Autenticazione…",
"openIdStateError": "Stato non corrispondente, impossibile continuare!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "Si è verificato un errore durante l'autenticazione con terze parti.",
"logout": "Esci",
"emailInvalid": "Inserisci un indirizzo e-mail valido.",
"usernameRequired": "Inserisci un nome utente.",
@ -66,8 +66,7 @@
"hidePassword": "Nascondi la password",
"noAccountYet": "Non hai un account?",
"alreadyHaveAnAccount": "Hai già un account?",
"remember": "Resta connesso",
"registrationDisabled": "Registration is disabled."
"remember": "Resta connesso"
},
"settings": {
"title": "Impostazioni",
@ -96,7 +95,6 @@
"weekStartMonday": "Lunedì",
"language": "Lingua",
"defaultProject": "Progetto Predefinito",
"defaultView": "Default View",
"timezone": "Fuso Orario",
"overdueTasksRemindersTime": "Orario email attività in scadute",
"filterUsedOnOverview": "Saved filter used on the overview page"
@ -229,8 +227,8 @@
"title": "Archivia \"{project}\"",
"archive": "Archivia questo progetto",
"unarchive": "Estrai questo progetto dall'archivio",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"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."
},
"background": {
@ -279,7 +277,7 @@
"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 link share",
"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.",
@ -316,15 +314,12 @@
"delete": "Delete"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "List",
"add": "Add",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Add a new task…",
"empty": "This project is currently empty.",
"newTaskCta": "Create a task.",
"newTaskCta": "Create a new task.",
"editTask": "Edit Task"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Enter the new task title…",
"addTask": "Add a task",
"addAnotherTask": "Add another task",
"addBucket": "Create a bucket",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,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.",
"action": "Create saved filter",
"action": "Crea nuovo filtro salvato",
"titleRequired": "È necessario un titolo per il filtro."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Digita per cercare un'etichetta…",
"create": {
"header": "Nuova etichetta",
"title": "Create a label",
"title": "Crea una nuova etichetta",
"titleRequired": "Specifica un titolo.",
"success": "L'etichetta è stata creata correttamente."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Autenticazione…",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"error": "An error occurred.",
"error": "Si è verificato un errore.",
"invalidPassword": "La password non è valida."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Crea nuovo",
"selectPlaceholder": "Clicca o premere invio per selezionare"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Attività",
"new": "Create a task",
"new": "Crea una nuova attività",
"delete": "Elimina questa attività",
"createSuccess": "Attività creata.",
"addReminder": "Add a reminder…",
"addReminder": "Aggiungi un nuovo promemoria…",
"doneSuccess": "Attività segnata come completata.",
"undoneSuccess": "Attività segnata come non completata.",
"undo": "Undo",
@ -865,7 +859,7 @@
"unassignSuccess": "Utente disassegnato."
},
"label": {
"placeholder": "Type to add a label…",
"placeholder": "Digita per aggiungere una nuova etichetta…",
"createPlaceholder": "Aggiungila come nuova etichetta",
"addSuccess": "Etichetta aggiunta.",
"createSuccess": "Etichetta creata.",
@ -888,8 +882,8 @@
"relation": {
"add": "Aggiungi Attività Collegata",
"new": "Nuova Attività Collegata",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"searchPlaceholder": "Digita per cercare un'attività da aggiungere come collegata…",
"createPlaceholder": "Aggiungi come attività collegata",
"differentProject": "This task belongs to a different project.",
"noneYet": "Nessuna attività collegata.",
"delete": "Elimina Collegamento Attività",
@ -927,7 +921,7 @@
"every30d": "Every 30 Days",
"mode": "Modalità Ripetizione",
"monthly": "Mensilmente",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "Dalla Data Attuale",
"each": "Ogni",
"specifyAmount": "Specifica una quantità…",
"hours": "Ore",
@ -967,7 +961,7 @@
"title": "Gruppi",
"noTeams": "Non fai parte di nessun gruppo.",
"create": {
"title": "Create a team",
"title": "Crea un nuovo gruppo",
"success": "Gruppo creato."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Duplica",
"delete": "Elimina",
"unarchive": "Disarchivia",
"setBackground": "Background settings",
"setBackground": "Imposta sfondo",
"share": "Condividi",
"newProject": "New project",
"createProject": "Create project",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "it",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -57,17 +57,16 @@
"logout": "ログアウト",
"emailInvalid": "有効なメールアドレスを入力してください。",
"usernameRequired": "ユーザー名を入力してください。",
"usernameMustNotContainSpace": "ユーザー名にスペースを含めてはいけません。",
"usernameMustNotContainSpace": "The username must not contain spaces.",
"usernameMustNotLookLikeUrl": "The username must not look like a URL.",
"passwordRequired": "パスワードを入力してください。",
"passwordNotMin": "パスワードは8文字以上でなければなりません。",
"passwordNotMax": "パスワードは250文字以内でなければなりません。",
"passwordNotMin": "Password must have at least 8 characters.",
"passwordNotMax": "Password must have at most 250 characters.",
"showPassword": "パスワードの表示",
"hidePassword": "パスワードの非表示",
"noAccountYet": "まだアカウントをお持ちでないですか?",
"alreadyHaveAnAccount": "すでにアカウントをお持ちですか?",
"remember": "ログインしたままにする",
"registrationDisabled": "Registration is disabled."
"remember": "ログインしたままにする"
},
"settings": {
"title": "設定",
@ -96,7 +95,6 @@
"weekStartMonday": "月曜日",
"language": "言語",
"defaultProject": "デフォルトのプロジェクト",
"defaultView": "Default View",
"timezone": "タイムゾーン",
"overdueTasksRemindersTime": "期限切れタスクのリマインダー送信時間",
"filterUsedOnOverview": "概要ページに使用される絞り込み条件を保存しました"
@ -154,8 +152,8 @@
},
"apiTokens": {
"title": "APIトークン",
"general": "APIトークンは、認証されたVikunja APIのリクエストを行うことができます。",
"apiDocs": "詳しくはAPIドキュメントをご確認ください",
"general": "API tokens allow you to use Vikunja's API without user credentials.",
"apiDocs": "Check out the api docs",
"createAToken": "トークンの生成",
"createToken": "トークンの生成",
"30d": "30日",
@ -229,8 +227,8 @@
"title": "「{project}」のアーカイブ",
"archive": "プロジェクトのアーカイブ",
"unarchive": "プロジェクトのアーカイブの取り消し",
"unarchiveText": "タスクの作成や編集を行えるようになります。",
"archiveText": "アーカイブを取り消すまで、このプロジェクトではタスクの作成や編集を行うことができません。",
"unarchiveText": "新しいタスクの作成や編集を行えるようになります。",
"archiveText": "アーカイブを取り消すまで、このプロジェクトでは新しいタスクの作成や編集を行うことができません。",
"success": "プロジェクトは正常にアーカイブされました。"
},
"background": {
@ -279,7 +277,7 @@
"title": "リンクの共有",
"what": "共有リンクとは何ですか?",
"explanation": "共有リンクとは、Vikunjaのアカウントを持たない他のユーザーとプロジェクトを簡単に共有することができる機能です。",
"create": "共有リンクの作成",
"create": "新しい共有リンクの作成",
"name": "名前 (オプション)",
"namePlaceholder": "例: Lorem Ipsum",
"nameExplanation": "この共有リンクで行われた操作はすべてこの名前で表示されるようになります。",
@ -316,15 +314,12 @@
"delete": "削除"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "リスト",
"add": "追加",
"addPlaceholder": "タスクを追加…",
"addPlaceholder": "新しいタスクを追加…",
"empty": "このプロジェクトにはタスクが存在しません。",
"newTaskCta": "タスクを作成してください。",
"newTaskCta": "新しいタスクを作成してください。",
"editTask": "タスクの編集"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "新しいタスク名を入力…",
"addTask": "タスクの追加",
"addAnotherTask": "他のタスクを追加",
"addBucket": "バケットの作成",
"addBucket": "新しいバケットの作成",
"addBucketPlaceholder": "新しいバケット名を入力…",
"deleteHeaderBucket": "バケットの削除",
"deleteBucketText1": "このバケットを削除して本当によろしいですか?",
@ -374,18 +369,18 @@
},
"webhooks": {
"title": "Webhook",
"targetUrl": "ターゲットURL",
"targetUrlInvalid": "有効なURLを入力してください。",
"events": "イベント",
"eventsHint": "Webhookが受信する (現在のプロジェクト内での) イベントを選択します。",
"mustSelectEvents": "イベントを少なくとも1つ選択する必要があります。",
"targetUrl": "Target URL",
"targetUrlInvalid": "Please provide a valid URL.",
"events": "Events",
"eventsHint": "Select all events this webhook should recieve updates for (within the current project).",
"mustSelectEvents": "You must select at least one event.",
"delete": "Webhookの削除",
"deleteText": "このWebhookを削除して本当によろしいですかこのWebhookのターゲットURLにはイベントは送信されなくなります。",
"deleteText": "Are you sure you want to delete this webhook? External targets will not be notified of its events anymore.",
"deleteSuccess": "Webhookは正常に削除されました。",
"create": "Webhookを作成",
"secret": "シークレット",
"secretHint": "シークレットを指定した場合、WebhookターゲットURLへのリクエストはすべてHMAC署名されます。",
"secretDocs": "シークレットに関する詳細はドキュメントをご確認ください。"
"create": "Create webhook",
"secret": "Secret",
"secretHint": "If provided, all requests to the webhook target URL will be signed using HMAC.",
"secretDocs": "Check out the docs for more details about how to use secrets."
},
"views": {
"header": "Edit views",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,7 @@
"create": {
"title": "新しい絞り込み条件の作成",
"description": "絞り込み条件は、複数の条件を組み合わせて保存できる仮想のプロジェクトです。",
"action": "絞り込み条件を作成",
"action": "新しい絞り込み条件を作成",
"titleRequired": "絞り込み条件名を入力してください。"
},
"delete": {
@ -512,7 +506,7 @@
"search": "ラベルのキーワードを入力…",
"create": {
"header": "新しいラベルの作成",
"title": "ラベルの作成",
"title": "新しいラベルの作成",
"titleRequired": "ラベル名を入力してください。",
"success": "ラベルは正常に作成されました。"
},
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "作成",
"createPlaceholder": "新規作成",
"selectPlaceholder": "クリックするかEnterキーを押して選択"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "タスク",
"new": "タスクの作成",
"new": "新しいタスクの作成",
"delete": "タスクの削除",
"createSuccess": "タスクは正常に作成されました。",
"addReminder": "リマイダーを作成…",
"addReminder": "新しいリマイダーを作成…",
"doneSuccess": "タスクを完了にしました。",
"undoneSuccess": "タスクを未完了に戻しました。",
"undo": "元に戻す",
@ -889,7 +883,7 @@
"add": "新しい関連タスクの追加",
"new": "新しい関連タスクの作成",
"searchPlaceholder": "追加する関連タスクのキーワードを入力…",
"createPlaceholder": "関連タスクを追加",
"createPlaceholder": "新しい関連タスクを追加",
"differentProject": "This task belongs to a different project.",
"noneYet": "関連タスクはまだありません。",
"delete": "関連タスクの削除",
@ -927,7 +921,7 @@
"every30d": "30日ごと",
"mode": "繰り返しモード",
"monthly": "毎月",
"fromCurrentDate": "完了からの間隔",
"fromCurrentDate": "現在時刻からの間隔",
"each": "隔",
"specifyAmount": "数字を入力…",
"hours": "時間ごと",
@ -967,7 +961,7 @@
"title": "チーム",
"noTeams": "現在どのチームにも所属していません。",
"create": {
"title": "チームの作成",
"title": "新しいチームの作成",
"success": "チームは正常に作成されました。"
},
"edit": {
@ -1056,8 +1050,8 @@
}
},
"update": {
"available": "アップデートがあります!",
"do": "アップデート"
"available": "There is an update available!",
"do": "Update Now"
},
"menu": {
"edit": "編集",
@ -1069,8 +1063,8 @@
"share": "共有",
"newProject": "新しいプロジェクトの作成",
"createProject": "プロジェクトの作成",
"cantArchiveIsDefault": "デフォルトのプロジェクトのためアーカイブできません。",
"cantDeleteIsDefault": "デフォルトのプロジェクトのため削除できません。",
"cantArchiveIsDefault": "You cannot archive this because it is your default project.",
"cantDeleteIsDefault": "You cannot delete this because it is your default project.",
"views": "Views"
},
"apiConfig": {
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "ja",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "Y/n/j H:i",
"altFormatShort": "Y/n/j"
},
"reaction": {
@ -1151,7 +1145,7 @@
"3005": "The project title cannot be empty.",
"3006": "その共有プロジェクトは存在しません。",
"3007": "A project with this identifier already exists.",
"3008": "このプロジェクトはアーカイブ済みのため読み取り専用です。またプロジェクトに関連するタスクも同様です。",
"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.",
@ -1197,7 +1191,7 @@
},
"about": {
"title": "Vikunjaについて",
"version": "バージョン: {version}"
"version": "Version: {version}"
},
"time": {
"units": {

View File

@ -53,7 +53,7 @@
"loginWith": "{provider}로 로그인",
"authenticating": "인증 처리 중...",
"openIdStateError": "State does not match, refusing to continue!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "외부 인증오류가 발생하였습니다.",
"logout": "로그아웃",
"emailInvalid": "유효한 이메일 주소를 입력하여 주십시오.",
"usernameRequired": "사용자 이름을 입력하세요.",
@ -66,8 +66,7 @@
"hidePassword": "비밀번호 숨김",
"noAccountYet": "아직 계정이 없으신가요?",
"alreadyHaveAnAccount": "이미 계정이 있으신가요?",
"remember": "로그인 상태 유지",
"registrationDisabled": "Registration is disabled."
"remember": "로그인 상태 유지"
},
"settings": {
"title": "환경설정",
@ -96,7 +95,6 @@
"weekStartMonday": "월요일",
"language": "언어",
"defaultProject": "기본 프로젝트",
"defaultView": "Default View",
"timezone": "표준시간대",
"overdueTasksRemindersTime": "Overdue tasks reminder email time",
"filterUsedOnOverview": "Saved filter used on the overview page"
@ -229,8 +227,8 @@
"title": "\"{project}\"보관",
"archive": "프로젝트 보관하기",
"unarchive": "Un-Archive this project",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"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": {
@ -279,7 +277,7 @@
"title": "링크 공유",
"what": "공유 링크가 무엇인가요?",
"explanation": "Share Links allow you to easily share a project with other users who don't have an account on Vikunja.",
"create": "Create a link share",
"create": "새 공유 링크 만들기",
"name": "이름 (선택 사항)",
"namePlaceholder": "e.g. Lorem Ipsum",
"nameExplanation": "All actions done by this link share will show up with the name.",
@ -316,15 +314,12 @@
"delete": "Delete"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "List",
"add": "Add",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Add a new task…",
"empty": "This project is currently empty.",
"newTaskCta": "Create a task.",
"newTaskCta": "새 할일 등록",
"editTask": "할 일 편집"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Enter the new task title…",
"addTask": "작업 추가",
"addAnotherTask": "Add another task",
"addBucket": "Create a bucket",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,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.",
"action": "Create saved filter",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Type to search for a label…",
"create": {
"header": "New label",
"title": "Create a label",
"title": "Create a new label",
"titleRequired": "Please specify a title.",
"success": "The label was successfully created."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Authenticating…",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"error": "An error occurred.",
"error": "An error occured.",
"invalidPassword": "The password is invalid."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "새로 생성하기",
"selectPlaceholder": "Click or press enter to select"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Task",
"new": "Create a task",
"new": "Create a new task",
"delete": "Delete this task",
"createSuccess": "The task was successfully created.",
"addReminder": "Add a reminder…",
"addReminder": "Add a new reminder…",
"doneSuccess": "The task was successfully marked as done.",
"undoneSuccess": "The task was successfully un-marked as done.",
"undo": "Undo",
@ -865,7 +859,7 @@
"unassignSuccess": "The user has been unassigned successfully."
},
"label": {
"placeholder": "Type to add a 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.",
@ -888,8 +882,8 @@
"relation": {
"add": "Add a New Task Relation",
"new": "New Task Relation",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"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.",
"noneYet": "No task relations yet.",
"delete": "관계 삭제",
@ -927,7 +921,7 @@
"every30d": "Every 30 Days",
"mode": "Repeat mode",
"monthly": "Monthly",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "From Current Date",
"each": "Each",
"specifyAmount": "Specify an amount…",
"hours": "Hours",
@ -967,7 +961,7 @@
"title": "Teams",
"noTeams": "You are currently not part of any teams.",
"create": {
"title": "Create a team",
"title": "Create a new team",
"success": "The team was successfully created."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Duplicate",
"delete": "Delete",
"unarchive": "Un-Archive",
"setBackground": "Background settings",
"setBackground": "Set background",
"share": "Share",
"newProject": "New project",
"createProject": "Create project",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "en",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Inloggen met {provider}",
"authenticating": "Authenticeren…",
"openIdStateError": "State does not match, refusing to continue!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "An error occured while authenticating against the third party.",
"logout": "Uitloggen",
"emailInvalid": "Please enter a valid email address.",
"usernameRequired": "Please provide a username.",
@ -66,8 +66,7 @@
"hidePassword": "Hide the password",
"noAccountYet": "Don't have an account yet?",
"alreadyHaveAnAccount": "Already have an account?",
"remember": "Stay logged in",
"registrationDisabled": "Registration is disabled."
"remember": "Stay logged in"
},
"settings": {
"title": "Instellingen",
@ -96,7 +95,6 @@
"weekStartMonday": "Maandag",
"language": "Taal",
"defaultProject": "Default Project",
"defaultView": "Default View",
"timezone": "Time Zone",
"overdueTasksRemindersTime": "Overdue tasks reminder email time",
"filterUsedOnOverview": "Saved filter used on the overview page"
@ -229,8 +227,8 @@
"title": "Archive \"{project}\"",
"archive": "Archive this project",
"unarchive": "Un-Archive this project",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"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": {
@ -279,7 +277,7 @@
"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 link share",
"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.",
@ -316,15 +314,12 @@
"delete": "Delete"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "List",
"add": "Add",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Add a new task…",
"empty": "This project is currently empty.",
"newTaskCta": "Create a task.",
"newTaskCta": "Create a new task.",
"editTask": "Edit Task"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Enter the new task title…",
"addTask": "Add a task",
"addAnotherTask": "Add another task",
"addBucket": "Create a bucket",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,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.",
"action": "Create saved filter",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Type to search for a label…",
"create": {
"header": "Nieuw label",
"title": "Create a label",
"title": "Nieuwe label maken",
"titleRequired": "Please specify a title.",
"success": "The label was successfully created."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Authenticeren…",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"error": "An error occurred.",
"error": "Er is een fout opgetreden.",
"invalidPassword": "Het wachtwoord is ongeldig."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Nieuwe aanmaken",
"selectPlaceholder": "Klik of druk op enter om te selecteren"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Taak",
"new": "Create a task",
"new": "Creëer een nieuwe taak",
"delete": "Deze taak verwijderen",
"createSuccess": "De taak is succesvol aangemaakt.",
"addReminder": "Add a reminder…",
"addReminder": "Nieuwe herinnering toevoegen…",
"doneSuccess": "The task was successfully marked as done.",
"undoneSuccess": "The task was successfully un-marked as done.",
"undo": "Undo",
@ -865,7 +859,7 @@
"unassignSuccess": "De toewijzing van de gebruiker is met succes ingetrokken."
},
"label": {
"placeholder": "Type to add a label…",
"placeholder": "Typ om een nieuw label toe te voegen…",
"createPlaceholder": "Dit toevoegen als nieuw label",
"addSuccess": "The label has been added successfully.",
"createSuccess": "The label has been created successfully.",
@ -888,8 +882,8 @@
"relation": {
"add": "Add a New Task Relation",
"new": "Nieuwe taakrelatie",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"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.",
"noneYet": "Nog geen taakrelaties.",
"delete": "Taak relatie verwijderen",
@ -927,7 +921,7 @@
"every30d": "Every 30 Days",
"mode": "Herhaalmodus",
"monthly": "Maandelijks",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "Vanaf huidige datum",
"each": "Each",
"specifyAmount": "Specify an amount…",
"hours": "Uren",
@ -967,7 +961,7 @@
"title": "Teams",
"noTeams": "Je maakt momenteel geen deel uit van een team.",
"create": {
"title": "Create a team",
"title": "Maak een nieuw team",
"success": "Het team is succesvol aangemaakt."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Dupliceer",
"delete": "Verwijderen",
"unarchive": "Archivering opheffen",
"setBackground": "Background settings",
"setBackground": "Achtergrond instellen",
"share": "Delen",
"newProject": "New project",
"createProject": "Create project",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "nl",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Logg inn med {provider}",
"authenticating": "Autentiserer…",
"openIdStateError": "Staten samsvarer ikke, klikk ikke for å fortsette!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "En feil oppstod under autentisering mot tredjepart.",
"logout": "Logg ut",
"emailInvalid": "Vennligst oppgi en gyldig e-postadresse.",
"usernameRequired": "Angi et brukernavn.",
@ -66,8 +66,7 @@
"hidePassword": "Skjul passord",
"noAccountYet": "Har du ikke konto ennå?",
"alreadyHaveAnAccount": "Har du allerede en konto?",
"remember": "Hold meg innlogget",
"registrationDisabled": "Registration is disabled."
"remember": "Hold meg innlogget"
},
"settings": {
"title": "Innstillinger",
@ -96,7 +95,6 @@
"weekStartMonday": "Mandag",
"language": "Språk",
"defaultProject": "Standard prosjekt",
"defaultView": "Default View",
"timezone": "Tidssone",
"overdueTasksRemindersTime": "Utløpte påminnelses-tid for oppgaver",
"filterUsedOnOverview": "Saved filter used on the overview page"
@ -229,8 +227,8 @@
"title": "Arkiver{project}\"",
"archive": "Arkiver dette prosjektet",
"unarchive": "Av-arkivere dette prosjektet",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"unarchiveText": "Du vil kunne opprette nye oppgaver eller redigere den.",
"archiveText": "Du vil ikke være i stand til å redigere denne listen eller opprette nye oppgaver før du fjerner arkiveringen.",
"success": "Prosjektet ble vellykket arkivert."
},
"background": {
@ -279,7 +277,7 @@
"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": "Create a link share",
"create": "Opprett en ny lenkedeling",
"name": "Navn (valgfritt)",
"namePlaceholder": "e.g. Lorem Ipsum",
"nameExplanation": "Alle handlinger utført av denne koblingsdelingen vises med navnet.",
@ -316,15 +314,12 @@
"delete": "Slett"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "Liste",
"add": "Legg til",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Legg til ny oppgave…",
"empty": "Dette prosjektet er for øyeblikket tomt.",
"newTaskCta": "Create a task.",
"newTaskCta": "Lage en ny oppgave.",
"editTask": "Endre oppgave"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Angi den nye oppgavens tittel…",
"addTask": "Legg til oppgave",
"addAnotherTask": "Legg til en annen oppgave",
"addBucket": "Create a bucket",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,7 @@
"create": {
"title": "Nytt lagret filter",
"description": "A saved filter is a virtual project which is computed from a set of filters each time it is accessed.",
"action": "Create saved filter",
"action": "Opprett nytt filter",
"titleRequired": "Skriv inn en tittel for filteret."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Skriv for å søke etter en etikett…",
"create": {
"header": "Ny etikett",
"title": "Create a label",
"title": "Opprett ny etikett",
"titleRequired": "Angi den nye tittelen.",
"success": "Etiketten ble opprettet."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Autentiserer…",
"passwordRequired": "Denne delte listen krever et passord. Vennligst skriv det nedenfor:",
"error": "An error occurred.",
"error": "En feil oppsto.",
"invalidPassword": "Det oppgitte passordet er ugyldig."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Opprett ny",
"selectPlaceholder": "Klikk eller trykk enter for å velge denne listen"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Oppgave",
"new": "Create a task",
"new": "Lage en ny oppgave",
"delete": "Slette denne oppgaven",
"createSuccess": "Oppgaven ble opprettet.",
"addReminder": "Add a reminder…",
"addReminder": "Legg til en ny påminnelse…",
"doneSuccess": "Oppgaven ble markert som ferdig.",
"undoneSuccess": "Oppgaven ble fjernet som ferdig.",
"undo": "Angre",
@ -865,7 +859,7 @@
"unassignSuccess": "Brukeren ble vellykket fjernet."
},
"label": {
"placeholder": "Type to add a label…",
"placeholder": "Skriv for å legge til en ny etikett…",
"createPlaceholder": "Legg til som ny etikett",
"addSuccess": "Etiketten er lagt til.",
"createSuccess": "Denne etiketten har blitt opprettet.",
@ -888,8 +882,8 @@
"relation": {
"add": "Legg til en ny oppgaveforbindelse",
"new": "Ny oppgaveforbindelse",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"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.",
"noneYet": "Ingen arbeidsrelasjoner ennå.",
"delete": "Slett relasjon",
@ -927,7 +921,7 @@
"every30d": "Every 30 Days",
"mode": "Repeter modus",
"monthly": "Månedlig",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "Fra gjeldende dato",
"each": "Hver",
"specifyAmount": "Angi beløp…",
"hours": "Timer",
@ -967,7 +961,7 @@
"title": "Grupper",
"noTeams": "Du er for øyeblikket ikke en del av noen gurpper.",
"create": {
"title": "Create a team",
"title": "Opprett en ny gruppe",
"success": "Gruppen ble opprettet."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Dupliser",
"delete": "Slett",
"unarchive": "Av-arkiver",
"setBackground": "Background settings",
"setBackground": "Bruk som bakgrunn",
"share": "Del",
"newProject": "Nytt prosjekt",
"createProject": "Create project",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "no",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "d.m.Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Zaloguj się przez {provider}",
"authenticating": "Uwierzytelnianie…",
"openIdStateError": "Stan się nie zgadza, odmowa kontynuacji!",
"openIdGeneralError": "Wystąpił błąd podczas uwierzytelniania wobec aplikacji zewnętrznej.",
"openIdGeneralError": "Wystąpił błąd podczas uwierzytelniania wobec strony trzeciej.",
"logout": "Wyloguj",
"emailInvalid": "Proszę podać poprawny adres e-mail.",
"usernameRequired": "Proszę podać nazwę użytkownika.",
@ -66,8 +66,7 @@
"hidePassword": "Ukryj hasło",
"noAccountYet": "Nie masz jeszcze konta?",
"alreadyHaveAnAccount": "Masz już konto?",
"remember": "Pozostań zalogowany",
"registrationDisabled": "Rejestracja jest wyłączona."
"remember": "Pozostań zalogowany"
},
"settings": {
"title": "Ustawienia",
@ -96,7 +95,6 @@
"weekStartMonday": "poniedziałku",
"language": "Język",
"defaultProject": "Domyślny projekt",
"defaultView": "Widok domyślny",
"timezone": "Strefa czasowa",
"overdueTasksRemindersTime": "Czas przypomnienia o zaległych zadaniach na e-mail",
"filterUsedOnOverview": "Zapisany filtr używany na stronie przeglądania"
@ -316,15 +314,12 @@
"delete": "Usuń"
}
},
"first": {
"title": "Pierwszy widok"
},
"list": {
"title": "Lista",
"add": "Dodaj",
"addPlaceholder": "Dodaj zadanie…",
"addPlaceholder": "Dodaj nowe zadanie…",
"empty": "Ten projekt jest obecnie pusty.",
"newTaskCta": "Utwórz zadanie.",
"newTaskCta": "Utwórz nowe zadanie.",
"editTask": "Edytuj zadanie"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Wprowadź tytuł nowego zadania…",
"addTask": "Dodaj zadanie",
"addAnotherTask": "Dodaj kolejne zadanie",
"addBucket": "Utwórz nowy zasobnik",
"addBucket": "Utwórz nową kolumnę",
"addBucketPlaceholder": "Wprowadź tytuł nowej kolumny…",
"deleteHeaderBucket": "Usuń kolumnę",
"deleteBucketText1": "Czy na pewno chcesz usunąć tę kolumnę?",
@ -401,8 +396,7 @@
"titleRequired": "Proszę podać tytuł.",
"delete": "Usuń ten widok",
"deleteText": "Czy na pewno chcesz usunąć ten widok? Nie będzie już możliwe wyświetlanie zadań w tym projekcie. Ta akcja nie usunie żadnych zadań. Tej operacji nie można cofnąć!",
"deleteSuccess": "Widok został pomyślnie usunięty",
"onlyAdminsCanEdit": "Tylko administratorzy projektu mogą edytować widoki."
"deleteSuccess": "Widok został pomyślnie usunięty"
}
},
"filters": {
@ -428,7 +422,7 @@
"create": {
"title": "Nowy filtr stały",
"description": "Zapisany filtr to wirtualny projekt, który jest obliczany na podstawie zestawu filtrów za każdym razem, gdy jest dostępny.",
"action": "Create saved filter",
"action": "Utwórz nowy filtr stały",
"titleRequired": "Podaj tytuł dla filtra."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Wpisz, aby wyszukać etykietę…",
"create": {
"header": "Nowa etykieta",
"title": "Utwórz etykietę",
"title": "Utwórz nową etykietę",
"titleRequired": "Proszę, podaj tytuł.",
"success": "Etykieta została pomyślnie utworzona."
},
@ -647,7 +641,7 @@
"placeholder": "Wpisz tekst lub naciśnij '/', aby zobaczyć więcej opcji…"
},
"multiselect": {
"createPlaceholder": "Utwórz",
"createPlaceholder": "Utwórz nowy",
"selectPlaceholder": "Kliknij lub naciśnij Enter, aby wybrać"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Zadanie",
"new": "Utwórz zadanie",
"new": "Utwórz nowe zadanie",
"delete": "Usuń to zadanie",
"createSuccess": "Zadanie zostało pomyślnie utworzone.",
"addReminder": "Dodaj przypomnienie…",
"addReminder": "Dodaj nowe przypomnienie…",
"doneSuccess": "Zadanie zostało pomyślnie oznaczone jako ukończone.",
"undoneSuccess": "Zadanie zostało pomyślnie otwarte ponownie.",
"undo": "Cofnij",
@ -865,7 +859,7 @@
"unassignSuccess": "Użytkownik został pomyślnie usunięty."
},
"label": {
"placeholder": "Wpisz, aby dodać etykietę…",
"placeholder": "Wpisz, aby dodać nową etykietę…",
"createPlaceholder": "Dodaj jako nową etykietę",
"addSuccess": "Etykieta została pomyślnie dodana.",
"createSuccess": "Etykieta została pomyślnie utworzona.",
@ -927,7 +921,7 @@
"every30d": "Co 30 dni",
"mode": "Tryb powtarzania",
"monthly": "Miesięczny",
"fromCurrentDate": "Od daty zakończenia",
"fromCurrentDate": "Od bieżącej daty",
"each": "Co",
"specifyAmount": "Określ ilość…",
"hours": "Godziny",
@ -967,7 +961,7 @@
"title": "Zespoły",
"noTeams": "Obecnie nie należysz do żadnego zespołu.",
"create": {
"title": "Utwórz zespół",
"title": "Utwórz nowy zespół",
"success": "Zespół został pomyślnie utworzony."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Duplikuj",
"delete": "Usuń",
"unarchive": "Cofnij archiwizację",
"setBackground": "Ustawienie tła",
"setBackground": "Ustaw tło",
"share": "Udostępnij",
"newProject": "Nowy projekt",
"createProject": "Utwórz projekt",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "pl",
"altFormatLong": "d.m.Y H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Faça o login com {provider}",
"authenticating": "Autenticando…",
"openIdStateError": "O Estado não se iguala, recusando-se a continuar!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "Ocorreu um erro ao autenticar contra uma entidade externa.",
"logout": "Sair",
"emailInvalid": "Por favor, insira um endereço de e-mail válido.",
"usernameRequired": "Por favor, insira um nome de usuário.",
@ -66,8 +66,7 @@
"hidePassword": "Ocultar senha",
"noAccountYet": "Não possui uma conta ainda?",
"alreadyHaveAnAccount": "Já possui uma conta?",
"remember": "Permanecer conectado",
"registrationDisabled": "Registration is disabled."
"remember": "Permanecer conectado"
},
"settings": {
"title": "Configurações",
@ -96,7 +95,6 @@
"weekStartMonday": "Segunda-feira",
"language": "Idioma",
"defaultProject": "Projeto Padrão",
"defaultView": "Default View",
"timezone": "Fuso horário",
"overdueTasksRemindersTime": "Horário do e-mail de lembrete de tarefas pendentes",
"filterUsedOnOverview": "Salvo filtro utilizado na visão geral"
@ -229,8 +227,8 @@
"title": "Arquivar \"{project}\"",
"archive": "Arquivar este projeto",
"unarchive": "Desarquivar este projeto",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"unarchiveText": "Você será capaz de criar novas tarefas ou editá-las.",
"archiveText": "Você não poderá editar este projeto ou criar novas tarefas até desarquivá-lo.",
"success": "O projeto foi arquivado com sucesso."
},
"background": {
@ -279,7 +277,7 @@
"title": "Compartilhar Link",
"what": "O que é um link de compartilhamento?",
"explanation": "Compartilhar Links permite que você compartilhe facilmente uma lista com outros usuários que não têm uma conta na Vikunja.",
"create": "Create a link share",
"create": "Criar novo link de compartilhamento",
"name": "Nome (opcional)",
"namePlaceholder": "ex. Lorem Ipsum",
"nameExplanation": "Todas as ações feitas por este compartilhamento de link aparecerão com o nome.",
@ -316,15 +314,12 @@
"delete": "Excluir"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "Lista",
"add": "Adicionar",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Adicionar uma nova tarefa…",
"empty": "Este projeto está vazio no momento.",
"newTaskCta": "Create a task.",
"newTaskCta": "Criar uma nova tarefa.",
"editTask": "Editar Tarefa"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Digite o título da tarefa…",
"addTask": "Adicionar uma tarefa",
"addAnotherTask": "Adicionar outra tarefa",
"addBucket": "Create a bucket",
"addBucket": "Criar um novo bucket",
"addBucketPlaceholder": "Digite o título do novo bucket…",
"deleteHeaderBucket": "Excluir o bucket",
"deleteBucketText1": "Tem certeza que deseja excluir este bucket?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,7 @@
"create": {
"title": "Novo filtro salvo",
"description": "Um filtro salvo é um projeto virtual que é calculado a partir de um conjunto de filtros cada vez que ele é acessado.",
"action": "Create saved filter",
"action": "Criar novo filtro salvo",
"titleRequired": "Por favor, forneça um título para o filtro."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Digite para procurar por uma etiqueta…",
"create": {
"header": "Nova etiqueta",
"title": "Create a label",
"title": "Criar uma nova etiqueta",
"titleRequired": "Por favor, especifique um título.",
"success": "A etiqueta foi criada com sucesso."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Autenticando…",
"passwordRequired": "Este projeto compartilhado requer uma senha. Por favor, digite-a abaixo:",
"error": "An error occurred.",
"error": "Ocorreu um erro.",
"invalidPassword": "A senha é inválida."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Digite algum texto ou toque em '/' para ver mais opções…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Criar novo",
"selectPlaceholder": "Clique ou pressione Enter para selecionar"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Tarefa",
"new": "Create a task",
"new": "Criar uma nova tarefa",
"delete": "Excluir esta tarefa",
"createSuccess": "A tarefa foi criada com sucesso.",
"addReminder": "Add a reminder…",
"addReminder": "Adicionar um novo lembrete…",
"doneSuccess": "A tarefa foi marcada como feita com sucesso.",
"undoneSuccess": "A tarefa foi desmarcada como feita com sucesso.",
"undo": "Desfazer",
@ -865,7 +859,7 @@
"unassignSuccess": "O usuário foi desatribuído com sucesso."
},
"label": {
"placeholder": "Type to add a label…",
"placeholder": "Digite para adicionar uma nova etiqueta…",
"createPlaceholder": "Adicionar como nova etiqueta",
"addSuccess": "A etiqueta foi adicionada com sucesso.",
"createSuccess": "A etiqueta foi criada com sucesso.",
@ -888,8 +882,8 @@
"relation": {
"add": "Adicionar uma nova relação de tarefas",
"new": "Nova Relação de Tarefas",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"searchPlaceholder": "Digite a busca por uma nova tarefa para adicionar como relacionada…",
"createPlaceholder": "Adicionar como uma nova tarefa relacionada",
"differentProject": "Esta tarefa pertence a um projeto diferente.",
"noneYet": "Ainda não há relações de tarefas.",
"delete": "Excluir Relação Entre Tarefas",
@ -927,7 +921,7 @@
"every30d": "A cada 30 dias",
"mode": "Modo repetição",
"monthly": "Mensalmente",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "Data atual",
"each": "Cada",
"specifyAmount": "Especifique uma quantidade…",
"hours": "Horas",
@ -967,7 +961,7 @@
"title": "Equipes",
"noTeams": "Atualmente você não faz parte de nenhuma equipe.",
"create": {
"title": "Create a team",
"title": "Criar uma equipe",
"success": "A equipe foi criada com sucesso."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Duplicar",
"delete": "Excluir",
"unarchive": "Desarquivar",
"setBackground": "Background settings",
"setBackground": "Definir plano de fundo",
"share": "Compartilhar",
"newProject": "Novo projeto",
"createProject": "Criar projeto",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "pt-br",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Iniciar sessão com {provider}",
"authenticating": "A autenticar…",
"openIdStateError": "O estado não coincide, a recusar continuar!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "Ocorreu um erro na autenticação perante a entidade externa.",
"logout": "Terminar Sessão",
"emailInvalid": "Por favor, insire um endereço de e-mail válido.",
"usernameRequired": "Por favor, fornece um nome de utilizador.",
@ -66,8 +66,7 @@
"hidePassword": "Esconder a palavra-passe",
"noAccountYet": "Ainda não tens uma conta?",
"alreadyHaveAnAccount": "Já tens uma conta?",
"remember": "Permanecer autenticado",
"registrationDisabled": "Registration is disabled."
"remember": "Permanecer autenticado"
},
"settings": {
"title": "Definições",
@ -96,7 +95,6 @@
"weekStartMonday": "Segunda-Feira",
"language": "Idioma",
"defaultProject": "Projeto Padrão",
"defaultView": "Default View",
"timezone": "Fuso Horário",
"overdueTasksRemindersTime": "Horário do e-mail de lembrete de tarefas pendentes",
"filterUsedOnOverview": "Salvo filtro utilizado na vista geral"
@ -229,8 +227,8 @@
"title": "Arquivar \"{project}\"",
"archive": "Arquivar este projeto",
"unarchive": "Desarquivar este projeto",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"unarchiveText": "Vais ser capaz de criar novas tarefas ou editá-las.",
"archiveText": "Não poderás editar este projeto ou criar novas tarefas até o desarquivares.",
"success": "Este projeto foi arquivado com sucesso."
},
"background": {
@ -279,7 +277,7 @@
"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": "Create a link share",
"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.",
@ -316,15 +314,12 @@
"delete": "Eliminar"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "Lista",
"add": "Adicionar",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Adicionar uma nova tarefa…",
"empty": "Este projeto está atualmente vazio.",
"newTaskCta": "Create a task.",
"newTaskCta": "Cria uma nova tarefa.",
"editTask": "Editar Tarefa"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Introduz o título da nova tarefa…",
"addTask": "Adicionar uma tarefa",
"addAnotherTask": "Adicionar outra tarefa",
"addBucket": "Create a bucket",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,7 @@
"create": {
"title": "Novo Filtro Memorizado",
"description": "Um filtro memorizado é um projeto virtual que é compilado a partir de um conjunto de filtros de cada vez que é acedido.",
"action": "Create saved filter",
"action": "Criar novo filtro memorizado",
"titleRequired": "Por favor, insere um título para o filtro."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Escreve para pesquisar uma etiqueta…",
"create": {
"header": "Nova etiqueta",
"title": "Create a label",
"title": "Cria uma nova etiqueta",
"titleRequired": "Por favor, especifica um título.",
"success": "A etiqueta foi criada com sucesso."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "A autenticar…",
"passwordRequired": "Este projeto partilhado requer uma palavra-passe. Por favor, introduz-a abaixo:",
"error": "An error occurred.",
"error": "Ocorreu um erro.",
"invalidPassword": "A palavra-passe é inválida."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Insere algum texto ou pressiona '/' para ver mais opções…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Criar novo",
"selectPlaceholder": "Clica ou pressiona Enter para selecionar"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Tarefa",
"new": "Create a task",
"new": "Criar uma nova tarefa",
"delete": "Eliminar esta tarefa",
"createSuccess": "A tarefa for criada com sucesso.",
"addReminder": "Add a reminder…",
"addReminder": "Adicionar um novo lembrete…",
"doneSuccess": "A tarefa foi marcada como concluída.",
"undoneSuccess": "A tarefa foi desmarcada como concluída.",
"undo": "Desfazer",
@ -865,7 +859,7 @@
"unassignSuccess": "O utilizador foi desatribuido com sucesso."
},
"label": {
"placeholder": "Type to add a label…",
"placeholder": "Escreve para adicionar uma nova etiqueta…",
"createPlaceholder": "Adicionar isto como nova etiqueta",
"addSuccess": "A etiqueta foi adicionada com sucesso.",
"createSuccess": "A etiqueta foi criada com sucesso.",
@ -888,8 +882,8 @@
"relation": {
"add": "Adicionar Nova Relação Entre Tarefas",
"new": "Nova Relação Entre Tarefas",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"searchPlaceholder": "Escreve para pesquisar uma tarefa a adicionar como relacionada…",
"createPlaceholder": "Adicionar como nova tarefa relacionada",
"differentProject": "Esta tarefa pertence a um projeto diferente.",
"noneYet": "Ainda sem tarefas relacionadas.",
"delete": "Eliminar Relação Entre Tarefas",
@ -927,7 +921,7 @@
"every30d": "A cada 30 Dias",
"mode": "Modo de repetição",
"monthly": "Mensal",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "Da Data Atual",
"each": "Cada",
"specifyAmount": "Especifica uma quantidade…",
"hours": "Horas",
@ -967,7 +961,7 @@
"title": "Equipas",
"noTeams": "Atualmente não fazes parte de nenhuma equipa.",
"create": {
"title": "Create a team",
"title": "Cria uma nova equipa",
"success": "A equipa foi criada com sucesso."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Duplicar",
"delete": "Eliminar",
"unarchive": "Desarquivar",
"setBackground": "Background settings",
"setBackground": "Definir Fundo",
"share": "Partilhar",
"newProject": "Novo projeto",
"createProject": "Criar projeto",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "pt-PT",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Log in with {provider}",
"authenticating": "Authenticating…",
"openIdStateError": "State does not match, refusing to continue!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "An error occured while authenticating against the third party.",
"logout": "Logout",
"emailInvalid": "Please enter a valid email address.",
"usernameRequired": "Please provide a username.",
@ -66,8 +66,7 @@
"hidePassword": "Hide the password",
"noAccountYet": "Don't have an account yet?",
"alreadyHaveAnAccount": "Already have an account?",
"remember": "Stay logged in",
"registrationDisabled": "Registration is disabled."
"remember": "Stay logged in"
},
"settings": {
"title": "Settings",
@ -96,7 +95,6 @@
"weekStartMonday": "Monday",
"language": "Language",
"defaultProject": "Default Project",
"defaultView": "Default View",
"timezone": "Time Zone",
"overdueTasksRemindersTime": "Overdue tasks reminder email time",
"filterUsedOnOverview": "Saved filter used on the overview page"
@ -229,8 +227,8 @@
"title": "Archive \"{project}\"",
"archive": "Archive this project",
"unarchive": "Un-Archive this project",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"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": {
@ -279,7 +277,7 @@
"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 link share",
"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.",
@ -316,15 +314,12 @@
"delete": "Delete"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "List",
"add": "Add",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Add a new task…",
"empty": "This project is currently empty.",
"newTaskCta": "Create a task.",
"newTaskCta": "Create a new task.",
"editTask": "Edit Task"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Enter the new task title…",
"addTask": "Add a task",
"addAnotherTask": "Add another task",
"addBucket": "Create a bucket",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,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.",
"action": "Create saved filter",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Type to search for a label…",
"create": {
"header": "New label",
"title": "Create a label",
"title": "Create a new label",
"titleRequired": "Please specify a title.",
"success": "The label was successfully created."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Authenticating…",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"error": "An error occurred.",
"error": "An error occured.",
"invalidPassword": "The password is invalid."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Create new",
"selectPlaceholder": "Click or press enter to select"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Task",
"new": "Create a task",
"new": "Create a new task",
"delete": "Delete this task",
"createSuccess": "The task was successfully created.",
"addReminder": "Add a reminder…",
"addReminder": "Add a new reminder…",
"doneSuccess": "The task was successfully marked as done.",
"undoneSuccess": "The task was successfully un-marked as done.",
"undo": "Undo",
@ -865,7 +859,7 @@
"unassignSuccess": "The user has been unassigned successfully."
},
"label": {
"placeholder": "Type to add a 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.",
@ -888,8 +882,8 @@
"relation": {
"add": "Add a New Task Relation",
"new": "New Task Relation",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"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.",
"noneYet": "No task relations yet.",
"delete": "Delete Task Relation",
@ -927,7 +921,7 @@
"every30d": "Every 30 Days",
"mode": "Repeat mode",
"monthly": "Monthly",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "From Current Date",
"each": "Each",
"specifyAmount": "Specify an amount…",
"hours": "Hours",
@ -967,7 +961,7 @@
"title": "Teams",
"noTeams": "You are currently not part of any teams.",
"create": {
"title": "Create a team",
"title": "Create a new team",
"success": "The team was successfully created."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Duplicate",
"delete": "Delete",
"unarchive": "Un-Archive",
"setBackground": "Background settings",
"setBackground": "Set background",
"share": "Share",
"newProject": "New project",
"createProject": "Create project",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "en",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -5,8 +5,8 @@
"welcomeDay": "Привет, {username}!",
"welcomeEvening": "Добрый вечер, {username}!",
"lastViewed": "Последние просмотренные",
"addToHomeScreen": "Добавьте это приложение на домашний экран для быстрого доступа и удобной работы.",
"goToOverview": "Перейти к обзору",
"addToHomeScreen": "Add this app to your home screen for faster access and improved experience.",
"goToOverview": "Go to overview",
"project": {
"importText": "Импортировать проекты и задачи из других сервисов в Vikunja:",
"import": "Импорт данных в Vikunja"
@ -53,21 +53,20 @@
"loginWith": "Войти через {provider}",
"authenticating": "Аутентификация…",
"openIdStateError": "State does not match, refusing to continue!",
"openIdGeneralError": "Произошла ошибка при аутентификации через сторонний сервис.",
"openIdGeneralError": "Произошла ошибка при аутентификации с помощью третьей стороны.",
"logout": "Выйти",
"emailInvalid": "Введите корректный email адрес.",
"usernameRequired": "Введите имя пользователя.",
"usernameMustNotContainSpace": "Имя пользователя не должно содержать пробелы.",
"usernameMustNotLookLikeUrl": "Имя пользователя не должно быть похожим на URL.",
"usernameMustNotContainSpace": "The username must not contain spaces.",
"usernameMustNotLookLikeUrl": "The username must not look like a URL.",
"passwordRequired": "Введите пароль.",
"passwordNotMin": "Пароль должен содержать не меньше 8 символов.",
"passwordNotMax": "Пароль должен содержать не больше 250 символов.",
"passwordNotMin": "Password must have at least 8 characters.",
"passwordNotMax": "Password must have at most 250 characters.",
"showPassword": "Показать пароль",
"hidePassword": "Скрыть пароль",
"noAccountYet": "Ещё нет аккаунта?",
"alreadyHaveAnAccount": "Уже есть аккаунт?",
"remember": "Оставаться в системе",
"registrationDisabled": "Регистрация отключена."
"remember": "Оставаться в системе"
},
"settings": {
"title": "Настройки",
@ -96,7 +95,6 @@
"weekStartMonday": "Понедельник",
"language": "Язык",
"defaultProject": "Проект по умолчанию",
"defaultView": "Представление по умолчанию",
"timezone": "Часовой пояс",
"overdueTasksRemindersTime": "Время напоминания о невыполненных задачах",
"filterUsedOnOverview": "Сохранённый фильтр, используемый на странице обзора"
@ -174,7 +172,7 @@
},
"attributes": {
"title": "Название",
"titlePlaceholder": "Введите название, по которому вы сможете узнать этот токен",
"titlePlaceholder": "Enter a title you will recognize later",
"expiresAt": "Срок действия",
"permissions": "Разрешения"
}
@ -215,9 +213,9 @@
"parent": "Родительский проект",
"search": "Введите запрос для поиска проекта…",
"searchSelect": "Кликните или нажмите Enter для выбора этого проекта",
"shared": "Общие проекты",
"shared": "Shared Projects",
"noDescriptionAvailable": "Описание проекта отсутствует.",
"inboxTitle": "Входящие",
"inboxTitle": "Inbox",
"create": {
"header": "Создать проект",
"titlePlaceholder": "Введите название проекта…",
@ -229,8 +227,8 @@
"title": "Архивирование «{project}»",
"archive": "Архивирование проекта",
"unarchive": "Возвращение проекта из архива",
"unarchiveText": "Вы сможете создавать задачи или изменять их.",
"archiveText": "Вы не сможете изменять этот проект или создавать в нём задачи, пока не вернёте его из архива.",
"unarchiveText": "Вы сможете создавать новые задачи или изменять их.",
"archiveText": "Вы не сможете изменять этот проект или создавать в нём новые задачи, пока не вернёте его из архива.",
"success": "Проект архивирован."
},
"background": {
@ -250,7 +248,7 @@
"text2": "Это включает в себя все задачи, и отменить это будет нельзя!",
"success": "Проект успешно удалён.",
"tasksToDelete": "Это безвозвратно удалит примерно {count} задач.",
"tasksAndChildProjectsToDelete": "Это безвозвратно удалит примерно {tasks} задач и {projects} проектов.",
"tasksAndChildProjectsToDelete": "This will irrevocably remove approx. {tasks} tasks and {projects} projects.",
"noTasksToDelete": "В этом проекте нет никаких задач, можно спокойно удалять."
},
"duplicate": {
@ -267,7 +265,7 @@
"identifier": "Идентификатор проекта",
"identifierPlaceholder": "Введите идентификатор проекта…",
"description": "Описание",
"descriptionPlaceholder": "Введите описание проекта, нажмите '/' для дополнительных параметров…",
"descriptionPlaceholder": "Enter a description for this project, hit '/' for more options…",
"color": "Цвет",
"success": "Проект успешно обновлён."
},
@ -279,7 +277,7 @@
"title": "Ссылки для обмена",
"what": "Что такое ссылка для обмена?",
"explanation": "Ссылка для обмена позволяет поделиться проектом с теми, у кого нет аккаунта в Vikunja.",
"create": "Создать ссылку для обмена",
"create": "Создать новую ссылку для обмена",
"name": "Имя (необязательно)",
"namePlaceholder": "напр. Lorem Ipsum",
"nameExplanation": "Все действия, выполненные через эту ссылку, будут подписаны этим именем.",
@ -316,15 +314,12 @@
"delete": "Удалить"
}
},
"first": {
"title": "Первое представление"
},
"list": {
"title": "Список",
"add": "Добавить",
"addPlaceholder": "Добавить задачу…",
"addPlaceholder": "Добавить новую задачу…",
"empty": "Проект сейчас пуст.",
"newTaskCta": "Создать задачу.",
"newTaskCta": "Создать новую задачу.",
"editTask": "Изменить задачу"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Введите название задачи…",
"addTask": "Добавить задачу",
"addAnotherTask": "Добавить ещё задачу",
"addBucket": "Создать колонку",
"addBucket": "Создать новую колонку",
"addBucketPlaceholder": "Введите название новой колонки…",
"deleteHeaderBucket": "Удаление колонки",
"deleteBucketText1": "Удалить эту колонку?",
@ -388,32 +383,31 @@
"secretDocs": "Подробнее об использовании секретов в документации."
},
"views": {
"header": "Изменить представления",
"title": "Название",
"actions": "Действия",
"kind": "Вид",
"bucketConfigMode": "Режим конфигурации колонок",
"bucketConfig": "Конфигурация колонок",
"bucketConfigManual": "Ручная",
"filter": "По фильтрам",
"create": "Создать представление",
"createSuccess": "Представление создано.",
"titleRequired": "Пожалуйста, укажите название.",
"delete": "Удалить представление",
"deleteText": "Удалить это представление? После удаления его не получится использовать для просмотра задач в этом проекте. Сами задачи останутся. Это действие отменить нельзя!",
"deleteSuccess": "Представление удалено",
"onlyAdminsCanEdit": "Только администраторы проекта могут изменять представления."
"header": "Edit views",
"title": "Title",
"actions": "Actions",
"kind": "Kind",
"bucketConfigMode": "Bucket configuration mode",
"bucketConfig": "Bucket configuration",
"bucketConfigManual": "Manual",
"filter": "Filter",
"create": "Create view",
"createSuccess": "The view was created successfully.",
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
"title": "Фильтры",
"clear": "Сбросить фильтры",
"showResults": "Применить",
"showResults": "Show results",
"attributes": {
"title": "Название",
"titlePlaceholder": "Введите название сохранённого фильтра…",
"description": "Описание",
"descriptionPlaceholder": "Введите описание фильтра, нажмите '/' для дополнительных параметров…",
"descriptionPlaceholder": "Add a description for this filter here, hit '/' for more options…",
"includeNulls": "Включать задачи, у которых не установлено значение",
"requireAll": "Для отображения задачи требовать истинность всех фильтров",
"showDoneTasks": "Показывать завершённые задачи",
@ -422,13 +416,13 @@
"enablePercentDone": "Включить фильтр по прогрессу",
"dueDateRange": "Диапазон срока",
"startDateRange": "Диапазон даты начала",
"endDateRange": "Диапазон даты окончания",
"endDateRange": "Диапазон даты завершения",
"reminderRange": "Диапазон даты напоминания"
},
"create": {
"title": "Создать сохранённый фильтр",
"description": "Сохранённый фильтр — это виртуальный проект, содержимое которого выбирается с помощью фильтров в момент его просмотра.",
"action": "Создать сохранённый фильтр",
"action": "Создать новый сохранённый фильтр",
"titleRequired": "Укажите название фильтра."
},
"delete": {
@ -441,48 +435,48 @@
"success": "Фильтр сохранён."
},
"query": {
"title": "Запрос",
"placeholder": "Введите запрос для поиска или фильтрации…",
"title": "Query",
"placeholder": "Type a search or filter query…",
"help": {
"intro": "Для фильтрации задач можно использовать синтаксис, похожий на SQL. Можно фильтровать по следующим полям:",
"link": "Как это работает?",
"canUseDatemath": "Можно использовать математические выражения для указания относительных дат. Нажмите на значение даты в запросе для подробностей.",
"intro": "To filter tasks, you can use a query syntax similar to SQL. The available fields for filtering include:",
"link": "How does this work?",
"canUseDatemath": "You can date math to set relative dates. Click on the date value in a query to find out more.",
"fields": {
"done": "Выполнена ли задача или нет",
"priority": "Приоритет задачи (1-5)",
"percentDone": "Процент выполнения задачи (0-100)",
"dueDate": "Срок задачи",
"startDate": "Дата начала задачи",
"endDate": "Дата окончания задачи",
"doneAt": "Дата и время, когда задача была завершена",
"assignees": "Пользователи, которым назначена задача",
"labels": "Метки, связанные с задачей",
"project": "Проект, в котором находится задача (только для сохранённых фильтров, не на уровне проекта)"
"done": "Whether the task is completed or not",
"priority": "The priority level of the task (1-5)",
"percentDone": "The percentage of completion for the task (0-100)",
"dueDate": "The due date of the task",
"startDate": "The start date of the task",
"endDate": "The end date of the task",
"doneAt": "The date and time when the task was completed",
"assignees": "The assignees of the task",
"labels": "The labels associated with the task",
"project": "The project the task belongs to (only available for saved filters, not on a project level)"
},
"operators": {
"intro": "Доступны следующие операторы:",
"notEqual": "Не равно",
"equal": "Равно",
"greaterThan": "Больше",
"greaterThanOrEqual": "Больше или равно",
"lessThan": "Меньше",
"lessThanOrEqual": "Меньше или равно",
"like": "Соответствует шаблону (знак подстановки %)",
"in": "Соответствует любому из перечисленных значений, разделённых запятой"
"intro": "The available operators for filtering include:",
"notEqual": "Not equal to",
"equal": "Equal to",
"greaterThan": "Greater than",
"greaterThanOrEqual": "Greater than or equal to",
"lessThan": "Less than",
"lessThanOrEqual": "Less than or equal to",
"like": "Matches a pattern (using wildcard %)",
"in": "Matches any value in a comma-seperated list of values"
},
"logicalOperators": {
"intro": "Для объединения нескольких условий можно использовать логические операторы:",
"and": "Оператор И — должны выполниться все условия",
"or": "Оператор ИЛИ — должно выполниться любое условие",
"parentheses": "Скобки для группировки условий"
"intro": "To combine multiple conditions, you can use the following logical operators:",
"and": "AND operator, matches if all conditions are true",
"or": "OR operator, matches if any of the conditions are true",
"parentheses": "Parentheses for grouping conditions"
},
"examples": {
"intro": "Примеры запросов:",
"priorityEqual": "Выбирает задачи с приоритетом 4",
"dueDatePast": "Выбирает задачи со сроком в прошлом (то есть просроченные)",
"undoneHighPriority": "Выбирает невыполненные задачи с приоритетом 3 или выше",
"assigneesIn": "Выбирает задачи, назначенные пользователям «user1» или «user2»",
"priorityOneOrTwoPastDue": "Выбирает задачи с приоритетом 1 или 2 и сроком в прошлом"
"intro": "Here are some examples of filter queries:",
"priorityEqual": "Matches tasks with priority level 4",
"dueDatePast": "Matches tasks with a due date in the past",
"undoneHighPriority": "Matches undone tasks with priority level 3 or higher",
"assigneesIn": "Matches tasks assigned to either \"user1\" or \"user2\"",
"priorityOneOrTwoPastDue": "Matches tasks with priority level 1 or 2 and a due date in the past"
}
}
}
@ -501,8 +495,8 @@
"confirm": "Я уверен, давай начнём миграцию!",
"importUpload": "Чтобы импортировать данные из {name} в Vikunja, нажмите кнопку ниже для выбора файла.",
"upload": "Загрузить файл",
"migrationStartedWillReciveEmail": "Vikunja импортирует списки/проекты, задачи, заметки, напоминания и файлы из {service}. Это займёт некоторое время, и после завершения вам придёт письмо. Это окно можно закрыть.",
"migrationInProgress": "Идёт процесс миграции. Пожалуйста, подождите до завершения."
"migrationStartedWillReciveEmail": "Vikunja will now import your lists/projects, tasks, notes, reminders and files from {service}. As this will take a while, we will send you an email once done. You can close this window now.",
"migrationInProgress": "A migration is currently in progress. Please wait until it is done."
},
"label": {
"title": "Метки",
@ -511,8 +505,8 @@
"newCTA": "Меток сейчас нет.",
"search": "Введите запрос для поиска метки…",
"create": {
"header": "Создать метку",
"title": "Создать метку",
"header": "Новая метка",
"title": "Создать новую метку",
"titleRequired": "Пожалуйста, укажите название.",
"success": "Метка успешно создана."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Аутентификация…",
"passwordRequired": "Для доступа к этому проекту нужен пароль. Введите его сюда:",
"error": "Произошла ошибка.",
"error": "Случилась ошибка.",
"invalidPassword": "Неверный пароль."
},
"navigation": {
@ -554,7 +548,7 @@
"copy": "Скопировать в буфер обмена",
"copyError": "Скопировать в буфер обмена не удалось",
"search": "Поиск",
"searchPlaceholder": "Введите запрос для поиска…",
"searchPlaceholder": "Введи запрос для поиска…",
"previous": "Назад",
"next": "Вперёд",
"poweredBy": "При поддержке Vikunja",
@ -573,7 +567,7 @@
"custom": "Настраиваемый",
"id": "ID",
"created": "Дата создания",
"createdBy": "Создатель {0}",
"createdBy": "Created by {0}",
"actions": "Действия",
"cannotBeUndone": "Это действие отменить нельзя!"
},
@ -592,11 +586,11 @@
"edit": "Изменить",
"done": "Готово",
"heading1": "Заголовок 1",
"heading1Tooltip": "Большой заголовок.",
"heading1Tooltip": "Big section heading.",
"heading2": "Заголовок 2",
"heading2Tooltip": "Средний заголовок.",
"heading2Tooltip": "Medium section heading.",
"heading3": "Заголовок 3",
"heading3Tooltip": "Маленький заголовок.",
"heading3Tooltip": "Smaller section header.",
"headingSmaller": "Заголовок меньше",
"headingBigger": "Заголовок больше",
"bold": "Жирный",
@ -604,47 +598,47 @@
"strikethrough": "Зачёркнутый",
"underline": "Подчёркнутый",
"code": "Код",
"codeTooltip": "Фрагмент кода.",
"codeTooltip": "Capture a code snippet.",
"quote": "Цитата",
"quoteTooltip": "Цитата.",
"bulletList": "Маркированный список",
"bulletListTooltip": "Создать простой список.",
"unorderedList": "Неупорядоченный список",
"orderedList": "Нумерованный список",
"orderedListTooltip": "Создать нумерованный список.",
"quoteTooltip": "Capture a quote.",
"bulletList": "Bullet list",
"bulletListTooltip": "Create a simple bullet list.",
"unorderedList": "Unordered list",
"orderedList": "Ordered list",
"orderedListTooltip": "Create a list with numbering.",
"cleanBlock": "Очистить блок",
"link": "Ссылка",
"image": "Изображение",
"imageTooltip": "Загрузить изображение с компьютера.",
"imageTooltip": "Upload an image from your computer.",
"table": {
"title": "Таблица",
"insert": "Вставить таблицу",
"addColumnBefore": "Добавить столбец слева",
"addColumnAfter": "Добавить столбец справа",
"deleteColumn": "Удалить столбец",
"addRowBefore": "Добавить строку сверху",
"addRowAfter": "Добавить строку снизу",
"deleteRow": "Удалить строку",
"deleteTable": "Удалить таблицу",
"mergeCells": "Объединить ячейки",
"splitCell": "Разделить ячейки",
"toggleHeaderColumn": "Столбец заголовков",
"toggleHeaderRow": "Строка заголовков",
"toggleHeaderCell": "Ячейка с заголовком",
"mergeOrSplit": "Объединить или разделить",
"fixTables": "Исправить таблицы"
"insert": "Insert table",
"addColumnBefore": "Add column before",
"addColumnAfter": "Add column after",
"deleteColumn": "Delete column",
"addRowBefore": "Add row before",
"addRowAfter": "Add row after",
"deleteRow": "Delete row",
"deleteTable": "Delete table",
"mergeCells": "Merge cells",
"splitCell": "Split cell",
"toggleHeaderColumn": "Toggle header column",
"toggleHeaderRow": "Toggle header row",
"toggleHeaderCell": "Toggle header cell",
"mergeOrSplit": "Merge or split",
"fixTables": "Fix tables"
},
"horizontalRule": "Разделитель",
"horizontalRuleTooltip": "Разделитель текста.",
"horizontalRuleTooltip": "Divide a section.",
"sideBySide": "Side By Side",
"guide": "Руководство",
"text": "Текст",
"textTooltip": "Просто начните печатать для ввода обычного текста.",
"text": "Text",
"textTooltip": "Just start typing with plain text.",
"taskList": "Список задач",
"taskListTooltip": "Отслеживаемые задачи в виде списка с галочками.",
"taskListTooltip": "Track tasks with a to-do list.",
"undo": "Отменить",
"redo": "Вернуть",
"placeholder": "Введите какой-нибудь текст или нажмите '/' для дополнительных параметров…"
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Создать",
@ -654,7 +648,7 @@
"to": "По",
"from": "С",
"fromto": "С {from} по {to}",
"date": "Дата",
"date": "Date",
"ranges": {
"today": "Сегодня",
"thisWeek": "Эта неделя",
@ -671,33 +665,33 @@
"restOfThisYear": "Остаток этого года"
},
"values": {
"now": "Сейчас",
"startOfToday": "Начало дня",
"endOfToday": "Конец дня",
"beginningOflastWeek": "Начало прошлой недели",
"endOfLastWeek": "Конец прошлой недели",
"beginningOfThisWeek": "Начало этой недели",
"endOfThisWeek": "Конец этой недели",
"startOfNextWeek": "Начало следующей недели",
"endOfNextWeek": "Конец этой недели",
"in7Days": "Через 7 дней",
"beginningOfLastMonth": "Начало прошлого месяца",
"endOfLastMonth": "Конец прошлого месяца",
"startOfThisMonth": "Начало этого месяца",
"endOfThisMonth": "Конец этого месяца",
"startOfNextMonth": "Начало следующего месяца",
"endOfNextMonth": "Конец следующего месяца",
"in30Days": "Через 30 дней",
"startOfThisYear": "Начало этого года",
"endOfThisYear": "Конец этого года"
"now": "Now",
"startOfToday": "Start of today",
"endOfToday": "End of today",
"beginningOflastWeek": "Beginning of last week",
"endOfLastWeek": "End of last week",
"beginningOfThisWeek": "Beginning of this week",
"endOfThisWeek": "End of this week",
"startOfNextWeek": "Start of next week",
"endOfNextWeek": "End of next week",
"in7Days": "In 7 days",
"beginningOfLastMonth": "Beginning of last month",
"endOfLastMonth": "End of last month",
"startOfThisMonth": "Start of this month",
"endOfThisMonth": "End of this month",
"startOfNextMonth": "Start of next month",
"endOfNextMonth": "End of next month",
"in30Days": "In 30 days",
"startOfThisYear": "Beginning of this year",
"endOfThisYear": "End of this year"
}
},
"datemathHelp": {
"canuse": "Можно использовать математические выражения для фильтрации по относительным датам.",
"canuse": "You can use date math to filter for relative dates.",
"learnhow": "Как это работает",
"title": "Математика дат",
"intro": "Укажите относительные даты, которые Vikunja будет вычислять на лету в момент применения фильтра.",
"expression": "Каждое выражение начинается с опорной даты, которое может быть {0} или конкретной датой, оканчивающейся на {1}. Затем к опорной дате можно добавить одно или несколько математических выражений.",
"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": "Это похоже на выражения, которые используются в {0} и {1}.",
"add1Day": "Добавить один день",
"minus1Day": "Вычесть один день",
@ -748,7 +742,7 @@
"detail": {
"chooseDueDate": "Нажмите для выбора срока",
"chooseStartDate": "Нажмите для выбора даты начала",
"chooseEndDate": "Нажмите для выбора даты окончания",
"chooseEndDate": "Нажмите для выбора даты завершения",
"move": "Переместить задачу в другой проект",
"done": "Завершено!",
"undone": "Не завершено",
@ -774,7 +768,7 @@
"priority": "Задать приоритет",
"dueDate": "Задать срок",
"startDate": "Задать дату начала",
"endDate": "Задать дату окончания",
"endDate": "Задать дату завершения",
"reminders": "Добавить напоминания",
"repeatAfter": "Задать интервал повтора",
"percentDone": "Задать прогресс",
@ -795,7 +789,7 @@
"description": "Описание",
"done": "Завершено",
"dueDate": "Срок",
"endDate": "Дата окончания",
"endDate": "Дата завершения",
"labels": "Метки",
"percentDone": "Прогресс",
"priority": "Приоритет",
@ -805,7 +799,7 @@
"startDate": "Дата начала",
"title": "Название",
"updated": "Дата изменения",
"doneAt": "Дата завершения"
"doneAt": "Done At"
},
"subscription": {
"subscribedTaskThroughParentProject": "Вы не можете отписаться здесь, потому что вы подписаны эту задачу через её проект.",
@ -841,7 +835,7 @@
"loading": "Загрузка комментариев…",
"edited": "изменено {date}",
"creating": "Комментируем…",
"placeholder": "Введите комментарий, нажмите '/' для дополнительных параметров…",
"placeholder": "Add your comment, hit '/' for more options…",
"comment": "Комментировать",
"delete": "Удалить комментарий",
"deleteText1": "Удалить этот комментарий?",
@ -855,7 +849,7 @@
"1week": "1 неделя"
},
"description": {
"placeholder": "Введите описание, нажмите '/' для дополнительных параметров…",
"placeholder": "Enter a description, hit '/' for more options…",
"empty": "Описания ещё нет."
},
"assignee": {
@ -865,7 +859,7 @@
"unassignSuccess": "Пользователь убран."
},
"label": {
"placeholder": "Введите метку…",
"placeholder": "Введите новую метку…",
"createPlaceholder": "Добавить как новую метку",
"addSuccess": "Метка добавлена.",
"createSuccess": "Метка создана.",
@ -888,7 +882,7 @@
"relation": {
"add": "Добавить новую связанную задачу",
"new": "Новая связанная задача",
"searchPlaceholder": "Введите запрос для поиска задачи, чтобы добавить связь…",
"searchPlaceholder": "Введи запрос для поиска задачи, чтобы добавить связь…",
"createPlaceholder": "Добавить как связанную задачу",
"differentProject": "Эта задача принадлежит другому проекту.",
"noneYet": "Ещё нет связанных задач.",
@ -911,15 +905,15 @@
}
},
"reminder": {
"before": "{amount} {unit} до {type}",
"after": "{amount} {unit} после {type}",
"beforeShort": "до",
"afterShort": "после",
"onDueDate": "По истечению срока",
"onStartDate": "В дату начала",
"onEndDate": "В дату окончания",
"custom": "Другой вариант",
"dateAndTime": "Конкретное время"
"before": "{amount} {unit} before {type}",
"after": "{amount} {unit} after {type}",
"beforeShort": "before",
"afterShort": "after",
"onDueDate": "On the due date",
"onStartDate": "On the start date",
"onEndDate": "On the end date",
"custom": "Custom",
"dateAndTime": "Date and time"
},
"repeat": {
"everyDay": "Каждый день",
@ -927,7 +921,7 @@
"every30d": "Каждые 30 дней",
"mode": "Режим повтора",
"monthly": "Ежемесячно",
"fromCurrentDate": "С даты завершения",
"fromCurrentDate": "От сегодняшей даты",
"each": "Каждые",
"specifyAmount": "Укажите количество…",
"hours": "Часов",
@ -938,7 +932,7 @@
"invalidAmount": "Введите больше чем 0."
},
"quickAddMagic": {
"hint": "Используйте волшебные префиксы, чтобы указать срок, назначить пользователей или задать другие свойства задачи.",
"hint": "Use magic prefixes to define due dates, assignees and other task properties.",
"title": "Волшебное Быстрое Добавление",
"intro": "При создании задачи вы можете использовать специальные ключевые слова для непосредственного добавления атрибутов к создаваемой задаче. Это позволяет добавлять часто используемые атрибуты гораздо быстрее.",
"multiple": "Вы можете использовать это несколько раз.",
@ -1006,11 +1000,11 @@
"namePlaceholder": "Имя команды здесь…",
"nameRequired": "Пожалуйста, укажите имя.",
"description": "Описание",
"descriptionPlaceholder": "Введите описание команды, нажмите '/' для дополнительных параметров…",
"descriptionPlaceholder": "Describe the team here, hit '/' for more options…",
"admin": "Администратор",
"member": "Участник",
"isPublic": "Публичная команда",
"isPublicDescription": "Сделать команду видимой публично. Если включено, кто угодно сможет поделиться проектами с этой командой, даже если он не является её участником."
"isPublic": "Public Team",
"isPublicDescription": "Make the team publicly discoverable. When enabled, anyone can share projects with this team even when not being a direct member."
}
},
"keyboardShortcuts": {
@ -1065,20 +1059,20 @@
"duplicate": "Создать копию",
"delete": "Удалить",
"unarchive": "Вернуть из архива",
"setBackground": "Настройки фона",
"setBackground": "Задать фон",
"share": "Поделиться",
"newProject": "Создать проект",
"createProject": "Создать проект",
"cantArchiveIsDefault": "Нельзя архивировать проект по умолчанию.",
"cantDeleteIsDefault": "Нельзя удалять проект по умолчанию.",
"views": "Представления"
"cantArchiveIsDefault": "You cannot archive this because it is your default project.",
"cantDeleteIsDefault": "You cannot delete this because it is your default project.",
"views": "Views"
},
"apiConfig": {
"url": "Vikunja URL",
"urlPlaceholder": "напр. https://localhost:3456",
"change": "изменить",
"use": "Используется Vikunja на {0}",
"error": "Не удалось обратиться к Vikunja по адресу «{domain}». Проверьте, правильный ли адрес и можете ли вы открыть его напрямую, и попробуйте ещё раз.",
"error": "Could not find or use Vikunja installation at \"{domain}\". Please check if the url has the correct format and you can reach it when accessing it directly and try again.",
"success": "Используется Vikunja на \"{domain}\".",
"urlRequired": "Требуется url."
},
@ -1101,28 +1095,28 @@
"tasks": "Задачи",
"projects": "Проекты",
"teams": "Команды",
"labels": "Метки",
"labels": "Labels",
"newProject": "Введите название проекта…",
"newTask": "Введите название задачи…",
"newTeam": "Введите название новой команды…",
"createTask": "Создать задачу в текущем проекте ({title})",
"createProject": "Создать проект",
"cmds": {
"newTask": "Создать задачу",
"newTask": "Новая задача",
"newProject": "Создать проект",
"newTeam": "Создать команду"
"newTeam": "Новая команда"
}
},
"date": {
"locale": "en",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {
"reactedWith": "Реакция от {user}: {value}",
"reactedWithAnd": "Реакции от {users} и {lastUser}: {value}",
"reactedWithAndMany": "Реакции от {users} и ещё {num}: {value}",
"add": "Добавить реакцию"
"reactedWith": "{user} reacted with {value}",
"reactedWithAnd": "{users} and {lastUser} reacted with {value}",
"reactedWithAndMany": "{users} and {num} more reacted reacted with {value}",
"add": "Add your reaction"
},
"error": {
"error": "Ошибка",
@ -1197,17 +1191,17 @@
},
"about": {
"title": "О Vikunja",
"version": "Версия: {version}"
"version": "Version: {version}"
},
"time": {
"units": {
"seconds": "секунда|секунды|секунд",
"minutes": "минута|минуты|минут",
"hours": "час|часа|часов",
"days": "день|дня|дней",
"weeks": "неделя|недели|недель",
"months": "месяц|месяца|месяцев",
"years": "год|года|лет"
"seconds": "second|seconds",
"minutes": "minute|minutes",
"hours": "hour|hours",
"days": "day|days",
"weeks": "week|weeks",
"months": "month|months",
"years": "year|years"
}
}
}

View File

@ -53,7 +53,7 @@
"loginWith": "Log in with {provider}",
"authenticating": "Authenticating…",
"openIdStateError": "State does not match, refusing to continue!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "An error occured while authenticating against the third party.",
"logout": "Logout",
"emailInvalid": "Please enter a valid email address.",
"usernameRequired": "Please provide a username.",
@ -66,8 +66,7 @@
"hidePassword": "Hide the password",
"noAccountYet": "Don't have an account yet?",
"alreadyHaveAnAccount": "Already have an account?",
"remember": "Stay logged in",
"registrationDisabled": "Registration is disabled."
"remember": "Stay logged in"
},
"settings": {
"title": "Settings",
@ -96,7 +95,6 @@
"weekStartMonday": "Monday",
"language": "Language",
"defaultProject": "Default Project",
"defaultView": "Default View",
"timezone": "Time Zone",
"overdueTasksRemindersTime": "Overdue tasks reminder email time",
"filterUsedOnOverview": "Saved filter used on the overview page"
@ -229,8 +227,8 @@
"title": "Archive \"{project}\"",
"archive": "Archive this project",
"unarchive": "Un-Archive this project",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"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": {
@ -279,7 +277,7 @@
"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 link share",
"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.",
@ -316,15 +314,12 @@
"delete": "Delete"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "List",
"add": "Add",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Add a new task…",
"empty": "This project is currently empty.",
"newTaskCta": "Create a task.",
"newTaskCta": "Create a new task.",
"editTask": "Edit Task"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Enter the new task title…",
"addTask": "Add a task",
"addAnotherTask": "Add another task",
"addBucket": "Create a bucket",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,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.",
"action": "Create saved filter",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Type to search for a label…",
"create": {
"header": "New label",
"title": "Create a label",
"title": "Create a new label",
"titleRequired": "Please specify a title.",
"success": "The label was successfully created."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Authenticating…",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"error": "An error occurred.",
"error": "An error occured.",
"invalidPassword": "The password is invalid."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Create new",
"selectPlaceholder": "Click or press enter to select"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Task",
"new": "Create a task",
"new": "Create a new task",
"delete": "Delete this task",
"createSuccess": "The task was successfully created.",
"addReminder": "Add a reminder…",
"addReminder": "Add a new reminder…",
"doneSuccess": "The task was successfully marked as done.",
"undoneSuccess": "The task was successfully un-marked as done.",
"undo": "Undo",
@ -865,7 +859,7 @@
"unassignSuccess": "The user has been unassigned successfully."
},
"label": {
"placeholder": "Type to add a 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.",
@ -888,8 +882,8 @@
"relation": {
"add": "Add a New Task Relation",
"new": "New Task Relation",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"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.",
"noneYet": "No task relations yet.",
"delete": "Delete Task Relation",
@ -927,7 +921,7 @@
"every30d": "Every 30 Days",
"mode": "Repeat mode",
"monthly": "Monthly",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "From Current Date",
"each": "Each",
"specifyAmount": "Specify an amount…",
"hours": "Hours",
@ -967,7 +961,7 @@
"title": "Teams",
"noTeams": "You are currently not part of any teams.",
"create": {
"title": "Create a team",
"title": "Create a new team",
"success": "The team was successfully created."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Duplicate",
"delete": "Delete",
"unarchive": "Un-Archive",
"setBackground": "Background settings",
"setBackground": "Set background",
"share": "Share",
"newProject": "New project",
"createProject": "Create project",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "en",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Prijava z {provider}",
"authenticating": "Avtentikacija…",
"openIdStateError": "Stanje se ne ujema, prekinjam!",
"openIdGeneralError": "Med preverjanjem pristnosti zunanje povezave je prišlo do napake.",
"openIdGeneralError": "Med preverjanjem pristnosti preko zunanje aplikacije je prišlo do napake.",
"logout": "Odjava",
"emailInvalid": "Prosim vnesite veljaven e-poštni naslov.",
"usernameRequired": "Prosim vnesite uporabniško ime.",
@ -66,8 +66,7 @@
"hidePassword": "Skrijte geslo",
"noAccountYet": "Še nimate računa?",
"alreadyHaveAnAccount": "Že imate račun?",
"remember": "Ostanite prijavljeni",
"registrationDisabled": "Registracija je onemogočena."
"remember": "Ostanite prijavljeni"
},
"settings": {
"title": "Nastavitve",
@ -96,7 +95,6 @@
"weekStartMonday": "Ponedeljek",
"language": "Jezik",
"defaultProject": "Privzeti projekt",
"defaultView": "Privzeti pogled",
"timezone": "Časovni pas",
"overdueTasksRemindersTime": "Ura e-poštnega opomnika za zapadla naloge",
"filterUsedOnOverview": "Shranjen filter, ki bo uporabljen na strani s pregledom"
@ -229,8 +227,8 @@
"title": "Arhiviraj \"{project}\"",
"archive": "Arhiviraj projekt",
"unarchive": "Odstrani projekt iz arhiva",
"unarchiveText": "Ustvarili boste lahko naloge ali jih urejali.",
"archiveText": "Tega projekta ne boste mogli urejati ali ustvarjati opravil, dokler ga ne odstranite iz arhiva.",
"unarchiveText": "Ustvarili boste lahko nove naloge ali jih uredili.",
"archiveText": "Dokler ga ne odstranite iz arhiva, tega projekta ne boste mogli urejati ali ustvarjati novih nalog.",
"success": "Projekt je bil uspešno arhiviran."
},
"background": {
@ -316,15 +314,12 @@
"delete": "Izbriši"
}
},
"first": {
"title": "Prvi pogled"
},
"list": {
"title": "Seznam",
"add": "Dodaj",
"addPlaceholder": "Dodaj nalogo…",
"addPlaceholder": "Dodaj novo nalogo…",
"empty": "Projekt je trenutno prazen.",
"newTaskCta": "Ustvari nalogo.",
"newTaskCta": "Ustvari novo nalogo.",
"editTask": "Uredi nalogo"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Vnesite nov naslov naloge…",
"addTask": "Dodaj nalogo",
"addAnotherTask": "Dodaj še eno nalogo",
"addBucket": "Ustvari vedro",
"addBucket": "Ustvari novo vedro",
"addBucketPlaceholder": "Vnesi nov naslov vedra…",
"deleteHeaderBucket": "Izbriši vedro",
"deleteBucketText1": "Ali ste prepričani, da želite izbrisati to vedro?",
@ -401,8 +396,7 @@
"titleRequired": "Prosim navedite naslov.",
"delete": "Izbriši pogled",
"deleteText": "Ali ste prepričani, da želite odstraniti ta pogled? Ne bo ga več mogoče uporabljati za ogled nalog v tem projektu. To dejanje ne bo izbrisalo nobenih opravil. Tega ni mogoče razveljaviti!",
"deleteSuccess": "Pogled je bil uspešno izbrisan",
"onlyAdminsCanEdit": "Samo skrbniki projekta lahko urejajo poglede."
"deleteSuccess": "Pogled je bil uspešno izbrisan"
}
},
"filters": {
@ -512,7 +506,7 @@
"search": "Začni tipkati za iskanje oznake…",
"create": {
"header": "Nova oznaka",
"title": "Ustvari oznako",
"title": "Ustvari novo oznako",
"titleRequired": "Prosim določite naslov.",
"success": "Oznaka je bila uspešno ustvarjena."
},
@ -647,7 +641,7 @@
"placeholder": "Začni tipkati besedilo ali pritisni '/', da vidiš več možnosti…"
},
"multiselect": {
"createPlaceholder": "Ustvari",
"createPlaceholder": "Ustvari novo",
"selectPlaceholder": "Za izbiro kliknite ali pritisnite enter"
},
"datepickerRange": {
@ -726,7 +720,7 @@
},
"task": {
"task": "Naloga",
"new": "Ustvari opravilo",
"new": "Ustvari novo nalogo",
"delete": "Izbriši nalogo",
"createSuccess": "Naloga je bila uspešno ustvarjena.",
"addReminder": "Dodaj nov opomnik…",
@ -888,8 +882,8 @@
"relation": {
"add": "Dodajte novo povezavo naloge",
"new": "Nova povezava naloge",
"searchPlaceholder": "Vnesite iskanje za nalogo, ki jo želite dodati kot povezano…",
"createPlaceholder": "Dodaj kot povezavo naloge",
"searchPlaceholder": "Novo nalogo, ki jo želite dodati kot povezano, poiščite s tipkanjem…",
"createPlaceholder": "Dodaj kot novo povezavo naloge",
"differentProject": "Ta naloga pripada drugemu projektu.",
"noneYet": "Naloge še nimajo povezav.",
"delete": "Izbriši povezavo nalog",
@ -927,7 +921,7 @@
"every30d": "Vsakih 30 dni",
"mode": "Način ponavljanja",
"monthly": "Mesečno",
"fromCurrentDate": "Od datuma dokončanja",
"fromCurrentDate": "Od trenutnega datuma",
"each": "Vsak",
"specifyAmount": "Določi znesek…",
"hours": "Ur",
@ -967,7 +961,7 @@
"title": "Ekipe",
"noTeams": "Trenutno niste del nobene ekipe.",
"create": {
"title": "Ustvari ekipo",
"title": "Ustvari novo ekipo",
"success": "Ekipa je bila uspešno ustvarjena."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Podvoji",
"delete": "Izbriši",
"unarchive": "Odstrani iz arhiva",
"setBackground": "Nastavitve ozadja",
"setBackground": "Nastavi ozadje",
"share": "Skupna raba",
"newProject": "Nov projekt",
"createProject": "Ustvari projekt",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "sl",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

View File

@ -53,7 +53,7 @@
"loginWith": "Log in with {provider}",
"authenticating": "Authenticating…",
"openIdStateError": "State does not match, refusing to continue!",
"openIdGeneralError": "An error occurred while authenticating against the third party.",
"openIdGeneralError": "An error occured while authenticating against the third party.",
"logout": "Logout",
"emailInvalid": "Please enter a valid email address.",
"usernameRequired": "Please provide a username.",
@ -66,8 +66,7 @@
"hidePassword": "Hide the password",
"noAccountYet": "Don't have an account yet?",
"alreadyHaveAnAccount": "Already have an account?",
"remember": "Stay logged in",
"registrationDisabled": "Registration is disabled."
"remember": "Stay logged in"
},
"settings": {
"title": "Settings",
@ -96,7 +95,6 @@
"weekStartMonday": "Monday",
"language": "Language",
"defaultProject": "Default Project",
"defaultView": "Default View",
"timezone": "Time Zone",
"overdueTasksRemindersTime": "Overdue tasks reminder email time",
"filterUsedOnOverview": "Saved filter used on the overview page"
@ -229,8 +227,8 @@
"title": "Archive \"{project}\"",
"archive": "Archive this project",
"unarchive": "Un-Archive this project",
"unarchiveText": "You will be able to create tasks or edit it.",
"archiveText": "You won't be able to edit this project or create tasks until you un-archive it.",
"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": {
@ -279,7 +277,7 @@
"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 link share",
"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.",
@ -316,15 +314,12 @@
"delete": "Delete"
}
},
"first": {
"title": "First View"
},
"list": {
"title": "List",
"add": "Add",
"addPlaceholder": "Add a task…",
"addPlaceholder": "Add a new task…",
"empty": "This project is currently empty.",
"newTaskCta": "Create a task.",
"newTaskCta": "Create a new task.",
"editTask": "Edit Task"
},
"gantt": {
@ -357,7 +352,7 @@
"addTaskPlaceholder": "Enter the new task title…",
"addTask": "Add a task",
"addAnotherTask": "Add another task",
"addBucket": "Create a bucket",
"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?",
@ -401,8 +396,7 @@
"titleRequired": "Please provide a title.",
"delete": "Delete this view",
"deleteText": "Are you sure you want to remove this view? It will no longer be possible to use it to view tasks in this project. This action won't delete any tasks. This cannot be undone!",
"deleteSuccess": "The view was successfully deleted",
"onlyAdminsCanEdit": "Only project admins can edit views."
"deleteSuccess": "The view was successfully deleted"
}
},
"filters": {
@ -428,7 +422,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.",
"action": "Create saved filter",
"action": "Create new saved filter",
"titleRequired": "Please provide a title for the filter."
},
"delete": {
@ -512,7 +506,7 @@
"search": "Type to search for a label…",
"create": {
"header": "New label",
"title": "Create a label",
"title": "Create a new label",
"titleRequired": "Please specify a title.",
"success": "The label was successfully created."
},
@ -533,7 +527,7 @@
"sharing": {
"authenticating": "Authenticating…",
"passwordRequired": "This shared project requires a password. Please enter it below:",
"error": "An error occurred.",
"error": "An error occured.",
"invalidPassword": "The password is invalid."
},
"navigation": {
@ -647,7 +641,7 @@
"placeholder": "Type some text or hit '/' to see more options…"
},
"multiselect": {
"createPlaceholder": "Create",
"createPlaceholder": "Create new",
"selectPlaceholder": "Click or press enter to select"
},
"datepickerRange": {
@ -726,10 +720,10 @@
},
"task": {
"task": "Task",
"new": "Create a task",
"new": "Create a new task",
"delete": "Delete this task",
"createSuccess": "The task was successfully created.",
"addReminder": "Add a reminder…",
"addReminder": "Add a new reminder…",
"doneSuccess": "The task was successfully marked as done.",
"undoneSuccess": "The task was successfully un-marked as done.",
"undo": "Undo",
@ -865,7 +859,7 @@
"unassignSuccess": "The user has been unassigned successfully."
},
"label": {
"placeholder": "Type to add a 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.",
@ -888,8 +882,8 @@
"relation": {
"add": "Add a New Task Relation",
"new": "New Task Relation",
"searchPlaceholder": "Type search for a task to add as related…",
"createPlaceholder": "Add this as related task",
"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.",
"noneYet": "No task relations yet.",
"delete": "Delete Task Relation",
@ -927,7 +921,7 @@
"every30d": "Every 30 Days",
"mode": "Repeat mode",
"monthly": "Monthly",
"fromCurrentDate": "From completion date",
"fromCurrentDate": "From Current Date",
"each": "Each",
"specifyAmount": "Specify an amount…",
"hours": "Hours",
@ -967,7 +961,7 @@
"title": "Teams",
"noTeams": "You are currently not part of any teams.",
"create": {
"title": "Create a team",
"title": "Create a new team",
"success": "The team was successfully created."
},
"edit": {
@ -1065,7 +1059,7 @@
"duplicate": "Duplicate",
"delete": "Delete",
"unarchive": "Un-Archive",
"setBackground": "Background settings",
"setBackground": "Set background",
"share": "Share",
"newProject": "New project",
"createProject": "Create project",
@ -1115,7 +1109,7 @@
},
"date": {
"locale": "en",
"altFormatLong": "j M Y, H:i",
"altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y"
},
"reaction": {

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