Compare commits

..

19 Commits

Author SHA1 Message Date
Julius Härtl
cc9dea1f2b Defer obtaining the user session in the config service which might be injected before login has hapened
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-08-20 16:02:48 +00:00
Nextcloud bot
b16ade905c [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-08-18 02:37:01 +00:00
Nextcloud bot
ee1bba7d99 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-08-10 02:44:35 +00:00
Nextcloud bot
3407097e95 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-08-06 02:38:51 +00:00
Julius Härtl
47ac3e6082 Merge pull request #3231 from nextcloud/backport/3225/stable22
[stable22] Check for null value to avoid TypeError in the group manager
2021-08-05 09:04:16 +02:00
Julius Härtl
75110bed47 Check for null value to avoid TypeError in the group manager
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-08-04 16:41:31 +00:00
Julius Härtl
74f0106718 Merge pull request #3224 from nextcloud/backport/3217/stable22
[stable22] Move circle checks to a unified service and improve member checks
2021-08-03 11:41:03 +02:00
Julius Härtl
958d50d9b7 Move circle checks to a unified service and improve member checks
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-08-03 07:43:30 +00:00
Julius Härtl
5f4aa017b6 Pin mariadb to 10.5 for tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-08-03 09:42:43 +02:00
Nextcloud bot
92c2a58f50 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-08-01 02:12:52 +00:00
Nextcloud bot
75bf0dffe6 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-07-15 10:52:50 +00:00
Julius Härtl
45a10f0840 Bump version to 1.5.0
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-07-09 11:55:34 +02:00
Julius Härtl
fbf3b1cd19 Merge pull request #3168 from nextcloud/backport/3161/stable22
[stable22] Reduce duplicate queries when fetching user boards an permissions
2021-07-06 07:54:35 +02:00
Julius Härtl
0cc4151929 Reduce duplicate queries when fetching user boards an permissions
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-07-05 18:27:49 +00:00
Julius Härtl
e261ade1bb Merge pull request #3165 from nextcloud/backport/3151/stable22
[stable22] Always log generic exceptions
2021-07-05 16:21:15 +02:00
Julius Härtl
5d7e54d419 Always log generic exceptions
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-07-02 15:55:44 +00:00
Julius Härtl
3499858295 Merge remote-tracking branch 'origin/master' into stable22 2021-06-25 15:39:38 +02:00
Julius Härtl
1615e218bd Merge pull request #3148 from nextcloud/update-stable22-target-versions
Update stable22 target versions
2021-06-25 09:07:38 +02:00
Joas Schilling
9a3b859780 Update stable22 target versions
Signed-off-by: Joas Schilling <coding@schilljs.com>
2021-06-24 14:07:30 +02:00
568 changed files with 49276 additions and 86490 deletions

View File

@@ -1,29 +0,0 @@
{
"image": "ghcr.io/juliushaertl/nextcloud-dev-php80:latest",
"forwardPorts": [80],
"containerEnv": {
"NEXTCLOUD_AUTOINSTALL_APPS": "deck",
"XDEBUG_MODE": "debug"
},
"customizations": {
"vscode": {
"extensions": [
"felixfbecker.php-intellisense",
"octref.vetur"
],
"settings": {
"php.suggest.basic": false,
"git.alwaysSignOff": true
}
}
},
"workspaceMount": "source=${localWorkspaceFolder},target=/var/www/html/apps-extra/deck,type=bind",
"workspaceFolder": "/var/www/html/apps-extra/deck",
"overrideCommand": true,
"postAttachCommand": "bash ./.devcontainer/setup.sh",
"portsAttributes": {
"80": {
"label": "Webserver"
}
}
}

View File

@@ -1,9 +0,0 @@
#!/bin/bash
(
cd /tmp && /usr/local/bin/bootstrap.sh apache2ctl start
)
composer install --no-dev
npm ci
npm run dev

View File

@@ -3,10 +3,7 @@ root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = tab
indent_style = tab
insert_final_newline = true
trim_trailing_whitespace = true
[*.{js,vue}]
indent_style = tab

View File

@@ -1,14 +1,8 @@
module.exports = {
root: true,
extends: [
'@nextcloud',
],
rules: {
'jsdoc/require-param-description': ['off'],
'jsdoc/require-param-type': ['off'],
'jsdoc/check-param-names': ['off'],
'jsdoc/no-undefined-types': ['off'],
'jsdoc/require-property-description': ['off'],
'import/no-named-as-default-member': ['off'],
'valid-jsdoc': ['off'],
},
}

View File

@@ -2,7 +2,7 @@ version: 2
updates:
- package-ecosystem: npm
directory: "/"
target-branch: "main"
target-branch: "master"
schedule:
interval: weekly
day: saturday
@@ -11,42 +11,19 @@ updates:
open-pull-requests-limit: 10
reviewers:
- juliushaertl
- luka-nextcloud
- package-ecosystem: npm
target-branch: stable28
versioning-strategy: lockfile-only
directory: "/"
schedule:
interval: weekly
day: saturday
time: "03:00"
timezone: Europe/Paris
ignore:
- dependency-name: "*"
update-types: ["version-update:semver-major"]
open-pull-requests-limit: 30
labels:
- 3. to review
- dependencies
- package-ecosystem: npm
target-branch: stable27
versioning-strategy: lockfile-only
directory: "/"
schedule:
interval: weekly
day: saturday
time: "03:00"
timezone: Europe/Paris
ignore:
- dependency-name: "*"
update-types: ["version-update:semver-major"]
open-pull-requests-limit: 30
labels:
- 3. to review
- dependencies
- jakobroehrl
#- package-ecosystem: npm
# directory: "/"
# target-branch: "stable1.1"
# schedule:
# interval: weekly
# day: saturday
# time: "03:00"
# timezone: Europe/Paris
# open-pull-requests-limit: 10
# reviewers:
# - juliushaertl
# - jakobroehrl
- package-ecosystem: composer
directory: "/"
schedule:
@@ -57,28 +34,8 @@ updates:
open-pull-requests-limit: 10
reviewers:
- juliushaertl
- luka-nextcloud
- package-ecosystem: composer
directory: "/tests/integration"
schedule:
interval: weekly
day: saturday
time: "03:00"
timezone: Europe/Paris
open-pull-requests-limit: 10
reviewers:
- juliushaertl
- luka-nextcloud
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: weekly
day: saturday
time: "03:00"
timezone: Europe/Paris
open-pull-requests-limit: 10
reviewers:
- juliushaertl
- luka-nextcloud
ignore:
- dependency-name: christophwurst/nextcloud
versions:
- "< 16"
- ">= 15.a"

View File

@@ -1,6 +1,6 @@
* Resolves: # <!-- related github issue -->
* Target version: main
* Target version: master
### Summary

25
.github/stale.yml vendored Normal file
View File

@@ -0,0 +1,25 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- "1. to develop"
- "2. developing"
- "3. to review"
- "discussion"
- "bounty"
- "bug"
- "enhancement"
# Limit the number of actions per hour, from 1-30. Default is 30
limitPerRun: 30
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.

View File

@@ -1,43 +1,39 @@
name: Package build
on:
push:
branches:
- main
- master
- stable*
pull_request:
jobs:
build:
runs-on: ubuntu-latest
runs-on: ubuntu-18.04
strategy:
matrix:
node-version: [16.x]
node-version: [14.x]
steps:
- uses: actions/checkout@v4.1.1
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4.0.2
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Set up npm7
run: npm i -g npm@7
- name: Setup PHP
uses: shivammathur/setup-php@2.30.0
uses: shivammathur/setup-php@v1
with:
php-version: '7.4'
tools: composer
- name: install dependencies
run: |
wget https://github.com/ChristophWurst/krankerl/releases/download/v0.14.0/krankerl_0.14.0_amd64.deb
sudo dpkg -i krankerl_0.14.0_amd64.deb
wget https://github.com/ChristophWurst/krankerl/releases/download/v0.12.2/krankerl_0.12.2_amd64.deb
sudo dpkg -i krankerl_0.12.2_amd64.deb
- name: package
run: |
uname -a
RUST_BACKTRACE=1 krankerl --version
RUST_BACKTRACE=1 krankerl package
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v2
with:
name: Deck app tarball
path: build/artifacts/deck.tar.gz

View File

@@ -1,169 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Build and publish app release
on:
release:
types: [published]
env:
PHP_VERSION: 8.2
jobs:
build_and_publish:
runs-on: ubuntu-latest
# Only allowed to be run on nextcloud-releases repositories
if: ${{ github.repository_owner == 'nextcloud-releases' }}
steps:
- name: Check actor permission
uses: skjnldsv/check-actor-permission@69e92a3c4711150929bca9fcf34448c5bf5526e7 # v3.0
with:
require: write
- name: Set app env
run: |
# Split and keep last
echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
echo "APP_VERSION=${GITHUB_REF##*/}" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
path: ${{ env.APP_NAME }}
- name: Get appinfo data
id: appinfo
uses: skjnldsv/xpath-action@7e6a7c379d0e9abc8acaef43df403ab4fc4f770c # master
with:
filename: ${{ env.APP_NAME }}/appinfo/info.xml
expression: "//info//dependencies//nextcloud/@min-version"
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.2
id: versions
# Continue if no package.json
continue-on-error: true
with:
path: ${{ env.APP_NAME }}
fallbackNode: '^20'
fallbackNpm: '^9'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
# Skip if no package.json
if: ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v3
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
- name: Set up npm ${{ steps.versions.outputs.npmVersion }}
# Skip if no package.json
if: ${{ steps.versions.outputs.npmVersion }}
run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"
- name: Set up php ${{ env.PHP_VERSION }}
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
with:
php-version: ${{ env.PHP_VERSION }}
coverage: none
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check composer.json
id: check_composer
uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v2
with:
files: "${{ env.APP_NAME }}/composer.json"
- name: Install composer dependencies
if: steps.check_composer.outputs.files_exists == 'true'
run: |
cd ${{ env.APP_NAME }}
composer install --no-dev
- name: Build ${{ env.APP_NAME }}
# Skip if no package.json
if: ${{ steps.versions.outputs.nodeVersion }}
env:
CYPRESS_INSTALL_BINARY: 0
run: |
cd ${{ env.APP_NAME }}
npm ci
npm run build
- name: Check Krankerl config
id: krankerl
uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v2
with:
files: ${{ env.APP_NAME }}/krankerl.toml
- name: Install Krankerl
if: steps.krankerl.outputs.files_exists == 'true'
run: |
wget https://github.com/ChristophWurst/krankerl/releases/download/v0.14.0/krankerl_0.14.0_amd64.deb
sudo dpkg -i krankerl_0.14.0_amd64.deb
- name: Package ${{ env.APP_NAME }} ${{ env.APP_VERSION }} with krankerl
if: steps.krankerl.outputs.files_exists == 'true'
run: |
cd ${{ env.APP_NAME }}
krankerl package
- name: Package ${{ env.APP_NAME }} ${{ env.APP_VERSION }} with makefile
if: steps.krankerl.outputs.files_exists != 'true'
run: |
cd ${{ env.APP_NAME }}
make appstore
- name: Checkout server ${{ fromJSON(steps.appinfo.outputs.result).nextcloud.min-version }}
continue-on-error: true
id: server-checkout
run: |
NCVERSION=${{ fromJSON(steps.appinfo.outputs.result).nextcloud.min-version }}
wget --quiet https://download.nextcloud.com/server/releases/latest-$NCVERSION.zip
unzip latest-$NCVERSION.zip
- name: Checkout server master fallback
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
if: ${{ steps.server-checkout.outcome != 'success' }}
with:
submodules: true
repository: nextcloud/server
path: nextcloud
- name: Sign app
run: |
# Extracting release
cd ${{ env.APP_NAME }}/build/artifacts
tar -xvf ${{ env.APP_NAME }}.tar.gz
cd ../../../
# Setting up keys
echo "${{ secrets.APP_PRIVATE_KEY }}" > ${{ env.APP_NAME }}.key
wget --quiet "https://github.com/nextcloud/app-certificate-requests/raw/master/${{ env.APP_NAME }}/${{ env.APP_NAME }}.crt"
# Signing
php nextcloud/occ integrity:sign-app --privateKey=../${{ env.APP_NAME }}.key --certificate=../${{ env.APP_NAME }}.crt --path=../${{ env.APP_NAME }}/build/artifacts/${{ env.APP_NAME }}
# Rebuilding archive
cd ${{ env.APP_NAME }}/build/artifacts
tar -zcvf ${{ env.APP_NAME }}.tar.gz ${{ env.APP_NAME }}
- name: Attach tarball to github release
uses: svenstaro/upload-release-action@04733e069f2d7f7f0b4aebc4fbdbce8613b03ccd # v2
id: attach_to_release
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ${{ env.APP_NAME }}/build/artifacts/${{ env.APP_NAME }}.tar.gz
asset_name: ${{ env.APP_NAME }}-${{ env.APP_VERSION }}.tar.gz
tag: ${{ github.ref }}
overwrite: true
- name: Upload app to Nextcloud appstore
uses: nextcloud-releases/nextcloud-appstore-push-action@a011fe619bcf6e77ddebc96f9908e1af4071b9c1 # v1
with:
app_name: ${{ env.APP_NAME }}
appstore_token: ${{ secrets.APPSTORE_TOKEN }}
download_url: ${{ steps.attach_to_release.outputs.browser_download_url }}
app_private_key: ${{ secrets.APP_PRIVATE_KEY }}

View File

@@ -1,51 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Rebase command
on:
issue_comment:
types: created
permissions:
contents: read
jobs:
rebase:
runs-on: ubuntu-latest
permissions:
contents: none
# On pull requests and if the comment starts with `/rebase`
if: github.event.issue.pull_request != '' && startsWith(github.event.comment.body, '/rebase')
steps:
- name: Add reaction on start
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
repository: ${{ github.event.repository.full_name }}
comment-id: ${{ github.event.comment.id }}
reaction-type: "+1"
- name: Checkout the latest code
uses: actions/checkout@v4.1.1 # v3.5.2
with:
fetch-depth: 0
token: ${{ secrets.COMMAND_BOT_PAT }}
- name: Automatic Rebase
uses: cirrus-actions/rebase@b87d48154a87a85666003575337e27b8cd65f691 # 1.8
env:
GITHUB_TOKEN: ${{ secrets.COMMAND_BOT_PAT }}
- name: Add reaction on failure
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
if: failure()
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
repository: ${{ github.event.repository.full_name }}
comment-id: ${{ github.event.comment.id }}
reaction-type: "-1"

View File

@@ -1,122 +0,0 @@
name: Cypress
on:
pull_request:
push:
branches:
- main
- stable*
env:
APP_NAME: deck
CYPRESS_baseUrl: http://localhost:8081/index.php
jobs:
cypress:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: [20.x]
# containers: [1, 2, 3]
php-versions: [ '8.0' ]
databases: [ 'sqlite' ]
server-versions: [ 'stable29' ]
steps:
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4.0.2
with:
node-version: ${{ matrix.node-version }}
- name: Register text Git reference
run: |
text_app_ref="$(if [ "${{ matrix.server-versions }}" = "master" ]; then echo -n "main"; else echo -n "${{ matrix.server-versions }}"; fi)"
echo "text_app_ref=$text_app_ref" >> $GITHUB_ENV
- name: Checkout server
uses: actions/checkout@v4.1.1
with:
repository: nextcloud/server
ref: ${{ matrix.server-versions }}
- name: Checkout submodules
shell: bash
run: |
auth_header="$(git config --local --get http.https://github.com/.extraheader)"
git submodule sync --recursive
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
- name: Checkout ${{ env.APP_NAME }}
uses: actions/checkout@v4.1.1
with:
path: apps/${{ env.APP_NAME }}
- name: Checkout text
uses: actions/checkout@v4.1.1
with:
repository: nextcloud/text
ref: ${{ env.text_app_ref }}
path: apps/text
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@2.30.0
with:
php-version: ${{ matrix.php-versions }}
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, zip, gd, apcu
ini-values:
apc.enable_cli=on
coverage: none
- name: Set up Nextcloud
env:
DB_PORT: 4444
PHP_CLI_SERVER_WORKERS: 10
run: |
mkdir data
php occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
php occ config:system:set memcache.local --value="\\OC\\Memcache\\APCu"
php occ config:system:set debug --value=true --type=boolean
php -f index.php
php -S 0.0.0.0:8081 &
export OC_PASS=1234561
php occ user:add --password-from-env user1
php occ user:add --password-from-env user2
php occ app:enable deck
php occ app:list
cd apps/deck
composer install --no-dev
npm ci
npm run build
cd ../../
curl -v http://localhost:8081/index.php/login
- name: Cypress run
uses: cypress-io/github-action@v6
with:
record: false
parallel: false
wait-on: '${{ env.CYPRESS_baseUrl }}'
working-directory: 'apps/${{ env.APP_NAME }}'
config: defaultCommandTimeout=10000,video=false
env:
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
npm_package_name: ${{ env.APP_NAME }}
- name: Upload test failure screenshots
uses: actions/upload-artifact@v4
if: failure()
with:
name: Upload screenshots
path: apps/${{ env.APP_NAME }}/cypress/screenshots/
retention-days: 5
- name: Upload nextcloud logs
uses: actions/upload-artifact@v4
if: failure()
with:
name: Upload nextcloud log
path: data/nextcloud.log
retention-days: 5

View File

@@ -1,40 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Dependabot
on:
pull_request_target:
branches:
- main
- master
- stable*
permissions:
contents: read
concurrency:
group: dependabot-approve-merge-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
auto-approve-merge:
if: github.actor == 'dependabot[bot]'
runs-on: ubuntu-latest
permissions:
# for hmarr/auto-approve-action to approve PRs
pull-requests: write
steps:
# Github actions bot approve
- uses: hmarr/auto-approve-action@b40d6c9ed2fa10c9a2749eca7eb004418a705501 # v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
# Nextcloud bot approve and merge request
- uses: ahmadnassri/action-dependabot-auto-merge@45fc124d949b19b6b8bf6645b6c9d55f4f9ac61a # v2
with:
target: minor
github-token: ${{ secrets.DEPENDABOT_AUTOMERGE_TOKEN }}

View File

@@ -1,33 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Block fixup and squash commits
on:
pull_request:
types: [opened, ready_for_review, reopened, synchronize]
permissions:
contents: read
concurrency:
group: fixup-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
commit-message-check:
if: github.event.pull_request.draft == false
permissions:
pull-requests: write
name: Block fixup and squash commits
runs-on: ubuntu-latest
steps:
- name: Run check
uses: skjnldsv/block-fixup-merge-action@42d26e1b536ce61e5cf467d65fb76caf4aa85acf # v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -2,17 +2,8 @@ name: Integration tests
on:
pull_request:
paths:
- '.github/workflows/integration.yml'
- 'appinfo/**'
- 'lib/**'
- 'templates/**'
- 'tests/**'
- 'composer.json'
- 'composer.lock'
push:
branches:
- main
- master
- stable*
@@ -26,15 +17,15 @@ jobs:
strategy:
fail-fast: false
matrix:
php-versions: ['8.1']
php-versions: ['7.4']
databases: ['sqlite', 'mysql', 'pgsql']
server-versions: ['stable29']
server-versions: ['stable22']
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
services:
postgres:
image: postgres:14
image: postgres
ports:
- 4445:5432/tcp
env:
@@ -52,7 +43,7 @@ jobs:
steps:
- name: Checkout server
uses: actions/checkout@v4.1.1
uses: actions/checkout@v2
with:
repository: nextcloud/server
ref: ${{ matrix.server-versions }}
@@ -63,32 +54,23 @@ jobs:
auth_header="$(git config --local --get http.https://github.com/.extraheader)"
git submodule sync --recursive
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
cd build/integration && composer require --dev phpunit/phpunit:~9
- name: Checkout app
uses: actions/checkout@v4.1.1
uses: actions/checkout@v2
with:
path: apps/${{ env.APP_NAME }}
- name: Checkout activity
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
repository: nextcloud/activity
ref: ${{ matrix.server-versions }}
path: apps/activity
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@2.30.0
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, mysql, pdo_mysql, pgsql, pdo_pgsql, apcu
ini-values:
apc.enable_cli=on
tools: phpunit
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, mysql, pdo_mysql, pgsql, pdo_pgsql,
coverage: none
- name: Set up dependencies
- name: Set up PHPUnit
working-directory: apps/${{ env.APP_NAME }}
run: composer i --no-dev
run: composer i
- name: Set up Nextcloud
run: |
@@ -99,63 +81,11 @@ jobs:
fi
mkdir data
./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
./occ config:system:set hashing_default_password --value=true --type=boolean
./occ config:system:set memcache.local --value="\\OC\\Memcache\\APCu"
./occ config:system:set memcache.distributed --value="\\OC\\Memcache\\APCu"
cat config/config.php
./occ user:list
./occ app:enable --force ${{ env.APP_NAME }}
./occ config:system:set query_log_file --value "$PWD/query.log"
php -S localhost:8080 &
- name: Run behat
working-directory: apps/${{ env.APP_NAME }}/tests/integration
run: ./run.sh
- name: Query count
if: ${{ matrix.databases == 'mysql' }}
uses: actions/github-script@v7
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
let myOutput = ''
let myError = ''
const options = {}
options.listeners = {
stdout: (data) => {
myOutput += data.toString()
},
stderr: (data) => {
myError += data.toString()
}
}
await exec.exec(`/bin/bash -c "cat query.log | wc -l"`, [], options)
msg = myOutput
const queryCount = parseInt(myOutput, 10)
myOutput = ''
await exec.exec('cat', ['apps/${{ env.APP_NAME }}/tests/integration/base-query-count.txt'], options)
const baseCount = parseInt(myOutput, 10)
const absoluteIncrease = queryCount - baseCount
const relativeIncrease = baseCount <= 0 ? 100 : (parseInt((absoluteIncrease / baseCount * 10000), 10) / 100)
if (absoluteIncrease >= 100 || relativeIncrease > 5) {
const comment = `🐢 Performance warning.\nIt looks like the query count of the integration tests increased with this PR.\nDatabase query count is now ` + queryCount + ' was ' + baseCount + ' (+' + relativeIncrease + '%)\nPlease check your code again. If you added a new test this can be expected and the base value in tests/integration/base-query-count.txt can be increased.'
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: comment
})
}
if (queryCount < 100) {
const comment = `🐈 Performance messuring seems broken. Failed to get query count.`
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: comment
})
}

View File

@@ -1,95 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
#
# Use lint-eslint together with lint-eslint-when-unrelated to make eslint a required check for GitHub actions
# https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks
name: Lint eslint
on: pull_request
permissions:
contents: read
concurrency:
group: lint-eslint-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-latest
outputs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: changes
continue-on-error: true
with:
filters: |
src:
- '.github/workflows/**'
- 'src/**'
- 'appinfo/info.xml'
- 'package.json'
- 'package-lock.json'
- 'tsconfig.json'
- '.eslintrc.*'
- '.eslintignore'
- '**.js'
- '**.ts'
- '**.vue'
lint:
runs-on: ubuntu-latest
needs: changes
if: needs.changes.outputs.src != 'false'
name: NPM lint
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.2
id: versions
with:
fallbackNode: '^20'
fallbackNpm: '^9'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v3
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
- name: Set up npm ${{ steps.versions.outputs.npmVersion }}
run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"
- name: Install dependencies
env:
CYPRESS_INSTALL_BINARY: 0
PUPPETEER_SKIP_DOWNLOAD: true
run: npm ci
- name: Lint
run: npm run lint
summary:
permissions:
contents: none
runs-on: ubuntu-latest
needs: [changes, lint]
if: always()
# This is the summary, we just avoid to rename it so that branch protection rules still match
name: eslint
steps:
- name: Summary status
run: if ${{ needs.changes.outputs.src != 'false' && needs.lint.result != 'success' }}; then exit 1; fi

View File

@@ -1,40 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Lint php-cs
on: pull_request
permissions:
contents: read
concurrency:
group: lint-php-cs-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
lint:
runs-on: ubuntu-latest
name: php-cs
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up php8.2
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
with:
php-version: 8.2
coverage: none
ini-file: development
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Install dependencies
run: composer i
- name: Lint
run: composer run cs:check || ( echo 'Please run `composer run cs:fix` to format your code' && exit 1 )

View File

@@ -1,54 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Lint php
on: pull_request
permissions:
contents: read
concurrency:
group: lint-php-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
php-lint:
runs-on: ubuntu-latest
strategy:
matrix:
php-versions: [ '8.0', '8.1', '8.2', '8.3' ]
name: php-lint
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
with:
php-version: ${{ matrix.php-versions }}
coverage: none
ini-file: development
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Lint
run: composer run lint
summary:
permissions:
contents: none
runs-on: ubuntu-latest
needs: php-lint
if: always()
name: php-lint-summary
steps:
- name: Summary status
run: if ${{ needs.php-lint.result != 'success' && needs.php-lint.result != 'skipped' }}; then exit 1; fi

View File

@@ -1,48 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Lint stylelint
on: pull_request
permissions:
contents: read
concurrency:
group: lint-stylelint-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
lint:
runs-on: ubuntu-latest
name: stylelint
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.2
id: versions
with:
fallbackNode: '^20'
fallbackNpm: '^9'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v3
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
- name: Set up npm ${{ steps.versions.outputs.npmVersion }}
run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"
- name: Install dependencies
env:
CYPRESS_INSTALL_BINARY: 0
run: npm ci
- name: Lint
run: npm run stylelint

88
.github/workflows/lint.yml vendored Normal file
View File

@@ -0,0 +1,88 @@
name: Lint
on:
pull_request:
push:
branches:
- master
- stable*
jobs:
php:
runs-on: ubuntu-latest
strategy:
matrix:
php-versions: ['7.2', '7.3', '7.4']
name: php${{ matrix.php-versions }} lint
steps:
- uses: actions/checkout@v2
- name: Set up php${{ matrix.php-versions }}
uses: shivammathur/setup-php@v1
with:
php-version: ${{ matrix.php-versions }}
coverage: none
- name: Lint
run: composer run lint
php-cs-fixer:
name: php-cs check
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master
- name: Set up php
uses: shivammathur/setup-php@master
with:
php-version: 7.4
coverage: none
- name: Install dependencies
run: composer i
- name: Run coding standards check
run: composer run cs:check
node:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x]
steps:
- uses: actions/checkout@v2
- name: Use node ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Set up npm7
run: npm i -g npm@7
- name: Install dependencies
run: npm ci
- name: ESLint
run: npm run lint
stylelint:
runs-on: ubuntu-latest
strategy:
matrix:
node-versions: [14.x]
name: stylelint node${{ matrix.node-versions }}
steps:
- uses: actions/checkout@v2
- name: Set up node ${{ matrix.node-versions }}
uses: actions/setup-node@v1
with:
node-versions: ${{ matrix.node-versions }}
- name: Set up npm7
run: npm i -g npm@7
- name: Install dependencies
run: npm ci
- name: Lint
run: npm run stylelint

64
.github/workflows/nightly.yml vendored Normal file
View File

@@ -0,0 +1,64 @@
name: Package nightly
on:
push:
branches:
- nightly
schedule:
- cron: '0 1 * * *' # run at 2 AM UTC
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x]
steps:
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Set up npm7
run: npm i -g npm@7
- name: Setup PHP
uses: shivammathur/setup-php@v1
with:
php-version: '7.4'
tools: composer
- name: install dependencies
run: |
wget https://github.com/ChristophWurst/krankerl/releases/download/v0.12.2/krankerl_0.12.2_amd64.deb
sudo dpkg -i krankerl_0.12.2_amd64.deb
- name: package
run: |
uname -a
RUST_BACKTRACE=1 krankerl --version
RUST_BACKTRACE=1 krankerl package
- name: Set git config
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git tag -f nightly
- name: Push tag
uses: juliushaertl/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
tags: true
force: true
- name: Create Release
id: create_release
uses: juliushaertl/action-release@master
with:
token: ${{ secrets.GITHUB_TOKEN }}
tag: nightly
files: ./build/artifacts/deck.tar.gz
name: Nightly build
body: |
Nightly release of deck
draft: false
prerelease: true
overwrite: true

View File

@@ -12,9 +12,9 @@ jobs:
node-version: [14.x]
steps:
- uses: actions/checkout@v4.1.1
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4.0.2
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Set up npm7

View File

@@ -1,73 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Npm audit fix and compile
on:
workflow_dispatch:
schedule:
# At 2:30 on Sundays
- cron: '30 2 * * 0'
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
branches: ['main', 'master', 'stable28', 'stable27', 'stable26']
name: npm-audit-fix-${{ matrix.branches }}
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
ref: ${{ matrix.branches }}
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.2
id: versions
with:
fallbackNode: '^20'
fallbackNpm: '^9'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v3
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
- name: Set up npm ${{ steps.versions.outputs.npmVersion }}
run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"
- name: Fix npm audit
run: |
npm audit fix
- name: Run npm ci and npm run build
if: always()
env:
CYPRESS_INSTALL_BINARY: 0
run: |
npm ci
npm run build --if-present
- name: Create Pull Request
if: always()
uses: peter-evans/create-pull-request@70a41aba780001da0a30141984ae2a0c95d8704e # v5
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: "chore(deps): fix npm audit"
committer: GitHub <noreply@github.com>
author: nextcloud-command <nextcloud-command@users.noreply.github.com>
signoff: true
branch: automated/noid/${{ matrix.branches }}-fix-npm-audit
title: "[${{ matrix.branches }}] Fix npm audit"
body: |
Auto-generated fix of npm audit
labels: |
dependencies
3. to review

View File

@@ -1,185 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: PHPUnit MySQL
on: pull_request
permissions:
contents: read
concurrency:
group: phpunit-mysql-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
matrix:
runs-on: ubuntu-latest-low
outputs:
matrix: ${{ steps.versions.outputs.sparse-matrix }}
steps:
- name: Checkout app
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Get version matrix
id: versions
uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1
with:
matrix: '{"mysql-versions": ["8.1"]}'
changes:
runs-on: ubuntu-latest-low
outputs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: changes
continue-on-error: true
with:
filters: |
src:
- '.github/workflows/**'
- 'appinfo/**'
- 'lib/**'
- 'templates/**'
- 'tests/**'
- 'vendor/**'
- 'vendor-bin/**'
- '.php-cs-fixer.dist.php'
- 'composer.json'
- 'composer.lock'
phpunit-mysql:
runs-on: ubuntu-latest
needs: [changes, matrix]
if: needs.changes.outputs.src != 'false'
strategy:
matrix: ${{ fromJson(needs.matrix.outputs.matrix) }}
name: MySQL ${{ matrix.mysql-versions }} PHP ${{ matrix.php-versions }} Nextcloud ${{ matrix.server-versions }}
services:
mysql:
image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest
ports:
- 4444:3306/tcp
env:
MYSQL_ROOT_PASSWORD: rootpassword
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10
steps:
- name: Set app env
run: |
# Split and keep last
echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
- name: Checkout server
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
submodules: true
repository: nextcloud/server
ref: ${{ matrix.server-versions }}
- name: Checkout app
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, mysql, pdo_mysql
coverage: none
ini-file: development
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Enable ONLY_FULL_GROUP_BY MySQL option
run: |
echo "SET GLOBAL sql_mode=(SELECT CONCAT(@@sql_mode,',ONLY_FULL_GROUP_BY'));" | mysql -h 127.0.0.1 -P 4444 -u root -prootpassword
echo "SELECT @@sql_mode;" | mysql -h 127.0.0.1 -P 4444 -u root -prootpassword
- name: Check composer file existence
id: check_composer
uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0
with:
files: apps/${{ env.APP_NAME }}/composer.json
- name: Set up dependencies
# Only run if phpunit config file exists
if: steps.check_composer.outputs.files_exists == 'true'
working-directory: apps/${{ env.APP_NAME }}
run: composer i
- name: Set up Nextcloud
env:
DB_PORT: 4444
run: |
mkdir data
./occ maintenance:install --verbose --database=mysql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
./occ app:enable --force ${{ env.APP_NAME }}
- name: Check PHPUnit script is defined
id: check_phpunit
continue-on-error: true
working-directory: apps/${{ env.APP_NAME }}
run: |
composer run --list | grep "^ test:unit " | wc -l | grep 1
- name: PHPUnit
# Only run if phpunit config file exists
if: steps.check_phpunit.outcome == 'success'
working-directory: apps/${{ env.APP_NAME }}
run: composer run test:unit
- name: Check PHPUnit integration script is defined
id: check_integration
continue-on-error: true
working-directory: apps/${{ env.APP_NAME }}
run: |
composer run --list | grep "^ test:integration " | wc -l | grep 1
- name: Run Nextcloud
# Only run if phpunit integration config file exists
if: steps.check_integration.outcome == 'success'
run: php -S localhost:8080 &
- name: PHPUnit integration
# Only run if phpunit integration config file exists
if: steps.check_integration.outcome == 'success'
working-directory: apps/${{ env.APP_NAME }}
run: composer run test:integration
- name: Print logs
if: always()
run: |
cat data/nextcloud.log
- name: Skipped
# Fail the action when neither unit nor integration tests ran
if: steps.check_phpunit.outcome == 'failure' && steps.check_integration.outcome == 'failure'
run: |
echo 'Neither PHPUnit nor PHPUnit integration tests are specified in composer.json scripts'
exit 1
summary:
permissions:
contents: none
runs-on: ubuntu-latest-low
needs: [changes, phpunit-mysql]
if: always()
name: phpunit-mysql-summary
steps:
- name: Summary status
run: if ${{ needs.changes.outputs.src != 'false' && needs.phpunit-mysql.result != 'success' }}; then exit 1; fi

View File

@@ -1,168 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: PHPUnit pgsql
on: pull_request
permissions:
contents: read
concurrency:
group: phpunit-pgsql-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-latest
outputs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: changes
continue-on-error: true
with:
filters: |
src:
- '.github/workflows/**'
- 'appinfo/**'
- 'lib/**'
- 'templates/**'
- 'tests/**'
- 'vendor/**'
- 'vendor-bin/**'
- '.php-cs-fixer.dist.php'
- 'composer.json'
- 'composer.lock'
phpunit-pgsql:
runs-on: ubuntu-latest
needs: changes
if: needs.changes.outputs.src != 'false'
strategy:
matrix:
php-versions: ['8.2']
server-versions: ['stable29']
services:
postgres:
image: ghcr.io/nextcloud/continuous-integration-postgres-14:latest
ports:
- 4444:5432/tcp
env:
POSTGRES_USER: root
POSTGRES_PASSWORD: rootpassword
POSTGRES_DB: nextcloud
options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5
steps:
- name: Set app env
run: |
# Split and keep last
echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
- name: Checkout server
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
submodules: true
repository: nextcloud/server
ref: ${{ matrix.server-versions }}
- name: Checkout app
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, pgsql, pdo_pgsql
coverage: none
ini-file: development
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check composer file existence
id: check_composer
uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v2
with:
files: apps/${{ env.APP_NAME }}/composer.json
- name: Set up dependencies
# Only run if phpunit config file exists
if: steps.check_composer.outputs.files_exists == 'true'
working-directory: apps/${{ env.APP_NAME }}
run: composer i
- name: Set up Nextcloud
env:
DB_PORT: 4444
run: |
mkdir data
./occ maintenance:install --verbose --database=pgsql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
./occ app:enable --force ${{ env.APP_NAME }}
- name: Check PHPUnit script is defined
id: check_phpunit
continue-on-error: true
working-directory: apps/${{ env.APP_NAME }}
run: |
composer run --list | grep "^ test:unit " | wc -l | grep 1
- name: PHPUnit
# Only run if phpunit config file exists
if: steps.check_phpunit.outcome == 'success'
working-directory: apps/${{ env.APP_NAME }}
run: composer run test:unit
- name: Check PHPUnit integration script is defined
id: check_integration
continue-on-error: true
working-directory: apps/${{ env.APP_NAME }}
run: |
composer run --list | grep "^ test:integration " | wc -l | grep 1
- name: Run Nextcloud
# Only run if phpunit integration config file exists
if: steps.check_integration.outcome == 'success'
run: php -S localhost:8080 &
- name: PHPUnit integration
# Only run if phpunit integration config file exists
if: steps.check_integration.outcome == 'success'
working-directory: apps/${{ env.APP_NAME }}
run: composer run test:integration
- name: Print logs
if: always()
run: |
cat data/nextcloud.log
- name: Skipped
# Fail the action when neither unit nor integration tests ran
if: steps.check_phpunit.outcome == 'failure' && steps.check_integration.outcome == 'failure'
run: |
echo 'Neither PHPUnit nor PHPUnit integration tests are specified in composer.json scripts'
exit 1
summary:
permissions:
contents: none
runs-on: ubuntu-latest
needs: [changes, phpunit-pgsql]
if: always()
name: phpunit-pgsql-summary
steps:
- name: Summary status
run: if ${{ needs.changes.outputs.src != 'false' && needs.phpunit-pgsql.result != 'success' }}; then exit 1; fi

View File

@@ -1,157 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: PHPUnit sqlite
on: pull_request
permissions:
contents: read
concurrency:
group: phpunit-sqlite-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-latest
outputs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: changes
continue-on-error: true
with:
filters: |
src:
- '.github/workflows/**'
- 'appinfo/**'
- 'lib/**'
- 'templates/**'
- 'tests/**'
- 'vendor/**'
- 'vendor-bin/**'
- '.php-cs-fixer.dist.php'
- 'composer.json'
- 'composer.lock'
phpunit-sqlite:
runs-on: ubuntu-latest
needs: changes
if: needs.changes.outputs.src != 'false'
strategy:
matrix:
php-versions: ['8.2']
server-versions: ['stable29']
steps:
- name: Set app env
run: |
# Split and keep last
echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
- name: Checkout server
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
submodules: true
repository: nextcloud/server
ref: ${{ matrix.server-versions }}
- name: Checkout app
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
coverage: none
ini-file: development
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check composer file existence
id: check_composer
uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v2
with:
files: apps/${{ env.APP_NAME }}/composer.json
- name: Set up dependencies
# Only run if phpunit config file exists
if: steps.check_composer.outputs.files_exists == 'true'
working-directory: apps/${{ env.APP_NAME }}
run: composer i
- name: Set up Nextcloud
env:
DB_PORT: 4444
run: |
mkdir data
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
./occ app:enable --force ${{ env.APP_NAME }}
- name: Check PHPUnit script is defined
id: check_phpunit
continue-on-error: true
working-directory: apps/${{ env.APP_NAME }}
run: |
composer run --list | grep "^ test:unit " | wc -l | grep 1
- name: PHPUnit
# Only run if phpunit config file exists
if: steps.check_phpunit.outcome == 'success'
working-directory: apps/${{ env.APP_NAME }}
run: composer run test:unit
- name: Check PHPUnit integration script is defined
id: check_integration
continue-on-error: true
working-directory: apps/${{ env.APP_NAME }}
run: |
composer run --list | grep "^ test:integration " | wc -l | grep 1
- name: Run Nextcloud
# Only run if phpunit integration config file exists
if: steps.check_integration.outcome == 'success'
run: php -S localhost:8080 &
- name: PHPUnit integration
# Only run if phpunit integration config file exists
if: steps.check_integration.outcome == 'success'
working-directory: apps/${{ env.APP_NAME }}
run: composer run test:integration
- name: Print logs
if: always()
run: |
cat data/nextcloud.log
- name: Skipped
# Fail the action when neither unit nor integration tests ran
if: steps.check_phpunit.outcome == 'failure' && steps.check_integration.outcome == 'failure'
run: |
echo 'Neither PHPUnit nor PHPUnit integration tests are specified in composer.json scripts'
exit 1
summary:
permissions:
contents: none
runs-on: ubuntu-latest
needs: [changes, phpunit-sqlite]
if: always()
name: phpunit-sqlite-summary
steps:
- name: Summary status
run: if ${{ needs.changes.outputs.src != 'false' && needs.phpunit-sqlite.result != 'success' }}; then exit 1; fi

94
.github/workflows/phpunit.yml vendored Normal file
View File

@@ -0,0 +1,94 @@
name: PHPUnit
on:
pull_request:
push:
branches:
- master
- stable*
env:
APP_NAME: deck
jobs:
integration:
runs-on: ubuntu-18.04
strategy:
fail-fast: false
matrix:
php-versions: ['7.3', '7.4']
databases: ['sqlite', 'mysql', 'pgsql']
server-versions: ['stable22']
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
services:
postgres:
image: postgres
ports:
- 4445:5432/tcp
env:
POSTGRES_USER: root
POSTGRES_PASSWORD: rootpassword
POSTGRES_DB: nextcloud
options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5
mysql:
image: mariadb:10.5
ports:
- 4444:3306/tcp
env:
MYSQL_ROOT_PASSWORD: rootpassword
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 5
steps:
- name: Checkout server
uses: actions/checkout@v2
with:
repository: nextcloud/server
ref: ${{ matrix.server-versions }}
- name: Checkout submodules
shell: bash
run: |
auth_header="$(git config --local --get http.https://github.com/.extraheader)"
git submodule sync --recursive
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
- name: Checkout app
uses: actions/checkout@v2
with:
path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit
extensions: zip, gd, mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, mysql, pdo_mysql, pgsql, pdo_pgsql
coverage: none
- name: Set up PHPUnit
working-directory: apps/${{ env.APP_NAME }}
run: composer i
- name: Set up Nextcloud
run: |
if [ "${{ matrix.databases }}" = "mysql" ]; then
export DB_PORT=4444
elif [ "${{ matrix.databases }}" = "pgsql" ]; then
export DB_PORT=4445
fi
mkdir data
./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
./occ app:enable --force ${{ env.APP_NAME }}
php -S localhost:8080 &
- name: PHPUnit
working-directory: apps/${{ env.APP_NAME }}
run: ./vendor/phpunit/phpunit/phpunit -c tests/phpunit.xml
- name: PHPUnit integration
working-directory: apps/${{ env.APP_NAME }}
run: ./vendor/phpunit/phpunit/phpunit -c tests/phpunit.integration.xml

View File

@@ -1,34 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: 'Ask for feedback on PRs'
on:
schedule:
- cron: '30 1 * * *'
jobs:
pr-feedback:
runs-on: ubuntu-latest
steps:
- name: The get-github-handles-from-website action
uses: marcelklehr/get-github-handles-from-website-action@a739600f6b91da4957f51db0792697afbb2f143c # v1.0.0
id: scrape
with:
website: 'https://nextcloud.com/team/'
- uses: marcelklehr/pr-feedback-action@601109aa729eb4c8d6d0ece7567b9d4901db4aef
with:
feedback-message: |
Hello there,
Thank you so much for taking the time and effort to create a pull request to our Nextcloud project.
We hope that the review process is going smooth and is helpful for you. We want to ensure your pull request is reviewed to your satisfaction. If you have a moment, our community management team would very much appreciate your feedback on your experience with this PR review process.
Your feedback is valuable to us as we continuously strive to improve our community developer experience. Please take a moment to complete our short survey by clicking on the following link: https://cloud.nextcloud.com/apps/forms/s/i9Ago4EQRZ7TWxjfmeEpPkf6
Thank you for contributing to Nextcloud and we hope to hear from you soon!
days-before-feedback: 14
start-date: "2023-07-10"
exempt-authors: "${{ steps.scrape.outputs.users }},nextcloud-command,nextcloud-android-bot,skjnldsv,datenangebot"
exempt-bots: true

View File

@@ -1,36 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Static analysis
on: pull_request
concurrency:
group: psalm-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
static-analysis:
runs-on: ubuntu-latest
name: static-psalm-analysis
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up php8.2
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
with:
php-version: 8.2
coverage: none
ini-file: development
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Install dependencies
run: composer i
- name: Run coding standards check
run: composer run psalm

31
.github/workflows/static-analysis.yml vendored Normal file
View File

@@ -0,0 +1,31 @@
name: Static analysis
on:
pull_request:
push:
branches:
- master
- stable*
jobs:
static-psalm-analysis:
runs-on: ubuntu-latest
strategy:
matrix:
ocp-version: [ 'dev-stable22' ]
name: Nextcloud ${{ matrix.ocp-version }}
steps:
- name: Checkout
uses: actions/checkout@master
- name: Set up php
uses: shivammathur/setup-php@master
with:
php-version: 7.4
tools: composer:v1
coverage: none
- name: Install dependencies
run: composer i
- name: Install dependencies
run: composer require --dev christophwurst/nextcloud:${{ matrix.ocp-version }}
- name: Run coding standards check
run: composer run psalm

View File

@@ -1,49 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Auto approve nextcloud/ocp
on:
pull_request_target:
branches:
- main
- master
- stable*
permissions:
contents: read
concurrency:
group: update-nextcloud-ocp-approve-merge-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
auto-approve-merge:
if: github.actor == 'nextcloud-command'
runs-on: ubuntu-latest
permissions:
# for hmarr/auto-approve-action to approve PRs
pull-requests: write
# for alexwilson/enable-github-automerge-action to approve PRs
contents: write
steps:
- uses: mdecoleman/pr-branch-name@bab4c71506bcd299fb350af63bb8e53f2940a599 # v2.0.0
id: branchname
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
# GitHub actions bot approve
- uses: hmarr/auto-approve-action@b40d6c9ed2fa10c9a2749eca7eb004418a705501 # v2
if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp')
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
# Enable GitHub auto merge
- name: Auto merge
uses: alexwilson/enable-github-automerge-action@d8d24b8699d9749aca9279609909abca856457c8 # main
if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp')
with:
github-token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,116 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Update nextcloud/ocp
on:
workflow_dispatch:
schedule:
- cron: "5 2 * * 0"
jobs:
update-nextcloud-ocp:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
branches: ['main', 'master', 'stable28', 'stable27', 'stable26']
name: update-nextcloud-ocp-${{ matrix.branches }}
steps:
- id: checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
ref: ${{ matrix.branches }}
submodules: true
continue-on-error: true
- name: Set up php8.2
if: steps.checkout.outcome == 'success'
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
with:
php-version: 8.2
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
coverage: none
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Read codeowners
if: steps.checkout.outcome == 'success'
id: codeowners
run: |
grep '/appinfo/info.xml' .github/CODEOWNERS | cut -f 2- -d ' ' | xargs | awk '{ print "codeowners="$0 }' >> $GITHUB_OUTPUT
continue-on-error: true
- name: Composer install
if: steps.checkout.outcome == 'success'
run: composer install
- name: Composer update nextcloud/ocp
id: update_branch
if: ${{ steps.checkout.outcome == 'success' && matrix.branches != 'main' }}
run: composer require --dev nextcloud/ocp:dev-${{ matrix.branches }}
- name: Raise on issue on failure
uses: dacbd/create-issue-action@cdb57ab6ff8862aa09fee2be6ba77a59581921c2 # v2.0.0
if: ${{ steps.checkout.outcome == 'success' && failure() && steps.update_branch.conclusion == 'failure' }}
with:
token: ${{ secrets.GITHUB_TOKEN }}
title: Failed to update nextcloud/ocp package on branch ${{ matrix.branches }}
body: Please check the output of the GitHub action and manually resolve the issues<br>${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}<br>${{ steps.codeowners.outputs.codeowners }}
- name: Composer update nextcloud/ocp
id: update_main
if: ${{ steps.checkout.outcome == 'success' && matrix.branches == 'main' }}
run: composer require --dev nextcloud/ocp:dev-master
- name: Raise on issue on failure
uses: dacbd/create-issue-action@cdb57ab6ff8862aa09fee2be6ba77a59581921c2 # v2.0.0
if: ${{ steps.checkout.outcome == 'success' && failure() && steps.update_main.conclusion == 'failure' }}
with:
token: ${{ secrets.GITHUB_TOKEN }}
title: Failed to update nextcloud/ocp package on branch ${{ matrix.branches }}
body: Please check the output of the GitHub action and manually resolve the issues<br>${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}<br>${{ steps.codeowners.outputs.codeowners }}
- name: Reset checkout 3rdparty
if: steps.checkout.outcome == 'success'
run: |
git clean -f 3rdparty
git checkout 3rdparty
continue-on-error: true
- name: Reset checkout vendor
if: steps.checkout.outcome == 'success'
run: |
git clean -f vendor
git checkout vendor
continue-on-error: true
- name: Reset checkout vendor-bin
if: steps.checkout.outcome == 'success'
run: |
git clean -f vendor-bin
git checkout vendor-bin
continue-on-error: true
- name: Create Pull Request
if: steps.checkout.outcome == 'success'
uses: peter-evans/create-pull-request@70a41aba780001da0a30141984ae2a0c95d8704e # v3
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: "chore(dev-deps): Bump nextcloud/ocp package"
committer: GitHub <noreply@github.com>
author: nextcloud-command <nextcloud-command@users.noreply.github.com>
signoff: true
branch: automated/noid/${{ matrix.branches }}-update-nextcloud-ocp
title: "[${{ matrix.branches }}] Update nextcloud/ocp dependency"
body: |
Auto-generated update of [nextcloud/ocp](https://github.com/nextcloud-deps/ocp/) dependency
labels: |
dependencies
3. to review

2
.gitignore vendored
View File

@@ -3,11 +3,9 @@ js/
build/
css/style.css
css/vendor.css
cypress/videos/
tests/integration/vendor/
tests/integration/composer.lock
tests/.phpunit.result.cache
vendor/
.php_cs.cache
\.idea/
settings.json

View File

@@ -1,10 +1,9 @@
[main]
host = https://www.transifex.com
lang_map = hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja, bg_BG: bg, cs_CZ: cs, fi_FI: fi
host = https://www.transifex.com
lang_map = bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja
[o:nextcloud:p:nextcloud:r:deck]
[nextcloud.deck]
file_filter = translationfiles/<lang>/deck.po
source_file = translationfiles/templates/deck.pot
source_lang = en
type = PO
type = PO

View File

@@ -1,404 +1,38 @@
# Changelog
All notable changes to this project will be documented in this file.
## 1.13.6
### Fixed
* [stable29] Clear selected stack when selected board changed by @backportbot in https://github.com/nextcloud/deck/pull/6913
* [stable29] fix: only delete assignments on unshared board by @grnd-alt in https://github.com/nextcloud/deck/pull/6936
* [stable29] fix: Limit label actions to labels of the cards board by @backportbot in https://github.com/nextcloud/deck/pull/6952
### Maintenance
* Chore(deps): Bump @nextcloud/vue from 8.23.1 to 8.24.0 by @dependabot in https://github.com/nextcloud/deck/pull/6880
* Chore(deps): Bump dompurify from 3.2.4 to 3.2.5 by @dependabot in https://github.com/nextcloud/deck/pull/6878
* Chore(deps): Bump @babel/runtime from 7.26.10 to 7.27.0 by @dependabot in https://github.com/nextcloud/deck/pull/6864
* Chore(deps-dev): Bump @nextcloud/webpack-vue-config from 6.2.0 to 6.3.0 by @dependabot in https://github.com/nextcloud/deck/pull/6905
* [stable29] Update nextcloud/ocp dependency by @nextcloud-command in https://github.com/nextcloud/deck/pull/6886
* Chore(deps): Bump @nextcloud/vue from 8.24.0 to 8.25.1 by @dependabot in https://github.com/nextcloud/deck/pull/6927
* Chore(deps): Bump @nextcloud/vue from 8.25.1 to 8.26.0 by @dependabot in https://github.com/nextcloud/deck/pull/6941
* [stable29] Fix npm audit by @nextcloud-command in https://github.com/nextcloud/deck/pull/6949
## 1.13.5
### Fixed
* [stable29] fix: design review issues by @backportbot in https://github.com/nextcloud/deck/pull/6857
### Maintenance
* chore(deps-dev): bump @nextcloud/cypress from 1.0.0-beta.13 to 1.0.0-beta.14 by @dependabot in https://github.com/nextcloud/deck/pull/6783
* chore(deps-dev): bump @nextcloud/eslint-config from 8.4.1 to 8.4.2 by @dependabot in https://github.com/nextcloud/deck/pull/6782
* [stable29] Update nextcloud/ocp dependency by @nextcloud-command in https://github.com/nextcloud/deck/pull/6790
* chore(deps): bump @nextcloud/vue from 8.22.0 to 8.23.1 by @dependabot in https://github.com/nextcloud/deck/pull/6753
* chore(deps): bump @nextcloud/event-bus from 3.3.1 to 3.3.2 by @dependabot in https://github.com/nextcloud/deck/pull/6810
* [stable29] Update nextcloud/ocp dependency by @nextcloud-command in https://github.com/nextcloud/deck/pull/6824
* Chore(deps): Bump @babel/runtime from 7.26.9 to 7.26.10 by @dependabot in https://github.com/nextcloud/deck/pull/6834
* [stable29] Update nextcloud/ocp dependency by @nextcloud-command in https://github.com/nextcloud/deck/pull/6852
## 1.13.4
### Fixed
- fix: skip exporting a deleted card #6721
- fix: Properly show attachment extension #6672
- fix: two close buttons on card modal #6660
- Update TrelloJsonService.php #6645
- fix: close modal after deleting card #6620
- fix: Use new query builder #6614
- fix(sharing): list accounts with matches in email #6525
- Fix npm audit #6568
- Fix npm audit #6491
### Maintenance
- Update nextcloud/ocp dependency #6768
- Update nextcloud/ocp dependency #6737
- Update nextcloud/ocp dependency #6717
- Update nextcloud/ocp dependency #6699
- Update nextcloud/ocp dependency #6655
- Update nextcloud/ocp dependency #6586
## 1.13.3
### Fixed
- fix: board bubble preview widget #6476
### Maintenance
- Fix npm audit #6448
- Fix npm audit #6410
- Update nextcloud/ocp dependency #6384
- Update nextcloud/ocp dependency #6349
## 1.13.2
### Fixed
- fix: Load archived card if URL is opened directly #6325
- copy labels when moving cards between boards #6288
- Translation call fix #6262
- use deleted_users for users that do not exist #6204
- fix: losing focus while editing title field #6161
- fix: remove redundant log #6116
- Fix: incorrect height of editing windows and edit bar #6093
- Update nextcloud/ocp dependency #6301
- Only check path for being accessible when the storage is a object home #6064
### Maintenance
- Fix npm audit #6306
- Fix npm audit #6254
- Fix npm audit #6226
- Fix npm audit #6177
- Update nextcloud/ocp dependency #6197
- Update nextcloud/ocp dependency #6130
- Update nextcloud/ocp dependency #6109
- Update nextcloud/ocp dependency #6060
### Other
- Completed card button wording change #6182
## 1.13.1
### Fixed
- fix: Adjust dependencies to fix filepicker #6038
- Fix npm audit #6028
- Fix npm audit #6001
- fix: Avoid optional before required parameter #5820
- fix: permission check for cloning board #5853
## 1.13.0
## 1.5.0 - 2021-07-09
### Added
- feat: Rename to teams @juliushaertl [#5611](https://github.com/nextcloud/deck/pull/5611)
- feat: Implement a team resource provider @juliushaertl [#5625](https://github.com/nextcloud/deck/pull/5625)
- Interactive board widget @juliushaertl [#5630](https://github.com/nextcloud/deck/pull/5630)
- introduce done and open filters @grnd-alt [#5488](https://github.com/nextcloud/deck/pull/5488)
* Nextcloud 22 compatibility
* [#3105](https://github.com/nextcloud/deck/pull/3105) Compatibility with Cirlces changes in 22
* [#3147](https://github.com/nextcloud/deck/pull/3147) Add card button to the dashboard widget @jakobroehrl
* [#2854](https://github.com/nextcloud/deck/pull/2854) Add card button in card overview @jakobroehrl
* [#3078](https://github.com/nextcloud/deck/pull/3078) Show on shared boards unassigned cards to all users @jakobroehrl
### Fixed
- fixed sorting for upcoming cards @elzody [#5493](https://github.com/nextcloud/deck/pull/5493)
- fix(PermissionService#getPermissions): Catch exceptions from getBoard method @marcelklehr [#5542](https://github.com/nextcloud/deck/pull/5542)
- fix(activity): Fix permission checks when rendering activities in bac… @nickvergessen [#5533](https://github.com/nextcloud/deck/pull/5533)
- fix: Safeguard sync requests to hopefully not spam then server @juliushaertl [#5590](https://github.com/nextcloud/deck/pull/5590)
- fix: card move dialog auto close @luka-nextcloud [#5537](https://github.com/nextcloud/deck/pull/5537)
- fix: Avoid conflicts on deck attachments folder name @juliushaertl [#5703](https://github.com/nextcloud/deck/pull/5703)
- fix: Adapt NcAppSidebar props to new version @backportbot[bot] [#5768](https://github.com/nextcloud/deck/pull/5768)
- Fix tags' display when they are numerous @backportbot[bot] [#5727](https://github.com/nextcloud/deck/pull/5727)
- Clarify config file not found exception message @backportbot[bot] [#5724](https://github.com/nextcloud/deck/pull/5724)
* [#2935](https://github.com/nextcloud/deck/pull/2935) Rich object string parameters for notifications @nickvergessen
* [#2950](https://github.com/nextcloud/deck/pull/2950) Remove notification on unshare and add type hints
* [#2983](https://github.com/nextcloud/deck/pull/2983) Fix codemirror description width
* [#2989](https://github.com/nextcloud/deck/pull/2989) Fix unified comments search with postgres
* [#3005](https://github.com/nextcloud/deck/pull/3005) Do not query the lookupserver when looking for sharees
* [#3011](https://github.com/nextcloud/deck/pull/3011) L10n: Spelling unification @Valdnet
* [#3014](https://github.com/nextcloud/deck/pull/3014) Proper error handling when fetching comments fails
* [#3016](https://github.com/nextcloud/deck/pull/3016) Allow searching for filters without a query to match all that have a given filter set
* [#3021](https://github.com/nextcloud/deck/pull/3021) L10n: Add word "Card" @Valdnet
* [#3025](https://github.com/nextcloud/deck/pull/3025) Show comment counter and highlight if unread comments are available
* [#3036](https://github.com/nextcloud/deck/pull/3036) Add link to migration tool for Trello @maxammann
* [#3037](https://github.com/nextcloud/deck/pull/3037) Catch any error during circle detail fetching
* [#3038](https://github.com/nextcloud/deck/pull/3038) Get attachment from the user node instead of the share source
* [#3092](https://github.com/nextcloud/deck/pull/3092) Refactor update to have proper order of optional parameters
* [#3113](https://github.com/nextcloud/deck/pull/3113) Use new viewer syntax with destructuring object @azul
* [#3142](https://github.com/nextcloud/deck/pull/3142) Always pass user id in share provider
* [#3152](https://github.com/nextcloud/deck/pull/3152) Only offer stack creation in emptycontent with proper permissions
* [#3165](https://github.com/nextcloud/deck/pull/3165) Always log generic exceptions
* [#3168](https://github.com/nextcloud/deck/pull/3168) Reduce duplicate queries when fetching user boards an permissions
### Other
- chore(CI): Adjust testing matrix for Nextcloud 29 on stable29 @nickvergessen [#5711](https://github.com/nextcloud/deck/pull/5711)
## 1.13.0-beta.1
### Added
- feat: Rename to teams @juliushaertl [#5611](https://github.com/nextcloud/deck/pull/5611)
- feat: Implement a team resource provider @juliushaertl [#5625](https://github.com/nextcloud/deck/pull/5625)
- Interactive board widget @juliushaertl [#5630](https://github.com/nextcloud/deck/pull/5630)
### Fixed
- Fix deleted card/board issues @juliushaertl [#5423](https://github.com/nextcloud/deck/pull/5423)
- Fixing #5451 @mintsoft [#5455](https://github.com/nextcloud/deck/pull/5455)
- fix: Add debounce to update due date @juliushaertl [#5458](https://github.com/nextcloud/deck/pull/5458)
- fix(done): Mark card as undone when updating card @stefan-niedermann [#5491](https://github.com/nextcloud/deck/pull/5491)
- fixed sorting for upcoming cards @elzody [#5493](https://github.com/nextcloud/deck/pull/5493)
- fix(PermissionService#getPermissions): Catch exceptions from getBoard method @marcelklehr [#5542](https://github.com/nextcloud/deck/pull/5542)
- fix(activity): Fix permission checks when rendering activities in bac… @nickvergessen [#5533](https://github.com/nextcloud/deck/pull/5533)
- fix: Safeguard sync requests to hopefully not spam then server @juliushaertl [#5590](https://github.com/nextcloud/deck/pull/5590)
- fix: card move dialog auto close @luka-nextcloud [#5537](https://github.com/nextcloud/deck/pull/5537)
- also filter by storage when getting shares in folder @icewind1991 [#5452](https://github.com/nextcloud/deck/pull/5452)
### Other
- fix(i18n): Improved wording @rakekniven [#5496](https://github.com/nextcloud/deck/pull/5496)
## 1.12.0-beta.3
### Added
- feat: Move to contenteditable for inline title editing @juliushaertl [#5282](https://github.com/nextcloud/deck/pull/5282)
### Fixed
- fix: Properly get done state for dav @juliushaertl [#5287](https://github.com/nextcloud/deck/pull/5287)
- Fix upcoming cards and label input @juliushaertl [#5290](https://github.com/nextcloud/deck/pull/5290)
## 1.12.0-beta.2
### Added
- Card layout polishing @juliushaertl [#5264](https://github.com/nextcloud/deck/pull/5264)
### Fixed
- fix: Properly handle adding new tags through multiselect @juliushaertl [#5285](https://github.com/nextcloud/deck/pull/5285)
- fix: Avoid throwing errors if no token provided on close @juliushaertl [#5284](https://github.com/nextcloud/deck/pull/5284)
- fix: Expose card actions in the card menu (fix #3180) [#5280](https://github.com/nextcloud/deck/pull/5280)
- fix: Use full card menu everywhere (fix #3993) [#5280](https://github.com/nextcloud/deck/pull/5280)
- fix: Detect end of the activity responses (fix #3395) [#5280](https://github.com/nextcloud/deck/pull/5280)
- fix: Add title with absolute date time to activity (fix #4508, fix #2122) [#5280](https://github.com/nextcloud/deck/pull/5280)
- fix: Disable dragging archived cards (fix #3271) [#5280](https://github.com/nextcloud/deck/pull/5280)
- fix: Hide unavailable card menu entries for archived card view [#5280](https://github.com/nextcloud/deck/pull/5280)
- fix: Use localCompare to sort labels (fix #2736) [#5280](https://github.com/nextcloud/deck/pull/5280)
- fix: More fitting click target for title editing [#5280](https://github.com/nextcloud/deck/pull/5280)
- fix: Always load proper dashboard js (fixes a log error) [#5280](https://github.com/nextcloud/deck/pull/5280)
- fix: Set fixed height for card modal (fix #4296) [#5280](https://github.com/nextcloud/deck/pull/5280)
- fix: Make sure to always update card description when navigating away (fix #5254 #2705) [#5280](https://github.com/nextcloud/deck/pull/5280)
- perf: Already pass board list as initial state @juliushaertl [#5281](https://github.com/nextcloud/deck/pull/5281)
### Dependencies
- Fix npm audit @nextcloud-command [#5277](https://github.com/nextcloud/deck/pull/5277)
- Update nextcloud/ocp dependency @nextcloud-command [#5275](https://github.com/nextcloud/deck/pull/5275)
- Chore(deps): Bump @nextcloud/dialogs from 4.2.1 to 4.2.2 @dependabot[bot] [#5266](https://github.com/nextcloud/deck/pull/5266)
- Chore(deps-dev): Bump cypress from 13.4.0 to 13.5.0 @dependabot[bot] [#5267](https://github.com/nextcloud/deck/pull/5267)
- Chore(deps): Bump shivammathur/setup-php from 2.27.0 to 2.27.1 @dependabot[bot] [#5268](https://github.com/nextcloud/deck/pull/5268)
## 1.12.0-beta.1
### Added
- Added ability to mark a card as done @TehThanos [#4137](https://github.com/nextcloud/deck/pull/4137)
- Card Cover Images @jszeibert [#5035](https://github.com/nextcloud/deck/pull/5035)
- Upcoming/Today/Tomorrow dashboard widgets @BKapelari [#2658](https://github.com/nextcloud/deck/pull/2658)
- Enabled advanced fields option on tag color picker @faab007nl [#4362](https://github.com/nextcloud/deck/pull/4362)
- Remember last board, list for new card dialog @luka-nextcloud [#5046](https://github.com/nextcloud/deck/pull/5046)
- Add support for bidirectional text @jamazi [#5258](https://github.com/nextcloud/deck/pull/5258)
### Fixed
- Deck card comment notification label improvement @Jerome-Herbinet [#4748](https://github.com/nextcloud/deck/pull/4748)
- update smart picker links @luka-nextcloud [#5047](https://github.com/nextcloud/deck/pull/5047)
- feat: Enhance dark mode @juliushaertl [#5045](https://github.com/nextcloud/deck/pull/5045)
- fix: export doesn't handle lists with no cards @magikmw [#5096](https://github.com/nextcloud/deck/pull/5096)
- add attributes aria-label= and title= to Filters & View Modes buttons @privatemaker [#5133](https://github.com/nextcloud/deck/pull/5133)
- fix: Check both card reference url patterns @juliushaertl [#5262](https://github.com/nextcloud/deck/pull/5262)
- fix: Avoid too large index on postgres as indexing just the last_editor column is enough @juliushaertl [#5260](https://github.com/nextcloud/deck/pull/5260)
- feat: error msg on CreateNewCardCustomPicker & only show available bo… @luka-nextcloud [#5029](https://github.com/nextcloud/deck/pull/5029)
- test: add cypress tests for create new deck card @luka-nextcloud [#5025](https://github.com/nextcloud/deck/pull/5025)
- Remove duplicate button @solracsf [#4850](https://github.com/nextcloud/deck/pull/4850)
- [stable27] fix cypress for new file picker [#5088](https://github.com/nextcloud/deck/pull/5088)
- Replace "Timeline" wording with "Activity" in order to be consistent with equivalent contexts throughout Nextcloud @Jerome-Herbinet [#5164](https://github.com/nextcloud/deck/pull/5164)
- Board creation limitation : More understandable wordings @Jerome-Herbinet [#5168](https://github.com/nextcloud/deck/pull/5168)
- ci(cypress): Fix file picker selector @juliushaertl [#5212](https://github.com/nextcloud/deck/pull/5212)
- Switch to native date picker @juliushaertl [#4668](https://github.com/nextcloud/deck/pull/4668)
- fixes minor spelling error @FundreasFrohsinn [#5216](https://github.com/nextcloud/deck/pull/5216)
- feat(card): tooltip for comment timestamp @fitrahfm [#5253](https://github.com/nextcloud/deck/pull/5253)
## 1.10.0-beta.1
### Added
- Compatibility with Nextcloud 27
### Fixed
- fix(references): Mute NoPermissionException as it is expected to happen for references @juliushaertl [#4514](https://github.com/nextcloud/deck/pull/4514)
- fix(cards): Fix card sizing by limiting too wide style rules @juliushaertl [#4512](https://github.com/nextcloud/deck/pull/4512)
- fix: Adapt NcEmptyContent usages to new slots @juliushaertl [#4561](https://github.com/nextcloud/deck/pull/4561)
- Gracefully handle not found card for a share @mejo- [#4566](https://github.com/nextcloud/deck/pull/4566)
- Prevent tag itself being edit button if user lacks permissions @joshtrichards [#4574](https://github.com/nextcloud/deck/pull/4574)
- chore: Remove unused @nextcloud/vue-dashboard @juliushaertl [#4586](https://github.com/nextcloud/deck/pull/4586)
- Update Description.vue: Fixes the issue of hidden text by menu bar @pschopen [#4617](https://github.com/nextcloud/deck/pull/4617)
- allow user to toggle visibility of the calendar for a deck board @schiessle [#4622](https://github.com/nextcloud/deck/pull/4622)
- fix: Append datetime picker to body to avoid cut off @juliushaertl [#4643](https://github.com/nextcloud/deck/pull/4643)
- fix: Bring back overdue column by removing faulty condition @juliushaertl [#4660](https://github.com/nextcloud/deck/pull/4660)
- fix(sessions): Do not send close request without token @juliushaertl [#4510](https://github.com/nextcloud/deck/pull/4510)
- tests(integration): Add test for multiple board shares to the same user @juliushaertl [#4494](https://github.com/nextcloud/deck/pull/4494)
- fix(API): Fix board API details parameter to work as expected @nickvergessen [#4518](https://github.com/nextcloud/deck/pull/4518)
- Fix : Overlapping expiry dates on tags @Jerome-Herbinet [#4535](https://github.com/nextcloud/deck/pull/4535)
- Fix consistency of a "Create card" wording with its equivalent for Notes ("New card") @Jerome-Herbinet [#4534](https://github.com/nextcloud/deck/pull/4534)
- tests(integration): Add integration tests for due dates @juliushaertl [#4489](https://github.com/nextcloud/deck/pull/4489)
- Better display of card dates (creation and change dates) @Jerome-Herbinet [#4604](https://github.com/nextcloud/deck/pull/4604)
- Refactors lib\Activity\DeckProvider.php to improve code readability. @fsamapoor [#4648](https://github.com/nextcloud/deck/pull/4648)
- Converts 'strpos()' calls to improve code readability. @fsamapoor [#4657](https://github.com/nextcloud/deck/pull/4657)
## 1.9.0-beta.1
### Added
- Export Board @david-loe [#3065](https://github.com/nextcloud/deck/pull/3065)
- basic notify_push usage with session handling @alangecker [#3876](https://github.com/nextcloud/deck/pull/3876)
- feat(Description): Use text as editor if available @juliushaertl [#4399](https://github.com/nextcloud/deck/pull/4399)
- Improve reference provider and add reference widgets @julien-nc [#4422](https://github.com/nextcloud/deck/pull/4422)
- live updates 🎉 @alangecker [#4273](https://github.com/nextcloud/deck/pull/4273)
- Tag creation from card view @juliushaertl [#4344](https://github.com/nextcloud/deck/pull/4344)
### Fixed
- Fix component renaming so that acl works on shares again @small1 [#4315](https://github.com/nextcloud/deck/pull/4315)
- fix(Sidebar): Only close sidebar on v-click-outside for specific targets @juliushaertl [#4350](https://github.com/nextcloud/deck/pull/4350)
- add basic e2e tests for stack title @shoetten [#4206](https://github.com/nextcloud/deck/pull/4206)
- App metadata: add links to user and developer documentation @p-bo [#4356](https://github.com/nextcloud/deck/pull/4356)
- Update signature of Entity::markFieldUpdated @nickvergessen [#4398](https://github.com/nextcloud/deck/pull/4398)
- Remove updated nightly information @xf- [#4419](https://github.com/nextcloud/deck/pull/4419)
- perf: Register notifier and resource listener lazy @juliushaertl [#4439](https://github.com/nextcloud/deck/pull/4439)
- perf: Lazy load dashboard components @juliushaertl [#4440](https://github.com/nextcloud/deck/pull/4440)
- Optimise upcomming overview creation @Raudius [#3793](https://github.com/nextcloud/deck/pull/3793)
- Performance boost @juliushaertl [#4452](https://github.com/nextcloud/deck/pull/4452)
### Other
- Dependency updates
## 1.8.0-beta.1
### Enhancements
- Nextcloud 25 compatibility
- Performance improvements
- Use capped memory cache for board permissions @juliushaertl [#3980](https://github.com/nextcloud/deck/pull/3980)
- Improve CalDAV integration performance @juliushaertl [#3982](https://github.com/nextcloud/deck/pull/3982)
- Simpify query for getting shared files @juliushaertl [#3983](https://github.com/nextcloud/deck/pull/3983)
- Accessibility improvements
- Add a11y label for sidebar button @marcelklehr [#3986](https://github.com/nextcloud/deck/pull/3986)
- Improve filter popover accessibility @juliushaertl [#3820](https://github.com/nextcloud/deck/pull/3820)
- Set ids to skip to content/navigation @juliushaertl [#3924](https://github.com/nextcloud/deck/pull/3924)
- Invert icons properly in dark mode @juliushaertl [#3939](https://github.com/nextcloud/deck/pull/3939)
- Bump dependencies
### Fixed
- set last modified when the card was found. Fixes #3763 @ylebre [#3796](https://github.com/nextcloud/deck/pull/3796)
- Increase file count after sharing @luka-nextcloud [#3682](https://github.com/nextcloud/deck/pull/3682)
- Align Duedate-delete icon properly - fixes nextcloud/deck#3791 @Ben-Ro [#3811](https://github.com/nextcloud/deck/pull/3811)
- Fix for issue #3637 @flummer [#3833](https://github.com/nextcloud/deck/pull/3833)
- Switch to 'markdown-it-task-checkbox' for rendering of task lists @q-wertz [#3898](https://github.com/nextcloud/deck/pull/3898)
- Make rename functions accessibly by keyboard navigation @juliushaertl [#3813](https://github.com/nextcloud/deck/pull/3813)
- Prevent opening card and applyLabelFilter on card drag end @eneiluj [#3916](https://github.com/nextcloud/deck/pull/3916)
- Inserted required property in the rename list field, to prevent the l… @mstolf [#3862](https://github.com/nextcloud/deck/pull/3862)
- Fix share provider for master changes @nickvergessen [#3942](https://github.com/nextcloud/deck/pull/3942)
- Fetch attachment folder for the correct user during cron job @juliushaertl [#3952](https://github.com/nextcloud/deck/pull/3952)
- Fix z-index for deck sidebar @Raudius [#3884](https://github.com/nextcloud/deck/pull/3884)
### Other
- Switch from OC::$server->get to OCP\Server::get @CarlSchwan [#3801](https://github.com/nextcloud/deck/pull/3801)
- Add performance section in README @eneiluj [#3830](https://github.com/nextcloud/deck/pull/3830)
- Fix static analysis by stubbing more circle methods @juliushaertl [#3900](https://github.com/nextcloud/deck/pull/3900)
- fix(docs): fix links to JSON schemas for Trello @wiktor2200 [#3872](https://github.com/nextcloud/deck/pull/3872)
- Move to OCP\Collaboration\Resources\LoadAdditionalScriptsEvent @juliushaertl [#3818](https://github.com/nextcloud/deck/pull/3818)
- Rename settings to deck settings @PVince81 [#3928](https://github.com/nextcloud/deck/pull/3928)
- SCSS cleanup @juliushaertl [#3803](https://github.com/nextcloud/deck/pull/3803)
- Hide deprecated projects in sidebar and card details by default @Pytal [#3984](https://github.com/nextcloud/deck/pull/3984)
## 1.7.0
### Added
- Transfer ownership @matchish @luka-nextcloud @juliushaertl [#2496](https://github.com/nextcloud/deck/pull/2496)
- Import from trello via CLI @vitormattos [#3182](https://github.com/nextcloud/deck/pull/3182)
- Add app config to toggle the default calendar setting as an admin @juliushaertl [#3528](https://github.com/nextcloud/deck/pull/3528)
- Show board name in browser title @luka-nextcloud [#3499](https://github.com/nextcloud/deck/pull/3499)
- Move DeleteCron to be time insensitive @juliushaertl [#3599](https://github.com/nextcloud/deck/pull/3599)
- 🚸 Shows error on board fetchData @vinicius73 [#3653](https://github.com/nextcloud/deck/pull/3653)
- Add support for PHP 8.1 @juliushaertl [#3601](https://github.com/nextcloud/deck/pull/3601)
- Nextcloud 24 compatibility
### Fixed
- CardApiController: Fix order of optional parameters @simonspa [#3512](https://github.com/nextcloud/deck/pull/3512)
- Exclude deleted boards in the selection for target @luka-nextcloud [#3502](https://github.com/nextcloud/deck/pull/3502)
- Fix CalDAV blocking and modernize circles API usage @juliushaertl [#3500](https://github.com/nextcloud/deck/pull/3500)
- Timestamps on created and modified at values @luka-nextcloud [#3532](https://github.com/nextcloud/deck/pull/3532)
- return the selector for collections @dartcafe [#3552](https://github.com/nextcloud/deck/pull/3552)
- Generate fixed link for activity emails @luka-nextcloud [#3611](https://github.com/nextcloud/deck/pull/3611)
- 🐛 Fix missing files sidebar @vinicius73 [#3635](https://github.com/nextcloud/deck/pull/3635)
- Handle description shortening more gracefully @juliushaertl [#3650](https://github.com/nextcloud/deck/pull/3650)
- Sort boards non case sensitive @Ben-Ro [#3560](https://github.com/nextcloud/deck/pull/3560)
- Remove unused argument from transfer ownership @juliushaertl [#3712](https://github.com/nextcloud/deck/pull/3712)
- Fix: Check all circle shares for permissions @bink [#3625](https://github.com/nextcloud/deck/pull/3625)
- Extend API changelog @juliushaertl [#3522](https://github.com/nextcloud/deck/pull/3522)
- Fix talk integration @nickvergessen [#3529](https://github.com/nextcloud/deck/pull/3529)
- Fix confusion between stackId and boardId in StackService @eneiluj [#3541](https://github.com/nextcloud/deck/pull/3541)
- Add horizontal scrollbar into the large table inside description @luka-nextcloud [#3531](https://github.com/nextcloud/deck/pull/3531)
- Make links in markdown note bolder @luka-nextcloud [#3530](https://github.com/nextcloud/deck/pull/3530)
- Update master php testing versions @nickvergessen [#3561](https://github.com/nextcloud/deck/pull/3561)
- Update master php enviroment @nickvergessen [#3582](https://github.com/nextcloud/deck/pull/3582)
- Make insert attachment buttom easy to click @luka-nextcloud [#3612](https://github.com/nextcloud/deck/pull/3612)
- Remove extra bullet @elitejake [#3613](https://github.com/nextcloud/deck/pull/3613)
- l10n: Delete space @Valdnet [#3666](https://github.com/nextcloud/deck/pull/3666)
- Update master php testing versions @nickvergessen [#3688](https://github.com/nextcloud/deck/pull/3688)
- Fix wording to represent the code behavior @q-wertz [#3685](https://github.com/nextcloud/deck/pull/3685)
- Fix cron jobs @nickvergessen [#3689](https://github.com/nextcloud/deck/pull/3689)
- Update master php testing versions @nickvergessen [#3695](https://github.com/nextcloud/deck/pull/3695)
- Optimise queries when preparing card related notifications @Raudius [#3690](https://github.com/nextcloud/deck/pull/3690)
- Properly check for the stack AND setting board permissions @juliushaertl [#3670](https://github.com/nextcloud/deck/pull/3670)
- Replace deprecated String.prototype.substr() @CommanderRoot [#3669](https://github.com/nextcloud/deck/pull/3669)
- Dependency updates
- Show cards after moving into another list [#3736](https://github.com/nextcloud/deck/pull/3736)
- Fix paramter replacements when creating deck cards from talk messages @nickvergessen [#3683](https://github.com/nextcloud/deck/pull/3683)
- Fix hidden attachment icon on archived cards [#3733](https://github.com/nextcloud/deck/pull/3733)
- Adapt the card modal to upstream changes [#3764](https://github.com/nextcloud/deck/pull/3764)
- Fix text selection in dark mode and modal view [#3765](https://github.com/nextcloud/deck/pull/3765)
- Add missing indices [#3754](https://github.com/nextcloud/deck/pull/3754)
## 1.6.0-beta1
### Added
- #3177 Use async import for vue component on collections entrypoint @juliushaertl
- #2791 Open description links in new tab @fm-sys
- #3344 Improve combined search @eneiluj
- #3362 Improve search performance @eneiluj
- #2710 Due date shortcuts in the datepicker @jakobroehrl
### Fixed
- #3161 Reduce duplicate queries when fetching user boards an permissions @juliushaertl
- #3151 Always log generic exceptions @juliushaertl
- #3217 Move circle checks to a unified service and improve member checks @juliushaertl
- #3225 Check for null value to avoid TypeError in the group manager @juliushaertl
- #3263 Defer obtaining the user session in the config service @juliushaertl
- #3294 Fix print style issues @weeman1337
- #3299 Return false instead of throwing when getting calendar setting @juliushaertl
- #3298 Delete file shares through attachments API @juliushaertl
- #3343 Fix search pagination cursor @eneiluj
- #3326 add autofocus on board edit @weeman1337
- #3323 Extend drag-and-drop zone in card sidebar @old-green-frog
- #3364 Fix optional parameter order @juliushaertl
- #3324 Fix menu button position in card modal @valerydmitrieva
- #3391 Use displayname instead of uid for mentions (reopened against master) @kffl
- #3316 Additional check for stacks @juliushaertl
- #3357 Revert "Fix search pagination cursor" @juliushaertl
- #3327 Do not show both bullets and checkboxes for checklists @Themanwhosmellslikesugar
- #3375 Show absolute dates when printing @weeman1337
- #3376 Print assignee names @weeman1337
- #3384 Keep exceptions http response generic @juliushaertl
## 1.4.0 - 2021-04-13
@@ -435,15 +69,15 @@ All notable changes to this project will be documented in this file.
## 1.3.0-beta2
### Fixed
* [#2700](https://github.com/nextcloud/deck/pull/2700) Attempt to copy file on dropping it to deck @juliushaertl
* [#2701](https://github.com/nextcloud/deck/pull/2701) Fix uploading files by drag and drop @juliushaertl
* [#2700](https://github.com/nextcloud/deck/pull/2700) Attempt to copy file on dropping it to deck
* [#2701](https://github.com/nextcloud/deck/pull/2701) Fix uploading files by drag and drop
* [#2707](https://github.com/nextcloud/deck/pull/2707) L10n: Change to a capital letter @Valdnet
* [#2712](https://github.com/nextcloud/deck/pull/2712) Docs: Fix table in section "GET /api/v1.0/config" @das-g
* [#2716](https://github.com/nextcloud/deck/pull/2716) Remove repair step which is no longer needed as we cleanup properly @juliushaertl
* [#2716](https://github.com/nextcloud/deck/pull/2716) Remove repair step which is no longer needed as we cleanup properly
* [#2723](https://github.com/nextcloud/deck/pull/2723) Pad random color with leading zeroes @PVince81
* [#2729](https://github.com/nextcloud/deck/pull/2729) Remove invalid activity parameters @nickvergessen
* [#2750](https://github.com/nextcloud/deck/pull/2750) Fix deck activity emails not being translated @nickvergessen
* [#2751](https://github.com/nextcloud/deck/pull/2751) Properly set author for activity events that are triggered by cron @juliushaertl
* [#2751](https://github.com/nextcloud/deck/pull/2751) Properly set author for activity events that are triggered by cron
## 1.2.2 - 2020-11-24
@@ -552,31 +186,31 @@ All notable changes to this project will be documented in this file.
### Fixed
* [#2116](https://github.com/nextcloud/deck/pull/2116) Fix navigation layout issues @juliushaertl
* [#2118](https://github.com/nextcloud/deck/pull/2118) Use proper parameter when handling attachments @juliushaertl
* [#2116](https://github.com/nextcloud/deck/pull/2116) Fix navigation layout issues
* [#2118](https://github.com/nextcloud/deck/pull/2118) Use proper parameter when handling attachments
## 1.0.4 - 2020-06-26
### Fixed
* [#2062](https://github.com/nextcloud/deck/pull/2062) Fix saving card description after toggling checkboxes @juliushaertl
* [#2062](https://github.com/nextcloud/deck/pull/2062) Fix saving card description after toggling checkboxes
* [#2065](https://github.com/nextcloud/deck/pull/2065) Adding CSS rule for Markdown Blockquotes @reox
* [#2059](https://github.com/nextcloud/deck/pull/2059) Fix fetching attachments on card change @juliushaertl
* [#2060](https://github.com/nextcloud/deck/pull/2060) Use mixing for relative date in card sidebar @juliushaertl
* [#2059](https://github.com/nextcloud/deck/pull/2059) Fix fetching attachments on card change
* [#2060](https://github.com/nextcloud/deck/pull/2060) Use mixing for relative date in card sidebar
## 1.0.3 - 2020-06-19
### Fixed
* [#2019](https://github.com/nextcloud/deck/pull/2019) Remove old global css rule @juliushaertl
* [#2020](https://github.com/nextcloud/deck/pull/2020) Fix navigation issue with leftover nodes @juliushaertl
* [#2021](https://github.com/nextcloud/deck/pull/2021) Fix description issues @juliushaertl
* [#2022](https://github.com/nextcloud/deck/pull/2022) Fix replyto issues with the comments API @juliushaertl
* [#2027](https://github.com/nextcloud/deck/pull/2027) Allow to unassign current user from card @juliushaertl
* [#2019](https://github.com/nextcloud/deck/pull/2019) Remove old global css rule
* [#2020](https://github.com/nextcloud/deck/pull/2020) Fix navigation issue with leftover nodes
* [#2021](https://github.com/nextcloud/deck/pull/2021) Fix description issues
* [#2022](https://github.com/nextcloud/deck/pull/2022) Fix replyto issues with the comments API
* [#2027](https://github.com/nextcloud/deck/pull/2027) Allow to unassign current user from card
* [#2029](https://github.com/nextcloud/deck/pull/2029) Fix wording : stack -> list @cloud2018
* [#2032](https://github.com/nextcloud/deck/pull/2032) Force order by id as second sorting key @juliushaertl
* [#2045](https://github.com/nextcloud/deck/pull/2045) Improve label styling @juliushaertl
* [#2032](https://github.com/nextcloud/deck/pull/2032) Force order by id as second sorting key
* [#2045](https://github.com/nextcloud/deck/pull/2045) Improve label styling
* [#2010](https://github.com/nextcloud/deck/pull/2010) User documentation fixes @Nyco
* [#1998](https://github.com/nextcloud/deck/pull/1998) Add Checklist explaination to the doc @4rnoP
@@ -736,7 +370,7 @@ Android app team for helping to improve our REST API:
- Fix comment activities on Nextcloud 15
- Fix issues with Edge
- API: Fix numeric types that were returned as strings
- API: Fix If-Modified-Since header parsing
- API: Fix If-Modified-Since header parsing
## 0.5.1 - 2018-12-05
@@ -863,7 +497,7 @@ Android app team for helping to improve our REST API:
### Fixed
- Various frontend fixes
- Fix sidebar drag issues
- Improvements for IE11
- Improvements for IE11
- Fix bug when draging a card to an empty stack
## 0.2.1 - 2017-07-04
@@ -937,7 +571,7 @@ Android app team for helping to improve our REST API:
### Fixed
- Various styling improvements
- Fix problems with MySQL and PostgreSQL
- Fix problems with MySQL and PostgreSQL
- Select first color by default when creating boards
- Fix error when changing board permissions
@@ -945,9 +579,9 @@ Android app team for helping to improve our REST API:
### Added
- Sharing boards with other users
- Create and manage boards
- Create and manage boards
- Sort cards on stacks by drag-and-drop
- Assign labels
- Markdown notes for each card
- Archive cards
- Archive cards

View File

@@ -30,16 +30,6 @@ build: clean-dist install-deps build-js
release: clean-dist install-deps-nodev build-js
lint: lint-js lint-php
lint-js:
npm run lint
npm run stylelint
lint-php:
composer run lint 1>/dev/null
composer run cs:check
build-js: install-deps-js
npm run build
@@ -60,7 +50,8 @@ ifeq (, $(shell which phpunit 2> /dev/null))
php $(build_tools_directory)/phpunit.phar -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml
php $(build_tools_directory)/phpunit.phar -c tests/phpunit.integration.xml --coverage-clover build/php-integration.coverage.xml
else
phpunit -c tests/phpunit.integration.xml --testsuite=integration-database --coverage-clover build/php-integration.coverage.xml
phpunit -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml
phpunit -c tests/phpunit.integration.xml --coverage-clover build/php-integration.coverage.xml
endif
test-integration:

View File

@@ -1,6 +1,6 @@
# Deck
[![Build Status](https://travis-ci.org/nextcloud/deck.svg?branch=main)](https://travis-ci.org/nextcloud/deck) [![CodeCov](https://codecov.io/github/nextcloud/deck/coverage.svg?branch=main)](https://codecov.io/github/nextcloud/deck) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/e403f723f42a4abd93b2cfe36cbd7eee)](https://www.codacy.com/app/juliushaertl/deck?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=nextcloud/deck&amp;utm_campaign=Badge_Grade) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/nextcloud/deck/badges/quality-score.png?b=main)](https://scrutinizer-ci.com/g/nextcloud/deck/?branch=main) [![#nextcloud-deck](https://img.shields.io/badge/IRC-%23nextcloud--deck%20on%20freenode-blue.svg)](https://webchat.freenode.net/?channels=nextcloud-deck)
[![Build Status](https://travis-ci.org/nextcloud/deck.svg?branch=master)](https://travis-ci.org/nextcloud/deck) [![CodeCov](https://codecov.io/github/nextcloud/deck/coverage.svg?branch=master)](https://codecov.io/github/nextcloud/deck) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/e403f723f42a4abd93b2cfe36cbd7eee)](https://www.codacy.com/app/juliushaertl/deck?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=nextcloud/deck&amp;utm_campaign=Badge_Grade) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/nextcloud/deck/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/nextcloud/deck/?branch=master) [![#nextcloud-deck](https://img.shields.io/badge/IRC-%23nextcloud--deck%20on%20freenode-blue.svg)](https://webchat.freenode.net/?channels=nextcloud-deck)
Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.
@@ -20,80 +20,67 @@ Deck is a kanban style organization tool aimed at personal planning and project
### Mobile apps
- [Nextcloud Deck app for Android](https://github.com/stefan-niedermann/nextcloud-deck) - It is available in [F-Droid](https://f-droid.org/de/packages/it.niedermann.nextcloud.deck/) and the [Google Play Store](https://play.google.com/store/apps/details?id=it.niedermann.nextcloud.deck.play)
- [deck NG for Android and iOS](https://github.com/meltzow/deck-ng) - It is available in [Google Play Store](https://play.google.com/store/apps/details?id=net.meltzow.deckng) and [Apple App Store](https://apps.apple.com/us/app/deck-ng/id6443334702)
### 3rd-Party Integrations
- [trello-to-deck](https://github.com/maxammann/trello-to-deck) - Migrates cards from Trello
- [mail2deck](https://github.com/newroco/mail2deck) - Provides an "email in" solution
- [A-deck](https://github.com/leoossa/A-deck) - Chrome Extension that allows to create new card in selected stack based on current tab
- [QOwnNotes](https://github.com/pbek/QOwnNotes) - Quickly creates cards and links to them in Markdown notes
- [mail2deck](https://github.com/newroco/mail2deck) - Provides an "email in" solution
## Installation/Update
The app can be installed through the app store within Nextcloud. You can also download the latest release from the [release page](https://github.com/nextcloud-releases/deck/releases).
This app is supposed to work on the two latest Nextcloud versions.
## Performance limitations
### Install latest release
Deck is not yet ready for intensive usage.
A lot of database queries are generated when the number of boards, cards and attachments is high.
For example, a user having access to 13 boards, with each board having on average 100 cards,
and each card having on average 5 attachments,
would generate 6500 database queries when doing the file related queries
which would increase the page loading time significantly.
You can download and install the latest release from the [Nextcloud app store](https://apps.nextcloud.com/apps/deck)
Improvements on Nextcloud server and Deck itself will improve the situation.
### Install from git
If you want to run the latest development version from git source, you need to clone the repo to your apps folder:
```
git clone https://github.com/nextcloud/deck.git
cd deck
make install-deps
make build
```
Please make sure you have installed the following dependencies: `make, which, tar, npm, curl, composer`
### Install the nightly builds
Instead of setting everything up manually, you can just [download the nightly build](https://github.com/nextcloud/deck/releases/tag/nightly) instead. These builds are updated every 24 hours, and are pre-configured with all the needed dependencies.
## Developing
There are multiple ways to develop on Deck. As you will need a Nextcloud server running, the individual options are described below.
### PHP
### General build instructions
Nothing to prepare, just dig into the code.
General build instructions for the app itself are the same for all options.
### JavaScript
To build you will need to have [Node.js](https://nodejs.org/en/) and [Composer](https://getcomposer.org/) installed.
Deck requires running a `make build-js` to install npm dependencies and build the JavaScript code using webpack. While developing you can also use `make watch` to rebuild everytime the code changes.
- Install PHP dependencies: `composer install --no-dev`
- Install JS dependencies: `npm ci`
- Build JavaScript for the frontend
- Development build `npm run dev`
- Watch for changes `npm run watch`
- Production build `npm run build`
#### Hot reloading
### Faster frontend developing with HMR
You can enable HMR (Hot module replacement) to avoid page reloads when working on the frontend:
1. ☑️ Install and enable [`hmr_enabler` app](https://github.com/nextcloud/hmr_enabler)
2. 🏁 Run `npm run serve`
3. 🌍 Open the normal Nextcloud server URL (not the URL given by above command)
### GitHub Codespaces / VS Code devcontainer
- Open code spaces or the repository in VS Code to start the dev container
- The container will automatically install all dependencies and build the app
- Nextcloud will be installed from the master development branch and be available on a port exposed by the container
### Docker: Simple app development container
- Fork the app
- Clone the repository: `git clone https://github.com/nextcloud/deck.git`
- Go into deck directory: `cd deck`
- Build the app as described in the general build instructions
- Run Nextcloud development container and mount the apps source code into it
Enable debug mode in your config.php `'debug' => true,`
Without SSL:
```
docker run --rm \
-p 8080:80 \
-v ~/path/to/app:/var/www/html/apps-extra/app \
ghcr.io/juliushaertl/nextcloud-dev-php80:latest
npx webpack-dev-server --config webpack.hot.js \
--public localhost:3000 \
--output-public-path 'http://localhost:3000/js/'
```
### Full Nextcloud development environment
With SSL:
```
npx webpack-dev-server --config webpack.dev.js --https \
--cert ~/repos/nextcloud/nc-dev/data/ssl/nextcloud.local.crt \
--key ~/repos/nextcloud/nc-dev/data/ssl/nextcloud.local.key \
--public nextcloud.local:3000 \
--output-public-path 'https://nextcloud.local:3000/js/'
```
You need to setup a [development environment](https://docs.nextcloud.com/server/latest/developer_manual//getting_started/devenv.html) of the current Nextcloud version. You can also alternatively install & run the [nextcloud docker container](https://github.com/juliushaertl/nextcloud-docker-dev).
After the finished installation, you can clone the deck project directly in the `/[nextcloud-docker-dev-dir]/workspace/server/apps/` folder.
### Running tests
You can use the provided Makefile to run all tests by using:

View File

@@ -20,7 +20,7 @@ Your report should include:
- Reproduction steps
A member of the security team will confirm the vulnerability, determine its impact, and develop a fix.
The fix will be applied to the main branch, tested, and packaged in the next security release.
The fix will be applied to the master branch, tested, and packaged in the next security release.
The vulnerability will be publicly announced after the release. Finally, your name will be added
to the [hall of fame](https://hackerone.com/nextcloud/thanks) as a thank you from the entire Nextcloud community. Note our
[threat model](https://nextcloud.com/security/threat-model) to know what is expected behavior.

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<info xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<?xml version="1.0"?>
<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>deck</id>
<name>Deck</name>
<summary>Personal planning and team project organization</summary>
@@ -7,25 +8,21 @@
- 📥 Add your tasks to cards and put them in order
- 📄 Write down additional notes in Markdown
- 📄 Write down additional notes in markdown
- 🔖 Assign labels for even better organization
- 👥 Share with your team, friends or family
- 📎 Attach files and embed them in your Markdown description
- 📎 Attach files and embed them in your markdown description
- 💬 Discuss with your team using comments
- ⚡ Keep track of changes in the activity stream
- 🚀 Get your project organized
</description>
<version>1.13.6</version>
<version>1.5.0</version>
<licence>agpl</licence>
<author>Julius Härtl</author>
<documentation>
<user>https://deck.readthedocs.io/en/latest/User_documentation_en/</user>
<developer>https://deck.readthedocs.io/en/latest/API/</developer>
</documentation>
<namespace>Deck</namespace>
<types>
<dav/>
<dav />
</types>
<category>organization</category>
<category>office</category>
@@ -35,32 +32,25 @@
<screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/1.0/Deck-1.png</screenshot>
<screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/1.0/Deck-2.png</screenshot>
<dependencies>
<php min-version="7.3"/>
<database min-version="9.4">pgsql</database>
<database>sqlite</database>
<database min-version="8.0">mysql</database>
<nextcloud min-version="29" max-version="29"/>
<database min-version="5.5">mysql</database>
<nextcloud min-version="22" max-version="22" />
</dependencies>
<background-jobs>
<job>OCA\Deck\Cron\DeleteCron</job>
<job>OCA\Deck\Cron\ScheduledNotifications</job>
<job>OCA\Deck\Cron\CardDescriptionActivity</job>
<job>OCA\Deck\Cron\SessionsCleanup</job>
</background-jobs>
<repair-steps>
<live-migration>
<step>OCA\Deck\Migration\DeletedCircleCleanup</step>
</live-migration>
</repair-steps>
<commands>
<command>OCA\Deck\Command\UserExport</command>
<command>OCA\Deck\Command\BoardImport</command>
<command>OCA\Deck\Command\TransferOwnership</command>
</commands>
<activity>
<settings>
<setting>OCA\Deck\Activity\SettingChanges</setting>
<setting>OCA\Deck\Activity\SettingDescription</setting>
<setting>OCA\Deck\Activity\Setting</setting>
<setting>OCA\Deck\Activity\SettingComment</setting>
<setting>OCA\Deck\Activity\DescriptionSetting</setting>
</settings>
<filters>
<filter>OCA\Deck\Activity\Filter</filter>

View File

@@ -25,12 +25,6 @@
return [
'routes' => [
['name' => 'page#index', 'url' => '/', 'verb' => 'GET'],
['name' => 'page#indexList', 'url' => '/board', 'verb' => 'GET'],
['name' => 'page#indexBoard', 'url' => '/board/{boardId}', 'verb' => 'GET'],
['name' => 'page#indexBoardDetails', 'url' => '/board/{boardId}/details', 'verb' => 'GET'],
['name' => 'page#indexCard', 'url' => '/board/{boardId}/card/{cardId}', 'verb' => 'GET'],
['name' => 'page#redirectToCard', 'url' => '/card/{cardId}', 'verb' => 'GET'],
// boards
['name' => 'board#index', 'url' => '/boards', 'verb' => 'GET'],
@@ -44,8 +38,6 @@ return [
['name' => 'board#updateAcl', 'url' => '/boards/{boardId}/acl/{aclId}', 'verb' => 'PUT'],
['name' => 'board#deleteAcl', 'url' => '/boards/{boardId}/acl/{aclId}', 'verb' => 'DELETE'],
['name' => 'board#clone', 'url' => '/boards/{boardId}/clone', 'verb' => 'POST'],
['name' => 'board#transferOwner', 'url' => '/boards/{boardId}/transferOwner', 'verb' => 'PUT'],
['name' => 'board#export', 'url' => '/boards/{boardId}/export', 'verb' => 'GET'],
// stacks
['name' => 'stack#index', 'url' => '/stacks/{boardId}', 'verb' => 'GET'],
@@ -66,8 +58,6 @@ return [
['name' => 'card#reorder', 'url' => '/cards/{cardId}/reorder', 'verb' => 'PUT'],
['name' => 'card#archive', 'url' => '/cards/{cardId}/archive', 'verb' => 'PUT'],
['name' => 'card#unarchive', 'url' => '/cards/{cardId}/unarchive', 'verb' => 'PUT'],
['name' => 'card#done', 'url' => '/cards/{cardId}/done', 'verb' => 'PUT'],
['name' => 'card#undone', 'url' => '/cards/{cardId}/undone', 'verb' => 'PUT'],
['name' => 'card#assignLabel', 'url' => '/cards/{cardId}/label/{labelId}', 'verb' => 'POST'],
['name' => 'card#removeLabel', 'url' => '/cards/{cardId}/label/{labelId}', 'verb' => 'DELETE'],
['name' => 'card#assignUser', 'url' => '/cards/{cardId}/assign', 'verb' => 'POST'],
@@ -100,10 +90,6 @@ return [
['name' => 'board_api#deleteAcl', 'url' => '/api/v{apiVersion}/boards/{boardId}/acl/{aclId}', 'verb' => 'DELETE'],
['name' => 'board_api#updateAcl', 'url' => '/api/v{apiVersion}/boards/{boardId}/acl/{aclId}', 'verb' => 'PUT'],
['name' => 'board_import_api#getAllowedSystems', 'url' => '/api/v{apiVersion}/boards/import/getSystems','verb' => 'GET'],
['name' => 'board_import_api#getConfigSchema', 'url' => '/api/v{apiVersion}/boards/import/config/schema/{name}','verb' => 'GET'],
['name' => 'board_import_api#import', 'url' => '/api/v{apiVersion}/boards/import','verb' => 'POST'],
['name' => 'stack_api#index', 'url' => '/api/v{apiVersion}/boards/{boardId}/stacks', 'verb' => 'GET'],
['name' => 'stack_api#getArchived', 'url' => '/api/v{apiVersion}/boards/{boardId}/stacks/archived', 'verb' => 'GET'],
@@ -157,10 +143,5 @@ return [
['name' => 'overview_api#upcomingCards', 'url' => '/api/v{apiVersion}/overview/upcoming', 'verb' => 'GET'],
['name' => 'search#search', 'url' => '/api/v{apiVersion}/search', 'verb' => 'GET'],
// sessions
['name' => 'Session#create', 'url' => '/api/v{apiVersion}/session/create', 'verb' => 'PUT'],
['name' => 'Session#sync', 'url' => '/api/v{apiVersion}/session/sync', 'verb' => 'POST'],
['name' => 'Session#close', 'url' => '/api/v{apiVersion}/session/close', 'verb' => 'POST'],
]
];

View File

@@ -9,42 +9,32 @@
}
],
"require": {
"justinrainbow/json-schema": "^5.2"
"cogpowered/finediff": "0.3.*"
},
"require-dev": {
"roave/security-advisories": "dev-master",
"christophwurst/nextcloud": "^21@dev",
"phpunit/phpunit": "^9",
"nextcloud/coding-standard": "^1.1",
"nextcloud/ocp": "dev-stable29",
"psalm/phar": "^5.13"
"nextcloud/coding-standard": "^0.5.0",
"symfony/event-dispatcher": "^4.0",
"vimeo/psalm": "^4.3",
"php-parallel-lint/php-parallel-lint": "^1.2"
},
"config": {
"optimize-autoloader": true,
"allow-plugins": {
"composer/package-versions-deprecated": true
},
"platform": {
"php": "8.0"
}
"classmap-authoritative": true
},
"scripts": {
"lint": "find . -name \\*.php -not -path './vendor/*' -print0 | xargs -0 -n1 php -l",
"cs:check": "php-cs-fixer fix --dry-run --diff",
"cs:fix": "php-cs-fixer fix",
"psalm": "psalm.phar",
"psalm:update-baseline": "psalm.phar --update-baseline",
"psalm:fix": "psalm.phar --alter --issues=InvalidReturnType,InvalidNullableReturnType,MismatchingDocblockParamType,MismatchingDocblockReturnType,MissingParamType,InvalidFalsableReturnType",
"psalm": "psalm",
"psalm:fix": "psalm --alter --issues=InvalidReturnType,InvalidNullableReturnType,MismatchingDocblockParamType,MismatchingDocblockReturnType,MissingParamType,InvalidFalsableReturnType",
"test": [
"@test:unit",
"@test:integration"
],
"test:unit": "vendor/bin/phpunit -c tests/phpunit.xml",
"test:integration": "vendor/bin/phpunit -c tests/phpunit.integration.xml",
"test:api": "cd tests/integration && ./run.sh"
},
"autoload-dev": {
"psr-4": {
"OCP\\": "vendor/nextcloud/ocp/OCP"
}
"test:unit": "phpunit -c tests/phpunit.xml",
"test:integration": "phpunit -c tests/phpunit.integration.xml && cd tests/integration && ./run.sh"
}
}

4194
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,19 +0,0 @@
.icon-deck {
background-image: url(../img/deck-dark.svg);
filter: var(--background-invert-if-dark);
}
.icon-deck-white, .icon-deck.icon-white {
background-image: url(../img/deck.svg);
filter: var(--background-invert-if-dark);
}
input[type=submit].icon-confirm {
border-color: var(--color-border-maxcontrast) !important;
border-left: none;
}
input[type=text]:focus+input[type=submit].icon-confirm,
input[type=text]:hover+input[type=submit].icon-confirm {
border-color: var(--color-main-text) !important;
}

1
css/deck.scss Normal file
View File

@@ -0,0 +1 @@
@include icon-black-white('deck', 'deck', 1);

View File

@@ -1,10 +1,11 @@
<?php
/**
/*
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
* @author Maxence Lange <maxence@artificial-owl.com>
* @author Luka Trovic <luka.trovic@nextcloud.com>
* @author Artem Anufrij <artem.anufrij@live.de>
* @author Marin Treselj <marin@pixelipo.com>
* @author Oskar Kurz <oskar.kurz@gmail.com>
* @author Ryan Fletcher <ryan.fletcher@codepassion.ca>
*
* @license GNU AGPL version 3 or any later version
*
@@ -23,15 +24,5 @@
*
*/
declare(strict_types=1);
namespace OCA\Deck\Validators;
class AssignmentServiceValidator extends BaseValidator {
public function rules() {
return [
'cardId' => ['numeric'],
'userId' => ['not_empty', 'not_null', 'not_false', 'max:64'],
];
}
}
@import 'icons';
@import 'print';

41
css/icons.scss Normal file
View File

@@ -0,0 +1,41 @@
/**
* Custom icons
*/
@include icon-black-white('deck', 'deck', 1);
@include icon-black-white('archive', 'deck', 1);
@include icon-black-white('circles', 'deck', 1);
@include icon-black-white('clone', 'deck', 1);
@include icon-black-white('filter', 'deck', 1);
@include icon-black-white('filter_set', 'deck', 1);
@include icon-black-white('attach', 'deck', 1);
@include icon-black-white('reply', 'deck', 1);
@include icon-black-white('notifications-dark', 'deck', 1);
@include icon-black-white('description', 'deck', 1);
.icon-toggle-compact-collapsed {
@include icon-color('toggle-view-expand', 'deck', $color-black);
}
.icon-toggle-compact-expanded {
@include icon-color('toggle-view-collapse', 'deck', $color-black);
}
.icon-activity {
@include icon-color('activity-dark', 'activity', $color-black);
}
.icon-comment--unread {
@include icon-color('comment', 'actions', $color-primary, 1, true);
}
.avatardiv.circles {
background: var(--color-primary);
}
.icon-circles {
opacity: 1;
background-size: 20px;
background-position: center center;
}
.icon-colorpicker {
background-image: url('../img/color_picker.svg');
}

View File

@@ -2,26 +2,21 @@
/* hide stuff */
#body-user {
#header,
.app-navigation,
.app-sidebar,
.board-header-controls,
.board-actions,
div#app-navigation,
div.board-header-controls,
#app-navigation-toggle,
#app-navigation-toggle-custom,
div#controls.ng-scope div.crumb:not(.title),
div#controls.ng-scope div.crumb a.bullet,
a.ng-binding + a,
div.card.create,
.stack__header .action-item,
button.card-options {
display: none !important;
}
#content {
margin: 0;
padding: 0;
}
#app-content {
margin: 0 !important;
}
@@ -80,11 +75,6 @@
margin: 2cm;
}
.board {
max-height: none !important;
overflow: visible !important;
}
div#innerBoard {
display:flex;
flex-wrap: wrap;

View File

@@ -1,16 +0,0 @@
const { defineConfig } = require('cypress')
module.exports = defineConfig({
projectId: '1s7wkc',
viewportWidth: 1280,
viewportHeight: 720,
e2e: {
// We've imported your old cypress plugins here.
// You may want to clean this up later by importing these.
setupNodeEvents(on, config) {
return require('./cypress/plugins/index.js')(on, config)
},
baseUrl: 'http://nextcloud.local/index.php',
specPattern: 'cypress/e2e/**/*.{js,jsx,ts,tsx}',
},
})

View File

@@ -1,5 +0,0 @@
module.exports = {
extends: [
'plugin:cypress/recommended',
],
}

View File

@@ -1,56 +0,0 @@
import { randUser } from '../utils/index.js'
const user = randUser()
const recipient = randUser()
describe('Board', function() {
before(function() {
cy.createUser(user)
cy.createUser(recipient)
})
beforeEach(function() {
cy.login(user)
cy.visit('/apps/deck')
})
it('Can create a board', function() {
const board = 'TestBoard'
cy.intercept({
method: 'POST',
url: '/index.php/apps/deck/boards',
}).as('createBoardRequest')
// Click "Add board"
cy.get('#app-navigation-vue .app-navigation__list .app-navigation-entry')
.eq(3).find('a').first().click({ force: true })
// Type the board title
cy.get('.board-create form input[type=text]')
.type(board, { force: true })
// Submit
cy.get('.board-create form input[type=submit]')
.first().click({ force: true })
cy.wait('@createBoardRequest').its('response.statusCode').should('equal', 200)
cy.get('.app-navigation__list .app-navigation-entry__children .app-navigation-entry')
.contains(board).should('be.visible')
})
it('Shows and hides the navigation', () => {
cy.get('#app-navigation-vue .app-navigation__list .app-navigation-entry')
.contains('Upcoming cards')
.should('be.visible')
cy.openLeftSidebar()
cy.get('#app-navigation-vue .app-navigation__list .app-navigation-entry')
.contains('Upcoming cards')
.should('not.be.visible')
cy.openLeftSidebar()
cy.get('#app-navigation-vue .app-navigation__list .app-navigation-entry')
.contains('Upcoming cards')
.should('be.visible')
})
})

View File

@@ -1,298 +0,0 @@
import { randUser } from '../utils/index.js'
import { sampleBoard } from '../utils/sampleBoard'
import moment from '@nextcloud/moment'
const user = randUser()
const boardData = sampleBoard()
const auth = {
user: user.userId,
password: user.password,
}
const useModal = (useModal) => {
return cy.request({
method: 'POST',
url: `${Cypress.env('baseUrl')}/ocs/v2.php/apps/deck/api/v1.0/config/cardDetailsInModal?format=json`,
auth,
body: { value: useModal },
}).then((response) => {
expect(response.status).to.eq(200)
})
}
describe('Card', function() {
let boardId
before(function() {
cy.createUser(user)
cy.login(user)
cy.createExampleBoard({
user,
board: boardData,
}).then((board) => {
boardId = board.id
})
})
beforeEach(function() {
cy.login(user)
})
it('Can add a card', function() {
cy.visit(`/apps/deck/#/board/${boardId}`)
const newCardTitle = 'Write some cypress tests'
cy.getNavigationEntry(boardData.title)
.first().click({ force: true })
cy.get('.board .stack').eq(0).within(() => {
cy.get('.card:contains("Hello world")').should('be.visible')
cy.get('.button-vue[aria-label*="Add card"]')
.first().click()
cy.get('.stack__card-add form input#new-stack-input-main')
.type(newCardTitle)
cy.get('.stack__card-add form input[type=submit]')
.first().click()
cy.get(`.card:contains("${newCardTitle}")`).should('be.visible')
})
})
it('Create card from overview', function() {
cy.visit(`/apps/deck/#/`)
const newCardTitle = 'Test create from overview'
cy.intercept({ method: 'POST', url: '**/apps/deck/cards' }).as('save')
cy.intercept({ method: 'GET', url: '**/apps/deck/boards/*' }).as('getBoard')
cy.get('.button-vue[aria-label*="Add card"]')
.first().click()
cy.get('.modal-mask.card-selector .card-title').should('be.visible').click().type(newCardTitle)
cy.get('.modal-mask.card-selector .multiselect-board').should('be.visible').click()
cy.get('.vs__dropdown-menu [data-cy="board-select-title"]:contains("' + boardData.title + '")').should('be.visible').click()
cy.wait('@getBoard', { timeout: 7000 })
cy.get('.modal-mask.card-selector .multiselect-list').should('be.visible').click()
cy.get('.vs__dropdown-menu span[title="TestList"]').should('be.visible').click()
cy.get('.modal-mask.card-selector button.button-vue--vue-primary').should('be.visible').click()
cy.wait('@save', { timeout: 7000 })
cy.visit(`/apps/deck/#/board/${boardId}`)
cy.reload()
cy.get('.board .stack').eq(0).within(() => {
cy.get(`.card:contains("${newCardTitle}")`).should('be.visible')
})
})
describe('Modal', () => {
beforeEach(function() {
cy.login(user)
useModal(true).then(() => {
cy.visit(`/apps/deck/#/board/${boardId}`)
})
})
it('Can show card details modal', function() {
cy.getNavigationEntry(boardData.title)
.first().click({ force: true })
cy.get('.board .stack').eq(0).within(() => {
cy.get('.card:contains("Hello world")').should('be.visible').click()
})
cy.get('.modal__card').should('be.visible')
cy.get('.app-sidebar-header__mainname').contains('Hello world')
})
it('Attachment from files app', () => {
cy.get('.card:contains("Hello world")').should('be.visible').click()
cy.get('.modal__card').should('be.visible')
cy.get('#tab-button-attachments').click()
cy.get('button.icon-upload').should('be.visible')
cy.get('button.icon-folder').should('be.visible')
.click()
cy.get('.file-picker__main').should('be.visible')
cy.get('.file-picker__main [data-filename="welcome.txt"]', { timeout: 30000 }).should('be.visible')
.click()
cy.get('.dialog__actions button.button-vue--vue-primary').click()
cy.get('.attachment-list .basename').contains('welcome.txt')
})
it.only('Shows the modal with the editor', () => {
cy.get('.card:contains("Hello world")').should('be.visible').click()
cy.intercept({ method: 'PUT', url: '**/apps/deck/cards/*' }).as('save')
cy.get('.modal__card').should('be.visible')
cy.get('.app-sidebar-header__mainname').contains('Hello world')
cy.get('.modal__card .ProseMirror h1').contains('Hello world').should('be.visible')
cy.get('.modal__card .ProseMirror h1')
.click()
.type(' writing more text{enter}- List item{enter}with entries{enter}{enter}Paragraph')
cy.wait('@save', { timeout: 7000 })
cy.reload()
cy.get('.modal__card').should('be.visible')
cy.get('.modal__card .ProseMirror h1').contains('Hello world writing more text').should('be.visible')
cy.get('.modal__card .ProseMirror li').eq(0).contains('List item').should('be.visible')
cy.get('.modal__card .ProseMirror li').eq(1).contains('with entries').should('be.visible')
cy.get('.modal__card .ProseMirror p').contains('Paragraph').should('be.visible')
})
it('Smart picker', () => {
const newCardTitle = 'Test smart picker'
cy.intercept({ method: 'POST', url: '**/apps/deck/cards' }).as('save')
cy.intercept({ method: 'GET', url: '**/apps/deck/boards/*' }).as('getBoard')
cy.get('.card:contains("Hello world")').should('be.visible').click()
cy.get('.modal__card').should('be.visible')
cy.get('.modal__card .ProseMirror h1')
.click()
.type('{enter}/create')
cy.get('.suggestion-list__item.is-selected').should('be.visible').contains('Create a new deck card')
cy.get('.suggestion-list__item.is-selected .link-picker__item').click()
cy.get('.reference-picker-modal--content .reference-picker').should('be.visible')
cy.get('.reference-picker-modal--content .reference-picker').contains('Create a new card')
cy.get('.reference-picker-modal--content .reference-picker .card-title').should('be.visible').click().type(newCardTitle)
cy.get('.reference-picker-modal--content .reference-picker .multiselect-board').should('be.visible').contains(boardData.title)
cy.get('.reference-picker-modal--content .reference-picker .multiselect-list').should('be.visible').contains(boardData.stacks[0].title)
cy.get('.reference-picker-modal--content .reference-picker button.button-vue--vue-primary').should('be.visible').click()
cy.wait('@save', { timeout: 7000 })
cy.get('.modal__card .ProseMirror').contains('/index.php/apps/deck/card/').should('be.visible')
cy.visit(`/apps/deck/#/board/${boardId}`)
cy.reload()
cy.get('.board .stack').eq(0).within(() => {
cy.get(`.card:contains("${newCardTitle}")`).should('be.visible')
})
})
})
describe('Sidebar', () => {
beforeEach(function() {
cy.login(user)
useModal(false).then(() => {
cy.visit(`/apps/deck/#/board/${boardId}`)
})
})
it('Show the sidebar', () => {
cy.get('.card:contains("Hello world")').should('be.visible').click()
cy.get('#app-sidebar-vue')
.find('.ProseMirror h1').contains('Hello world writing more text').should('be.visible')
})
it('Set a due date', function() {
const newCardTitle = 'Card with a due date'
cy.get('.button-vue[aria-label*="Add card"]')
.first().click()
cy.get('.stack__card-add form input#new-stack-input-main')
.type(newCardTitle)
cy.get('.stack__card-add form input[type=submit]')
.first().click()
cy.get(`.card:contains("${newCardTitle}")`).should('be.visible')
cy.get('.card:contains("Card with a due date")').should('be.visible').click()
cy.get('#app-sidebar-vue [data-cy-due-date-actions]').should('be.visible').click()
// Set a due date through shortcut
cy.get('[data-cy-due-date-shortcut="tomorrow"] button').should('be.visible').click()
const tomorrow = moment().add(1, 'days').hour(8).minutes(0).seconds(0)
cy.get('#card-duedate-picker').should('have.value', tomorrow.format('YYYY-MM-DDTHH:mm'))
const now = moment().hour(11).minutes(0).seconds(0).toDate()
cy.clock(now)
cy.log(now)
cy.tick(60_000)
cy.get(`.card:contains("${newCardTitle}")`).find('[data-due-state="Now"]').should('be.visible').should('contain', '21 hours')
// Remove the due date again
cy.get('#app-sidebar-vue [data-cy-due-date-actions]').should('be.visible').click()
// tick needed to show the popover menu
cy.tick(1_000)
cy.get('[data-cy-due-date-remove] button').should('be.visible').click()
cy.get(`.card:contains("${newCardTitle}")`).find('[data-due-state]').should('not.exist')
})
it('Add a label', function() {
const newCardTitle = 'Card with labels'
cy.get('.button-vue[aria-label*="Add card"]')
.first().click()
cy.get('.stack__card-add form input#new-stack-input-main')
.type(newCardTitle)
cy.get('.stack__card-add form input[type=submit]')
.first().click()
cy.get(`.card:contains("${newCardTitle}")`).should('be.visible').click()
cy.get('#app-sidebar-vue [data-test="tag-selector"]').should('be.visible').click()
cy.get('.vs__dropdown-menu .tag:contains("Action needed")').should('be.visible').click()
cy.get('.vs__selected .tag:contains("Action needed")').should('be.visible')
cy.get('.vs__dropdown-menu .tag:contains("Later")').should('be.visible').click()
cy.get('.vs__selected .tag:contains("Action needed")').should('be.visible')
cy.get('.vs__selected .tag:contains("Action needed")')
.parent().find('button').click()
cy.get(`.card:contains("${newCardTitle}")`).find('.labels li:contains("Later")')
.should('be.visible')
cy.get(`.card:contains("${newCardTitle}")`).find('.labels li:contains("Action needed")')
.should('not.exist')
})
})
describe('Card actions', () => {
beforeEach(function() {
cy.login(user)
useModal(false).then(() => {
cy.visit(`/apps/deck/#/board/${boardId}`)
})
})
it('Custom card actions', () => {
const myAction = {
label: 'Test action',
icon: 'icon-user',
callback(card) {
console.log('Called callback', card)
},
}
cy.spy(myAction, 'callback').as('myAction.callback')
cy.window().then(win => {
win.OCA.Deck.registerCardAction(myAction)
})
cy.get('.card:contains("Hello world")').should('be.visible').click()
cy.get('#app-sidebar-vue')
.find('.ProseMirror h1').contains('Hello world').should('be.visible')
cy.get('.app-sidebar-header .action-item__menutoggle').click()
cy.get('.v-popper__popper button:contains("Test action")').click()
cy.get('@myAction.callback')
.should('be.called')
.its('firstCall.args.0')
.as('args')
cy.url().then(url => {
const cardId = url.split('/').pop()
cy.get('@args').should('have.property', 'name', 'Hello world')
cy.get('@args').should('have.property', 'stackname', 'TestList')
cy.get('@args').should('have.property', 'boardname', 'MyTestBoard')
cy.get('@args').its('link').then((url) => {
expect(url.split('/').pop() === cardId).to.be.true
cy.visit(url)
cy.get('#app-sidebar-vue')
.find('.ProseMirror h1').contains('Hello world').should('be.visible')
})
})
})
})
})

View File

@@ -1,57 +0,0 @@
import { randUser } from '../utils/index.js'
import { sampleBoard } from '../utils/sampleBoard'
const user = randUser()
describe('Deck dashboard', function() {
before(function() {
cy.createUser(user)
})
beforeEach(function() {
cy.login(user)
})
it('Can show the right title on the dashboard', function() {
cy.visit('/apps/deck')
cy.get('.board-title h2')
.should('have.length', 1).first()
.should($el => expect($el.text().trim()).to.equal('Upcoming cards'))
})
it('Can see the default "Personal Board" created for user by default', function() {
cy.visit('/apps/deck')
const defaultBoard = 'Personal'
cy.get('.app-navigation-entry-wrapper[icon=icon-deck]')
.find('ul.app-navigation-entry__children .app-navigation-entry:contains(' + defaultBoard + ')')
.first()
.contains(defaultBoard)
.should('be.visible')
})
it('Shows a card with due date on the overview', function() {
cy.createExampleBoard({
user,
board: sampleBoard(),
}).then((board) => {
cy.visit(`/apps/deck/#/board/${board.id}`)
cy.intercept({ method: 'PUT', url: '**/apps/deck/cards/**' }).as('updateCard')
const newCardTitle = 'Hello world'
cy.get(`.card:contains("${newCardTitle}")`).should('be.visible').click()
cy.get('#app-sidebar-vue [data-cy-due-date-actions]').should('be.visible').click()
cy.get('[data-cy-due-date-shortcut="tomorrow"] button').should('be.visible').click()
cy.wait('@updateCard')
cy.get('button[title="Close sidebar"]').click()
cy.get('.app-navigation-entry:contains("Upcoming cards") a').click()
cy.get(`.card:contains("${newCardTitle}")`).should('be.visible')
cy.get('.dashboard-column:contains("Tomorrow")').should('be.visible')
cy.get('.dashboard-column:contains("Tomorrow") .card:contains("Hello world")').should('be.visible')
})
})
})

View File

@@ -1,74 +0,0 @@
import { randUser } from '../utils/index.js'
import { sampleBoard } from '../utils/sampleBoard'
const user = randUser()
const recipient = randUser()
const domain = Math.random().toString(36).replace(/[^a-z]+/g, '').slice(0, 10)
describe('Board', function() {
before(function() {
cy.createUser(user)
cy.createUser(recipient)
cy.login(recipient)
cy.setUserEmail(recipient, `${recipient.userId}@${domain}.com`)
})
beforeEach(function() {
cy.login(user)
})
it('Share a board to a user', function() {
const board = sampleBoard('Read only board')
cy.createExampleBoard({ user, board }).then((board) => {
const boardId = board.id
cy.visit(`/apps/deck/#/board/${boardId}`)
cy.get('.board-title').contains(board.title)
cy.shareBoardWithUi(recipient.userId)
cy.login(recipient)
cy.visit(`/apps/deck/#/board/${boardId}`)
cy.get('.board-title').contains(board.title)
cy.get('.button-vue[aria-label*="Add card"]')
.should('not.exist')
})
})
it('Share a board to a user by email', function() {
const board = sampleBoard('Shared by email')
cy.createExampleBoard({ user, board }).then((board) => {
const boardId = board.id
cy.visit(`/apps/deck/#/board/${boardId}`)
cy.get('.board-title').contains(board.title)
// domain is only in the email address - not in user ids.
cy.shareBoardWithUi(domain, recipient.userId)
cy.login(recipient)
cy.visit(`/apps/deck/#/board/${boardId}`)
cy.get('.board-title').contains(board.title)
cy.get('.button-vue[aria-label*="Add card"]')
.should('not.exist')
})
})
it('Share a board to a user as writable', function() {
const board = sampleBoard('Editable board')
cy.createExampleBoard({ user, board }).then((board) => {
const boardId = board.id
cy.visit(`/apps/deck/#/board/${boardId}`)
cy.get('.board-title').contains(board.title)
cy.shareBoardWithUi(recipient.userId)
cy.intercept({ method: 'PUT', url: '**/apps/deck/boards/*/acl/*' }).as('setAcl')
cy.get(`[data-cy="acl-participant:${recipient.userId}"]`).find('[data-cy="action:permission-edit"]').click()
cy.wait('@setAcl')
cy.login(recipient)
cy.visit(`/apps/deck/#/board/${boardId}`)
cy.get('.board-title').contains(board.title)
cy.get('.button-vue[aria-label*="Add card"]')
.first().click()
})
})
})

View File

@@ -1,68 +0,0 @@
import { randUser } from '../utils/index.js'
const user = randUser()
const boardTitle = 'TestBoard'
const testBoardData = {
title: boardTitle,
stacks: [
{ title: 'Existing Stack1' },
{ title: 'Existing Stack2' },
],
}
describe('Stack', function() {
before(function() {
cy.createUser(user)
cy.login(user)
cy.createExampleBoard({
user,
board: testBoardData,
})
})
beforeEach(function() {
cy.login(user)
cy.visit('/apps/deck')
cy.openLeftSidebar()
cy.getNavigationEntry(boardTitle)
.click({ force: true })
})
it('Can create a stack', function() {
cy.get('#stack-add button').first().click()
cy.focused().type('List 1')
cy.get('#stack-add form input[type=submit]').first().click()
cy.contains('List 1').should('be.visible')
})
it('Can edit a stack title', function() {
cy.contains('Existing Stack1')
cy.get('[data-cy-stack="Existing Stack1"]').within(() => {
cy.contains('Existing Stack1').click()
cy.focused().type(' renamed')
cy.get('[data-cy="editStackTitleForm"] input[type="submit"]').click()
})
cy.contains('Existing Stack1 renamed').should('be.visible')
})
it('Can abort a stack title edit via esc', function() {
cy.contains('Existing Stack2').click()
cy.focused().type(' with a new title, maybe?')
cy.focused().type('{esc}')
cy.contains('Existing Stack2').should('be.visible')
cy.contains('Existing Stack2 with a new title, maybe?').should('not.exist')
})
it('Can abort a stack title edit via click outside', function() {
cy.contains('Existing Stack2').click()
cy.focused().type(' with a new title, maybe?')
cy.get('[data-cy-stack="Existing Stack2"]').click('bottom')
cy.contains('Existing Stack2').should('be.visible')
cy.contains('Existing Stack2 with a new title, maybe?').should('not.exist')
})
})

View File

@@ -1,5 +0,0 @@
{
"name": "Using fixtures to represent data",
"email": "hello@cypress.io",
"body": "Fixtures are a great way to mock data for responses to routes"
}

View File

@@ -1,22 +0,0 @@
/// <reference types="cypress" />
// ***********************************************************
// This example plugins/index.js can be used to load plugins
//
// You can change the location of this file or turn off loading
// the plugins file with the 'pluginsFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/plugins-guide
// ***********************************************************
// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
/**
* @type {Cypress.PluginConfig}
*/
// eslint-disable-next-line no-unused-vars
module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
}

View File

@@ -1,137 +0,0 @@
/**
* @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
*
* @author John Molakvoæ <skjnldsv@protonmail.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import { addCommands } from '@nextcloud/cypress'
import axios from '@nextcloud/axios'
addCommands()
const url = Cypress.config('baseUrl').replace(/\/index.php\/?$/g, '')
Cypress.env('baseUrl', url)
// prepare main cypress window so we can use axios there
// and it will successfully fetch csrf tokens when needed.
window.OC = {
config: { modRewriteWorking: false },
}
// Prevent @nextcloud/router from reading window.location
window._oc_webroot = url
Cypress.Commands.add('openLeftSidebar', () => {
cy.get('.app-navigation button.app-navigation-toggle').click()
})
Cypress.Commands.add('deckCreateBoard', ({ user, password }, title) => {
cy.login(user, password)
cy.get('.app-navigation button.app-navigation-toggle').click()
cy.get('#app-navigation-vue .app-navigation__list .app-navigation-entry')
.eq(3)
.find('a')
.first()
.click({ force: true })
cy.get('.board-create form input[type=text]').type(title, { force: true })
cy.get('.board-create form input[type=submit]')
.first()
.click({ force: true })
})
Cypress.Commands.add('deckCreateList', ({ user, password }, title) => {
cy.login(user, password)
cy.get('.app-navigation button.app-navigation-toggle').click()
cy.get('#app-navigation-vue .app-navigation__list .app-navigation-entry')
.eq(3)
.find('a.app-navigation-entry-link')
.first()
.click({ force: true })
cy.get('#stack-add button').first().click()
cy.get('#stack-add form input#new-stack-input-main').type(title)
cy.get('#stack-add form input[type=submit]').first().click()
})
Cypress.Commands.add('createExampleBoard', ({ user, board }) => {
const auth = {
user: user.userId,
password: user.password,
}
cy.request({
method: 'POST',
url: `${Cypress.env('baseUrl')}/index.php/apps/deck/api/v1.0/boards`,
auth,
body: { title: board.title, color: board.color ?? 'ff0000' },
}).then((boardResponse) => {
expect(boardResponse.status).to.eq(200)
const boardData = boardResponse.body
for (const stackIndex in board.stacks) {
const stack = board.stacks[stackIndex]
cy.request({
method: 'POST',
url: `${Cypress.env('baseUrl')}/index.php/apps/deck/api/v1.0/boards/${boardData.id}/stacks`,
auth,
body: { title: stack.title, order: 0 },
}).then((stackResponse) => {
const stackData = stackResponse.body
for (const cardIndex in stack.cards) {
const card = stack.cards[cardIndex]
cy.request({
method: 'POST',
url: `${Cypress.env('baseUrl')}/index.php/apps/deck/api/v1.0/boards/${boardData.id}/stacks/${stackData.id}/cards`,
auth,
body: { title: card.title, description: card.description ?? '' },
})
}
})
}
cy.wrap(boardData)
})
})
Cypress.Commands.add('getNavigationEntry', (boardTitle) => {
return cy.get('.app-navigation-entry-wrapper[icon=icon-deck]')
.find('ul.app-navigation-entry__children .app-navigation-entry:contains(' + boardTitle + ')')
.find('a.app-navigation-entry-link')
})
Cypress.Commands.add('shareBoardWithUi', (query, userId=query) => {
cy.intercept({ method: 'GET', url: `**/ocs/v2.php/apps/files_sharing/api/v1/sharees?search=${query}*` }).as('fetchRecipients')
cy.get('[aria-label="Open details"]').click()
cy.get('.app-sidebar').should('be.visible')
cy.get('.select input').type(`${query}`)
cy.wait('@fetchRecipients', { timeout: 7000 })
cy.get('.vs__dropdown-menu .option').first().contains(query)
cy.get('.select input').type('{enter}')
cy.get('.shareWithList').contains(userId)
})
Cypress.Commands.add('setUserEmail', (user, value) => {
Cypress.log()
return axios.put(
`${url}/ocs/v2.php/cloud/users/${user.userId}`,
{ key: 'email', value },
)
})

View File

@@ -1,12 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Components App</title>
</head>
<body>
<div data-cy-root></div>
</body>
</html>

View File

@@ -1,27 +0,0 @@
// ***********************************************************
// This example support/component.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import './commands'
// Alternatively you can use CommonJS syntax:
// require('./commands')
import { mount } from 'cypress/vue2'
Cypress.Commands.add('mount', mount)
// Example use:
// cy.mount(MyComponent)

View File

@@ -1,24 +0,0 @@
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import './commands.js'
Cypress.on('uncaught:exception', (err) => {
return !err.message.includes('ResizeObserver loop limit exceeded') && !err.message.includes('ResizeObserver loop completed with undelivered notifications')
})
// Alternatively you can use CommonJS syntax:
// require('./commands')

View File

@@ -1,4 +0,0 @@
import { User } from '@nextcloud/cypress'
export const randHash = () => Math.random().toString(36).replace(/[^a-z]+/g, '').slice(0, 10)
export const randUser = () => new User(randHash(), randHash())

View File

@@ -1,38 +0,0 @@
/*
* @copyright Copyright (c) 2022 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
export const sampleBoard = (title = 'MyTestBoard') => {
return {
title: title,
color: '00ff00',
stacks: [
{
title: 'TestList',
cards: [
{
title: 'Hello world',
description: '# Hello world',
},
],
},
],
}
}

View File

@@ -1,7 +1,7 @@
The REST API provides access for authenticated users to their data inside the Deck app. To get a better understanding of Decks data models and their relations, please have a look at the [data structure](structure.md) documentation.
# Prerequisites
# Prequisited
- All requests require a `OCS-APIRequest` HTTP header to be set to `true` and a `Content-Type` of `application/json`.
- The API is located at https://nextcloud.local/index.php/apps/deck/api/v1.0
@@ -9,7 +9,7 @@ The REST API provides access for authenticated users to their data inside the De
## Naming
- Board is the project like grouping of tasks that can be shared to different users and groups
- Board is the the project like grouping of tasks that can be shared to different users and groups
- Stack is the grouping of cards which is rendered in vertical columns in the UI
@@ -80,7 +80,7 @@ An ETag header is returned in order to determine if further child elements have
- Fetch a single card of a board `GET /api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}`
- Fetch attachments of a card `GET /api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments`
If a `If-None-Match` header is provided and the requested element has not changed a `304` Not Modified response will be returned.
If a `If-None-Match` header is provided and the requested element has not changed a `304` Not Modified response will be returned.
Changes of child elements will propagate to their parents and also cause an update of the ETag which will be useful for determining if a sync is necessary on any client integration side. As an example, if a label is added to a card, the ETag of all related entities (the card, stack and board) will change.
@@ -96,28 +96,10 @@ If available the ETag will also be part of JSON response objects as shown below
# Changelog
## API version 1.0
- Deck >=1.0.0: The maximum length of the card title has been extended from 100 to 255 characters
- Deck >=1.0.0: The API will now return a 400 Bad request response if the length limitation of a board, stack or card title is exceeded
## API version 1.1
This API version has become available with **Deck 1.3.0**.
## 1.0.0 (unreleased)
- The maximum length of the card title has been extended from 100 to 255 characters
- The API will now return a 400 Bad request response if the length limitation of a board, stack or card title is exceeded
- The attachments API endpoints will return other attachment types than deck_file
- Prior to Deck version v1.3.0 (API v1.0), attachments were stored within deck. For this type of attachments `deck_file` was used as the default type of attachments
- Starting with Deck version 1.3.0 (API v1.1) files are stored within the users regular Nextcloud files and the type `file` has been introduced for that
## API version 1.2 (unreleased)
- Endpoints for the new import functionality have been added:
- [GET /boards/import/getSystems - Import a board](#get-boardsimportgetsystems-import-a-board)
- [GET /boards/import/config/system/{schema} - Import a board](#get-boardsimportconfigsystemschema-import-a-board)
- [POST /boards/import - Import a board](#post-boardsimport-import-a-board)
- The `done` property was added to cards
# Endpoints
@@ -588,7 +570,7 @@ The board list endpoint supports setting an `If-Modified-Since` header to limit
#### Response
```json
{
{
"title":"Test",
"description":null,
"stackId":6,
@@ -602,7 +584,6 @@ The board list endpoint supports setting an `If-Modified-Since` header to limit
"owner":"admin",
"order":999,
"archived":false,
"done":null,
"duedate": "2019-12-24T19:29:30+00:00",
"deletedAt":0,
"commentsUnread":0,
@@ -625,28 +606,22 @@ The board list endpoint supports setting an `If-Modified-Since` header to limit
#### Request data
| Parameter | Type | Description |
|-------------|-----------------|-----------------------------------------------------------------------------------------------------|
| title | String | The title of the card, maximum length is limited to 255 characters |
| description | String | The markdown description of the card |
| type | String | Type of the card (for later use) use 'plain' for now |
| owner | String | The user that owns the card |
| order | Integer | Order for sorting the stacks |
| duedate | timestamp | The ISO-8601 formatted duedate of the card or null |
| archived | bool | Whether the card is archived or not |
| done | timestamp\|null | The ISO-8601 formatted date when the card is marked as done (optional, null indicates undone state) |
| Parameter | Type | Description |
|-------------|-----------|------------------------------------------------------|
| title | String | The title of the card, maximum length is limited to 255 characters |
| description | String | The markdown description of the card |
| type | String | Type of the card (for later use) use 'plain' for now |
| order | Integer | Order for sorting the stacks |
| duedate | timestamp | The ISO-8601 formatted duedate of the card or null |
```
{
{
"title": "Test card",
"description": "A card description",
"type": "plain",
"owner": "admin",
"order": 999,
"duedate": "2019-12-24T19:29:30+00:00",
"archived": false,
"done": null,
}
```
@@ -952,8 +927,7 @@ The request can fail with a bad request response for the following reasons:
| type | String | The type of the attachement |
| file | Binary | File data to add as an attachment |
- Prior to Deck version v1.3.0 (API v1.0), attachments were stored within deck. For this type of attachments `deck_file` was used as the default type of attachments
- Starting with Deck version 1.3.0 (API v1.1) files are stored within the users regular Nextcloud files and the type `file` has been introduced for that
For now only `deck_file` is supported as an attachment type.
#### Response
@@ -985,7 +959,6 @@ For now only `deck_file` is supported as an attachment type.
### DELETE /boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId} - Delete an attachment
#### Request parameters
| Parameter | Type | Description |
@@ -1014,57 +987,14 @@ For now only `deck_file` is supported as an attachment type.
##### 200 Success
### GET /boards/import/getSystems - Import a board
#### Request parameters
| Parameter | Type | Description |
| ------------ | ------- | --------------------------------------------- |
| system | Integer | The system name. Example: trello |
#### Response
Make a request to see the json schema of system
```json
{
}
```
### GET /boards/import/config/system/{schema} - Import a board
#### Request parameters
#### Response
```json
[
"trello"
]
```
### POST /boards/import - Import a board
#### Request parameters
| Parameter | Type | Description |
| ------------ | ------- | --------------------------------------------- |
| system | string | The allowed name of system to import from |
| config | Object | The config object (JSON) |
| data | Object | The data object to import (JSON) |
#### Response
##### 200 Success
# OCS API
The following endpoints are available through the Nextcloud OCS endpoint, which is available at `/ocs/v2.php/apps/deck/api/v1.0/`.
The following endpoints are available through the Nextcloud OCS endpoint, which is available at `/ocs/v2.php/apps/deck/api/v1.0/`.
This has the benefit that both the web UI as well as external integrations can use the same API.
## Config
Deck stores user and app configuration values globally and per board. The GET endpoint allows to fetch the current global configuration while board settings will be exposed through the board element on the regular API endpoints.
Deck stores user and app configuration values globally and per board. The GET endpoint allows to fetch the current global configuration while board settings will be exposed through the board element on the regular API endpoints.
### GET /api/v1.0/config - Fetch app configuration values
@@ -1072,10 +1002,8 @@ Deck stores user and app configuration values globally and per board. The GET en
| Config key | Description |
| --- | --- |
| calendar | Determines if the calendar/tasks integration through the CalDAV backend is enabled for the user (boolean) |
| cardDetailsInModal | Determines if the bigger view is used (boolean) |
| cardIdBadge | Determines if the ID badges are displayed on cards (boolean) |
| groupLimit | Determines if creating new boards is limited to certain groups of the instance. The resulting output is an array of group objects with the id and the displayname (Admin only)|
| calendar | Determines if the calendar/tasks integration through the CalDAV backend is enabled for the user (boolean) |
| groupLimit | Determines if creating new boards is limited to certain groups of the instance. The resulting output is an array of group objects with the id and the displayname (Admin only)|
```
{
@@ -1087,8 +1015,6 @@ Deck stores user and app configuration values globally and per board. The GET en
},
"data": {
"calendar": true,
"cardDetailsInModal": true,
"cardIdBadge": true,
"groupLimit": [
{
"id": "admin",
@@ -1118,9 +1044,7 @@ Deck stores user and app configuration values globally and per board. The GET en
| --- | ----- |
| notify-due | `off`, `assigned` or `all` |
| calendar | Boolean |
| cardDetailsInModal | Boolean |
| cardIdBadge | Boolean |
#### Example request
```
@@ -1194,7 +1118,7 @@ A list of comments will be provided under the `ocs.data` key. If no or no more c
}
```
In case a comment is marked as a reply to another comment object, the parent comment will be added as `replyTo` entry to the response. Only the next parent node is added, nested replies are not exposed directly.
In case a comment is marked as a reply to another comment object, the parent comment will be added as `replyTo` entry to the response. Only the next parent node is added, nested replies are not exposed directly.
```json
[
@@ -1402,110 +1326,3 @@ A bad request response is returned if invalid input values are provided. The res
A not found response might be returned if:
- The card for the given cardId could not be found
- The comment could not be found
## Sessions
### PUT /session/create - creates a new session
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------------------------------- |
| boardId | Integer | The id of the opened board |
```
curl -X PUT 'https://admin:admin@nextcloud/ocs/v2.php/apps/deck/api/v1.0/session/create' \
-H 'Accept: application/json' -H 'OCS-APIRequest: true' \
-H 'Content-Type: application/json;charset=utf-8' \
--data '{"boardId":1}'
```
#### Response
##### 200 Success
```json
{
"ocs": {
"meta": {
"status": "ok",
"statuscode": 200,
"message": "OK"
},
"data": {
"token": "+zcJHf4rC6dobVSbuNa3delkCSfTW8OvYWTyLFvSpIv80FjtgLIj0ARlxspsazNQ"
}
}
}
```
### POST /session/sync - notifies the server, that the session is still open
#### Request body
| Parameter | Type | Description |
| --------- | ------- | ---------------------------------------------------- |
| boardId | Integer | The id of the opened board |
| token | String | The session token from the /sessions/create response |
```
curl -X POST 'https://admin:admin@nextcloud/ocs/v2.php/apps/deck/api/v1.0/session/create' \
-H 'Accept: application/json' -H 'OCS-APIRequest: true' \
-H 'Content-Type: application/json;charset=utf-8' \
--data '{"boardId":1, "token":"X3DyyoFslArF0t0NBZXzZXzcy8feoX/OEytSNXZtPg9TpUgO5wrkJ38IW3T/FfpV"}'
```
#### Response
##### 200 Success
```json
{
"ocs": {
"meta": {
"status": "ok",
"statuscode": 200,
"message": "OK"
},
"data": []
}
}
```
##### 404 Not Found
the provided token is invalid or expired
### POST /session/close - closes the session
#### Request body
| Parameter | Type | Description |
| --------- | ------- | ---------------------------------------------------- |
| boardId | Integer | The id of the opened board |
| token | String | The session token from the /sessions/create response |
```
curl -X POST 'https://admin:admin@nextcloud/ocs/v2.php/apps/deck/api/v1.0/session/close' \
-H 'Accept: application/json' -H 'OCS-APIRequest: true' \
-H 'Content-Type: application/json;charset=utf-8' \
--data '{"boardId":1, "token":"X3DyyoFslArF0t0NBZXzZXzcy8feoX/OEytSNXZtPg9TpUgO5wrkJ38IW3T/FfpV"}'
```
#### Response
##### 200 Success
```json
{
"ocs": {
"meta": {
"status": "ok",
"statuscode": 200,
"message": "OK"
},
"data": []
}
}
```

View File

@@ -12,12 +12,8 @@ Overall, Deck is easy to use. You can create boards, add users, share the Deck,
1. [Create my first board](#1-create-my-first-board)
2. [Create stacks and cards](#2-create-stacks-and-cards)
3. [Handle cards options](#3-handle-cards-options)
4. [Mark task as done](#4-mark-as-done)
5. [Archive old tasks](#5-archive-old-tasks)
6. [Manage your board](#6-manage-your-board)
7. [Import boards](#7-import-boards)
8. [Search](#8-search)
9. [New owner for the deck entities](#9-new-owner-for-the-deck-entities)
4. [Archive old tasks](#4-archive-old-tasks)
5. [Manage your board](#5-manage-your-board)
### 1. Create my first board
In this example, we're going to create a board and share it with an other nextcloud user.
@@ -26,7 +22,7 @@ In this example, we're going to create a board and share it with an other nextcl
### 2. Create stacks and cards
Stacks are simply columns with list of cards. It can represent a category of tasks or any step in your projects for example.
Stacks are simply columns with list of cards. It can represent a category of tasks or an y step in your projects for example.
**Check this out :**
![Gif for creating columns](resources/gifs/EN_create_columns.gif)
@@ -54,18 +50,12 @@ And even :
![Gif for puting infos on tasks 2](resources/gifs/EN_put_infos_2.gif)
### 4. Mark as done
Once a task has been completed, you can mark it as done. This will prevent it from becoming overdue and hide it from the upcoming cards.
You can mark it as not done at any time.
### 4. Archive old tasks
Once finished or obsolete, a task could be archived. The tasks is not deleted, it's just archived, and you can retrieve it later
![Gif for marking a card as done](resources/gifs/EN_done.gif)
![Gif for puting infos on tasks 2](resources/gifs/EN_archive.gif)
### 5. Archive old tasks
Once obsolete, a task could be archived. The task is not deleted, it's just archived, and you can retrieve it later
![Gif for archiving a task](resources/gifs/EN_archive.gif)
### 6. Manage your board
### 5. Manage your board
You can manage the settings of your Deck once you are inside it, by clicking on the small wheel at the top right.
Once in this menu, you have access to several things:
@@ -79,80 +69,14 @@ The **sharing tab** allows you to add users or even groups to your boards.
**Deleted objects** allows you to return previously deleted stacks or cards.
The **Timeline** allows you to see everything that happened in your boards. Everything!
### 7. Import boards
Importing can be done using the API or the `occ` `deck:import` command.
Comments with more than 1000 characters are placed as attached files to the card.
It is possible to import from the following sources:
#### Trello JSON
Steps:
* Create the data file
* Access Trello
* go to the board you want to export
* Follow the steps in [Trello documentation](https://help.trello.com/article/747-exporting-data-from-trello-1) and export as JSON
* Create the configuration file
* Execute the import informing the import file path, data file and source as `Trello JSON`
Create the configuration file respecting the [JSON Schema](https://github.com/nextcloud/deck/blob/main/lib/Service/Importer/fixtures/config-trelloJson-schema.json) for import `Trello JSON`
Example configuration file:
```json
{
"owner": "admin",
"color": "0800fd",
"uidRelation": {
"johndoe": "johndoe"
}
}
```
**Limitations**:
Importing from a JSON file imports up to 1000 actions. To find out how many actions the board to be imported has, identify how many actions the JSON has.
#### Trello API
Import using API is recommended for boards with more than 1000 actions.
Trello makes it possible to attach links to a card. Deck does not have this feature. Attachments and attachment links are added in a markdown table at the end of the description for every imported card that has attachments in Trello.
* Get the API Key and API Token [here](https://developer.atlassian.com/cloud/trello/guides/rest-api/api-introduction/#authentication-and-authorization)
* Get the ID of the board you want to import by making a request to:
https://api.trello.com/1/members/me/boards?key={yourKey}&token={yourToken}&fields=id,name
This ID you will use in the configuration file in the `board` property
* Create the configuration file
Create the configuration file respecting the [JSON Schema](https://github.com/nextcloud/deck/blob/main/lib/Service/Importer/fixtures/config-trelloApi-schema.json) for import `Trello JSON`
Example configuration file:
```json
{
"owner": "admin",
"color": "0800fd",
"api": {
"key": "0cc175b9c0f1b6a831c399e269772661",
"token": "92eb5ffee6ae2fec3ad71c777531578f4a8a08f09d37b73795649038408b5f33"
},
"board": "8277e0910d750195b4487976",
"uidRelation": {
"johndoe": "johndoe"
}
}
```
### 8. Search
## Search
Deck provides a global search either through the unified search in the Nextcloud header or with the inline search next to the board controls.
This search allows advanced filtering of cards across all board of the logged in user.
For example the search `project tag:ToDo assigned:alice assigned:bob` will return all cards where the card title or description contains project **and** the tag ToDo is set **and** the user alice is assigned **and** the user bob is assigned.
#### Supported search filters
### Supported search filters
| Filter | Operators | Query |
| ----------- | ----------------- | ------------------------------------------------------------ |
@@ -166,22 +90,4 @@ For example the search `project tag:ToDo assigned:alice assigned:bob` will retur
Other text tokens will be used to perform a case-insensitive search on the card title and description
In addition, quotes can be used to pass a query with spaces, e.g. `"Exact match with spaces"` or `title:"My card"`.
### 9. New owner for the deck entities
You can transfer ownership of boards, cards, etc to a new user, using `occ` command `deck:transfer-ownership`
```bash
php occ deck:transfer-ownership previousOwner newOwner
```
The transfer will preserve card details linked to the old owner, which can also be remapped by using the `--remap` option on the occ command.
```bash
php occ deck:transfer-ownership --remap previousOwner newOwner
```
Individual boards can be transferred by adding the id of the board to the command:
```bash
php occ deck:transfer-ownership previousOwner newOwner 123
```
In addition wuotes can be used to pass a query with spaces, e.g. `"Exact match with spaces"` or `title:"My card"`.

View File

@@ -1,98 +0,0 @@
## Export
Deck currently supports exporting all boards a user owns in a single JSON file. The format is based on the database schema that deck uses. It can be used to re-import boards on the same or other instances.
The export currently has some kown limitations in terms of specific data not included:
- Activity information
- File attachments to deck cards
- Comments
-
```
occ deck:export > my-file.json
```
## Import boards
Importing can be done using the API or the `occ` `deck:import` command.
It is possible to import from the following sources:
### Deck JSON
A json file that has been obtained from the above described `occ deck:export [userid]` command can be imported.
```
occ deck:import my-file.json
```
In case you are importing from a different instance you may use an additional config file to provide custom user id mapping in case users have different identifiers.
```
{
"owner": "admin",
"uidRelation": {
"johndoe": "test-user-1"
}
}
```
#### Trello JSON
Limitations:
* Comments with more than 1000 characters are placed as attached files to the card.
Steps:
* Create the data file
* Access Trello
* go to the board you want to export
* Follow the steps in [Trello documentation](https://help.trello.com/article/747-exporting-data-from-trello-1) and export as JSON
* Create the configuration file
* Execute the import informing the import file path, data file and source as `Trello JSON`
Create the configuration file respecting the [JSON Schema](https://github.com/nextcloud/deck/blob/main/lib/Service/Importer/fixtures/config-trelloJson-schema.json) for import `Trello JSON`
Example configuration file:
```json
{
"owner": "admin",
"color": "0800fd",
"uidRelation": {
"johndoe": "johndoe"
}
}
```
**Limitations**:
Importing from a JSON file imports up to 1000 actions. To find out how many actions the board to be imported has, identify how many actions the JSON has.
#### Trello API
Import using API is recommended for boards with more than 1000 actions.
Trello makes it possible to attach links to a card. Deck does not have this feature. Attachments and attachment links are added in a markdown table at the end of the description for every imported card that has attachments in Trello.
* Get the API Key and API Token [here](https://developer.atlassian.com/cloud/trello/guides/rest-api/api-introduction/#authentication-and-authorization)
* Get the ID of the board you want to import by making a request to:
https://api.trello.com/1/members/me/boards?key={yourKey}&token={yourToken}&fields=id,name
This ID you will use in the configuration file in the `board` property
* Create the configuration file
Create the configuration file respecting the [JSON Schema](https://github.com/nextcloud/deck/blob/main/lib/Service/Importer/fixtures/config-trelloApi-schema.json) for import `Trello JSON`
Example configuration file:
```json
{
"owner": "admin",
"color": "0800fd",
"api": {
"key": "0cc175b9c0f1b6a831c399e269772661",
"token": "92eb5ffee6ae2fec3ad71c777531578f4a8a08f09d37b73795649038408b5f33"
},
"board": "8277e0910d750195b4487976",
"uidRelation": {
"johndoe": "johndoe"
}
}
```

View File

@@ -1,32 +0,0 @@
## Implement import
* Create a new importer class extending `ABoardImportService`
* Create a listener for event `BoardImportGetAllowedEvent` to enable your importer.
> You can read more about listeners on [Nextcloud](https://docs.nextcloud.com/server/latest/developer_manual/basics/events.html?highlight=event#writing-a-listener) doc.
Example:
```php
class YourCustomImporterListener {
public function handle(Event $event): void {
if (!($event instanceof BoardImportGetAllowedEvent)) {
return;
}
$event->getService()->addAllowedImportSystem([
'name' => YourCustomImporterService::$name,
'class' => YourCustomImporterService::class,
'internalName' => 'YourCustomImporter'
]);
}
}
```
* Register your listener on your `Application` class like this:
```php
$dispatcher = $this->getContainer()->query(IEventDispatcher::class);
$dispatcher->registerEventListener(
BoardImportGetAllowedEvent::class,
YourCustomImporterListener::class
);
```
* Use the `lib/Service/Importer/Systems/TrelloJsonService.php` class as inspiration

View File

@@ -1,7 +0,0 @@
## Import class diagram
Importing boards to the Deck implements the class diagram below.
> **NOTE**: When making any changes to the structure of the classes or implementing import from other sources, edit the `BoardImport.yuml` file
![Screenshot](resources/BoardImport.svg)

View File

@@ -1,214 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: G Pages: 1 -->
<svg width="417pt" height="830pt"
viewBox="0.00 0.00 417.01 830.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 826)">
<title>G</title>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-826 413.012,-826 413.012,4 -4,4"/>
<!-- A0 -->
<g id="node1" class="node">
<title>A0</title>
<polygon fill="#fff8dc" stroke="#000000" points="165.909,-822 70.091,-822 70.091,-766 171.909,-766 171.909,-816 165.909,-822"/>
<polyline fill="none" stroke="#000000" points="165.909,-822 165.909,-816 "/>
<polyline fill="none" stroke="#000000" points="171.909,-816 165.909,-816 "/>
<text text-anchor="middle" x="121" y="-809" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Classes used on</text>
<text text-anchor="middle" x="121" y="-797" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">board import.</text>
<text text-anchor="middle" x="121" y="-785" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Methods just to</text>
<text text-anchor="middle" x="121" y="-773" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">illustrate.</text>
</g>
<!-- A1 -->
<g id="node2" class="node">
<title>A1</title>
<polygon fill="none" stroke="#000000" points="108.7773,-680 23.2227,-680 23.2227,-644 108.7773,-644 108.7773,-680"/>
<text text-anchor="middle" x="66" y="-659" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ApiController</text>
</g>
<!-- A2 -->
<g id="node3" class="node">
<title>A2</title>
<polygon fill="none" stroke="#000000" points="0,-514 0,-546 132,-546 132,-514 0,-514"/>
<text text-anchor="start" x="9.607" y="-527" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">BoardImportApiController</text>
<polygon fill="none" stroke="#000000" points="0,-458 0,-514 132,-514 132,-458 0,-458"/>
<text text-anchor="start" x="45.8645" y="-495" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">+import()</text>
<text text-anchor="start" x="16.1335" y="-483" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">+getAllowedSystems()</text>
<text text-anchor="start" x="20.0185" y="-471" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">+getConfigSchema()</text>
</g>
<!-- A1&#45;&gt;A2 -->
<g id="edge1" class="edge">
<title>A1&#45;&gt;A2</title>
<path fill="none" stroke="#000000" d="M66,-633.6693C66,-609.4424 66,-574.1663 66,-546.2238"/>
<polygon fill="#000000" stroke="#000000" points="66,-643.957 61.5001,-633.9569 66,-638.957 66.0001,-633.957 66.0001,-633.957 66.0001,-633.957 66,-638.957 70.5001,-633.957 66,-643.957 66,-643.957"/>
</g>
<!-- A3 -->
<g id="node4" class="node">
<title>A3</title>
<polygon fill="none" stroke="#000000" points="92,-364 92,-396 200,-396 200,-364 92,-364"/>
<text text-anchor="start" x="101.828" y="-377" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">BoardImportService</text>
<polygon fill="none" stroke="#000000" points="92,-284 92,-364 200,-364 200,-284 92,-284"/>
<text text-anchor="start" x="125.8645" y="-345" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">+import()</text>
<text text-anchor="start" x="118.9105" y="-333" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">+bootstrap()</text>
<text text-anchor="start" x="105.857" y="-321" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">+validateSystem()</text>
<text text-anchor="start" x="108.218" y="-309" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">#validateConfig()</text>
<text text-anchor="start" x="112.107" y="-297" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">#validateData()</text>
</g>
<!-- A2&#45;&gt;A3 -->
<g id="edge2" class="edge">
<title>A2&#45;&gt;A3</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M87.8604,-457.7328C95.8577,-441.5382 105.0823,-422.8583 113.7939,-405.2174"/>
<polygon fill="#000000" stroke="#000000" points="118.2935,-396.1057 117.9004,-407.0646 116.0795,-400.5889 113.8656,-405.072 113.8656,-405.072 113.8656,-405.072 116.0795,-400.5889 109.8308,-403.0795 118.2935,-396.1057 118.2935,-396.1057"/>
<text text-anchor="middle" x="88.3076" y="-434.7378" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">uses</text>
</g>
<!-- A7 -->
<g id="node8" class="node">
<title>A7</title>
<polygon fill="none" stroke="#000000" points="37,-196 37,-228 129,-228 129,-196 37,-196"/>
<text text-anchor="start" x="46.612" y="-209" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">TrelloApiService</text>
<polygon fill="none" stroke="#000000" points="37,-164 37,-196 129,-196 129,-164 37,-164"/>
<text text-anchor="start" x="53.9655" y="-177" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">+name:string</text>
</g>
<!-- A3&#45;&gt;A7 -->
<g id="edge6" class="edge">
<title>A3&#45;&gt;A7</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M114.8609,-283.9135C107.8316,-268.5143 100.7854,-252.0928 95.0404,-237.6613"/>
<polygon fill="#000000" stroke="#000000" points="91.2872,-228.0253 99.1098,-235.7102 93.1019,-232.6844 94.9167,-237.3434 94.9167,-237.3434 94.9167,-237.3434 93.1019,-232.6844 90.7235,-238.9767 91.2872,-228.0253 91.2872,-228.0253"/>
<text text-anchor="middle" x="99.6759" y="-267.8975" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">uses</text>
</g>
<!-- A9 -->
<g id="node10" class="node">
<title>A9</title>
<polygon fill="none" stroke="#000000" points="148,-202 148,-234 273,-234 273,-202 148,-202"/>
<text text-anchor="start" x="170.7765" y="-215" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">TrelloJsonService</text>
<polygon fill="none" stroke="#000000" points="148,-158 148,-202 273,-202 273,-158 148,-158"/>
<text text-anchor="start" x="181.4655" y="-183" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">+name:string</text>
<text text-anchor="start" x="157.981" y="-171" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">#needValidateData:true</text>
</g>
<!-- A3&#45;&gt;A9 -->
<g id="edge9" class="edge">
<title>A3&#45;&gt;A9</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M164.3261,-283.9135C170.0039,-270.5688 176.3462,-256.4563 182.4816,-243.5365"/>
<polygon fill="#000000" stroke="#000000" points="186.9002,-234.3677 186.6126,-245.3298 184.7295,-238.872 182.5588,-243.3762 182.5588,-243.3762 182.5588,-243.3762 184.7295,-238.872 178.505,-241.4226 186.9002,-234.3677 186.9002,-234.3677"/>
<text text-anchor="middle" x="163.6874" y="-260.9237" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">uses</text>
</g>
<!-- A10 -->
<g id="node11" class="node">
<title>A10</title>
<polygon fill="#fff8dc" stroke="#000000" points="317.7872,-362 218.2128,-362 218.2128,-318 323.7872,-318 323.7872,-356 317.7872,-362"/>
<polyline fill="none" stroke="#000000" points="317.7872,-362 317.7872,-356 "/>
<polyline fill="none" stroke="#000000" points="323.7872,-356 317.7872,-356 "/>
<text text-anchor="middle" x="271" y="-349" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">validateSystem is</text>
<text text-anchor="middle" x="271" y="-337" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">public because is</text>
<text text-anchor="middle" x="271" y="-325" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">used on Api.</text>
</g>
<!-- A3&#45;&gt;A10 -->
<g id="edge11" class="edge">
<title>A3&#45;&gt;A10</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M200.1992,-340C206.1915,-340 212.1837,-340 218.176,-340"/>
</g>
<!-- A4 -->
<g id="node5" class="node">
<title>A4</title>
<polygon fill="none" stroke="#000000" points="264.1131,-812 189.8869,-812 189.8869,-776 264.1131,-776 264.1131,-812"/>
<text text-anchor="middle" x="227" y="-791" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Command</text>
</g>
<!-- A5 -->
<g id="node6" class="node">
<title>A5</title>
<polygon fill="none" stroke="#000000" points="148,-684 148,-716 307,-716 307,-684 148,-684"/>
<text text-anchor="start" x="199.9955" y="-697" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">BoardImport</text>
<polygon fill="none" stroke="#000000" points="148,-652 148,-684 307,-684 307,-652 148,-652"/>
<text text-anchor="start" x="157.907" y="-665" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">+boardImportCommandService</text>
<polygon fill="none" stroke="#000000" points="148,-608 148,-652 307,-652 307,-608 148,-608"/>
<text text-anchor="start" x="200.8305" y="-633" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">#configure()</text>
<text text-anchor="start" x="177.76" y="-621" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">#execute(input,output)</text>
</g>
<!-- A4&#45;&gt;A5 -->
<g id="edge3" class="edge">
<title>A4&#45;&gt;A5</title>
<path fill="none" stroke="#000000" d="M227,-765.6356C227,-751.1554 227,-733.0451 227,-716.0324"/>
<polygon fill="#000000" stroke="#000000" points="227,-775.9227 222.5001,-765.9227 227,-770.9227 227.0001,-765.9227 227.0001,-765.9227 227.0001,-765.9227 227,-770.9227 231.5001,-765.9228 227,-775.9227 227,-775.9227"/>
</g>
<!-- A6 -->
<g id="node7" class="node">
<title>A6</title>
<polygon fill="none" stroke="#000000" points="150,-526 150,-558 304,-558 304,-526 150,-526"/>
<text text-anchor="start" x="159.7715" y="-539" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">BoardImportCommandService</text>
<polygon fill="none" stroke="#000000" points="150,-446 150,-526 304,-526 304,-446 150,-446"/>
<text text-anchor="start" x="199.9105" y="-507" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">+bootstrap()</text>
<text text-anchor="start" x="206.8645" y="-495" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">+import()</text>
<text text-anchor="start" x="186.857" y="-483" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">+validateSystem()</text>
<text text-anchor="start" x="189.218" y="-471" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">#validateConfig()</text>
<text text-anchor="start" x="193.107" y="-459" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">#validateData()</text>
</g>
<!-- A5&#45;&gt;A6 -->
<g id="edge4" class="edge">
<title>A5&#45;&gt;A6</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M227,-607.8313C227,-595.0442 227,-581.2707 227,-568.0248"/>
<polygon fill="#000000" stroke="#000000" points="227,-558.0234 231.5001,-568.0234 227,-563.0234 227.0001,-568.0234 227.0001,-568.0234 227.0001,-568.0234 227,-563.0234 222.5001,-568.0235 227,-558.0234 227,-558.0234"/>
<text text-anchor="middle" x="218.5476" y="-586.7051" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">uses</text>
</g>
<!-- A6&#45;&gt;A3 -->
<g id="edge5" class="edge">
<title>A6&#45;&gt;A3</title>
<path fill="none" stroke="#000000" d="M198.8975,-445.7949C192.3634,-432.7268 185.3528,-418.7057 178.6417,-405.2834"/>
<polygon fill="#000000" stroke="#000000" points="174.0529,-396.1057 182.55,-403.0375 176.289,-400.5779 178.5251,-405.05 178.5251,-405.05 178.5251,-405.05 176.289,-400.5779 174.5001,-407.0625 174.0529,-396.1057 174.0529,-396.1057"/>
</g>
<!-- A7&#45;&gt;A3 -->
<g id="edge7" class="edge">
<title>A7&#45;&gt;A3</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M102.735,-228.0253C109.5347,-241.763 117.1224,-258.3431 124.0627,-274.4849"/>
<polygon fill="#000000" stroke="#000000" points="128.0634,-283.9135 120.0148,-276.4657 126.1104,-279.3107 124.1573,-274.7079 124.1573,-274.7079 124.1573,-274.7079 126.1104,-279.3107 128.2998,-272.9502 128.0634,-283.9135 128.0634,-283.9135"/>
<text text-anchor="middle" x="118.307" y="-237.5757" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">uses</text>
</g>
<!-- A8 -->
<g id="node9" class="node">
<title>A8</title>
<polygon fill="none" stroke="#000000" points="80,-64 80,-108 213,-108 213,-64 80,-64"/>
<text text-anchor="start" x="117.04" y="-89" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;&lt;abstract&gt;&gt;</text>
<text text-anchor="start" x="98.9935" y="-77" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ABoardImportService</text>
<polygon fill="none" stroke="#000000" points="80,-32 80,-64 213,-64 213,-32 80,-32"/>
<text text-anchor="start" x="92.036" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">#needValidateData:false</text>
<polygon fill="none" stroke="#000000" points="80,0 80,-32 213,-32 213,0 80,0"/>
<text text-anchor="start" x="89.677" y="-13" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">+needValidateData():bool</text>
</g>
<!-- A7&#45;&gt;A8 -->
<g id="edge8" class="edge">
<title>A7&#45;&gt;A8</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M97.2957,-163.778C103.3956,-150.029 110.7371,-133.4813 117.8485,-117.4527"/>
<polygon fill="none" stroke="#000000" points="121.1416,-118.6605 121.9978,-108.1003 114.743,-115.8216 121.1416,-118.6605"/>
<text text-anchor="middle" x="96.9205" y="-140.7815" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">implements</text>
</g>
<!-- A9&#45;&gt;A3 -->
<g id="edge10" class="edge">
<title>A9&#45;&gt;A3</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M198.9952,-234.3677C194.0646,-246.7117 188.0483,-260.7568 181.8434,-274.4849"/>
<polygon fill="#000000" stroke="#000000" points="177.5286,-283.9135 177.598,-272.9478 179.6093,-279.367 181.6899,-274.8204 181.6899,-274.8204 181.6899,-274.8204 179.6093,-279.367 185.7818,-276.693 177.5286,-283.9135 177.5286,-283.9135"/>
<text text-anchor="middle" x="200.0654" y="-251.3391" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">uses</text>
</g>
<!-- A9&#45;&gt;A8 -->
<g id="edge13" class="edge">
<title>A9&#45;&gt;A8</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M192.8492,-157.9466C187.2535,-145.5313 180.8796,-131.389 174.6742,-117.6209"/>
<polygon fill="none" stroke="#000000" points="177.7167,-115.8534 170.4168,-108.1747 171.3349,-118.7297 177.7167,-115.8534"/>
<text text-anchor="middle" x="177.6953" y="-141.8944" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">implements</text>
</g>
<!-- A11 -->
<g id="node12" class="node">
<title>A11</title>
<polygon fill="#fff8dc" stroke="#000000" points="403.024,-224 290.976,-224 290.976,-168 409.024,-168 409.024,-218 403.024,-224"/>
<polyline fill="none" stroke="#000000" points="403.024,-224 403.024,-218 "/>
<polyline fill="none" stroke="#000000" points="409.024,-218 403.024,-218 "/>
<text text-anchor="middle" x="350" y="-211" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">To create an import</text>
<text text-anchor="middle" x="350" y="-199" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">to another system,</text>
<text text-anchor="middle" x="350" y="-187" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">create another class</text>
<text text-anchor="middle" x="350" y="-175" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">similar to this.</text>
</g>
<!-- A9&#45;&gt;A11 -->
<g id="edge12" class="edge">
<title>A9&#45;&gt;A11</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M272.6172,-196C278.6627,-196 284.7083,-196 290.7538,-196"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,24 +0,0 @@
// Created using [yUML](https://github.com/jaime-olivares/vscode-yuml)
// {type:class}
// {direction:topDown}
// {generate:true}
[note: Classes used on board import. Methods just to illustrate. {bg:cornsilk}]
[ApiController]<-[BoardImportApiController|+import();+getAllowedSystems();+getConfigSchema()]
[BoardImportApiController]uses-.->[BoardImportService|+import();+bootstrap();+validateSystem();#validateConfig();#validateData();]
[Command]<-[BoardImport|+boardImportCommandService|#configure();#execute(input,output)]
[BoardImport]uses-.->[BoardImportCommandService|+bootstrap();+import();+validateSystem();#validateConfig();#validateData()]
[BoardImportCommandService]->[BoardImportService]
[BoardImportService]uses-.->[TrelloApiService|+name:string]
[TrelloApiService]uses-.->[BoardImportService]
[TrelloApiService]implements-.-^[<<abstract>> ABoardImportService|#needValidateData:false|+needValidateData():bool]
[BoardImportService]uses-.->[TrelloJsonService|+name:string;#needValidateData:true]
[TrelloJsonService]uses-.->[BoardImportService]
[BoardImportService]-[note: validateSystem is public because is used on Api. {bg:cornsilk}]
[TrelloJsonService]-[note: To create an import to another system, create another class similar to this. {bg:cornsilk}]
[TrelloJsonService]implements-.-^[<<abstract>> ABoardImportService]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.0" viewbox="0 0 32 32">
<path d="m16 1-10 18h11l-1 12 10-18h-11z"/>
</svg>

Before

Width:  |  Height:  |  Size: 205 B

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.0" viewBox="0 0 32 32">
<path d="m16 1-10 18h11l-1 12 10-18h-11z" fill="#FFF"/>
</svg>

Before

Width:  |  Height:  |  Size: 217 B

1
img/archive-white.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><g transform="translate(0 -1036.362)" fill="#fff"><path d="M1.93 1041.296c-.185 0-.336.138-.336.31v9.842c0 .172.15.313.336.313h12.517c.185 0 .333-.14.333-.313v-9.842c0-.172-.148-.31-.333-.31H1.93zm4.124 1.507h4.223c.39 0 .705.314.705.704v.43c0 .39-.315.705-.705.705H6.054a.703.703 0 0 1-.705-.705v-.43c0-.39.314-.704.705-.704z"/><rect width="15.742" height="2.296" x=".136" y="1037.543" ry="0"/></g></svg>

After

Width:  |  Height:  |  Size: 488 B

View File

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" style="height: 240px; width: 240px;" viewBox="0 0 24 24">
<path fill="currentColor" d="M12,15H10V13H12V15M18,15H14V13H18V15M8,11H6V9H8V11M18,11H10V9H18V11M20,20H4A2,2 0 0,1 2,18V6A2,2 0 0,1 4,4H20A2,2 0 0,1 22,6V18A2,2 0 0,1 20,20M4,6V18H20V6H4Z" />
</svg>

Before

Width:  |  Height:  |  Size: 298 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 58 58" width="512" height="512"><g fill="#000"><path d="M54.319 37.839C54.762 35.918 55 33.96 55 32c0-9.095-4.631-17.377-12.389-22.153a1 1 0 1 0-1.049 1.703C48.724 15.96 53 23.604 53 32c0 1.726-.2 3.451-.573 5.147A6.992 6.992 0 0 0 51 37c-3.86 0-7 3.141-7 7s3.14 7 7 7 7-3.141 7-7a7.006 7.006 0 0 0-3.681-6.161zM38.171 54.182A23.867 23.867 0 0 1 29 56a24.047 24.047 0 0 1-17.017-7.092A6.974 6.974 0 0 0 14 44c0-3.859-3.14-7-7-7s-7 3.141-7 7 3.14 7 7 7a6.952 6.952 0 0 0 3.381-.875C15.26 55.136 21.994 58 29 58c3.435 0 6.778-.663 9.936-1.971.51-.211.753-.796.542-1.307a1.001 1.001 0 0 0-1.307-.54zM4 31.213a1 1 0 0 0 1.068-.927c.712-10.089 7.586-18.52 17.22-21.314C23.142 11.874 25.825 14 29 14c3.86 0 7-3.141 7-7s-3.14-7-7-7c-3.851 0-6.985 3.127-6.999 6.975C11.42 9.922 3.851 19.12 3.073 30.146A.999.999 0 0 0 4 31.213z"/></g></svg>

Before

Width:  |  Height:  |  Size: 885 B

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 58 58" width="512" height="512"><g fill="#fff"><path d="M54.319 37.839C54.762 35.918 55 33.96 55 32c0-9.095-4.631-17.377-12.389-22.153a1 1 0 1 0-1.049 1.703C48.724 15.96 53 23.604 53 32c0 1.726-.2 3.451-.573 5.147A6.992 6.992 0 0 0 51 37c-3.86 0-7 3.141-7 7s3.14 7 7 7 7-3.141 7-7a7.006 7.006 0 0 0-3.681-6.161zM38.171 54.182A23.867 23.867 0 0 1 29 56a24.047 24.047 0 0 1-17.017-7.092A6.974 6.974 0 0 0 14 44c0-3.859-3.14-7-7-7s-7 3.141-7 7 3.14 7 7 7a6.952 6.952 0 0 0 3.381-.875C15.26 55.136 21.994 58 29 58c3.435 0 6.778-.663 9.936-1.971.51-.211.753-.796.542-1.307a1.001 1.001 0 0 0-1.307-.54zM4 31.213a1 1 0 0 0 1.068-.927c.712-10.089 7.586-18.52 17.22-21.314C23.142 11.874 25.825 14 29 14c3.86 0 7-3.141 7-7s-3.14-7-7-7c-3.851 0-6.985 3.127-6.999 6.975C11.42 9.922 3.851 19.12 3.073 30.146A.999.999 0 0 0 4 31.213z"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 58 58" width="512" height="512"><g fill="#000"><path d="M54.319 37.839C54.762 35.918 55 33.96 55 32c0-9.095-4.631-17.377-12.389-22.153a1 1 0 1 0-1.049 1.703C48.724 15.96 53 23.604 53 32c0 1.726-.2 3.451-.573 5.147A6.992 6.992 0 0 0 51 37c-3.86 0-7 3.141-7 7s3.14 7 7 7 7-3.141 7-7a7.006 7.006 0 0 0-3.681-6.161zM38.171 54.182A23.867 23.867 0 0 1 29 56a24.047 24.047 0 0 1-17.017-7.092A6.974 6.974 0 0 0 14 44c0-3.859-3.14-7-7-7s-7 3.141-7 7 3.14 7 7 7a6.952 6.952 0 0 0 3.381-.875C15.26 55.136 21.994 58 29 58c3.435 0 6.778-.663 9.936-1.971.51-.211.753-.796.542-1.307a1.001 1.001 0 0 0-1.307-.54zM4 31.213a1 1 0 0 0 1.068-.927c.712-10.089 7.586-18.52 17.22-21.314C23.142 11.874 25.825 14 29 14c3.86 0 7-3.141 7-7s-3.14-7-7-7c-3.851 0-6.985 3.127-6.999 6.975C11.42 9.922 3.851 19.12 3.073 30.146A.999.999 0 0 0 4 31.213z"/></g></svg>

Before

Width:  |  Height:  |  Size: 885 B

After

Width:  |  Height:  |  Size: 885 B

1
img/clone.svg Normal file
View File

@@ -0,0 +1 @@
<svg width="16" height="16" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M11.8 13.8H2.2V4.2h9.6m1.2 0c0-.67-.53-1.2-1.2-1.2H2.2C1.53 3 1 3.53 1 4.2v9.6c0 .67.53 1.2 1.2 1.2h9.6c.67 0 1.2-.53 1.2-1.2"/><path d="m4.2 1c-0.67 0-1.2 0.54-1.2 1.2h10.8v10.8c0.67 0 1.2-0.53 1.2-1.2v-9.6c0-0.67-0.53-1.2-1.2-1.2z"/></svg>

After

Width:  |  Height:  |  Size: 327 B

View File

@@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16">
<g fill="currentColor">
<rect ry="1" height="8" width="14" y="7" x="1"/>
<rect ry=".5" height="1" width="12" y="5" x="2"/>
<rect ry=".5" height="1" width="10" y="3" x="3"/>
<rect ry=".5" height="1" width="8" y="1" x="4"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 372 B

1
img/reply.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M15 15s-.4-7.8-7-10V1L1 8l7 7v-4c5.1 0 7 4 7 4z"/></svg>

After

Width:  |  Height:  |  Size: 128 B

View File

@@ -1,6 +1,9 @@
OC.L10N.register(
"deck",
{
"Personal" : "Persoonlik",
"copy" : "kopie",
"Done" : "Gereed",
"The file was uploaded" : "Die lêer is opgelaai",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die opgelaaide lêer oorskry die upload_max_filesize riglyn in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die opgelaaide lêer oorskry die MAX_FILE_SIZE riglyn wat in die HTML vorm gespesifiseer is",
@@ -8,47 +11,28 @@ OC.L10N.register(
"No file was uploaded" : "Geen lêer is opgelaai",
"Missing a temporary folder" : "Ontbrekende tydelike gids",
"A PHP extension stopped the file upload" : "n PHP-uitbreiding het die oplaai gestaak",
"Later" : "Later",
"copy" : "kopie",
"To Do" : "Moet doen",
"Done" : "Gereed",
"Cancel" : "Kanselleer",
"File already exists" : "Lêer bestaan reeds",
"Open" : "Open",
"Completed" : "Voltooid",
"Open details" : "Open besonderhede",
"Details" : "Besonderhede",
"Tags" : "Etikette",
"No participants found" : "Geen deelnemers gevind",
"Can edit" : "Kan redigeer",
"Can share" : "Kan deel",
"Owner" : "Eienaar",
"Delete" : "Skrap",
"Edit" : "Wysig",
"Download" : "Laai af",
"Comments" : "Kommentare",
"Modified" : "Gewysig",
"Created" : "Geskep",
"Comments" : "Kommentare",
"Due date" : "Sperdatum",
"Select Date" : "Kies Datum",
"Save" : "Stoor",
"Created:" : "Geskep:",
"Reply" : "Antwoord",
"Update" : "Werk by",
"Description" : "Beskrywing",
"Select Date" : "Kies Datum",
"seconds ago" : "sekondes gelede",
"Keyboard shortcuts" : "Sneltoetse",
"Keyboard shortcut" : "Snelsleutel",
"Search" : "Soek",
"Shared with you" : "Met u gedeel",
"An error occurred" : "'n Fout het voorgekom",
"No notifications" : "Geen kennisgewings",
"Advanced options" : "Gevorderde opsies",
"Export" : "Voer uit",
"Today" : "Vandag",
"Tomorrow" : "Môre",
"Close" : "Sluit",
"Due date" : "Sperdatum",
"Share" : "Deel",
"Personal" : "Persoonlik"
"This week" : "Vandeesweek"
},
"nplurals=2; plural=(n != 1);");

View File

@@ -1,4 +1,7 @@
{ "translations": {
"Personal" : "Persoonlik",
"copy" : "kopie",
"Done" : "Gereed",
"The file was uploaded" : "Die lêer is opgelaai",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die opgelaaide lêer oorskry die upload_max_filesize riglyn in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die opgelaaide lêer oorskry die MAX_FILE_SIZE riglyn wat in die HTML vorm gespesifiseer is",
@@ -6,47 +9,28 @@
"No file was uploaded" : "Geen lêer is opgelaai",
"Missing a temporary folder" : "Ontbrekende tydelike gids",
"A PHP extension stopped the file upload" : "n PHP-uitbreiding het die oplaai gestaak",
"Later" : "Later",
"copy" : "kopie",
"To Do" : "Moet doen",
"Done" : "Gereed",
"Cancel" : "Kanselleer",
"File already exists" : "Lêer bestaan reeds",
"Open" : "Open",
"Completed" : "Voltooid",
"Open details" : "Open besonderhede",
"Details" : "Besonderhede",
"Tags" : "Etikette",
"No participants found" : "Geen deelnemers gevind",
"Can edit" : "Kan redigeer",
"Can share" : "Kan deel",
"Owner" : "Eienaar",
"Delete" : "Skrap",
"Edit" : "Wysig",
"Download" : "Laai af",
"Comments" : "Kommentare",
"Modified" : "Gewysig",
"Created" : "Geskep",
"Comments" : "Kommentare",
"Due date" : "Sperdatum",
"Select Date" : "Kies Datum",
"Save" : "Stoor",
"Created:" : "Geskep:",
"Reply" : "Antwoord",
"Update" : "Werk by",
"Description" : "Beskrywing",
"Select Date" : "Kies Datum",
"seconds ago" : "sekondes gelede",
"Keyboard shortcuts" : "Sneltoetse",
"Keyboard shortcut" : "Snelsleutel",
"Search" : "Soek",
"Shared with you" : "Met u gedeel",
"An error occurred" : "'n Fout het voorgekom",
"No notifications" : "Geen kennisgewings",
"Advanced options" : "Gevorderde opsies",
"Export" : "Voer uit",
"Today" : "Vandag",
"Tomorrow" : "Môre",
"Close" : "Sluit",
"Due date" : "Sperdatum",
"Share" : "Deel",
"Personal" : "Persoonlik"
"This week" : "Vandeesweek"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View File

@@ -37,10 +37,6 @@ OC.L10N.register(
"{user} has archived card {card} in list {stack} on board {board}" : "{user} قام بأرشفة بطاقة {card} في القائمة {stack} على اللوح {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "لديك بطاقة غير مؤرشفة {card} في القائمة {stack} على اللوح {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} لديه بطاقة غير مؤرشفة {card} في القائمة {stack} على اللوح {board}",
"You have marked the card {card} as done in list {stack} on board {board}" : "لقد قُمت بتمييز البطاقة {card} باعتبارها \"منتهية\" في القائمة {stack} على اللوحة {board}",
"{user} has marked card {card} as done in list {stack} on board {board}" : "قام المستخدِم {user} بتمييز البطاقة {card} باعتبارها \"منتهية\" في القائمة {stack} على اللوحة{board}",
"You have marked the card {card} as undone in list {stack} on board {board}" : "لقد قُمتَ أنت بتمييز البطاقة {card} باعتبارها \"غير منتهية\" في القائمة {stack} على اللوحة {board}",
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "قام المستخدِم {user} بتمييز البطاقة {card} باعتبارها \"غير منتهية\" في القائمة {stack} على اللوحة {board}",
"You have removed the due date of card {card}" : "قمت بإزالة التاريخ المحدد من البطاقة {card}",
"{user} has removed the due date of card {card}" : "{user} قام بإزالة التاريخ المحدد من البطاقة {card}",
"You have set the due date of card {card} to {after}" : "قمت بتعيين التاريخ المحدد للبطاقة {card} إلى {after}",
@@ -67,11 +63,34 @@ OC.L10N.register(
"{user} has restored the attachment {attachment} to card {card}" : "{user} قام باسترجاع المرفق {attachment} إلى البطاقة {card}",
"You have commented on card {card}" : "لقد علقت على البطاقة {بطاقة}",
"{user} has commented on card {card}" : "{مستخدم} علق على بطاقة {بطاقة}",
"A <strong>card description</strong> inside the Deck app has been changed" : "<strong>وصف البطاقة</strong>داخل تطبيق Deck قد تغيرت.",
"Deck" : "Deck",
"Changes in the <strong>Deck app</strong>" : "تغييرات في <strong>تطبيق Deck</strong> ",
"A <strong>board, list or card</strong> was changed" : "تمّ تغيير <strong>لوحة أو قائمة أو بطاقة </strong>.",
"A <strong>comment</strong> was created on a card" : "<strong>تعليق</strong> تم إنشاؤه على بطاقة",
"A <strong>card description</strong> has been changed" : "تمّ تغيير <strong>وصف بطاقة</strong>.",
"Upcoming cards" : "البطاقات القادمة",
"Personal" : "شخصي",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "البطاقة \"%s\" على \"%s\" كُلفت بها من قبل %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} قام بتكليف البطاقة {deck-board} على {deck-board} لك",
"The card \"%s\" on \"%s\" has reached its due date." : "وصلت بطاقة \"%s\" على %s\" الموعد المحدد ",
"The card {deck-card} on {deck-board} has reached its due date." : "تجاوزت البطاقة {deck-card} على {deck-board} التاريخ المحدد.",
"%s has mentioned you in a comment on \"%s\"." : "%s أشار إليك في تعليق على \"%s\".",
"{user} has mentioned you in a comment on {deck-card}." : "{user} أشار إليك في تعليق على {deck-card}",
"The board \"%s\" has been shared with you by %s." : "تمت مشاركة اللوح \"%s\" معك من قبل %s.",
"{user} has shared {deck-board} with you." : "{user} قام بمشاركة {deck-board} معك.",
"Card comments" : "تعليقات البطاقة ",
"%s on %s" : "%s على %s",
"No data was provided to create an attachment." : "لا بيانات تم تقديمها لانشاء مرفق",
"Finished" : "اكتمل",
"To review" : "لإعادة المراجعة",
"Action needed" : "يحتاج إلى إجراء",
"Later" : "لاحقا",
"copy" : "نسخ",
"To do" : "لفعله",
"Doing" : "تحت العمل",
"Done" : "أُنجز",
"Example Task 3" : "مثال المهمة 3",
"Example Task 2" : "مثال المهمة 2",
"Example Task 1" : "مثال المهمة 1",
"The file was uploaded" : "تم رفع الملف",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "حجم الملف المرفوع قد تجاوز upload_max_filesize الموجودة في ملف php.ini ",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "حجم الملف الذي تريد رفعه أعلى من الحد المسموح به في واجهة ال HTML.",
@@ -81,84 +100,44 @@ OC.L10N.register(
"Could not write file to disk" : "لم يستطع كتابة ملف للقرص",
"A PHP extension stopped the file upload" : "إضافة البي اچ بي PHP أوقفت رفع الملف",
"No file uploaded or file size exceeds maximum of %s" : "لم يتم تحميل أي ملف أو أن يتجاوز حجم الملف الحد الأقصى %s",
"Cards due today" : "البطاقات المستحقة اليوم",
"Cards due tomorrow" : "البطاقات المستحقة غداً",
"Upcoming cards" : "البطاقات القادمة",
"Load more" : "حمّل أكثر",
"Welcome to Nextcloud Deck!" : "أهلا بكم في تطبيق \"الكدسات\" Deck من نكست كلاود! ",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "البطاقة \"%s\" على \"%s\" كُلفت بها من قبل %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} قام بتكليف البطاقة {deck-board} على {deck-board} لك",
"The card \"%s\" on \"%s\" has reached its due date." : "وصلت بطاقة \"%s\" على %s\" الموعد المحدد ",
"The card {deck-card} on {deck-board} has reached its due date." : "تجاوزت البطاقة {deck-card} على {deck-board} التاريخ المحدد.",
"%s has mentioned you in a comment on \"%s\"." : "%s أشار إليك في تعليق على \"%s\".",
"{user} has mentioned you in a comment on {deck-card}." : "{user} أشار إليك في تعليق على {deck-card}",
"The board \"%s\" has been shared with you by %s." : "تمت مشاركة اللوح \"%s\" معك من قبل %s.",
"{user} has shared {deck-board} with you." : "{user} قام بمشاركة {deck-board} معك.",
"Deck board" : "لوحة البطاقات",
"Owned by %1$s" : "يملكها %1$s",
"Deck boards, cards and comments" : "اللوحات و البطاقات و الملاحظات",
"From %1$s, in %2$s/%3$s, owned by %4$s" : " من %1$s، في %2$s/%3$s، يملكها %4$s",
"Create a new deck card" : "إنشاء كدسة جديدة للبطاقات",
"Card comments" : "تعليقات البطاقة ",
"%s on %s" : "%s على %s",
"Deck boards and cards" : "اللوحات و البطاقات",
"No data was provided to create an attachment." : "لا بيانات تم تقديمها لانشاء مرفق",
"Finished" : "اكتمل",
"To review" : "لإعادة المراجعة",
"Action needed" : "يحتاج إلى إجراء",
"Later" : "لاحقا",
"copy" : "نسخ",
"Read more inside" : "إقرإ المزيد بالداخل",
"Custom lists - click to rename!" : "قوائم مخصصة - أنقُر لتغيير التسمية!",
"To Do" : "مَهَامٌّ",
"In Progress" : "قيد التجهيز",
"Done" : "أُنجز",
"1. Open to learn more about boards and cards" : "1. إفتَح لتعرِف المزيد عن اللوحات والبطاقات",
"2. Drag cards left and right, up and down" : "2. سحب البطاقات يميناً ويساراً، لأعلي وأسفل",
"3. Apply rich formatting and link content" : "3. تطبيق التنسيق و ربط المحتوى",
"4. Share, comment and collaborate!" : "4. مشاركات، و ملاحظات، وتعاون!",
"Create your first card!" : "أنشِئ بطاقتك الأولى!",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : " هذه الملاحظات فيها أكثر من %s حرفاً.\n تمّت إضافتها كمُرفق إلى البطاقة التي اسمها%s.\n الموجودة على الرابط %s.",
"Card not found" : "لم يتم العثور على البطاقة ",
"Path is already shared with this card" : "تم مشاركة المسار بالفعل مع هذه البطاقة ",
"Invalid date, date format must be YYYY-MM-DD" : "تاريخ غير صحيح, يجب أن يكون تنسيق التاريخ YYYY-MM-DD",
"Personal planning and team project organization" : "التخطيط الشخصي و تنظيم مشروع الفريق",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "التطبيق \"كَدسَات البطاقات\" Deck هو أداة لتنظيم المهام الشخصية و الجماعية في نكست كلاود على نمط \"خطوط التصنيع أو التجميع في المصانع\" و المعروف بـ kanban.\n\n\n- 📥 أكتب مهامّك او مهامّ فريقك على بطاقة و ضع البطاقة في مكانها المناسب\n- 📄 دوّن ملاحظاتك الإضافية على البطاقة بصيغة ماركداون markdown\n- 🔖 و يمكنك أيضاً وضع لواصق labels على البطاقة لتصنيفها بشكل أفضل\n- 👥 شارك البطاقة مع من ترغب من أعضاء فريقك أو عائلتك أو أصدقائك\n- 📎 إرفاق ملفات و تضمينها بصيغة ماركداون في البطاقة\n- 💬ناقش البطاقة مع زملائك في خانة الملاحظات\n- ⚡ تابع ما يُستجد من عمليات و تطوّرات على البطاقة أو المهمة\n- 🚀 حافظ على مشروعك مُنسّقاً باستمرار.",
"Add board" : "إضافة لوح",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "دك (Deck) هو أداة تنظيم باسلوب كانبان (kanban) تهدف إلى التخطيط الشخصي وتنظيم المشروع للفرق مع نيكست كلاود (Nextcloud).\n- 📥 إضافة مهامك إلى البطاقات وترتيبها\n- 📄 كتابة ملاحظات إضافية باستخدام مارك داون (markdown)\n- 🔖 تعيين تسميات لتنظيم أفضل\n- 👥 شارك مع فريقك أو أصدقائك أو عائلتك\n- 📎 إرفاق الملفات وتضمينها بالوصف المستخدم فيه مارك داون (markdown)\n- 💬 ناقش مع فريقك باستخدام التعليقات\n- ⚡ تتبع التغييرات في تيار النشاط\n- 🚀 اجعل مشروعك منظماً",
"Card details" : "تفاصيل البطاقة",
"Add board" : "إضافة لوح",
"Select the board to link to a project" : "تحديد اللوح لربطه بمشروع",
"Search by board title" : "بحث بواسطة عنوان اللوح",
"Select board" : "حدد لوح",
"Move/copy card" : "نسخ أو نقل بطاقة",
"Create a new card" : "أنشى بطاقة جديدة ",
"Select a board" : "حدد لوح",
"No lists available" : "لا يوجد قائمة متاحه ",
"Select a list" : "اختر قائمة ",
"Move card" : "حرك البطاقة",
"Copy card" : "نسخ بطاقة",
"Card title" : "عنوان البطاقة ",
"Cancel" : "إلغاء",
"Creating the new card …" : "أنشى البطاقة الجديدة ",
"Card \"{card}\" was added to \"{board}\"" : "\"{بطاقة}\" تمت إضافتها في \"{اللوح}\"",
"Open card" : "فتح البطاقة ",
"Close" : "إغلاق",
"Create card" : "أنشى بطاقة ",
"Select a card" : "حدد بطاقة",
"Select the card to link to a project" : "حدد البطاقة لربطها بمشروع",
"Link to card" : "اربط بطاقة",
"Select a card" : "حدد بطاقة",
"Cancel" : "إلغاء",
"This board is read only" : "هذا اللوح بوضع القراءة فقط",
"Drop your files to upload" : "افلت الملفات لرفعها",
"File already exists" : "الملف موجود مسبقاً",
"A file with the name {filename} already exists." : "ملف باسم {اسم الملف} موجود مسبقًا ",
"Do you want to overwrite it?" : "هل تريد تجاوزه؟",
"Overwrite file" : "تجاوز ملف",
"Keep existing file" : "ابقي الملف الموجود",
"This board is read only" : "هذا اللوح بوضع القراءة فقط",
"Drop your files to upload" : "افلت الملفات لرفعها",
"Add card" : "إضافة بطاقة",
"Archived cards" : "البطاقات المؤرشفة",
"Add list" : "إضافة قائمة",
"List name" : "قامة اسماء",
"Active filters" : "فلاتر نشطة",
"Apply filter" : "تطبيق التصفية",
"Filter by tag" : "تصفية بواسطة الوسم",
"Filter by assigned user" : "تصفية بواسطة المستخدم الموكل اليه",
"Unassigned" : "غير معيين ",
"Filter by status" : "تصفية بحسب الحالة",
"Open and completed" : "مفتوحة و منجزة",
"Open" : "فتح",
"Completed" : "مُكتمل",
"Filter by due date" : "تصفية بواسطة تاريخ الإنجاز",
"Overdue" : "تأخر",
"Next 24 hours" : "ال 24 ساعة القادمة",
@@ -166,89 +145,77 @@ OC.L10N.register(
"Next 30 days" : "ال 30 يوم القادمة",
"No due date" : "لا تاريخ إنجاز",
"Clear filter" : "ازل التصفية",
"View Modes" : "وضعيات العرض",
"Toggle View Modes" : "التبديل بين وضعيات العرض",
"Hide archived cards" : "إخفاء البطاقات المؤرشفة ",
"Show archived cards" : "اظهر البطاقات المؤرشفة",
"Toggle compact mode" : "تبديل النمط المضغوط",
"Hide card cover images" : "إخفِ صور غلاف البطاقات",
"Show card cover images" : "أظهِر صور غلاف البطاقات",
"Open details" : "افتح التفاصيل",
"Details" : "التفاصيل",
"Currently present people" : "الأشخاص الحاضرون الآن",
"Loading board" : "جارِ تحميل اللوح..",
"Board not found" : "اللوح غير موجود",
"No lists available" : "لا يوجد قائمة متاحه ",
"Create a new list to add cards to this board" : "إنشاء قائمة جديدة لإضافة البطاقات على هذا اللوح",
"Board not found" : "اللوح غير موجود",
"Sharing" : "المشاركة",
"Tags" : "الوسوم",
"Deleted items" : "العناصر الممسوحة",
"Activity" : "النشاط",
"Timeline" : "الجدول الزمني",
"Deleted lists" : "القوائم المحذوفة",
"Undo" : "تراجع",
"Deleted cards" : "البطاقات المحذوفة",
"Failed to create share with {displayName}" : "فشل في إنشاء المشاركة مع {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "هل أنت متأكد أنك تريد نقل اللوحة {title} إلى {user} ؟",
"Transfer the board." : "نقل اللوحة.",
"Transfer" : "نقل",
"The board has been transferred to {user}" : "تمّ نقل اللوحة إلى {user}",
"Failed to transfer the board to {user}" : "تعذّر نقل اللوحة إلى {user}",
"Share board with a user, group or team …" : "مشاركة اللوحة مع مستخدِم او مجموعة أو فريق ...",
"Searching for users, groups and teams …" : "البحث عن مستخدِمين، أو مجموعات، أو فرق",
"Share board with a user, group or circle …" : "مشاركة اللوح مع مستخدم،مجموعة أو دائرة ..",
"Searching for users, groups and circles …" : "ابحث عن أعضاء، مجموعات أو حلقات ...",
"No participants found" : "لم يتم العثور على مشاركين",
"Board owner" : "منشئ اللوح",
"(Group)" : "(مجموعة)",
"(Team)" : "(الفريق)",
"(Circle)" : "(دائرة)",
"Can edit" : "يمكن تعديله",
"Can share" : "يمكن مشاركته",
"Can manage" : "يمكن إدارته",
"Owner" : "المالك",
"Delete" : "حذف ",
"List deleted" : "القائمة حٌذفت ",
"Edit list title" : "تعديل اسم القائمة",
"Failed to create share with {displayName}" : "فشل في إنشاء المشاركة مع {displayName}",
"Add a new list" : "اضف قائمة جديدة",
"Archive all cards" : "أرشفة جميع البطاقات ",
"Unarchive all cards" : "تراجع عن أرشفة كل البطاقات",
"Delete list" : "حذف القائمة",
"Archive all cards in this list" : "أرشفة جميع البطاقات في القائمة ",
"Unarchive all cards in this list" : "تراجع عن أرشفة كل البطاقات في هذه القائمة",
"Add a new card" : "إضافة بطاقة جديدة",
"Card name" : "اسم البطاقة ",
"title and color value must be provided" : "العنوان و قيمة اللون يجب تقديمها ",
"List deleted" : "القائمة حٌذفت ",
"Edit" : "تعديل",
"Add a new tag" : "إضافة وسم جديد",
"title and color value must be provided" : "العنوان و قيمة اللون يجب تقديمها ",
"Board name" : "اسم اللوح",
"Members" : "الاعضاء",
"Assign to users/groups/team" : "إسناد إلى مستخدمين/مجموعات/فرق",
"Assign a user to this card…" : "انسب مستخدم الى هذه البطاقة..",
"Select a user to assign to this card…" : "حدِّد مستخدِماً ليتم إسناد هذه البطاقة له...",
"File to share" : "ملف للمشاركة",
"Invalid path selected" : "تم تحديد مسار غير صحيح",
"Upload new files" : "رفع ملفات جديدة",
"Share from Files" : "مشاركة من الملفات",
"Pending share" : "مشاركة مُعلّقة",
"Add this attachment" : "إضافة هذا المرفق",
"Show in Files" : "عرض في الملفات ",
"Download" : "تنزيل",
"Remove attachment" : "حذف المُرفق",
"Unshare file" : "عدم مشاركة الملف ",
"Delete Attachment" : "مسح المرفق",
"Restore Attachment" : "إستعادة المرفق",
"Modified" : "عُدل",
"Created" : "أُنشئ",
"The title cannot be empty." : "لا يمكن ترك العنوان فارغًا.",
"File to share" : "ملف للمشاركة",
"Invalid path selected" : "تم تحديد مسار غير صحيح",
"Open in sidebar view" : "فتح في الشريط الجانبي ",
"Open in bigger view" : "فتح في نافذة أكبر ",
"Attachments" : "المرفقات",
"Comments" : "تعليقات",
"Failed to load comments" : "فشل في تحميل التعليقات ",
"Modified" : "عُدل",
"Created" : "أُنشئ",
"The title cannot be empty." : "لا يمكن ترك العنوان فارغًا.",
"No comments yet. Begin the discussion!" : "لا يوجد تعليقات بعد, ابدأ النقاش الآن!",
"Failed to load comments" : "فشل في تحميل التعليقات ",
"Assign a tag to this card…" : "انسب وسم الى هذه البطاقة..",
"Assign to users" : "انسب الى المتسخدمين",
"Assign to users/groups/circles" : "انسب الى المستخدمين،المجموعات،الدوائر",
"Assign a user to this card…" : "انسب مستخدم الى هذه البطاقة..",
"Due date" : "تاريخ الانجاز",
"Set a due date" : "تعيين تاريخ الانجاز",
"Remove due date" : "ازالة تاريخ الانجاز",
"Select Date" : "اختر التاريخ ",
"Save" : "حفظ",
"The comment cannot be empty." : "التعليق لايمكن ان يكون فارغا.",
"The comment cannot be longer than 1000 characters." : "التعليق لا يمكن ان يكون اطول من 1000 حرف.",
"Save" : "حفظ",
"Created:" : "تاريخ الإنشاء :",
"In reply to" : "يقوم بالرد على",
"Cancel reply" : "إلغاء الرد",
"Reply" : "رد",
"Update" : "تحديث",
"Write a description …" : "كتابة وصف...",
"Description" : "الوصف",
"(Unsaved)" : "(غير محفوظ)",
"(Saving…)" : "(يُحفظ..)",
@@ -256,133 +223,53 @@ OC.L10N.register(
"Edit description" : "تعديل الوصف",
"View description" : "إظهار الوصف",
"Add Attachment" : "أضف ملحق",
"Write a description …" : "كتابة وصف...",
"Choose attachment" : "اختيار مرفق",
"Select Date" : "اختر التاريخ ",
"Later today {timeLocale}" : "في وقت لاحقٍ اليوم {timeLocale}",
"Set due date for later today" : "تعيين آخِرَ هذا اليوم كموعدٍ لاستحقاق البطاقة",
"Tomorrow {timeLocale}" : "غداً {timeLocale}",
"Set due date for tomorrow" : "تعيين يوم الغد كموعدٍ لاستحقاق البطاقة",
"This weekend {timeLocale}" : "نهاية هذا الأسبوع {timeLocale}",
"Set due date for this weekend" : "تعيين نهاية هذا الأسبوع كموعدٍ لاستحقاق البطاقة",
"Next week {timeLocale}" : "الأسبوع القادم {timeLocale}",
"Set due date for next week" : "تعيين الأسبوع المُقبل كموعدٍ لاستحقاق البطاقة",
"Assign a due date to this card…" : "تعيين تاريخ استحقاق لهذه البطاقة...",
"Set a due date" : "تعيين تاريخ الانجاز",
"Add due date" : "إضافة تاريخ الاستحقاق",
"Choose a date" : "إختَر تاريخاً",
"Remove due date" : "ازالة تاريخ الانجاز",
"Mark as done" : "تمييز كمُنجَز",
"Due at:" : "تاريخ الاستحقاق:",
"Not done" : "غير مُنجَزة",
"Unarchive card" : "إلغاء أرشفة البطاقة ",
"Archive card" : "أرشفة البطاقة",
"Assign a tag to this card…" : "انسب وسم الى هذه البطاقة..",
"Select or create a tag…" : "اختيار أو إنشاء وسم جديد...",
"Create a new tag:" : "إنشاء وسم جديد:",
"(group)" : "(مجموعة)",
"{count} comments, {unread} unread" : "{عدد} التعليقات، {غير مقروءة} غير مقروءة",
"Todo items" : "قائمة المهام",
"Edit card title" : "تعديل اسم القائمة",
"Open link" : "إفتَح الرابط",
"Card deleted" : "البطاقة حٌذفت ",
"Edit title" : "تحرير عنوان",
"Assign to me" : "ينسب لي",
"Unassign myself" : "إلغاء تعييني ",
"Mark as not done" : "تمييز كـ \"غير منتهٍ\"",
"Move card" : "حرك البطاقة",
"Unarchive card" : "إلغاء أرشفة البطاقة ",
"Archive card" : "أرشفة البطاقة",
"Delete card" : "حذف البطاقة",
"Move card to another board" : "حرك البطاقة الى لوح اخر",
"Card deleted" : "البطاقة حٌذفت ",
"seconds ago" : "ثوانٍ مضت",
"Keyboard shortcuts" : "اختصارات لوحة المفاتيح",
"Boost your productivity using Deck with keyboard shortcuts." : "ضاعِف إنتاجيتك باستعمال \"كَدسَات البطاقات\" Deck، و اختصارات لوحة المفاتيح ",
"Board actions" : "إجراءات اللوحة",
"Keyboard shortcut" : "إختصار لوحة المفاتيح",
"Action" : "الإجراء",
"Shift" : "العالي shift",
"Scroll" : "تحريك",
"Scroll sideways" : "تحريك للجنب",
"Navigate between cards" : "التنقُّل بين البطاقات",
"Esc" : "خروج",
"Close card details" : "أغلِق تفاصيل البطاقة",
"Ctrl" : "تحكم Ctrl",
"Search" : "بحث",
"Show card filters" : "أظهِر فلاتر البطاقة",
"Clear card filters" : "إمحُ فلاتر البطاقة",
"Show help dialog" : "أظهِر نافذة حوار المساعدة",
"Card actions" : "إجراءات البطاقة",
"The following actions can be triggered on the currently highlighted card" : "الإجراءات التالية يمكن تنفيذها على البطاقات المُعلّمة حالياً",
"Enter" : "إدخال",
"Space" : "المدى",
"Open card details" : "إفتَح تفاصيل البطاقة",
"Edit the card title" : "عدِّل عنوان البطاقة",
"Assign yourself to the current card" : "أسنِد هذه البطاقة إلى نفسِك",
"Archive/unarchive the current card" : "أرشِف أو ألغِ ترشيف البطاقة الحالية",
"Mark card as completed/not completed" : "علِّم بطاقة كـ\"منجزة\" أو \"غير منجزة\"",
"Open card menu" : "إفتَح قائمة البطاقات",
"All boards" : "جميع الالواح",
"Archived boards" : "الالواح المؤرشفة",
"Shared with you" : "تم مشاركتها معك",
"Deck settings" : "إعدادات \"كَدسَات البطاقات\"",
"Use bigger card view" : "استخدام بطاقة عرض أكبر ",
"Show card ID badge" : "أعرض شارة رقم البطاقة",
"Show boards in calendar/tasks" : "إظهار اللوح في التقويم/المهام",
"Limit board creation to some groups" : "قَصْرُ حَقِّ إنشاء اللوحات على بعض المجموعات ",
"Users outside of those groups will not be able to create their own boards, but will still be able to work on boards that have been shared with them." : "المستخدِمون من خارج تلك المجموعات لن يمكنكم إنشاء لوحاتهم الخاصة؛ لكن يمكنهم العمل على اللوحات التي تتمّ مشاركتها معهم.",
"Cancel edit" : "إلغاء التعديل",
"Save board" : "حفظ اللوحة",
"Board {0} deleted" : "اللوح {0} تم مسحه",
"All cards" : "جميع البطاقات ",
"Only assigned cards" : "البطاقات المخصصة فقط",
"No reminder" : "لا يوجد تذكير ",
"An error occurred" : "حدث خطأ",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "هل أنت متأكد من حذف اللوحة {title}؟ هذا سيؤدي إلى حذف كل بيانات هذه اللوحة بما في ذلك البطاقات المؤرشفة.",
"Delete the board?" : "مسح اللوح؟",
"Limit deck usage of groups" : "تقييد استخدام Deck للمجموعات",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "سيؤدي تقييد Deck إلى منع المستخدمين الذين ليسوا جزءًا من تلك المجموعات من إنشاء لوحاتهم الخاصة. سيظل المستخدمون قادرين على العمل على اللوحات التي تمت مشاركتها معهم.",
"Board details" : "تفاصيل لوح",
"Edit board" : "تعديل اللوح",
"Clone board" : "استنسخ اللوح",
"Unarchive board" : "إلغاء أرشفة اللوح",
"Archive board" : "أرشفة اللوح ",
"Export board" : "تصدير لوحة",
"Turn on due date reminders" : "تفعيل التذكيرات للموعد المحدد ",
"Turn off due date reminders" : "إيقاف تشغيل التذكيرات للموعد المحددد",
"Due date reminders" : "تذكيرات الموعد المحدد ",
"All cards" : "جميع البطاقات ",
"Assigned cards" : "البطاقات المخصصة",
"No notifications" : "لا توجد إشعارات",
"Delete board" : "مسح اللوح",
"Clone {boardTitle}" : "استنساخ {boardTitle}",
"Clone cards" : "استنسخ البطاقة ",
"Clone assignments" : "استنساخ مهام",
"Clone labels" : "استنساخ عناوين",
"Clone due dates" : "استنساخ تواريخ استحقاق",
"Advanced options" : "الخيارات المتقدمة",
"Move all cards to the first list" : "نقل كل البطاقات للقائمة الأولى",
"Restore archived cards" : "استرجاع البطاقات المؤرشفة",
"Clone" : "استنسخ",
"Export as CSV" : "صدِّر كـ CSV",
"Export" : "تصدير",
"Board {0} deleted" : "اللوح {0} تم مسحه",
"Only assigned cards" : "البطاقات المخصصة فقط",
"No reminder" : "لا يوجد تذكير ",
"An error occurred" : "حدث خطأ",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "هل انت متأكد تريد مسح اللوح {title}؟ هذا سوف يمسح جميع بيانات هذا اللوح.",
"Delete the board?" : "مسح اللوح؟",
"Loading filtered view" : "جارِ تحميل التصفية ",
"Today" : "اليوم",
"Tomorrow" : "غدا",
"This week" : "هذا الأسبوع",
"No due" : "غير محدد",
"Search for {searchQuery} in all boards" : "البحث عن {searchQuery} في جميع اللوح",
"No results found" : "لا يتم العثور على أي نتائج ",
"Deck board {name}\n* Last modified on {lastMod}" : "اسم اللوحة {name} \n* آخر تعديل لها في {lastMod}",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* أُنشأت في {created}\n* آخر تعديل لها في {lastMod}\n* {nbAttachments} مُرفقات\n* {nbComments} مُلاحظات",
"{nbCards} cards" : "{nbCards} بطاقات",
"Due on {date}" : "مطلوب في {date}",
"{stack} in {board}" : "{stack} في {board}",
"Click to expand description" : "إضعط للتوسّع في الوصف",
"Click to expand comment" : "إضغط للتوسع في الملاحظات",
"Create card" : "أنشى بطاقة ",
"Create a new card" : "أنشى بطاقة جديدة ",
"Card title" : "عنوان البطاقة ",
"Creating the new card …" : "أنشى البطاقة الجديدة ",
"Card \"{card}\" was added to \"{board}\"" : "\"{بطاقة}\" تمت إضافتها في \"{اللوح}\"",
"Open card" : "فتح البطاقة ",
"Close" : "إغلاق",
"No upcoming cards" : "لا يوجد بطاقات قادمة ",
"upcoming cards today" : "البطاقات القادمة اليومَ",
"upcoming cards tomorrow" : "البطاقات القادمة غداً",
"upcoming cards" : "البطاقات القادمة",
"New card" : "بطاقة جديدة",
"Link to a board" : "ربط بلوح",
"Link to a card" : "ربط ببطاقة",
"Create a card" : "أنشى بطاقة ",
@@ -390,18 +277,9 @@ OC.L10N.register(
"Something went wrong" : "حدث خطأ ما",
"Failed to upload {name}" : "فشل في رفع {اسم}",
"Maximum file size of {size} exceeded" : " تجاوز الملف الحد الاقصى {size} بالحجم المسموح ",
"Due date" : "تاريخ الاكتمال",
"Error creating the share" : "خطأ في إنشاء المشاركة",
"Share with a Deck card" : "مشاركة مع بطاقة Deck",
"Share {file} with a Deck card" : "مشاركة الملف {file} مع بطاقة Deck",
"Share" : "مشاركة ",
"Personal" : "شخصي",
"To do" : "لفعله",
"Doing" : "تحت العمل",
"Example Task 3" : "مثال المهمة 3",
"Example Task 2" : "مثال المهمة 2",
"Example Task 1" : "مثال المهمة 1",
"Move card to another board" : "حرك البطاقة الى لوح اخر",
"Filter by completed" : "تصفية بحسب الإنجاز"
"Share" : "مشاركة "
},
"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");

View File

@@ -35,10 +35,6 @@
"{user} has archived card {card} in list {stack} on board {board}" : "{user} قام بأرشفة بطاقة {card} في القائمة {stack} على اللوح {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "لديك بطاقة غير مؤرشفة {card} في القائمة {stack} على اللوح {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} لديه بطاقة غير مؤرشفة {card} في القائمة {stack} على اللوح {board}",
"You have marked the card {card} as done in list {stack} on board {board}" : "لقد قُمت بتمييز البطاقة {card} باعتبارها \"منتهية\" في القائمة {stack} على اللوحة {board}",
"{user} has marked card {card} as done in list {stack} on board {board}" : "قام المستخدِم {user} بتمييز البطاقة {card} باعتبارها \"منتهية\" في القائمة {stack} على اللوحة{board}",
"You have marked the card {card} as undone in list {stack} on board {board}" : "لقد قُمتَ أنت بتمييز البطاقة {card} باعتبارها \"غير منتهية\" في القائمة {stack} على اللوحة {board}",
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "قام المستخدِم {user} بتمييز البطاقة {card} باعتبارها \"غير منتهية\" في القائمة {stack} على اللوحة {board}",
"You have removed the due date of card {card}" : "قمت بإزالة التاريخ المحدد من البطاقة {card}",
"{user} has removed the due date of card {card}" : "{user} قام بإزالة التاريخ المحدد من البطاقة {card}",
"You have set the due date of card {card} to {after}" : "قمت بتعيين التاريخ المحدد للبطاقة {card} إلى {after}",
@@ -65,11 +61,34 @@
"{user} has restored the attachment {attachment} to card {card}" : "{user} قام باسترجاع المرفق {attachment} إلى البطاقة {card}",
"You have commented on card {card}" : "لقد علقت على البطاقة {بطاقة}",
"{user} has commented on card {card}" : "{مستخدم} علق على بطاقة {بطاقة}",
"A <strong>card description</strong> inside the Deck app has been changed" : "<strong>وصف البطاقة</strong>داخل تطبيق Deck قد تغيرت.",
"Deck" : "Deck",
"Changes in the <strong>Deck app</strong>" : "تغييرات في <strong>تطبيق Deck</strong> ",
"A <strong>board, list or card</strong> was changed" : "تمّ تغيير <strong>لوحة أو قائمة أو بطاقة </strong>.",
"A <strong>comment</strong> was created on a card" : "<strong>تعليق</strong> تم إنشاؤه على بطاقة",
"A <strong>card description</strong> has been changed" : "تمّ تغيير <strong>وصف بطاقة</strong>.",
"Upcoming cards" : "البطاقات القادمة",
"Personal" : "شخصي",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "البطاقة \"%s\" على \"%s\" كُلفت بها من قبل %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} قام بتكليف البطاقة {deck-board} على {deck-board} لك",
"The card \"%s\" on \"%s\" has reached its due date." : "وصلت بطاقة \"%s\" على %s\" الموعد المحدد ",
"The card {deck-card} on {deck-board} has reached its due date." : "تجاوزت البطاقة {deck-card} على {deck-board} التاريخ المحدد.",
"%s has mentioned you in a comment on \"%s\"." : "%s أشار إليك في تعليق على \"%s\".",
"{user} has mentioned you in a comment on {deck-card}." : "{user} أشار إليك في تعليق على {deck-card}",
"The board \"%s\" has been shared with you by %s." : "تمت مشاركة اللوح \"%s\" معك من قبل %s.",
"{user} has shared {deck-board} with you." : "{user} قام بمشاركة {deck-board} معك.",
"Card comments" : "تعليقات البطاقة ",
"%s on %s" : "%s على %s",
"No data was provided to create an attachment." : "لا بيانات تم تقديمها لانشاء مرفق",
"Finished" : "اكتمل",
"To review" : "لإعادة المراجعة",
"Action needed" : "يحتاج إلى إجراء",
"Later" : "لاحقا",
"copy" : "نسخ",
"To do" : "لفعله",
"Doing" : "تحت العمل",
"Done" : "أُنجز",
"Example Task 3" : "مثال المهمة 3",
"Example Task 2" : "مثال المهمة 2",
"Example Task 1" : "مثال المهمة 1",
"The file was uploaded" : "تم رفع الملف",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "حجم الملف المرفوع قد تجاوز upload_max_filesize الموجودة في ملف php.ini ",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "حجم الملف الذي تريد رفعه أعلى من الحد المسموح به في واجهة ال HTML.",
@@ -79,84 +98,44 @@
"Could not write file to disk" : "لم يستطع كتابة ملف للقرص",
"A PHP extension stopped the file upload" : "إضافة البي اچ بي PHP أوقفت رفع الملف",
"No file uploaded or file size exceeds maximum of %s" : "لم يتم تحميل أي ملف أو أن يتجاوز حجم الملف الحد الأقصى %s",
"Cards due today" : "البطاقات المستحقة اليوم",
"Cards due tomorrow" : "البطاقات المستحقة غداً",
"Upcoming cards" : "البطاقات القادمة",
"Load more" : "حمّل أكثر",
"Welcome to Nextcloud Deck!" : "أهلا بكم في تطبيق \"الكدسات\" Deck من نكست كلاود! ",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "البطاقة \"%s\" على \"%s\" كُلفت بها من قبل %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} قام بتكليف البطاقة {deck-board} على {deck-board} لك",
"The card \"%s\" on \"%s\" has reached its due date." : "وصلت بطاقة \"%s\" على %s\" الموعد المحدد ",
"The card {deck-card} on {deck-board} has reached its due date." : "تجاوزت البطاقة {deck-card} على {deck-board} التاريخ المحدد.",
"%s has mentioned you in a comment on \"%s\"." : "%s أشار إليك في تعليق على \"%s\".",
"{user} has mentioned you in a comment on {deck-card}." : "{user} أشار إليك في تعليق على {deck-card}",
"The board \"%s\" has been shared with you by %s." : "تمت مشاركة اللوح \"%s\" معك من قبل %s.",
"{user} has shared {deck-board} with you." : "{user} قام بمشاركة {deck-board} معك.",
"Deck board" : "لوحة البطاقات",
"Owned by %1$s" : "يملكها %1$s",
"Deck boards, cards and comments" : "اللوحات و البطاقات و الملاحظات",
"From %1$s, in %2$s/%3$s, owned by %4$s" : " من %1$s، في %2$s/%3$s، يملكها %4$s",
"Create a new deck card" : "إنشاء كدسة جديدة للبطاقات",
"Card comments" : "تعليقات البطاقة ",
"%s on %s" : "%s على %s",
"Deck boards and cards" : "اللوحات و البطاقات",
"No data was provided to create an attachment." : "لا بيانات تم تقديمها لانشاء مرفق",
"Finished" : "اكتمل",
"To review" : "لإعادة المراجعة",
"Action needed" : "يحتاج إلى إجراء",
"Later" : "لاحقا",
"copy" : "نسخ",
"Read more inside" : "إقرإ المزيد بالداخل",
"Custom lists - click to rename!" : "قوائم مخصصة - أنقُر لتغيير التسمية!",
"To Do" : "مَهَامٌّ",
"In Progress" : "قيد التجهيز",
"Done" : "أُنجز",
"1. Open to learn more about boards and cards" : "1. إفتَح لتعرِف المزيد عن اللوحات والبطاقات",
"2. Drag cards left and right, up and down" : "2. سحب البطاقات يميناً ويساراً، لأعلي وأسفل",
"3. Apply rich formatting and link content" : "3. تطبيق التنسيق و ربط المحتوى",
"4. Share, comment and collaborate!" : "4. مشاركات، و ملاحظات، وتعاون!",
"Create your first card!" : "أنشِئ بطاقتك الأولى!",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : " هذه الملاحظات فيها أكثر من %s حرفاً.\n تمّت إضافتها كمُرفق إلى البطاقة التي اسمها%s.\n الموجودة على الرابط %s.",
"Card not found" : "لم يتم العثور على البطاقة ",
"Path is already shared with this card" : "تم مشاركة المسار بالفعل مع هذه البطاقة ",
"Invalid date, date format must be YYYY-MM-DD" : "تاريخ غير صحيح, يجب أن يكون تنسيق التاريخ YYYY-MM-DD",
"Personal planning and team project organization" : "التخطيط الشخصي و تنظيم مشروع الفريق",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "التطبيق \"كَدسَات البطاقات\" Deck هو أداة لتنظيم المهام الشخصية و الجماعية في نكست كلاود على نمط \"خطوط التصنيع أو التجميع في المصانع\" و المعروف بـ kanban.\n\n\n- 📥 أكتب مهامّك او مهامّ فريقك على بطاقة و ضع البطاقة في مكانها المناسب\n- 📄 دوّن ملاحظاتك الإضافية على البطاقة بصيغة ماركداون markdown\n- 🔖 و يمكنك أيضاً وضع لواصق labels على البطاقة لتصنيفها بشكل أفضل\n- 👥 شارك البطاقة مع من ترغب من أعضاء فريقك أو عائلتك أو أصدقائك\n- 📎 إرفاق ملفات و تضمينها بصيغة ماركداون في البطاقة\n- 💬ناقش البطاقة مع زملائك في خانة الملاحظات\n- ⚡ تابع ما يُستجد من عمليات و تطوّرات على البطاقة أو المهمة\n- 🚀 حافظ على مشروعك مُنسّقاً باستمرار.",
"Add board" : "إضافة لوح",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "دك (Deck) هو أداة تنظيم باسلوب كانبان (kanban) تهدف إلى التخطيط الشخصي وتنظيم المشروع للفرق مع نيكست كلاود (Nextcloud).\n- 📥 إضافة مهامك إلى البطاقات وترتيبها\n- 📄 كتابة ملاحظات إضافية باستخدام مارك داون (markdown)\n- 🔖 تعيين تسميات لتنظيم أفضل\n- 👥 شارك مع فريقك أو أصدقائك أو عائلتك\n- 📎 إرفاق الملفات وتضمينها بالوصف المستخدم فيه مارك داون (markdown)\n- 💬 ناقش مع فريقك باستخدام التعليقات\n- ⚡ تتبع التغييرات في تيار النشاط\n- 🚀 اجعل مشروعك منظماً",
"Card details" : "تفاصيل البطاقة",
"Add board" : "إضافة لوح",
"Select the board to link to a project" : "تحديد اللوح لربطه بمشروع",
"Search by board title" : "بحث بواسطة عنوان اللوح",
"Select board" : "حدد لوح",
"Move/copy card" : "نسخ أو نقل بطاقة",
"Create a new card" : "أنشى بطاقة جديدة ",
"Select a board" : "حدد لوح",
"No lists available" : "لا يوجد قائمة متاحه ",
"Select a list" : "اختر قائمة ",
"Move card" : "حرك البطاقة",
"Copy card" : "نسخ بطاقة",
"Card title" : "عنوان البطاقة ",
"Cancel" : "إلغاء",
"Creating the new card …" : "أنشى البطاقة الجديدة ",
"Card \"{card}\" was added to \"{board}\"" : "\"{بطاقة}\" تمت إضافتها في \"{اللوح}\"",
"Open card" : "فتح البطاقة ",
"Close" : "إغلاق",
"Create card" : "أنشى بطاقة ",
"Select a card" : "حدد بطاقة",
"Select the card to link to a project" : "حدد البطاقة لربطها بمشروع",
"Link to card" : "اربط بطاقة",
"Select a card" : "حدد بطاقة",
"Cancel" : "إلغاء",
"This board is read only" : "هذا اللوح بوضع القراءة فقط",
"Drop your files to upload" : "افلت الملفات لرفعها",
"File already exists" : "الملف موجود مسبقاً",
"A file with the name {filename} already exists." : "ملف باسم {اسم الملف} موجود مسبقًا ",
"Do you want to overwrite it?" : "هل تريد تجاوزه؟",
"Overwrite file" : "تجاوز ملف",
"Keep existing file" : "ابقي الملف الموجود",
"This board is read only" : "هذا اللوح بوضع القراءة فقط",
"Drop your files to upload" : "افلت الملفات لرفعها",
"Add card" : "إضافة بطاقة",
"Archived cards" : "البطاقات المؤرشفة",
"Add list" : "إضافة قائمة",
"List name" : "قامة اسماء",
"Active filters" : "فلاتر نشطة",
"Apply filter" : "تطبيق التصفية",
"Filter by tag" : "تصفية بواسطة الوسم",
"Filter by assigned user" : "تصفية بواسطة المستخدم الموكل اليه",
"Unassigned" : "غير معيين ",
"Filter by status" : "تصفية بحسب الحالة",
"Open and completed" : "مفتوحة و منجزة",
"Open" : "فتح",
"Completed" : "مُكتمل",
"Filter by due date" : "تصفية بواسطة تاريخ الإنجاز",
"Overdue" : "تأخر",
"Next 24 hours" : "ال 24 ساعة القادمة",
@@ -164,89 +143,77 @@
"Next 30 days" : "ال 30 يوم القادمة",
"No due date" : "لا تاريخ إنجاز",
"Clear filter" : "ازل التصفية",
"View Modes" : "وضعيات العرض",
"Toggle View Modes" : "التبديل بين وضعيات العرض",
"Hide archived cards" : "إخفاء البطاقات المؤرشفة ",
"Show archived cards" : "اظهر البطاقات المؤرشفة",
"Toggle compact mode" : "تبديل النمط المضغوط",
"Hide card cover images" : "إخفِ صور غلاف البطاقات",
"Show card cover images" : "أظهِر صور غلاف البطاقات",
"Open details" : "افتح التفاصيل",
"Details" : "التفاصيل",
"Currently present people" : "الأشخاص الحاضرون الآن",
"Loading board" : "جارِ تحميل اللوح..",
"Board not found" : "اللوح غير موجود",
"No lists available" : "لا يوجد قائمة متاحه ",
"Create a new list to add cards to this board" : "إنشاء قائمة جديدة لإضافة البطاقات على هذا اللوح",
"Board not found" : "اللوح غير موجود",
"Sharing" : "المشاركة",
"Tags" : "الوسوم",
"Deleted items" : "العناصر الممسوحة",
"Activity" : "النشاط",
"Timeline" : "الجدول الزمني",
"Deleted lists" : "القوائم المحذوفة",
"Undo" : "تراجع",
"Deleted cards" : "البطاقات المحذوفة",
"Failed to create share with {displayName}" : "فشل في إنشاء المشاركة مع {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "هل أنت متأكد أنك تريد نقل اللوحة {title} إلى {user} ؟",
"Transfer the board." : "نقل اللوحة.",
"Transfer" : "نقل",
"The board has been transferred to {user}" : "تمّ نقل اللوحة إلى {user}",
"Failed to transfer the board to {user}" : "تعذّر نقل اللوحة إلى {user}",
"Share board with a user, group or team …" : "مشاركة اللوحة مع مستخدِم او مجموعة أو فريق ...",
"Searching for users, groups and teams …" : "البحث عن مستخدِمين، أو مجموعات، أو فرق",
"Share board with a user, group or circle …" : "مشاركة اللوح مع مستخدم،مجموعة أو دائرة ..",
"Searching for users, groups and circles …" : "ابحث عن أعضاء، مجموعات أو حلقات ...",
"No participants found" : "لم يتم العثور على مشاركين",
"Board owner" : "منشئ اللوح",
"(Group)" : "(مجموعة)",
"(Team)" : "(الفريق)",
"(Circle)" : "(دائرة)",
"Can edit" : "يمكن تعديله",
"Can share" : "يمكن مشاركته",
"Can manage" : "يمكن إدارته",
"Owner" : "المالك",
"Delete" : "حذف ",
"List deleted" : "القائمة حٌذفت ",
"Edit list title" : "تعديل اسم القائمة",
"Failed to create share with {displayName}" : "فشل في إنشاء المشاركة مع {displayName}",
"Add a new list" : "اضف قائمة جديدة",
"Archive all cards" : "أرشفة جميع البطاقات ",
"Unarchive all cards" : "تراجع عن أرشفة كل البطاقات",
"Delete list" : "حذف القائمة",
"Archive all cards in this list" : "أرشفة جميع البطاقات في القائمة ",
"Unarchive all cards in this list" : "تراجع عن أرشفة كل البطاقات في هذه القائمة",
"Add a new card" : "إضافة بطاقة جديدة",
"Card name" : "اسم البطاقة ",
"title and color value must be provided" : "العنوان و قيمة اللون يجب تقديمها ",
"List deleted" : "القائمة حٌذفت ",
"Edit" : "تعديل",
"Add a new tag" : "إضافة وسم جديد",
"title and color value must be provided" : "العنوان و قيمة اللون يجب تقديمها ",
"Board name" : "اسم اللوح",
"Members" : "الاعضاء",
"Assign to users/groups/team" : "إسناد إلى مستخدمين/مجموعات/فرق",
"Assign a user to this card…" : "انسب مستخدم الى هذه البطاقة..",
"Select a user to assign to this card…" : "حدِّد مستخدِماً ليتم إسناد هذه البطاقة له...",
"File to share" : "ملف للمشاركة",
"Invalid path selected" : "تم تحديد مسار غير صحيح",
"Upload new files" : "رفع ملفات جديدة",
"Share from Files" : "مشاركة من الملفات",
"Pending share" : "مشاركة مُعلّقة",
"Add this attachment" : "إضافة هذا المرفق",
"Show in Files" : "عرض في الملفات ",
"Download" : "تنزيل",
"Remove attachment" : "حذف المُرفق",
"Unshare file" : "عدم مشاركة الملف ",
"Delete Attachment" : "مسح المرفق",
"Restore Attachment" : "إستعادة المرفق",
"Modified" : "عُدل",
"Created" : "أُنشئ",
"The title cannot be empty." : "لا يمكن ترك العنوان فارغًا.",
"File to share" : "ملف للمشاركة",
"Invalid path selected" : "تم تحديد مسار غير صحيح",
"Open in sidebar view" : "فتح في الشريط الجانبي ",
"Open in bigger view" : "فتح في نافذة أكبر ",
"Attachments" : "المرفقات",
"Comments" : "تعليقات",
"Failed to load comments" : "فشل في تحميل التعليقات ",
"Modified" : "عُدل",
"Created" : "أُنشئ",
"The title cannot be empty." : "لا يمكن ترك العنوان فارغًا.",
"No comments yet. Begin the discussion!" : "لا يوجد تعليقات بعد, ابدأ النقاش الآن!",
"Failed to load comments" : "فشل في تحميل التعليقات ",
"Assign a tag to this card…" : "انسب وسم الى هذه البطاقة..",
"Assign to users" : "انسب الى المتسخدمين",
"Assign to users/groups/circles" : "انسب الى المستخدمين،المجموعات،الدوائر",
"Assign a user to this card…" : "انسب مستخدم الى هذه البطاقة..",
"Due date" : "تاريخ الانجاز",
"Set a due date" : "تعيين تاريخ الانجاز",
"Remove due date" : "ازالة تاريخ الانجاز",
"Select Date" : "اختر التاريخ ",
"Save" : "حفظ",
"The comment cannot be empty." : "التعليق لايمكن ان يكون فارغا.",
"The comment cannot be longer than 1000 characters." : "التعليق لا يمكن ان يكون اطول من 1000 حرف.",
"Save" : "حفظ",
"Created:" : "تاريخ الإنشاء :",
"In reply to" : "يقوم بالرد على",
"Cancel reply" : "إلغاء الرد",
"Reply" : "رد",
"Update" : "تحديث",
"Write a description …" : "كتابة وصف...",
"Description" : "الوصف",
"(Unsaved)" : "(غير محفوظ)",
"(Saving…)" : "(يُحفظ..)",
@@ -254,133 +221,53 @@
"Edit description" : "تعديل الوصف",
"View description" : "إظهار الوصف",
"Add Attachment" : "أضف ملحق",
"Write a description …" : "كتابة وصف...",
"Choose attachment" : "اختيار مرفق",
"Select Date" : "اختر التاريخ ",
"Later today {timeLocale}" : "في وقت لاحقٍ اليوم {timeLocale}",
"Set due date for later today" : "تعيين آخِرَ هذا اليوم كموعدٍ لاستحقاق البطاقة",
"Tomorrow {timeLocale}" : "غداً {timeLocale}",
"Set due date for tomorrow" : "تعيين يوم الغد كموعدٍ لاستحقاق البطاقة",
"This weekend {timeLocale}" : "نهاية هذا الأسبوع {timeLocale}",
"Set due date for this weekend" : "تعيين نهاية هذا الأسبوع كموعدٍ لاستحقاق البطاقة",
"Next week {timeLocale}" : "الأسبوع القادم {timeLocale}",
"Set due date for next week" : "تعيين الأسبوع المُقبل كموعدٍ لاستحقاق البطاقة",
"Assign a due date to this card…" : "تعيين تاريخ استحقاق لهذه البطاقة...",
"Set a due date" : "تعيين تاريخ الانجاز",
"Add due date" : "إضافة تاريخ الاستحقاق",
"Choose a date" : "إختَر تاريخاً",
"Remove due date" : "ازالة تاريخ الانجاز",
"Mark as done" : "تمييز كمُنجَز",
"Due at:" : "تاريخ الاستحقاق:",
"Not done" : "غير مُنجَزة",
"Unarchive card" : "إلغاء أرشفة البطاقة ",
"Archive card" : "أرشفة البطاقة",
"Assign a tag to this card…" : "انسب وسم الى هذه البطاقة..",
"Select or create a tag…" : "اختيار أو إنشاء وسم جديد...",
"Create a new tag:" : "إنشاء وسم جديد:",
"(group)" : "(مجموعة)",
"{count} comments, {unread} unread" : "{عدد} التعليقات، {غير مقروءة} غير مقروءة",
"Todo items" : "قائمة المهام",
"Edit card title" : "تعديل اسم القائمة",
"Open link" : "إفتَح الرابط",
"Card deleted" : "البطاقة حٌذفت ",
"Edit title" : "تحرير عنوان",
"Assign to me" : "ينسب لي",
"Unassign myself" : "إلغاء تعييني ",
"Mark as not done" : "تمييز كـ \"غير منتهٍ\"",
"Move card" : "حرك البطاقة",
"Unarchive card" : "إلغاء أرشفة البطاقة ",
"Archive card" : "أرشفة البطاقة",
"Delete card" : "حذف البطاقة",
"Move card to another board" : "حرك البطاقة الى لوح اخر",
"Card deleted" : "البطاقة حٌذفت ",
"seconds ago" : "ثوانٍ مضت",
"Keyboard shortcuts" : "اختصارات لوحة المفاتيح",
"Boost your productivity using Deck with keyboard shortcuts." : "ضاعِف إنتاجيتك باستعمال \"كَدسَات البطاقات\" Deck، و اختصارات لوحة المفاتيح ",
"Board actions" : "إجراءات اللوحة",
"Keyboard shortcut" : "إختصار لوحة المفاتيح",
"Action" : "الإجراء",
"Shift" : "العالي shift",
"Scroll" : "تحريك",
"Scroll sideways" : "تحريك للجنب",
"Navigate between cards" : "التنقُّل بين البطاقات",
"Esc" : "خروج",
"Close card details" : "أغلِق تفاصيل البطاقة",
"Ctrl" : "تحكم Ctrl",
"Search" : "بحث",
"Show card filters" : "أظهِر فلاتر البطاقة",
"Clear card filters" : "إمحُ فلاتر البطاقة",
"Show help dialog" : "أظهِر نافذة حوار المساعدة",
"Card actions" : "إجراءات البطاقة",
"The following actions can be triggered on the currently highlighted card" : "الإجراءات التالية يمكن تنفيذها على البطاقات المُعلّمة حالياً",
"Enter" : "إدخال",
"Space" : "المدى",
"Open card details" : "إفتَح تفاصيل البطاقة",
"Edit the card title" : "عدِّل عنوان البطاقة",
"Assign yourself to the current card" : "أسنِد هذه البطاقة إلى نفسِك",
"Archive/unarchive the current card" : "أرشِف أو ألغِ ترشيف البطاقة الحالية",
"Mark card as completed/not completed" : "علِّم بطاقة كـ\"منجزة\" أو \"غير منجزة\"",
"Open card menu" : "إفتَح قائمة البطاقات",
"All boards" : "جميع الالواح",
"Archived boards" : "الالواح المؤرشفة",
"Shared with you" : "تم مشاركتها معك",
"Deck settings" : "إعدادات \"كَدسَات البطاقات\"",
"Use bigger card view" : "استخدام بطاقة عرض أكبر ",
"Show card ID badge" : "أعرض شارة رقم البطاقة",
"Show boards in calendar/tasks" : "إظهار اللوح في التقويم/المهام",
"Limit board creation to some groups" : "قَصْرُ حَقِّ إنشاء اللوحات على بعض المجموعات ",
"Users outside of those groups will not be able to create their own boards, but will still be able to work on boards that have been shared with them." : "المستخدِمون من خارج تلك المجموعات لن يمكنكم إنشاء لوحاتهم الخاصة؛ لكن يمكنهم العمل على اللوحات التي تتمّ مشاركتها معهم.",
"Cancel edit" : "إلغاء التعديل",
"Save board" : "حفظ اللوحة",
"Board {0} deleted" : "اللوح {0} تم مسحه",
"All cards" : "جميع البطاقات ",
"Only assigned cards" : "البطاقات المخصصة فقط",
"No reminder" : "لا يوجد تذكير ",
"An error occurred" : "حدث خطأ",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "هل أنت متأكد من حذف اللوحة {title}؟ هذا سيؤدي إلى حذف كل بيانات هذه اللوحة بما في ذلك البطاقات المؤرشفة.",
"Delete the board?" : "مسح اللوح؟",
"Limit deck usage of groups" : "تقييد استخدام Deck للمجموعات",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "سيؤدي تقييد Deck إلى منع المستخدمين الذين ليسوا جزءًا من تلك المجموعات من إنشاء لوحاتهم الخاصة. سيظل المستخدمون قادرين على العمل على اللوحات التي تمت مشاركتها معهم.",
"Board details" : "تفاصيل لوح",
"Edit board" : "تعديل اللوح",
"Clone board" : "استنسخ اللوح",
"Unarchive board" : "إلغاء أرشفة اللوح",
"Archive board" : "أرشفة اللوح ",
"Export board" : "تصدير لوحة",
"Turn on due date reminders" : "تفعيل التذكيرات للموعد المحدد ",
"Turn off due date reminders" : "إيقاف تشغيل التذكيرات للموعد المحددد",
"Due date reminders" : "تذكيرات الموعد المحدد ",
"All cards" : "جميع البطاقات ",
"Assigned cards" : "البطاقات المخصصة",
"No notifications" : "لا توجد إشعارات",
"Delete board" : "مسح اللوح",
"Clone {boardTitle}" : "استنساخ {boardTitle}",
"Clone cards" : "استنسخ البطاقة ",
"Clone assignments" : "استنساخ مهام",
"Clone labels" : "استنساخ عناوين",
"Clone due dates" : "استنساخ تواريخ استحقاق",
"Advanced options" : "الخيارات المتقدمة",
"Move all cards to the first list" : "نقل كل البطاقات للقائمة الأولى",
"Restore archived cards" : "استرجاع البطاقات المؤرشفة",
"Clone" : "استنسخ",
"Export as CSV" : "صدِّر كـ CSV",
"Export" : "تصدير",
"Board {0} deleted" : "اللوح {0} تم مسحه",
"Only assigned cards" : "البطاقات المخصصة فقط",
"No reminder" : "لا يوجد تذكير ",
"An error occurred" : "حدث خطأ",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "هل انت متأكد تريد مسح اللوح {title}؟ هذا سوف يمسح جميع بيانات هذا اللوح.",
"Delete the board?" : "مسح اللوح؟",
"Loading filtered view" : "جارِ تحميل التصفية ",
"Today" : "اليوم",
"Tomorrow" : "غدا",
"This week" : "هذا الأسبوع",
"No due" : "غير محدد",
"Search for {searchQuery} in all boards" : "البحث عن {searchQuery} في جميع اللوح",
"No results found" : "لا يتم العثور على أي نتائج ",
"Deck board {name}\n* Last modified on {lastMod}" : "اسم اللوحة {name} \n* آخر تعديل لها في {lastMod}",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* أُنشأت في {created}\n* آخر تعديل لها في {lastMod}\n* {nbAttachments} مُرفقات\n* {nbComments} مُلاحظات",
"{nbCards} cards" : "{nbCards} بطاقات",
"Due on {date}" : "مطلوب في {date}",
"{stack} in {board}" : "{stack} في {board}",
"Click to expand description" : "إضعط للتوسّع في الوصف",
"Click to expand comment" : "إضغط للتوسع في الملاحظات",
"Create card" : "أنشى بطاقة ",
"Create a new card" : "أنشى بطاقة جديدة ",
"Card title" : "عنوان البطاقة ",
"Creating the new card …" : "أنشى البطاقة الجديدة ",
"Card \"{card}\" was added to \"{board}\"" : "\"{بطاقة}\" تمت إضافتها في \"{اللوح}\"",
"Open card" : "فتح البطاقة ",
"Close" : "إغلاق",
"No upcoming cards" : "لا يوجد بطاقات قادمة ",
"upcoming cards today" : "البطاقات القادمة اليومَ",
"upcoming cards tomorrow" : "البطاقات القادمة غداً",
"upcoming cards" : "البطاقات القادمة",
"New card" : "بطاقة جديدة",
"Link to a board" : "ربط بلوح",
"Link to a card" : "ربط ببطاقة",
"Create a card" : "أنشى بطاقة ",
@@ -388,18 +275,9 @@
"Something went wrong" : "حدث خطأ ما",
"Failed to upload {name}" : "فشل في رفع {اسم}",
"Maximum file size of {size} exceeded" : " تجاوز الملف الحد الاقصى {size} بالحجم المسموح ",
"Due date" : "تاريخ الاكتمال",
"Error creating the share" : "خطأ في إنشاء المشاركة",
"Share with a Deck card" : "مشاركة مع بطاقة Deck",
"Share {file} with a Deck card" : "مشاركة الملف {file} مع بطاقة Deck",
"Share" : "مشاركة ",
"Personal" : "شخصي",
"To do" : "لفعله",
"Doing" : "تحت العمل",
"Example Task 3" : "مثال المهمة 3",
"Example Task 2" : "مثال المهمة 2",
"Example Task 1" : "مثال المهمة 1",
"Move card to another board" : "حرك البطاقة الى لوح اخر",
"Filter by completed" : "تصفية بحسب الإنجاز"
"Share" : "مشاركة "
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
}

View File

@@ -1,118 +1,44 @@
OC.L10N.register(
"deck",
{
"Deck" : "Tarxeteru",
"The file was uploaded" : "Xubióse'l ficheru",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El ficheru xubíu supera la direutiva «upload_max_filesize» del ficheru php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El ficheru xubíu supera la direutiva «MAX_FILE_SIZE» que s'especificó nel formulariu HTML",
"No file was uploaded" : "Nun se xubió nengún ficheru",
"Missing a temporary folder" : "Falta una carpeta temporal",
"Could not write file to disk" : "Nun se pudo escribir el ficheru nel discu",
"A PHP extension stopped the file upload" : "Una estensión PHP paró la xuba de ficheros",
"No file uploaded or file size exceeds maximum of %s" : "Nun se xubió nengún ficheru o'l tamañu del ficheru supera'l máximu de %s",
"Upcoming cards" : "Tarxetes próximes",
"Load more" : "Cargar más",
"Deck board" : "Mesa de tarxetes",
"%s on %s" : "%s n %s",
"Action needed" : "Aición necesaria",
"copy" : "copia",
"Deck" : "Deck",
"Personal" : "Personal",
"Finished" : "Finó",
"Action needed" : "Precísase aición",
"Later" : "Más sero",
"Done" : "Fecho",
"Invalid date, date format must be YYYY-MM-DD" : "La data ye inválida, el so formatu ha ser AAAA-MM-DD",
"Move card" : "Mover la tarxeta",
"The file was uploaded" : "Xubióse'l ficheru",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El ficheru xubíu perpasa la direutiva de xuba upload_max_filesize en php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El ficheru xubíu perpasa la direutiva \"MAX_FILE_SIZE\" especificada nel formulariu HTML",
"No file was uploaded" : "Nun se xubieron fichjeros",
"Missing a temporary folder" : "Falta un direutoriu temporal",
"Could not write file to disk" : "Nun pudo escribise nel discu'l ficheru",
"A PHP extension stopped the file upload" : "Una estensión de PHP paró la xuba de ficheros",
"Cancel" : "Encaboxar",
"Drop your files to upload" : "Suelta los ficheros pa xubilos",
"File already exists" : "El ficheru yá esiste",
"Add card" : "Amestar una tarxeta",
"Archived cards" : "Tarxetes archivaes",
"Add list" : "Amestar una llista",
"List name" : "Nome de la llista",
"Open" : "Abrir",
"Completed" : "Completáu",
"Next 24 hours" : "Les próximes 24 hores",
"Next 7 days" : "Los próximos 7 díes",
"Next 30 days" : "Los próximos 30 díes",
"Open details" : "Abrir los detalles",
"File already exists" : "Yá esiste'l ficheru",
"Show archived cards" : "Amosar tarxetes archivaes",
"Details" : "Detalles",
"Sharing" : "Comparticiñon",
"Sharing" : "Compartiendo",
"Tags" : "Etiquetes",
"Deleted items" : "Elementos desaniciaos",
"Activity" : "Actividá",
"Deleted lists" : "Llistes desaniciaes",
"Undo" : "Desfacer",
"Deleted cards" : "Tarxetes desaniciaes",
"Transfer" : "Tresferir",
"(Group)" : "(Grupu)",
"(Team)" : "(Equipu)",
"Can edit" : "Pue editar",
"Owner" : "Propietariu",
"Can edit" : "Can edit",
"Can share" : "Can share",
"Delete" : "Desaniciar",
"List deleted" : "Desanicióse la llista",
"Edit list title" : "Editar el títulu de la llista",
"Archive all cards" : "Archivar toles carpetes",
"Unarchive all cards" : "Desarchivar toles tarxetes",
"Delete list" : "Desaniciar la llista",
"Archive all cards in this list" : "Archivar toles tarxetes d'esta llista",
"Unarchive all cards in this list" : "Desarchivar toles tarxetes d'esta llista",
"Add a new card" : "Amestar una tarxeta nueva",
"Card name" : "Nome de la tarxeta",
"Edit" : "Editar",
"Add a new tag" : "Amestar una etiqueta nueva",
"Members" : "Miembros",
"Invalid path selected" : "Seleicionóse un camín inválidu",
"Show in Files" : "Amosar en Ficheros",
"Download" : "Baxar",
"Modified" : "Modificóse",
"The title cannot be empty." : "El títulu nun pue tar baleru",
"Attachments" : "Axuntos",
"Comments" : "Comentarios",
"Failed to load comments" : "Nun se puen cargar los comentarios",
"No comments yet. Begin the discussion!" : "Nun hai nengún comentariu. ¡Comienza'l discutiniu!",
"The comment cannot be empty." : "El comentariu nun pue tar baleru.",
"Modified" : "Modificóse'l",
"Created" : "Creóse",
"Save" : "Guardar",
"Created:" : "Creóse'l",
"In reply to" : "En rempuesta a",
"Reply" : "Responder",
"Reply" : "Rempuesta",
"Update" : "Anovar",
"Description" : "Descripción",
"(Unsaved)" : "(ensin guardar)",
"(Saving…)" : "(Guardando…)",
"Formatting help" : "Ayuda del formatu",
"Edit description" : "Editar la descripción",
"View description" : "Ver la descripción",
"Tomorrow {timeLocale}" : "Mañana {timeLocale}",
"This weekend {timeLocale}" : "Esta fin de selmana {timeLocale}",
"Next week {timeLocale}" : "La próxima selmana {timeLocale}",
"Mark as done" : "Marcar como fecha",
"Archive card" : "Archivar la tarxeta",
"(group)" : "(grupu)",
"Edit title" : "Editar el títulu",
"Delete card" : "Desaniciar la tarxeta",
"seconds ago" : "hai segundos",
"Keyboard shortcuts" : "Atayos del tecláu",
"Keyboard shortcut" : "Atayos del tecláu",
"Action" : "Aición",
"Ctrl" : "Ctrl",
"Search" : "Guetar",
"Shared with you" : "Compartióse contigo",
"Cancel edit" : "Anular la edición",
"All cards" : "Toles tarxetes",
"No reminder" : "Nun hai nengún recordatoriu",
"An error occurred" : "Prodúxose un error",
"No notifications" : "Nun hai nengún avisu",
"Clone cards" : "Clonar les tarxetes",
"Advanced options" : "Opciones avanzaes",
"Export" : "Esportar",
"Shared with you" : "Shared with you",
"Today" : "Güei",
"Tomorrow" : "Mañana",
"No results found" : "Nun s'atopó nengún resultáu",
"Close" : "Zarrar",
"Message from {author} in {conversationName}" : "Mensaxe de {author} en {conversationName}",
"Due date" : "Data de fin",
"Error creating the share" : "Hebo un error al crear la compartición",
"Share" : "Compartir",
"Personal" : "Personal",
"To do" : "Xera pendiente",
"Example Task 3" : "Xera d'exemplu 3",
"Example Task 2" : "Xera d'exemplu 2",
"Example Task 1" : "Xera d'exemplu 1"
"This week" : "Esta selmana"
},
"nplurals=2; plural=(n != 1);");

View File

@@ -1,116 +1,42 @@
{ "translations": {
"Deck" : "Tarxeteru",
"The file was uploaded" : "Xubióse'l ficheru",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El ficheru xubíu supera la direutiva «upload_max_filesize» del ficheru php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El ficheru xubíu supera la direutiva «MAX_FILE_SIZE» que s'especificó nel formulariu HTML",
"No file was uploaded" : "Nun se xubió nengún ficheru",
"Missing a temporary folder" : "Falta una carpeta temporal",
"Could not write file to disk" : "Nun se pudo escribir el ficheru nel discu",
"A PHP extension stopped the file upload" : "Una estensión PHP paró la xuba de ficheros",
"No file uploaded or file size exceeds maximum of %s" : "Nun se xubió nengún ficheru o'l tamañu del ficheru supera'l máximu de %s",
"Upcoming cards" : "Tarxetes próximes",
"Load more" : "Cargar más",
"Deck board" : "Mesa de tarxetes",
"%s on %s" : "%s n %s",
"Action needed" : "Aición necesaria",
"copy" : "copia",
"Deck" : "Deck",
"Personal" : "Personal",
"Finished" : "Finó",
"Action needed" : "Precísase aición",
"Later" : "Más sero",
"Done" : "Fecho",
"Invalid date, date format must be YYYY-MM-DD" : "La data ye inválida, el so formatu ha ser AAAA-MM-DD",
"Move card" : "Mover la tarxeta",
"The file was uploaded" : "Xubióse'l ficheru",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El ficheru xubíu perpasa la direutiva de xuba upload_max_filesize en php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El ficheru xubíu perpasa la direutiva \"MAX_FILE_SIZE\" especificada nel formulariu HTML",
"No file was uploaded" : "Nun se xubieron fichjeros",
"Missing a temporary folder" : "Falta un direutoriu temporal",
"Could not write file to disk" : "Nun pudo escribise nel discu'l ficheru",
"A PHP extension stopped the file upload" : "Una estensión de PHP paró la xuba de ficheros",
"Cancel" : "Encaboxar",
"Drop your files to upload" : "Suelta los ficheros pa xubilos",
"File already exists" : "El ficheru yá esiste",
"Add card" : "Amestar una tarxeta",
"Archived cards" : "Tarxetes archivaes",
"Add list" : "Amestar una llista",
"List name" : "Nome de la llista",
"Open" : "Abrir",
"Completed" : "Completáu",
"Next 24 hours" : "Les próximes 24 hores",
"Next 7 days" : "Los próximos 7 díes",
"Next 30 days" : "Los próximos 30 díes",
"Open details" : "Abrir los detalles",
"File already exists" : "Yá esiste'l ficheru",
"Show archived cards" : "Amosar tarxetes archivaes",
"Details" : "Detalles",
"Sharing" : "Comparticiñon",
"Sharing" : "Compartiendo",
"Tags" : "Etiquetes",
"Deleted items" : "Elementos desaniciaos",
"Activity" : "Actividá",
"Deleted lists" : "Llistes desaniciaes",
"Undo" : "Desfacer",
"Deleted cards" : "Tarxetes desaniciaes",
"Transfer" : "Tresferir",
"(Group)" : "(Grupu)",
"(Team)" : "(Equipu)",
"Can edit" : "Pue editar",
"Owner" : "Propietariu",
"Can edit" : "Can edit",
"Can share" : "Can share",
"Delete" : "Desaniciar",
"List deleted" : "Desanicióse la llista",
"Edit list title" : "Editar el títulu de la llista",
"Archive all cards" : "Archivar toles carpetes",
"Unarchive all cards" : "Desarchivar toles tarxetes",
"Delete list" : "Desaniciar la llista",
"Archive all cards in this list" : "Archivar toles tarxetes d'esta llista",
"Unarchive all cards in this list" : "Desarchivar toles tarxetes d'esta llista",
"Add a new card" : "Amestar una tarxeta nueva",
"Card name" : "Nome de la tarxeta",
"Edit" : "Editar",
"Add a new tag" : "Amestar una etiqueta nueva",
"Members" : "Miembros",
"Invalid path selected" : "Seleicionóse un camín inválidu",
"Show in Files" : "Amosar en Ficheros",
"Download" : "Baxar",
"Modified" : "Modificóse",
"The title cannot be empty." : "El títulu nun pue tar baleru",
"Attachments" : "Axuntos",
"Comments" : "Comentarios",
"Failed to load comments" : "Nun se puen cargar los comentarios",
"No comments yet. Begin the discussion!" : "Nun hai nengún comentariu. ¡Comienza'l discutiniu!",
"The comment cannot be empty." : "El comentariu nun pue tar baleru.",
"Modified" : "Modificóse'l",
"Created" : "Creóse",
"Save" : "Guardar",
"Created:" : "Creóse'l",
"In reply to" : "En rempuesta a",
"Reply" : "Responder",
"Reply" : "Rempuesta",
"Update" : "Anovar",
"Description" : "Descripción",
"(Unsaved)" : "(ensin guardar)",
"(Saving…)" : "(Guardando…)",
"Formatting help" : "Ayuda del formatu",
"Edit description" : "Editar la descripción",
"View description" : "Ver la descripción",
"Tomorrow {timeLocale}" : "Mañana {timeLocale}",
"This weekend {timeLocale}" : "Esta fin de selmana {timeLocale}",
"Next week {timeLocale}" : "La próxima selmana {timeLocale}",
"Mark as done" : "Marcar como fecha",
"Archive card" : "Archivar la tarxeta",
"(group)" : "(grupu)",
"Edit title" : "Editar el títulu",
"Delete card" : "Desaniciar la tarxeta",
"seconds ago" : "hai segundos",
"Keyboard shortcuts" : "Atayos del tecláu",
"Keyboard shortcut" : "Atayos del tecláu",
"Action" : "Aición",
"Ctrl" : "Ctrl",
"Search" : "Guetar",
"Shared with you" : "Compartióse contigo",
"Cancel edit" : "Anular la edición",
"All cards" : "Toles tarxetes",
"No reminder" : "Nun hai nengún recordatoriu",
"An error occurred" : "Prodúxose un error",
"No notifications" : "Nun hai nengún avisu",
"Clone cards" : "Clonar les tarxetes",
"Advanced options" : "Opciones avanzaes",
"Export" : "Esportar",
"Shared with you" : "Shared with you",
"Today" : "Güei",
"Tomorrow" : "Mañana",
"No results found" : "Nun s'atopó nengún resultáu",
"Close" : "Zarrar",
"Message from {author} in {conversationName}" : "Mensaxe de {author} en {conversationName}",
"Due date" : "Data de fin",
"Error creating the share" : "Hebo un error al crear la compartición",
"Share" : "Compartir",
"Personal" : "Personal",
"To do" : "Xera pendiente",
"Example Task 3" : "Xera d'exemplu 3",
"Example Task 2" : "Xera d'exemplu 2",
"Example Task 1" : "Xera d'exemplu 1"
"This week" : "Esta selmana"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View File

@@ -1,44 +1,28 @@
OC.L10N.register(
"deck",
{
"The file was uploaded" : "Fayl yükləndi",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Yüklənmiş fayl php.ini-də upload_max_filesize direktivini aşır",
"Personal" : "Şəxsi",
"Done" : "Done",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklənilən faylın həcmi HTML formasinda olan MAX_FILE_SIZE direktivində təyin dilmiş həcmi aşır.",
"The file was only partially uploaded" : "Fayl yalnız qismən yüklənib",
"No file was uploaded" : "Heç bir fayl yüklənilmədi",
"Missing a temporary folder" : "Müvəqqəti qovluq çatışmır",
"Could not write file to disk" : "Faylı diskə yazmaq mümkün olmadı",
"A PHP extension stopped the file upload" : "PHP uzantısı faylın yüklənməsini dayandırdı",
"Finished" : "Bitdi",
"Done" : "Done",
"Cancel" : "Dayandır",
"Completed" : "Bitmişdir",
"Details" : "Detallar",
"Sharing" : "Paylaşılır",
"Tags" : "Işarələr",
"Activity" : "Fəallıq",
"Can edit" : "Can edit",
"Can share" : "Can share",
"Owner" : "Owner",
"Delete" : "Sil",
"Edit" : "Dəyişiklik et",
"Download" : "Yüklə",
"Modified" : "Dəyişdirildi",
"Comments" : "Şərhlər",
"Save" : "Saxla",
"Created:" : "Yaradıldı:",
"Reply" : "Cavab",
"Update" : "Yenilənmə",
"Description" : "Açıqlanma",
"(group)" : "(qrup)",
"seconds ago" : "saniyələr öncə",
"Search" : "Axtarış",
"Shared with you" : "Shared with you",
"Export" : ıxarış",
"Today" : "Bu gün",
"Tomorrow" : "Sabah",
"Close" : "Bağla",
"Share" : "Paylaş",
"Personal" : "Şəxsi"
"Tomorrow" : "Sabah"
},
"nplurals=2; plural=(n != 1);");

View File

@@ -1,42 +1,26 @@
{ "translations": {
"The file was uploaded" : "Fayl yükləndi",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Yüklənmiş fayl php.ini-də upload_max_filesize direktivini aşır",
"Personal" : "Şəxsi",
"Done" : "Done",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklənilən faylın həcmi HTML formasinda olan MAX_FILE_SIZE direktivində təyin dilmiş həcmi aşır.",
"The file was only partially uploaded" : "Fayl yalnız qismən yüklənib",
"No file was uploaded" : "Heç bir fayl yüklənilmədi",
"Missing a temporary folder" : "Müvəqqəti qovluq çatışmır",
"Could not write file to disk" : "Faylı diskə yazmaq mümkün olmadı",
"A PHP extension stopped the file upload" : "PHP uzantısı faylın yüklənməsini dayandırdı",
"Finished" : "Bitdi",
"Done" : "Done",
"Cancel" : "Dayandır",
"Completed" : "Bitmişdir",
"Details" : "Detallar",
"Sharing" : "Paylaşılır",
"Tags" : "Işarələr",
"Activity" : "Fəallıq",
"Can edit" : "Can edit",
"Can share" : "Can share",
"Owner" : "Owner",
"Delete" : "Sil",
"Edit" : "Dəyişiklik et",
"Download" : "Yüklə",
"Modified" : "Dəyişdirildi",
"Comments" : "Şərhlər",
"Save" : "Saxla",
"Created:" : "Yaradıldı:",
"Reply" : "Cavab",
"Update" : "Yenilənmə",
"Description" : "Açıqlanma",
"(group)" : "(qrup)",
"seconds ago" : "saniyələr öncə",
"Search" : "Axtarış",
"Shared with you" : "Shared with you",
"Export" : ıxarış",
"Today" : "Bu gün",
"Tomorrow" : "Sabah",
"Close" : "Bağla",
"Share" : "Paylaş",
"Personal" : "Şəxsi"
"Tomorrow" : "Sabah"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View File

@@ -63,11 +63,30 @@ OC.L10N.register(
"{user} has restored the attachment {attachment} to card {card}" : "{user} възстанови прикачения файл {attachment} към карта {card}",
"You have commented on card {card}" : "Коментирали сте карта {card}",
"{user} has commented on card {card}" : "{user} коментира карта {card}",
"A <strong>card description</strong> inside the Deck app has been changed" : "<strong>Описанието на картата</strong> в приложението Deck/набор/ е променено",
"Deck" : "Набор",
"Changes in the <strong>Deck app</strong>" : "Промени в <strong>приложението Deck</strong>",
"A <strong>comment</strong> was created on a card" : "На картата е създаден <strong>коментар</strong>",
"Upcoming cards" : "Предстоящи карти",
"Personal" : "Лични",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Картата \"%s\" на \"%s\" Ви е била възложена от %s.",
"The card \"%s\" on \"%s\" has reached its due date." : "Картата \"%s\" on \"%s\" е достигнала датата на падежа си.",
"%s has mentioned you in a comment on \"%s\"." : "%s те спомена в коментар за “%s”",
"The board \"%s\" has been shared with you by %s." : "Таблото \"%s\" е споделено с вас от%s.",
"No data was provided to create an attachment." : "Не бяха предоставени данни за създаване на прикачен файл.",
"Finished" : "Готово",
"To review" : "За преглед",
"Action needed" : "Необходимо е действие",
"Later" : "По-късно",
"copy" : "Копиране",
"To do" : "Да направя",
"Doing" : "Правя",
"Done" : "Готово",
"Example Task 3" : "Примерна задача 3",
"Example Task 2" : "Примерна задача 2",
"Example Task 1" : "Примерна задача 1",
"The file was uploaded" : "Файлът е качен",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Размерът на каченият файл надвишава максималния размер определен от upload_max_filesize в php.ini:",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Каченият файл надвишава директивата upload_max_filesize в php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Размерът на файла надвишава максималния размер определен от MAX_FILE_SIZE в HTML формата.",
"The file was only partially uploaded" : "Файлът е качен частично",
"No file was uploaded" : "Нито един файл не е качен",
@@ -75,68 +94,37 @@ OC.L10N.register(
"Could not write file to disk" : " Файлът не можа да бъде записан на диск",
"A PHP extension stopped the file upload" : "PHP разширение спря качването на файла",
"No file uploaded or file size exceeds maximum of %s" : "Няма качен файл или размерът на файла надвишава максимума от %s",
"Upcoming cards" : "Предстоящи карти",
"Load more" : "Зареждане на още",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Картата \"%s\" на \"%s\" Ви е била възложена от %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} е възложил картата {deck-card} на {deck-board} на Вас.",
"The card \"%s\" on \"%s\" has reached its due date." : "Картата \"%s\" on \"%s\" е достигнала датата на падежа си.",
"The card {deck-card} on {deck-board} has reached its due date." : "Картата {deck-card} на {deck-board} е достигнала датата на падежа си.",
"%s has mentioned you in a comment on \"%s\"." : "%s те спомена в коментар за “%s”",
"{user} has mentioned you in a comment on {deck-card}." : "{user} те спомена в коментар за {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "Таблото \"%s\" е споделено с вас от%s.",
"{user} has shared {deck-board} with you." : "{user} сподели {deck-board} с Вас.",
"Deck board" : "Deck табло",
"Owned by %1$s" : "Притежаван от %1$s",
"Deck boards, cards and comments" : "Табла, карти и коментари",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "От %1$s, в %2$s/%3$s, притежание на %4$s",
"Card comments" : "Коментари на карти",
"%s on %s" : "%s на %s",
"Deck boards and cards" : "Табла и карти",
"No data was provided to create an attachment." : "Не бяха предоставени данни за създаване на прикачен файл.",
"Finished" : "Готово",
"To review" : "За преглед",
"Action needed" : "Необходимо е действие",
"Later" : "По-късно",
"copy" : "Копиране",
"To Do" : "Задачи",
"Done" : "Завършено",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Този коментар има повече от %s знака.\nДобавено като прикачен файл към картата с име %s.\nДостъпно на URL: %s.",
"Card not found" : "Катртата не е намерена",
"Path is already shared with this card" : "Пътят вече е споделен с тази карта",
"Invalid date, date format must be YYYY-MM-DD" : "Невалидна дата, форматът е различен от ГГГГ-ММ-ДД",
"Personal planning and team project organization" : "Лично планиране и организация на екипни проекти",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck е инструмент за организация в стил kanban, насочен към лично планиране и организация на проекти за екипи, интегрирани с Nextcloud.\n\n\n- 📥 Добавете задачите си към карти и ги подредете\n- 📄 Запишете допълнителни бележки в markdown формат\n- Присвояване на етикети за още по-добра организация\n- 👥 Споделете с вашия екип, приятели или семейство\n- 📎Прикачете файлове и ги вградете във вашето описание за маркиране\n- 💬Обсъдете с вашия екип, като използвате коментари\n- ⚡ Проследявайте промените в потока от дейности\n- 🚀 Организирайте проекта си",
"Add board" : "Добави табло",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck е инструмент за организация в стил kanban, насочен към лично планиране и организация на проекти за екипи, интегрирани с Nextcloud.\n\n\n- 📥 Добавете задачите си към карти и ги подредете\n- 📄 Запишете допълнителни бележки в markdown формат\n- Присвояване на етикети за още по-добра организация\n- 👥 Споделете с вашия екип, приятели или семейство\n- 📎Прикачете файлове и ги вградете във вашето описание за маркиране\n- 💬Обсъдете с вашия екип, като използвате коментари\n- ⚡ Проследявайте промените в потока от дейности\n- 🚀 Организирайте проекта си",
"Card details" : "Подробности за картата",
"Add board" : "Добави табло",
"Select the board to link to a project" : "Изберете таблото, което да свържете към проект",
"Search by board title" : "Търсене по заглавие на таблото",
"Select board" : "Избор на табло",
"Select a board" : "Избор на табло",
"No lists available" : "Няма налична списъци.",
"Select a list" : "Избор на списък",
"Move card" : "Преместване на карта",
"Cancel" : "Отказ",
"Select a card" : "Избор на карта",
"Select the card to link to a project" : "Изберете картата, която да свържете към проект",
"Link to card" : "Връзка към карта",
"Select a card" : "Избор на карта",
"Cancel" : "Отказ",
"This board is read only" : "Таблото е само за четене",
"Drop your files to upload" : "Пуснете вашите файлове, за да ги качите",
"File already exists" : "Файлът вече съществува",
"A file with the name {filename} already exists." : "Вече съществува файл с името {filename}.",
"Do you want to overwrite it?" : "Искате ли да го презапишете?",
"Overwrite file" : "Презапиши файла",
"Keep existing file" : "Запазване на съществуващ файл",
"This board is read only" : "Таблото е само за четене",
"Drop your files to upload" : "Пуснете вашите файлове, за да ги качите",
"Add card" : "Добави карта",
"Archived cards" : "Архивирани карти",
"Add list" : "Добави списък",
"List name" : "Име на списък",
"Active filters" : "Актижни филтри",
"Apply filter" : "Приложи филтър",
"Filter by tag" : "Филтрирай по маркер",
"Filter by assigned user" : "Филтриране по назначен потребител",
"Unassigned" : "Неприсвоен",
"Open" : "Отвори",
"Completed" : "Завършен",
"Filter by due date" : "Филтриране по крайна дата",
"Overdue" : "Просрочен",
"Next 24 hours" : "Следващите 24 часа",
@@ -147,77 +135,72 @@ OC.L10N.register(
"Hide archived cards" : "Скриване на архивирани карти",
"Show archived cards" : "Показване на архивирани карти",
"Toggle compact mode" : "Превключване на компактен режим",
"Open details" : "Отваряне на подробности",
"Details" : "Подробности",
"Currently present people" : "Хора присъстващи в момента",
"Loading board" : "Зареждане на табло",
"Board not found" : "Таблото не е намерено",
"No lists available" : "Няма налична списъци.",
"Create a new list to add cards to this board" : "Създайте нов списък, за да добавите карти към това табло",
"Board not found" : "Таблото не е намерено",
"Sharing" : "Споделяне",
"Tags" : "Етикети",
"Deleted items" : "Изтрити елементи",
"Activity" : "Активност",
"Timeline" : "Времева линия",
"Deleted lists" : "Изтрити списъци",
"Undo" : "Отмяна",
"Deleted cards" : "Изтрити карти",
"Failed to create share with {displayName}" : "Създаването на споделяне с {displayName} не бе успешно",
"Are you sure you want to transfer the board {title} to {user}?" : "Сигурни ли сте че искате да прехвърлите таблото {title} на {user}?",
"Transfer the board." : "Прехвърлете таблото.",
"Transfer" : "Прехвърляне",
"The board has been transferred to {user}" : "Таблото беше прехвърлено на {user}",
"Failed to transfer the board to {user}" : "Неуспешно прехвърляне на таблото на {user}",
"Share board with a user, group or circle …" : "Споделяне на таблото с потребител, група или кръг ...",
"Searching for users, groups and circles …" : "Търсене за потребители, групи и кръгове ...",
"No participants found" : "Няма намерени участници",
"Board owner" : "Собственик на табло",
"(Group)" : "(Група)",
"(Circle)" : "(Кръг)",
"Can edit" : "Може да редактира",
"Can share" : "Може да споделя",
"Can manage" : "Може да управлява",
"Owner" : "Собственик",
"Delete" : "Изтриване",
"List deleted" : "Списъкът е изтрит",
"Edit list title" : "Редактиране на заглавието на списъка",
"Failed to create share with {displayName}" : "Създаването на споделяне с {displayName} не бе успешно",
"Add a new list" : "Добавяне на нов списък",
"Archive all cards" : "Архивира всички карти",
"Unarchive all cards" : "Разархивиране на всички карти",
"Delete list" : "Изтрива списък",
"Archive all cards in this list" : "Архивира всички карти в този списък",
"Unarchive all cards in this list" : "Разархивиране всички карти в този списък",
"Add a new card" : "Добави нова карта",
"Card name" : "Име на карта",
"title and color value must be provided" : "трябва да се предоставят заглавие и стойност на цвета",
"List deleted" : "Списъкът е изтрит",
"Edit" : "Редакция",
"Add a new tag" : "Добавяне на нов етикет",
"title and color value must be provided" : "трябва да се предоставят заглавие и стойност на цвета",
"Board name" : "Име на табло",
"Members" : "Членове",
"Assign a user to this card…" : "Зачисляване на потребител на тази карта ...",
"File to share" : "Файл за споделяне",
"Invalid path selected" : "Избран е невалиден път ",
"Upload new files" : "Качи нови файлове",
"Share from Files" : "Споделяне от Файлове",
"Pending share" : "Чакащо споделяне",
"Add this attachment" : "Добавете този прикачен файл",
"Show in Files" : "Показване във файлове",
"Download" : "Изтегляне",
"Remove attachment" : "Премахване на прикачен файл",
"Unshare file" : "Прекратяване на споделянето на файла",
"Delete Attachment" : "Изтриване на прикачен файл",
"Restore Attachment" : "Възстановяване на прикачен файл",
"Modified" : "Промяна",
"Created" : "Създаден",
"The title cannot be empty." : "Заглавието не може да бъде празно.",
"File to share" : "Файл за споделяне",
"Invalid path selected" : "Избран е невалиден път ",
"Open in sidebar view" : "Отваряне в изгледа на страничната лента",
"Open in bigger view" : "Отваря се в по-голям изглед",
"Attachments" : "Прикачени файлове",
"Comments" : "Коментари",
"Failed to load comments" : "Неуспешно зареждане на коментари",
"Modified" : "Промяна",
"Created" : "Създаден",
"The title cannot be empty." : "Заглавието не може да бъде празно.",
"No comments yet. Begin the discussion!" : "Все още няма коментари. Започнете дискусията!",
"Assign a tag to this card…" : "Присвояване на етикет на тази карта ...",
"Assign to users" : "Зачисляване към потребители",
"Assign to users/groups/circles" : "Зачисляване към потребители/групи/кръгове",
"Assign a user to this card…" : "Зачисляване на потребител на тази карта ...",
"Due date" : "Крайна дата",
"Set a due date" : "Задаване на крайна дата",
"Remove due date" : "Премахни крайната дата",
"Select Date" : "Изберете дата",
"Save" : "Запазване",
"The comment cannot be empty." : "Коментарът не може да бъде празен.",
"The comment cannot be longer than 1000 characters." : "Коментарът не може да бъде по-дълъг от 1000 знака.",
"Save" : "Запазване",
"Created:" : "Създадено:",
"In reply to" : "В отговор на",
"Cancel reply" : "Отказ на отговор",
"Reply" : "Отговори",
"Update" : "Обновяване",
"Write a description …" : "Напишете описание ...",
"Description" : "Описание",
"(Unsaved)" : " (Незаписан)",
"(Saving…)" : "(Записване...)",
@@ -225,105 +208,58 @@ OC.L10N.register(
"Edit description" : "Редактиране на описанието",
"View description" : "Преглед на описанието",
"Add Attachment" : "Добавяне на прикачен файл",
"Write a description …" : "Напишете описание ...",
"Choose attachment" : "Избор на прикачен файл",
"Select Date" : "Изберете дата",
"Set a due date" : "Задаване на крайна дата",
"Remove due date" : "Премахни крайната дата",
"Mark as done" : "Маркирай като готово",
"Unarchive card" : "Разархивиране на карта",
"Archive card" : "Архивиране на карта",
"Assign a tag to this card…" : "Присвояване на етикет на тази карта ...",
"(group)" : "(група)",
"{count} comments, {unread} unread" : "{count} коментари, {unread} непрочетени",
"Todo items" : "Елементи на задача за изпълнение",
"Edit card title" : "Редактиране на заглавието на карта",
"Card deleted" : "Картата е изтрита",
"Edit title" : "Редактиране на заглавието",
"Assign to me" : "Зачисляване към мен",
"Unassign myself" : "Отмяна на зачисляването към мен",
"Move card" : "Преместване на карта",
"Unarchive card" : "Разархивиране на карта",
"Archive card" : "Архивиране на карта",
"Delete card" : "Изтриване на карта",
"Move card to another board" : "Преместване на картата на друго табло",
"Card deleted" : "Картата е изтрита",
"seconds ago" : "преди секунди",
"Keyboard shortcuts" : "Бързи клавиши",
"Keyboard shortcut" : "Клавишни комбинации",
"Action" : "Действие",
"Shift" : "Shift /бутон/",
"Ctrl" : "Ctrl /бутон/",
"Search" : "Търсене",
"Enter" : "Въвеждане",
"Space" : "Пространство",
"All boards" : "Всички табла",
"Archived boards" : "Архивирани табла",
"Shared with you" : "Споделени с вас",
"Deck settings" : "Настройки на платформата",
"Use bigger card view" : "Използва по-голям изглед на картата",
"Show card ID badge" : "Показване на обозначение за самоличност на картата",
"Show boards in calendar/tasks" : "Показване на таблата в календар / задачи",
"Cancel edit" : "Отказ на редактиране",
"Board {0} deleted" : "Табло {0} изтрито",
"All cards" : "Всички карти",
"Only assigned cards" : "Само зачислените карти",
"No reminder" : "Няма напомняне",
"An error occurred" : "Възникна грешка",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Сигурни ли сте, че искате да изтриете таблото {title}? Това ще изтрие всички данни на това табло, включително архивираните карти.",
"Delete the board?" : "Изтриване на таблото?",
"Limit deck usage of groups" : "Ограничава използването на набора от групи",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Ограничаването на приложението Deck/набор/ ще блокира потребителите, които не са част от тези групи, да създават свои собствени табла. Потребителите все още ще могат да работят на таблата, които са споделени с тях.",
"Board details" : "Подробности за табло",
"Edit board" : "Редактиране на табло",
"Clone board" : " Клониране на табло",
"Unarchive board" : "Разархивиране натабло",
"Archive board" : "Архивиране на табло",
"Export board" : "Експортиране на табло",
"Turn on due date reminders" : "Включва напомнянията за краен срок",
"Turn off due date reminders" : "Изключва напомнянията за краен срок",
"Due date reminders" : " Напомняния за краен срок",
"All cards" : "Всички карти",
"Assigned cards" : "Зачислени карти",
"No notifications" : "Няма известия",
"Delete board" : "Изтриване на табло",
"Clone cards" : " Клониране на карти",
"Advanced options" : "Допълнителни опции",
"Clone" : "Клониране",
"Export as CSV" : "Експортиране като CSV файл",
"Export" : "Експорт /изнасям/",
"Board {0} deleted" : "Табло {0} изтрито",
"Only assigned cards" : "Само зачислените карти",
"No reminder" : "Няма напомняне",
"An error occurred" : "Възникна грешка",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Сигурни ли сте, че искате да изтриете таблото {title}? Това ще изтрие всички данни на това табло.",
"Delete the board?" : "Изтриване на таблото?",
"Loading filtered view" : "Зареждане на филтриран изглед",
"Today" : "Днес",
"Tomorrow" : "Утре",
"This week" : "Тази седмица",
"No due" : "Не се дължи",
"Search for {searchQuery} in all boards" : "Търсене на {searchQuery} във всички табла",
"No results found" : "Няма намерени резултати",
"Deck board {name}\n* Last modified on {lastMod}" : "Табло {name}\n* Последна промяна на {lastMod}",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Създаден на {created}\n* Последна промяна на {lastMod} \n* {nbAttachments} прикачени файлове \n* {nbComments} коментара",
"{nbCards} cards" : "{nbCards} карти",
"Due on {date}" : "Краен срок до {date}",
"{stack} in {board}" : "{stack} в {board}",
"Click to expand description" : "Кликване за разширяване на описанието",
"Click to expand comment" : "Кликване за разширяване на коментара",
"Create card" : "Създаване на карта",
"Create a new card" : "Създаване на нова карта",
"Card title" : "Заглавие на карта",
"Creating the new card …" : "Създаване на новата карта ...",
"Card \"{card}\" was added to \"{board}\"" : "Карта \"{card}\" беше добавена към \"{board}\"",
"Open card" : "Отваряне на карта",
"Close" : "Затваряне",
"No upcoming cards" : "Няма предстоящи карти",
"upcoming cards" : "предстоящи карти",
"New card" : "Нова карта",
"Link to a board" : "Линк към табло",
"Link to a card" : "Линк към карта",
"Create a card" : "Създаване на карта",
"Message from {author} in {conversationName}" : "Съобщение от {author} в {conversationName}",
"Something went wrong" : "Нещо се обърка",
"Failed to upload {name}" : " Неуспешно качване на {name}",
"Maximum file size of {size} exceeded" : "Максималният размер на файла от {size} е надвишен",
"Due date" : "Крайна дата",
"Error creating the share" : "Грешка при създаване на споделяне",
"Share with a Deck card" : "Споделяне с Deck карта",
"Share {file} with a Deck card" : "Споделяне {file} с Deck карта",
"Share" : "Споделяне",
"Personal" : "Лични",
"To do" : "Задачи",
"Doing" : "Задачи в процес на изпълнение",
"Example Task 3" : "Примерна задача 3",
"Example Task 2" : "Примерна задача 2",
"Example Task 1" : "Примерна задача 1",
"Move card to another board" : "Преместване на картата на друго табло"
"Share" : "Споделяне"
},
"nplurals=2; plural=(n != 1);");

View File

@@ -61,11 +61,30 @@
"{user} has restored the attachment {attachment} to card {card}" : "{user} възстанови прикачения файл {attachment} към карта {card}",
"You have commented on card {card}" : "Коментирали сте карта {card}",
"{user} has commented on card {card}" : "{user} коментира карта {card}",
"A <strong>card description</strong> inside the Deck app has been changed" : "<strong>Описанието на картата</strong> в приложението Deck/набор/ е променено",
"Deck" : "Набор",
"Changes in the <strong>Deck app</strong>" : "Промени в <strong>приложението Deck</strong>",
"A <strong>comment</strong> was created on a card" : "На картата е създаден <strong>коментар</strong>",
"Upcoming cards" : "Предстоящи карти",
"Personal" : "Лични",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Картата \"%s\" на \"%s\" Ви е била възложена от %s.",
"The card \"%s\" on \"%s\" has reached its due date." : "Картата \"%s\" on \"%s\" е достигнала датата на падежа си.",
"%s has mentioned you in a comment on \"%s\"." : "%s те спомена в коментар за “%s”",
"The board \"%s\" has been shared with you by %s." : "Таблото \"%s\" е споделено с вас от%s.",
"No data was provided to create an attachment." : "Не бяха предоставени данни за създаване на прикачен файл.",
"Finished" : "Готово",
"To review" : "За преглед",
"Action needed" : "Необходимо е действие",
"Later" : "По-късно",
"copy" : "Копиране",
"To do" : "Да направя",
"Doing" : "Правя",
"Done" : "Готово",
"Example Task 3" : "Примерна задача 3",
"Example Task 2" : "Примерна задача 2",
"Example Task 1" : "Примерна задача 1",
"The file was uploaded" : "Файлът е качен",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Размерът на каченият файл надвишава максималния размер определен от upload_max_filesize в php.ini:",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Каченият файл надвишава директивата upload_max_filesize в php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Размерът на файла надвишава максималния размер определен от MAX_FILE_SIZE в HTML формата.",
"The file was only partially uploaded" : "Файлът е качен частично",
"No file was uploaded" : "Нито един файл не е качен",
@@ -73,68 +92,37 @@
"Could not write file to disk" : " Файлът не можа да бъде записан на диск",
"A PHP extension stopped the file upload" : "PHP разширение спря качването на файла",
"No file uploaded or file size exceeds maximum of %s" : "Няма качен файл или размерът на файла надвишава максимума от %s",
"Upcoming cards" : "Предстоящи карти",
"Load more" : "Зареждане на още",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Картата \"%s\" на \"%s\" Ви е била възложена от %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} е възложил картата {deck-card} на {deck-board} на Вас.",
"The card \"%s\" on \"%s\" has reached its due date." : "Картата \"%s\" on \"%s\" е достигнала датата на падежа си.",
"The card {deck-card} on {deck-board} has reached its due date." : "Картата {deck-card} на {deck-board} е достигнала датата на падежа си.",
"%s has mentioned you in a comment on \"%s\"." : "%s те спомена в коментар за “%s”",
"{user} has mentioned you in a comment on {deck-card}." : "{user} те спомена в коментар за {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "Таблото \"%s\" е споделено с вас от%s.",
"{user} has shared {deck-board} with you." : "{user} сподели {deck-board} с Вас.",
"Deck board" : "Deck табло",
"Owned by %1$s" : "Притежаван от %1$s",
"Deck boards, cards and comments" : "Табла, карти и коментари",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "От %1$s, в %2$s/%3$s, притежание на %4$s",
"Card comments" : "Коментари на карти",
"%s on %s" : "%s на %s",
"Deck boards and cards" : "Табла и карти",
"No data was provided to create an attachment." : "Не бяха предоставени данни за създаване на прикачен файл.",
"Finished" : "Готово",
"To review" : "За преглед",
"Action needed" : "Необходимо е действие",
"Later" : "По-късно",
"copy" : "Копиране",
"To Do" : "Задачи",
"Done" : "Завършено",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Този коментар има повече от %s знака.\nДобавено като прикачен файл към картата с име %s.\nДостъпно на URL: %s.",
"Card not found" : "Катртата не е намерена",
"Path is already shared with this card" : "Пътят вече е споделен с тази карта",
"Invalid date, date format must be YYYY-MM-DD" : "Невалидна дата, форматът е различен от ГГГГ-ММ-ДД",
"Personal planning and team project organization" : "Лично планиране и организация на екипни проекти",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck е инструмент за организация в стил kanban, насочен към лично планиране и организация на проекти за екипи, интегрирани с Nextcloud.\n\n\n- 📥 Добавете задачите си към карти и ги подредете\n- 📄 Запишете допълнителни бележки в markdown формат\n- Присвояване на етикети за още по-добра организация\n- 👥 Споделете с вашия екип, приятели или семейство\n- 📎Прикачете файлове и ги вградете във вашето описание за маркиране\n- 💬Обсъдете с вашия екип, като използвате коментари\n- ⚡ Проследявайте промените в потока от дейности\n- 🚀 Организирайте проекта си",
"Add board" : "Добави табло",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck е инструмент за организация в стил kanban, насочен към лично планиране и организация на проекти за екипи, интегрирани с Nextcloud.\n\n\n- 📥 Добавете задачите си към карти и ги подредете\n- 📄 Запишете допълнителни бележки в markdown формат\n- Присвояване на етикети за още по-добра организация\n- 👥 Споделете с вашия екип, приятели или семейство\n- 📎Прикачете файлове и ги вградете във вашето описание за маркиране\n- 💬Обсъдете с вашия екип, като използвате коментари\n- ⚡ Проследявайте промените в потока от дейности\n- 🚀 Организирайте проекта си",
"Card details" : "Подробности за картата",
"Add board" : "Добави табло",
"Select the board to link to a project" : "Изберете таблото, което да свържете към проект",
"Search by board title" : "Търсене по заглавие на таблото",
"Select board" : "Избор на табло",
"Select a board" : "Избор на табло",
"No lists available" : "Няма налична списъци.",
"Select a list" : "Избор на списък",
"Move card" : "Преместване на карта",
"Cancel" : "Отказ",
"Select a card" : "Избор на карта",
"Select the card to link to a project" : "Изберете картата, която да свържете към проект",
"Link to card" : "Връзка към карта",
"Select a card" : "Избор на карта",
"Cancel" : "Отказ",
"This board is read only" : "Таблото е само за четене",
"Drop your files to upload" : "Пуснете вашите файлове, за да ги качите",
"File already exists" : "Файлът вече съществува",
"A file with the name {filename} already exists." : "Вече съществува файл с името {filename}.",
"Do you want to overwrite it?" : "Искате ли да го презапишете?",
"Overwrite file" : "Презапиши файла",
"Keep existing file" : "Запазване на съществуващ файл",
"This board is read only" : "Таблото е само за четене",
"Drop your files to upload" : "Пуснете вашите файлове, за да ги качите",
"Add card" : "Добави карта",
"Archived cards" : "Архивирани карти",
"Add list" : "Добави списък",
"List name" : "Име на списък",
"Active filters" : "Актижни филтри",
"Apply filter" : "Приложи филтър",
"Filter by tag" : "Филтрирай по маркер",
"Filter by assigned user" : "Филтриране по назначен потребител",
"Unassigned" : "Неприсвоен",
"Open" : "Отвори",
"Completed" : "Завършен",
"Filter by due date" : "Филтриране по крайна дата",
"Overdue" : "Просрочен",
"Next 24 hours" : "Следващите 24 часа",
@@ -145,77 +133,72 @@
"Hide archived cards" : "Скриване на архивирани карти",
"Show archived cards" : "Показване на архивирани карти",
"Toggle compact mode" : "Превключване на компактен режим",
"Open details" : "Отваряне на подробности",
"Details" : "Подробности",
"Currently present people" : "Хора присъстващи в момента",
"Loading board" : "Зареждане на табло",
"Board not found" : "Таблото не е намерено",
"No lists available" : "Няма налична списъци.",
"Create a new list to add cards to this board" : "Създайте нов списък, за да добавите карти към това табло",
"Board not found" : "Таблото не е намерено",
"Sharing" : "Споделяне",
"Tags" : "Етикети",
"Deleted items" : "Изтрити елементи",
"Activity" : "Активност",
"Timeline" : "Времева линия",
"Deleted lists" : "Изтрити списъци",
"Undo" : "Отмяна",
"Deleted cards" : "Изтрити карти",
"Failed to create share with {displayName}" : "Създаването на споделяне с {displayName} не бе успешно",
"Are you sure you want to transfer the board {title} to {user}?" : "Сигурни ли сте че искате да прехвърлите таблото {title} на {user}?",
"Transfer the board." : "Прехвърлете таблото.",
"Transfer" : "Прехвърляне",
"The board has been transferred to {user}" : "Таблото беше прехвърлено на {user}",
"Failed to transfer the board to {user}" : "Неуспешно прехвърляне на таблото на {user}",
"Share board with a user, group or circle …" : "Споделяне на таблото с потребител, група или кръг ...",
"Searching for users, groups and circles …" : "Търсене за потребители, групи и кръгове ...",
"No participants found" : "Няма намерени участници",
"Board owner" : "Собственик на табло",
"(Group)" : "(Група)",
"(Circle)" : "(Кръг)",
"Can edit" : "Може да редактира",
"Can share" : "Може да споделя",
"Can manage" : "Може да управлява",
"Owner" : "Собственик",
"Delete" : "Изтриване",
"List deleted" : "Списъкът е изтрит",
"Edit list title" : "Редактиране на заглавието на списъка",
"Failed to create share with {displayName}" : "Създаването на споделяне с {displayName} не бе успешно",
"Add a new list" : "Добавяне на нов списък",
"Archive all cards" : "Архивира всички карти",
"Unarchive all cards" : "Разархивиране на всички карти",
"Delete list" : "Изтрива списък",
"Archive all cards in this list" : "Архивира всички карти в този списък",
"Unarchive all cards in this list" : "Разархивиране всички карти в този списък",
"Add a new card" : "Добави нова карта",
"Card name" : "Име на карта",
"title and color value must be provided" : "трябва да се предоставят заглавие и стойност на цвета",
"List deleted" : "Списъкът е изтрит",
"Edit" : "Редакция",
"Add a new tag" : "Добавяне на нов етикет",
"title and color value must be provided" : "трябва да се предоставят заглавие и стойност на цвета",
"Board name" : "Име на табло",
"Members" : "Членове",
"Assign a user to this card…" : "Зачисляване на потребител на тази карта ...",
"File to share" : "Файл за споделяне",
"Invalid path selected" : "Избран е невалиден път ",
"Upload new files" : "Качи нови файлове",
"Share from Files" : "Споделяне от Файлове",
"Pending share" : "Чакащо споделяне",
"Add this attachment" : "Добавете този прикачен файл",
"Show in Files" : "Показване във файлове",
"Download" : "Изтегляне",
"Remove attachment" : "Премахване на прикачен файл",
"Unshare file" : "Прекратяване на споделянето на файла",
"Delete Attachment" : "Изтриване на прикачен файл",
"Restore Attachment" : "Възстановяване на прикачен файл",
"Modified" : "Промяна",
"Created" : "Създаден",
"The title cannot be empty." : "Заглавието не може да бъде празно.",
"File to share" : "Файл за споделяне",
"Invalid path selected" : "Избран е невалиден път ",
"Open in sidebar view" : "Отваряне в изгледа на страничната лента",
"Open in bigger view" : "Отваря се в по-голям изглед",
"Attachments" : "Прикачени файлове",
"Comments" : "Коментари",
"Failed to load comments" : "Неуспешно зареждане на коментари",
"Modified" : "Промяна",
"Created" : "Създаден",
"The title cannot be empty." : "Заглавието не може да бъде празно.",
"No comments yet. Begin the discussion!" : "Все още няма коментари. Започнете дискусията!",
"Assign a tag to this card…" : "Присвояване на етикет на тази карта ...",
"Assign to users" : "Зачисляване към потребители",
"Assign to users/groups/circles" : "Зачисляване към потребители/групи/кръгове",
"Assign a user to this card…" : "Зачисляване на потребител на тази карта ...",
"Due date" : "Крайна дата",
"Set a due date" : "Задаване на крайна дата",
"Remove due date" : "Премахни крайната дата",
"Select Date" : "Изберете дата",
"Save" : "Запазване",
"The comment cannot be empty." : "Коментарът не може да бъде празен.",
"The comment cannot be longer than 1000 characters." : "Коментарът не може да бъде по-дълъг от 1000 знака.",
"Save" : "Запазване",
"Created:" : "Създадено:",
"In reply to" : "В отговор на",
"Cancel reply" : "Отказ на отговор",
"Reply" : "Отговори",
"Update" : "Обновяване",
"Write a description …" : "Напишете описание ...",
"Description" : "Описание",
"(Unsaved)" : " (Незаписан)",
"(Saving…)" : "(Записване...)",
@@ -223,105 +206,58 @@
"Edit description" : "Редактиране на описанието",
"View description" : "Преглед на описанието",
"Add Attachment" : "Добавяне на прикачен файл",
"Write a description …" : "Напишете описание ...",
"Choose attachment" : "Избор на прикачен файл",
"Select Date" : "Изберете дата",
"Set a due date" : "Задаване на крайна дата",
"Remove due date" : "Премахни крайната дата",
"Mark as done" : "Маркирай като готово",
"Unarchive card" : "Разархивиране на карта",
"Archive card" : "Архивиране на карта",
"Assign a tag to this card…" : "Присвояване на етикет на тази карта ...",
"(group)" : "(група)",
"{count} comments, {unread} unread" : "{count} коментари, {unread} непрочетени",
"Todo items" : "Елементи на задача за изпълнение",
"Edit card title" : "Редактиране на заглавието на карта",
"Card deleted" : "Картата е изтрита",
"Edit title" : "Редактиране на заглавието",
"Assign to me" : "Зачисляване към мен",
"Unassign myself" : "Отмяна на зачисляването към мен",
"Move card" : "Преместване на карта",
"Unarchive card" : "Разархивиране на карта",
"Archive card" : "Архивиране на карта",
"Delete card" : "Изтриване на карта",
"Move card to another board" : "Преместване на картата на друго табло",
"Card deleted" : "Картата е изтрита",
"seconds ago" : "преди секунди",
"Keyboard shortcuts" : "Бързи клавиши",
"Keyboard shortcut" : "Клавишни комбинации",
"Action" : "Действие",
"Shift" : "Shift /бутон/",
"Ctrl" : "Ctrl /бутон/",
"Search" : "Търсене",
"Enter" : "Въвеждане",
"Space" : "Пространство",
"All boards" : "Всички табла",
"Archived boards" : "Архивирани табла",
"Shared with you" : "Споделени с вас",
"Deck settings" : "Настройки на платформата",
"Use bigger card view" : "Използва по-голям изглед на картата",
"Show card ID badge" : "Показване на обозначение за самоличност на картата",
"Show boards in calendar/tasks" : "Показване на таблата в календар / задачи",
"Cancel edit" : "Отказ на редактиране",
"Board {0} deleted" : "Табло {0} изтрито",
"All cards" : "Всички карти",
"Only assigned cards" : "Само зачислените карти",
"No reminder" : "Няма напомняне",
"An error occurred" : "Възникна грешка",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Сигурни ли сте, че искате да изтриете таблото {title}? Това ще изтрие всички данни на това табло, включително архивираните карти.",
"Delete the board?" : "Изтриване на таблото?",
"Limit deck usage of groups" : "Ограничава използването на набора от групи",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Ограничаването на приложението Deck/набор/ ще блокира потребителите, които не са част от тези групи, да създават свои собствени табла. Потребителите все още ще могат да работят на таблата, които са споделени с тях.",
"Board details" : "Подробности за табло",
"Edit board" : "Редактиране на табло",
"Clone board" : " Клониране на табло",
"Unarchive board" : "Разархивиране натабло",
"Archive board" : "Архивиране на табло",
"Export board" : "Експортиране на табло",
"Turn on due date reminders" : "Включва напомнянията за краен срок",
"Turn off due date reminders" : "Изключва напомнянията за краен срок",
"Due date reminders" : " Напомняния за краен срок",
"All cards" : "Всички карти",
"Assigned cards" : "Зачислени карти",
"No notifications" : "Няма известия",
"Delete board" : "Изтриване на табло",
"Clone cards" : " Клониране на карти",
"Advanced options" : "Допълнителни опции",
"Clone" : "Клониране",
"Export as CSV" : "Експортиране като CSV файл",
"Export" : "Експорт /изнасям/",
"Board {0} deleted" : "Табло {0} изтрито",
"Only assigned cards" : "Само зачислените карти",
"No reminder" : "Няма напомняне",
"An error occurred" : "Възникна грешка",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Сигурни ли сте, че искате да изтриете таблото {title}? Това ще изтрие всички данни на това табло.",
"Delete the board?" : "Изтриване на таблото?",
"Loading filtered view" : "Зареждане на филтриран изглед",
"Today" : "Днес",
"Tomorrow" : "Утре",
"This week" : "Тази седмица",
"No due" : "Не се дължи",
"Search for {searchQuery} in all boards" : "Търсене на {searchQuery} във всички табла",
"No results found" : "Няма намерени резултати",
"Deck board {name}\n* Last modified on {lastMod}" : "Табло {name}\n* Последна промяна на {lastMod}",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Създаден на {created}\n* Последна промяна на {lastMod} \n* {nbAttachments} прикачени файлове \n* {nbComments} коментара",
"{nbCards} cards" : "{nbCards} карти",
"Due on {date}" : "Краен срок до {date}",
"{stack} in {board}" : "{stack} в {board}",
"Click to expand description" : "Кликване за разширяване на описанието",
"Click to expand comment" : "Кликване за разширяване на коментара",
"Create card" : "Създаване на карта",
"Create a new card" : "Създаване на нова карта",
"Card title" : "Заглавие на карта",
"Creating the new card …" : "Създаване на новата карта ...",
"Card \"{card}\" was added to \"{board}\"" : "Карта \"{card}\" беше добавена към \"{board}\"",
"Open card" : "Отваряне на карта",
"Close" : "Затваряне",
"No upcoming cards" : "Няма предстоящи карти",
"upcoming cards" : "предстоящи карти",
"New card" : "Нова карта",
"Link to a board" : "Линк към табло",
"Link to a card" : "Линк към карта",
"Create a card" : "Създаване на карта",
"Message from {author} in {conversationName}" : "Съобщение от {author} в {conversationName}",
"Something went wrong" : "Нещо се обърка",
"Failed to upload {name}" : " Неуспешно качване на {name}",
"Maximum file size of {size} exceeded" : "Максималният размер на файла от {size} е надвишен",
"Due date" : "Крайна дата",
"Error creating the share" : "Грешка при създаване на споделяне",
"Share with a Deck card" : "Споделяне с Deck карта",
"Share {file} with a Deck card" : "Споделяне {file} с Deck карта",
"Share" : "Споделяне",
"Personal" : "Лични",
"To do" : "Задачи",
"Doing" : "Задачи в процес на изпълнение",
"Example Task 3" : "Примерна задача 3",
"Example Task 2" : "Примерна задача 2",
"Example Task 1" : "Примерна задача 1",
"Move card to another board" : "Преместване на картата на друго табло"
"Share" : "Споделяне"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View File

@@ -1,38 +1,28 @@
OC.L10N.register(
"deck",
{
"Personal" : "ব্যক্তিগত",
"Done" : "Done",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "আপলোড করা ফাইলটি HTML ফর্মে উল্লিখিত MAX_FILE_SIZE নির্ধারিত ফাইলের সর্বোচ্চ আকার অতিক্রম করতে চলেছে ",
"No file was uploaded" : "কোন ফাইল আপলোড করা হয় নি",
"Missing a temporary folder" : "অস্থায়ী ফোল্ডারটি হারানো গিয়েছে",
"Done" : "Done",
"Cancel" : "বাতির",
"Completed" : "সুসম্পন্ন",
"Details" : "বিসতারিত",
"Sharing" : "ভাগাভাগিরত",
"Tags" : "ট্যাগ",
"Activity" : "সক্রিয়তা",
"Can edit" : "Can edit",
"Can share" : "Can share",
"Owner" : "Owner",
"Delete" : "মুছে",
"Edit" : "সম্পাদনা",
"Download" : "ডাউনলোড",
"Modified" : "পরিবর্তিত",
"Save" : "সংরক্ষণ",
"Created:" : "তৈরীর নির্ঘন্টঃ",
"Reply" : "জবাব",
"Update" : "পরিবর্ধন",
"Description" : "বিবরণ",
"(group)" : "(গোষ্ঠি)",
"seconds ago" : "সেকেন্ড পূর্বে",
"Keyboard shortcuts" : "কী-বোর্ড শর্টকাট",
"Search" : "Search",
"Shared with you" : "Shared with you",
"Export" : "রপ্তানি",
"Today" : "আজ",
"Tomorrow" : "আগামীকাল",
"Close" : "বন্ধ",
"Share" : "ভাগাভাগি কর",
"Personal" : "ব্যক্তিগত"
"Tomorrow" : "আগামীকাল"
},
"nplurals=2; plural=(n != 1);");

View File

@@ -1,36 +1,26 @@
{ "translations": {
"Personal" : "ব্যক্তিগত",
"Done" : "Done",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "আপলোড করা ফাইলটি HTML ফর্মে উল্লিখিত MAX_FILE_SIZE নির্ধারিত ফাইলের সর্বোচ্চ আকার অতিক্রম করতে চলেছে ",
"No file was uploaded" : "কোন ফাইল আপলোড করা হয় নি",
"Missing a temporary folder" : "অস্থায়ী ফোল্ডারটি হারানো গিয়েছে",
"Done" : "Done",
"Cancel" : "বাতির",
"Completed" : "সুসম্পন্ন",
"Details" : "বিসতারিত",
"Sharing" : "ভাগাভাগিরত",
"Tags" : "ট্যাগ",
"Activity" : "সক্রিয়তা",
"Can edit" : "Can edit",
"Can share" : "Can share",
"Owner" : "Owner",
"Delete" : "মুছে",
"Edit" : "সম্পাদনা",
"Download" : "ডাউনলোড",
"Modified" : "পরিবর্তিত",
"Save" : "সংরক্ষণ",
"Created:" : "তৈরীর নির্ঘন্টঃ",
"Reply" : "জবাব",
"Update" : "পরিবর্ধন",
"Description" : "বিবরণ",
"(group)" : "(গোষ্ঠি)",
"seconds ago" : "সেকেন্ড পূর্বে",
"Keyboard shortcuts" : "কী-বোর্ড শর্টকাট",
"Search" : "Search",
"Shared with you" : "Shared with you",
"Export" : "রপ্তানি",
"Today" : "আজ",
"Tomorrow" : "আগামীকাল",
"Close" : "বন্ধ",
"Share" : "ভাগাভাগি কর",
"Personal" : "ব্যক্তিগত"
"Tomorrow" : "আগামীকাল"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View File

@@ -1,49 +1,30 @@
OC.L10N.register(
"deck",
{
"The file was uploaded" : "Kaset eo bet ar restr",
"No file was uploaded" : "N'eus restr ebet a zo bet kaset",
"Personal" : "Personel",
"Finished" : "Achuet",
"copy" : "eil",
"In Progress" : "War ar stern",
"Done" : "Graet",
"Invalid date, date format must be YYYY-MM-DD" : "Deizat fall, stumm an deizat a zo ret bezhañ BBBB-MM-DD",
"Cancel" : "Nullañ",
"Cancel" : "Arrest",
"Drop your files to upload" : "Laoskit ho restroù evit pellkas",
"Open" : "Digeriñ",
"Completed" : "Achuet",
"Details" : "Munudoù",
"Sharing" : "Rannan",
"Tags" : "Klavioù",
"Activity" : "Obererezh",
"Transfer" : "Treuzkas",
"Can edit" : "Posuple eo embann",
"Can share" : "Galout a ra rannañ",
"Owner" : "Perc'henner",
"Delete" : "Dilemel",
"Edit" : "Cheñch",
"File to share" : "Restr da rannañ",
"Invalid path selected" : "An hent dibabet n'eus ket anezhañ",
"Upload new files" : "Pelkas ur restr nevez",
"Share from Files" : "Rannañ diouzh Restroù",
"Download" : "Pellgargañ",
"Modified" : "Cheñchet",
"Created" : "Krouet",
"Comments" : "Displegadennoù",
"Modified" : "Cheñchet",
"Save" : "Enrollañ",
"Created:" : "Krouet :",
"Reply" : "Respont",
"Update" : "Adnevesaat",
"Description" : "Diskrivadur",
"(group)" : "(strollad)",
"seconds ago" : "eilenn zo",
"Search" : "Klask",
"Shared with you" : "Rannet ganeoc'h",
"No notifications" : "Kemennadenn ebet",
"Today" : "Hiziv",
"Tomorrow" : "Warc'hoaz",
"Close" : "Seriñ",
"Share" : "Rannan",
"Personal" : "Personel"
"This week" : "Er sizhun-mañ"
},
"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);");

View File

@@ -1,47 +1,28 @@
{ "translations": {
"The file was uploaded" : "Kaset eo bet ar restr",
"No file was uploaded" : "N'eus restr ebet a zo bet kaset",
"Personal" : "Personel",
"Finished" : "Achuet",
"copy" : "eil",
"In Progress" : "War ar stern",
"Done" : "Graet",
"Invalid date, date format must be YYYY-MM-DD" : "Deizat fall, stumm an deizat a zo ret bezhañ BBBB-MM-DD",
"Cancel" : "Nullañ",
"Cancel" : "Arrest",
"Drop your files to upload" : "Laoskit ho restroù evit pellkas",
"Open" : "Digeriñ",
"Completed" : "Achuet",
"Details" : "Munudoù",
"Sharing" : "Rannan",
"Tags" : "Klavioù",
"Activity" : "Obererezh",
"Transfer" : "Treuzkas",
"Can edit" : "Posuple eo embann",
"Can share" : "Galout a ra rannañ",
"Owner" : "Perc'henner",
"Delete" : "Dilemel",
"Edit" : "Cheñch",
"File to share" : "Restr da rannañ",
"Invalid path selected" : "An hent dibabet n'eus ket anezhañ",
"Upload new files" : "Pelkas ur restr nevez",
"Share from Files" : "Rannañ diouzh Restroù",
"Download" : "Pellgargañ",
"Modified" : "Cheñchet",
"Created" : "Krouet",
"Comments" : "Displegadennoù",
"Modified" : "Cheñchet",
"Save" : "Enrollañ",
"Created:" : "Krouet :",
"Reply" : "Respont",
"Update" : "Adnevesaat",
"Description" : "Diskrivadur",
"(group)" : "(strollad)",
"seconds ago" : "eilenn zo",
"Search" : "Klask",
"Shared with you" : "Rannet ganeoc'h",
"No notifications" : "Kemennadenn ebet",
"Today" : "Hiziv",
"Tomorrow" : "Warc'hoaz",
"Close" : "Seriñ",
"Share" : "Rannan",
"Personal" : "Personel"
"This week" : "Er sizhun-mañ"
},"pluralForm" :"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);"
}

View File

@@ -1,35 +1,26 @@
OC.L10N.register(
"deck",
{
"Personal" : "Osobno",
"Done" : "Done",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Učitana datoteka premašuje maksimalnu dopuštenu veličinu datoteke MAX_FILE_SIZE navedenu u HTML formi",
"No file was uploaded" : "Nijedna datoteka nije učitana.",
"Missing a temporary folder" : "Nedostaje privremeni direktorij.",
"Done" : "Done",
"Cancel" : "Otkaži",
"Completed" : "Zavrženo",
"Sharing" : "Dijeljenje",
"Activity" : "Aktivnost",
"Can edit" : "Can edit",
"Can share" : "Can share",
"Owner" : "Vlasnik",
"Delete" : "Obriši",
"Edit" : "Izmjeni",
"Members" : "Članovi",
"Download" : "Preuzmi",
"Modified" : "Izmijenjeno",
"Comments" : "Komentari",
"Modified" : "Izmijenjeno",
"Save" : "Spremi",
"Update" : "Ažuriraj",
"Description" : "Opis",
"Keyboard shortcuts" : "Tipkovni prečaci",
"Search" : "Search",
"Shared with you" : "Shared with you",
"Export" : "Izvezi",
"Today" : "Danas",
"Tomorrow" : "Sutra",
"Close" : "Zatvori",
"Maximum file size of {size} exceeded" : "Maksimalna veličina datoteke prekoračena",
"Share" : "Podjeli",
"Personal" : "Osobno"
"Maximum file size of {size} exceeded" : "Maksimalna veličina datoteke prekoračena"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");

View File

@@ -1,33 +1,24 @@
{ "translations": {
"Personal" : "Osobno",
"Done" : "Done",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Učitana datoteka premašuje maksimalnu dopuštenu veličinu datoteke MAX_FILE_SIZE navedenu u HTML formi",
"No file was uploaded" : "Nijedna datoteka nije učitana.",
"Missing a temporary folder" : "Nedostaje privremeni direktorij.",
"Done" : "Done",
"Cancel" : "Otkaži",
"Completed" : "Zavrženo",
"Sharing" : "Dijeljenje",
"Activity" : "Aktivnost",
"Can edit" : "Can edit",
"Can share" : "Can share",
"Owner" : "Vlasnik",
"Delete" : "Obriši",
"Edit" : "Izmjeni",
"Members" : "Članovi",
"Download" : "Preuzmi",
"Modified" : "Izmijenjeno",
"Comments" : "Komentari",
"Modified" : "Izmijenjeno",
"Save" : "Spremi",
"Update" : "Ažuriraj",
"Description" : "Opis",
"Keyboard shortcuts" : "Tipkovni prečaci",
"Search" : "Search",
"Shared with you" : "Shared with you",
"Export" : "Izvezi",
"Today" : "Danas",
"Tomorrow" : "Sutra",
"Close" : "Zatvori",
"Maximum file size of {size} exceeded" : "Maksimalna veličina datoteke prekoračena",
"Share" : "Podjeli",
"Personal" : "Osobno"
"Maximum file size of {size} exceeded" : "Maksimalna veličina datoteke prekoračena"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
}

View File

@@ -29,7 +29,7 @@ OC.L10N.register(
"{user} has deleted card {card} in list {stack} on board {board}" : "{user} ha suprimit la targeta {card} a la llista {stack} al tauler {board}",
"You have renamed the card {before} to {card}" : "Heu reanomenat la targeta {before} a {card}",
"{user} has renamed the card {before} to {card}" : "{user} ha reanomenat la targeta {before} a {card}",
"You have added a description to card {card} in list {stack} on board {board}" : "Heu afegit una descripció a la targeta {card} a la llista {stack} del tauler {board}",
"You have added a description to card {card} in list {stack} on board {board}" : "Heu afegit una descripció a la targeta {card} a la llista {stack} al tauler {board}",
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} ha afegit una descripció a la targeta {card} a la llista {stack} al tauler {board}",
"You have updated the description of card {card} in list {stack} on board {board}" : "Heu actualitzat la descripció de la targeta {card} a la llista {stack} al tauler {board}",
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} ha actualitzat la descripció de la targeta {card} a la llista {stack} al tauler {board}",
@@ -37,16 +37,12 @@ OC.L10N.register(
"{user} has archived card {card} in list {stack} on board {board}" : "{user} té la targeta arxivada {card} a la llista {stack} al tauler {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "Teniu una targeta no-arxchivada {card} a la llista {stack} al tauler {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} té una targeta no-arxivada {card} a la llista {stack} al tauler {board}",
"You have marked the card {card} as done in list {stack} on board {board}" : "Heu marcat la targeta {card} com a feta a la llista {stack} del tauler {board}",
"{user} has marked card {card} as done in list {stack} on board {board}" : "{user} ha marcat la targeta {card} com a feta a la llista {stack} del tauler {board}",
"You have marked the card {card} as undone in list {stack} on board {board}" : "Heu marcat la targeta {card} com a desfeta a la llista {stack} del tauler {board}",
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user} ha marcat la targeta {card} com a desfeta a la llista {stack} del tauler {board}",
"You have removed the due date of card {card}" : "Heu suprimit la data de caducitat de la targeta {card}",
"{user} has removed the due date of card {card}" : "{user} ha suprimit la data de caducitat de la targeta {card}",
"You have set the due date of card {card} to {after}" : "Heu establert la data de caducitat de la targeta {card} a {after}",
"{user} has set the due date of card {card} to {after}" : "{user} ha establert la data de caducitat de la targeta {card} a {after}",
"You have updated the due date of card {card} to {after}" : "Heu actualitzat la data de caducitat de la targeta {card} a {after}",
"{user} has updated the due date of card {card} to {after}" : "{user} ha actualitzat la data de caducitat de la targeta {card} a {after}",
"You have removed the due date of card {card}" : "Heu suprimit la data de venciment de la targeta {targeta}",
"{user} has removed the due date of card {card}" : "{user} ha suprimit la data de venciment de la targeta {targeta}",
"You have set the due date of card {card} to {after}" : "Heu establert la data de venciment de la targeta {card} a {after}",
"{user} has set the due date of card {card} to {after}" : "{user} ha establert la data de venciment de la targeta {card} a {after}",
"You have updated the due date of card {card} to {after}" : "Heu actualitzat la data de venciment de la targeta {card} a {after}",
"{user} has updated the due date of card {card} to {after}" : "{user} ha actualitzat la data de venciment de la targeta {card} a {after}",
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "Heu afegit l'etiqueta {label} a la targeta {card} a la llista {stack} al tauler {board}",
"{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "{user} ha afegit l'etiqueta {label} a la targeta {card} a la llista {stack} al tauler {board}",
"You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Heu eliminat l'etiqueta {label} de la targeta {card} a la llista {stack} al tauler {board}",
@@ -67,11 +63,28 @@ OC.L10N.register(
"{user} has restored the attachment {attachment} to card {card}" : "{user} ha restaurat l'adjunt {attachment} a la targeta {card}",
"You have commented on card {card}" : "Heu comentat la targeta {card}",
"{user} has commented on card {card}" : "{user} ha comentat la targeta {card}",
"A <strong>card description</strong> inside the Deck app has been changed" : "S'ha canviat una <strong>descripció de targeta</strong> a l'aplicació Tauler",
"Deck" : "Targetes",
"Changes in the <strong>Deck app</strong>" : "Canvis a l'<strong>aplicació Targetes</strong>",
"A <strong>board, list or card</strong> was changed" : "S'ha canviat un <strong>tauler, llista o targeta</strong>",
"A <strong>comment</strong> was created on a card" : "S'ha creat un <strong>comentari</strong> a una targeta",
"A <strong>card description</strong> has been changed" : "S'ha canviat la <strong>descripció de la targeta</strong>",
"A <strong>comment</strong> was created on a card" : "S'ha afegit un <strong>comentari</strong> a una targeta",
"Upcoming cards" : "Pròximes targetes",
"Personal" : "Personal",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "La targeta \"%s\" sobre \"%s\" se us ha assignat per %s.",
"The card \"%s\" on \"%s\" has reached its due date." : "La targeta \"%s\" sobre \"%s\" ha assolit la seva data de venciment.",
"%s has mentioned you in a comment on \"%s\"." : "%s us ha anomenat en un comentari sobre \"%s\".",
"The board \"%s\" has been shared with you by %s." : "El tauler \"%s\" se us ha compartit per %s.",
"No data was provided to create an attachment." : "No sha proporcionat cap dada per crear un fitxer adjunt.",
"Finished" : "Acabat",
"To review" : "Per revisar",
"Action needed" : "Acció necessària",
"Later" : "Més tard",
"copy" : "còpia",
"To do" : "Pendent",
"Doing" : "En procés",
"Done" : "Finalitzat",
"Example Task 3" : "Tasca d'exemple 3",
"Example Task 2" : "Tasca d'exemple 2",
"Example Task 1" : "Tasca d'exemple 1",
"The file was uploaded" : "S'ha pujat el fitxer",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El fitxer carregat excedeix la directiva upload_max_filesize dins de php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El fitxer carregat excedeix la directiva MAX_FILE_SIZE que hi ha especificada al formulari d'HTML",
@@ -79,86 +92,36 @@ OC.L10N.register(
"No file was uploaded" : "No s'ha pujat cap fitxer",
"Missing a temporary folder" : "Falta una carpeta temporal",
"Could not write file to disk" : "No sha pogut escriure el fitxer al disc",
"A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la pujada del fitxer",
"A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la carregada del fitxer",
"No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s",
"Cards due today" : "Targetes per avui",
"Cards due tomorrow" : "Targetes amb venciment demà",
"Upcoming cards" : "Pròximes targetes",
"Load more" : "Carrega'n més",
"Welcome to Nextcloud Deck!" : "Benvingut a Targetes de Nextcloud!",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "La targeta \"%s\" sobre \"%s\" se us ha assignat per %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} us ha assignat la targeta {deck-card} a {deck-board}.",
"The card \"%s\" on \"%s\" has reached its due date." : "La targeta \"%s\" sobre \"%s\" ha assolit la seva data de caducitat.",
"The card {deck-card} on {deck-board} has reached its due date." : "La targeta {deck-card} a {deck-board} ha assolit la seva data de caducitat.",
"%s has mentioned you in a comment on \"%s\"." : "%s us ha anomenat en un comentari sobre \"%s\".",
"{user} has mentioned you in a comment on {deck-card}." : "{user} us ha mencionat en un comentari a {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "El tauler \"%s\" se us ha compartit per %s.",
"{user} has shared {deck-board} with you." : "{user} us ha compartit {deck-board}.",
"Deck board" : "Tauler de Deck",
"Owned by %1$s" : "Propietat de %1$s",
"Deck boards, cards and comments" : "Taulers, targetes i comentaris",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "De %1$s, a %2$s/%3$s, propietat de %4$s",
"Create a new deck card" : "Crea una nova targeta",
"Card comments" : "Comentaris de la targeta",
"%s on %s" : "%s a %s",
"Deck boards and cards" : "Taulers de piles i targetes",
"No data was provided to create an attachment." : "No sha proporcionat cap dada per crear un fitxer adjunt.",
"Finished" : "Acabat",
"To review" : "Per revisar",
"Action needed" : "Acció necessària",
"Later" : "Més tard",
"copy" : "còpia",
"Read more inside" : "Llegeix més a dins",
"Custom lists - click to rename!" : "Llistes personalitzades: feu clic per canviar el nom!",
"To Do" : "Per fer",
"In Progress" : "En curs",
"Done" : "Fet",
"1. Open to learn more about boards and cards" : "1. Obre per obtenir més informació sobre taulers i cartes",
"2. Drag cards left and right, up and down" : "2. Arrossegueu les targetes a l'esquerra i a la dreta, amunt i avall",
"3. Apply rich formatting and link content" : "3. Aplica format ric i contingut d'enllaços",
"4. Share, comment and collaborate!" : "4. Comparteix, comenta i col·labora!",
"Create your first card!" : "Crea la teva primera targeta!",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Aquest comentari té més de %s caràcters.\nS'ha afegit com a fitxer adjunt a la targeta amb el nom %s.\nAccessible a l'URL: %s.",
"Card not found" : "No s'ha trobat la targeta",
"Path is already shared with this card" : "Aquesta ruta ja ha estat compartida amb aquesta targeta",
"Invalid date, date format must be YYYY-MM-DD" : "La data no és vàlida, el format de la data ha de ser YYYY-MM-DD",
"Personal planning and team project organization" : "Planificació personal i organització de projectes en equip",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Tauler és una eina d'organització a l'estil kanban dirigida a la planificació personal i a l'organització de projectes per equips integrada a Nextcloud.\n\n\n- 📥 Afegiu les tasques en targetes i poseu-les en ordre\n- 📄 Apunteu notes addicionals en format Markdown\n- 🔖 Assigneu etiquetes per una millor organització\n- 👥 Compartiu amb el vostre equip, família o amics\n- 📎 Adjunteu fitxers i encasteu-los en la descripció en markdown\n- 💬 Converses amb el vostre equip fent servir comentaris\n- ⚡ Mantingueu el seguiment de canvis al flux d'activitat\n- 🚀 Tingueu el vostre projecte organitzat",
"Add board" : "Afegeix un tauler",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Tauler és una eina d'organització a l'estil kanban dirigida a la planificació personal i a l'organització de projectes per equips integrada a Nextcloud.\n\n\n- 📥 Afegiu les tasques en targetes i poseu-les en ordre\n- 📄 Apunteu notes addicionals en markdown\n- 🔖 Assigneu etiquetes per una organització encara millor\n- 👥 Compartiu amb el vostre equip, família o amics\n- 📎 Adjunteu fitxers i encasteu-los en la descripció en markdown\n- 💬 Debateu amb el vostre equip fent servir comentaris\n- ⚡ Mantingueu el seguiment de canvis al flux d'activitat\n- 🚀 Tingueu el vostre projecte organitzat",
"Card details" : "Detalls de la targeta",
"Add board" : "Afegeix un tauler",
"Select the board to link to a project" : "Selecciona el tauler per enllaçar a un projecte",
"Search by board title" : "Cerca per títol del tauler",
"Select board" : "Selecciona un tauler",
"Move/copy card" : "Mou/copia la targeta",
"Select a board" : "Selecciona un tauler",
"No lists available" : "No hi ha cap llista disponible",
"Select a list" : "Seleccioneu una llista",
"Move card" : "Mou la targeta",
"Copy card" : "Còpia de la targeta",
"Cancel" : "Cancel·la",
"Select a card" : "Selecciona una targeta",
"Select the card to link to a project" : "Selecciona la targeta per enllaçar a un projecte",
"Link to card" : "Enllaç a la targeta",
"Select a card" : "Selecciona una targeta",
"Cancel" : "Cancel·la",
"This board is read only" : "Aquest tauler és només de lectura",
"Drop your files to upload" : "Deixeu anar els fitxers per pujar-los",
"File already exists" : "El fitxer ja existeix",
"A file with the name {filename} already exists." : "Ja existeix un fitxer amb el nom {filename}.",
"Do you want to overwrite it?" : "Voleu sobre-escriure'l?",
"Overwrite file" : "Sobreescriu el fitxer",
"Keep existing file" : "Mantén el fitxer existent",
"This board is read only" : "Aquest tauler és només de lectura",
"Drop your files to upload" : "Deixeu anar els fitxers per penjar-los",
"Add card" : "Afegeix una targeta",
"Archived cards" : "Targetes arxivades",
"Add list" : "Afegeix una llista",
"List name" : "Nom de la llista",
"Active filters" : "Filtres actius",
"Apply filter" : "Aplica el filtre",
"Filter by tag" : "Filtra per etiqueta",
"Filter by assigned user" : "Filtra per usuari assignat",
"Unassigned" : "Sense assignar",
"Filter by status" : "Filtra per estat",
"Open and completed" : "Obert i acabat",
"Open" : "Obert",
"Completed" : "S'ha completat",
"Filter by due date" : "Filtra per data de venciment",
"Overdue" : "Endarrerit",
"Next 24 hours" : "Pròximes 24 hores",
@@ -166,242 +129,124 @@ OC.L10N.register(
"Next 30 days" : "Pròxims 30 dies",
"No due date" : "Sense venciment",
"Clear filter" : "Esborra el filtre",
"View Modes" : "Modes de visualització",
"Toggle View Modes" : "Commuta els modes de visualització",
"Hide archived cards" : "Amaga les targetes arxivades",
"Show archived cards" : "Mostra les targetes arxivades",
"Toggle compact mode" : "Commuta el mode compacte",
"Hide card cover images" : "Amaga les imatges de la portada de la targeta",
"Show card cover images" : "Mostra les imatges de la portada de la targeta",
"Open details" : "Obre els detalls",
"Details" : "Detalls",
"Currently present people" : "Persones presents actuals",
"Loading board" : "S'està carregant el tauler",
"Board not found" : "Tauler no trobat",
"No lists available" : "No hi ha cap llista disponible",
"Create a new list to add cards to this board" : "Crea una llista nova per afegir targetes a aquest tauler",
"Board not found" : "Tauler no trobat",
"Sharing" : "Compartició",
"Tags" : "Etiquetes",
"Deleted items" : "Elements suprimits",
"Activity" : "Activitat",
"Timeline" : "Línia de temps",
"Deleted lists" : "Llistes suprimides",
"Undo" : "Desfés",
"Deleted cards" : "Targetes suprimides",
"Failed to create share with {displayName}" : "Ha fallat la creació de la compartició amb {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "Esteu segur que voleu transferir el tauler {title} a {user}?",
"Transfer the board." : "Transfereix el tauler.",
"Transfer" : "Transferència",
"The board has been transferred to {user}" : "El tauler s'ha transferit a {user}",
"Failed to transfer the board to {user}" : "No s'ha pogut transferir el tauler a {user}",
"Share board with a user, group or team …" : "Comparteix el tauler amb un usuari, grup o equip …",
"Searching for users, groups and teams …" : "Cercant usuaris, grups i equips …",
"Share board with a user, group or circle …" : "Compartir tauler amb un usuari, grup o cercle …",
"Searching for users, groups and circles …" : "Buscant usuaris, grups i cercles",
"No participants found" : "No s'han trobat participants",
"Board owner" : "Propietari del tauler",
"(Group)" : "(Grup)",
"(Team)" : "(Equip)",
"(Circle)" : "(Cercle)",
"Can edit" : "Pot editar",
"Can share" : "Pot compartir",
"Can manage" : "Pot gestionar",
"Owner" : "Propietari",
"Delete" : "Suprimeix",
"List deleted" : "Llista suprimida",
"Edit list title" : "Edició del títol de la llista",
"Delete" : "Eliminar",
"Failed to create share with {displayName}" : "Ha fallat la creació de la compartició amb {displayName}",
"Add a new list" : "Afegir una llista nova",
"Archive all cards" : "Arxiva totes les targetes",
"Unarchive all cards" : "Desarxivar totes les targetes",
"Delete list" : "Suprimeix la llista",
"Archive all cards in this list" : "Arxiva totes les targetes d'aquesta llista",
"Unarchive all cards in this list" : "Desarxivar totes les targetes d'aquesta llista",
"Add a new card" : "Afegeix una nova targeta",
"Add a new card" : "Afegir una nova targeta",
"Card name" : "Nom de la targeta",
"List deleted" : "Llista suprimida",
"Edit" : "Edita",
"Add a new tag" : "Afegir una etiqueta nova",
"title and color value must be provided" : "sha de proporcionar el valor del títol i del color",
"Edit" : "Edició",
"Add a new tag" : "Afegeix una etiqueta nova",
"Board name" : "Nom del taulell",
"Members" : "Membres",
"Assign to users/groups/team" : "Assigna a usuaris/grups/equip",
"Assign a user to this card…" : "Assignació d'un usuari a aquesta targeta…",
"Select a user to assign to this card…" : "Seleccioneu un usuari per assignar-lo a aquesta targeta…",
"File to share" : "Fitxer a compartir",
"Invalid path selected" : "S'ha seleccionat un camí no vàlid",
"Upload new files" : "Pujada de nous fitxers",
"Share from Files" : "Comparteix des de Fitxers",
"Pending share" : "Compartició pendent",
"Add this attachment" : "Afegeix aquest adjunt",
"Show in Files" : "Mostra a Fitxers",
"Download" : "Baixada",
"Remove attachment" : "Treu l'adjunt",
"Delete Attachment" : "Suprimeix ladjunt",
"Restore Attachment" : "Restaura l'adjunt",
"Modified" : "Darrera modificació",
"Created" : "Creat",
"The title cannot be empty." : "El títol no pot estar buit.",
"Open in sidebar view" : "Obre a la vista de la barra lateral",
"Open in bigger view" : "Obre a la vista més gran",
"Attachments" : "Adjunts",
"Comments" : "Comentaris",
"Failed to load comments" : "No s'han pogut carregar els comentaris",
"Modified" : "Darrera modificació",
"Created" : "Creat",
"The title cannot be empty." : "El títol no pot estar buit",
"No comments yet. Begin the discussion!" : "No hi ha comentaris encara. Començar la discussió!",
"Assign a tag to this card…" : "Assigna una etiqueta a aquesta targeta…",
"Assign to users" : "Assigna als usuaris",
"Assign to users/groups/circles" : "Assigna a usuaris/grups/cercles",
"Assign a user to this card…" : "Assigneu un usuari a aquesta targeta…",
"Due date" : "Per la data",
"Set a due date" : "Definir una data de venciment",
"Remove due date" : "Elimina la data de venciment",
"Select Date" : "Selecciona la data",
"Save" : "Desa",
"The comment cannot be empty." : "El comentari no pot estar buit.",
"The comment cannot be longer than 1000 characters." : "El comentari no pot ser més llarg que 1000 caràcters.",
"Save" : "Desa",
"Created:" : "Data de creació:",
"In reply to" : "En resposta a",
"Cancel reply" : "Cancel·la la resposta",
"Reply" : "Respon",
"Update" : "Actualitza",
"Write a description …" : "Escriviu una descripció …",
"Description" : "Descripció",
"(Unsaved)" : "(No desat)",
"(Saving…)" : "(Desant…)",
"Formatting help" : "Format d'ajuda",
"Edit description" : "Edició descripció",
"Edit description" : "Edita descripció",
"View description" : "Veure descripció",
"Add Attachment" : "Afegeix un adjunt",
"Write a description …" : "Escriviu una descripció...",
"Choose attachment" : "Triar adjunt",
"Select Date" : "Selecciona la data",
"Later today {timeLocale}" : "Avui més tard: {timeLocale}",
"Set due date for later today" : "Estableix una data de caducitat per avui més tard",
"Tomorrow {timeLocale}" : "Demà: {timeLocale}",
"Set due date for tomorrow" : "Estableix data de caducitat per a demà",
"This weekend {timeLocale}" : "Aquest cap de setmana: {timeLocale}",
"Set due date for this weekend" : "Estableix una data de caducitat per aquest cap de setmana",
"Next week {timeLocale}" : "La setmana següent: {timeLocale}",
"Set due date for next week" : "Estableix una data de caducitat per a la setmana vinent",
"Assign a due date to this card…" : "Assigna una data de caducitat a aquesta targeta…",
"Set a due date" : "Definir una data de caducitat",
"Add due date" : "Afegeix una data de caducitat",
"Choose a date" : "Trieu una data",
"Remove due date" : "Suprimeix la data de caducitat",
"Mark as done" : "Marcat com a fet",
"Due at:" : "Venciment a:",
"Not done" : "No s'ha fet",
"Unarchive card" : "Desarxiva targeta",
"Archive card" : "Arxiva la targeta",
"Assign a tag to this card…" : "Assignació d'una etiqueta a aquesta targeta…",
"Select or create a tag…" : "Seleccioneu o creeu una etiqueta…",
"Create a new tag:" : "Crea una etiqueta nova:",
"(group)" : "(grup)",
"{count} comments, {unread} unread" : "{count} comentaris, {unread} no llegits",
"Todo items" : "Tasques pendents",
"Edit card title" : "Edició del títol de la targeta",
"Open link" : "Obre l'enllaç",
"Card deleted" : "Targeta suprimida",
"Edit title" : "Edició del títol",
"Assign to me" : "Assigna'm a mi",
"Unassign myself" : "Desasignar a mi mateix",
"Mark as not done" : "Marca com no fet",
"Move card" : "Mou la targeta",
"Unarchive card" : "Desarxiva targeta",
"Archive card" : "Arxiva la targeta",
"Delete card" : "Suprimeix targeta",
"Move card to another board" : "Mou la targeta a un altre tauler",
"Card deleted" : "Targeta suprimida",
"seconds ago" : "fa uns segons",
"Keyboard shortcuts" : "Dreceres de teclat",
"Boost your productivity using Deck with keyboard shortcuts." : "Augmenta la teva productivitat amb Targetes fent servir tecles de drecera.",
"Board actions" : "Accions de Tauler",
"Keyboard shortcut" : "Drecera de teclat",
"Action" : "Acció",
"Shift" : "Maj",
"Scroll" : "Desplaçament",
"Scroll sideways" : "Desplaçament de costat",
"Navigate between cards" : "Navega entre les targetes",
"Esc" : "Esc",
"Close card details" : "Tanca els detalls de la targeta",
"Ctrl" : "Ctrl",
"Search" : "Cercar",
"Show card filters" : "Mostra els filtres de la targeta",
"Clear card filters" : "Esborra els filtres de la targeta",
"Show help dialog" : "Mostra el diàleg d'ajuda",
"Card actions" : "Accions de la targeta",
"The following actions can be triggered on the currently highlighted card" : "Les accions següents es poden activar a la targeta actualitzada",
"Enter" : "Retorn",
"Space" : "Espai",
"Open card details" : "Obre els detalls de la targeta",
"Edit the card title" : "Edició del títol de la targeta",
"Assign yourself to the current card" : "Assigneu-vos a la targeta actual",
"Archive/unarchive the current card" : "Arxiva/desarxiva la targeta actual",
"Mark card as completed/not completed" : "Marca la targeta com a completada/no completada",
"Open card menu" : "Obre el menú de la targeta",
"All boards" : "Tots els taulers",
"Archived boards" : "Taulers arxivats",
"Shared with you" : "Us han compartit",
"Deck settings" : "Paràmetres de Targetes",
"Use bigger card view" : "Utilitza la visualització de targetes més gran",
"Show card ID badge" : "Mostra el distintiu dID de la targeta",
"Show boards in calendar/tasks" : "Mostra els taulers al calendari/tasques",
"Limit board creation to some groups" : "Limiteu la creació de taulers a alguns grups",
"Users outside of those groups will not be able to create their own boards, but will still be able to work on boards that have been shared with them." : "Els usuaris fora d'aquests grups no podran crear els seus propis taulers, però encara podran treballar en taulers que s'hagin compartit amb ells.",
"Cancel edit" : "Cancel·la l'edició",
"Save board" : "Guarda el tauler",
"Board {0} deleted" : "Sha suprimit el tauler {0}",
"All cards" : "Totes les targetes",
"Only assigned cards" : "Només les targetes assignades",
"No reminder" : "Sense recordatoris",
"An error occurred" : "S'ha produït un error",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Esteu segur que voleu suprimir el tauler {title}? Això suprimirà totes les dades d'aquest tauler, incloses les targetes arxivades.",
"Delete the board?" : "Voleu suprimir el tauler?",
"Board details" : "Detalls del tauler",
"Limit deck usage of groups" : "Limitar l'ús del tauler de grups",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells.",
"Board details" : "Detalls de la junta",
"Edit board" : "Edita el tauler",
"Clone board" : "Clonar tauler",
"Unarchive board" : "Desarxiva el tauler",
"Archive board" : "Arxiva el tauler",
"Export board" : "Exportació de tauler",
"Turn on due date reminders" : "Activa els recordatoris de data de venciment",
"Turn off due date reminders" : "Desactiva els recordatoris de data de venciment",
"Due date reminders" : "Recordatoris de data de venciment",
"All cards" : "Totes les targetes",
"Assigned cards" : "Targetes assignades",
"No notifications" : "No hi ha notificacions",
"Delete board" : "Suprimeix el tauler",
"Clone {boardTitle}" : "Clonar {boardTitle}",
"Clone cards" : "Clonar targetes",
"Clone assignments" : "Clonar les tasques",
"Clone labels" : "Clonar etiquetes",
"Clone due dates" : "Clonar les dates de caducitat",
"Advanced options" : "Opcions avançades",
"Move all cards to the first list" : "Mou totes les targetes a la primera llista",
"Restore archived cards" : "Restaura les targetes arxivades",
"Clone" : "Clonar",
"Export as CSV" : "Exporta a CSV",
"Export" : "Exporta",
"Board {0} deleted" : "Sha suprimit el tauler {0}",
"Only assigned cards" : "Només les targetes assignades",
"No reminder" : "Sense recordatoris",
"An error occurred" : "S'ha produït un error",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Esteu segur que voleu suprimir el tauler {title}? Això eliminarà totes les dades d'aquest tauler.",
"Delete the board?" : "Voleu suprimir el tauler?",
"Loading filtered view" : "S'està carregant la visualització filtrada",
"Today" : "Avui",
"Tomorrow" : "Demà",
"This week" : "Aquesta setmana",
"No due" : "Sense venciment",
"Search for {searchQuery} in all boards" : "Busca {searchQuery} a tots els taulers",
"No results found" : "No s'han trobat resultats",
"Deck board {name}\n* Last modified on {lastMod}" : "Tauler de piles {name}\n* Última modificació el dia {lastMod}",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Creat el {created}\n* Última modificació el dia {lastMod}\n* {nbAttachments} fitxers adjunts\n* {nbComments} comentaris",
"{nbCards} cards" : "{nbCards} targetes",
"Due on {date}" : "Venciment el dia {date}",
"{stack} in {board}" : "{stack} a {board}",
"Click to expand description" : "Feu clic per ampliar la descripció",
"Click to expand comment" : "Feu clic per ampliar el comentari",
"Create card" : "Crea una targeta",
"Create a new card" : "Crea una nova targeta",
"Card title" : "Títol de la targeta",
"Creating the new card …" : "Creant la nova targeta …",
"Card \"{card}\" was added to \"{board}\"" : "La targeta \"{card}\" s'ha afegit a \"{board}\"",
"Open card" : "Obre la targeta",
"Close" : "Tanca",
"No upcoming cards" : "No hi ha pròximes targetes",
"upcoming cards today" : "properes targetes avui",
"upcoming cards tomorrow" : "properes targetes demà",
"upcoming cards" : "pròximes targetes",
"New card" : "Nova targeta",
"Link to a board" : "Enllaça a un tauler",
"Link to a card" : "Enllaç una targeta",
"Create a card" : "Crea una targeta",
"Message from {author} in {conversationName}" : "Missatge de {author} a {conversationName}",
"Something went wrong" : "Alguna cosa ha anat malament",
"Failed to upload {name}" : "No s'ha pogut pujar {name}",
"Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}",
"Due date" : "Data de caducitat",
"Error creating the share" : "S'ha produït un error en crear la compartició",
"Share with a Deck card" : "Compartir amb una targeta de Deck",
"Share {file} with a Deck card" : "Compartir {file} amb una targeta de Deck",
"Share" : "Compartir",
"Personal" : "Personal",
"To do" : "Pendent",
"Doing" : "En procés",
"Example Task 3" : "Tasca d'exemple 3",
"Example Task 2" : "Tasca d'exemple 2",
"Example Task 1" : "Tasca d'exemple 1",
"Move card to another board" : "Mou la targeta a un altre tauler",
"Filter by completed" : "Filtra per completat"
"Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}"
},
"nplurals=2; plural=(n != 1);");

View File

@@ -27,7 +27,7 @@
"{user} has deleted card {card} in list {stack} on board {board}" : "{user} ha suprimit la targeta {card} a la llista {stack} al tauler {board}",
"You have renamed the card {before} to {card}" : "Heu reanomenat la targeta {before} a {card}",
"{user} has renamed the card {before} to {card}" : "{user} ha reanomenat la targeta {before} a {card}",
"You have added a description to card {card} in list {stack} on board {board}" : "Heu afegit una descripció a la targeta {card} a la llista {stack} del tauler {board}",
"You have added a description to card {card} in list {stack} on board {board}" : "Heu afegit una descripció a la targeta {card} a la llista {stack} al tauler {board}",
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} ha afegit una descripció a la targeta {card} a la llista {stack} al tauler {board}",
"You have updated the description of card {card} in list {stack} on board {board}" : "Heu actualitzat la descripció de la targeta {card} a la llista {stack} al tauler {board}",
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} ha actualitzat la descripció de la targeta {card} a la llista {stack} al tauler {board}",
@@ -35,16 +35,12 @@
"{user} has archived card {card} in list {stack} on board {board}" : "{user} té la targeta arxivada {card} a la llista {stack} al tauler {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "Teniu una targeta no-arxchivada {card} a la llista {stack} al tauler {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} té una targeta no-arxivada {card} a la llista {stack} al tauler {board}",
"You have marked the card {card} as done in list {stack} on board {board}" : "Heu marcat la targeta {card} com a feta a la llista {stack} del tauler {board}",
"{user} has marked card {card} as done in list {stack} on board {board}" : "{user} ha marcat la targeta {card} com a feta a la llista {stack} del tauler {board}",
"You have marked the card {card} as undone in list {stack} on board {board}" : "Heu marcat la targeta {card} com a desfeta a la llista {stack} del tauler {board}",
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user} ha marcat la targeta {card} com a desfeta a la llista {stack} del tauler {board}",
"You have removed the due date of card {card}" : "Heu suprimit la data de caducitat de la targeta {card}",
"{user} has removed the due date of card {card}" : "{user} ha suprimit la data de caducitat de la targeta {card}",
"You have set the due date of card {card} to {after}" : "Heu establert la data de caducitat de la targeta {card} a {after}",
"{user} has set the due date of card {card} to {after}" : "{user} ha establert la data de caducitat de la targeta {card} a {after}",
"You have updated the due date of card {card} to {after}" : "Heu actualitzat la data de caducitat de la targeta {card} a {after}",
"{user} has updated the due date of card {card} to {after}" : "{user} ha actualitzat la data de caducitat de la targeta {card} a {after}",
"You have removed the due date of card {card}" : "Heu suprimit la data de venciment de la targeta {targeta}",
"{user} has removed the due date of card {card}" : "{user} ha suprimit la data de venciment de la targeta {targeta}",
"You have set the due date of card {card} to {after}" : "Heu establert la data de venciment de la targeta {card} a {after}",
"{user} has set the due date of card {card} to {after}" : "{user} ha establert la data de venciment de la targeta {card} a {after}",
"You have updated the due date of card {card} to {after}" : "Heu actualitzat la data de venciment de la targeta {card} a {after}",
"{user} has updated the due date of card {card} to {after}" : "{user} ha actualitzat la data de venciment de la targeta {card} a {after}",
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "Heu afegit l'etiqueta {label} a la targeta {card} a la llista {stack} al tauler {board}",
"{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "{user} ha afegit l'etiqueta {label} a la targeta {card} a la llista {stack} al tauler {board}",
"You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Heu eliminat l'etiqueta {label} de la targeta {card} a la llista {stack} al tauler {board}",
@@ -65,11 +61,28 @@
"{user} has restored the attachment {attachment} to card {card}" : "{user} ha restaurat l'adjunt {attachment} a la targeta {card}",
"You have commented on card {card}" : "Heu comentat la targeta {card}",
"{user} has commented on card {card}" : "{user} ha comentat la targeta {card}",
"A <strong>card description</strong> inside the Deck app has been changed" : "S'ha canviat una <strong>descripció de targeta</strong> a l'aplicació Tauler",
"Deck" : "Targetes",
"Changes in the <strong>Deck app</strong>" : "Canvis a l'<strong>aplicació Targetes</strong>",
"A <strong>board, list or card</strong> was changed" : "S'ha canviat un <strong>tauler, llista o targeta</strong>",
"A <strong>comment</strong> was created on a card" : "S'ha creat un <strong>comentari</strong> a una targeta",
"A <strong>card description</strong> has been changed" : "S'ha canviat la <strong>descripció de la targeta</strong>",
"A <strong>comment</strong> was created on a card" : "S'ha afegit un <strong>comentari</strong> a una targeta",
"Upcoming cards" : "Pròximes targetes",
"Personal" : "Personal",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "La targeta \"%s\" sobre \"%s\" se us ha assignat per %s.",
"The card \"%s\" on \"%s\" has reached its due date." : "La targeta \"%s\" sobre \"%s\" ha assolit la seva data de venciment.",
"%s has mentioned you in a comment on \"%s\"." : "%s us ha anomenat en un comentari sobre \"%s\".",
"The board \"%s\" has been shared with you by %s." : "El tauler \"%s\" se us ha compartit per %s.",
"No data was provided to create an attachment." : "No sha proporcionat cap dada per crear un fitxer adjunt.",
"Finished" : "Acabat",
"To review" : "Per revisar",
"Action needed" : "Acció necessària",
"Later" : "Més tard",
"copy" : "còpia",
"To do" : "Pendent",
"Doing" : "En procés",
"Done" : "Finalitzat",
"Example Task 3" : "Tasca d'exemple 3",
"Example Task 2" : "Tasca d'exemple 2",
"Example Task 1" : "Tasca d'exemple 1",
"The file was uploaded" : "S'ha pujat el fitxer",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El fitxer carregat excedeix la directiva upload_max_filesize dins de php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El fitxer carregat excedeix la directiva MAX_FILE_SIZE que hi ha especificada al formulari d'HTML",
@@ -77,86 +90,36 @@
"No file was uploaded" : "No s'ha pujat cap fitxer",
"Missing a temporary folder" : "Falta una carpeta temporal",
"Could not write file to disk" : "No sha pogut escriure el fitxer al disc",
"A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la pujada del fitxer",
"A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la carregada del fitxer",
"No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s",
"Cards due today" : "Targetes per avui",
"Cards due tomorrow" : "Targetes amb venciment demà",
"Upcoming cards" : "Pròximes targetes",
"Load more" : "Carrega'n més",
"Welcome to Nextcloud Deck!" : "Benvingut a Targetes de Nextcloud!",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "La targeta \"%s\" sobre \"%s\" se us ha assignat per %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} us ha assignat la targeta {deck-card} a {deck-board}.",
"The card \"%s\" on \"%s\" has reached its due date." : "La targeta \"%s\" sobre \"%s\" ha assolit la seva data de caducitat.",
"The card {deck-card} on {deck-board} has reached its due date." : "La targeta {deck-card} a {deck-board} ha assolit la seva data de caducitat.",
"%s has mentioned you in a comment on \"%s\"." : "%s us ha anomenat en un comentari sobre \"%s\".",
"{user} has mentioned you in a comment on {deck-card}." : "{user} us ha mencionat en un comentari a {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "El tauler \"%s\" se us ha compartit per %s.",
"{user} has shared {deck-board} with you." : "{user} us ha compartit {deck-board}.",
"Deck board" : "Tauler de Deck",
"Owned by %1$s" : "Propietat de %1$s",
"Deck boards, cards and comments" : "Taulers, targetes i comentaris",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "De %1$s, a %2$s/%3$s, propietat de %4$s",
"Create a new deck card" : "Crea una nova targeta",
"Card comments" : "Comentaris de la targeta",
"%s on %s" : "%s a %s",
"Deck boards and cards" : "Taulers de piles i targetes",
"No data was provided to create an attachment." : "No sha proporcionat cap dada per crear un fitxer adjunt.",
"Finished" : "Acabat",
"To review" : "Per revisar",
"Action needed" : "Acció necessària",
"Later" : "Més tard",
"copy" : "còpia",
"Read more inside" : "Llegeix més a dins",
"Custom lists - click to rename!" : "Llistes personalitzades: feu clic per canviar el nom!",
"To Do" : "Per fer",
"In Progress" : "En curs",
"Done" : "Fet",
"1. Open to learn more about boards and cards" : "1. Obre per obtenir més informació sobre taulers i cartes",
"2. Drag cards left and right, up and down" : "2. Arrossegueu les targetes a l'esquerra i a la dreta, amunt i avall",
"3. Apply rich formatting and link content" : "3. Aplica format ric i contingut d'enllaços",
"4. Share, comment and collaborate!" : "4. Comparteix, comenta i col·labora!",
"Create your first card!" : "Crea la teva primera targeta!",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Aquest comentari té més de %s caràcters.\nS'ha afegit com a fitxer adjunt a la targeta amb el nom %s.\nAccessible a l'URL: %s.",
"Card not found" : "No s'ha trobat la targeta",
"Path is already shared with this card" : "Aquesta ruta ja ha estat compartida amb aquesta targeta",
"Invalid date, date format must be YYYY-MM-DD" : "La data no és vàlida, el format de la data ha de ser YYYY-MM-DD",
"Personal planning and team project organization" : "Planificació personal i organització de projectes en equip",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Tauler és una eina d'organització a l'estil kanban dirigida a la planificació personal i a l'organització de projectes per equips integrada a Nextcloud.\n\n\n- 📥 Afegiu les tasques en targetes i poseu-les en ordre\n- 📄 Apunteu notes addicionals en format Markdown\n- 🔖 Assigneu etiquetes per una millor organització\n- 👥 Compartiu amb el vostre equip, família o amics\n- 📎 Adjunteu fitxers i encasteu-los en la descripció en markdown\n- 💬 Converses amb el vostre equip fent servir comentaris\n- ⚡ Mantingueu el seguiment de canvis al flux d'activitat\n- 🚀 Tingueu el vostre projecte organitzat",
"Add board" : "Afegeix un tauler",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Tauler és una eina d'organització a l'estil kanban dirigida a la planificació personal i a l'organització de projectes per equips integrada a Nextcloud.\n\n\n- 📥 Afegiu les tasques en targetes i poseu-les en ordre\n- 📄 Apunteu notes addicionals en markdown\n- 🔖 Assigneu etiquetes per una organització encara millor\n- 👥 Compartiu amb el vostre equip, família o amics\n- 📎 Adjunteu fitxers i encasteu-los en la descripció en markdown\n- 💬 Debateu amb el vostre equip fent servir comentaris\n- ⚡ Mantingueu el seguiment de canvis al flux d'activitat\n- 🚀 Tingueu el vostre projecte organitzat",
"Card details" : "Detalls de la targeta",
"Add board" : "Afegeix un tauler",
"Select the board to link to a project" : "Selecciona el tauler per enllaçar a un projecte",
"Search by board title" : "Cerca per títol del tauler",
"Select board" : "Selecciona un tauler",
"Move/copy card" : "Mou/copia la targeta",
"Select a board" : "Selecciona un tauler",
"No lists available" : "No hi ha cap llista disponible",
"Select a list" : "Seleccioneu una llista",
"Move card" : "Mou la targeta",
"Copy card" : "Còpia de la targeta",
"Cancel" : "Cancel·la",
"Select a card" : "Selecciona una targeta",
"Select the card to link to a project" : "Selecciona la targeta per enllaçar a un projecte",
"Link to card" : "Enllaç a la targeta",
"Select a card" : "Selecciona una targeta",
"Cancel" : "Cancel·la",
"This board is read only" : "Aquest tauler és només de lectura",
"Drop your files to upload" : "Deixeu anar els fitxers per pujar-los",
"File already exists" : "El fitxer ja existeix",
"A file with the name {filename} already exists." : "Ja existeix un fitxer amb el nom {filename}.",
"Do you want to overwrite it?" : "Voleu sobre-escriure'l?",
"Overwrite file" : "Sobreescriu el fitxer",
"Keep existing file" : "Mantén el fitxer existent",
"This board is read only" : "Aquest tauler és només de lectura",
"Drop your files to upload" : "Deixeu anar els fitxers per penjar-los",
"Add card" : "Afegeix una targeta",
"Archived cards" : "Targetes arxivades",
"Add list" : "Afegeix una llista",
"List name" : "Nom de la llista",
"Active filters" : "Filtres actius",
"Apply filter" : "Aplica el filtre",
"Filter by tag" : "Filtra per etiqueta",
"Filter by assigned user" : "Filtra per usuari assignat",
"Unassigned" : "Sense assignar",
"Filter by status" : "Filtra per estat",
"Open and completed" : "Obert i acabat",
"Open" : "Obert",
"Completed" : "S'ha completat",
"Filter by due date" : "Filtra per data de venciment",
"Overdue" : "Endarrerit",
"Next 24 hours" : "Pròximes 24 hores",
@@ -164,242 +127,124 @@
"Next 30 days" : "Pròxims 30 dies",
"No due date" : "Sense venciment",
"Clear filter" : "Esborra el filtre",
"View Modes" : "Modes de visualització",
"Toggle View Modes" : "Commuta els modes de visualització",
"Hide archived cards" : "Amaga les targetes arxivades",
"Show archived cards" : "Mostra les targetes arxivades",
"Toggle compact mode" : "Commuta el mode compacte",
"Hide card cover images" : "Amaga les imatges de la portada de la targeta",
"Show card cover images" : "Mostra les imatges de la portada de la targeta",
"Open details" : "Obre els detalls",
"Details" : "Detalls",
"Currently present people" : "Persones presents actuals",
"Loading board" : "S'està carregant el tauler",
"Board not found" : "Tauler no trobat",
"No lists available" : "No hi ha cap llista disponible",
"Create a new list to add cards to this board" : "Crea una llista nova per afegir targetes a aquest tauler",
"Board not found" : "Tauler no trobat",
"Sharing" : "Compartició",
"Tags" : "Etiquetes",
"Deleted items" : "Elements suprimits",
"Activity" : "Activitat",
"Timeline" : "Línia de temps",
"Deleted lists" : "Llistes suprimides",
"Undo" : "Desfés",
"Deleted cards" : "Targetes suprimides",
"Failed to create share with {displayName}" : "Ha fallat la creació de la compartició amb {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "Esteu segur que voleu transferir el tauler {title} a {user}?",
"Transfer the board." : "Transfereix el tauler.",
"Transfer" : "Transferència",
"The board has been transferred to {user}" : "El tauler s'ha transferit a {user}",
"Failed to transfer the board to {user}" : "No s'ha pogut transferir el tauler a {user}",
"Share board with a user, group or team …" : "Comparteix el tauler amb un usuari, grup o equip …",
"Searching for users, groups and teams …" : "Cercant usuaris, grups i equips …",
"Share board with a user, group or circle …" : "Compartir tauler amb un usuari, grup o cercle …",
"Searching for users, groups and circles …" : "Buscant usuaris, grups i cercles",
"No participants found" : "No s'han trobat participants",
"Board owner" : "Propietari del tauler",
"(Group)" : "(Grup)",
"(Team)" : "(Equip)",
"(Circle)" : "(Cercle)",
"Can edit" : "Pot editar",
"Can share" : "Pot compartir",
"Can manage" : "Pot gestionar",
"Owner" : "Propietari",
"Delete" : "Suprimeix",
"List deleted" : "Llista suprimida",
"Edit list title" : "Edició del títol de la llista",
"Delete" : "Eliminar",
"Failed to create share with {displayName}" : "Ha fallat la creació de la compartició amb {displayName}",
"Add a new list" : "Afegir una llista nova",
"Archive all cards" : "Arxiva totes les targetes",
"Unarchive all cards" : "Desarxivar totes les targetes",
"Delete list" : "Suprimeix la llista",
"Archive all cards in this list" : "Arxiva totes les targetes d'aquesta llista",
"Unarchive all cards in this list" : "Desarxivar totes les targetes d'aquesta llista",
"Add a new card" : "Afegeix una nova targeta",
"Add a new card" : "Afegir una nova targeta",
"Card name" : "Nom de la targeta",
"List deleted" : "Llista suprimida",
"Edit" : "Edita",
"Add a new tag" : "Afegir una etiqueta nova",
"title and color value must be provided" : "sha de proporcionar el valor del títol i del color",
"Edit" : "Edició",
"Add a new tag" : "Afegeix una etiqueta nova",
"Board name" : "Nom del taulell",
"Members" : "Membres",
"Assign to users/groups/team" : "Assigna a usuaris/grups/equip",
"Assign a user to this card…" : "Assignació d'un usuari a aquesta targeta…",
"Select a user to assign to this card…" : "Seleccioneu un usuari per assignar-lo a aquesta targeta…",
"File to share" : "Fitxer a compartir",
"Invalid path selected" : "S'ha seleccionat un camí no vàlid",
"Upload new files" : "Pujada de nous fitxers",
"Share from Files" : "Comparteix des de Fitxers",
"Pending share" : "Compartició pendent",
"Add this attachment" : "Afegeix aquest adjunt",
"Show in Files" : "Mostra a Fitxers",
"Download" : "Baixada",
"Remove attachment" : "Treu l'adjunt",
"Delete Attachment" : "Suprimeix ladjunt",
"Restore Attachment" : "Restaura l'adjunt",
"Modified" : "Darrera modificació",
"Created" : "Creat",
"The title cannot be empty." : "El títol no pot estar buit.",
"Open in sidebar view" : "Obre a la vista de la barra lateral",
"Open in bigger view" : "Obre a la vista més gran",
"Attachments" : "Adjunts",
"Comments" : "Comentaris",
"Failed to load comments" : "No s'han pogut carregar els comentaris",
"Modified" : "Darrera modificació",
"Created" : "Creat",
"The title cannot be empty." : "El títol no pot estar buit",
"No comments yet. Begin the discussion!" : "No hi ha comentaris encara. Començar la discussió!",
"Assign a tag to this card…" : "Assigna una etiqueta a aquesta targeta…",
"Assign to users" : "Assigna als usuaris",
"Assign to users/groups/circles" : "Assigna a usuaris/grups/cercles",
"Assign a user to this card…" : "Assigneu un usuari a aquesta targeta…",
"Due date" : "Per la data",
"Set a due date" : "Definir una data de venciment",
"Remove due date" : "Elimina la data de venciment",
"Select Date" : "Selecciona la data",
"Save" : "Desa",
"The comment cannot be empty." : "El comentari no pot estar buit.",
"The comment cannot be longer than 1000 characters." : "El comentari no pot ser més llarg que 1000 caràcters.",
"Save" : "Desa",
"Created:" : "Data de creació:",
"In reply to" : "En resposta a",
"Cancel reply" : "Cancel·la la resposta",
"Reply" : "Respon",
"Update" : "Actualitza",
"Write a description …" : "Escriviu una descripció …",
"Description" : "Descripció",
"(Unsaved)" : "(No desat)",
"(Saving…)" : "(Desant…)",
"Formatting help" : "Format d'ajuda",
"Edit description" : "Edició descripció",
"Edit description" : "Edita descripció",
"View description" : "Veure descripció",
"Add Attachment" : "Afegeix un adjunt",
"Write a description …" : "Escriviu una descripció...",
"Choose attachment" : "Triar adjunt",
"Select Date" : "Selecciona la data",
"Later today {timeLocale}" : "Avui més tard: {timeLocale}",
"Set due date for later today" : "Estableix una data de caducitat per avui més tard",
"Tomorrow {timeLocale}" : "Demà: {timeLocale}",
"Set due date for tomorrow" : "Estableix data de caducitat per a demà",
"This weekend {timeLocale}" : "Aquest cap de setmana: {timeLocale}",
"Set due date for this weekend" : "Estableix una data de caducitat per aquest cap de setmana",
"Next week {timeLocale}" : "La setmana següent: {timeLocale}",
"Set due date for next week" : "Estableix una data de caducitat per a la setmana vinent",
"Assign a due date to this card…" : "Assigna una data de caducitat a aquesta targeta…",
"Set a due date" : "Definir una data de caducitat",
"Add due date" : "Afegeix una data de caducitat",
"Choose a date" : "Trieu una data",
"Remove due date" : "Suprimeix la data de caducitat",
"Mark as done" : "Marcat com a fet",
"Due at:" : "Venciment a:",
"Not done" : "No s'ha fet",
"Unarchive card" : "Desarxiva targeta",
"Archive card" : "Arxiva la targeta",
"Assign a tag to this card…" : "Assignació d'una etiqueta a aquesta targeta…",
"Select or create a tag…" : "Seleccioneu o creeu una etiqueta…",
"Create a new tag:" : "Crea una etiqueta nova:",
"(group)" : "(grup)",
"{count} comments, {unread} unread" : "{count} comentaris, {unread} no llegits",
"Todo items" : "Tasques pendents",
"Edit card title" : "Edició del títol de la targeta",
"Open link" : "Obre l'enllaç",
"Card deleted" : "Targeta suprimida",
"Edit title" : "Edició del títol",
"Assign to me" : "Assigna'm a mi",
"Unassign myself" : "Desasignar a mi mateix",
"Mark as not done" : "Marca com no fet",
"Move card" : "Mou la targeta",
"Unarchive card" : "Desarxiva targeta",
"Archive card" : "Arxiva la targeta",
"Delete card" : "Suprimeix targeta",
"Move card to another board" : "Mou la targeta a un altre tauler",
"Card deleted" : "Targeta suprimida",
"seconds ago" : "fa uns segons",
"Keyboard shortcuts" : "Dreceres de teclat",
"Boost your productivity using Deck with keyboard shortcuts." : "Augmenta la teva productivitat amb Targetes fent servir tecles de drecera.",
"Board actions" : "Accions de Tauler",
"Keyboard shortcut" : "Drecera de teclat",
"Action" : "Acció",
"Shift" : "Maj",
"Scroll" : "Desplaçament",
"Scroll sideways" : "Desplaçament de costat",
"Navigate between cards" : "Navega entre les targetes",
"Esc" : "Esc",
"Close card details" : "Tanca els detalls de la targeta",
"Ctrl" : "Ctrl",
"Search" : "Cercar",
"Show card filters" : "Mostra els filtres de la targeta",
"Clear card filters" : "Esborra els filtres de la targeta",
"Show help dialog" : "Mostra el diàleg d'ajuda",
"Card actions" : "Accions de la targeta",
"The following actions can be triggered on the currently highlighted card" : "Les accions següents es poden activar a la targeta actualitzada",
"Enter" : "Retorn",
"Space" : "Espai",
"Open card details" : "Obre els detalls de la targeta",
"Edit the card title" : "Edició del títol de la targeta",
"Assign yourself to the current card" : "Assigneu-vos a la targeta actual",
"Archive/unarchive the current card" : "Arxiva/desarxiva la targeta actual",
"Mark card as completed/not completed" : "Marca la targeta com a completada/no completada",
"Open card menu" : "Obre el menú de la targeta",
"All boards" : "Tots els taulers",
"Archived boards" : "Taulers arxivats",
"Shared with you" : "Us han compartit",
"Deck settings" : "Paràmetres de Targetes",
"Use bigger card view" : "Utilitza la visualització de targetes més gran",
"Show card ID badge" : "Mostra el distintiu dID de la targeta",
"Show boards in calendar/tasks" : "Mostra els taulers al calendari/tasques",
"Limit board creation to some groups" : "Limiteu la creació de taulers a alguns grups",
"Users outside of those groups will not be able to create their own boards, but will still be able to work on boards that have been shared with them." : "Els usuaris fora d'aquests grups no podran crear els seus propis taulers, però encara podran treballar en taulers que s'hagin compartit amb ells.",
"Cancel edit" : "Cancel·la l'edició",
"Save board" : "Guarda el tauler",
"Board {0} deleted" : "Sha suprimit el tauler {0}",
"All cards" : "Totes les targetes",
"Only assigned cards" : "Només les targetes assignades",
"No reminder" : "Sense recordatoris",
"An error occurred" : "S'ha produït un error",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Esteu segur que voleu suprimir el tauler {title}? Això suprimirà totes les dades d'aquest tauler, incloses les targetes arxivades.",
"Delete the board?" : "Voleu suprimir el tauler?",
"Board details" : "Detalls del tauler",
"Limit deck usage of groups" : "Limitar l'ús del tauler de grups",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells.",
"Board details" : "Detalls de la junta",
"Edit board" : "Edita el tauler",
"Clone board" : "Clonar tauler",
"Unarchive board" : "Desarxiva el tauler",
"Archive board" : "Arxiva el tauler",
"Export board" : "Exportació de tauler",
"Turn on due date reminders" : "Activa els recordatoris de data de venciment",
"Turn off due date reminders" : "Desactiva els recordatoris de data de venciment",
"Due date reminders" : "Recordatoris de data de venciment",
"All cards" : "Totes les targetes",
"Assigned cards" : "Targetes assignades",
"No notifications" : "No hi ha notificacions",
"Delete board" : "Suprimeix el tauler",
"Clone {boardTitle}" : "Clonar {boardTitle}",
"Clone cards" : "Clonar targetes",
"Clone assignments" : "Clonar les tasques",
"Clone labels" : "Clonar etiquetes",
"Clone due dates" : "Clonar les dates de caducitat",
"Advanced options" : "Opcions avançades",
"Move all cards to the first list" : "Mou totes les targetes a la primera llista",
"Restore archived cards" : "Restaura les targetes arxivades",
"Clone" : "Clonar",
"Export as CSV" : "Exporta a CSV",
"Export" : "Exporta",
"Board {0} deleted" : "Sha suprimit el tauler {0}",
"Only assigned cards" : "Només les targetes assignades",
"No reminder" : "Sense recordatoris",
"An error occurred" : "S'ha produït un error",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Esteu segur que voleu suprimir el tauler {title}? Això eliminarà totes les dades d'aquest tauler.",
"Delete the board?" : "Voleu suprimir el tauler?",
"Loading filtered view" : "S'està carregant la visualització filtrada",
"Today" : "Avui",
"Tomorrow" : "Demà",
"This week" : "Aquesta setmana",
"No due" : "Sense venciment",
"Search for {searchQuery} in all boards" : "Busca {searchQuery} a tots els taulers",
"No results found" : "No s'han trobat resultats",
"Deck board {name}\n* Last modified on {lastMod}" : "Tauler de piles {name}\n* Última modificació el dia {lastMod}",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Creat el {created}\n* Última modificació el dia {lastMod}\n* {nbAttachments} fitxers adjunts\n* {nbComments} comentaris",
"{nbCards} cards" : "{nbCards} targetes",
"Due on {date}" : "Venciment el dia {date}",
"{stack} in {board}" : "{stack} a {board}",
"Click to expand description" : "Feu clic per ampliar la descripció",
"Click to expand comment" : "Feu clic per ampliar el comentari",
"Create card" : "Crea una targeta",
"Create a new card" : "Crea una nova targeta",
"Card title" : "Títol de la targeta",
"Creating the new card …" : "Creant la nova targeta …",
"Card \"{card}\" was added to \"{board}\"" : "La targeta \"{card}\" s'ha afegit a \"{board}\"",
"Open card" : "Obre la targeta",
"Close" : "Tanca",
"No upcoming cards" : "No hi ha pròximes targetes",
"upcoming cards today" : "properes targetes avui",
"upcoming cards tomorrow" : "properes targetes demà",
"upcoming cards" : "pròximes targetes",
"New card" : "Nova targeta",
"Link to a board" : "Enllaça a un tauler",
"Link to a card" : "Enllaç una targeta",
"Create a card" : "Crea una targeta",
"Message from {author} in {conversationName}" : "Missatge de {author} a {conversationName}",
"Something went wrong" : "Alguna cosa ha anat malament",
"Failed to upload {name}" : "No s'ha pogut pujar {name}",
"Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}",
"Due date" : "Data de caducitat",
"Error creating the share" : "S'ha produït un error en crear la compartició",
"Share with a Deck card" : "Compartir amb una targeta de Deck",
"Share {file} with a Deck card" : "Compartir {file} amb una targeta de Deck",
"Share" : "Compartir",
"Personal" : "Personal",
"To do" : "Pendent",
"Doing" : "En procés",
"Example Task 3" : "Tasca d'exemple 3",
"Example Task 2" : "Tasca d'exemple 2",
"Example Task 1" : "Tasca d'exemple 1",
"Move card to another board" : "Mou la targeta a un altre tauler",
"Filter by completed" : "Filtra per completat"
"Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View File

@@ -13,8 +13,8 @@ OC.L10N.register(
"{user} has removed {acl} from the board {board}" : "{user} odebral(a) {acl} z tabule {board}",
"You have renamed the board {before} to {board}" : "Přejmenovali jste tabuli {before} na {board}",
"{user} has renamed the board {before} to {board}" : "{user} přejmenoval(a) tabuli {before} na {board}",
"You have archived the board {board}" : "Archivovali jste tabuli {board}",
"{user} has archived the board {before}" : "{user} archivoval(a) tabuli {before}",
"You have archived the board {board}" : "Zaarchivovali jste tabuli {board}",
"{user} has archived the board {before}" : "{user} zaarchivoval(a) tabuli {before}",
"You have unarchived the board {board}" : "Vrátili jste zpět z archivace tabuli {board}",
"{user} has unarchived the board {before}" : "{user} vrátil(a) tabuli {before} zpět z archivace",
"You have created a new list {stack} on board {board}" : "Vytvořili jste nový sloupec {stack} na tabuli {board}",
@@ -33,14 +33,10 @@ OC.L10N.register(
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} přidal(a) popis ke kartě {card} ve sloupci {stack} na tabuli {board}",
"You have updated the description of card {card} in list {stack} on board {board}" : "Aktualizovali jste popis karty {card} ve sloupci {stack} na tabuli {board}",
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} aktualizoval(a) popis karty {card} ve sloupci {stack} na tabuli {board}",
"You have archived card {card} in list {stack} on board {board}" : "Archivovali kartu {card} ve sloupci {stack} na tabuli {board}",
"{user} has archived card {card} in list {stack} on board {board}" : "{user} archivoval(a) kartu {card} ve sloupci {stack} na tabuli {board}",
"You have archived card {card} in list {stack} on board {board}" : "Zaarchivovali kartu {card} ve sloupci {stack} na tabuli {board}",
"{user} has archived card {card} in list {stack} on board {board}" : "{user} zaarchivoval(a) kartu {card} ve sloupci {stack} na tabuli {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "Zrušili jste archivacii karty {card} ve sloupci {stack} na tabuli {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} zrušil(a) archivaci karty {card} ve sloupci {stack} na tabuli {board}",
"You have marked the card {card} as done in list {stack} on board {board}" : "Označili jste kartu {card} jako splněnou v seznamu {stack} na tabuli {board}",
"{user} has marked card {card} as done in list {stack} on board {board}" : "{user} označil(a) {card} jako splněnou {stack} na tabuli {board}",
"You have marked the card {card} as undone in list {stack} on board {board}" : "Zrušili jste označení karty {card} jako splněné v seznamu {stack} na tabuli {board}",
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user} zrušil(a) označení {card} jako splněné {stack} na tabuli {board}",
"You have removed the due date of card {card}" : "Odebrali jste termín u karty {card}",
"{user} has removed the due date of card {card}" : "{user} odebral(a) termín u karty {card}",
"You have set the due date of card {card} to {after}" : "Nastavili jste termín u karty {card} na {after}",
@@ -67,11 +63,34 @@ OC.L10N.register(
"{user} has restored the attachment {attachment} to card {card}" : "{user} obnovil(a) přílohu {attachment} ke kartě {card}",
"You have commented on card {card}" : "Přidali jste komentář na kartě {card}",
"{user} has commented on card {card}" : "{user} přidal(a) komentář na kartě {card}",
"A <strong>card description</strong> inside the Deck app has been changed" : "<strong>Popis karty</strong> v aplikaci Deck byl změněn",
"Deck" : "Deck",
"Changes in the <strong>Deck app</strong>" : "Změny v <strong>aplikaci Deck</strong>",
"A <strong>board, list or card</strong> was changed" : "<strong>tabule, seznam nebo karta</strong> byla změněna",
"A <strong>comment</strong> was created on a card" : "Na kartě byl vytvořen <strong>komentář</strong>",
"A <strong>card description</strong> has been changed" : "<strong>Popis karty</strong> byl změněn",
"Upcoming cards" : "Nadcházející karty",
"Personal" : "Osobní",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Kartu „%s“ na „%s“ vám přiřadil(a) %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} vám přiřadil(a) kartu {deck-card} na tabuli {deck-board}.",
"The card \"%s\" on \"%s\" has reached its due date." : "U karty „%s“ z tabule „%s“ nastalo plánované datum dokončení.",
"The card {deck-card} on {deck-board} has reached its due date." : "Karta {deck-card} na tabuli {deck-board} dosáhla data plánovaného dokončení.",
"%s has mentioned you in a comment on \"%s\"." : "%s vás zmínil(a) v komentáři k „%s“.",
"{user} has mentioned you in a comment on {deck-card}." : "{user} vás zmínil(a) v komentáři na kartě {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "Uživatel %s vám nasdílel(a) tabuli „%s“.",
"{user} has shared {deck-board} with you." : "{user} vám nasdílel(a) tabuli {deck-board}.",
"Card comments" : "Komentáře v kartách",
"%s on %s" : "%s na %s",
"No data was provided to create an attachment." : "Nebyla poskytnuta žádná data pro vytvoření přílohy.",
"Finished" : "Dokončeno",
"To review" : "K revizi",
"Action needed" : "Nutná akce",
"Later" : "Později",
"copy" : "kopie",
"To do" : "Udělat",
"Doing" : "Provádí se",
"Done" : "Hotovo",
"Example Task 3" : "Třetí úkol pro ukázku",
"Example Task 2" : "Druhý úkol pro ukázku",
"Example Task 1" : "První úkol pro ukázku",
"The file was uploaded" : "Soubor byl nahrán",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Velikost nahrávaného souboru překračuje limit nastavení direktivou upload_max_filesize v php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Nahrávaný soubor přesáhl svou velikostí hodnotu direktivy MAX_FILE_SIZE, určenou v HTML formuláři",
@@ -81,87 +100,44 @@ OC.L10N.register(
"Could not write file to disk" : "Soubor se nedaří se zapsat na úložiště",
"A PHP extension stopped the file upload" : "PHP rozšíření zastavilo nahrávání souboru.",
"No file uploaded or file size exceeds maximum of %s" : "Nebyl nahrán žádný soubor nebo jeho velikost přesáhla %s",
"Invalid file type. Only JSON files are allowed." : "Neplatný typ souboru. Povolené jsou pouze JSON soubory.",
"Invalid JSON data" : "Neplatná JSON data",
"Failed to import board" : "Tabuli se nepodařilo naimportovat",
"Cards due today" : "Karty, kterým končí termín dnes",
"Cards due tomorrow" : "Karty, které mají termín zítra",
"Upcoming cards" : "Nadcházející karty",
"Load more" : "Načíst více",
"Welcome to Nextcloud Deck!" : "Vítejte v Nextcloud Deck!",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Kartu „%s“ na „%s“ vám přiřadil(a) %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} vám přiřadil(a) kartu {deck-card} na tabuli {deck-board}.",
"The card \"%s\" on \"%s\" has reached its due date." : "U karty „%s“ z tabule „%s“ nastalo plánované datum dokončení.",
"The card {deck-card} on {deck-board} has reached its due date." : "Karta {deck-card} na tabuli {deck-board} dosáhla data plánovaného dokončení.",
"%s has mentioned you in a comment on \"%s\"." : "%s vás zmínil(a) v komentáři k „%s“.",
"{user} has mentioned you in a comment on {deck-card}." : "{user} vás zmínil(a) v komentáři na kartě {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "Uživatel %s vám nasdílel(a) tabuli „%s“.",
"{user} has shared {deck-board} with you." : "{user} vám nasdílel(a) tabuli {deck-board}.",
"Deck board" : "Tabule aplikace Deck",
"Owned by %1$s" : "Vlastní %1$s",
"Deck boards, cards and comments" : "Tabule, karty a komentáře aplikace Deck",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "Od %1$s, v %2$s/%3$s, vlastní %4$s",
"Create a new deck card" : "Vytvořit novou kartu v Deck",
"Card comments" : "Komentáře v kartách",
"%s on %s" : "%s na %s",
"Deck boards and cards" : "Tabule a karty aplikace Deck",
"No data was provided to create an attachment." : "Nebyla poskytnuta žádná data pro vytvoření přílohy.",
"Finished" : "Dokončeno",
"To review" : "K revizi",
"Action needed" : "Nutná akce",
"Later" : "Později",
"copy" : "kopie",
"Read more inside" : "Více se dočtete uvnitř",
"Custom lists - click to rename!" : "Uživatelsky určené seznamy kliknutím přejmenujte!",
"To Do" : "Úkoly",
"In Progress" : "Probíhá",
"Done" : "Hotovo",
"1. Open to learn more about boards and cards" : "1. Otevřete a zjistěte víc o tabulích a kartách",
"2. Drag cards left and right, up and down" : "2. Přetahujte karty doleva a doprava, nahoru a dolů",
"3. Apply rich formatting and link content" : "3. Uplatnit formátování a obsah odkazu",
"4. Share, comment and collaborate!" : "4. Sdílejte, komentujte a spolupracujte!",
"Create your first card!" : "Vytvořte svou první kartu!",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Tento komentář je delší než %s znaků.\nPřidán jako příloha ke kartě nazvané %s.\nDostupné na URL: %s.",
"Card not found" : "Karta nebyla nalezena",
"Path is already shared with this card" : "Popis umístění už je touto kartou sdíleno",
"Path is already shared with this card" : "Cesta je již s touto kartou sdílena",
"Invalid date, date format must be YYYY-MM-DD" : "Neplatné datum je třeba, aby formát data byl RRRR-MM-DD",
"Personal planning and team project organization" : "Osobní plánování a organizování týmového projektu",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck je nástroj cílený na osobní nebo projektové plánování týmů v Kanban stylu, napojedo Nextcloud.\n\n\n- 📥 Zadávejte a uspořádávejte své úkoly do karet\n- 📄 Zapisujte si dodatečné poznámky (v Markdown) \n- 🔖 Přiřazujte štítky pro ještě lepší uspořádání\n- 👥 Sdílejte se svým týmem, přáteli nebo rodinou\n- 📎 Připojte soubory a vložte je do (Markdown) popisu \n- 💬 Diskutujte se svým týmem prostřednictvím komentářů\n- ⚡ Udržte si přehled o změnách prostřednictvím sledování proudu aktivit\n- 🚀 Dostaňte svůj projekt pod kontrolu",
"Add board" : "Přidat tabuli",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck je nástroj cílený na osobní nebo projektové plánování týmů v Kanban stylu, vestavěv Nextcloud.\n\n\n- 📥 Zadávejte a uspořádávejte své úkoly do karet\n- 📄 Zapisujte si dodatečné poznámky \n- 🔖 Přiřazujte štítky pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přáteli nebo rodinou\n- 🚀 Dostaňte svůj projekt pod kontrolu",
"Card details" : "Podrobnosti o kartě",
"Add board" : "Přidat tabuli",
"Select the board to link to a project" : "Vyberte tabuli kterou propojit s projektem",
"Search by board title" : "Hledat podle názvu tabule",
"Select board" : "Vybrat tabuli",
"Move/copy card" : "Přesunout/zkopírovat kartu",
"Create a new card" : "Vytvořit novou kartu",
"Select a board" : "Vybrat tabuli",
"No lists available" : "Nejsou k dispozici žádné seznamy",
"Select a list" : "Vyberte sloupec",
"Move card" : "Přesunout kartu",
"Copy card" : "Zkopírovat kartu",
"Card title" : "Název karty",
"Cancel" : "Storno",
"Creating the new card …" : "Vytváření nové karty…",
"Card \"{card}\" was added to \"{board}\"" : "Karta „{card}“ byla přidána na „{board}“",
"Open card" : "Otevřít kartu",
"Close" : "Zavřít",
"Create card" : "Vytvořit kartu",
"Select a card" : "Vybrat kartu",
"Select the card to link to a project" : "Vyberte kartu kterou propojit s projektem",
"Link to card" : "Propojit s kartou",
"Select a card" : "Vybrat kartu",
"Cancel" : "Storno",
"This board is read only" : "Tato tabule je pouze pro čtení",
"Drop your files to upload" : "Přetáhněte sem soubory, které chcete nahrát",
"File already exists" : "Soubor už existuje",
"A file with the name {filename} already exists." : "Soubor nazvaný {filename} už existuje.",
"Do you want to overwrite it?" : "Chcete položku přepsat?",
"Overwrite file" : "Přepsat soubor",
"Keep existing file" : "Ponechat existující soubor",
"This board is read only" : "Tato tabule je pouze pro čtení",
"Drop your files to upload" : "Přetáhněte sem soubory, které chcete nahrát",
"Add card" : "Přidat kartu",
"Archived cards" : "Archivované karty",
"Add list" : "Přidat seznam",
"List name" : "Název seznamu",
"Active filters" : "Zapnuté filtry",
"Apply filter" : "Uplatnit filtr",
"Filter by tag" : "Filtrovat podle štítku",
"Filter by tag" : "Filtrovat podle příznaků",
"Filter by assigned user" : "Filtrovat podle uživatele, který je úkolem pověřen",
"Unassigned" : "Nepřiřazeno",
"Filter by status" : "Filtrovat podle stavu",
"Open and completed" : "Otevřít a dokončeno",
"Open" : "Otevřít",
"Completed" : "Dokončeno",
"Filter by due date" : "Filtrovat podle termínu",
"Overdue" : "Po termínu",
"Next 24 hours" : "Následujících 24 hodin",
@@ -169,89 +145,77 @@ OC.L10N.register(
"Next 30 days" : "Příštích 30 dnů",
"No due date" : "Žádný termín",
"Clear filter" : "Vyčistit filtr",
"View Modes" : "Zobrazit režimy",
"Toggle View Modes" : "Přepnout mezi režimy zobrazení",
"Hide archived cards" : "Skrýt archivované karty",
"Show archived cards" : "Zobrazit archivované karty",
"Toggle compact mode" : "Vyp/zap. kompaktní režim",
"Hide card cover images" : "Skrýt obrázky přebalu karet",
"Show card cover images" : "Zobrazit obrázky přebalu karet",
"Open details" : "Otevřít podrobnosti",
"Details" : "Podrobnosti",
"Currently present people" : "Nyní přítomní lidé",
"Loading board" : "Načítání tabule",
"Board not found" : "Tabule nenalezena",
"No lists available" : "Nejsou k dispozici žádné seznamy",
"Create a new list to add cards to this board" : "Pro přidání karet na tuto tabuli vytvořte nový seznam",
"Board not found" : "Tabule nenalezena",
"Sharing" : "Sdílení",
"Tags" : "Štítky",
"Deleted items" : "Smazané položky",
"Activity" : "Aktivita",
"Timeline" : "Časová osa",
"Deleted lists" : "Smazané seznamy",
"Undo" : "Vrátit zpět",
"Deleted cards" : "Smazané karty",
"Failed to create share with {displayName}" : "Nepodařilo se vytvořit sdílení s {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "Opravdu chcete předat vlastnictví tabule {title} uživateli {user}?",
"Transfer the board." : "Předat vlastnictví tabule.",
"Transfer" : "Předat vlastnictví",
"The board has been transferred to {user}" : "Vlastnictví tabule bylo předáno uživateli {user}",
"Failed to transfer the board to {user}" : "Nepodařilo se předat vlastnictví tabule uživateli {user}",
"Share board with a user, group or team …" : "Sdílet tabuli s uživatelem, skupinou nebo týmem…",
"Searching for users, groups and teams …" : "Hledání v uživatelích, skupinách a týmech…",
"Share board with a user, group or circle …" : "Sdílet tabuli s uživatelem, skupinou nebo okruhem…",
"Searching for users, groups and circles …" : "Hledání v uživatelích, skupinách a okruzích…",
"No participants found" : "Nenalezeni žádní účastníci",
"Board owner" : "Vlastník tabule",
"(Group)" : "(Skupina)",
"(Team)" : "(Tým)",
"(Circle)" : "(Okruh)",
"Can edit" : "Může upravovat",
"Can share" : "Může sdílet",
"Can manage" : "Může spravovat",
"Owner" : "Vlastník",
"Delete" : "Smazat",
"List deleted" : "Seznam smazán",
"Edit list title" : "Upravit nadpis seznamu",
"Failed to create share with {displayName}" : "Nepodařilo se vytvořit sdílení s {displayName}",
"Add a new list" : "Přidat nový sloupec",
"Archive all cards" : "Archivovat všechny karty",
"Unarchive all cards" : "Zrušit archivaci všech karet",
"Delete list" : "Smazat seznam",
"Archive all cards in this list" : "Archivovat všechny karty v tomto seznamu",
"Unarchive all cards in this list" : "Zrušit archivaci všech karet v tomto seznamu",
"Add a new card" : "Přidat novou kartu",
"Card name" : "Název karty",
"title and color value must be provided" : "je třeba zadat nadpis a zvolit barvu",
"List deleted" : "Seznam smazán",
"Edit" : "Upravit",
"Add a new tag" : "Přidat nový štítek",
"title and color value must be provided" : "je třeba zadat nadpis a zvolit barvu",
"Board name" : "Název tabule",
"Members" : "Členové",
"Assign to users/groups/team" : "Přiřadit uživatelům/skupinám/týmům",
"Assign a user to this card…" : "Přiřadit uživatele k této kartě…",
"Select a user to assign to this card…" : "Vyberte uživatele, kterému tuto kartu přiřadit…",
"File to share" : "Soubor ke sdílení",
"Invalid path selected" : "Je vybrán neplatný popis umístění",
"Upload new files" : "Nahrát nové soubory",
"Share from Files" : "Sdílet ze Souborů",
"Pending share" : "Čekající sdílení",
"Add this attachment" : "Přidat tuto přílohu",
"Show in Files" : "Zobrazit v Souborech",
"Download" : "Stáhnout",
"Remove attachment" : "Odebrat přílohu",
"Unshare file" : "Přestat sdílet soubor",
"Delete Attachment" : "Smazat přílohu",
"Restore Attachment" : "Obnovit přílohu",
"Modified" : "Změněno",
"Created" : "Vytvořeno",
"The title cannot be empty." : "Nadpis je třeba vyplnit.",
"File to share" : "Soubor ke sdílení",
"Invalid path selected" : "Je vybrán neplatný popis umístění",
"Open in sidebar view" : "Otevřít v zobrazení v postranním panelu",
"Open in bigger view" : "Otevřít ve větším zobrazení",
"Attachments" : "Přílohy",
"Comments" : "Komentáře",
"Failed to load comments" : "Načtení komentářů se nezdařilo",
"Modified" : "Změněno",
"Created" : "Vytvořeno",
"The title cannot be empty." : "Nadpis je třeba vyplnit.",
"No comments yet. Begin the discussion!" : "Zatím bez komentářů. Zahajte diskuzi!",
"Failed to load comments" : "Načtení komentářů se nezdařilo",
"Assign a tag to this card…" : "Přiřadit této kartě štítek…",
"Assign to users" : "Přiřadit k uživatelům",
"Assign to users/groups/circles" : "Přiřadit uživatelům/skupinám/okruhům",
"Assign a user to this card…" : "Přiřadit uživatele k této kartě…",
"Due date" : "Termín",
"Set a due date" : "Vybrat termín",
"Remove due date" : "Odstranit termín",
"Select Date" : "Vybrat datum",
"Save" : "Uložit",
"The comment cannot be empty." : "Komentář je třeba vyplnit.",
"The comment cannot be longer than 1000 characters." : "Délka komentáře může být nejvýše 1 000 znaků.",
"Save" : "Uložit",
"Created:" : "Vytvořeno:",
"In reply to" : "V odpověď na",
"Cancel reply" : "Zrušit odpověď",
"Reply" : "Odpovědět",
"Update" : "Aktualizovat",
"Write a description …" : "Zadejte popis…",
"Description" : "Popis",
"(Unsaved)" : "(Neuloženo)",
"(Saving…)" : "(Ukládání…)",
@@ -259,140 +223,53 @@ OC.L10N.register(
"Edit description" : "Upravit popis",
"View description" : "Zobrazit popis",
"Add Attachment" : "Přidat přílohu",
"Write a description …" : "Zadejte popis…",
"Choose attachment" : "Zvolte přílohu",
"Select Date" : "Vybrat datum",
"Later today {timeLocale}" : "Později dnes {timeLocale}",
"Set due date for later today" : "Nastavit termín na dnešek",
"Tomorrow {timeLocale}" : "Zítra {timeLocale}",
"Set due date for tomorrow" : "Nastavit termín na zítřek",
"This weekend {timeLocale}" : "Tento víkend {timeLocale}",
"Set due date for this weekend" : "Nastavit termín na tento týden",
"Next week {timeLocale}" : "Příští týden {timeLocale}",
"Set due date for next week" : "Nastavit termín na příští týden",
"Assign a due date to this card…" : "Přiradit této kartě termín…",
"Set a due date" : "Vybrat termín",
"Add due date" : "Přidat termín",
"Choose a date" : "Zvolit datum",
"Remove due date" : "Odstranit termín",
"Mark as done" : "Označit jako hotové",
"Due at:" : "Termín v:",
"Not done" : "Nehotové",
"Unarchive card" : "Zrušit archivaci karty",
"Archive card" : "Archivovat kartu",
"Assign a tag to this card…" : "Přiřadit této kartě štítek…",
"Select or create a tag…" : "Vyberte nebo vytvořte štítek…",
"Create a new tag:" : "Vytvořit nový štítek:",
"(group)" : "(skupina)",
"{count} comments, {unread} unread" : "{count} komentářů, {unread} nepřečtených",
"Todo items" : "Položky k udělání",
"Edit card title" : "Upravit nadpis karty",
"Open link" : "Otevřít okaz",
"Card deleted" : "Karta smazána",
"Edit title" : "Upravit nadpis",
"Assign to me" : "Přiřadit mě",
"Unassign myself" : "Zrušit přiřazení sobě",
"Mark as not done" : "Označit jako nehotové",
"Move card" : "Přesunout kartu",
"Unarchive card" : "Zrušit archivaci karty",
"Archive card" : "Archivovat kartu",
"Delete card" : "Smazat kartu",
"Move card to another board" : "Přesunout kartu na jinou tabuli",
"Card deleted" : "Karta smazána",
"seconds ago" : "před několika sekundami",
"Keyboard shortcuts" : "Klávesové zkratky",
"Boost your productivity using Deck with keyboard shortcuts." : "Zvyšte svou produktivitu tím, že budete v Deck používat klávesové zkratky.",
"Board actions" : "Akce ohledně tabule",
"Keyboard shortcut" : "Klávesová zkratka",
"Action" : "Akce",
"Shift" : "Shift",
"Scroll" : "Posunout",
"Scroll sideways" : "Posunout na strany",
"Navigate between cards" : "Pohyb mezi kartami",
"Esc" : "Esc",
"Close card details" : "Zavřít podrobnosti o kartě",
"Ctrl" : "Ctrl",
"Search" : "Hledat",
"Show card filters" : "Zobrazit filtry karty",
"Clear card filters" : "Vyčistit filtry karty",
"Show help dialog" : "Zobrazit dialog nápovědy",
"Card actions" : "Akce ohledně karty",
"The following actions can be triggered on the currently highlighted card" : "Na právě zvýrazněné kartě je možné spustit následující akce",
"Enter" : "Konec řádku",
"Space" : "Mezera",
"Open card details" : "Otevřít podrobnosti o kartě",
"Edit the card title" : "Upravit nadpis karty",
"Assign yourself to the current card" : "Přiřadit stávající kartu sobě",
"Archive/unarchive the current card" : "Archivovat / zrušit archivaci stávající karty",
"Mark card as completed/not completed" : "Označit kartu jako (ne)dokončenou",
"Open card menu" : "Otevřít nabídku karty",
"All boards" : "Všechny tabule",
"Archived boards" : "Archivované tabule",
"Shared with you" : "Sdíleno s vámi",
"Deck settings" : "Nastavení pro Deck",
"Use bigger card view" : "Použít větší zobrazení karet",
"Show card ID badge" : "Zobrazit odznáček s identifikátorem karty",
"Show boards in calendar/tasks" : "Zobrazit tabule v kalendáři/úkolech",
"Limit board creation to some groups" : "Umožnit vytváření tabulí pouze vybraným skupinám",
"Users outside of those groups will not be able to create their own boards, but will still be able to work on boards that have been shared with them." : "Uživatelé, kteří nejsou členy těchto skupin nebudou moci vytvářet své vlastní tabule, ale pořád budou moci pracovat na tabulích, které jim byly nasdíleny.",
"Cancel edit" : "Zrušit úpravu",
"Save board" : "Uložit tabuli",
"Board {0} deleted" : "Tabule {0} smazána",
"All cards" : "Všechny karty",
"Only assigned cards" : "Pouze přiřazené karty",
"No reminder" : "Bez připomínky",
"An error occurred" : "Došlo k chybě",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Opravdu chcete tabuli {title} smazat? Toto smaže veškerá data této tabule, včetně archivovaných karet.",
"Delete the board?" : "Smazat tabuli?",
"Exporting board..." : "Exportování tabule…",
"Limit deck usage of groups" : "Omezit využití deck na skupiny",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Omezení nastavené pro Deck brání uživatelům, kteří nejsou součástí těchto skupin, ve vytváře vlastních tabulí. Nicméně i tak ale pořád budou moci pracovat na tabulích, které jsou jim nasdíleny.",
"Board details" : "Podrobnosti o tabuli",
"Edit board" : "Upravit tabuli",
"Clone board" : "Klonovat tabuli",
"Unarchive board" : "Vrátit tabuli zpět z archivu",
"Archive board" : "Archivovat tabuli",
"Export board" : "Exportovat tabuli",
"Turn on due date reminders" : "Zapnout upomínky termínů",
"Turn off due date reminders" : "Vypnout upomínky termínů",
"Due date reminders" : "Upomínky termínů",
"All cards" : "Všechny karty",
"Assigned cards" : "Přiřazené karty",
"No notifications" : "Žádná upozornění",
"Delete board" : "Smazat tabuli",
"Importing board..." : "Importování tabule…",
"Board imported successfully" : "Tabule úspěšně naimportována",
"Import board" : "Naimportovat tabuli",
"Clone {boardTitle}" : "Naklonovat {boardTitle}",
"Clone cards" : "Klonovat karty",
"Clone assignments" : "Přiřazení klonu",
"Clone labels" : "Popisky klonu",
"Clone due dates" : "Termíny klonu",
"Advanced options" : "Pokročilé předvolby",
"Move all cards to the first list" : "Přesunout všechny karty na první seznam",
"Restore archived cards" : "Obnovit archivované karty",
"Clone" : "Klonovat",
"Export {boardTitle}" : "Exportovat {boardTitle}",
"Export as JSON" : "Exportovat jako JSON",
"Export as CSV" : "Exportovat jako CSV",
"Note: Only the JSON format is supported for importing back into the Deck app." : "Pozn.: Pro import zpět do aplikace Deck je podporován pouze formát JSON.",
"Export" : "Exportovat",
"Board {0} deleted" : "Tabule {0} smazána",
"Only assigned cards" : "Pouze přiřazené karty",
"No reminder" : "Bez připomínky",
"An error occurred" : "Došlo k chybě",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Opravdu chcete tabuly {title} smazat? Toto smaže veškerá data této tabule.",
"Delete the board?" : "Smazat tabuli?",
"Loading filtered view" : "Načítání filtrovaného pohledu",
"Today" : "Dnes",
"Tomorrow" : "Zítra",
"This week" : "Tento týden",
"No due" : "Žádný termín",
"Search for {searchQuery} in all boards" : "Hledat {searchQuery} na všech tabulích",
"No results found" : "Nenalezeny žádné výsledky",
"Deck board {name}\n* Last modified on {lastMod}" : "Deck karta {name}\n* Naposledy změněno {lastMod}",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Vytvořeno {created}\n* Naposledy upraveno {lastMod}\n* {nbAttachments} příloh\n* {nbComments} komentářů",
"{nbCards} cards" : "{nbCards} karet",
"Due on {date}" : "Termín {date}",
"{stack} in {board}" : "{stack} v {board}",
"Click to expand description" : "Popis rozbalíte kliknutím",
"Click to expand comment" : "Komentář rozbalíte kliknutím",
"Create card" : "Vytvořit kartu",
"Create a new card" : "Vytvořit novou kartu",
"Card title" : "Název karty",
"Creating the new card …" : "Vytváření nové karty…",
"Card \"{card}\" was added to \"{board}\"" : "Karta „{card}“ byla přidána na „{board}“",
"Open card" : "Otevřít kartu",
"Close" : "Zavřít",
"No upcoming cards" : "Žádné nadcházející karty",
"upcoming cards today" : "nadcházející karty na dnešek",
"upcoming cards tomorrow" : "nadcházející karty na zítřek",
"upcoming cards" : "nadcházející karty",
"New card" : "Nová karta",
"Link to a board" : "Propojit s tabulí",
"Link to a card" : "Propojit s kartou",
"Create a card" : "Vytvořit kartu",
@@ -400,19 +277,9 @@ OC.L10N.register(
"Something went wrong" : "Něco se pokazilo",
"Failed to upload {name}" : "Nepodařilo se nahrát {name}",
"Maximum file size of {size} exceeded" : "Překročena nejvyšší umožněná velikost souboru {size}",
"Assigned users" : "Přiřazení uživatelé",
"Due date" : "Datum termínu",
"Error creating the share" : "Chyba při vytváření sdílení",
"Share with a Deck card" : "Sdílet s kartou aplikace Deck",
"Share {file} with a Deck card" : "Sdílet {file} s kartou aplikace Deck",
"Share" : "Sdílet",
"Personal" : "Osobní",
"To do" : "Zbývá udělat",
"Doing" : "Provádí se",
"Example Task 3" : "Třetí úkol pro ukázku",
"Example Task 2" : "Druhý úkol pro ukázku",
"Example Task 1" : "První úkol pro ukázku",
"Move card to another board" : "Přesunout kartu na jinou tabuli",
"Filter by completed" : "Filtrovat podle dokončených"
"Share" : "Sdílet"
},
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;");

View File

@@ -11,8 +11,8 @@
"{user} has removed {acl} from the board {board}" : "{user} odebral(a) {acl} z tabule {board}",
"You have renamed the board {before} to {board}" : "Přejmenovali jste tabuli {before} na {board}",
"{user} has renamed the board {before} to {board}" : "{user} přejmenoval(a) tabuli {before} na {board}",
"You have archived the board {board}" : "Archivovali jste tabuli {board}",
"{user} has archived the board {before}" : "{user} archivoval(a) tabuli {before}",
"You have archived the board {board}" : "Zaarchivovali jste tabuli {board}",
"{user} has archived the board {before}" : "{user} zaarchivoval(a) tabuli {before}",
"You have unarchived the board {board}" : "Vrátili jste zpět z archivace tabuli {board}",
"{user} has unarchived the board {before}" : "{user} vrátil(a) tabuli {before} zpět z archivace",
"You have created a new list {stack} on board {board}" : "Vytvořili jste nový sloupec {stack} na tabuli {board}",
@@ -31,14 +31,10 @@
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} přidal(a) popis ke kartě {card} ve sloupci {stack} na tabuli {board}",
"You have updated the description of card {card} in list {stack} on board {board}" : "Aktualizovali jste popis karty {card} ve sloupci {stack} na tabuli {board}",
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} aktualizoval(a) popis karty {card} ve sloupci {stack} na tabuli {board}",
"You have archived card {card} in list {stack} on board {board}" : "Archivovali kartu {card} ve sloupci {stack} na tabuli {board}",
"{user} has archived card {card} in list {stack} on board {board}" : "{user} archivoval(a) kartu {card} ve sloupci {stack} na tabuli {board}",
"You have archived card {card} in list {stack} on board {board}" : "Zaarchivovali kartu {card} ve sloupci {stack} na tabuli {board}",
"{user} has archived card {card} in list {stack} on board {board}" : "{user} zaarchivoval(a) kartu {card} ve sloupci {stack} na tabuli {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "Zrušili jste archivacii karty {card} ve sloupci {stack} na tabuli {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} zrušil(a) archivaci karty {card} ve sloupci {stack} na tabuli {board}",
"You have marked the card {card} as done in list {stack} on board {board}" : "Označili jste kartu {card} jako splněnou v seznamu {stack} na tabuli {board}",
"{user} has marked card {card} as done in list {stack} on board {board}" : "{user} označil(a) {card} jako splněnou {stack} na tabuli {board}",
"You have marked the card {card} as undone in list {stack} on board {board}" : "Zrušili jste označení karty {card} jako splněné v seznamu {stack} na tabuli {board}",
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user} zrušil(a) označení {card} jako splněné {stack} na tabuli {board}",
"You have removed the due date of card {card}" : "Odebrali jste termín u karty {card}",
"{user} has removed the due date of card {card}" : "{user} odebral(a) termín u karty {card}",
"You have set the due date of card {card} to {after}" : "Nastavili jste termín u karty {card} na {after}",
@@ -65,11 +61,34 @@
"{user} has restored the attachment {attachment} to card {card}" : "{user} obnovil(a) přílohu {attachment} ke kartě {card}",
"You have commented on card {card}" : "Přidali jste komentář na kartě {card}",
"{user} has commented on card {card}" : "{user} přidal(a) komentář na kartě {card}",
"A <strong>card description</strong> inside the Deck app has been changed" : "<strong>Popis karty</strong> v aplikaci Deck byl změněn",
"Deck" : "Deck",
"Changes in the <strong>Deck app</strong>" : "Změny v <strong>aplikaci Deck</strong>",
"A <strong>board, list or card</strong> was changed" : "<strong>tabule, seznam nebo karta</strong> byla změněna",
"A <strong>comment</strong> was created on a card" : "Na kartě byl vytvořen <strong>komentář</strong>",
"A <strong>card description</strong> has been changed" : "<strong>Popis karty</strong> byl změněn",
"Upcoming cards" : "Nadcházející karty",
"Personal" : "Osobní",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Kartu „%s“ na „%s“ vám přiřadil(a) %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} vám přiřadil(a) kartu {deck-card} na tabuli {deck-board}.",
"The card \"%s\" on \"%s\" has reached its due date." : "U karty „%s“ z tabule „%s“ nastalo plánované datum dokončení.",
"The card {deck-card} on {deck-board} has reached its due date." : "Karta {deck-card} na tabuli {deck-board} dosáhla data plánovaného dokončení.",
"%s has mentioned you in a comment on \"%s\"." : "%s vás zmínil(a) v komentáři k „%s“.",
"{user} has mentioned you in a comment on {deck-card}." : "{user} vás zmínil(a) v komentáři na kartě {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "Uživatel %s vám nasdílel(a) tabuli „%s“.",
"{user} has shared {deck-board} with you." : "{user} vám nasdílel(a) tabuli {deck-board}.",
"Card comments" : "Komentáře v kartách",
"%s on %s" : "%s na %s",
"No data was provided to create an attachment." : "Nebyla poskytnuta žádná data pro vytvoření přílohy.",
"Finished" : "Dokončeno",
"To review" : "K revizi",
"Action needed" : "Nutná akce",
"Later" : "Později",
"copy" : "kopie",
"To do" : "Udělat",
"Doing" : "Provádí se",
"Done" : "Hotovo",
"Example Task 3" : "Třetí úkol pro ukázku",
"Example Task 2" : "Druhý úkol pro ukázku",
"Example Task 1" : "První úkol pro ukázku",
"The file was uploaded" : "Soubor byl nahrán",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Velikost nahrávaného souboru překračuje limit nastavení direktivou upload_max_filesize v php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Nahrávaný soubor přesáhl svou velikostí hodnotu direktivy MAX_FILE_SIZE, určenou v HTML formuláři",
@@ -79,87 +98,44 @@
"Could not write file to disk" : "Soubor se nedaří se zapsat na úložiště",
"A PHP extension stopped the file upload" : "PHP rozšíření zastavilo nahrávání souboru.",
"No file uploaded or file size exceeds maximum of %s" : "Nebyl nahrán žádný soubor nebo jeho velikost přesáhla %s",
"Invalid file type. Only JSON files are allowed." : "Neplatný typ souboru. Povolené jsou pouze JSON soubory.",
"Invalid JSON data" : "Neplatná JSON data",
"Failed to import board" : "Tabuli se nepodařilo naimportovat",
"Cards due today" : "Karty, kterým končí termín dnes",
"Cards due tomorrow" : "Karty, které mají termín zítra",
"Upcoming cards" : "Nadcházející karty",
"Load more" : "Načíst více",
"Welcome to Nextcloud Deck!" : "Vítejte v Nextcloud Deck!",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Kartu „%s“ na „%s“ vám přiřadil(a) %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} vám přiřadil(a) kartu {deck-card} na tabuli {deck-board}.",
"The card \"%s\" on \"%s\" has reached its due date." : "U karty „%s“ z tabule „%s“ nastalo plánované datum dokončení.",
"The card {deck-card} on {deck-board} has reached its due date." : "Karta {deck-card} na tabuli {deck-board} dosáhla data plánovaného dokončení.",
"%s has mentioned you in a comment on \"%s\"." : "%s vás zmínil(a) v komentáři k „%s“.",
"{user} has mentioned you in a comment on {deck-card}." : "{user} vás zmínil(a) v komentáři na kartě {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "Uživatel %s vám nasdílel(a) tabuli „%s“.",
"{user} has shared {deck-board} with you." : "{user} vám nasdílel(a) tabuli {deck-board}.",
"Deck board" : "Tabule aplikace Deck",
"Owned by %1$s" : "Vlastní %1$s",
"Deck boards, cards and comments" : "Tabule, karty a komentáře aplikace Deck",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "Od %1$s, v %2$s/%3$s, vlastní %4$s",
"Create a new deck card" : "Vytvořit novou kartu v Deck",
"Card comments" : "Komentáře v kartách",
"%s on %s" : "%s na %s",
"Deck boards and cards" : "Tabule a karty aplikace Deck",
"No data was provided to create an attachment." : "Nebyla poskytnuta žádná data pro vytvoření přílohy.",
"Finished" : "Dokončeno",
"To review" : "K revizi",
"Action needed" : "Nutná akce",
"Later" : "Později",
"copy" : "kopie",
"Read more inside" : "Více se dočtete uvnitř",
"Custom lists - click to rename!" : "Uživatelsky určené seznamy kliknutím přejmenujte!",
"To Do" : "Úkoly",
"In Progress" : "Probíhá",
"Done" : "Hotovo",
"1. Open to learn more about boards and cards" : "1. Otevřete a zjistěte víc o tabulích a kartách",
"2. Drag cards left and right, up and down" : "2. Přetahujte karty doleva a doprava, nahoru a dolů",
"3. Apply rich formatting and link content" : "3. Uplatnit formátování a obsah odkazu",
"4. Share, comment and collaborate!" : "4. Sdílejte, komentujte a spolupracujte!",
"Create your first card!" : "Vytvořte svou první kartu!",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Tento komentář je delší než %s znaků.\nPřidán jako příloha ke kartě nazvané %s.\nDostupné na URL: %s.",
"Card not found" : "Karta nebyla nalezena",
"Path is already shared with this card" : "Popis umístění už je touto kartou sdíleno",
"Path is already shared with this card" : "Cesta je již s touto kartou sdílena",
"Invalid date, date format must be YYYY-MM-DD" : "Neplatné datum je třeba, aby formát data byl RRRR-MM-DD",
"Personal planning and team project organization" : "Osobní plánování a organizování týmového projektu",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck je nástroj cílený na osobní nebo projektové plánování týmů v Kanban stylu, napojedo Nextcloud.\n\n\n- 📥 Zadávejte a uspořádávejte své úkoly do karet\n- 📄 Zapisujte si dodatečné poznámky (v Markdown) \n- 🔖 Přiřazujte štítky pro ještě lepší uspořádání\n- 👥 Sdílejte se svým týmem, přáteli nebo rodinou\n- 📎 Připojte soubory a vložte je do (Markdown) popisu \n- 💬 Diskutujte se svým týmem prostřednictvím komentářů\n- ⚡ Udržte si přehled o změnách prostřednictvím sledování proudu aktivit\n- 🚀 Dostaňte svůj projekt pod kontrolu",
"Add board" : "Přidat tabuli",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck je nástroj cílený na osobní nebo projektové plánování týmů v Kanban stylu, vestavěv Nextcloud.\n\n\n- 📥 Zadávejte a uspořádávejte své úkoly do karet\n- 📄 Zapisujte si dodatečné poznámky \n- 🔖 Přiřazujte štítky pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přáteli nebo rodinou\n- 🚀 Dostaňte svůj projekt pod kontrolu",
"Card details" : "Podrobnosti o kartě",
"Add board" : "Přidat tabuli",
"Select the board to link to a project" : "Vyberte tabuli kterou propojit s projektem",
"Search by board title" : "Hledat podle názvu tabule",
"Select board" : "Vybrat tabuli",
"Move/copy card" : "Přesunout/zkopírovat kartu",
"Create a new card" : "Vytvořit novou kartu",
"Select a board" : "Vybrat tabuli",
"No lists available" : "Nejsou k dispozici žádné seznamy",
"Select a list" : "Vyberte sloupec",
"Move card" : "Přesunout kartu",
"Copy card" : "Zkopírovat kartu",
"Card title" : "Název karty",
"Cancel" : "Storno",
"Creating the new card …" : "Vytváření nové karty…",
"Card \"{card}\" was added to \"{board}\"" : "Karta „{card}“ byla přidána na „{board}“",
"Open card" : "Otevřít kartu",
"Close" : "Zavřít",
"Create card" : "Vytvořit kartu",
"Select a card" : "Vybrat kartu",
"Select the card to link to a project" : "Vyberte kartu kterou propojit s projektem",
"Link to card" : "Propojit s kartou",
"Select a card" : "Vybrat kartu",
"Cancel" : "Storno",
"This board is read only" : "Tato tabule je pouze pro čtení",
"Drop your files to upload" : "Přetáhněte sem soubory, které chcete nahrát",
"File already exists" : "Soubor už existuje",
"A file with the name {filename} already exists." : "Soubor nazvaný {filename} už existuje.",
"Do you want to overwrite it?" : "Chcete položku přepsat?",
"Overwrite file" : "Přepsat soubor",
"Keep existing file" : "Ponechat existující soubor",
"This board is read only" : "Tato tabule je pouze pro čtení",
"Drop your files to upload" : "Přetáhněte sem soubory, které chcete nahrát",
"Add card" : "Přidat kartu",
"Archived cards" : "Archivované karty",
"Add list" : "Přidat seznam",
"List name" : "Název seznamu",
"Active filters" : "Zapnuté filtry",
"Apply filter" : "Uplatnit filtr",
"Filter by tag" : "Filtrovat podle štítku",
"Filter by tag" : "Filtrovat podle příznaků",
"Filter by assigned user" : "Filtrovat podle uživatele, který je úkolem pověřen",
"Unassigned" : "Nepřiřazeno",
"Filter by status" : "Filtrovat podle stavu",
"Open and completed" : "Otevřít a dokončeno",
"Open" : "Otevřít",
"Completed" : "Dokončeno",
"Filter by due date" : "Filtrovat podle termínu",
"Overdue" : "Po termínu",
"Next 24 hours" : "Následujících 24 hodin",
@@ -167,89 +143,77 @@
"Next 30 days" : "Příštích 30 dnů",
"No due date" : "Žádný termín",
"Clear filter" : "Vyčistit filtr",
"View Modes" : "Zobrazit režimy",
"Toggle View Modes" : "Přepnout mezi režimy zobrazení",
"Hide archived cards" : "Skrýt archivované karty",
"Show archived cards" : "Zobrazit archivované karty",
"Toggle compact mode" : "Vyp/zap. kompaktní režim",
"Hide card cover images" : "Skrýt obrázky přebalu karet",
"Show card cover images" : "Zobrazit obrázky přebalu karet",
"Open details" : "Otevřít podrobnosti",
"Details" : "Podrobnosti",
"Currently present people" : "Nyní přítomní lidé",
"Loading board" : "Načítání tabule",
"Board not found" : "Tabule nenalezena",
"No lists available" : "Nejsou k dispozici žádné seznamy",
"Create a new list to add cards to this board" : "Pro přidání karet na tuto tabuli vytvořte nový seznam",
"Board not found" : "Tabule nenalezena",
"Sharing" : "Sdílení",
"Tags" : "Štítky",
"Deleted items" : "Smazané položky",
"Activity" : "Aktivita",
"Timeline" : "Časová osa",
"Deleted lists" : "Smazané seznamy",
"Undo" : "Vrátit zpět",
"Deleted cards" : "Smazané karty",
"Failed to create share with {displayName}" : "Nepodařilo se vytvořit sdílení s {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "Opravdu chcete předat vlastnictví tabule {title} uživateli {user}?",
"Transfer the board." : "Předat vlastnictví tabule.",
"Transfer" : "Předat vlastnictví",
"The board has been transferred to {user}" : "Vlastnictví tabule bylo předáno uživateli {user}",
"Failed to transfer the board to {user}" : "Nepodařilo se předat vlastnictví tabule uživateli {user}",
"Share board with a user, group or team …" : "Sdílet tabuli s uživatelem, skupinou nebo týmem…",
"Searching for users, groups and teams …" : "Hledání v uživatelích, skupinách a týmech…",
"Share board with a user, group or circle …" : "Sdílet tabuli s uživatelem, skupinou nebo okruhem…",
"Searching for users, groups and circles …" : "Hledání v uživatelích, skupinách a okruzích…",
"No participants found" : "Nenalezeni žádní účastníci",
"Board owner" : "Vlastník tabule",
"(Group)" : "(Skupina)",
"(Team)" : "(Tým)",
"(Circle)" : "(Okruh)",
"Can edit" : "Může upravovat",
"Can share" : "Může sdílet",
"Can manage" : "Může spravovat",
"Owner" : "Vlastník",
"Delete" : "Smazat",
"List deleted" : "Seznam smazán",
"Edit list title" : "Upravit nadpis seznamu",
"Failed to create share with {displayName}" : "Nepodařilo se vytvořit sdílení s {displayName}",
"Add a new list" : "Přidat nový sloupec",
"Archive all cards" : "Archivovat všechny karty",
"Unarchive all cards" : "Zrušit archivaci všech karet",
"Delete list" : "Smazat seznam",
"Archive all cards in this list" : "Archivovat všechny karty v tomto seznamu",
"Unarchive all cards in this list" : "Zrušit archivaci všech karet v tomto seznamu",
"Add a new card" : "Přidat novou kartu",
"Card name" : "Název karty",
"title and color value must be provided" : "je třeba zadat nadpis a zvolit barvu",
"List deleted" : "Seznam smazán",
"Edit" : "Upravit",
"Add a new tag" : "Přidat nový štítek",
"title and color value must be provided" : "je třeba zadat nadpis a zvolit barvu",
"Board name" : "Název tabule",
"Members" : "Členové",
"Assign to users/groups/team" : "Přiřadit uživatelům/skupinám/týmům",
"Assign a user to this card…" : "Přiřadit uživatele k této kartě…",
"Select a user to assign to this card…" : "Vyberte uživatele, kterému tuto kartu přiřadit…",
"File to share" : "Soubor ke sdílení",
"Invalid path selected" : "Je vybrán neplatný popis umístění",
"Upload new files" : "Nahrát nové soubory",
"Share from Files" : "Sdílet ze Souborů",
"Pending share" : "Čekající sdílení",
"Add this attachment" : "Přidat tuto přílohu",
"Show in Files" : "Zobrazit v Souborech",
"Download" : "Stáhnout",
"Remove attachment" : "Odebrat přílohu",
"Unshare file" : "Přestat sdílet soubor",
"Delete Attachment" : "Smazat přílohu",
"Restore Attachment" : "Obnovit přílohu",
"Modified" : "Změněno",
"Created" : "Vytvořeno",
"The title cannot be empty." : "Nadpis je třeba vyplnit.",
"File to share" : "Soubor ke sdílení",
"Invalid path selected" : "Je vybrán neplatný popis umístění",
"Open in sidebar view" : "Otevřít v zobrazení v postranním panelu",
"Open in bigger view" : "Otevřít ve větším zobrazení",
"Attachments" : "Přílohy",
"Comments" : "Komentáře",
"Failed to load comments" : "Načtení komentářů se nezdařilo",
"Modified" : "Změněno",
"Created" : "Vytvořeno",
"The title cannot be empty." : "Nadpis je třeba vyplnit.",
"No comments yet. Begin the discussion!" : "Zatím bez komentářů. Zahajte diskuzi!",
"Failed to load comments" : "Načtení komentářů se nezdařilo",
"Assign a tag to this card…" : "Přiřadit této kartě štítek…",
"Assign to users" : "Přiřadit k uživatelům",
"Assign to users/groups/circles" : "Přiřadit uživatelům/skupinám/okruhům",
"Assign a user to this card…" : "Přiřadit uživatele k této kartě…",
"Due date" : "Termín",
"Set a due date" : "Vybrat termín",
"Remove due date" : "Odstranit termín",
"Select Date" : "Vybrat datum",
"Save" : "Uložit",
"The comment cannot be empty." : "Komentář je třeba vyplnit.",
"The comment cannot be longer than 1000 characters." : "Délka komentáře může být nejvýše 1 000 znaků.",
"Save" : "Uložit",
"Created:" : "Vytvořeno:",
"In reply to" : "V odpověď na",
"Cancel reply" : "Zrušit odpověď",
"Reply" : "Odpovědět",
"Update" : "Aktualizovat",
"Write a description …" : "Zadejte popis…",
"Description" : "Popis",
"(Unsaved)" : "(Neuloženo)",
"(Saving…)" : "(Ukládání…)",
@@ -257,140 +221,53 @@
"Edit description" : "Upravit popis",
"View description" : "Zobrazit popis",
"Add Attachment" : "Přidat přílohu",
"Write a description …" : "Zadejte popis…",
"Choose attachment" : "Zvolte přílohu",
"Select Date" : "Vybrat datum",
"Later today {timeLocale}" : "Později dnes {timeLocale}",
"Set due date for later today" : "Nastavit termín na dnešek",
"Tomorrow {timeLocale}" : "Zítra {timeLocale}",
"Set due date for tomorrow" : "Nastavit termín na zítřek",
"This weekend {timeLocale}" : "Tento víkend {timeLocale}",
"Set due date for this weekend" : "Nastavit termín na tento týden",
"Next week {timeLocale}" : "Příští týden {timeLocale}",
"Set due date for next week" : "Nastavit termín na příští týden",
"Assign a due date to this card…" : "Přiradit této kartě termín…",
"Set a due date" : "Vybrat termín",
"Add due date" : "Přidat termín",
"Choose a date" : "Zvolit datum",
"Remove due date" : "Odstranit termín",
"Mark as done" : "Označit jako hotové",
"Due at:" : "Termín v:",
"Not done" : "Nehotové",
"Unarchive card" : "Zrušit archivaci karty",
"Archive card" : "Archivovat kartu",
"Assign a tag to this card…" : "Přiřadit této kartě štítek…",
"Select or create a tag…" : "Vyberte nebo vytvořte štítek…",
"Create a new tag:" : "Vytvořit nový štítek:",
"(group)" : "(skupina)",
"{count} comments, {unread} unread" : "{count} komentářů, {unread} nepřečtených",
"Todo items" : "Položky k udělání",
"Edit card title" : "Upravit nadpis karty",
"Open link" : "Otevřít okaz",
"Card deleted" : "Karta smazána",
"Edit title" : "Upravit nadpis",
"Assign to me" : "Přiřadit mě",
"Unassign myself" : "Zrušit přiřazení sobě",
"Mark as not done" : "Označit jako nehotové",
"Move card" : "Přesunout kartu",
"Unarchive card" : "Zrušit archivaci karty",
"Archive card" : "Archivovat kartu",
"Delete card" : "Smazat kartu",
"Move card to another board" : "Přesunout kartu na jinou tabuli",
"Card deleted" : "Karta smazána",
"seconds ago" : "před několika sekundami",
"Keyboard shortcuts" : "Klávesové zkratky",
"Boost your productivity using Deck with keyboard shortcuts." : "Zvyšte svou produktivitu tím, že budete v Deck používat klávesové zkratky.",
"Board actions" : "Akce ohledně tabule",
"Keyboard shortcut" : "Klávesová zkratka",
"Action" : "Akce",
"Shift" : "Shift",
"Scroll" : "Posunout",
"Scroll sideways" : "Posunout na strany",
"Navigate between cards" : "Pohyb mezi kartami",
"Esc" : "Esc",
"Close card details" : "Zavřít podrobnosti o kartě",
"Ctrl" : "Ctrl",
"Search" : "Hledat",
"Show card filters" : "Zobrazit filtry karty",
"Clear card filters" : "Vyčistit filtry karty",
"Show help dialog" : "Zobrazit dialog nápovědy",
"Card actions" : "Akce ohledně karty",
"The following actions can be triggered on the currently highlighted card" : "Na právě zvýrazněné kartě je možné spustit následující akce",
"Enter" : "Konec řádku",
"Space" : "Mezera",
"Open card details" : "Otevřít podrobnosti o kartě",
"Edit the card title" : "Upravit nadpis karty",
"Assign yourself to the current card" : "Přiřadit stávající kartu sobě",
"Archive/unarchive the current card" : "Archivovat / zrušit archivaci stávající karty",
"Mark card as completed/not completed" : "Označit kartu jako (ne)dokončenou",
"Open card menu" : "Otevřít nabídku karty",
"All boards" : "Všechny tabule",
"Archived boards" : "Archivované tabule",
"Shared with you" : "Sdíleno s vámi",
"Deck settings" : "Nastavení pro Deck",
"Use bigger card view" : "Použít větší zobrazení karet",
"Show card ID badge" : "Zobrazit odznáček s identifikátorem karty",
"Show boards in calendar/tasks" : "Zobrazit tabule v kalendáři/úkolech",
"Limit board creation to some groups" : "Umožnit vytváření tabulí pouze vybraným skupinám",
"Users outside of those groups will not be able to create their own boards, but will still be able to work on boards that have been shared with them." : "Uživatelé, kteří nejsou členy těchto skupin nebudou moci vytvářet své vlastní tabule, ale pořád budou moci pracovat na tabulích, které jim byly nasdíleny.",
"Cancel edit" : "Zrušit úpravu",
"Save board" : "Uložit tabuli",
"Board {0} deleted" : "Tabule {0} smazána",
"All cards" : "Všechny karty",
"Only assigned cards" : "Pouze přiřazené karty",
"No reminder" : "Bez připomínky",
"An error occurred" : "Došlo k chybě",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Opravdu chcete tabuli {title} smazat? Toto smaže veškerá data této tabule, včetně archivovaných karet.",
"Delete the board?" : "Smazat tabuli?",
"Exporting board..." : "Exportování tabule…",
"Limit deck usage of groups" : "Omezit využití deck na skupiny",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Omezení nastavené pro Deck brání uživatelům, kteří nejsou součástí těchto skupin, ve vytváře vlastních tabulí. Nicméně i tak ale pořád budou moci pracovat na tabulích, které jsou jim nasdíleny.",
"Board details" : "Podrobnosti o tabuli",
"Edit board" : "Upravit tabuli",
"Clone board" : "Klonovat tabuli",
"Unarchive board" : "Vrátit tabuli zpět z archivu",
"Archive board" : "Archivovat tabuli",
"Export board" : "Exportovat tabuli",
"Turn on due date reminders" : "Zapnout upomínky termínů",
"Turn off due date reminders" : "Vypnout upomínky termínů",
"Due date reminders" : "Upomínky termínů",
"All cards" : "Všechny karty",
"Assigned cards" : "Přiřazené karty",
"No notifications" : "Žádná upozornění",
"Delete board" : "Smazat tabuli",
"Importing board..." : "Importování tabule…",
"Board imported successfully" : "Tabule úspěšně naimportována",
"Import board" : "Naimportovat tabuli",
"Clone {boardTitle}" : "Naklonovat {boardTitle}",
"Clone cards" : "Klonovat karty",
"Clone assignments" : "Přiřazení klonu",
"Clone labels" : "Popisky klonu",
"Clone due dates" : "Termíny klonu",
"Advanced options" : "Pokročilé předvolby",
"Move all cards to the first list" : "Přesunout všechny karty na první seznam",
"Restore archived cards" : "Obnovit archivované karty",
"Clone" : "Klonovat",
"Export {boardTitle}" : "Exportovat {boardTitle}",
"Export as JSON" : "Exportovat jako JSON",
"Export as CSV" : "Exportovat jako CSV",
"Note: Only the JSON format is supported for importing back into the Deck app." : "Pozn.: Pro import zpět do aplikace Deck je podporován pouze formát JSON.",
"Export" : "Exportovat",
"Board {0} deleted" : "Tabule {0} smazána",
"Only assigned cards" : "Pouze přiřazené karty",
"No reminder" : "Bez připomínky",
"An error occurred" : "Došlo k chybě",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Opravdu chcete tabuly {title} smazat? Toto smaže veškerá data této tabule.",
"Delete the board?" : "Smazat tabuli?",
"Loading filtered view" : "Načítání filtrovaného pohledu",
"Today" : "Dnes",
"Tomorrow" : "Zítra",
"This week" : "Tento týden",
"No due" : "Žádný termín",
"Search for {searchQuery} in all boards" : "Hledat {searchQuery} na všech tabulích",
"No results found" : "Nenalezeny žádné výsledky",
"Deck board {name}\n* Last modified on {lastMod}" : "Deck karta {name}\n* Naposledy změněno {lastMod}",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Vytvořeno {created}\n* Naposledy upraveno {lastMod}\n* {nbAttachments} příloh\n* {nbComments} komentářů",
"{nbCards} cards" : "{nbCards} karet",
"Due on {date}" : "Termín {date}",
"{stack} in {board}" : "{stack} v {board}",
"Click to expand description" : "Popis rozbalíte kliknutím",
"Click to expand comment" : "Komentář rozbalíte kliknutím",
"Create card" : "Vytvořit kartu",
"Create a new card" : "Vytvořit novou kartu",
"Card title" : "Název karty",
"Creating the new card …" : "Vytváření nové karty…",
"Card \"{card}\" was added to \"{board}\"" : "Karta „{card}“ byla přidána na „{board}“",
"Open card" : "Otevřít kartu",
"Close" : "Zavřít",
"No upcoming cards" : "Žádné nadcházející karty",
"upcoming cards today" : "nadcházející karty na dnešek",
"upcoming cards tomorrow" : "nadcházející karty na zítřek",
"upcoming cards" : "nadcházející karty",
"New card" : "Nová karta",
"Link to a board" : "Propojit s tabulí",
"Link to a card" : "Propojit s kartou",
"Create a card" : "Vytvořit kartu",
@@ -398,19 +275,9 @@
"Something went wrong" : "Něco se pokazilo",
"Failed to upload {name}" : "Nepodařilo se nahrát {name}",
"Maximum file size of {size} exceeded" : "Překročena nejvyšší umožněná velikost souboru {size}",
"Assigned users" : "Přiřazení uživatelé",
"Due date" : "Datum termínu",
"Error creating the share" : "Chyba při vytváření sdílení",
"Share with a Deck card" : "Sdílet s kartou aplikace Deck",
"Share {file} with a Deck card" : "Sdílet {file} s kartou aplikace Deck",
"Share" : "Sdílet",
"Personal" : "Osobní",
"To do" : "Zbývá udělat",
"Doing" : "Provádí se",
"Example Task 3" : "Třetí úkol pro ukázku",
"Example Task 2" : "Druhý úkol pro ukázku",
"Example Task 1" : "První úkol pro ukázku",
"Move card to another board" : "Přesunout kartu na jinou tabuli",
"Filter by completed" : "Filtrovat podle dokončených"
"Share" : "Sdílet"
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"
}

View File

@@ -1,39 +1,28 @@
OC.L10N.register(
"deck",
{
"Personal" : "Personol",
"Done" : "Done",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Mae'r ffeil lwythwyd i fyny'n fwy na chyfarwyddeb MAX_FILE_SIZE bennwyd yn y ffurflen HTML",
"No file was uploaded" : "Ni lwythwyd ffeil i fyny",
"Missing a temporary folder" : "Plygell dros dro yn eisiau",
"%s on %s" : "%s ar %s",
"Done" : "Done",
"Cancel" : "Diddymu",
"Open" : "Ar Agor",
"Details" : "Manylion",
"Tags" : "Tagiau",
"Activity" : "Gweithred",
"Undo" : "Dadwneud",
"Can edit" : "Can edit",
"Can share" : "Can share",
"Owner" : "Owner",
"Delete" : "Dileu",
"Edit" : "Golygu",
"Download" : "Llwytho i lawr",
"Modified" : "Addaswyd",
"Select Date" : "Dewis Dyddiad",
"Save" : "Cadw",
"Created:" : "Crewyd:",
"Update" : "Diweddaru",
"Description" : "Disgrifiad",
"Select Date" : "Dewis Dyddiad",
"seconds ago" : "eiliad yn ôl",
"Keyboard shortcuts" : "Llwybrau byr bysellfwrdd",
"Search" : "Chwilio",
"Shared with you" : "Shared with you",
"No reminder" : "Dim nodyn atgoffa",
"An error occurred" : "Digwyddodd gwall",
"Export" : "Allforio",
"Today" : "Heddiw",
"Close" : "Cau",
"Share" : "Rhannu",
"Personal" : "Personol"
"This week" : "Wythnos yma"
},
"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;");

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