diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000000..73e6422e7d --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,18 @@ + + +### 🖼️ Screenshots + +🏚️ Before | 🏡 After +---|--- +B | A + +### 🏁 Checklist + +- [ ] ⛑️ Tests (unit and/or integration) are included or not needed +- [ ] 🔙 Backport requests are created or not needed: `/backport to stableX.X` +- [ ] 📅 Milestone is set +- [ ] 🌸 PR title is meaningful (if it should be in the changelog: is it meaningful to users?) + +## 🤖 AI (if applicable) + +- [ ] The content of this PR was partly or fully generated using AI diff --git a/.github/pull_request_template.md.license b/.github/pull_request_template.md.license new file mode 100644 index 0000000000..8c5ffd5249 --- /dev/null +++ b/.github/pull_request_template.md.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors +SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/.github/workflows/ai-policy.yml b/.github/workflows/ai-policy.yml new file mode 100644 index 0000000000..e5c8d7d652 --- /dev/null +++ b/.github/workflows/ai-policy.yml @@ -0,0 +1,172 @@ +# 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 +# +# SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors +# SPDX-License-Identifier: MIT + +name: AI Policy + +on: + pull_request: + types: [opened, synchronize, reopened] + branches: [master, main] + +permissions: + contents: read + # Required to add the "AI assisted" label via `gh pr edit --add-label` + pull-requests: write + # Required to create the "AI assisted" label via the REST labels endpoint + # (labels are an issues-scoped resource in the GitHub API) + issues: write + +concurrency: + group: ai-policy-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + check-ai-trailers: + runs-on: ubuntu-latest-low + steps: + - name: Collect PR commit messages + id: collect + env: + GH_TOKEN: ${{ secrets.COMMAND_BOT_PAT }} + COMMITS_URL: ${{ github.event.pull_request.commits_url }} + run: | + set -euo pipefail + gh api ${COMMITS_URL} | jq -r '.[] | .commit.message' > /tmp/pr_commits.txt + echo "--- PR commit messages ---" + cat /tmp/pr_commits.txt + echo "--------------------------" + + - name: Define shared agent detection patterns + run: | + set -euo pipefail + + # Email addresses known to be used by coding agents. + # These should never appear in Signed-off-by because the DCO can only be attested by a human. + EMAIL_PATTERN="copilot@github\.com\ + |noreply@anthropic\.com\ + |devin@cognition\.ai\ + |devin@cognition-labs\.com\ + |aider@aider\.chat\ + |noreply@aider\.chat\ + |codex@openai\.com\ + |cursor@anysphere\.com\ + |windsurf@codeium\.com\ + |codeium@codeium\.com\ + |amazon-q@amazon\.com\ + |codewhisperer@amazon\.com\ + |gemini-code-assist@google\.com\ + |openhands@all-hands\.dev\ + |swe-agent@princeton\.edu" + + # Strip embedded whitespace (used above only for readability) + EMAIL_PATTERN=$(echo "$EMAIL_PATTERN" | tr -d ' \n') + echo "AGENT_EMAIL_PATTERN=${EMAIL_PATTERN}" >> "$GITHUB_ENV" + + # Display-name prefixes used by known coding agents (shared by Signed-off-by and Co-Authored-By checks) + # shellcheck disable=SC2016 + echo 'AGENT_NAMES=GitHub Copilot|Claude( [A-Za-z0-9. -]+)?|Devin( AI)?|aider( \(.*\))?|OpenAI Codex|Cursor( AI)?|Windsurf|Amazon Q|CodeWhisperer|Gemini Code Assist|OpenHands|SWE-agent|AutoCodeRover|Tabnine' >> "$GITHUB_ENV" + + - name: Check for AI-assistant / Assisted-by trailers + id: ai_trailers + run: | + set -euo pipefail + AI_ASSISTED=false + if grep -qiE '^(AI-assistant|Assisted-by|AI-Assisted-By):' /tmp/pr_commits.txt; then + AI_ASSISTED=true + echo "Found AI-assistant/Assisted-by/AI-Assisted-By trailer(s):" + grep -iE '^(AI-assistant|Assisted-by|AI-Assisted-By):' /tmp/pr_commits.txt + fi + echo "ai_assisted=${AI_ASSISTED}" >> "$GITHUB_OUTPUT" + + - name: Check for coding-agent Signed-off-by trailers + id: agent_signoff + run: | + set -euo pipefail + + EMAIL_HITS=$(grep -iE "^Signed-off-by:.*<(${AGENT_EMAIL_PATTERN})>" /tmp/pr_commits.txt 2>/dev/null || true) + NAME_HITS=$(grep -iE "^Signed-off-by: *(${AGENT_NAMES}) *[<(]" /tmp/pr_commits.txt 2>/dev/null || true) + + AGENT_LINES=$(printf '%s\n%s' "$EMAIL_HITS" "$NAME_HITS" | sort -u | sed '/^[[:space:]]*$/d') + + AGENT_SIGNOFF=false + if [ -n "$AGENT_LINES" ]; then + AGENT_SIGNOFF=true + fi + + echo "agent_signoff=${AGENT_SIGNOFF}" >> "$GITHUB_OUTPUT" + { + echo "agent_lines<> "$GITHUB_OUTPUT" + + - name: Check for coding-agent Co-Authored-By trailers + id: co_authored + run: | + set -euo pipefail + + EMAIL_HITS=$(grep -iE "^Co-Authored-By:.*<(${AGENT_EMAIL_PATTERN})>" /tmp/pr_commits.txt 2>/dev/null || true) + NAME_HITS=$(grep -iE "^Co-Authored-By: *(${AGENT_NAMES}) *[<(]" /tmp/pr_commits.txt 2>/dev/null || true) + + CO_AUTHORED=false + if [ -n "$EMAIL_HITS" ] || [ -n "$NAME_HITS" ]; then + CO_AUTHORED=true + echo "Found coding-agent Co-Authored-By trailer(s):" + printf '%s\n%s' "$EMAIL_HITS" "$NAME_HITS" | sort -u | sed '/^[[:space:]]*$/d' + fi + + echo "co_authored=${CO_AUTHORED}" >> "$GITHUB_OUTPUT" + + - name: Create 'AI assisted' label if absent + if: steps.ai_trailers.outputs.ai_assisted == 'true' || steps.agent_signoff.outputs.agent_signoff == 'true' || steps.co_authored.outputs.co_authored == 'true' + env: + GH_TOKEN: ${{ secrets.COMMAND_BOT_PAT }} + run: | + gh api "repos/${{ github.repository }}/labels" \ + --method POST \ + -f name="AI assisted" \ + -f color="d93f0b" \ + -f description="This PR contains AI-assisted commits" \ + 2>/dev/null || true + + - name: Label PR as AI assisted + if: steps.ai_trailers.outputs.ai_assisted == 'true' || steps.agent_signoff.outputs.agent_signoff == 'true' || steps.co_authored.outputs.co_authored == 'true' + env: + GH_TOKEN: ${{ secrets.COMMAND_BOT_PAT }} + run: | + gh api "repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels" \ + --method POST \ + -f "labels[]=AI assisted" + echo "Added 'AI assisted' label to PR #${{ github.event.pull_request.number }}" + + - name: Fail on coding-agent Signed-off-by + if: steps.agent_signoff.outputs.agent_signoff == 'true' + env: + AGENT_LINES: ${{ steps.agent_signoff.outputs.agent_lines }} + AGENTS_MD_URL: https://github.com/${{ github.repository }}/blob/${{ github.base_ref }}/AGENTS.md + run: | + echo "::error title=Coding-agent sign-off detected::A Signed-off-by trailer from a known coding agent was found in one or more commits." + echo "" + echo "Offending trailer(s):" + echo "${AGENT_LINES}" + echo "" + echo "The 'Signed-off-by' trailer represents the Developer Certificate of Origin (DCO)" + echo "and must only be attested by a human contributor." + echo "Please amend the affected commit(s) to remove the coding-agent sign-off" + echo "and replace it with an 'Assisted-by' trailer, for example:" + echo "" + echo " Assisted-by: Claude Code:claude-sonnet-4-6" + echo "" + echo "References:" + echo " • AGENTS.md (this repository)" + echo " ${AGENTS_MD_URL}" + echo " • AI Contribution Policy" + echo " https://github.com/nextcloud/.github/blob/master/AI_POLICY.md" + echo " • Contribution Guidelines" + echo " https://github.com/nextcloud/.github/blob/master/CONTRIBUTING.md" + exit 1 diff --git a/.github/workflows/app-upgrade-mysql.yml b/.github/workflows/app-upgrade-mysql.yml index abed2f4e89..076e228a8b 100644 --- a/.github/workflows/app-upgrade-mysql.yml +++ b/.github/workflows/app-upgrade-mysql.yml @@ -21,7 +21,7 @@ jobs: src: ${{ steps.changes.outputs.src}} steps: - - uses: dorny/paths-filter@7267a8516b6f92bdb098633497bad573efdbf271 # v2.12.0 + - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 id: changes continue-on-error: true with: @@ -46,8 +46,8 @@ jobs: strategy: matrix: - php-versions: ['8.2'] - server-versions: ['master'] + php-versions: ['8.3'] + server-versions: ['stable34', 'master'] services: mysql: @@ -65,7 +65,7 @@ jobs: echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - name: Checkout server - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false submodules: true @@ -78,7 +78,7 @@ jobs: echo "text_app_ref=$text_app_ref" >> $GITHUB_ENV - name: Checkout text app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false repository: nextcloud/text @@ -86,7 +86,7 @@ jobs: ref: ${{ env.text_app_ref }} - name: Checkout viewer app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false repository: nextcloud/viewer @@ -94,7 +94,7 @@ jobs: ref: ${{ matrix.server-versions }} - name: Set up php ${{ matrix.php-versions }} - uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # v2 with: php-version: ${{ matrix.php-versions }} # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation @@ -120,7 +120,7 @@ jobs: ./occ app:enable --force ${{ env.APP_NAME }} - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false path: apps/${{ env.APP_NAME }} @@ -135,7 +135,7 @@ jobs: ./occ app:list - name: Upload nextcloud logs - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: always() with: name: nextcloud.log diff --git a/.github/workflows/appstore-build-publish.yml b/.github/workflows/appstore-build-publish.yml index 5afb1df53a..28cc1f4636 100644 --- a/.github/workflows/appstore-build-publish.yml +++ b/.github/workflows/appstore-build-publish.yml @@ -35,7 +35,7 @@ jobs: echo "APP_VERSION=${GITHUB_REF##*/}" >> $GITHUB_ENV - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false path: ${{ env.APP_NAME }} @@ -71,9 +71,10 @@ jobs: - name: Set up node ${{ steps.versions.outputs.nodeVersion }} # Skip if no package.json if: ${{ steps.versions.outputs.nodeVersion }} - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: ${{ steps.versions.outputs.nodeVersion }} + package-manager-cache: false - name: Set up npm ${{ steps.versions.outputs.npmVersion }} # Skip if no package.json @@ -87,7 +88,7 @@ jobs: filename: ${{ env.APP_NAME }}/appinfo/info.xml - name: Set up php ${{ steps.php-versions.outputs.php-min }} - uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2 with: php-version: ${{ steps.php-versions.outputs.php-min }} coverage: none @@ -156,7 +157,7 @@ jobs: unzip nextcloud.zip - name: Checkout server master fallback - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 if: ${{ steps.server-download.outcome != 'success' }} with: persist-credentials: false @@ -172,7 +173,7 @@ jobs: tar -xvf ${{ env.APP_NAME }}.tar.gz cd ../../../ # Setting up keys - echo '${{ secrets.APP_PRIVATE_KEY }}' > ${{ env.APP_NAME }}.key # zizmor: ignore[secrets-outside-env] + 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 }} @@ -181,7 +182,7 @@ jobs: tar -zcvf ${{ env.APP_NAME }}.tar.gz ${{ env.APP_NAME }} - name: Attach tarball to github release - uses: svenstaro/upload-release-action@29e53e917877a24fad85510ded594ab3c9ca12de # v2.11.5 + uses: svenstaro/upload-release-action@29e53e917877a24fad85510ded594ab3c9ca12de # 2.11.5 id: attach_to_release with: repo_token: ${{ secrets.GITHUB_TOKEN }} @@ -194,6 +195,6 @@ jobs: uses: nextcloud-releases/nextcloud-appstore-push-action@a011fe619bcf6e77ddebc96f9908e1af4071b9c1 # v1.0.3 with: app_name: ${{ env.APP_NAME }} - appstore_token: ${{ secrets.APPSTORE_TOKEN }} # zizmor: ignore[secrets-outside-env] + appstore_token: ${{ secrets.APPSTORE_TOKEN }} download_url: ${{ steps.attach_to_release.outputs.browser_download_url }} - app_private_key: ${{ secrets.APP_PRIVATE_KEY }} # zizmor: ignore[secrets-outside-env] + app_private_key: ${{ secrets.APP_PRIVATE_KEY }} diff --git a/.github/workflows/cypress-component.yml b/.github/workflows/cypress-component.yml index f4ac235a68..87d308cd65 100644 --- a/.github/workflows/cypress-component.yml +++ b/.github/workflows/cypress-component.yml @@ -24,12 +24,12 @@ jobs: steps: - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up node from version file - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: cache: 'npm' cache-dependency-path: package-lock.json @@ -45,7 +45,7 @@ jobs: run: npm run tests:component - name: Upload test failure screenshots - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: failure() with: name: cypress-component-screenshots-node${{ matrix.node-version }} @@ -53,7 +53,7 @@ jobs: retention-days: 5 - name: Upload test videos - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: failure() with: name: cypress-component-videos-node${{ matrix.node-version }} diff --git a/.github/workflows/cypress-custom.yml b/.github/workflows/cypress-custom.yml index 0f8ef70f90..33a1c6d042 100644 --- a/.github/workflows/cypress-custom.yml +++ b/.github/workflows/cypress-custom.yml @@ -31,9 +31,9 @@ jobs: fail-fast: false matrix: databases: [ 'mysql' ] - server-versions: [ 'stable33', 'master' ] + server-versions: [ 'stable33', 'stable34', 'master' ] include: - - php-versions: 8.2 + - php-versions: 8.3 services: mysql: @@ -47,7 +47,7 @@ jobs: steps: - name: Checkout server - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false submodules: true @@ -55,7 +55,7 @@ jobs: ref: ${{ matrix.server-versions }} - name: Checkout viewer - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false repository: nextcloud/viewer @@ -68,14 +68,14 @@ jobs: echo "text_app_ref=$text_app_ref" >> $GITHUB_ENV - name: Checkout text app - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: repository: nextcloud/text path: apps/text ref: ${{ env.text_app_ref }} - name: Checkout circles app - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false repository: nextcloud/circles @@ -83,13 +83,13 @@ jobs: ref: ${{ matrix.server-versions }} - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false path: apps/${{ env.APP_NAME }} - name: Set up node from version file - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: cache: 'npm' cache-dependency-path: apps/${{ env.APP_NAME}}/package-lock.json @@ -103,7 +103,7 @@ jobs: composer i --no-dev - name: Set up php ${{ matrix.php-versions }} - uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2 with: php-version: ${{ matrix.php-versions }} extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, zip, zlib, sqlite, pdo_sqlite, apcu, pgsql, pdo_pgsql,mysql, pdo_mysql @@ -135,7 +135,7 @@ jobs: cat data/nextcloud.log - name: Cypress run - uses: cypress-io/github-action@c495c3ddffba403ba11be95fffb67e25203b3799 # v7.1.10 + uses: cypress-io/github-action@fa4a118725a8f001170d49631ea89e5d66fee626 # v7.4.1 with: wait-on: '${{ env.CYPRESS_baseUrl }}' working-directory: 'apps/${{ env.APP_NAME }}' @@ -156,7 +156,7 @@ jobs: cat data/nextcloud.log - name: Upload test failure screenshots ${{ matrix.node-version }}-${{ matrix.php-versions }}-${{ matrix.server-versions }}-${{ matrix.databases }} - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: failure() with: name: Upload screenshots ${{ matrix.node-version }}-${{ matrix.php-versions }}-${{ matrix.server-versions }}-${{ matrix.databases }} @@ -164,7 +164,7 @@ jobs: retention-days: 5 - name: Upload nextcloud logs ${{ matrix.node-version }}-${{ matrix.php-versions }}-${{ matrix.server-versions }}-${{ matrix.databases }} - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: failure() with: name: Upload nextcloud log ${{ matrix.node-version }}-${{ matrix.php-versions }}-${{ matrix.server-versions }}-${{ matrix.databases }} @@ -184,4 +184,3 @@ jobs: steps: - name: Summary status run: if ${{ needs.cypress.result != 'success' && needs.cypress.result != 'skipped' }}; then exit 1; fi - diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index f2f52c4aa7..9d134c1052 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -28,7 +28,7 @@ jobs: src: ${{ steps.changes.outputs.src}} steps: - - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 id: changes continue-on-error: true with: @@ -53,8 +53,8 @@ jobs: strategy: fail-fast: false matrix: - server-versions: ['stable33', 'master'] - php-versions: ['8.2'] + server-versions: ['stable33', 'stable34', 'master'] + php-versions: ['8.3'] databases: ['mysql'] include: - server-versions: 'stable33' @@ -63,6 +63,12 @@ jobs: - server-versions: 'stable33' php-versions: '8.4' databases: 'sqlite' + - server-versions: 'stable34' + php-versions: '8.4' + databases: 'pgsql' + - server-versions: 'stable34' + php-versions: '8.4' + databases: 'sqlite' - server-versions: 'master' php-versions: '8.5' databases: 'pgsql' @@ -92,7 +98,7 @@ jobs: steps: - name: Checkout server - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false submodules: true @@ -100,13 +106,13 @@ jobs: ref: ${{ matrix.server-versions }} - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false path: apps/${{ env.APP_NAME }} - name: Set up php ${{ matrix.php-versions }} - uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2 with: php-version: ${{ matrix.php-versions }} extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, zip, zlib, sqlite, pdo_sqlite, apcu, pgsql, pdo_pgsql,mysql, pdo_mysql @@ -146,8 +152,8 @@ jobs: cat data/nextcloud.log - name: Query count - if: ${{ matrix.databases == 'mysql' && matrix.php-versions == '8.2' && matrix.server-versions == 'master' && github.event_name == 'pull_request' }} - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 + if: ${{ matrix.databases == 'mysql' && matrix.php-versions == '8.3' && matrix.server-versions == 'master' && github.event_name == 'pull_request' }} + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: github-token: ${{secrets.GITHUB_TOKEN}} script: | diff --git a/.github/workflows/lint-eslint.yml b/.github/workflows/lint-eslint.yml index df3a2f6229..86d6d552bc 100644 --- a/.github/workflows/lint-eslint.yml +++ b/.github/workflows/lint-eslint.yml @@ -56,7 +56,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false @@ -68,7 +68,7 @@ jobs: fallbackNpm: '^10' - name: Set up node ${{ steps.versions.outputs.nodeVersion }} - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: ${{ steps.versions.outputs.nodeVersion }} diff --git a/.github/workflows/lint-info-xml.yml b/.github/workflows/lint-info-xml.yml index d0c84cc92a..e55705222f 100644 --- a/.github/workflows/lint-info-xml.yml +++ b/.github/workflows/lint-info-xml.yml @@ -24,9 +24,11 @@ jobs: name: info.xml lint steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false + sparse-checkout: | + appinfo/ - name: Download schema run: wget https://raw.githubusercontent.com/nextcloud/appstore/master/nextcloudappstore/api/v1/release/info.xsd diff --git a/.github/workflows/lint-php-cs.yml b/.github/workflows/lint-php-cs.yml index da402086ad..bb67a00421 100644 --- a/.github/workflows/lint-php-cs.yml +++ b/.github/workflows/lint-php-cs.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false @@ -34,7 +34,7 @@ jobs: uses: icewind1991/nextcloud-version-matrix@8a7bac6300b2f0f3100088b297995a229558ddba # v1.3.2 - name: Set up php${{ steps.versions.outputs.php-min }} - uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2 with: php-version: ${{ steps.versions.outputs.php-min }} extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite diff --git a/.github/workflows/lint-php.yml b/.github/workflows/lint-php.yml index d1eafea62a..cb2684b245 100644 --- a/.github/workflows/lint-php.yml +++ b/.github/workflows/lint-php.yml @@ -25,7 +25,7 @@ jobs: php-max: ${{ steps.versions.outputs.php-max }} steps: - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false @@ -34,7 +34,7 @@ jobs: uses: icewind1991/nextcloud-version-matrix@8a7bac6300b2f0f3100088b297995a229558ddba # v1.3.2 php-lint: - runs-on: ubuntu-latest + runs-on: ubuntu-latest-low needs: matrix strategy: matrix: @@ -44,12 +44,12 @@ jobs: steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up php ${{ matrix.php-versions }} - uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2 with: php-version: ${{ matrix.php-versions }} extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite diff --git a/.github/workflows/lint-stylelint.yml b/.github/workflows/lint-stylelint.yml index 251a568941..8cc8edc01a 100644 --- a/.github/workflows/lint-stylelint.yml +++ b/.github/workflows/lint-stylelint.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false @@ -37,7 +37,7 @@ jobs: fallbackNpm: '^10' - name: Set up node ${{ steps.versions.outputs.nodeVersion }} - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: ${{ steps.versions.outputs.nodeVersion }} diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml index 36a5e86d48..41d5e3db6a 100644 --- a/.github/workflows/node.yml +++ b/.github/workflows/node.yml @@ -53,7 +53,7 @@ jobs: name: NPM build steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false @@ -65,7 +65,7 @@ jobs: fallbackNpm: '^10' - name: Set up node ${{ steps.versions.outputs.nodeVersion }} - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: ${{ steps.versions.outputs.nodeVersion }} diff --git a/.github/workflows/npm-audit-fix.yml b/.github/workflows/npm-audit-fix.yml index 190c04402b..3e22cb854f 100644 --- a/.github/workflows/npm-audit-fix.yml +++ b/.github/workflows/npm-audit-fix.yml @@ -33,7 +33,7 @@ jobs: steps: - name: Checkout id: checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false ref: ${{ matrix.branches }} @@ -47,7 +47,7 @@ jobs: fallbackNpm: '^10' - name: Set up node ${{ steps.versions.outputs.nodeVersion }} - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: ${{ steps.versions.outputs.nodeVersion }} @@ -70,7 +70,7 @@ jobs: if: steps.checkout.outcome == 'success' uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1 with: - token: ${{ secrets.COMMAND_BOT_PAT }} # zizmor: ignore[secrets-outside-env] + token: ${{ secrets.COMMAND_BOT_PAT }} commit-message: 'fix(deps): Fix npm audit' committer: GitHub author: nextcloud-command diff --git a/.github/workflows/openapi.yml b/.github/workflows/openapi.yml index 7b95be10ae..76c939c0b4 100644 --- a/.github/workflows/openapi.yml +++ b/.github/workflows/openapi.yml @@ -26,7 +26,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false @@ -35,7 +35,7 @@ jobs: uses: icewind1991/nextcloud-version-matrix@8a7bac6300b2f0f3100088b297995a229558ddba # v1.3.2 - name: Set up php - uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2 with: php-version: ${{ steps.php_versions.outputs.php-available }} extensions: xml @@ -62,7 +62,7 @@ jobs: - name: Set up node ${{ steps.node_versions.outputs.nodeVersion }} if: ${{ steps.node_versions.outputs.nodeVersion }} - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: ${{ steps.node_versions.outputs.nodeVersion }} diff --git a/.github/workflows/php-scoper-dependencies.yml b/.github/workflows/php-scoper-dependencies.yml index 8b802b157e..5f527b71be 100644 --- a/.github/workflows/php-scoper-dependencies.yml +++ b/.github/workflows/php-scoper-dependencies.yml @@ -21,16 +21,16 @@ jobs: steps: - name: Checkout - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Get php version id: versions - uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1 + uses: icewind1991/nextcloud-version-matrix@8a7bac6300b2f0f3100088b297995a229558ddba # v1.3.2 - name: Set up php${{ steps.versions.outputs.php-min }} - uses: shivammathur/setup-php@bf6b4fbd49ca58e4608c9c89fba0b8d90bd2a39f # v2.35.5 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2 with: php-version: ${{ steps.versions.outputs.php-min }} extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite diff --git a/.github/workflows/phpunit-mariadb.yml b/.github/workflows/phpunit-mariadb.yml index 3a2389b579..5a578ba7f7 100644 --- a/.github/workflows/phpunit-mariadb.yml +++ b/.github/workflows/phpunit-mariadb.yml @@ -25,7 +25,7 @@ jobs: server-max: ${{ steps.versions.outputs.branches-max-list }} steps: - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false @@ -67,6 +67,7 @@ jobs: if: needs.changes.outputs.src != 'false' strategy: + fail-fast: false matrix: php-versions: ${{ fromJson(needs.matrix.outputs.php-version) }} server-versions: ${{ fromJson(needs.matrix.outputs.server-max) }} @@ -91,7 +92,7 @@ jobs: echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - name: Checkout server - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false submodules: true @@ -99,13 +100,13 @@ jobs: ref: ${{ matrix.server-versions }} - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false path: apps/${{ env.APP_NAME }} - name: Set up php ${{ matrix.php-versions }} - uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2 with: php-version: ${{ matrix.php-versions }} # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation diff --git a/.github/workflows/phpunit-mysql.yml b/.github/workflows/phpunit-mysql.yml index e0216816f1..69db3b5d4f 100644 --- a/.github/workflows/phpunit-mysql.yml +++ b/.github/workflows/phpunit-mysql.yml @@ -24,7 +24,7 @@ jobs: matrix: ${{ steps.versions.outputs.sparse-matrix }} steps: - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false @@ -68,6 +68,7 @@ jobs: if: needs.changes.outputs.src != 'false' strategy: + fail-fast: false matrix: ${{ fromJson(needs.matrix.outputs.matrix) }} name: MySQL ${{ matrix.mysql-versions }} PHP ${{ matrix.php-versions }} Nextcloud ${{ matrix.server-versions }} @@ -89,7 +90,7 @@ jobs: echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - name: Checkout server - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false submodules: true @@ -97,13 +98,13 @@ jobs: ref: ${{ matrix.server-versions }} - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false path: apps/${{ env.APP_NAME }} - name: Set up php ${{ matrix.php-versions }} - uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2 with: php-version: ${{ matrix.php-versions }} # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation diff --git a/.github/workflows/phpunit-pgsql.yml b/.github/workflows/phpunit-pgsql.yml index 4592e62503..f93a8b123e 100644 --- a/.github/workflows/phpunit-pgsql.yml +++ b/.github/workflows/phpunit-pgsql.yml @@ -25,7 +25,7 @@ jobs: server-max: ${{ steps.versions.outputs.branches-max-list }} steps: - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false @@ -67,6 +67,7 @@ jobs: if: needs.changes.outputs.src != 'false' strategy: + fail-fast: false matrix: php-versions: ${{ fromJson(needs.matrix.outputs.php-version) }} server-versions: ${{ fromJson(needs.matrix.outputs.server-max) }} @@ -92,7 +93,7 @@ jobs: echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - name: Checkout server - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false submodules: true @@ -100,13 +101,13 @@ jobs: ref: ${{ matrix.server-versions }} - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false path: apps/${{ env.APP_NAME }} - name: Set up php ${{ matrix.php-versions }} - uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2 with: php-version: ${{ matrix.php-versions }} # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation diff --git a/.github/workflows/phpunit-sqlite.yml b/.github/workflows/phpunit-sqlite.yml index e2e299ab1a..06abce1183 100644 --- a/.github/workflows/phpunit-sqlite.yml +++ b/.github/workflows/phpunit-sqlite.yml @@ -25,7 +25,7 @@ jobs: server-max: ${{ steps.versions.outputs.branches-max-list }} steps: - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false @@ -67,6 +67,7 @@ jobs: if: needs.changes.outputs.src != 'false' strategy: + fail-fast: false matrix: php-versions: ${{ fromJson(needs.matrix.outputs.php-version) }} server-versions: ${{ fromJson(needs.matrix.outputs.server-max) }} @@ -81,7 +82,7 @@ jobs: echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - name: Checkout server - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false submodules: true @@ -89,13 +90,13 @@ jobs: ref: ${{ matrix.server-versions }} - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false path: apps/${{ env.APP_NAME }} - name: Set up php ${{ matrix.php-versions }} - uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2 with: php-version: ${{ matrix.php-versions }} # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 98459febb1..eb03c49707 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -24,18 +24,18 @@ jobs: strategy: fail-fast: false matrix: - server-versions: ['stable33', 'master'] + server-versions: ['stable33', 'stable34', 'master'] name: Playwright (${{ matrix.server-versions }}) steps: - name: Checkout app - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: cache: 'npm' node-version-file: 'package.json' @@ -55,7 +55,7 @@ jobs: SERVER_BRANCH: ${{ matrix.server-versions }} - name: Upload test results - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: always() with: name: playwright-results-${{ matrix.server-versions }} diff --git a/.github/workflows/pr-feedback.yml b/.github/workflows/pr-feedback.yml index d28bc2b48e..a5a7f64b27 100644 --- a/.github/workflows/pr-feedback.yml +++ b/.github/workflows/pr-feedback.yml @@ -36,7 +36,7 @@ jobs: blocklist=$(curl https://raw.githubusercontent.com/nextcloud/.github/master/non-community-usernames.txt | paste -s -d, -) echo "blocklist=$blocklist" >> "$GITHUB_OUTPUT" - - uses: nextcloud/pr-feedback-action@5227c55be184087d0aef6338bee210d8620b6297 # main + - uses: nextcloud/pr-feedback-action@c8c97a6b11ff6379e629a8fbde09572730cacec9 # main with: feedback-message: | Hello there, diff --git a/.github/workflows/psalm-matrix-custom.yml b/.github/workflows/psalm-matrix-custom.yml index dbb2ccbab4..537a212d02 100644 --- a/.github/workflows/psalm-matrix-custom.yml +++ b/.github/workflows/psalm-matrix-custom.yml @@ -21,15 +21,15 @@ jobs: # do not stop on another job's failure fail-fast: false matrix: - ocp-version: [ 'dev-master', 'dev-stable33' ] + ocp-version: [ 'dev-master', 'dev-stable34', 'dev-stable33' ] name: static-psalm-analysis ${{ matrix.ocp-version }} steps: - name: Checkout - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Set up php8.2 - uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # v2 with: php-version: 8.2 extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite diff --git a/.github/workflows/renovate-approve-merge.yml b/.github/workflows/renovate-approve-merge.yml index decbabf29a..c3187c354a 100644 --- a/.github/workflows/renovate-approve-merge.yml +++ b/.github/workflows/renovate-approve-merge.yml @@ -27,7 +27,7 @@ jobs: if: github.event.pull_request.user.login == 'renovate[bot]' runs-on: ubuntu-latest permissions: - # for hmarr/auto-approve-action to approve PRs + # for auto-approve step to work pull-requests: write # for alexwilson/enable-github-automerge-action to approve PRs contents: write @@ -44,15 +44,16 @@ jobs: with: repo-token: ${{ secrets.GITHUB_TOKEN }} - # GitHub actions bot approve - - uses: hmarr/auto-approve-action@f0939ea97e9205ef24d872e76833fa908a770363 # v4.0.0 + - name: GitHub actions bot approve if: startsWith(steps.branchname.outputs.branch, 'renovate/') - with: - github-token: ${{ secrets.GITHUB_TOKEN }} + run: gh pr review --approve "$PR_URL" + env: + PR_URL: ${{ github.event.pull_request.html_url }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Enable GitHub auto merge - name: Auto merge - uses: alexwilson/enable-github-automerge-action@56e3117d1ae1540309dc8f7a9f2825bc3c5f06ff # v2.0.0 - if: startsWith(steps.branchname.outputs.branch, 'renovate/') && (github.event.pull_request.action == 'opened' || github.event.pull_request.action == 'reopened') + uses: alexwilson/enable-github-automerge-action@2c32e18a76e0726ffe7a573bfff2d42a20885126 # 3.0.0 + if: startsWith(steps.branchname.outputs.branch, 'renovate/') && (github.event.action == 'opened' || github.event.action == 'reopened') with: github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/reuse.yml b/.github/workflows/reuse.yml index 3f485f875f..4e1a74194e 100644 --- a/.github/workflows/reuse.yml +++ b/.github/workflows/reuse.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest-low steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false diff --git a/.github/workflows/update-nextcloud-ocp-approve-merge.yml b/.github/workflows/update-nextcloud-ocp-approve-merge.yml index dfe0ef4e97..88c54da0ab 100644 --- a/.github/workflows/update-nextcloud-ocp-approve-merge.yml +++ b/.github/workflows/update-nextcloud-ocp-approve-merge.yml @@ -27,7 +27,7 @@ jobs: if: github.actor == 'nextcloud-command' runs-on: ubuntu-latest-low permissions: - # for hmarr/auto-approve-action to approve PRs + # for auto-approve-action to approve PRs pull-requests: write # for alexwilson/enable-github-automerge-action to approve PRs contents: write @@ -44,15 +44,16 @@ jobs: with: repo-token: ${{ secrets.GITHUB_TOKEN }} - # GitHub actions bot approve - - uses: hmarr/auto-approve-action@b40d6c9ed2fa10c9a2749eca7eb004418a705501 # v2 + - name: GitHub actions bot approve if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp') - with: - github-token: ${{ secrets.GITHUB_TOKEN }} + run: gh pr review --approve "$PR_URL" + env: + PR_URL: ${{ github.event.pull_request.html_url }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Enable GitHub auto merge - name: Auto merge - uses: alexwilson/enable-github-automerge-action@56e3117d1ae1540309dc8f7a9f2825bc3c5f06ff # v2.0.0 + uses: alexwilson/enable-github-automerge-action@2c32e18a76e0726ffe7a573bfff2d42a20885126 # 3.0.0 if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp') with: github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/update-nextcloud-ocp-matrix.yml b/.github/workflows/update-nextcloud-ocp-matrix.yml index 0a37f467aa..8ab8ee2d0d 100644 --- a/.github/workflows/update-nextcloud-ocp-matrix.yml +++ b/.github/workflows/update-nextcloud-ocp-matrix.yml @@ -21,6 +21,9 @@ jobs: update-nextcloud-ocp: runs-on: ubuntu-latest + # Only allowed to be run on nextcloud repositories + if: ${{ github.repository_owner == 'nextcloud' }} + strategy: fail-fast: false matrix: @@ -30,7 +33,7 @@ jobs: name: update-nextcloud-ocp-${{ matrix.branches }} steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false ref: ${{ matrix.branches }} @@ -41,7 +44,7 @@ jobs: uses: icewind1991/nextcloud-version-matrix@8a7bac6300b2f0f3100088b297995a229558ddba # v1.3.2 - name: Set up php8.2 - uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0 + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2 with: php-version: 8.2 # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation @@ -59,9 +62,25 @@ jobs: - name: Composer install run: composer install + - name: Check composer bin for nextcloud/ocp exists + id: check_composer_bin + uses: andstor/file-existence-action@558493d6c74bf472d87c84eab196434afc2fa029 # v3.1.0 + with: + files: vendor-bin/nextcloud-ocp/composer.json + - name: Composer update nextcloud/ocp id: update_branch - run: composer require --dev nextcloud/ocp:dev-${{ steps.versions.outputs.branches-min }} + env: + USE_COMPOSER_BIN: ${{ steps.check_composer_bin.outputs.files_exists }} + BRANCH_NAME: ${{ steps.versions.outputs.branches-min }} + run: | + COMPOSER_CMD='composer' + if [[ "$USE_COMPOSER_BIN" == 'true' ]]; then + COMPOSER_CMD='composer bin nextcloud-ocp' + fi + + echo $COMPOSER_CMD require --dev nextcloud/ocp:dev-$BRANCH_NAME + $COMPOSER_CMD require --dev nextcloud/ocp:dev-$BRANCH_NAME - name: Raise on issue on failure uses: dacbd/create-issue-action@cdb57ab6ff8862aa09fee2be6ba77a59581921c2 # v2.0.0 @@ -71,34 +90,21 @@ jobs: title: 'Failed to update nextcloud/ocp package' body: 'Please check the output of the GitHub action and manually resolve the issues
${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
${{ steps.codeowners.outputs.codeowners }}' - - name: Reset checkout 3rdparty - run: | - git clean -f 3rdparty - git checkout 3rdparty - continue-on-error: true - - - name: Reset checkout vendor - run: | - git clean -f vendor - git checkout vendor - continue-on-error: true - - - name: Reset checkout vendor-bin - run: | - git clean -f vendor-bin - git checkout vendor-bin - continue-on-error: true - - name: Create Pull Request uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1 with: - token: ${{ secrets.COMMAND_BOT_PAT }} # zizmor: ignore[secrets-outside-env] + token: ${{ secrets.COMMAND_BOT_PAT }} commit-message: 'chore(dev-deps): Bump nextcloud/ocp package' committer: GitHub author: nextcloud-command signoff: true branch: 'automated/noid/${{ matrix.branches }}-update-nextcloud-ocp' title: '[${{ matrix.branches }}] Update nextcloud/ocp dependency' + add-path: | + composer.json + composer.lock + vendor-bin/nextcloud-ocp/composer.json + vendor-bin/nextcloud-ocp/composer.lock body: | Auto-generated update of [nextcloud/ocp](https://github.com/nextcloud-deps/ocp/) dependency labels: | diff --git a/.nextcloudignore b/.nextcloudignore index 1f121c32c7..1a224a62ec 100644 --- a/.nextcloudignore +++ b/.nextcloudignore @@ -45,6 +45,8 @@ .l10nignore .php-cs-fixer.dist.php .tx +AGENTS.md +CLAUDE.md phpunit.integration.xml phpunit.xml psalm.xml diff --git a/.scoper-production-dependencies b/.scoper-production-dependencies index e29620a89e..9d95f3ede6 100644 --- a/.scoper-production-dependencies +++ b/.scoper-production-dependencies @@ -3,7 +3,4 @@ composer/pcre maennchen/zipstream-php markbaker/complex markbaker/matrix -psr/http-client -psr/http-factory -psr/http-message psr/simple-cache diff --git a/AGENTS.md b/AGENTS.md index 743a1c547f..8dd2557f6b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -10,6 +10,32 @@ This file provides guidance to all AI agents (Claude, Codex, Gemini, etc.) worki **Nextcloud Tables** is a Nextcloud app (PHP backend + Vue.js frontend) that lets users create and manage custom data tables with typed columns, views, sharing, and import/export. It ships a full OCS REST API and integrates with the Nextcloud event, activity, search, and reference systems. +## Nextcloud Contribution Policy + +All contributions generated or assisted by this agent must fully comply with: + +- **[AI Contribution Policy](https://github.com/nextcloud/.github/blob/master/AI_POLICY.md)** - the primary reference for AI-specific rules, covering disclosure, author accountability, communication, security, licensing, code quality, and autonomous agent behavior. +- **[Contribution Guidelines](https://github.com/nextcloud/.github/blob/master/CONTRIBUTING.md)** - covering testing requirements, the Developer Certificate of Origin (DCO), license headers, conventional commits, and translations. These apply in full to all contributions regardless of how they were produced. + +### What this agent must always do + +- Add an `Assisted-by: AGENT_NAME:MODEL_VERSION` git trailer to every commit containing AI-assisted content. +- Ensure every pull request includes a disclosure of AI tool use in the PR description. +- Produce focused, scoped pull requests that address exactly one concern. Do not touch unrelated files or introduce incidental refactors. +- Verify all dependencies against actual package registries before suggesting them. Do not use hallucinated or unverified package names. +- Explicitly inform the contributor when any action they are about to take, or have taken, would violate the AI Contribution Policy or the Contribution Guidelines. Do not silently proceed. State which rule is at risk and what the contributor should do instead. +- Warn the contributor if a pull request is growing too large. A PR approaching several thousand lines of changed code is a signal that it should be split into smaller, focused PRs. Suggest a logical split before the PR is opened, not after. +- Recommend opening a ticket for discussion before starting implementation whenever a feature or change is sufficiently complex - for example when it touches multiple subsystems, requires architectural decisions, or the right approach is not yet clear. A ticket allows maintainers and the contributor to align on direction before code is written, avoiding wasted effort on a PR that may be rejected or require fundamental rework. + +### What this agent must never do + +- Open issues, submit pull requests, post review comments, or send security reports autonomously. Every contribution must be reviewed and submitted by a human. +- Add `Signed-off-by` tags to commits. Only the human contributor can certify the Developer Certificate of Origin. +- Generate or submit security reports without independent human verification. Report verified vulnerabilities via [HackerOne](https://hackerone.com/nextcloud), not as GitHub issues. +- Write PR descriptions, review comments, or issue reports on behalf of the contributor. These must be in the contributor's own words. +- Fully automate the resolution of issues labeled [`good first issue`](https://github.com/issues?q=org%3Anextcloud+label%3A%22good+first+issue%22) or similar beginner-friendly labels. +- Submit code that has not been reviewed and cleaned up by the contributor. Dead code, redundant logic, excessive comments, and unrelated changes must be removed before submission. + ## Development Setup ```bash @@ -98,25 +124,24 @@ Supports PostgreSQL, MySQL, and SQLite. The unusual design detail is that row ce - All commits must be signed off (`git commit -s`) per the Developer Certificate of Origin (DCO). All PRs target `master`. Backports use `/backport to stable-X.Y` in a PR comment. -- Commit messages must follow the [Conventional Commits v1.0.0 specification](https://www.conventionalcommits.org/en/v1.0.0/#specification) — e.g. `feat(chat): add voice message playback`, `fix(call): handle MCU disconnect gracefully`. +- Commit messages must follow the [Conventional Commits v1.0.0 specification](https://www.conventionalcommits.org/en/v1.0.0/#specification) — e.g. `feat(import): support remapping selection options`, `fix(rows): handle empty cell values on export`. -- Every commit made with AI assistance must include an `AI-assistant` trailer identifying the coding agent, its version, and the model(s) used: +- Every commit made with AI assistance must include the `Assisted-by` trailer mandated by the [AI Contribution Policy](https://github.com/nextcloud/.github/blob/master/AI_POLICY.md) (see "What this agent must always do" above): ``` - AI-assistant: Claude Code 2.1.80 (Claude Sonnet 4.6) - AI-assistant: Copilot 1.0.6 (Claude Sonnet 4.6) + Assisted-by: ClaudeCode:claude-sonnet-4-6 + Assisted-by: Copilot:gpt-4o ``` - General pattern: `AI-assistant: ( )` + General pattern: `Assisted-by: AGENT_NAME:MODEL_VERSION` - If multiple models are used for different roles, extend the trailer with named roles: + If multiple agents or models contributed to a commit, add one trailer per agent/model combination: ``` - AI-assistant: OpenCode v1.0.203 (plan: Claude Opus 4.5, edit: Claude Sonnet 4.5) + Assisted-by: OpenCode:claude-opus-4-5 + Assisted-by: OpenCode:claude-sonnet-4-5 ``` - Pattern with roles: `AI-assistant: (: , : )` - ## Pull Requests - Include a short summary of what changed. *Example:* `fix: prevent crash on empty todo title`. @@ -169,15 +194,23 @@ Do not implement an explicit `isXxx(): bool` method on a class that extends `Ent Never build a `IQueryBuilder` query inside a loop. Construct the query once before the loop using `$qb->createParameter('name')` as a placeholder for the value that changes per iteration. Inside the loop call `$qb->setParameter('name', $value, IQueryBuilder::PARAM_*)` to bind the new value. This avoids re-parsing and re-compiling the query on every iteration. +IN clauses must be chunked to at most 1 000 items for Oracle compatibility. Use a named constant (`DB_CHUNK_SIZE = 1_000`) rather than a magic number. When collecting results across chunks, accumulate into an array and spread with `array_merge(...$results)` after the loop — never call `array_merge` inside a loop, as that rebuilds the array on every iteration. + ```php +private const DB_CHUNK_SIZE = 1_000; + +// ... + $qb = $this->db->getQueryBuilder(); $qb->select('*')->from($this->table) ->where($qb->expr()->in('node_id', $qb->createParameter('chunk'))); -foreach (array_chunk($ids, 997) as $chunk) { +$results = []; +foreach (array_chunk($ids, self::DB_CHUNK_SIZE) as $chunk) { $qb->setParameter('chunk', $chunk, IQueryBuilder::PARAM_INT_ARRAY); - // ... + $results[] = $this->findEntities($qb); } +return array_merge(...$results); ``` ### Unit tests for services with injected dependencies diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d1c19e3de..b8be5ec719 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,70 @@ # Changelog +## 2.2.0 + +### Added +* [Enhancement: Make tables import asynchronous (tables#1801)](https://github.com/nextcloud/tables/pull/1801) +* [📚❌ Add copy/delete row actions (tables#2456)](https://github.com/nextcloud/tables/pull/2456) +* [📦 Add all/filtered/selected CSV export actions (tables#2485)](https://github.com/nextcloud/tables/pull/2485) +* [Style(icon): Use outline variant (tables#2599)](https://github.com/nextcloud/tables/pull/2599) +* [🎨 Icons should be outline-variant where possible (tables#2672)](https://github.com/nextcloud/tables/pull/2672) + +### Fixed +* [Fix monochrome icon coloring for activities (tables#2675)](https://github.com/nextcloud/tables/pull/2675) +* [Fix: handle first option select (tables#2582)](https://github.com/nextcloud/tables/pull/2582) +* [Fix: Prevent editing when clicking on links in TableCellLink (tables#2587)](https://github.com/nextcloud/tables/pull/2587) +* [Fix: smartpicker fix row actions and action button z-index (tables#2679)](https://github.com/nextcloud/tables/pull/2679) +* [Fix: view filter (tables#2688)](https://github.com/nextcloud/tables/pull/2688) + +### Dependencies +* [Chore(deps): update actions/checkout action to v5.0.1 (main) (tables#2560)](https://github.com/nextcloud/tables/pull/2560) +* [Fix(deps): update dependency dompurify to ^3.4.2 (main) (tables#2565)](https://github.com/nextcloud/tables/pull/2565) +* [Fix(deps): update dependency @nextcloud/axios to ^2.6.0 (main) (tables#2566)](https://github.com/nextcloud/tables/pull/2566) +* [Chore(deps): update dependency cypress to ^15.14.2 (main) (tables#2584)](https://github.com/nextcloud/tables/pull/2584) +* [Chore(deps): update dependency cypress-vite to ^1.10.0 (main) (tables#2585)](https://github.com/nextcloud/tables/pull/2585) +* [Build(deps-dev): Bump @babel/plugin-transform-modules-systemjs from 7.28.5 to 7.29.4 (tables#2588)](https://github.com/nextcloud/tables/pull/2588) +* [[main] Update nextcloud/ocp dependency (tables#2589)](https://github.com/nextcloud/tables/pull/2589) +* [Fix(deps): update tiptap to ^3.22.5 (main) (tables#2591)](https://github.com/nextcloud/tables/pull/2591) +* [Fix(deps): update dependency @nextcloud/vue to ^8.38.0 (main) (tables#2592)](https://github.com/nextcloud/tables/pull/2592) +* [Chore(deps): update hmarr/auto-approve-action action to v4 (main) (tables#2600)](https://github.com/nextcloud/tables/pull/2600) +* [Chore(deps): update nextcloud/pr-feedback-action digest to 5227c55 (main) (tables#2604)](https://github.com/nextcloud/tables/pull/2604) +* [Chore(deps): update shivammathur/setup-php digest to 7c071df (main) (tables#2605)](https://github.com/nextcloud/tables/pull/2605) +* [Chore(deps): update dependency @rollup/rollup-linux-x64-gnu to ^4.60.3 (main) (tables#2606)](https://github.com/nextcloud/tables/pull/2606) +* [Chore(deps): update dependency staabm/annotate-pull-request-from-checkstyle to ^1.8.7 (main) (tables#2607)](https://github.com/nextcloud/tables/pull/2607) +* [Chore(deps): update dependency vite to ^7.3.3 (main) (tables#2608)](https://github.com/nextcloud/tables/pull/2608) +* [Chore(deps): update icewind1991/nextcloud-version-matrix action to v1.3.2 (main) (tables#2609)](https://github.com/nextcloud/tables/pull/2609) +* [Chore(deps): update actions/setup-node action to v6.4.0 (main) (tables#2610)](https://github.com/nextcloud/tables/pull/2610) +* [Chore(deps): update cypress-io/github-action action to v7.3.0 (main) (tables#2611)](https://github.com/nextcloud/tables/pull/2611) +* [Chore(deps): update shivammathur/setup-php action to v2.37.0 (main) (tables#2613)](https://github.com/nextcloud/tables/pull/2613) +* [Chore(deps): update actions/checkout action to v6 (main) (tables#2614)](https://github.com/nextcloud/tables/pull/2614) +* [Chore(deps): update actions/github-script action to v9 (main) (tables#2615)](https://github.com/nextcloud/tables/pull/2615) +* [Chore(deps): update actions/upload-artifact action to v7 (main) (tables#2616)](https://github.com/nextcloud/tables/pull/2616) +* [Chore(deps): update dorny/paths-filter action to v4 (main) (tables#2617)](https://github.com/nextcloud/tables/pull/2617) +* [Feat(deps): Add Nextcloud 35 support (tables#2651)](https://github.com/nextcloud/tables/pull/2651) +* [Chore(deps): update dependency @rollup/rollup-linux-x64-gnu to ^4.60.4 (main) (tables#2653)](https://github.com/nextcloud/tables/pull/2653) +* [Chore(deps): update shivammathur/setup-php action to v2.37.1 (main) (tables#2654)](https://github.com/nextcloud/tables/pull/2654) +* [Fix(deps): update dependency dompurify to ^3.4.3 (main) (tables#2655)](https://github.com/nextcloud/tables/pull/2655) +* [Fix(deps): update tiptap to ^3.23.2 (main) (tables#2656)](https://github.com/nextcloud/tables/pull/2656) +* [Chore(deps): update dependency cypress to ^15.15.0 (main) (tables#2657)](https://github.com/nextcloud/tables/pull/2657) +* [Chore: Sync lock file (tables#2662)](https://github.com/nextcloud/tables/pull/2662) +* [[main] Update nextcloud/ocp dependency (tables#2663)](https://github.com/nextcloud/tables/pull/2663) +* [Chore(deps): bump @nextcloud/vue from 8.38.0 to 8.39.0 (tables#2665)](https://github.com/nextcloud/tables/pull/2665) +* [Fix: Use UnknownActivityException (tables#2666)](https://github.com/nextcloud/tables/pull/2666) +* [Fix(deps): update dependency dompurify to ^3.4.5 (main) (tables#2673)](https://github.com/nextcloud/tables/pull/2673) +* [Chore(deps): update dependency @playwright/test to ^1.60.0 (main) (tables#2674)](https://github.com/nextcloud/tables/pull/2674) +* [Fix(deps): update tiptap to ^3.23.4 (main) (tables#2676)](https://github.com/nextcloud/tables/pull/2676) +* [Chore(deps): update dependency nextcloud/coding-standard to ^v1.5.0 (main) (tables#2677)](https://github.com/nextcloud/tables/pull/2677) +* [Fix(deps): update dependency @nextcloud/dialogs to ^7.4.0 (main) (tables#2678)](https://github.com/nextcloud/tables/pull/2678) +* [[main] Update nextcloud/ocp dependency (tables#2683)](https://github.com/nextcloud/tables/pull/2683) + +### Other +* [Ci: Sync actions with main repo (tables#2601)](https://github.com/nextcloud/tables/pull/2601) +* [Test(context): Update nav bar test for 34+ update (tables#2602)](https://github.com/nextcloud/tables/pull/2602) +* [Test(context): Update nav bar test for 34+ update (tables#2645)](https://github.com/nextcloud/tables/pull/2645) +* [Chore(CI): Adjust testing matrix for Nextcloud 34 on main (tables#2652)](https://github.com/nextcloud/tables/pull/2652) +* [Fix(workflows): update server versions to include stable34 in matrix (tables#2685)](https://github.com/nextcloud/tables/pull/2685) + ## 2.1.1 ### Added diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000000..43c994c2d3 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/REUSE.toml b/REUSE.toml index 13b3297281..f91618551c 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -77,7 +77,11 @@ precedence = "aggregate" SPDX-FileCopyrightText = "2024 Nextcloud GmbH and Nextcloud contributors" SPDX-License-Identifier = "AGPL-3.0-or-later" - +[[annotations]] +path = ["CLAUDE.md"] +precedence = "aggregate" +SPDX-FileCopyrightText = "2026 Nextcloud GmbH and Nextcloud contributors" +SPDX-License-Identifier = "AGPL-3.0-or-later" [[annotations]] path = ["cypress/styleguide/assets/img/filetypes/application-pdf.svg", "cypress/styleguide/assets/img/breadcrumb.svg", "cypress/styleguide/assets/img/filetypes/application.svg", "cypress/styleguide/assets/img/filetypes/audio.svg", "cypress/styleguide/assets/img/filetypes/file.svg", "cypress/styleguide/assets/img/filetypes/folder-drag-accept.svg", "cypress/styleguide/assets/img/filetypes/folder-encrypted.svg", "cypress/styleguide/assets/img/filetypes/folder-external.svg", "cypress/styleguide/assets/img/filetypes/folder-public.svg", "cypress/styleguide/assets/img/filetypes/folder-shared.svg", "cypress/styleguide/assets/img/filetypes/folder-starred.svg", "cypress/styleguide/assets/img/filetypes/folder.svg", "cypress/styleguide/assets/img/filetypes/image.svg", "cypress/styleguide/assets/img/filetypes/link.svg", "cypress/styleguide/assets/img/filetypes/location.svg", "cypress/styleguide/assets/img/filetypes/mindmap.svg", "cypress/styleguide/assets/img/filetypes/text-calendar.svg", "cypress/styleguide/assets/img/filetypes/text-code.svg", "cypress/styleguide/assets/img/filetypes/text-vcard.svg", "cypress/styleguide/assets/img/filetypes/text.svg", "cypress/styleguide/assets/img/filetypes/video.svg", "cypress/styleguide/assets/img/filetypes/x-office-document.svg", "cypress/styleguide/assets/img/filetypes/x-office-drawing.svg", "cypress/styleguide/assets/img/filetypes/x-office-form-template.svg", "cypress/styleguide/assets/img/filetypes/x-office-form.svg", "cypress/styleguide/assets/img/filetypes/x-office-presentation.svg", "cypress/styleguide/assets/img/filetypes/x-office-spreadsheet.svg", "cypress/styleguide/assets/img/places/calendar-dark.png", "cypress/styleguide/assets/img/places/calendar.png", "cypress/styleguide/assets/img/places/calendar.svg", "cypress/styleguide/assets/img/places/contacts-dark.png", "cypress/styleguide/assets/img/places/contacts.svg", "cypress/styleguide/assets/img/places/default-app-icon.svg", "cypress/styleguide/assets/img/places/files.svg", "cypress/styleguide/assets/img/places/home.svg", "cypress/styleguide/assets/img/places/link.svg", "cypress/styleguide/assets/img/places/music.svg", "cypress/styleguide/assets/img/places/picture.svg", "cypress/styleguide/assets/img/rating/s0.svg", "cypress/styleguide/assets/img/rating/s1.svg", "cypress/styleguide/assets/img/rating/s10.svg", "cypress/styleguide/assets/img/rating/s2.svg", "cypress/styleguide/assets/img/rating/s3.svg", "cypress/styleguide/assets/img/rating/s4.svg", "cypress/styleguide/assets/img/rating/s5.svg", "cypress/styleguide/assets/img/rating/s6.svg", "cypress/styleguide/assets/img/rating/s7.svg", "cypress/styleguide/assets/img/rating/s8.svg", "cypress/styleguide/assets/img/rating/s9.svg", "cypress/styleguide/assets/img/mail.svg", "cypress/styleguide/assets/img/rss.svg", "cypress/styleguide/assets/img/clients/desktop.svg", "cypress/styleguide/assets/img/clients/phone.svg", "cypress/styleguide/assets/img/clients/tablet.svg", "cypress/styleguide/assets/img/categories/auth.svg", "cypress/styleguide/assets/img/categories/bundles.svg", "cypress/styleguide/assets/img/categories/customization.svg", "cypress/styleguide/assets/img/categories/files.svg", "cypress/styleguide/assets/img/categories/games.svg", "cypress/styleguide/assets/img/categories/integration.svg", "cypress/styleguide/assets/img/categories/monitoring.svg", "cypress/styleguide/assets/img/categories/multimedia.svg", "cypress/styleguide/assets/img/categories/office.svg", "cypress/styleguide/assets/img/categories/organization.svg", "cypress/styleguide/assets/img/categories/social.svg", "cypress/styleguide/assets/img/categories/workflow.svg", "cypress/styleguide/assets/img/apps/circles.svg", "cypress/styleguide/assets/img/apps/notes.svg", "cypress/styleguide/assets/img/apps/richdocuments.svg", "cypress/styleguide/assets/img/caldav/attendees.png", "cypress/styleguide/assets/img/caldav/attendees.svg", "cypress/styleguide/assets/img/caldav/description.png", "cypress/styleguide/assets/img/caldav/description.svg", "cypress/styleguide/assets/img/caldav/link.png", "cypress/styleguide/assets/img/caldav/link.svg", "cypress/styleguide/assets/img/caldav/location.png", "cypress/styleguide/assets/img/caldav/location.svg", "cypress/styleguide/assets/img/caldav/organizer.png", "cypress/styleguide/assets/img/caldav/organizer.svg", "cypress/styleguide/assets/img/caldav/time.png", "cypress/styleguide/assets/img/caldav/time.svg", "cypress/styleguide/assets/img/caldav/title.png", "cypress/styleguide/assets/img/caldav/title.svg", "cypress/styleguide/assets/img/actions/add-folder-description.svg", "cypress/styleguide/assets/img/actions/add.svg", "cypress/styleguide/assets/img/actions/address.png", "cypress/styleguide/assets/img/actions/address.svg", "cypress/styleguide/assets/img/actions/alert-outline.svg", "cypress/styleguide/assets/img/actions/arrow-left.svg", "cypress/styleguide/assets/img/actions/arrow-right.svg", "cypress/styleguide/assets/img/actions/audio-off.svg", "cypress/styleguide/assets/img/actions/audio.svg", "cypress/styleguide/assets/img/actions/caret-white.svg", "cypress/styleguide/assets/img/actions/caret.svg", "cypress/styleguide/assets/img/actions/change.svg", "cypress/styleguide/assets/img/actions/clippy.svg", "cypress/styleguide/assets/img/actions/close.svg", "cypress/styleguide/assets/img/actions/comment.png", "cypress/styleguide/assets/img/actions/comment.svg", "cypress/styleguide/assets/img/actions/confirm-fade.svg", "cypress/styleguide/assets/img/actions/confirm-white.svg", "cypress/styleguide/assets/img/actions/confirm.svg", "cypress/styleguide/assets/img/actions/delete.png", "cypress/styleguide/assets/img/actions/delete.svg", "cypress/styleguide/assets/img/actions/details.svg", "cypress/styleguide/assets/img/actions/disabled-user.svg", "cypress/styleguide/assets/img/actions/disabled-users.svg", "cypress/styleguide/assets/img/actions/download.png", "cypress/styleguide/assets/img/actions/download.svg", "cypress/styleguide/assets/img/actions/edit.svg", "cypress/styleguide/assets/img/actions/error-white.svg", "cypress/styleguide/assets/img/actions/error.svg", "cypress/styleguide/assets/img/actions/external.svg", "cypress/styleguide/assets/img/actions/filter.svg", "cypress/styleguide/assets/img/actions/fullscreen.svg", "cypress/styleguide/assets/img/actions/group.svg", "cypress/styleguide/assets/img/actions/history.png", "cypress/styleguide/assets/img/actions/history.svg", "cypress/styleguide/assets/img/actions/info-white.svg", "cypress/styleguide/assets/img/actions/info.png", "cypress/styleguide/assets/img/actions/info.svg", "cypress/styleguide/assets/img/actions/logout.svg", "cypress/styleguide/assets/img/actions/mail.svg", "cypress/styleguide/assets/img/actions/menu-sidebar.svg", "cypress/styleguide/assets/img/actions/menu.svg", "cypress/styleguide/assets/img/actions/more-white.svg", "cypress/styleguide/assets/img/actions/more.png", "cypress/styleguide/assets/img/actions/more.svg", "cypress/styleguide/assets/img/actions/password-white.svg", "cypress/styleguide/assets/img/actions/password.png", "cypress/styleguide/assets/img/actions/password.svg", "cypress/styleguide/assets/img/actions/pause.svg", "cypress/styleguide/assets/img/actions/phone.svg", "cypress/styleguide/assets/img/actions/play-add.svg", "cypress/styleguide/assets/img/actions/play-next.svg", "cypress/styleguide/assets/img/actions/play-previous.svg", "cypress/styleguide/assets/img/actions/play.svg", "cypress/styleguide/assets/img/actions/profile.svg", "cypress/styleguide/assets/img/actions/projects.svg", "cypress/styleguide/assets/img/actions/public-white.svg", "cypress/styleguide/assets/img/actions/public.svg", "cypress/styleguide/assets/img/actions/quota.svg", "cypress/styleguide/assets/img/actions/recent.svg", "cypress/styleguide/assets/img/actions/rename.svg", "cypress/styleguide/assets/img/actions/screen-off.svg", "cypress/styleguide/assets/img/actions/screen.svg", "cypress/styleguide/assets/img/actions/search.svg", "cypress/styleguide/assets/img/actions/settings-dark.svg", "cypress/styleguide/assets/img/actions/settings.svg", "cypress/styleguide/assets/img/actions/share.png", "cypress/styleguide/assets/img/actions/share.svg", "cypress/styleguide/assets/img/actions/shared.svg", "cypress/styleguide/assets/img/actions/sound-off.svg", "cypress/styleguide/assets/img/actions/sound.svg", "cypress/styleguide/assets/img/actions/star-dark.svg", "cypress/styleguide/assets/img/actions/star.png", "cypress/styleguide/assets/img/actions/star.svg", "cypress/styleguide/assets/img/actions/starred.png", "cypress/styleguide/assets/img/actions/starred.svg", "cypress/styleguide/assets/img/actions/tag.png", "cypress/styleguide/assets/img/actions/tag.svg", "cypress/styleguide/assets/img/actions/template-add.svg", "cypress/styleguide/assets/img/actions/timezone.svg", "cypress/styleguide/assets/img/actions/toggle-background.svg", "cypress/styleguide/assets/img/actions/toggle-filelist.svg", "cypress/styleguide/assets/img/actions/toggle-pictures.svg", "cypress/styleguide/assets/img/actions/toggle.svg", "cypress/styleguide/assets/img/actions/triangle-e.svg", "cypress/styleguide/assets/img/actions/triangle-n.svg", "cypress/styleguide/assets/img/actions/triangle-s.svg", "cypress/styleguide/assets/img/actions/unshare.svg", "cypress/styleguide/assets/img/actions/upload.svg", "cypress/styleguide/assets/img/actions/user-admin.svg", "cypress/styleguide/assets/img/actions/user.svg", "cypress/styleguide/assets/img/actions/verified.svg", "cypress/styleguide/assets/img/actions/verify.svg", "cypress/styleguide/assets/img/actions/verifying.svg", "cypress/styleguide/assets/img/actions/video-off.svg", "cypress/styleguide/assets/img/actions/video-switch.svg", "cypress/styleguide/assets/img/actions/video.svg", "cypress/styleguide/assets/img/actions/view-close.svg", "cypress/styleguide/assets/img/actions/view-download.svg", "cypress/styleguide/assets/img/actions/view-next.svg", "cypress/styleguide/assets/img/actions/view-pause.svg", "cypress/styleguide/assets/img/actions/view-play.svg", "cypress/styleguide/assets/img/actions/view-previous.svg", "cypress/styleguide/assets/img/places/contacts-dark.png", "cypress/styleguide/assets/img/places/contacts.svg"] diff --git a/appinfo/info.xml b/appinfo/info.xml index e1f28be62a..4f05ced258 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -26,9 +26,9 @@ Share your tables and views with users and groups within your cloud. Have a good time and manage whatever you want. ]]> - 2.1.1 + 2.2.0 AGPL-3.0-or-later - Florian Steffens + Nextcloud GmbH and Nextcloud contributors Tables https://github.com/nextcloud/tables/wiki @@ -48,7 +48,7 @@ Have a good time and manage whatever you want. pgsql mysql sqlite - + diff --git a/appinfo/routes.php b/appinfo/routes.php index c8046c0e9c..62aadd02c4 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -7,7 +7,6 @@ return [ 'routes' => [ - // enable CORS for api calls ['name' => 'api1#preflighted_cors', 'url' => '/api/1/{path}', 'verb' => 'OPTIONS', 'requirements' => ['path' => '.+']], @@ -51,6 +50,9 @@ ['name' => 'api1#updateColumn', 'url' => '/api/1/columns/{columnId}', 'verb' => 'PUT'], ['name' => 'api1#getColumn', 'url' => '/api/1/columns/{columnId}', 'verb' => 'GET'], ['name' => 'api1#deleteColumn', 'url' => '/api/1/columns/{columnId}', 'verb' => 'DELETE'], + // -> relations + ['name' => 'api1#indexTableRelations', 'url' => '/api/1/tables/{tableId}/relations', 'verb' => 'GET'], + ['name' => 'api1#indexViewRelations', 'url' => '/api/1/views/{viewId}/relations', 'verb' => 'GET'], // -> rows ['name' => 'api1#indexTableRowsSimple', 'url' => '/api/1/tables/{tableId}/rows/simple', 'verb' => 'GET'], ['name' => 'api1#indexTableRows', 'url' => '/api/1/tables/{tableId}/rows', 'verb' => 'GET'], diff --git a/composer.json b/composer.json index 8027ec74f6..28c2f55eca 100644 --- a/composer.json +++ b/composer.json @@ -2,11 +2,10 @@ "name": "nextcloud/tables", "description": "This app is for managing data in tables.", "type": "project", - "license": "AGPL", + "license": "AGPL-3.0-or-later", "authors": [ { - "name": "Florian Steffens", - "email": "florian@nextcloud.com" + "name": "Nextcloud GmbH and Nextcloud contributors" } ], "autoload": { @@ -15,9 +14,9 @@ } }, "require-dev": { - "nextcloud/coding-standard": "^v1.4.0", + "nextcloud/coding-standard": "^v1.5.0", "nextcloud/ocp": "dev-stable33", - "staabm/annotate-pull-request-from-checkstyle": "^1.8.6", + "staabm/annotate-pull-request-from-checkstyle": "^1.8.7", "phpunit/phpunit": "9.6.34", "psalm/phar": "^5.26.1" }, @@ -25,7 +24,7 @@ "optimize-autoloader": true, "classmap-authoritative": true, "platform": { - "php": "8.1" + "php": "8.2" }, "allow-plugins": { "bamarni/composer-bin-plugin": true diff --git a/composer.lock b/composer.lock index a146c82093..8a83391b95 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7808429ea67da7d828c139cecd69fe00", + "content-hash": "46861b4f8ab5cf979b0b581545a099c5", "packages": [ { "name": "bamarni/composer-bin-plugin", @@ -144,31 +144,32 @@ }, { "name": "maennchen/zipstream-php", - "version": "3.1.1", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "6187e9cc4493da94b9b63eb2315821552015fca9" + "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/6187e9cc4493da94b9b63eb2315821552015fca9", - "reference": "6187e9cc4493da94b9b63eb2315821552015fca9", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/aeadcf5c412332eb426c0f9b4485f6accba2a99f", + "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f", "shasum": "" }, "require": { "ext-mbstring": "*", "ext-zlib": "*", - "php-64bit": "^8.1" + "php-64bit": "^8.2" }, "require-dev": { + "brianium/paratest": "^7.7", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.16", "guzzlehttp/guzzle": "^7.5", "mikey179/vfsstream": "^1.6", "php-coveralls/php-coveralls": "^2.5", - "phpunit/phpunit": "^10.0", - "vimeo/psalm": "^5.0" + "phpunit/phpunit": "^11.0", + "vimeo/psalm": "^6.0" }, "suggest": { "guzzlehttp/psr7": "^2.4", @@ -209,7 +210,7 @@ ], "support": { "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.1" + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.2" }, "funding": [ { @@ -217,7 +218,7 @@ "type": "github" } ], - "time": "2024-10-10T12:33:01+00:00" + "time": "2025-01-27T12:07:53+00:00" }, { "name": "markbaker/complex", @@ -328,16 +329,16 @@ }, { "name": "phpoffice/phpspreadsheet", - "version": "5.3.0", + "version": "5.7.0", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "4d597c1aacdde1805a33c525b9758113ea0d90df" + "reference": "9f55d3b9b7bcb1084fda8340e4b7ce4ed10cd0c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/4d597c1aacdde1805a33c525b9758113ea0d90df", - "reference": "4d597c1aacdde1805a33c525b9758113ea0d90df", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/9f55d3b9b7bcb1084fda8340e4b7ce4ed10cd0c8", + "reference": "9f55d3b9b7bcb1084fda8340e4b7ce4ed10cd0c8", "shasum": "" }, "require": { @@ -345,6 +346,7 @@ "ext-ctype": "*", "ext-dom": "*", "ext-fileinfo": "*", + "ext-filter": "*", "ext-gd": "*", "ext-iconv": "*", "ext-libxml": "*", @@ -359,13 +361,12 @@ "markbaker/complex": "^3.0", "markbaker/matrix": "^3.0", "php": "^8.1", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "dev-main", "dompdf/dompdf": "^2.0 || ^3.0", + "ext-intl": "*", "friendsofphp/php-cs-fixer": "^3.2", "mitoteam/jpgraph": "^10.5", "mpdf/mpdf": "^8.1.1", @@ -379,7 +380,7 @@ }, "suggest": { "dompdf/dompdf": "Option for rendering PDF with PDF Writer", - "ext-intl": "PHP Internationalization Functions, required for NumberFormat Wizard", + "ext-intl": "PHP Internationalization Functions, required for NumberFormat Wizard and StringHelper::setLocale()", "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", "mpdf/mpdf": "Option for rendering PDF with PDF Writer", "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" @@ -412,6 +413,9 @@ }, { "name": "Adrien Crivelli" + }, + { + "name": "Owen Leibman" } ], "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", @@ -428,169 +432,9 @@ ], "support": { "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/5.3.0" - }, - "time": "2025-11-24T15:47:10+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory" - }, - "time": "2024-04-15T12:06:14+00:00" - }, - { - "name": "psr/http-message", - "version": "2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/5.7.0" }, - "time": "2023-04-04T09:54:51+00:00" + "time": "2026-04-20T02:42:17+00:00" }, { "name": "psr/simple-cache", @@ -717,16 +561,16 @@ }, { "name": "kubawerlos/php-cs-fixer-custom-fixers", - "version": "v3.35.1", + "version": "v3.37.1", "source": { "type": "git", "url": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers.git", - "reference": "2a35f80ae24ca77443a7af1599c3a3db1b6bd395" + "reference": "e0ec1f602a1d0836909e9079262dbaf58eaf3804" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kubawerlos/php-cs-fixer-custom-fixers/zipball/2a35f80ae24ca77443a7af1599c3a3db1b6bd395", - "reference": "2a35f80ae24ca77443a7af1599c3a3db1b6bd395", + "url": "https://api.github.com/repos/kubawerlos/php-cs-fixer-custom-fixers/zipball/e0ec1f602a1d0836909e9079262dbaf58eaf3804", + "reference": "e0ec1f602a1d0836909e9079262dbaf58eaf3804", "shasum": "" }, "require": { @@ -736,7 +580,7 @@ "php": "^7.4 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^9.6.24 || ^10.5.51 || ^11.5.32" + "phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.55" }, "type": "library", "autoload": { @@ -757,7 +601,7 @@ "description": "A set of custom fixers for PHP CS Fixer", "support": { "issues": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/issues", - "source": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/tree/v3.35.1" + "source": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/tree/v3.37.1" }, "funding": [ { @@ -765,7 +609,7 @@ "type": "github" } ], - "time": "2025-09-28T18:43:35+00:00" + "time": "2026-04-28T16:41:56+00:00" }, { "name": "myclabs/deep-copy", @@ -829,16 +673,16 @@ }, { "name": "nextcloud/coding-standard", - "version": "v1.4.0", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/nextcloud/coding-standard.git", - "reference": "8e06808c1423e9208d63d1bd205b9a38bd400011" + "reference": "80547a93236fbb9c783e05f0f0899043851b0dba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nextcloud/coding-standard/zipball/8e06808c1423e9208d63d1bd205b9a38bd400011", - "reference": "8e06808c1423e9208d63d1bd205b9a38bd400011", + "url": "https://api.github.com/repos/nextcloud/coding-standard/zipball/80547a93236fbb9c783e05f0f0899043851b0dba", + "reference": "80547a93236fbb9c783e05f0f0899043851b0dba", "shasum": "" }, "require": { @@ -868,9 +712,9 @@ ], "support": { "issues": "https://github.com/nextcloud/coding-standard/issues", - "source": "https://github.com/nextcloud/coding-standard/tree/v1.4.0" + "source": "https://github.com/nextcloud/coding-standard/tree/v1.5.0" }, - "time": "2025-06-19T12:27:27+00:00" + "time": "2026-05-19T18:30:09+00:00" }, { "name": "nextcloud/ocp", @@ -878,16 +722,16 @@ "source": { "type": "git", "url": "https://github.com/nextcloud-deps/ocp.git", - "reference": "cc85b9dcf0236ff8c3acbe9a62dfd511c6ee5ea6" + "reference": "084aa73a1b73a2eacb7c4d75897f8aa52e8ecb71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/cc85b9dcf0236ff8c3acbe9a62dfd511c6ee5ea6", - "reference": "cc85b9dcf0236ff8c3acbe9a62dfd511c6ee5ea6", + "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/084aa73a1b73a2eacb7c4d75897f8aa52e8ecb71", + "reference": "084aa73a1b73a2eacb7c4d75897f8aa52e8ecb71", "shasum": "" }, "require": { - "php": "~8.1 || ~8.2 || ~8.3 || ~8.4 || ~8.5", + "php": "~8.2 || ~8.3 || ~8.4 || ~8.5", "psr/clock": "^1.0", "psr/container": "^2.0.2", "psr/event-dispatcher": "^1.0", @@ -918,7 +762,7 @@ "issues": "https://github.com/nextcloud-deps/ocp/issues", "source": "https://github.com/nextcloud-deps/ocp/tree/stable33" }, - "time": "2026-04-29T01:55:59+00:00" + "time": "2026-06-27T02:06:20+00:00" }, { "name": "nikic/php-parser", @@ -1098,16 +942,16 @@ }, { "name": "php-cs-fixer/shim", - "version": "v3.92.5", + "version": "v3.95.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/shim.git", - "reference": "b13b4ad0a1daa80cf036c70488e86516928a5af0" + "reference": "f81ccf51ca60cc9dd21358ffba0e79ebd2ebb78a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/b13b4ad0a1daa80cf036c70488e86516928a5af0", - "reference": "b13b4ad0a1daa80cf036c70488e86516928a5af0", + "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/f81ccf51ca60cc9dd21358ffba0e79ebd2ebb78a", + "reference": "f81ccf51ca60cc9dd21358ffba0e79ebd2ebb78a", "shasum": "" }, "require": { @@ -1144,9 +988,9 @@ "description": "A tool to automatically fix PHP code style", "support": { "issues": "https://github.com/PHP-CS-Fixer/shim/issues", - "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.92.5" + "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.95.1" }, - "time": "2026-01-08T21:58:02+00:00" + "time": "2026-04-12T17:00:34+00:00" }, { "name": "phpunit/php-code-coverage", @@ -2827,16 +2671,16 @@ }, { "name": "staabm/annotate-pull-request-from-checkstyle", - "version": "1.8.6", + "version": "1.8.7", "source": { "type": "git", "url": "https://github.com/staabm/annotate-pull-request-from-checkstyle.git", - "reference": "5072e6827aab0a287528b971e6b8e986b20be41c" + "reference": "9cab4b00e2f2e86dc54fb88e2a1b4bf15443d6dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/staabm/annotate-pull-request-from-checkstyle/zipball/5072e6827aab0a287528b971e6b8e986b20be41c", - "reference": "5072e6827aab0a287528b971e6b8e986b20be41c", + "url": "https://api.github.com/repos/staabm/annotate-pull-request-from-checkstyle/zipball/9cab4b00e2f2e86dc54fb88e2a1b4bf15443d6dd", + "reference": "9cab4b00e2f2e86dc54fb88e2a1b4bf15443d6dd", "shasum": "" }, "require": { @@ -2867,7 +2711,7 @@ ], "support": { "issues": "https://github.com/staabm/annotate-pull-request-from-checkstyle/issues", - "source": "https://github.com/staabm/annotate-pull-request-from-checkstyle/tree/1.8.6" + "source": "https://github.com/staabm/annotate-pull-request-from-checkstyle/tree/1.8.7" }, "funding": [ { @@ -2875,7 +2719,7 @@ "type": "github" } ], - "time": "2025-09-17T05:20:34+00:00" + "time": "2026-05-05T12:33:44+00:00" }, { "name": "theseer/tokenizer", @@ -2940,7 +2784,7 @@ }, "platform-dev": {}, "platform-overrides": { - "php": "8.1" + "php": "8.2" }, "plugin-api-version": "2.9.0" } diff --git a/cypress/component/ContentReferenceWidget.cy.js b/cypress/component/ContentReferenceWidget.cy.js index acd16c04d5..e30dd45360 100644 --- a/cypress/component/ContentReferenceWidget.cy.js +++ b/cypress/component/ContentReferenceWidget.cy.js @@ -47,8 +47,12 @@ describe('ContentReferenceWidget', () => { // Load a fixture used to reply to the create row request cy.fixture('widgets/createRow.json') .then((rowData) => { - cy.reply('**/ocs/v2.php/apps/tables/api/2/tables/*/rows', rowData) - + cy.reply('**/ocs/v2.php/apps/tables/api/2/tables/*/rows', { + ocs: { + data: rowData, + }, + }) + // Also mock the reload rows endpoint to return updated rows including the new one const updatedRows = [...richObject.rows, rowData] cy.reply('**/apps/tables/row/table/*', updatedRows) @@ -78,10 +82,14 @@ describe('ContentReferenceWidget', () => { cy.fixture('widgets/editRow.json') .then((rowData) => { cy.reply('**/index.php/apps/tables/row/*', rowData) + + const updatedRows = richObject.rows.map(row => row.id === rowData.id ? rowData : row) + cy.reply('**/apps/tables/row/table/*', updatedRows) }) - // Click the edit button on the first row - cy.get('@rows').first().find('td.sticky button').click({ force: true }) + // Open the row action menu on the first row, then click Edit + cy.get('@rows').first().find('[data-cy="rowActionMenu"] button').click({ force: true }) + cy.get('[data-cy="editRowBtn"]').click() // Get the first field of the Edit Row modal cy.get('.modal__content').as('editRowModal') diff --git a/cypress/e2e/context-navigation-hidden.cy.js b/cypress/e2e/context-navigation-hidden.cy.js index 94970d7c72..721f1d5ae2 100644 --- a/cypress/e2e/context-navigation-hidden.cy.js +++ b/cypress/e2e/context-navigation-hidden.cy.js @@ -22,12 +22,12 @@ describe('Test context navigation hidden context', () => { it('Create context that is hidden in nav by default', () => { cy.createContext(contextTitle, false) cy.visit('apps/tables') - cy.get(`#header .app-menu-entry [title="${contextTitle}"]`).should('not.exist') + cy.getAppMenuEntry(contextTitle).should('not.exist') cy.get(`[data-cy="navigationContextItem"]:contains("${contextTitle}")`).find('button').click({ force: true }) cy.get('[data-cy="navigationContextShowInNavSwitch"] input').should('not.be.checked') cy.get('[data-cy="navigationContextShowInNavSwitch"] input').click({ force: true }) cy.get('[data-cy="navigationContextShowInNavSwitch"] input').should('be.checked') - cy.get(`#header .app-menu-entry [title="${contextTitle}"]`).should('exist') + cy.getAppMenuEntry(contextTitle).should('exist') }) }) diff --git a/cypress/e2e/context-navigation-shared.cy.js b/cypress/e2e/context-navigation-shared.cy.js index 1033b34cbc..aff231ccc1 100644 --- a/cypress/e2e/context-navigation-shared.cy.js +++ b/cypress/e2e/context-navigation-shared.cy.js @@ -28,7 +28,14 @@ describe('Test context navigation shared context', () => { cy.createContext(contextTitle, true) cy.visit('apps/tables') - cy.get(`#header .app-menu-entry [title="${contextTitle}"]`).should('exist') + cy.getAppMenuEntry(contextTitle).should('exist') + + // Close the app-menu waffle popover so it doesn't cover the context title + cy.get('body').then($body => { + if ($body.find('.app-menu__waffle[aria-expanded="true"]').length > 0) { + cy.get('.app-menu__waffle').click() + } + }) cy.loadContext(contextTitle) cy.get('[data-cy="context-title"]').should('be.visible') @@ -42,10 +49,10 @@ describe('Test context navigation shared context', () => { cy.get('[data-cy="navigationContextShowInNavSwitch"] input').should('be.checked') cy.get('[data-cy="navigationContextShowInNavSwitch"] input').click({ force: true }) cy.get('[data-cy="navigationContextShowInNavSwitch"] input').should('not.be.checked') - cy.get(`#header .app-menu-entry [title="${contextTitle}"]`).should('not.exist') + cy.getAppMenuEntry(contextTitle).should('not.exist') cy.login(nonLocalUser) cy.visit('apps/tables') - cy.get(`#header .app-menu-entry [title="${contextTitle}"]`).should('exist') + cy.getAppMenuEntry(contextTitle).should('exist') }) }) diff --git a/cypress/e2e/helpers/viewFilteringSelectionSetup.js b/cypress/e2e/helpers/viewFilteringSelectionSetup.js index 43d6d1534c..160e368b2c 100644 --- a/cypress/e2e/helpers/viewFilteringSelectionSetup.js +++ b/cypress/e2e/helpers/viewFilteringSelectionSetup.js @@ -81,6 +81,7 @@ const addRow = (title, selection, multiSelection, checked) => { cy.get('[data-cy="createRowSaveButton"]').click() cy.get('[data-cy="createRowModal"]').should('not.exist') - cy.get('.toastify.toast-success').should('be.visible') - cy.get('.toastify.toast-success .toast-close').click({ multiple: true }) + cy.get('body').then($body => { + $body.find('.toastify.toast-success .toast-close').each((_, el) => el.click()) + }) } diff --git a/cypress/e2e/tables-import.cy.js b/cypress/e2e/tables-import.cy.js index d98e280514..e9621399fe 100644 --- a/cypress/e2e/tables-import.cy.js +++ b/cypress/e2e/tables-import.cy.js @@ -165,6 +165,9 @@ describe('Import csv from Files file action', () => { cy.login(localUser) cy.uploadFile('test-import-small.csv', 'text/csv') cy.uploadFile('test-import-large.csv', 'text/csv') + cy.visit('apps/tables') + cy.get('[data-cy="navigationTableItem"] a[title="Welcome to Nextcloud Tables!"]', { timeout: 20000 }) + .should('exist') }) }) @@ -209,7 +212,9 @@ describe('Import csv from Files file action', () => { cy.get('.modal__content [data-cy="importAsNewTableSwitch"] input').uncheck({ force: true }) cy.get('[data-cy="selectExistingTableDropdown"]').type('Welcome to Nextcloud Tables!') - cy.get('.name-parts').click() + cy.get('.vs__dropdown-menu li') + .contains('Welcome to Nextcloud Tables!', { timeout: 20000 }) + .click() cy.intercept({ method: 'POST', diff --git a/cypress/e2e/view-filtering-selection-row-removal.cy.js b/cypress/e2e/view-filtering-selection-row-removal.cy.js index c9a75ac971..b927251ce5 100644 --- a/cypress/e2e/view-filtering-selection-row-removal.cy.js +++ b/cypress/e2e/view-filtering-selection-row-removal.cy.js @@ -22,16 +22,19 @@ describe('Filtering view with row removal', () => { it('Removes rows from the filtered view once they no longer match', () => { cy.intercept({ method: 'PUT', url: '**/apps/tables/row/*' }).as('updateCheckedRow') - cy.contains('[data-cy="ncTable"] [data-cy="customTableRow"]', 'first row').closest('[data-cy="customTableRow"]').find('[data-cy="editRowBtn"]').click() + cy.contains('[data-cy="ncTable"] [data-cy="customTableRow"]', 'first row').closest('[data-cy="customTableRow"]').find('[data-cy="rowActionMenu"] button').click() + cy.get('[data-cy="editRowBtn"]').click() cy.get('[data-cy="editRowModal"] .checkbox-radio-switch').click() cy.get('[data-cy="editRowSaveButton"]').click() cy.wait('@updateCheckedRow') - cy.contains('[data-cy="ncTable"] [data-cy="customTableRow"]', 'first row').should('not.exist') + // Wait for the row to be removed from the filtered view (async removal) + cy.contains('[data-cy="ncTable"] [data-cy="customTableRow"]', 'first row', { timeout: 8000 }).should('not.exist') cy.get('[data-cy="editRowModal"]').should('not.exist') cy.intercept({ method: 'PUT', url: '**/apps/tables/row/*' }).as('inlineUpdateRow') cy.contains('[data-cy="ncTable"] [data-cy="customTableRow"]', 'second row').closest('[data-cy="customTableRow"]').find('.inline-editing-container input').click({ force: true }) cy.wait('@inlineUpdateRow') - cy.contains('[data-cy="ncTable"] [data-cy="customTableRow"]', 'second row').should('not.exist') + // Wait for the row to be removed from the filtered view (async removal) + cy.contains('[data-cy="ncTable"] [data-cy="customTableRow"]', 'second row', { timeout: 8000 }).should('not.exist') }) }) diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 9a06d3bd14..d09919a8b3 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -172,7 +172,7 @@ Cypress.Commands.add('openContextEditModal', (title) => { Cypress.Commands.add('clickOnTableThreeDotMenu', (optionName) => { cy.get('[data-cy="customTableAction"] button').click() - cy.get('[data-cy="dataTableExportBtn"]').contains(optionName).click({ force: true }) + cy.get('.v-popper__popper button, [role="menuitem"]').contains(optionName).click({ force: true }) }) Cypress.Commands.add('sortTableColumn', (columnTitle, mode = 'ASC') => { @@ -479,6 +479,21 @@ Cypress.Commands.add('uploadFile', (fileName, mimeType, target) => { }) }) +Cypress.Commands.add('getAppMenuEntry', (title) => { + return cy.get('body').then($body => { + if ($body.find('.app-menu__waffle').length > 0) { + // NC34+: open the waffle popover if not already open, then check the grid + return cy.get('.app-menu__waffle').then($btn => { + if ($btn.attr('aria-expanded') !== 'true') { + return cy.wrap($btn).click() + } + }).then(() => cy.get(`.app-menu__grid .app-item[title="${title}"]`)) + } + // NC33: entries are always visible inline in the header + return cy.get(`#header .app-menu-entry [title="${title}"]`) + }) +}) + Cypress.Commands.add('ocsRequest', (user, options) => { const auth = { user: user.userId, password: user.password } return cy.request({ diff --git a/l10n/af.js b/l10n/af.js index 01a2f26e48..20d3da168c 100644 --- a/l10n/af.js +++ b/l10n/af.js @@ -38,6 +38,7 @@ OC.L10N.register( "Submit" : "Dien in", "Cancel" : "Kanselleer", "Delete" : "Skrap", + "Close" : "Close", "Please select a file." : "Kies asb. ’n lêer.", "Select from Files" : "Kies uit Lêers", "Filter" : "Filter", diff --git a/l10n/af.json b/l10n/af.json index a8a153f83c..d4fd9f41a1 100644 --- a/l10n/af.json +++ b/l10n/af.json @@ -36,6 +36,7 @@ "Submit" : "Dien in", "Cancel" : "Kanselleer", "Delete" : "Skrap", + "Close" : "Close", "Please select a file." : "Kies asb. ’n lêer.", "Select from Files" : "Kies uit Lêers", "Filter" : "Filter", diff --git a/l10n/ar.js b/l10n/ar.js index c20f8155e5..2383734fef 100644 --- a/l10n/ar.js +++ b/l10n/ar.js @@ -9,6 +9,7 @@ OC.L10N.register( "Timestamp of data load" : "الختم الزمني Timestamp لحِمل البيانات", "No" : "لا", "Yes" : "نعم", + "Count" : "عدّاد", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "حدث خطأ غير متوقع. تفاصيل أكثر يمكن الاطلاع عليها في سجل الحركات. تواصل رجاءً مع مشرف النظام عندك.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "حدث خطأ بسبب عدم كفاية الأذونات. تفاصيل أكثر يمكن الاطلاع عليها في سجل الحركات. تواصل رجاءً مع مشرف النظام عندك.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "حدث خطأ في إيجاد المطلوب. تفاصيل أكثر يمكن الاطلاع عليها في سجل الحركات. تواصل رجاءً مع مشرف النظام عندك.", @@ -194,7 +195,6 @@ OC.L10N.register( "Edit table" : "تعديل جدول", "Create column" : "إنشاء عمود", "Import" : "إدخال", - "Export as CSV" : "صدِّر كـ CSV", "Filtered view" : "منظور مُفلتَر", "Reset local adjustments" : "أعِد تعيين التضبيطات المحلية", "No columns" : "لا توجد أعمدة", @@ -513,7 +513,6 @@ OC.L10N.register( "Show fullscreen" : "عرض ملء الشاشة", "Close editor" : "أغلِق المُحرِّر", "Create Row" : "إنشاء سطر", - "Export CSV" : "صدِّر CSV", "Uncheck all" : "إلغاء تحديد الكل", "_%n selected row_::_%n selected rows_" : ["%n أعمدة محددة","%n عمود محدد","%n أعمدة محددة","%n أعمدة محددة","%n أعمدة محددة","%n أعمدة محددة"], "Go to first page" : "إنتقِل إلى الصفحة الأولى", diff --git a/l10n/ar.json b/l10n/ar.json index 4378d0030a..fe6f866106 100644 --- a/l10n/ar.json +++ b/l10n/ar.json @@ -7,6 +7,7 @@ "Timestamp of data load" : "الختم الزمني Timestamp لحِمل البيانات", "No" : "لا", "Yes" : "نعم", + "Count" : "عدّاد", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "حدث خطأ غير متوقع. تفاصيل أكثر يمكن الاطلاع عليها في سجل الحركات. تواصل رجاءً مع مشرف النظام عندك.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "حدث خطأ بسبب عدم كفاية الأذونات. تفاصيل أكثر يمكن الاطلاع عليها في سجل الحركات. تواصل رجاءً مع مشرف النظام عندك.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "حدث خطأ في إيجاد المطلوب. تفاصيل أكثر يمكن الاطلاع عليها في سجل الحركات. تواصل رجاءً مع مشرف النظام عندك.", @@ -192,7 +193,6 @@ "Edit table" : "تعديل جدول", "Create column" : "إنشاء عمود", "Import" : "إدخال", - "Export as CSV" : "صدِّر كـ CSV", "Filtered view" : "منظور مُفلتَر", "Reset local adjustments" : "أعِد تعيين التضبيطات المحلية", "No columns" : "لا توجد أعمدة", @@ -511,7 +511,6 @@ "Show fullscreen" : "عرض ملء الشاشة", "Close editor" : "أغلِق المُحرِّر", "Create Row" : "إنشاء سطر", - "Export CSV" : "صدِّر CSV", "Uncheck all" : "إلغاء تحديد الكل", "_%n selected row_::_%n selected rows_" : ["%n أعمدة محددة","%n عمود محدد","%n أعمدة محددة","%n أعمدة محددة","%n أعمدة محددة","%n أعمدة محددة"], "Go to first page" : "إنتقِل إلى الصفحة الأولى", diff --git a/l10n/be.js b/l10n/be.js index 0bc30eaf14..e932858703 100644 --- a/l10n/be.js +++ b/l10n/be.js @@ -123,7 +123,6 @@ OC.L10N.register( "Edit table" : "Рэдагаваць табліцу", "Create column" : "Стварыць слупок", "Import" : "Імпарт", - "Export as CSV" : "Экспарт у CSV", "No columns" : "Няма слупкоў", "Please insert a title for the new column." : "Увядзіце загаловак новага слупка.", "Cannot save column. Column width must be between {min} and {max}." : "Немагчыма захаваць слупок. Шырыня слупка павінна быць паміж {min} і {max}.", @@ -274,7 +273,6 @@ OC.L10N.register( "Open link" : "Адкрыць спасылку", "Close editor" : "Закрыць рэдактар", "Create Row" : "Стварыць радок", - "Export CSV" : "Экспарт CSV", "Page number" : "Нумар старонкі", "Confirmation" : "Пацвярджэнне", "Confirm" : "Пацвердзіць", diff --git a/l10n/be.json b/l10n/be.json index 09675f4bb7..053dc79324 100644 --- a/l10n/be.json +++ b/l10n/be.json @@ -121,7 +121,6 @@ "Edit table" : "Рэдагаваць табліцу", "Create column" : "Стварыць слупок", "Import" : "Імпарт", - "Export as CSV" : "Экспарт у CSV", "No columns" : "Няма слупкоў", "Please insert a title for the new column." : "Увядзіце загаловак новага слупка.", "Cannot save column. Column width must be between {min} and {max}." : "Немагчыма захаваць слупок. Шырыня слупка павінна быць паміж {min} і {max}.", @@ -272,7 +271,6 @@ "Open link" : "Адкрыць спасылку", "Close editor" : "Закрыць рэдактар", "Create Row" : "Стварыць радок", - "Export CSV" : "Экспарт CSV", "Page number" : "Нумар старонкі", "Confirmation" : "Пацвярджэнне", "Confirm" : "Пацвердзіць", diff --git a/l10n/bg.js b/l10n/bg.js index 0013d9e9b7..aaedcd7348 100644 --- a/l10n/bg.js +++ b/l10n/bg.js @@ -8,6 +8,7 @@ OC.L10N.register( "Timestamp of data load" : "Печат за време на зареждането на данни", "No" : "Не", "Yes" : "Да", + "Count" : "Брой", "Could not update row." : "Редът не можа да се актуализира.", "The file was uploaded" : "Файлът е качен", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Размерът на каченият файл надвишава директивата upload_max_filesize в php.ini", @@ -149,7 +150,6 @@ OC.L10N.register( "Edit table" : "Редактиране на таблица", "Create column" : "Създаване на колона", "Import" : "Импортиране /внасяне/", - "Export as CSV" : "Експортиране като CSV файл", "No columns" : "Без колони", "We need at least one column, please be so kind and create one." : "Необходима ни е поне една колона, моля, бъдете така любезни и я създайте.", "Please insert a title for the new column." : "Моля, въведете заглавие на новата колона.", @@ -299,7 +299,6 @@ OC.L10N.register( "This field is mandatory" : "Това поле е задължително", "Copy link" : "Копиране на връзката", "Close editor" : "Затваряне на редактора", - "Export CSV" : "Експортиране на CSV файл", "_%n selected row_::_%n selected rows_" : ["%n избрани редове","%n избрани редове"], "Confirmation" : "Потвърждение", "Confirm" : "Потвърдете", diff --git a/l10n/bg.json b/l10n/bg.json index 4fd8da5062..d6ec984230 100644 --- a/l10n/bg.json +++ b/l10n/bg.json @@ -6,6 +6,7 @@ "Timestamp of data load" : "Печат за време на зареждането на данни", "No" : "Не", "Yes" : "Да", + "Count" : "Брой", "Could not update row." : "Редът не можа да се актуализира.", "The file was uploaded" : "Файлът е качен", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Размерът на каченият файл надвишава директивата upload_max_filesize в php.ini", @@ -147,7 +148,6 @@ "Edit table" : "Редактиране на таблица", "Create column" : "Създаване на колона", "Import" : "Импортиране /внасяне/", - "Export as CSV" : "Експортиране като CSV файл", "No columns" : "Без колони", "We need at least one column, please be so kind and create one." : "Необходима ни е поне една колона, моля, бъдете така любезни и я създайте.", "Please insert a title for the new column." : "Моля, въведете заглавие на новата колона.", @@ -297,7 +297,6 @@ "This field is mandatory" : "Това поле е задължително", "Copy link" : "Копиране на връзката", "Close editor" : "Затваряне на редактора", - "Export CSV" : "Експортиране на CSV файл", "_%n selected row_::_%n selected rows_" : ["%n избрани редове","%n избрани редове"], "Confirmation" : "Потвърждение", "Confirm" : "Потвърдете", diff --git a/l10n/ca.js b/l10n/ca.js index af30a5299d..23437a81ad 100644 --- a/l10n/ca.js +++ b/l10n/ca.js @@ -8,6 +8,7 @@ OC.L10N.register( "Timestamp of data load" : "Marca de temps de càrrega de dades", "No" : "No", "Yes" : "Sí", + "Count" : "Recompte", "Could not update row." : "No s'ha pogut actualitzar la fila.", "The file was uploaded" : "S'ha pujat el fitxer", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El fitxer pujat excedeix la directiva upload_max_filesize del fitxer php.ini", @@ -143,7 +144,6 @@ OC.L10N.register( "Edit table" : "Edita la taula", "Create column" : "Crea una columna", "Import" : "Importa", - "Export as CSV" : "Exporta a CSV", "No columns" : "Sense columnes", "We need at least one column, please be so kind and create one." : "Necessitem almenys una columna, si us plau, sigueu amables i creeu-ne una.", "Please insert a title for the new column." : "Si us plau, inseriu un títol per a la nova columna.", @@ -278,7 +278,6 @@ OC.L10N.register( "Copy link" : "Copia l'enllaç", "Open link" : "Obre l'enllaç", "Close editor" : "Tanca l'editor", - "Export CSV" : "Exporta CSV", "_%n selected row_::_%n selected rows_" : ["%n fila seleccionada","%n files seleccionades"], "Go to previous page" : "Torna a la pàgina anterior", "Confirmation" : "Confirmació", diff --git a/l10n/ca.json b/l10n/ca.json index 49a06a2584..2f57d0a1ae 100644 --- a/l10n/ca.json +++ b/l10n/ca.json @@ -6,6 +6,7 @@ "Timestamp of data load" : "Marca de temps de càrrega de dades", "No" : "No", "Yes" : "Sí", + "Count" : "Recompte", "Could not update row." : "No s'ha pogut actualitzar la fila.", "The file was uploaded" : "S'ha pujat el fitxer", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El fitxer pujat excedeix la directiva upload_max_filesize del fitxer php.ini", @@ -141,7 +142,6 @@ "Edit table" : "Edita la taula", "Create column" : "Crea una columna", "Import" : "Importa", - "Export as CSV" : "Exporta a CSV", "No columns" : "Sense columnes", "We need at least one column, please be so kind and create one." : "Necessitem almenys una columna, si us plau, sigueu amables i creeu-ne una.", "Please insert a title for the new column." : "Si us plau, inseriu un títol per a la nova columna.", @@ -276,7 +276,6 @@ "Copy link" : "Copia l'enllaç", "Open link" : "Obre l'enllaç", "Close editor" : "Tanca l'editor", - "Export CSV" : "Exporta CSV", "_%n selected row_::_%n selected rows_" : ["%n fila seleccionada","%n files seleccionades"], "Go to previous page" : "Torna a la pàgina anterior", "Confirmation" : "Confirmació", diff --git a/l10n/cs.js b/l10n/cs.js index c20fef58f8..73ad635a3a 100644 --- a/l10n/cs.js +++ b/l10n/cs.js @@ -24,6 +24,7 @@ OC.L10N.register( "Timestamp of data load" : "Časové razítko načtení dat", "No" : "Ne", "Yes" : "Ano", + "Count" : "Počet", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Došlo k neočekávané chybě. Podrobnosti jsou k dispozici v záznamem událostí. Obraťte se na své správce.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Došlo k chybě ohledně oprávnění. Podrobnosti jsou k dispozici v záznamem událostí. Obraťte se na své správce.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Došlo k chybě typu nenalezeno. Podrobnosti jsou k dispozici v záznamem událostí. Obraťte se na své správce.", @@ -213,7 +214,6 @@ OC.L10N.register( "Edit table" : "Upravit tabulku", "Create column" : "Vytvořit sloupec", "Import" : "Naimportovat", - "Export as CSV" : "Exportovat jako CSV", "Filtered view" : "Filtrovaný pohled", "Reset local adjustments" : "Vrátit místní přizpůsobení na výchozí hodnoty", "No columns" : "Žádné sloupce", @@ -250,6 +250,7 @@ OC.L10N.register( "Show in app list" : "Zobrazit v seznamu aplikací", "This can be overridden by a per-account preference" : "Toto je možné přebít v předvolbách jednotlivých účtů", "Create application" : "Vytvořit aplikaci", + "Fill form" : "Vyplnit formulář", "Create row" : "Vytvořit řádek", "Submit" : "Odeslat", "Row successfully created." : "Řádek úspěšně vytvořen.", @@ -302,6 +303,8 @@ OC.L10N.register( "Edit" : "Upravit", "Activity" : "Aktivita", "I really want to delete this row!" : "Opravdu chci tento řádek smazat!", + "Column order" : "Pořadí sloupců", + "Default sorting" : "Výchozí řazení", "Manage" : "Spravovat", "Owner" : "Vlastník", "I really want to delete this table!" : "Opravdu chci smazat tuto tabulku!", @@ -488,6 +491,8 @@ OC.L10N.register( "Select options" : "Vyberte volby", "Keyword and submit" : "Klíčové slovo a odeslat", "Or use magic values" : "Nebo použijte magické hodnoty", + "Unpin column" : "Uvolnit sloupec", + "Pin column" : "Připnout sloupec", "Sorting" : "Řazení", "Sort asc" : "Seřadit vzest.", "Sort desc" : "Seřadit sest.", @@ -550,12 +555,13 @@ OC.L10N.register( "Show fullscreen" : "Zobrazit na celou obrazovku", "Close editor" : "Zavřít editor", "Create Row" : "Vytvořit řádek", - "Export CSV" : "Export CSV", "Uncheck all" : "Zrušit označení všeho", "_%n selected row_::_%n selected rows_" : ["%n vybraný řádek","%n vybrané řádky","%n vybraných řádků","%n vybrané řádky"], "Go to first page" : "Přejít na první stránku", "Go to previous page" : "Přejít na předchozí stránku", + "Page" : "Stránka", "Page number" : "Číslo stránky", + "Per page" : "Na stránku", "Go to next page" : "Přejít na následující stránku", "Go to last page" : "Přejít na poslední stránku", "Confirmation" : "Potvrzení", @@ -576,6 +582,7 @@ OC.L10N.register( "Could not update share." : "Nepodařilo se zaktualizovat sdílení.", "Could not update cell" : "Nebylo možné zaktualizovat buňku", "Filter operator" : "Operátor filtru", + "Contains items" : "Obsahuje položky", "Contains" : "Obsahuje", "Does not contain" : "Neobsahuje", "Begins with" : "Začíná na", diff --git a/l10n/cs.json b/l10n/cs.json index fce3076fa8..ff37b8c68d 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -22,6 +22,7 @@ "Timestamp of data load" : "Časové razítko načtení dat", "No" : "Ne", "Yes" : "Ano", + "Count" : "Počet", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Došlo k neočekávané chybě. Podrobnosti jsou k dispozici v záznamem událostí. Obraťte se na své správce.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Došlo k chybě ohledně oprávnění. Podrobnosti jsou k dispozici v záznamem událostí. Obraťte se na své správce.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Došlo k chybě typu nenalezeno. Podrobnosti jsou k dispozici v záznamem událostí. Obraťte se na své správce.", @@ -211,7 +212,6 @@ "Edit table" : "Upravit tabulku", "Create column" : "Vytvořit sloupec", "Import" : "Naimportovat", - "Export as CSV" : "Exportovat jako CSV", "Filtered view" : "Filtrovaný pohled", "Reset local adjustments" : "Vrátit místní přizpůsobení na výchozí hodnoty", "No columns" : "Žádné sloupce", @@ -248,6 +248,7 @@ "Show in app list" : "Zobrazit v seznamu aplikací", "This can be overridden by a per-account preference" : "Toto je možné přebít v předvolbách jednotlivých účtů", "Create application" : "Vytvořit aplikaci", + "Fill form" : "Vyplnit formulář", "Create row" : "Vytvořit řádek", "Submit" : "Odeslat", "Row successfully created." : "Řádek úspěšně vytvořen.", @@ -300,6 +301,8 @@ "Edit" : "Upravit", "Activity" : "Aktivita", "I really want to delete this row!" : "Opravdu chci tento řádek smazat!", + "Column order" : "Pořadí sloupců", + "Default sorting" : "Výchozí řazení", "Manage" : "Spravovat", "Owner" : "Vlastník", "I really want to delete this table!" : "Opravdu chci smazat tuto tabulku!", @@ -486,6 +489,8 @@ "Select options" : "Vyberte volby", "Keyword and submit" : "Klíčové slovo a odeslat", "Or use magic values" : "Nebo použijte magické hodnoty", + "Unpin column" : "Uvolnit sloupec", + "Pin column" : "Připnout sloupec", "Sorting" : "Řazení", "Sort asc" : "Seřadit vzest.", "Sort desc" : "Seřadit sest.", @@ -548,12 +553,13 @@ "Show fullscreen" : "Zobrazit na celou obrazovku", "Close editor" : "Zavřít editor", "Create Row" : "Vytvořit řádek", - "Export CSV" : "Export CSV", "Uncheck all" : "Zrušit označení všeho", "_%n selected row_::_%n selected rows_" : ["%n vybraný řádek","%n vybrané řádky","%n vybraných řádků","%n vybrané řádky"], "Go to first page" : "Přejít na první stránku", "Go to previous page" : "Přejít na předchozí stránku", + "Page" : "Stránka", "Page number" : "Číslo stránky", + "Per page" : "Na stránku", "Go to next page" : "Přejít na následující stránku", "Go to last page" : "Přejít na poslední stránku", "Confirmation" : "Potvrzení", @@ -574,6 +580,7 @@ "Could not update share." : "Nepodařilo se zaktualizovat sdílení.", "Could not update cell" : "Nebylo možné zaktualizovat buňku", "Filter operator" : "Operátor filtru", + "Contains items" : "Obsahuje položky", "Contains" : "Obsahuje", "Does not contain" : "Neobsahuje", "Begins with" : "Začíná na", diff --git a/l10n/da.js b/l10n/da.js index 385c3788b3..680e14e2c7 100644 --- a/l10n/da.js +++ b/l10n/da.js @@ -9,6 +9,7 @@ OC.L10N.register( "Timestamp of data load" : "Tidsstempel for dataindlæsning", "No" : "Nej", "Yes" : "Ja", + "Count" : "Antal", "Could not update row." : "Rækken kunne ikke opdateres.", "The file was uploaded" : "Filen blev uploadet", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Den uploadede fil overstiger upload_max_filesize-direktivet i php.ini", @@ -133,6 +134,7 @@ OC.L10N.register( "Mandatory" : "Obligatorisk", "Column" : "Kolonne", "Operator" : "Operatør", + "OR" : "ELLER", "Ascending" : "Stigende", "Descending" : "Faldende", "Updated table \"{emoji}{table}\"." : "Opdateret tabel \"{emoji}{table}\".", @@ -151,7 +153,6 @@ OC.L10N.register( "Edit table" : "Redigér tabel", "Create column" : "Opret kolonne", "Import" : "Import", - "Export as CSV" : "Eksportér som CSV", "No columns" : "Ingen kolonner", "We need at least one column, please be so kind and create one." : "Vi har brug for mindst en kolonne, vær så venlig og opret en.", "Please insert a title for the new column." : "Indsæt venligst en titel til den nye kolonne.", @@ -286,12 +287,14 @@ OC.L10N.register( "This option is outdated." : "Denne mulighed er forældet.", "Options" : "Muligheder", "Back" : "Tilbage", + "Select operator" : "Vælg operatør", "Keyword and submit" : "Søgeord og send", "Or use magic values" : "Eller brug magiske værdier", "Sorting" : "Sortering", "Sort asc" : "Sorter stigende", "Sort desc" : "Sorter faldende", "Filtering" : "Filtrering", + "Select Operator" : "Vælg operatør", "Undo" : "Fortryd", "Redo" : "Annuller fortryd", "Bold" : "Fed", @@ -334,7 +337,7 @@ OC.L10N.register( "Copy link" : "Kopiér link", "Open link" : "Åben link", "Close editor" : "Luk editor", - "Export CSV" : "Eksportér CSV", + "Create Row" : "Opret række", "Uncheck all" : "Fjern markeringen af ​​alle", "_%n selected row_::_%n selected rows_" : ["%n valgt række","%n valgte rækker"], "Go to previous page" : "Gå til forrige side", diff --git a/l10n/da.json b/l10n/da.json index dbe50abd22..f0bb00898e 100644 --- a/l10n/da.json +++ b/l10n/da.json @@ -7,6 +7,7 @@ "Timestamp of data load" : "Tidsstempel for dataindlæsning", "No" : "Nej", "Yes" : "Ja", + "Count" : "Antal", "Could not update row." : "Rækken kunne ikke opdateres.", "The file was uploaded" : "Filen blev uploadet", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Den uploadede fil overstiger upload_max_filesize-direktivet i php.ini", @@ -131,6 +132,7 @@ "Mandatory" : "Obligatorisk", "Column" : "Kolonne", "Operator" : "Operatør", + "OR" : "ELLER", "Ascending" : "Stigende", "Descending" : "Faldende", "Updated table \"{emoji}{table}\"." : "Opdateret tabel \"{emoji}{table}\".", @@ -149,7 +151,6 @@ "Edit table" : "Redigér tabel", "Create column" : "Opret kolonne", "Import" : "Import", - "Export as CSV" : "Eksportér som CSV", "No columns" : "Ingen kolonner", "We need at least one column, please be so kind and create one." : "Vi har brug for mindst en kolonne, vær så venlig og opret en.", "Please insert a title for the new column." : "Indsæt venligst en titel til den nye kolonne.", @@ -284,12 +285,14 @@ "This option is outdated." : "Denne mulighed er forældet.", "Options" : "Muligheder", "Back" : "Tilbage", + "Select operator" : "Vælg operatør", "Keyword and submit" : "Søgeord og send", "Or use magic values" : "Eller brug magiske værdier", "Sorting" : "Sortering", "Sort asc" : "Sorter stigende", "Sort desc" : "Sorter faldende", "Filtering" : "Filtrering", + "Select Operator" : "Vælg operatør", "Undo" : "Fortryd", "Redo" : "Annuller fortryd", "Bold" : "Fed", @@ -332,7 +335,7 @@ "Copy link" : "Kopiér link", "Open link" : "Åben link", "Close editor" : "Luk editor", - "Export CSV" : "Eksportér CSV", + "Create Row" : "Opret række", "Uncheck all" : "Fjern markeringen af ​​alle", "_%n selected row_::_%n selected rows_" : ["%n valgt række","%n valgte rækker"], "Go to previous page" : "Gå til forrige side", diff --git a/l10n/de.js b/l10n/de.js index a75832b021..a316196b5a 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -33,6 +33,7 @@ OC.L10N.register( "Timestamp of data load" : "Zeitpunkt der Datenladung", "No" : "Nein", "Yes" : "Ja", + "Count" : "Anzahl", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Es ist ein unerwarteter Fehler aufgetreten. Weitere Details findest du in den Protokollen. Bitte wende dich an deine Administration.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Es ist ein Berechtigungsfehler aufgetreten. Weitere Details findest du in den Protokollen. Bitte wende dich an deine Administration.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Es ist ein \"Nicht gefunden\"-Fehler aufgetreten. Weitere Details findest du in den Protokollen. Bitte wende dich an deine Administration.", @@ -178,6 +179,7 @@ OC.L10N.register( "Selection" : "Auswahl", "Date and time" : "Datum und Zeit", "Users and groups" : "Benutzer und Gruppen", + "Relation" : "Beziehung", "Column type" : "Spaltentyp", "Move" : "Verschieben", "Metadata" : "Metadaten", @@ -225,7 +227,8 @@ OC.L10N.register( "Edit table" : "Tabelle bearbeiten", "Create column" : "Spalte erstellen", "Import" : "Importieren", - "Export as CSV" : "Als CSV exportieren", + "Export all rows" : "Alle Zeilen exportieren", + "Export filtered rows" : "Gefilterte Zeilen exportieren", "Filtered view" : "Gefilterte Ansicht", "Reset local adjustments" : "Lokale Anpassungen zurücksetzen", "No columns" : "Keine Spalten", @@ -237,6 +240,9 @@ OC.L10N.register( "Please insert a title for the new column." : "Bitte gib den Titel für die neue Spalte ein", "Cannot save column. Column width must be between {min} and {max}." : "Spalte kann nicht gespeichert werden. Die Spaltenbreite muss zwischen {min} und {max} liegen.", "You need to select a type for the new column." : "Du musst einen Typ für die neue Spalte auswählen", + "Please select a relation type." : "Bitte einen Beziehungstyp auswählen.", + "Please select a target." : "Bitte ein Ziel auswählen.", + "Please select a label for relation selection." : "EIne Beschriftung für die Beziehungsauswahl auswählen", "The column \"{column}\" was created." : "Die Spalte \"{column}\" wurde erstellt", "Sorry, something went wrong." : "Leider ist etwas schiefgelaufen", "Could not create new column." : "Neue Spalte konnte nicht erstellt werden.", @@ -502,6 +508,8 @@ OC.L10N.register( "Link providers" : "Linkanbieter", "This option is outdated." : "Diese Einstellung ist veraltet.", "Options" : "Optionen", + "This relation does not exist anymore." : "Diese Beziehung existiert nicht mehr", + "Select relation value" : "Beziehungswert auswählen", "Set {star} stars" : "{star} Sterne vergeben", "Cell input" : "Zelleneingabe", "Back" : "Zurück", @@ -521,6 +529,7 @@ OC.L10N.register( "Manage column" : "Spalte verwalten", "Column manage actions" : "Spaltenverwaltungsaktionen", "Hide column" : "Spalte verstecken", + "Copy row" : "Zeile kopieren", "Undo" : "Rückgängig", "Redo" : "Wiederherstellen", "Bold" : "Fett", @@ -550,6 +559,12 @@ OC.L10N.register( "Default" : "Standard", "Reduce stars" : "Sterne reduzieren", "Increase stars" : "Sterne erhöhen", + "Relation type" : "Beziehungstyp", + "Select relation type" : "Beziehungstyp auswählen", + "Select target" : "Ziel auswählen", + "Label for relation selection" : "Beschriftung für die Beziehungsauswahl", + "Select label for relation selection" : "Beschriftung für die Beziehungsauswahl auswählen", + "Only text and number columns can be used as label" : "Nur Text- und Nummernspalten können als Beschriftung ausgewählt werden", "First option" : "Erste Einstellung", "Second option" : "Zweite Einstellung", "Delete option" : "Option löschen", @@ -574,7 +589,7 @@ OC.L10N.register( "Show fullscreen" : "Vollbild anzeigen", "Close editor" : "Bearbeitung schließen", "Create Row" : "Zeile erstellen", - "Export CSV" : "CSV exportieren", + "Export selected rows" : "Ausgewählte Zeilen exportieren", "Uncheck all" : "Auswahl aufheben", "_%n selected row_::_%n selected rows_" : ["%n gewählte Zeile","%n gewählte Zeilen"], "Go to first page" : "Zur ersten Seite springen", @@ -648,6 +663,7 @@ OC.L10N.register( "Could not insert column." : "Spalte konnte nicht eingefügt werden.", "Could not update column." : "Spalte konnte nicht aktualisiert werden.", "Could not remove column." : "Spalte konnte nicht entfernt werden.", + "Could not load relation data." : "Beziehungsdaten können nicht geladen werden.", "Could not load rows." : "Zeilen konnten nicht geladen werden.", "Outdated data. View is reloaded" : "Veraltete Daten. Ansicht wird neu geladen", "Could not insert row." : "Zeile konnte nicht eingefügt werden.", diff --git a/l10n/de.json b/l10n/de.json index e0160d56f9..7046860ef7 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -31,6 +31,7 @@ "Timestamp of data load" : "Zeitpunkt der Datenladung", "No" : "Nein", "Yes" : "Ja", + "Count" : "Anzahl", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Es ist ein unerwarteter Fehler aufgetreten. Weitere Details findest du in den Protokollen. Bitte wende dich an deine Administration.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Es ist ein Berechtigungsfehler aufgetreten. Weitere Details findest du in den Protokollen. Bitte wende dich an deine Administration.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Es ist ein \"Nicht gefunden\"-Fehler aufgetreten. Weitere Details findest du in den Protokollen. Bitte wende dich an deine Administration.", @@ -176,6 +177,7 @@ "Selection" : "Auswahl", "Date and time" : "Datum und Zeit", "Users and groups" : "Benutzer und Gruppen", + "Relation" : "Beziehung", "Column type" : "Spaltentyp", "Move" : "Verschieben", "Metadata" : "Metadaten", @@ -223,7 +225,8 @@ "Edit table" : "Tabelle bearbeiten", "Create column" : "Spalte erstellen", "Import" : "Importieren", - "Export as CSV" : "Als CSV exportieren", + "Export all rows" : "Alle Zeilen exportieren", + "Export filtered rows" : "Gefilterte Zeilen exportieren", "Filtered view" : "Gefilterte Ansicht", "Reset local adjustments" : "Lokale Anpassungen zurücksetzen", "No columns" : "Keine Spalten", @@ -235,6 +238,9 @@ "Please insert a title for the new column." : "Bitte gib den Titel für die neue Spalte ein", "Cannot save column. Column width must be between {min} and {max}." : "Spalte kann nicht gespeichert werden. Die Spaltenbreite muss zwischen {min} und {max} liegen.", "You need to select a type for the new column." : "Du musst einen Typ für die neue Spalte auswählen", + "Please select a relation type." : "Bitte einen Beziehungstyp auswählen.", + "Please select a target." : "Bitte ein Ziel auswählen.", + "Please select a label for relation selection." : "EIne Beschriftung für die Beziehungsauswahl auswählen", "The column \"{column}\" was created." : "Die Spalte \"{column}\" wurde erstellt", "Sorry, something went wrong." : "Leider ist etwas schiefgelaufen", "Could not create new column." : "Neue Spalte konnte nicht erstellt werden.", @@ -500,6 +506,8 @@ "Link providers" : "Linkanbieter", "This option is outdated." : "Diese Einstellung ist veraltet.", "Options" : "Optionen", + "This relation does not exist anymore." : "Diese Beziehung existiert nicht mehr", + "Select relation value" : "Beziehungswert auswählen", "Set {star} stars" : "{star} Sterne vergeben", "Cell input" : "Zelleneingabe", "Back" : "Zurück", @@ -519,6 +527,7 @@ "Manage column" : "Spalte verwalten", "Column manage actions" : "Spaltenverwaltungsaktionen", "Hide column" : "Spalte verstecken", + "Copy row" : "Zeile kopieren", "Undo" : "Rückgängig", "Redo" : "Wiederherstellen", "Bold" : "Fett", @@ -548,6 +557,12 @@ "Default" : "Standard", "Reduce stars" : "Sterne reduzieren", "Increase stars" : "Sterne erhöhen", + "Relation type" : "Beziehungstyp", + "Select relation type" : "Beziehungstyp auswählen", + "Select target" : "Ziel auswählen", + "Label for relation selection" : "Beschriftung für die Beziehungsauswahl", + "Select label for relation selection" : "Beschriftung für die Beziehungsauswahl auswählen", + "Only text and number columns can be used as label" : "Nur Text- und Nummernspalten können als Beschriftung ausgewählt werden", "First option" : "Erste Einstellung", "Second option" : "Zweite Einstellung", "Delete option" : "Option löschen", @@ -572,7 +587,7 @@ "Show fullscreen" : "Vollbild anzeigen", "Close editor" : "Bearbeitung schließen", "Create Row" : "Zeile erstellen", - "Export CSV" : "CSV exportieren", + "Export selected rows" : "Ausgewählte Zeilen exportieren", "Uncheck all" : "Auswahl aufheben", "_%n selected row_::_%n selected rows_" : ["%n gewählte Zeile","%n gewählte Zeilen"], "Go to first page" : "Zur ersten Seite springen", @@ -646,6 +661,7 @@ "Could not insert column." : "Spalte konnte nicht eingefügt werden.", "Could not update column." : "Spalte konnte nicht aktualisiert werden.", "Could not remove column." : "Spalte konnte nicht entfernt werden.", + "Could not load relation data." : "Beziehungsdaten können nicht geladen werden.", "Could not load rows." : "Zeilen konnten nicht geladen werden.", "Outdated data. View is reloaded" : "Veraltete Daten. Ansicht wird neu geladen", "Could not insert row." : "Zeile konnte nicht eingefügt werden.", diff --git a/l10n/de_DE.js b/l10n/de_DE.js index e39fda5b6c..e60e348c3e 100644 --- a/l10n/de_DE.js +++ b/l10n/de_DE.js @@ -33,6 +33,7 @@ OC.L10N.register( "Timestamp of data load" : "Zeitpunkt der Datenladung", "No" : "Nein", "Yes" : "Ja", + "Count" : "Anzahl", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Es ist ein unerwarteter Fehler aufgetreten. Weitere Details finden Sie in den Protokollen. Bitte wenden Sie sich an Ihre Administration.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Es ist ein Berechtigungsfehler aufgetreten. Weitere Details finden Sie in den Protokollen. Bitte wenden Sie sich an Ihre Administration.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Es ist ein \"Nicht gefunden\"-Fehler aufgetreten. Weitere Details finden Sie in den Protokollen. Bitte wenden Sie sich an Ihre Administration.", @@ -178,6 +179,7 @@ OC.L10N.register( "Selection" : "Auswahl", "Date and time" : "Datum und Zeit", "Users and groups" : "Benutzer und Gruppen", + "Relation" : "Beziehung", "Column type" : "Spaltentyp", "Move" : "Verschieben", "Metadata" : "Metadaten", @@ -225,7 +227,8 @@ OC.L10N.register( "Edit table" : "Tabelle bearbeiten", "Create column" : "Spalte erstellen", "Import" : "Importieren", - "Export as CSV" : "Als CSV exportieren", + "Export all rows" : "Alle Zeilen exportieren", + "Export filtered rows" : "Gefilterte Zeilen exportieren", "Filtered view" : "Gefilterte Ansicht", "Reset local adjustments" : "Lokale Anpassungen zurücksetzen", "No columns" : "Keine Spalten", @@ -237,6 +240,9 @@ OC.L10N.register( "Please insert a title for the new column." : "Bitte den Titel für die neue Spalte eingeben.", "Cannot save column. Column width must be between {min} and {max}." : "Spalte kann nicht gespeichert werden. Die Spaltenbreite muss zwischen {min} und {max} liegen.", "You need to select a type for the new column." : "Sie müssen einen Typ für die neue Spalte auswählen.", + "Please select a relation type." : "Bitte einen Beziehungstyp auswählen.", + "Please select a target." : "Bitte ein Ziel auswählen.", + "Please select a label for relation selection." : "EIne Beschriftung für die Beziehungsauswahl auswählen", "The column \"{column}\" was created." : "Die Spalte \"{column}\" wurde erstellt.", "Sorry, something went wrong." : "Leider ist etwas schiefgelaufen!", "Could not create new column." : "Neue Spalte konnte nicht erstellt werden.", @@ -502,6 +508,8 @@ OC.L10N.register( "Link providers" : "Linkanbieter", "This option is outdated." : "Diese Einstellung ist veraltet.", "Options" : "Optionen", + "This relation does not exist anymore." : "Diese Beziehung existiert nicht mehr", + "Select relation value" : "Beziehungswert auswählen", "Set {star} stars" : "{star} Sterne vergeben", "Cell input" : "Zelleneingabe", "Back" : "Zurück", @@ -521,6 +529,7 @@ OC.L10N.register( "Manage column" : "Spalte verwalten", "Column manage actions" : "Spaltenverwaltungsaktionen", "Hide column" : "Spalte verstecken", + "Copy row" : "Zeile kopieren", "Undo" : "Rückgängig", "Redo" : "Wiederholen", "Bold" : "Fett", @@ -550,6 +559,12 @@ OC.L10N.register( "Default" : "Standard", "Reduce stars" : "Sterne reduzieren", "Increase stars" : "Sterne erhöhen", + "Relation type" : "Beziehungstyp", + "Select relation type" : "Beziehungstyp auswählen", + "Select target" : "Ziel auswählen", + "Label for relation selection" : "Beschriftung für die Beziehungsauswahl", + "Select label for relation selection" : "Beschriftung für die Beziehungsauswahl auswählen", + "Only text and number columns can be used as label" : "Nur Text- und Nummernspalten können als Beschriftung ausgewählt werden", "First option" : "Erste Einstellung", "Second option" : "Zweite Einstellung", "Delete option" : "Option löschen", @@ -574,7 +589,7 @@ OC.L10N.register( "Show fullscreen" : "Vollbild anzeigen", "Close editor" : "Bearbeitung schließen", "Create Row" : "Zeile erstellen", - "Export CSV" : "CSV esportieren", + "Export selected rows" : "Ausgewählte Zeilen exportieren", "Uncheck all" : "Auswahl aufheben", "_%n selected row_::_%n selected rows_" : ["%n gewählte Zeile","%n gewählte Zeilen"], "Go to first page" : "Zur ersten Seite springen", @@ -648,6 +663,7 @@ OC.L10N.register( "Could not insert column." : "Spalte konnte nicht eingefügt werden.", "Could not update column." : "Spalte konnte nicht aktualisiert werden.", "Could not remove column." : "Spalte konnte nicht entfernt werden.", + "Could not load relation data." : "Beziehungsdaten können nicht geladen werden.", "Could not load rows." : "Zeilen konnten nicht geladen werden.", "Outdated data. View is reloaded" : "Veraltete Daten. Ansicht wird neu geladen", "Could not insert row." : "Zeile konnte nicht eingefügt werden.", diff --git a/l10n/de_DE.json b/l10n/de_DE.json index 2d32446e31..3752681c56 100644 --- a/l10n/de_DE.json +++ b/l10n/de_DE.json @@ -31,6 +31,7 @@ "Timestamp of data load" : "Zeitpunkt der Datenladung", "No" : "Nein", "Yes" : "Ja", + "Count" : "Anzahl", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Es ist ein unerwarteter Fehler aufgetreten. Weitere Details finden Sie in den Protokollen. Bitte wenden Sie sich an Ihre Administration.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Es ist ein Berechtigungsfehler aufgetreten. Weitere Details finden Sie in den Protokollen. Bitte wenden Sie sich an Ihre Administration.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Es ist ein \"Nicht gefunden\"-Fehler aufgetreten. Weitere Details finden Sie in den Protokollen. Bitte wenden Sie sich an Ihre Administration.", @@ -176,6 +177,7 @@ "Selection" : "Auswahl", "Date and time" : "Datum und Zeit", "Users and groups" : "Benutzer und Gruppen", + "Relation" : "Beziehung", "Column type" : "Spaltentyp", "Move" : "Verschieben", "Metadata" : "Metadaten", @@ -223,7 +225,8 @@ "Edit table" : "Tabelle bearbeiten", "Create column" : "Spalte erstellen", "Import" : "Importieren", - "Export as CSV" : "Als CSV exportieren", + "Export all rows" : "Alle Zeilen exportieren", + "Export filtered rows" : "Gefilterte Zeilen exportieren", "Filtered view" : "Gefilterte Ansicht", "Reset local adjustments" : "Lokale Anpassungen zurücksetzen", "No columns" : "Keine Spalten", @@ -235,6 +238,9 @@ "Please insert a title for the new column." : "Bitte den Titel für die neue Spalte eingeben.", "Cannot save column. Column width must be between {min} and {max}." : "Spalte kann nicht gespeichert werden. Die Spaltenbreite muss zwischen {min} und {max} liegen.", "You need to select a type for the new column." : "Sie müssen einen Typ für die neue Spalte auswählen.", + "Please select a relation type." : "Bitte einen Beziehungstyp auswählen.", + "Please select a target." : "Bitte ein Ziel auswählen.", + "Please select a label for relation selection." : "EIne Beschriftung für die Beziehungsauswahl auswählen", "The column \"{column}\" was created." : "Die Spalte \"{column}\" wurde erstellt.", "Sorry, something went wrong." : "Leider ist etwas schiefgelaufen!", "Could not create new column." : "Neue Spalte konnte nicht erstellt werden.", @@ -500,6 +506,8 @@ "Link providers" : "Linkanbieter", "This option is outdated." : "Diese Einstellung ist veraltet.", "Options" : "Optionen", + "This relation does not exist anymore." : "Diese Beziehung existiert nicht mehr", + "Select relation value" : "Beziehungswert auswählen", "Set {star} stars" : "{star} Sterne vergeben", "Cell input" : "Zelleneingabe", "Back" : "Zurück", @@ -519,6 +527,7 @@ "Manage column" : "Spalte verwalten", "Column manage actions" : "Spaltenverwaltungsaktionen", "Hide column" : "Spalte verstecken", + "Copy row" : "Zeile kopieren", "Undo" : "Rückgängig", "Redo" : "Wiederholen", "Bold" : "Fett", @@ -548,6 +557,12 @@ "Default" : "Standard", "Reduce stars" : "Sterne reduzieren", "Increase stars" : "Sterne erhöhen", + "Relation type" : "Beziehungstyp", + "Select relation type" : "Beziehungstyp auswählen", + "Select target" : "Ziel auswählen", + "Label for relation selection" : "Beschriftung für die Beziehungsauswahl", + "Select label for relation selection" : "Beschriftung für die Beziehungsauswahl auswählen", + "Only text and number columns can be used as label" : "Nur Text- und Nummernspalten können als Beschriftung ausgewählt werden", "First option" : "Erste Einstellung", "Second option" : "Zweite Einstellung", "Delete option" : "Option löschen", @@ -572,7 +587,7 @@ "Show fullscreen" : "Vollbild anzeigen", "Close editor" : "Bearbeitung schließen", "Create Row" : "Zeile erstellen", - "Export CSV" : "CSV esportieren", + "Export selected rows" : "Ausgewählte Zeilen exportieren", "Uncheck all" : "Auswahl aufheben", "_%n selected row_::_%n selected rows_" : ["%n gewählte Zeile","%n gewählte Zeilen"], "Go to first page" : "Zur ersten Seite springen", @@ -646,6 +661,7 @@ "Could not insert column." : "Spalte konnte nicht eingefügt werden.", "Could not update column." : "Spalte konnte nicht aktualisiert werden.", "Could not remove column." : "Spalte konnte nicht entfernt werden.", + "Could not load relation data." : "Beziehungsdaten können nicht geladen werden.", "Could not load rows." : "Zeilen konnten nicht geladen werden.", "Outdated data. View is reloaded" : "Veraltete Daten. Ansicht wird neu geladen", "Could not insert row." : "Zeile konnte nicht eingefügt werden.", diff --git a/l10n/el.js b/l10n/el.js index 29c9b0d804..f1d30bd398 100644 --- a/l10n/el.js +++ b/l10n/el.js @@ -8,6 +8,7 @@ OC.L10N.register( "Timestamp of data load" : "Χρονική σήμανση φόρτωσης δεδομένων", "No" : "Όχι", "Yes" : "Ναι", + "Count" : "Πλήθος", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Εμφανίστηκε ένα απροσδόκητο σφάλμα. Περισσότερες λεπτομέρειες μπορείτε να βρείτε στα αρχεία καταγραφής. Παρακαλούμε επικοινωνήστε με τους διαχειριστές σας.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Εμφανίστηκε σφάλμα άδειας. Περισσότερες λεπτομέρειες μπορείτε να βρείτε στα αρχεία καταγραφής. Παρακαλούμε επικοινωνήστε με τους διαχειριστές σας.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Εμφανίστηκε σφάλμα μη εντοπισμού. Περισσότερες λεπτομέρειες μπορείτε να βρείτε στα αρχεία καταγραφής. Παρακαλούμε επικοινωνήστε με τους διαχειριστές σας.", @@ -195,7 +196,6 @@ OC.L10N.register( "Edit table" : "Επεξεργασία πίνακα", "Create column" : "Δημιουργία στήλης", "Import" : "Εισαγωγή", - "Export as CSV" : "Εξαγωγή σε CSV", "Filtered view" : "Φιλτραρισμένη προβολή", "Reset local adjustments" : "Επαναφορά προσαρμογών", "No columns" : "Δεν υπάρχουν στήλες", @@ -525,7 +525,6 @@ OC.L10N.register( "Show fullscreen" : "Προβολή πλήρους οθόνης", "Close editor" : "Κλείσιμο του επεξεργαστή", "Create Row" : "Δημιουργία Γραμμής", - "Export CSV" : "Εξαγωγή CSV", "Uncheck all" : "Αποεπιλογή όλων", "_%n selected row_::_%n selected rows_" : ["%n επιλεγμένη γραμμή","%n επιλεγμένες γραμμές"], "Go to first page" : "Μετάβαση στην πρώτη σελίδα", diff --git a/l10n/el.json b/l10n/el.json index 7c21d648d9..130bb1c95b 100644 --- a/l10n/el.json +++ b/l10n/el.json @@ -6,6 +6,7 @@ "Timestamp of data load" : "Χρονική σήμανση φόρτωσης δεδομένων", "No" : "Όχι", "Yes" : "Ναι", + "Count" : "Πλήθος", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Εμφανίστηκε ένα απροσδόκητο σφάλμα. Περισσότερες λεπτομέρειες μπορείτε να βρείτε στα αρχεία καταγραφής. Παρακαλούμε επικοινωνήστε με τους διαχειριστές σας.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Εμφανίστηκε σφάλμα άδειας. Περισσότερες λεπτομέρειες μπορείτε να βρείτε στα αρχεία καταγραφής. Παρακαλούμε επικοινωνήστε με τους διαχειριστές σας.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Εμφανίστηκε σφάλμα μη εντοπισμού. Περισσότερες λεπτομέρειες μπορείτε να βρείτε στα αρχεία καταγραφής. Παρακαλούμε επικοινωνήστε με τους διαχειριστές σας.", @@ -193,7 +194,6 @@ "Edit table" : "Επεξεργασία πίνακα", "Create column" : "Δημιουργία στήλης", "Import" : "Εισαγωγή", - "Export as CSV" : "Εξαγωγή σε CSV", "Filtered view" : "Φιλτραρισμένη προβολή", "Reset local adjustments" : "Επαναφορά προσαρμογών", "No columns" : "Δεν υπάρχουν στήλες", @@ -523,7 +523,6 @@ "Show fullscreen" : "Προβολή πλήρους οθόνης", "Close editor" : "Κλείσιμο του επεξεργαστή", "Create Row" : "Δημιουργία Γραμμής", - "Export CSV" : "Εξαγωγή CSV", "Uncheck all" : "Αποεπιλογή όλων", "_%n selected row_::_%n selected rows_" : ["%n επιλεγμένη γραμμή","%n επιλεγμένες γραμμές"], "Go to first page" : "Μετάβαση στην πρώτη σελίδα", diff --git a/l10n/en_GB.js b/l10n/en_GB.js index 755e50e6c5..31a40a55c4 100644 --- a/l10n/en_GB.js +++ b/l10n/en_GB.js @@ -33,6 +33,7 @@ OC.L10N.register( "Timestamp of data load" : "Timestamp of data load", "No" : "No", "Yes" : "Yes", + "Count" : "Count", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "A permission error occurred. More details can be found in the logs. Please reach out to your administration.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "A not found error occurred. More details can be found in the logs. Please reach out to your administration.", @@ -225,7 +226,6 @@ OC.L10N.register( "Edit table" : "Edit table", "Create column" : "Create column", "Import" : "Import", - "Export as CSV" : "Export as CSV", "Filtered view" : "Filtered view", "Reset local adjustments" : "Reset local adjustments", "No columns" : "No columns", @@ -574,7 +574,6 @@ OC.L10N.register( "Show fullscreen" : "Show fullscreen", "Close editor" : "Close editor", "Create Row" : "Create Row", - "Export CSV" : "Export CSV", "Uncheck all" : "Uncheck all", "_%n selected row_::_%n selected rows_" : ["%n selected row","%n selected rows"], "Go to first page" : "Go to first page", diff --git a/l10n/en_GB.json b/l10n/en_GB.json index 1894a3797f..106fe03f11 100644 --- a/l10n/en_GB.json +++ b/l10n/en_GB.json @@ -31,6 +31,7 @@ "Timestamp of data load" : "Timestamp of data load", "No" : "No", "Yes" : "Yes", + "Count" : "Count", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "A permission error occurred. More details can be found in the logs. Please reach out to your administration.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "A not found error occurred. More details can be found in the logs. Please reach out to your administration.", @@ -223,7 +224,6 @@ "Edit table" : "Edit table", "Create column" : "Create column", "Import" : "Import", - "Export as CSV" : "Export as CSV", "Filtered view" : "Filtered view", "Reset local adjustments" : "Reset local adjustments", "No columns" : "No columns", @@ -572,7 +572,6 @@ "Show fullscreen" : "Show fullscreen", "Close editor" : "Close editor", "Create Row" : "Create Row", - "Export CSV" : "Export CSV", "Uncheck all" : "Uncheck all", "_%n selected row_::_%n selected rows_" : ["%n selected row","%n selected rows"], "Go to first page" : "Go to first page", diff --git a/l10n/es.js b/l10n/es.js index 031b64c88e..39945cc576 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -9,6 +9,7 @@ OC.L10N.register( "Timestamp of data load" : "Marca de tiempo de la carga de datos", "No" : "No", "Yes" : "Sí", + "Count" : "Recuento", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocurrió un error inesperado. Podrá encontrar más detalles en los registros. Por favor, comuníquese con su administrador.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocurrió un error de permisos. Podrá encontrar más detalles en los registros. Por favor, comuníquese con su administrador.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocurrió un error de \"no encontrado\". Podrá encontrar más detalles en los registros. Por favor, comuníquese con su administrador.", @@ -196,7 +197,6 @@ OC.L10N.register( "Edit table" : "Editar tabla", "Create column" : "Crear columna", "Import" : "Importar", - "Export as CSV" : "Exportar como CSV", "Filtered view" : "Vista filtrada", "Reset local adjustments" : "Restablecer ajustes locales ", "No columns" : "No hay columnas", @@ -527,7 +527,6 @@ OC.L10N.register( "Show fullscreen" : "Mostrar en pantalla completa", "Close editor" : "Cerrar editor", "Create Row" : "Crear fila", - "Export CSV" : "Exportar CSV", "Uncheck all" : "Desmarcar todo", "_%n selected row_::_%n selected rows_" : ["%n fila seleccionada","%n filas seleccionadas","%n filas seleccionadas"], "Go to first page" : "Ir a la primera página", diff --git a/l10n/es.json b/l10n/es.json index 200e6b7edd..ee83d86a0f 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -7,6 +7,7 @@ "Timestamp of data load" : "Marca de tiempo de la carga de datos", "No" : "No", "Yes" : "Sí", + "Count" : "Recuento", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocurrió un error inesperado. Podrá encontrar más detalles en los registros. Por favor, comuníquese con su administrador.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocurrió un error de permisos. Podrá encontrar más detalles en los registros. Por favor, comuníquese con su administrador.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocurrió un error de \"no encontrado\". Podrá encontrar más detalles en los registros. Por favor, comuníquese con su administrador.", @@ -194,7 +195,6 @@ "Edit table" : "Editar tabla", "Create column" : "Crear columna", "Import" : "Importar", - "Export as CSV" : "Exportar como CSV", "Filtered view" : "Vista filtrada", "Reset local adjustments" : "Restablecer ajustes locales ", "No columns" : "No hay columnas", @@ -525,7 +525,6 @@ "Show fullscreen" : "Mostrar en pantalla completa", "Close editor" : "Cerrar editor", "Create Row" : "Crear fila", - "Export CSV" : "Exportar CSV", "Uncheck all" : "Desmarcar todo", "_%n selected row_::_%n selected rows_" : ["%n fila seleccionada","%n filas seleccionadas","%n filas seleccionadas"], "Go to first page" : "Ir a la primera página", diff --git a/l10n/es_CL.js b/l10n/es_CL.js index 3c2cca76d1..c327e707b5 100644 --- a/l10n/es_CL.js +++ b/l10n/es_CL.js @@ -47,6 +47,7 @@ OC.L10N.register( "Activity" : "Actividad", "Manage" : "Administrar", "Owner" : "Dueño", + "Close" : "Close", "Please select a file." : "Por favor selecciona un archivo.", "Select from Files" : "Seleccionar desde Archivos", "Preview" : "Previsualizar", diff --git a/l10n/es_CL.json b/l10n/es_CL.json index 88a6b75ae0..66e1fc7011 100644 --- a/l10n/es_CL.json +++ b/l10n/es_CL.json @@ -45,6 +45,7 @@ "Activity" : "Actividad", "Manage" : "Administrar", "Owner" : "Dueño", + "Close" : "Close", "Please select a file." : "Por favor selecciona un archivo.", "Select from Files" : "Seleccionar desde Archivos", "Preview" : "Previsualizar", diff --git a/l10n/es_CR.js b/l10n/es_CR.js index 74cae502e5..b1a368aa20 100644 --- a/l10n/es_CR.js +++ b/l10n/es_CR.js @@ -46,6 +46,7 @@ OC.L10N.register( "Activity" : "Actividad", "Manage" : "Administrar", "Owner" : "Dueño", + "Close" : "Close", "Please select a file." : "Por favor selecciona un archivo.", "Select from Files" : "Seleccionar desde Archivos", "Preview" : "Previsualizar", diff --git a/l10n/es_CR.json b/l10n/es_CR.json index 73ed9b8325..5046fa5a11 100644 --- a/l10n/es_CR.json +++ b/l10n/es_CR.json @@ -44,6 +44,7 @@ "Activity" : "Actividad", "Manage" : "Administrar", "Owner" : "Dueño", + "Close" : "Close", "Please select a file." : "Por favor selecciona un archivo.", "Select from Files" : "Seleccionar desde Archivos", "Preview" : "Previsualizar", diff --git a/l10n/es_EC.js b/l10n/es_EC.js index 2836148633..71b39ec60d 100644 --- a/l10n/es_EC.js +++ b/l10n/es_EC.js @@ -146,7 +146,6 @@ OC.L10N.register( "Edit table" : "Editar tabla", "Create column" : "Crear columna", "Import" : "Importar", - "Export as CSV" : "Exportar como CSV", "No columns" : "Sin columnas", "We need at least one column, please be so kind and create one." : "Necesitamos al menos una columna, por favor, sé tan amable y crea una.", "Please insert a title for the new column." : "Por favor, inserta un título para la nueva columna.", @@ -317,7 +316,6 @@ OC.L10N.register( "This field is mandatory" : "Este campo es obligatorio", "Copy link" : "Copiar liga", "Close editor" : "Cerrar editor", - "Export CSV" : "Exportar CSV", "Uncheck all" : "Desmarcar todo", "_%n selected row_::_%n selected rows_" : ["%n fila seleccionada","%n filas seleccionadas","%n filas seleccionadas"], "Confirmation" : "Confirmación", diff --git a/l10n/es_EC.json b/l10n/es_EC.json index 3c0e85d4c3..b82d870b4d 100644 --- a/l10n/es_EC.json +++ b/l10n/es_EC.json @@ -144,7 +144,6 @@ "Edit table" : "Editar tabla", "Create column" : "Crear columna", "Import" : "Importar", - "Export as CSV" : "Exportar como CSV", "No columns" : "Sin columnas", "We need at least one column, please be so kind and create one." : "Necesitamos al menos una columna, por favor, sé tan amable y crea una.", "Please insert a title for the new column." : "Por favor, inserta un título para la nueva columna.", @@ -315,7 +314,6 @@ "This field is mandatory" : "Este campo es obligatorio", "Copy link" : "Copiar liga", "Close editor" : "Cerrar editor", - "Export CSV" : "Exportar CSV", "Uncheck all" : "Desmarcar todo", "_%n selected row_::_%n selected rows_" : ["%n fila seleccionada","%n filas seleccionadas","%n filas seleccionadas"], "Confirmation" : "Confirmación", diff --git a/l10n/es_GT.js b/l10n/es_GT.js index 9a2a424bfc..869ea27ee2 100644 --- a/l10n/es_GT.js +++ b/l10n/es_GT.js @@ -45,6 +45,7 @@ OC.L10N.register( "Activity" : "Actividad", "Manage" : "Administrar", "Owner" : "Dueño", + "Close" : "Close", "Please select a file." : "Por favor selecciona un archivo.", "Select from Files" : "Seleccionar desde Archivos", "Preview" : "Previsualizar", diff --git a/l10n/es_GT.json b/l10n/es_GT.json index 115631cc18..1ab12ba1d4 100644 --- a/l10n/es_GT.json +++ b/l10n/es_GT.json @@ -43,6 +43,7 @@ "Activity" : "Actividad", "Manage" : "Administrar", "Owner" : "Dueño", + "Close" : "Close", "Please select a file." : "Por favor selecciona un archivo.", "Select from Files" : "Seleccionar desde Archivos", "Preview" : "Previsualizar", diff --git a/l10n/es_UY.js b/l10n/es_UY.js index ceb92a5806..540e8a0e01 100644 --- a/l10n/es_UY.js +++ b/l10n/es_UY.js @@ -40,6 +40,7 @@ OC.L10N.register( "Activity" : "Actividad", "Manage" : "Administrar", "Owner" : "Dueño", + "Close" : "Close", "Please select a file." : "Por favor selecciona un archivo.", "Select from Files" : "Seleccionar desde Archivos", "Preview" : "Previsualizar", diff --git a/l10n/es_UY.json b/l10n/es_UY.json index 2013c538a7..d5d6267015 100644 --- a/l10n/es_UY.json +++ b/l10n/es_UY.json @@ -38,6 +38,7 @@ "Activity" : "Actividad", "Manage" : "Administrar", "Owner" : "Dueño", + "Close" : "Close", "Please select a file." : "Por favor selecciona un archivo.", "Select from Files" : "Seleccionar desde Archivos", "Preview" : "Previsualizar", diff --git a/l10n/et_EE.js b/l10n/et_EE.js index 2134a3724b..ac84f59b48 100644 --- a/l10n/et_EE.js +++ b/l10n/et_EE.js @@ -15,23 +15,33 @@ OC.L10N.register( "_{user} has updated cell %1$s on row {row} in table {table}_::_{user} has updated cells %1$s on row {row} in table {table}_" : ["{user} on uuendanud „{table}“ tabeli {row}. rea välja %1$s","{user} on uuendanud „{table}“ tabeli {row}. rea välju %1$s"], "You have deleted the row {row} in table {table}" : "Sa oled kustutanud {row}. rea tabelist „{table}“", "{user} has deleted the row {row} in table {table}" : "Kasutaja {user} on kustutanud {row}. rea tabelist „{table}“", + "You have imported file to table {table}" : "Sa oled faili importinud „{table}“ tabelisse", + "{user} has imported file to table {table}" : "{user} on faili importinud „{table}“ tabelisse", + "Found columns: {foundColumnsCount}" : "Leitud veerud: {foundColumnsCount}", + "Matching columns: {matchingColumnsCount}" : "Vastavuses veerud: {matchingColumnsCount}", + "Created columns: {createdColumnsCount}" : "Loodud veerud: {createdColumnsCount}", + "Inserted rows: {insertedRowsCount}" : "Lisatud veerud: {insertedRowsCount}", + "Updated rows: {updatedRowsCount}" : "Uuendatud veerud: {updatedRowsCount}", + "Value parsing errors: {errorsParsingCount}" : "Väärtuste töötlemise vead: {errorsParsingCount}", + "Row creation errors: {errorsCount}" : "Ridade lisamise vead: {errorsCount}", "Tables" : "Tabelid", "A table or row was changed" : "Tabel või rida on muutunud", - "Nextcloud Tables" : "Nextcloudi Tabelid", + "Nextcloud Tables" : "Nextcloudi tabelid", "Select table" : "Vali tabel", "Select columns" : "Vali veerud", "e.g. 1,2,4 or leave empty" : "nt. 1,2,4 või jäta tühjaks", "Timestamp of data load" : "Andmete laadimise ajatempel", "No" : "Ei", "Yes" : "Jah", + "Count" : "Kokku", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Tekkis ootamatu viga. Detailne veateave on leitav logidest. Palun küsi abi serveri haldajalt.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Tekkis õigustega seotud viga. Detailne veateave on leitav logidest. Palun küsi abi serveri haldajalt.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Tekkis viga, kus objekti ei leidu. Detailne veateave on leitav logidest. Palun küsi abi serveri haldajalt.", "Could not create row." : "Rea loomine ei õnnestunud.", "Could not update row." : "Rea uuendamine ei õnnestunud.", "The file was uploaded" : "Fail laaditi üles", - "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Üleslaaditud fail on suurem kui php.ini failis määratud upload_max_filesize direktiiv", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Üleslaaditud fail on suurem kui HTML vormil määratud MAX_FILE_SIZE direktiiv", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Üleslaaditud fail on suurem kui php.ini failis määratud upload_max_filesize direktiiv lubaks", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Üleslaaditud fail on suurem kui HTML vormil määratud MAX_FILE_SIZE direktiiv lubaks", "The file was only partially uploaded" : "Fail laaditi üles ainult osaliselt", "No file was uploaded" : "Ühtegi faili ei laaditud üles", "Missing a temporary folder" : "Ajutine kaust on puudu", @@ -55,7 +65,7 @@ OC.L10N.register( "Customers" : "Kliendid", "Manage your customers." : "Halda oma kliente.", "Vacation requests" : "Puhkusetaotlused", - "Use this table to collect and manage vacation requests." : "Kasuta seda tabelit oma puhkusetaotluste kogumiseks ja haldamiseks.", + "Use this table to collect and manage vacation requests." : "Kasuta seda tabelit oma puhkuseavalduste kogumiseks ja haldamiseks.", "Weight tracking" : "Kaalujärgimine", "Track your weight and other health measures." : "Logi kaalu- ja muud terviseandmed.", "Date" : "Kuupäev", @@ -66,7 +76,7 @@ OC.L10N.register( "feel sick" : "tõbine", "party-time" : "pidune", "Name" : "Nimi", - "Account manager" : "Kliendihaldur", + "Account manager" : "Kliendihaldus", "Contract type" : "Lepingu tüüp", "Contract start" : "Lepingu kehtivuse algus", "Contract end" : "Lepingu kehtivuse lõpp", @@ -78,7 +88,7 @@ OC.L10N.register( "Dog food every week" : "Koeratoit kord nädalas", "The dog is our best friend." : "Koer on meie parim sõber.", "Standard, SLA Level 2" : "Standardleping, 2. teenusetase", - "Likes treats" : "Maiustused meelduvad hirmsasti", + "Likes treats" : "Maiustused meeldivad hirmsasti", "Cat" : "Kass", "Cat food every week" : "Kassitoit kord nädalas", "The cat is also our best friend." : "Eks kass ole ju ka meie parim sõber.", @@ -169,6 +179,7 @@ OC.L10N.register( "Selection" : "Valik", "Date and time" : "Kuupäev ja kellaaeg", "Users and groups" : "Kasutajad ja grupid", + "Relation" : "Relatsioon", "Column type" : "Veeru tüüp", "Move" : "Teisalda", "Metadata" : "Metaandmed", @@ -206,17 +217,18 @@ OC.L10N.register( "Last edited" : "Viimati muudetud", "Shares" : "Jagamised", "Actions" : "Tegevused", - "Edit view" : "Muutmisvaade", + "Edit view" : "Muuda vaadet", "Share" : "Jaga", "Integration" : "Lõimingud", - "Delete view" : "Kustutamisvaade", + "Delete view" : "Kustuta vaade", "Total" : "Kokku", "Data" : "Andmed", "Manage table" : "Halda tabelit", "Edit table" : "Muuda tabelit", "Create column" : "Lisa veerg", "Import" : "Impordi", - "Export as CSV" : "Ekspordi CSV-failina", + "Export all rows" : "Ekspordi kõik read", + "Export filtered rows" : "Ekspordi filtreeritud read", "Filtered view" : "Filtreeritud vaade", "Reset local adjustments" : "Eemalda kohalikud kohendused", "No columns" : "Veerge pole", @@ -228,6 +240,9 @@ OC.L10N.register( "Please insert a title for the new column." : "Palun lisa veerule pealkiri.", "Cannot save column. Column width must be between {min} and {max}." : "Veeru salvestamine ei õnnestu. Veeru laius peab olema vahemikus {min} kuni {max}.", "You need to select a type for the new column." : "Sa pead uuele veerule määrama andmetüübi.", + "Please select a relation type." : "Palun vali relatsiooni tüüp.", + "Please select a target." : "Palun vali sihtobjekt.", + "Please select a label for relation selection." : "Palun vali silt relatsiooni valiku jaoks.", "The column \"{column}\" was created." : "„{column}“ veerg on lisatud.", "Sorry, something went wrong." : "Vabandust, midagi läks valesti.", "Could not create new column." : "Uue veeru lisamine ei õnnestunud.", @@ -247,7 +262,7 @@ OC.L10N.register( "Create an application" : "Koosta rakendus", "Title" : "Pealkiri", "Select icon for the application" : "Lisa rakendusele ikoon", - "Select icon" : "Valiikoon", + "Select icon" : "Vali ikoon", "Title of the new application" : "Uue rakenduse nimi", "Description of the new application" : "Uue rakenduse kirjeldus", "Resources" : "Ressursid", @@ -274,10 +289,12 @@ OC.L10N.register( "Custom table from scratch." : "Koosta tabel nullist", "📄 Import table" : "📄 Impordi tabel", "Import table from file." : "Impordi tabel failist.", + "📄 Import Scheme" : "📄 Impordi andmeskeem", + "Import Scheme from file." : "Impordi andmeskeem failist.", "Are you sure you want to delete column \"{column}\"?" : "Kas oled kindel, et soovid „{column}“ veeru kustutada?", "Error occurred while deleting column \"{column}\"." : "Viga „{column}“ veeru kustutamisel.", "Delete column" : "Kustuta veerg", - "Do you really want to delete the application \"{context}\"? This will also delete the shares and unshare the resources that are connected to this application." : "Kas oled kindel et soovid „{context}“ rakendust kustutada? See kustutab ka jagamised ja eemaldab rakendusega seotud jagatud ressursside seosed.", + "Do you really want to delete the application \"{context}\"? This will also delete the shares and unshare the resources that are connected to this application." : "Kas oled kindel et soovid „{context}“ rakenduse kustutada? Sellega kustutad ka jagamised ja eemaldad rakendusega seotud jagatud ressursside seosed.", "Application \"{context}\" removed." : "„{context}“ rakendus on eemaldatud", "Confirm application deletion" : "Kinnita rakenduse kustutamine", "Cancel" : "Loobu", @@ -314,8 +331,9 @@ OC.L10N.register( "I really want to delete this table!" : "Ma tõesti tahan selle tabeli kustutada!", "Change owner" : "Muuda omanikku", "Could not create table" : "Tabeli loomine ei õnnestunud", + "File import started, this might take a while. You will be notified once it finished." : "Faili importimine algas ja selleks võib kuluda aega. Kui tegevus lõppeb, siis saad vastava teavituse.", "You must select an existing table" : "sa pead valima olemasoleva tabeli", - "Could not import data to table" : "Tabelisse andmete importimine ei õnenstunud", + "Could not import data to table" : "Tabelisse andmete importimine ei õnnestunud", "Import file into Tables" : "Impordi fail tabelrakendusse", "Import as new table" : "Impordi uue tabelina", "This will create a new table from the data in this file." : "Järgnevaga luuakse selle faili andmete alusel uus tabel.", @@ -341,6 +359,7 @@ OC.L10N.register( "Select from Files" : "Vali failidest", "Upload from device" : "Laadi üles seadmest", "Supported formats: xlsx, xls, csv, html, xml" : "Toetatud vormingud: xlsx, xls, csv, html, xml", + "First row of the file must contain column headings without gaps." : "Faili esimene rida peab sisaldama ilma tühikuteta veerupealkirju.", "⚠️ You don't have the permission to create columns." : "⚠️ Sul pole õigusi veergude lisamiseks.", "Preview" : "Eelvaade", "Importing data from " : "Impordin andmeid allikast", @@ -360,6 +379,7 @@ OC.L10N.register( "Updated rows" : "Uuendatud read", "Value parsing errors" : "Väärtuse töötlemise vead", "Row creation errors" : "Rea lisamise vead", + "Import scheme" : "Impordi andmeskeem", "Context \"{name}\" transferred to {user}" : "„{name}“ omand on üle antud kasutajale {user}", "Transfer the application \"{context}\" to another user" : "Anna „{context}“ rakenduse omand teisele kasutajale üle", "Transfer" : "Anna omand üle", @@ -402,14 +422,15 @@ OC.L10N.register( "User, group or team …" : "Kasutaja, grupp või tiim", "User or group …" : "Kasutaja või grupp…", "Failed to fetch share recommendations" : "Jagamiste soovituste laadimine ei õnnestunud", - "No recommendations. Start typing." : "Soovitusi pole. Alusta trükkimist.", - "Receiver type" : "VaSTUVÕTJA TÜÜP", + "No recommendations. Start typing." : "Soovitusi pole. Alusta sisestamist.", + "Receiver type" : "Vastuvõtja tüüp", "Create time" : "Loomise aeg", "Share ID" : "Jagamise tunnus", "Copy internal link to clipboard" : "Kopeeri sisemine link lõikelauale", "Only works for users with access to this view" : "Toimib vaid kasutajate puhul, kellel on ligipääs sellele vaatele", "Only works for users with access to this table" : "Toimib vaid kasutajate puhul, kellel on ligipääs sellele tabelile", "Internal link" : "Sisemine link", + "Any application created by a demoted share recipients using a shared table will continue to consume its data." : "Kõik rakendused, mille on loonud tabelit jagamise adressaatide poolt jätkavad selle andmete kasutamist ka pärast nende kasutajate õiguste/rolli/ligipääsu vähendamist.", "group" : "grupp", "team" : "tiim", "Table manager" : "Tabelihaldur", @@ -422,13 +443,14 @@ OC.L10N.register( "Demote to normal share" : "Muuda tavaliseks jagamiseks", "Open main table to adjust table management permissions" : "Tabeli haldusõiguste kohendamiseks ava põhitabel", "No shares" : "Jagamisi pole", + "After the promotion of the share recipient to table manager, any applications created by share recipients that utilise this table will continue to access its data, even if you later demote them." : "Pärast jagamise saaja edutamist tabeli haldajaks säilitavad kõik jagamise adressaatide loodud rakendused, mis seda tabelit kasutavad, juurdepääsu selle andmetele isegi juhul, kui sa hiljem nende õigusi või rolli vähendad.", "Confirm table manager promotion" : "Kinnita tabelihalduri muudatus", "View only" : "Ainult vaatamine", "Can edit" : "Võib muuta", "Custom permissions" : "Kohandatud õigused", "Quick share options, current: {option}" : "Kiirjagamisvalikud, hetkel: {option}", "Read" : "Lugemine", - "Update" : "Uuenda", + "Update" : "Uuendamine", "Error creating link share" : "Viga lingiga jagamisvõimaluse loomisel", "Error deleting link share" : "Viga lingiga jagamisvõimaluse kustutamisel", "Link copied to clipboard" : "Link on lõikelauale kopeeritud", @@ -450,13 +472,13 @@ OC.L10N.register( "View ID" : "Vaate tunnus", "Sharing" : "Jagamine", "API" : "API", - "This is your API endpoint for this view" : "See on APi otspunkt antud vaate jaoks", + "This is your API endpoint for this view" : "See on API otspunkt antud vaate jaoks", "Copy to clipboard" : "Kopeeri lõikepuhvrisse", "Your permissions" : "Sinu õigused", "This application could not be found" : "Seda rakendust ei leidu", "Some resources in this application could not be loaded" : "Mõnda selle rakenduse ressurssi polnud võimalik laadida", "Create new table" : "Koosta uus tabel", - "Searching …" : "Otsin ...", + "Searching …" : "Otsin...", "No elements found." : "Elemente ei leidu.", "Select a table or view" : "Vali tabel või vaade", "No selected resources" : "Valitud ressursse ei ole", @@ -468,7 +490,7 @@ OC.L10N.register( "No shared resources" : "Jagatud ressursse pole", "Share with accounts" : "Jaga kasutajakontodega", "Error" : "Viga", - "Could not load editor, text not available." : "Tekstitoimeti laadimine ei õnnestunud, tekst poel saadaval.", + "Could not load editor, text not available." : "Tekstitoimeti laadimine ei õnnestunud, tekst pole saadaval.", "Icon {iconName} loading" : "{iconName} ikoon on laadimisel", "Download" : "Laadi alla", "This is a public form." : "See vorm on avalik", @@ -485,7 +507,9 @@ OC.L10N.register( "Invalid protocol. Allowed: {allowed}" : "Vigane protokoll. Lubatud on: {allowed}", "Link providers" : "Linkide teenusepakkujad", "This option is outdated." : "See valik on aegunud.", - "Options" : "Sätted", + "Options" : "Valikud", + "This relation does not exist anymore." : "Seda relatsiooni pole enam olemas.", + "Select relation value" : "Vali relatsiooni väärtus", "Set {star} stars" : "Lisa {star} tärni", "Cell input" : "Välja sisend", "Back" : "Tagasi", @@ -505,8 +529,9 @@ OC.L10N.register( "Manage column" : "Halda veergu", "Column manage actions" : "Veeru haldamise tegevused", "Hide column" : "Peida veerg", + "Copy row" : "Kopeeri rida", "Undo" : "Tühista", - "Redo" : "Tee uuesti", + "Redo" : "Korda tegevust", "Bold" : "Paks kiri", "Italic" : "Kaldkiri", "Bullet list" : "Nummerdamata loend", @@ -534,10 +559,17 @@ OC.L10N.register( "Default" : "Vaikeväärtus", "Reduce stars" : "Vähenda tärne", "Increase stars" : "Lisa tärne", + "Relation type" : "Relatsiooni tüüp", + "Select relation type" : "Vali relatsiooni tüüp", + "Select target" : "Vali sihtobjekt", + "Label for relation selection" : "Silt relatsiooni valiku jaoks", + "Select label for relation selection" : "Vali silt relatsiooni valiku jaoks", + "Only text and number columns can be used as label" : "Sildina saad kasutada vaid teksti- ja numbrivormingus veerge", "First option" : "Esimene valik", "Second option" : "Teine valik", "Delete option" : "Kustuta valik", "Add option" : "Lisa valik", + "You can set a default value by clicking on one of the radio buttons next to the label fields." : "Vaikimisi väärtuse saad määrata, klõpsates ühele valikunupule (raadionupule) märgistusväljade kõrval.", "Click here to unset default selection." : "Vaikimisi valiku eemaldamiseks klõpsi siin.", "You can set default values by marking the checkboxes next to the label fields." : "Linnutades siltide kõrval asuvad märkeruudud saad sa seadistada vaikimisi väärtusi.", "Allowed pattern (regex)" : "Lubatud muster (regulaaravaldis)", @@ -551,13 +583,13 @@ OC.L10N.register( "Show user status" : "Näita kasutaja olekut", "Please select a new time" : "Palun vali uus aeg", "This field is mandatory" : "See väli on kohustuslik", - "You can not insert any links in this field. Please configure at least one link provider in the column configuration." : "Siia veergu ei saa suvalist linki lisada. Palun seadista veeri valikutest vähemat üks lingi teenusepakkuja.", + "You can not insert any links in this field. Please configure at least one link provider in the column configuration." : "Siia veergu ei saa suvalist linki lisada. Palun seadista veeru valikutest vähemat üks lingi teenusepakkuja.", "Copy link" : "Kopeeri link", "Open link" : "Ava link", "Show fullscreen" : "Näita täisekraanivaates", "Close editor" : "Sulge muutmisvaade", "Create Row" : "Lisa rida", - "Export CSV" : "Ekspordi csv-failina", + "Export selected rows" : "Ekspordi valitud read", "Uncheck all" : "Eemalda kogu valik", "_%n selected row_::_%n selected rows_" : ["%n valitud rida","%n valitud rida"], "Go to first page" : "Mine esimesele lehele", @@ -584,6 +616,7 @@ OC.L10N.register( "Could not remove share." : "Jagamise eemaldamine ei õnnestunud.", "Could not update share." : "Jagamise uuendamine ei õnnestunud.", "Could not update cell" : "Välja uuendamine ei õnnestunud", + "Filter operator" : "Filtri tehtemärk", "Contains items" : "Sisaldab objekte", "Contains" : "Sisaldab", "Does not contain" : "ei sisalda", @@ -597,7 +630,7 @@ OC.L10N.register( "Is lower than or equal" : "On võrdne või väiksem, kui", "Is empty" : "On tühi", "Magic field" : "Maagiline väli", - "Me (user ID)" : "Mina (kasutajatunnud)", + "Me (user ID)" : "Mina (kasutajatunnus)", "Me (name)" : "Mina (nimi)", "Checked" : "Märgitud", "Unchecked" : "Pole kontrollitud", @@ -610,7 +643,7 @@ OC.L10N.register( "Number of days ahead" : "Päevi tulevikus", "Enter number of days" : "Sisesta päevade arv", "Number of days ago" : "Päevi minevikus", - "ID" : "ID", + "ID" : "Tunnus", "Creator" : "Looja", "Last editor" : "Viimane muutja", "Last edited at" : "Viimase muutmise aeg", @@ -630,11 +663,12 @@ OC.L10N.register( "Could not insert column." : "Veeru lisamine ei õnnestunud.", "Could not update column." : "Veeru uuendamine ei õnnestunud.", "Could not remove column." : "Veeru eemaldamine ei õnnestunud.", + "Could not load relation data." : "Relatsiooni andmete laadimine ei õnnestunud.", "Could not load rows." : "Ridade laadimine ei õnnestunud.", "Outdated data. View is reloaded" : "Andmed on aegunud. Laadin vaate uuesti", "Could not insert row." : "Rea lisamine ei õnnestunud.", "Could not remove row." : "Rea eemaldamine ei õnnestunud.", - "Could not verify row. View is reloaded" : "Rea verifitseerimine ei õnnestunud. on aegunud. Laadin vaate uuesti", + "Could not verify row. View is reloaded" : "Rea õigsuse kontrollimine ei õnnestunud. Laadisin vaate uuesti", "Could not insert table." : "Tabeli lisamine ei õnnestunud.", "Could not load tables." : "Tabelite laadimine ei õnnestunud.", "Could not fetch tables" : "Tabeleid polnud võimalik kätte saada", @@ -646,9 +680,9 @@ OC.L10N.register( "Could not remove view." : "Vaate eemaldamine ei õnnestunud.", "Could not reload view." : "Vaate laadimine ei õnnestunud.", "Could not update table." : "Tabeli uuendamine ei õnnestunud.", - "Could not mark view as favorite" : "Vaate märkimine lemmikuks ei õnnestunud", + "Could not mark view as favorite" : "Vaate lemmikuks märkimine ei õnnestunud", "Could not remove view from favorites" : "Vaate eemaldamine lemmikute hulgast ei õnnestunud", - "Could not mark table as favorite" : "Tabeli märkimine lemmikuks ei õnnestunud", + "Could not mark table as favorite" : "Tabeli lemmikuks märkimine ei õnnestunud", "Could not remove table from favorites" : "Tabeli eemaldamine lemmikute hulgast ei õnnestunud", "Could not add application share." : "Rakenduse siia lisamine ei õnnestunud.", "Could not remove application share." : "Rakenduse jagamise eemaldamine ei õnnestunud.", @@ -667,7 +701,7 @@ OC.L10N.register( "Could not verify export permissions." : "Ekspordiõiguste kontrollimine ei õnnestunud.", "Could not transfer application." : "Rakenduse omandi üleandmine ei õnnestunud.", "Could not remove application." : "Ei õnnestunud eemaldada rakendust.", - "Could not remove table." : "Ei õnnestunud eemaldada tabelit.", + "Could not remove table." : "Tabeli eemaldamine ei õnnestunud.", "Share not found" : "Jagamist ei leidu", "This share does not exist or is no longer available" : "See jaosmeedia pole enam olemas või saadaval", "Back to %s" : "Tagasi siia: %s" diff --git a/l10n/et_EE.json b/l10n/et_EE.json index 75b03476ab..53cc80dfeb 100644 --- a/l10n/et_EE.json +++ b/l10n/et_EE.json @@ -13,23 +13,33 @@ "_{user} has updated cell %1$s on row {row} in table {table}_::_{user} has updated cells %1$s on row {row} in table {table}_" : ["{user} on uuendanud „{table}“ tabeli {row}. rea välja %1$s","{user} on uuendanud „{table}“ tabeli {row}. rea välju %1$s"], "You have deleted the row {row} in table {table}" : "Sa oled kustutanud {row}. rea tabelist „{table}“", "{user} has deleted the row {row} in table {table}" : "Kasutaja {user} on kustutanud {row}. rea tabelist „{table}“", + "You have imported file to table {table}" : "Sa oled faili importinud „{table}“ tabelisse", + "{user} has imported file to table {table}" : "{user} on faili importinud „{table}“ tabelisse", + "Found columns: {foundColumnsCount}" : "Leitud veerud: {foundColumnsCount}", + "Matching columns: {matchingColumnsCount}" : "Vastavuses veerud: {matchingColumnsCount}", + "Created columns: {createdColumnsCount}" : "Loodud veerud: {createdColumnsCount}", + "Inserted rows: {insertedRowsCount}" : "Lisatud veerud: {insertedRowsCount}", + "Updated rows: {updatedRowsCount}" : "Uuendatud veerud: {updatedRowsCount}", + "Value parsing errors: {errorsParsingCount}" : "Väärtuste töötlemise vead: {errorsParsingCount}", + "Row creation errors: {errorsCount}" : "Ridade lisamise vead: {errorsCount}", "Tables" : "Tabelid", "A table or row was changed" : "Tabel või rida on muutunud", - "Nextcloud Tables" : "Nextcloudi Tabelid", + "Nextcloud Tables" : "Nextcloudi tabelid", "Select table" : "Vali tabel", "Select columns" : "Vali veerud", "e.g. 1,2,4 or leave empty" : "nt. 1,2,4 või jäta tühjaks", "Timestamp of data load" : "Andmete laadimise ajatempel", "No" : "Ei", "Yes" : "Jah", + "Count" : "Kokku", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Tekkis ootamatu viga. Detailne veateave on leitav logidest. Palun küsi abi serveri haldajalt.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Tekkis õigustega seotud viga. Detailne veateave on leitav logidest. Palun küsi abi serveri haldajalt.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Tekkis viga, kus objekti ei leidu. Detailne veateave on leitav logidest. Palun küsi abi serveri haldajalt.", "Could not create row." : "Rea loomine ei õnnestunud.", "Could not update row." : "Rea uuendamine ei õnnestunud.", "The file was uploaded" : "Fail laaditi üles", - "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Üleslaaditud fail on suurem kui php.ini failis määratud upload_max_filesize direktiiv", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Üleslaaditud fail on suurem kui HTML vormil määratud MAX_FILE_SIZE direktiiv", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Üleslaaditud fail on suurem kui php.ini failis määratud upload_max_filesize direktiiv lubaks", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Üleslaaditud fail on suurem kui HTML vormil määratud MAX_FILE_SIZE direktiiv lubaks", "The file was only partially uploaded" : "Fail laaditi üles ainult osaliselt", "No file was uploaded" : "Ühtegi faili ei laaditud üles", "Missing a temporary folder" : "Ajutine kaust on puudu", @@ -53,7 +63,7 @@ "Customers" : "Kliendid", "Manage your customers." : "Halda oma kliente.", "Vacation requests" : "Puhkusetaotlused", - "Use this table to collect and manage vacation requests." : "Kasuta seda tabelit oma puhkusetaotluste kogumiseks ja haldamiseks.", + "Use this table to collect and manage vacation requests." : "Kasuta seda tabelit oma puhkuseavalduste kogumiseks ja haldamiseks.", "Weight tracking" : "Kaalujärgimine", "Track your weight and other health measures." : "Logi kaalu- ja muud terviseandmed.", "Date" : "Kuupäev", @@ -64,7 +74,7 @@ "feel sick" : "tõbine", "party-time" : "pidune", "Name" : "Nimi", - "Account manager" : "Kliendihaldur", + "Account manager" : "Kliendihaldus", "Contract type" : "Lepingu tüüp", "Contract start" : "Lepingu kehtivuse algus", "Contract end" : "Lepingu kehtivuse lõpp", @@ -76,7 +86,7 @@ "Dog food every week" : "Koeratoit kord nädalas", "The dog is our best friend." : "Koer on meie parim sõber.", "Standard, SLA Level 2" : "Standardleping, 2. teenusetase", - "Likes treats" : "Maiustused meelduvad hirmsasti", + "Likes treats" : "Maiustused meeldivad hirmsasti", "Cat" : "Kass", "Cat food every week" : "Kassitoit kord nädalas", "The cat is also our best friend." : "Eks kass ole ju ka meie parim sõber.", @@ -167,6 +177,7 @@ "Selection" : "Valik", "Date and time" : "Kuupäev ja kellaaeg", "Users and groups" : "Kasutajad ja grupid", + "Relation" : "Relatsioon", "Column type" : "Veeru tüüp", "Move" : "Teisalda", "Metadata" : "Metaandmed", @@ -204,17 +215,18 @@ "Last edited" : "Viimati muudetud", "Shares" : "Jagamised", "Actions" : "Tegevused", - "Edit view" : "Muutmisvaade", + "Edit view" : "Muuda vaadet", "Share" : "Jaga", "Integration" : "Lõimingud", - "Delete view" : "Kustutamisvaade", + "Delete view" : "Kustuta vaade", "Total" : "Kokku", "Data" : "Andmed", "Manage table" : "Halda tabelit", "Edit table" : "Muuda tabelit", "Create column" : "Lisa veerg", "Import" : "Impordi", - "Export as CSV" : "Ekspordi CSV-failina", + "Export all rows" : "Ekspordi kõik read", + "Export filtered rows" : "Ekspordi filtreeritud read", "Filtered view" : "Filtreeritud vaade", "Reset local adjustments" : "Eemalda kohalikud kohendused", "No columns" : "Veerge pole", @@ -226,6 +238,9 @@ "Please insert a title for the new column." : "Palun lisa veerule pealkiri.", "Cannot save column. Column width must be between {min} and {max}." : "Veeru salvestamine ei õnnestu. Veeru laius peab olema vahemikus {min} kuni {max}.", "You need to select a type for the new column." : "Sa pead uuele veerule määrama andmetüübi.", + "Please select a relation type." : "Palun vali relatsiooni tüüp.", + "Please select a target." : "Palun vali sihtobjekt.", + "Please select a label for relation selection." : "Palun vali silt relatsiooni valiku jaoks.", "The column \"{column}\" was created." : "„{column}“ veerg on lisatud.", "Sorry, something went wrong." : "Vabandust, midagi läks valesti.", "Could not create new column." : "Uue veeru lisamine ei õnnestunud.", @@ -245,7 +260,7 @@ "Create an application" : "Koosta rakendus", "Title" : "Pealkiri", "Select icon for the application" : "Lisa rakendusele ikoon", - "Select icon" : "Valiikoon", + "Select icon" : "Vali ikoon", "Title of the new application" : "Uue rakenduse nimi", "Description of the new application" : "Uue rakenduse kirjeldus", "Resources" : "Ressursid", @@ -272,10 +287,12 @@ "Custom table from scratch." : "Koosta tabel nullist", "📄 Import table" : "📄 Impordi tabel", "Import table from file." : "Impordi tabel failist.", + "📄 Import Scheme" : "📄 Impordi andmeskeem", + "Import Scheme from file." : "Impordi andmeskeem failist.", "Are you sure you want to delete column \"{column}\"?" : "Kas oled kindel, et soovid „{column}“ veeru kustutada?", "Error occurred while deleting column \"{column}\"." : "Viga „{column}“ veeru kustutamisel.", "Delete column" : "Kustuta veerg", - "Do you really want to delete the application \"{context}\"? This will also delete the shares and unshare the resources that are connected to this application." : "Kas oled kindel et soovid „{context}“ rakendust kustutada? See kustutab ka jagamised ja eemaldab rakendusega seotud jagatud ressursside seosed.", + "Do you really want to delete the application \"{context}\"? This will also delete the shares and unshare the resources that are connected to this application." : "Kas oled kindel et soovid „{context}“ rakenduse kustutada? Sellega kustutad ka jagamised ja eemaldad rakendusega seotud jagatud ressursside seosed.", "Application \"{context}\" removed." : "„{context}“ rakendus on eemaldatud", "Confirm application deletion" : "Kinnita rakenduse kustutamine", "Cancel" : "Loobu", @@ -312,8 +329,9 @@ "I really want to delete this table!" : "Ma tõesti tahan selle tabeli kustutada!", "Change owner" : "Muuda omanikku", "Could not create table" : "Tabeli loomine ei õnnestunud", + "File import started, this might take a while. You will be notified once it finished." : "Faili importimine algas ja selleks võib kuluda aega. Kui tegevus lõppeb, siis saad vastava teavituse.", "You must select an existing table" : "sa pead valima olemasoleva tabeli", - "Could not import data to table" : "Tabelisse andmete importimine ei õnenstunud", + "Could not import data to table" : "Tabelisse andmete importimine ei õnnestunud", "Import file into Tables" : "Impordi fail tabelrakendusse", "Import as new table" : "Impordi uue tabelina", "This will create a new table from the data in this file." : "Järgnevaga luuakse selle faili andmete alusel uus tabel.", @@ -339,6 +357,7 @@ "Select from Files" : "Vali failidest", "Upload from device" : "Laadi üles seadmest", "Supported formats: xlsx, xls, csv, html, xml" : "Toetatud vormingud: xlsx, xls, csv, html, xml", + "First row of the file must contain column headings without gaps." : "Faili esimene rida peab sisaldama ilma tühikuteta veerupealkirju.", "⚠️ You don't have the permission to create columns." : "⚠️ Sul pole õigusi veergude lisamiseks.", "Preview" : "Eelvaade", "Importing data from " : "Impordin andmeid allikast", @@ -358,6 +377,7 @@ "Updated rows" : "Uuendatud read", "Value parsing errors" : "Väärtuse töötlemise vead", "Row creation errors" : "Rea lisamise vead", + "Import scheme" : "Impordi andmeskeem", "Context \"{name}\" transferred to {user}" : "„{name}“ omand on üle antud kasutajale {user}", "Transfer the application \"{context}\" to another user" : "Anna „{context}“ rakenduse omand teisele kasutajale üle", "Transfer" : "Anna omand üle", @@ -400,14 +420,15 @@ "User, group or team …" : "Kasutaja, grupp või tiim", "User or group …" : "Kasutaja või grupp…", "Failed to fetch share recommendations" : "Jagamiste soovituste laadimine ei õnnestunud", - "No recommendations. Start typing." : "Soovitusi pole. Alusta trükkimist.", - "Receiver type" : "VaSTUVÕTJA TÜÜP", + "No recommendations. Start typing." : "Soovitusi pole. Alusta sisestamist.", + "Receiver type" : "Vastuvõtja tüüp", "Create time" : "Loomise aeg", "Share ID" : "Jagamise tunnus", "Copy internal link to clipboard" : "Kopeeri sisemine link lõikelauale", "Only works for users with access to this view" : "Toimib vaid kasutajate puhul, kellel on ligipääs sellele vaatele", "Only works for users with access to this table" : "Toimib vaid kasutajate puhul, kellel on ligipääs sellele tabelile", "Internal link" : "Sisemine link", + "Any application created by a demoted share recipients using a shared table will continue to consume its data." : "Kõik rakendused, mille on loonud tabelit jagamise adressaatide poolt jätkavad selle andmete kasutamist ka pärast nende kasutajate õiguste/rolli/ligipääsu vähendamist.", "group" : "grupp", "team" : "tiim", "Table manager" : "Tabelihaldur", @@ -420,13 +441,14 @@ "Demote to normal share" : "Muuda tavaliseks jagamiseks", "Open main table to adjust table management permissions" : "Tabeli haldusõiguste kohendamiseks ava põhitabel", "No shares" : "Jagamisi pole", + "After the promotion of the share recipient to table manager, any applications created by share recipients that utilise this table will continue to access its data, even if you later demote them." : "Pärast jagamise saaja edutamist tabeli haldajaks säilitavad kõik jagamise adressaatide loodud rakendused, mis seda tabelit kasutavad, juurdepääsu selle andmetele isegi juhul, kui sa hiljem nende õigusi või rolli vähendad.", "Confirm table manager promotion" : "Kinnita tabelihalduri muudatus", "View only" : "Ainult vaatamine", "Can edit" : "Võib muuta", "Custom permissions" : "Kohandatud õigused", "Quick share options, current: {option}" : "Kiirjagamisvalikud, hetkel: {option}", "Read" : "Lugemine", - "Update" : "Uuenda", + "Update" : "Uuendamine", "Error creating link share" : "Viga lingiga jagamisvõimaluse loomisel", "Error deleting link share" : "Viga lingiga jagamisvõimaluse kustutamisel", "Link copied to clipboard" : "Link on lõikelauale kopeeritud", @@ -448,13 +470,13 @@ "View ID" : "Vaate tunnus", "Sharing" : "Jagamine", "API" : "API", - "This is your API endpoint for this view" : "See on APi otspunkt antud vaate jaoks", + "This is your API endpoint for this view" : "See on API otspunkt antud vaate jaoks", "Copy to clipboard" : "Kopeeri lõikepuhvrisse", "Your permissions" : "Sinu õigused", "This application could not be found" : "Seda rakendust ei leidu", "Some resources in this application could not be loaded" : "Mõnda selle rakenduse ressurssi polnud võimalik laadida", "Create new table" : "Koosta uus tabel", - "Searching …" : "Otsin ...", + "Searching …" : "Otsin...", "No elements found." : "Elemente ei leidu.", "Select a table or view" : "Vali tabel või vaade", "No selected resources" : "Valitud ressursse ei ole", @@ -466,7 +488,7 @@ "No shared resources" : "Jagatud ressursse pole", "Share with accounts" : "Jaga kasutajakontodega", "Error" : "Viga", - "Could not load editor, text not available." : "Tekstitoimeti laadimine ei õnnestunud, tekst poel saadaval.", + "Could not load editor, text not available." : "Tekstitoimeti laadimine ei õnnestunud, tekst pole saadaval.", "Icon {iconName} loading" : "{iconName} ikoon on laadimisel", "Download" : "Laadi alla", "This is a public form." : "See vorm on avalik", @@ -483,7 +505,9 @@ "Invalid protocol. Allowed: {allowed}" : "Vigane protokoll. Lubatud on: {allowed}", "Link providers" : "Linkide teenusepakkujad", "This option is outdated." : "See valik on aegunud.", - "Options" : "Sätted", + "Options" : "Valikud", + "This relation does not exist anymore." : "Seda relatsiooni pole enam olemas.", + "Select relation value" : "Vali relatsiooni väärtus", "Set {star} stars" : "Lisa {star} tärni", "Cell input" : "Välja sisend", "Back" : "Tagasi", @@ -503,8 +527,9 @@ "Manage column" : "Halda veergu", "Column manage actions" : "Veeru haldamise tegevused", "Hide column" : "Peida veerg", + "Copy row" : "Kopeeri rida", "Undo" : "Tühista", - "Redo" : "Tee uuesti", + "Redo" : "Korda tegevust", "Bold" : "Paks kiri", "Italic" : "Kaldkiri", "Bullet list" : "Nummerdamata loend", @@ -532,10 +557,17 @@ "Default" : "Vaikeväärtus", "Reduce stars" : "Vähenda tärne", "Increase stars" : "Lisa tärne", + "Relation type" : "Relatsiooni tüüp", + "Select relation type" : "Vali relatsiooni tüüp", + "Select target" : "Vali sihtobjekt", + "Label for relation selection" : "Silt relatsiooni valiku jaoks", + "Select label for relation selection" : "Vali silt relatsiooni valiku jaoks", + "Only text and number columns can be used as label" : "Sildina saad kasutada vaid teksti- ja numbrivormingus veerge", "First option" : "Esimene valik", "Second option" : "Teine valik", "Delete option" : "Kustuta valik", "Add option" : "Lisa valik", + "You can set a default value by clicking on one of the radio buttons next to the label fields." : "Vaikimisi väärtuse saad määrata, klõpsates ühele valikunupule (raadionupule) märgistusväljade kõrval.", "Click here to unset default selection." : "Vaikimisi valiku eemaldamiseks klõpsi siin.", "You can set default values by marking the checkboxes next to the label fields." : "Linnutades siltide kõrval asuvad märkeruudud saad sa seadistada vaikimisi väärtusi.", "Allowed pattern (regex)" : "Lubatud muster (regulaaravaldis)", @@ -549,13 +581,13 @@ "Show user status" : "Näita kasutaja olekut", "Please select a new time" : "Palun vali uus aeg", "This field is mandatory" : "See väli on kohustuslik", - "You can not insert any links in this field. Please configure at least one link provider in the column configuration." : "Siia veergu ei saa suvalist linki lisada. Palun seadista veeri valikutest vähemat üks lingi teenusepakkuja.", + "You can not insert any links in this field. Please configure at least one link provider in the column configuration." : "Siia veergu ei saa suvalist linki lisada. Palun seadista veeru valikutest vähemat üks lingi teenusepakkuja.", "Copy link" : "Kopeeri link", "Open link" : "Ava link", "Show fullscreen" : "Näita täisekraanivaates", "Close editor" : "Sulge muutmisvaade", "Create Row" : "Lisa rida", - "Export CSV" : "Ekspordi csv-failina", + "Export selected rows" : "Ekspordi valitud read", "Uncheck all" : "Eemalda kogu valik", "_%n selected row_::_%n selected rows_" : ["%n valitud rida","%n valitud rida"], "Go to first page" : "Mine esimesele lehele", @@ -582,6 +614,7 @@ "Could not remove share." : "Jagamise eemaldamine ei õnnestunud.", "Could not update share." : "Jagamise uuendamine ei õnnestunud.", "Could not update cell" : "Välja uuendamine ei õnnestunud", + "Filter operator" : "Filtri tehtemärk", "Contains items" : "Sisaldab objekte", "Contains" : "Sisaldab", "Does not contain" : "ei sisalda", @@ -595,7 +628,7 @@ "Is lower than or equal" : "On võrdne või väiksem, kui", "Is empty" : "On tühi", "Magic field" : "Maagiline väli", - "Me (user ID)" : "Mina (kasutajatunnud)", + "Me (user ID)" : "Mina (kasutajatunnus)", "Me (name)" : "Mina (nimi)", "Checked" : "Märgitud", "Unchecked" : "Pole kontrollitud", @@ -608,7 +641,7 @@ "Number of days ahead" : "Päevi tulevikus", "Enter number of days" : "Sisesta päevade arv", "Number of days ago" : "Päevi minevikus", - "ID" : "ID", + "ID" : "Tunnus", "Creator" : "Looja", "Last editor" : "Viimane muutja", "Last edited at" : "Viimase muutmise aeg", @@ -628,11 +661,12 @@ "Could not insert column." : "Veeru lisamine ei õnnestunud.", "Could not update column." : "Veeru uuendamine ei õnnestunud.", "Could not remove column." : "Veeru eemaldamine ei õnnestunud.", + "Could not load relation data." : "Relatsiooni andmete laadimine ei õnnestunud.", "Could not load rows." : "Ridade laadimine ei õnnestunud.", "Outdated data. View is reloaded" : "Andmed on aegunud. Laadin vaate uuesti", "Could not insert row." : "Rea lisamine ei õnnestunud.", "Could not remove row." : "Rea eemaldamine ei õnnestunud.", - "Could not verify row. View is reloaded" : "Rea verifitseerimine ei õnnestunud. on aegunud. Laadin vaate uuesti", + "Could not verify row. View is reloaded" : "Rea õigsuse kontrollimine ei õnnestunud. Laadisin vaate uuesti", "Could not insert table." : "Tabeli lisamine ei õnnestunud.", "Could not load tables." : "Tabelite laadimine ei õnnestunud.", "Could not fetch tables" : "Tabeleid polnud võimalik kätte saada", @@ -644,9 +678,9 @@ "Could not remove view." : "Vaate eemaldamine ei õnnestunud.", "Could not reload view." : "Vaate laadimine ei õnnestunud.", "Could not update table." : "Tabeli uuendamine ei õnnestunud.", - "Could not mark view as favorite" : "Vaate märkimine lemmikuks ei õnnestunud", + "Could not mark view as favorite" : "Vaate lemmikuks märkimine ei õnnestunud", "Could not remove view from favorites" : "Vaate eemaldamine lemmikute hulgast ei õnnestunud", - "Could not mark table as favorite" : "Tabeli märkimine lemmikuks ei õnnestunud", + "Could not mark table as favorite" : "Tabeli lemmikuks märkimine ei õnnestunud", "Could not remove table from favorites" : "Tabeli eemaldamine lemmikute hulgast ei õnnestunud", "Could not add application share." : "Rakenduse siia lisamine ei õnnestunud.", "Could not remove application share." : "Rakenduse jagamise eemaldamine ei õnnestunud.", @@ -665,7 +699,7 @@ "Could not verify export permissions." : "Ekspordiõiguste kontrollimine ei õnnestunud.", "Could not transfer application." : "Rakenduse omandi üleandmine ei õnnestunud.", "Could not remove application." : "Ei õnnestunud eemaldada rakendust.", - "Could not remove table." : "Ei õnnestunud eemaldada tabelit.", + "Could not remove table." : "Tabeli eemaldamine ei õnnestunud.", "Share not found" : "Jagamist ei leidu", "This share does not exist or is no longer available" : "See jaosmeedia pole enam olemas või saadaval", "Back to %s" : "Tagasi siia: %s" diff --git a/l10n/eu.js b/l10n/eu.js index 5d7e57e3d8..32235f6c2b 100644 --- a/l10n/eu.js +++ b/l10n/eu.js @@ -9,6 +9,7 @@ OC.L10N.register( "Timestamp of data load" : "Datu-kargaren denbora-zigilua", "No" : "Ez", "Yes" : "Bai", + "Count" : "Kantitatea", "Could not update row." : "Ezin izan da orain eguneratu.", "The file was uploaded" : "Fitxategia igo da", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Igotako fitxategiak php.ini fitxategiko upload_max_filesize direktiban zehazturikoa gainditzen du", @@ -159,7 +160,6 @@ OC.L10N.register( "Edit table" : "Editatu taula", "Create column" : "Sortu zutabea", "Import" : "Inportatu", - "Export as CSV" : "Esportatu CSV gisa", "Filtered view" : "Iragazitako ikuspegia", "No columns" : "Zutaberik ez", "Manage view" : "Kudeatu ikuspegia", @@ -347,7 +347,6 @@ OC.L10N.register( "Show fullscreen" : "Erakutsi pantaila osoan", "Close editor" : "Itxi editorea", "Create Row" : "Sortu errenkada", - "Export CSV" : "Esportatu CSVa", "Uncheck all" : "Desautatu dena", "_%n selected row_::_%n selected rows_" : ["Hautatutako errenkada %n","%n hautatutako errenkada"], "Go to previous page" : "Itzuli aurreko orrira", diff --git a/l10n/eu.json b/l10n/eu.json index ec282dda84..f2e7de7a10 100644 --- a/l10n/eu.json +++ b/l10n/eu.json @@ -7,6 +7,7 @@ "Timestamp of data load" : "Datu-kargaren denbora-zigilua", "No" : "Ez", "Yes" : "Bai", + "Count" : "Kantitatea", "Could not update row." : "Ezin izan da orain eguneratu.", "The file was uploaded" : "Fitxategia igo da", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Igotako fitxategiak php.ini fitxategiko upload_max_filesize direktiban zehazturikoa gainditzen du", @@ -157,7 +158,6 @@ "Edit table" : "Editatu taula", "Create column" : "Sortu zutabea", "Import" : "Inportatu", - "Export as CSV" : "Esportatu CSV gisa", "Filtered view" : "Iragazitako ikuspegia", "No columns" : "Zutaberik ez", "Manage view" : "Kudeatu ikuspegia", @@ -345,7 +345,6 @@ "Show fullscreen" : "Erakutsi pantaila osoan", "Close editor" : "Itxi editorea", "Create Row" : "Sortu errenkada", - "Export CSV" : "Esportatu CSVa", "Uncheck all" : "Desautatu dena", "_%n selected row_::_%n selected rows_" : ["Hautatutako errenkada %n","%n hautatutako errenkada"], "Go to previous page" : "Itzuli aurreko orrira", diff --git a/l10n/fa.js b/l10n/fa.js index c8f7cfe79e..aa827f18a9 100644 --- a/l10n/fa.js +++ b/l10n/fa.js @@ -1,472 +1,709 @@ OC.L10N.register( "tables", { - "Tables" : "جدول‌ها", - "Nextcloud Tables" : "Nextcloud Tables", - "Select table" : "Select table", - "Select columns" : "Select columns", - "e.g. 1,2,4 or leave empty" : "e.g. 1,2,4 or leave empty", - "Timestamp of data load" : "Timestamp of data load", + "You have created a new table {table}" : "شما جدول جدید {table} را ایجاد کردید", + "{user} has created a new table {table}" : "{user} جدول جدید {table} را ایجاد کرد", + "You have deleted the table {table}" : "شما جدول {table} را حذف کردید", + "{user} has deleted the table {table}" : "{user} جدول {table} را حذف کرد", + "You have renamed the table {before} to {table}" : "شما نام جدول {before} را به {table} تغییر دادید", + "{user} has renamed the table {before} to {table}" : "{user} نام جدول {before} را به {table} تغییر داده است", + "You have updated the description of table {table} to {after}" : "شما توضیحات جدول {table} را به {after} به‌روزرسانی کرده‌اید", + "{user} has updated the description of table {table} to {after}" : "{user} توضیحات جدول {table} را به {after} به‌روزرسانی کرده است", + "You have created a new row {row} in table {table}" : "شما یک سطر جدید به نام {row} در جدول {table} ایجاد کرده‌اید", + "{user} has created a new row {row} in table {table}" : "{user} یک سطر جدید به نام {row} در جدول {table} ایجاد کرده است", + "_You have updated cell %1$s on row {row} in table {table}_::_You have updated cells %1$s on row {row} in table {table}_" : ["شما سلول %1$s را در ردیف {row} از جدول {table} به‌روزرسانی کردید","شما سلول‌های %1$s را در ردیف {row} از جدول {table} به‌روزرسانی کردید"], + "_{user} has updated cell %1$s on row {row} in table {table}_::_{user} has updated cells %1$s on row {row} in table {table}_" : ["{user} سلول %1$s را در ردیف {row} از جدول {table} به‌روزرسانی کرد","{user} سلول‌های %1$s را در ردیف {row} از جدول {table} به‌روزرسانی کرد"], + "You have deleted the row {row} in table {table}" : "شما سطر {row} را در جدول {table} حذف کرده‌اید", + "{user} has deleted the row {row} in table {table}" : "{user} سطر {row} را در جدول {table} حذف کرده است", + "You have imported file to table {table}" : "شما فایلی را به جدول {table} وارد کرده‌اید", + "{user} has imported file to table {table}" : "{user} فایلی را به جدول {table} وارد کرده است", + "Found columns: {foundColumnsCount}" : "ستون‌های یافت شده: {foundColumnsCount}", + "Matching columns: {matchingColumnsCount}" : "ستون‌های منطبق: {matchingColumnsCount}", + "Created columns: {createdColumnsCount}" : "ستون‌های ایجاد شده: {createdColumnsCount}", + "Inserted rows: {insertedRowsCount}" : "سطرهای درج شده: {insertedRowsCount}", + "Updated rows: {updatedRowsCount}" : "سطرهای به‌روزرسانی شده: {updatedRowsCount}", + "Value parsing errors: {errorsParsingCount}" : "خطاهای تجزیه مقادیر: {errorsParsingCount}", + "Row creation errors: {errorsCount}" : "خطاهای ایجاد سطر: {errorsCount}", + "Tables" : "جداول", + "A table or row was changed" : "یک جدول یا سطر تغییر کرد", + "Nextcloud Tables" : "نکست‌کلود Tables", + "Select table" : "انتخاب جدول", + "Select columns" : "انتخاب ستون‌ها", + "e.g. 1,2,4 or leave empty" : "مثلاً 1,2,4 یا خالی بگذارید", + "Timestamp of data load" : "زمان بارگذاری داده", "No" : "خیر", "Yes" : "بله", - "Could not update row." : "Could not update row.", - "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" : "حجم پروندهٔ بارگذاری شده بیش‌تر از MAX_FILE_SIZE مشخّص شده در فرم HTML است", - "The file was only partially uploaded" : "پرونده به صورت ناقص بارگذاری شده بود", - "No file was uploaded" : "هیچ پرونده‌ای بارگذاری نشده", - "Missing a temporary folder" : "یک شاخهٔ موقّتی گم شده", - "Could not write file to disk" : "نتوانست پرونده را روی دیسک بنویسد", - "A PHP extension stopped the file upload" : "یک افزونهٔ پی‌اچ‌پی بارگذاری پرونده را متوقّف کرد", - "No file uploaded or file size exceeds maximum of %s" : "پرونده‌ای بارگذاری نشد و یا حجم پرونده بیش از بیشینه مجاز %s بود", - "Nextcloud tables" : "Nextcloud tables", + "Count" : "تعداد", + "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "خطای غیرمنتظره‌ای رخ داد. جزئیات بیشتر در لاگ‌ها موجود است. لطفاً با مدیر سیستم خود تماس بگیرید.", + "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "خطای دسترسی رخ داد. جزئیات بیشتر در لاگ‌ها موجود است. لطفاً با مدیر سیستم خود تماس بگیرید.", + "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "خطای «پیدا نشد» رخ داد. جزئیات بیشتر در لاگ‌ها موجود است. لطفاً با مدیر سیستم خود تماس بگیرید.", + "Could not create row." : "امکان ایجاد سطر وجود نداشت.", + "Could not update row." : "امکان به‌روزرسانی سطر وجود نداشت.", + "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" : "فایل آپلود شده از دستور MAX_FILE_SIZE که در فرم HTML مشخص شده بود فراتر رفته است", + "The file was only partially uploaded" : "فایل فقط به صورت جزئی آپلود شد", + "No file was uploaded" : "هیچ فایلی آپلود نشد", + "Missing a temporary folder" : "پوشه موقت وجود ندارد", + "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 بیشتر است", + "Deleted team %s." : "تیم %s حذف شد.", + "Nextcloud tables" : "جداول نکست‌کلود", "_%n row_::_%n rows_" : ["%n row","%n rows"], - "This column was automatically created by the import service." : "This column was automatically created by the import service.", - "ToDo list" : "ToDo list", - "Setup a simple todo-list." : "Setup a simple todo-list.", + "table" : "جدول", + "table view" : "نمای جدول", + "Column width must be between %1$s and %2$s." : "عرض ستون باید بین %1$s و %2$s باشد.", + "This column was automatically created by the import service." : "این ستون به‌طور خودکار توسط سرویس واردات ایجاد شده است.", + "Column \"%s\" contains a non-unique value." : "ستون \"%s\" حاوی مقدار غیریکتا است.", + "Column \"%s\" contains an invalid protocol. Only http and https are allowed." : "ستون \"%s\" حاوی پروتکل نامعتبر است. فقط http و https مجاز هستند.", + "Welcome to %s Tables!" : "به جداول %s خوش آمدید!", + "ToDo list" : "لیست کارها", + "Setup a simple todo-list." : "یک لیست ساده از کارها ایجاد کنید.", "Members" : "اعضا", - "List of members with some basic attributes." : "List of members with some basic attributes.", - "Customers" : "Customers", - "Manage your customers." : "Manage your customers.", - "Vacation requests" : "Vacation requests", - "Use this table to collect and manage vacation requests." : "Use this table to collect and manage vacation requests.", - "Weight tracking" : "Weight tracking", - "Track your weight and other health measures." : "Track your weight and other health measures.", + "List of members with some basic attributes." : "لیست اعضا با برخی ویژگی‌های پایه.", + "Customers" : "مشتریان", + "Manage your customers." : "مشتریان خود را مدیریت کنید.", + "Vacation requests" : "درخواست‌های مرخصی", + "Use this table to collect and manage vacation requests." : "از این جدول برای جمع‌آوری و مدیریت درخواست‌های مرخصی استفاده کنید.", + "Weight tracking" : "پیگیری وزن", + "Track your weight and other health measures." : "وزن و سایر شاخص‌های سلامتی خود را پیگیری کنید.", "Date" : "تاریخ", - "Weight" : "Weight", - "Body fat" : "Body fat", - "Feeling over all" : "Feeling over all", + "Weight" : "وزن", + "Body fat" : "چربی بدن", + "Feeling over all" : "احساس کلی", "Comments" : "نظرات", - "feel sick" : "feel sick", - "party-time" : "party-time", + "feel sick" : "احساس بیماری می‌کنم", + "party-time" : "وقت خوش", "Name" : "نام", - "Account manager" : "Account manager", - "Contract type" : "Contract type", - "Contract start" : "Contract start", - "Contract end" : "Contract end", + "Account manager" : "مدیر حساب", + "Contract type" : "نوع قرارداد", + "Contract start" : "شروع قرارداد", + "Contract end" : "پایان قرارداد", "Description" : "توضیحات", - "Contact information" : "Contact information", - "Quality of relationship" : "Quality of relationship", - "Comment" : "دیدگاه", - "Dog" : "Dog", - "Dog food every week" : "Dog food every week", - "The dog is our best friend." : "The dog is our best friend.", - "Standard, SLA Level 2" : "Standard, SLA Level 2", - "Likes treats" : "Likes treats", - "Cat" : "Cat", - "Cat food every week" : "Cat food every week", - "The cat is also our best friend." : "The cat is also our best friend.", - "Standard, SLA Level 1" : "Standard, SLA Level 1", - "New customer, let's see if there is more." : "New customer, let's see if there is more.", - "Horse" : "Horse", - "Hay and straw" : "Hay and straw", - "Summer only" : "Summer only", - "Special" : "Special", - "Maybe we can make it fix for every year?!" : "Maybe we can make it fix for every year?!", - "Employee name" : "Employee name", + "Contact information" : "اطلاعات تماس", + "Quality of relationship" : "کیفیت رابطه", + "Comment" : "نظر", + "Dog" : "سگ", + "Dog food every week" : "غذای سگ هر هفته", + "The dog is our best friend." : "سگ بهترین دوست ماست.", + "Standard, SLA Level 2" : "استاندارد، سطح SLA 2", + "Likes treats" : "تشویقی دوست دارد", + "Cat" : "گربه", + "Cat food every week" : "غذای گربه هر هفته", + "The cat is also our best friend." : "گربه نیز بهترین دوست ماست.", + "Standard, SLA Level 1" : "استاندارد، سطح SLA 1", + "New customer, let's see if there is more." : "مشتری جدید، ببینیم بیشتر هست یا نه.", + "Horse" : "اسب", + "Hay and straw" : "یونجه و کاه", + "Summer only" : "فقط تابستان", + "Special" : "ویژه", + "Maybe we can make it fix for every year?!" : "شاید بتوانیم آن را برای هر سال ثابت کنیم؟!", + "Employee name" : "نام کارمند", "from" : "از", - "When is your vacation starting?" : "When is your vacation starting?", + "When is your vacation starting?" : "مرخصی شما از چه تاریخی شروع می‌شود؟", "to" : "به", - "When is your vacation ending?" : "When is your vacation ending?", - "Number of working days" : "Number of working days", - "How many working days are included?" : "How many working days are included?", - "Request date" : "Request date", - "Approved" : "تایید شده", - "Approve date" : "Approve date", - "Approved by" : "Approved by", - "The Boss" : "The Boss", - "We have to talk about that." : "We have to talk about that.", - "Create Vacation Request" : "Create Vacation Request", - "Open Request" : "Open Request", - "Request Status" : "Request Status", - "Closed requests" : "Closed requests", - "Position" : "Position", - "Skills" : "Skills", - "Birthday" : "روز تولد", - "Santa Claus" : "Santa Claus", - "Make happy people" : "Make happy people", - "Task" : "Task", - "Title or short description" : "Title or short description", - "Target" : "Target", - "Date, time or whatever" : "Date, time or whatever", + "When is your vacation ending?" : "تعطیلات شما کی تمام می‌شود؟", + "Number of working days" : "تعداد روزهای کاری", + "How many working days are included?" : "چند روز کاری شامل می‌شود؟", + "Request date" : "تاریخ درخواست", + "Approved" : "تأیید شده", + "Approve date" : "تاریخ تأیید", + "Approved by" : "تأیید شده توسط", + "The Boss" : "رئیس", + "Bob will help for this time" : "باب این بار کمک خواهد کرد", + "We have to talk about that." : "باید در مورد آن صحبت کنیم.", + "Create Vacation Request" : "ایجاد درخواست مرخصی", + "Open Request" : "درخواست باز", + "Request Status" : "وضعیت درخواست", + "Closed requests" : "درخواست‌های بسته شده", + "Position" : "موقعیت شغلی", + "Skills" : "مهارت‌ها", + "Birthday" : "تاریخ تولد", + "Santa Claus" : "بابا نوئل", + "Make happy people" : "مردم را شاد کنید", + "Task" : "وظیفه", + "Title or short description" : "عنوان یا توضیح کوتاه", + "Target" : "هدف", + "Date, time or whatever" : "تاریخ، زمان یا هر چیز دیگر", "Progress" : "پیشرفت", - "Proofed" : "Proofed", - "Create initial milestones" : "Create initial milestones", - "Create some milestones to structure the project." : "Create some milestones to structure the project.", - "Plan to discuss for the kickoff meeting." : "Plan to discuss for the kickoff meeting.", - "Wow, that was hard work, but now it's done." : "Wow, that was hard work, but now it's done.", - "Kickoff meeting" : "Kickoff meeting", - "We will have a kickoff meeting in person." : "We will have a kickoff meeting in person.", - "Project is kicked-off and we know the vision and our first tasks." : "Project is kicked-off and we know the vision and our first tasks.", - "That was nice in person again. We collected some action points, had a look at the documentation..." : "That was nice in person again. We collected some action points, had a look at the documentation...", - "Set up some documentation and collaboration tools" : "Set up some documentation and collaboration tools", - "Where and in what way do we collaborate?" : "Where and in what way do we collaborate?", - "We know what we are doing." : "We know what we are doing.", - "Add more actions" : "Add more actions", - "I guess we need more actions in here..." : "I guess we need more actions in here...", - "What" : "What", - "How to do" : "How to do", - "Ease of use" : "Ease of use", - "Done" : "Done", - "Open the tables app" : "Open the tables app", - "Add your first row" : "Add your first row", - "Edit a row" : "Edit a row", - "Add a new column" : "Add a new column", - "Read the docs" : "Read the docs", - "Manage data the way you need it." : "Manage data the way you need it.", - "Table" : "Table", - "View" : "نمایش", + "Proofed" : "اثبات شده", + "Create initial milestones" : "ایجاد نقاط عطف اولیه", + "Create some milestones to structure the project." : "چند نقطه عطف برای ساختاردهی پروژه ایجاد کنید.", + "Plan to discuss for the kickoff meeting." : "برنامه‌ریزی برای بحث در جلسه شروع پروژه.", + "Wow, that was hard work, but now it's done." : "وای، کار سختی بود، اما حالا تمام شده است.", + "Kickoff meeting" : "جلسه شروع پروژه", + "We will have a kickoff meeting in person." : "یک جلسه شروع پروژه حضوری خواهیم داشت.", + "Project is kicked-off and we know the vision and our first tasks." : "پروژه شروع شده است و ما چشم‌انداز و اولین وظایف خود را می‌دانیم.", + "That was nice in person again. We collected some action points, had a look at the documentation..." : "دوباره حضوری بودن خوب بود. چند نکته عملی جمع‌آوری کردیم، به مستندات نگاهی انداختیم...", + "Set up some documentation and collaboration tools" : "راه‌اندازی ابزارهای مستندسازی و همکاری", + "Where and in what way do we collaborate?" : "کجا و به چه صورت همکاری می‌کنیم؟", + "We know what we are doing." : "می‌دانیم چه کار می‌کنیم.", + "We have heard that %s could be a nice solution for it, should give it a try." : "شنیده‌ایم که %s می‌تواند راه‌حل خوبی برای آن باشد، باید امتحانش کنیم.", + "Add more actions" : "افزودن اقدامات بیشتر", + "I guess we need more actions in here..." : "حدس می‌زنم اینجا به اقدامات بیشتری نیاز داریم...", + "What" : "چه چیزی", + "How to do" : "نحوه انجام", + "Ease of use" : "سهولت استفاده", + "Done" : "انجام شده", + "Open the tables app" : "برنامه Tables را باز کنید", + "Reachable via the Tables icon in the apps list." : "قابل دسترسی از طریق آیکون Tables در لیست برنامه‌ها.", + "Add your first row" : "اولین ردیف خود را اضافه کنید", + "Use the *+ Create row* button and enter some data inside of the form." : "از دکمه *+ ایجاد ردیف* استفاده کنید و داده‌هایی را درون فرم وارد کنید.", + "Edit a row" : "ویرایش یک ردیف", + "Go to a row you want to edit and use the *pencil* edit button. Maybe you want to add a *Done* status to this row?" : "به ردیفی که می‌خواهید ویرایش کنید بروید و از دکمه ویرایش *مداد* استفاده کنید. شاید بخواهید وضعیت *انجام شده* را به این ردیف اضافه کنید؟", + "Add a new column" : "افزودن ستون جدید", + "You can add, remove and adjust columns as you need. Open the three-dot-menu on the upper right of this table and choose *Create column*. Fill in the data you want, at least a title and column type." : "می‌توانید ستون‌ها را به دلخواه اضافه، حذف و تنظیم کنید. منوی سه‌نقطه را در بالای سمت راست این جدول باز کرده و گزینه *ایجاد ستون* را انتخاب کنید. داده‌های مورد نظر خود را پر کنید، حداقل یک عنوان و نوع ستون الزامی است.", + "Create views for tables" : "ایجاد نماها برای جداول", + "Filter data and save table presets as views to share and combine them into applications." : "فیلتر کردن داده‌ها و ذخیره پیش‌تنظیمات جدول به عنوان نما برای اشتراک‌گذاری و ترکیب آن‌ها در برنامه‌ها", + "Create applications" : "ایجاد برنامه‌ها", + "Combine different tables and views into no-code applications for any purpose. This makes them easily accessible directly in the app bar." : "جداول و نماهای مختلف را برای هر منظوری در برنامه‌های بدون کد ترکیب کنید. این کار دسترسی آسان به آن‌ها را مستقیماً در نوار برنامه فراهم می‌کند.", + "Read the docs" : "مطالعه مستندات", + "If you want to go through the documentation, it can be found here: [Nextcloud Tables documentation](%s)" : "اگر می‌خواهید مستندات را مرور کنید، آن را اینجا بیابید: [مستندات نکست‌کلود Tables](%s)", + "Check yourself!" : "خودتان امتحان کنید!", + "All tables, columns, rows, contexts, and sharing information including all tables owned or shared, their structure and content" : "تمام جداول، ستون‌ها، ردیف‌ها، زمینه‌ها و اطلاعات اشتراک‌گذاری شامل تمام جداول مالکیت‌شده یا اشتراک‌گذاری‌شده، ساختار و محتوای آن‌ها", + "Manage data the way you need it." : "داده‌ها را به روشی که نیاز دارید مدیریت کنید.", + "Manage data the way you need it.\n\nWith this app you are able to create your own tables with individual columns. You can start with a template or from scratch and add your wanted columns.\nYou can choose from the following column types:\n- Text line or rich text\n- Link to urls or other nextcloud resources\n- Numbers\n- Progress bar\n- Stars rating\n- Yes/No tick\n- Date and/or time\n- (Multi) selection\n- Users, groups and teams\n\nShare your tables and views with users and groups within your cloud.\n\nHave a good time and manage whatever you want." : "داده‌ها را به روشی که نیاز دارید مدیریت کنید.", + "Table" : "جدول", + "View" : "نما", "Today" : "امروز", - "Last edit" : "Last edit", - "Create" : "ساخت", - "Column ID" : "Column ID", - "Table ID" : "Table ID", + "Last edit" : "آخرین ویرایش", + "Create" : "ایجاد", + "Column ID" : "شناسه ستون", + "Table ID" : "شناسه جدول", "Text" : "متن", "Link" : "پیوند", - "Number" : "Number", - "Stars rating" : "Stars rating", - "Progress bar" : "Progress bar", + "Number" : "عدد", + "Stars rating" : "رتبه‌بندی ستاره‌ای", + "Progress bar" : "نوار پیشرفت", "Selection" : "انتخاب", - "Date and time" : "Date and time", - "Users and groups" : "Users and groups", - "Move" : "انتقال", - "Metadata" : "ابرداده", - "Move up" : "حرکت به بالا", - "Move down" : "حرکت به پایین", - "Add new sorting rule" : "Add new sorting rule", + "Date and time" : "تاریخ و زمان", + "Users and groups" : "کاربران و گروه‌ها", + "Relation" : "رابطه", + "Column type" : "نوع ستون", + "Move" : "جابه‌جایی", + "Metadata" : "فراداده", + "Move up" : "انتقال به بالا", + "Move down" : "انتقال به پایین", + "Rules are applied in order. The first rule sorts all rows, and any additional rules determine the order within any group of rows that share the same value." : "قوانین به ترتیب اعمال می‌شوند. اولین قانون همه ردیف‌ها را مرتب می‌کند و قوانین اضافی ترتیب را در هر گروه از ردیف‌هایی که مقدار یکسانی دارند تعیین می‌کنند.", + "Add new sorting rule" : "افزودن قانون مرتب‌سازی جدید", "Read only" : "فقط خواندنی", - "Mandatory" : "Mandatory", + "Mandatory" : "اجباری", "JJJJ-MM-DD hh:mm" : "JJJJ-MM-DD hh:mm", "JJJJ-MM-DD" : "JJJJ-MM-DD", "hh:mm" : "hh:mm", - "Search Value" : "Search Value", - "Column" : "Column", - "Operator" : "Operator", - "Delete filter" : "Delete filter", - "Filtering rows" : "Filtering rows", - "OR" : "OR", - "Add new filter group" : "Add new filter group", - "... that meet all of the following conditions" : "... that meet all of the following conditions", - "Add new filter" : "Add new filter", - "Ascending" : "Ascending", - "Descending" : "Descending", - "Reactivate sorting rule" : "Reactivate sorting rule", - "Delete sorting rule" : "Delete sorting rule", - "Override sorting rules" : "Override sorting rules", - "Updated table \"{emoji}{table}\"." : "Updated table \"{emoji}{table}\".", - "Cannot update table. Title is missing." : "Cannot update table. Title is missing.", - "Could not fetch shares." : "Could not fetch shares.", - "Views" : "Views", - "Create view" : "Create view", - "Rows" : "Rows", - "Columns" : "Columns", - "Last edited" : "Last edited", - "Shares" : "اشتراک گذاری ها", - "Actions" : "کنش‌ها", - "Edit view" : "Edit view", - "Share" : "هم‌رسانی", - "Integration" : "ادغام", - "Delete view" : "Delete view", - "Total" : "جمع", - "Data" : "داده", - "Manage table" : "Manage table", - "Edit table" : "Edit table", - "Create column" : "Create column", + "Search Value" : "جستجوی مقدار", + "Column" : "ستون", + "Operator" : "عملگر", + "Delete filter" : "حذف فیلتر", + "Filtering rows" : "فیلتر کردن ردیف‌ها", + "OR" : "یا", + "Add new filter group" : "افزودن گروه فیلتر جدید", + "... that meet all of the following conditions" : "که همه شرایط زیر را داشته باشند", + "Add new filter" : "افزودن فیلتر جدید", + "Ascending" : "صعودی", + "Descending" : "نزولی", + "Reactivate sorting rule" : "فعال‌سازی دوباره قانون مرتب‌سازی", + "Delete sorting rule" : "حذف قانون مرتب‌سازی", + "Among the sorting rules are some to which you have no permissions. However, if you like, you can override the sorting." : "در میان قوانین مرتب‌سازی، برخی هستند که شما دسترسی ندارید. با این حال، در صورت تمایل می‌توانید مرتب‌سازی را بازنویسی کنید.", + "Override sorting rules" : "بازنویسی قوانین مرتب‌سازی", + "Updated table \"{emoji}{table}\"." : "جدول \"{emoji}{table}\" به‌روزرسانی شد.", + "Cannot update table. Title is missing." : "امکان به‌روزرسانی جدول وجود ندارد. عنوان موجود نیست.", + "Could not fetch shares." : "امکان دریافت اشتراک‌ها وجود نداشت.", + "Views" : "نماها", + "Create view" : "ایجاد نما", + "Rows" : "ردیف‌ها", + "Columns" : "ستون‌ها", + "Last edited" : "آخرین ویرایش", + "Shares" : "اشتراک‌ها", + "Actions" : "اقدامات", + "Edit view" : "ویرایش نما", + "Share" : "اشتراک‌گذاری", + "Integration" : "یکپارچه‌سازی", + "Delete view" : "حذف نما", + "Total" : "مجموع", + "Data" : "داده‌ها", + "Manage table" : "مدیریت جدول", + "Edit table" : "ویرایش جدول", + "Create column" : "ایجاد ستون", "Import" : "وارد کردن", - "Export as CSV" : "Export as CSV", - "Filtered view" : "Filtered view", - "Reset local adjustments" : "Reset local adjustments", - "No columns" : "No columns", - "We need at least one column, please be so kind and create one." : "We need at least one column, please be so kind and create one.", - "No columns selected" : "No columns selected", - "The view is empty. Edit which columns should be displayed." : "The view is empty. Edit which columns should be displayed.", - "Manage view" : "Manage view", - "Please insert a title for the new column." : "Please insert a title for the new column.", - "You need to select a type for the new column." : "You need to select a type for the new column.", - "The column \"{column}\" was created." : "The column \"{column}\" was created.", - "Sorry, something went wrong." : "Sorry, something went wrong.", - "Could not create new column." : "Could not create new column.", + "Export all rows" : "خروجی گرفتن از همه ردیف‌ها", + "Export filtered rows" : "خروجی گرفتن از ردیف‌های فیلترشده", + "Filtered view" : "نمای فیلترشده", + "Reset local adjustments" : "بازنشانی تنظیمات محلی", + "No columns" : "بدون ستون", + "We need at least one column, please be so kind and create one." : "حداقل به یک ستون نیاز داریم، لطفاً یکی ایجاد کنید.", + "No columns selected" : "هیچ ستونی انتخاب نشده است", + "The view is empty. Edit which columns should be displayed." : "نما خالی است. ویرایش کنید که کدام ستون‌ها نمایش داده شوند.", + "Your access was revoked. Reload the page to update your permissions." : "دسترسی شما لغو شد. برای به‌روزرسانی مجوزهای خود، صفحه را بارگذاری مجدد کنید.", + "Manage view" : "مدیریت نما", + "Please insert a title for the new column." : "لطفاً یک عنوان برای ستون جدید وارد کنید.", + "Cannot save column. Column width must be between {min} and {max}." : "امکان ذخیره ستون وجود ندارد. عرض ستون باید بین {min} و {max} باشد.", + "You need to select a type for the new column." : "باید یک نوع برای ستون جدید انتخاب کنید.", + "Please select a relation type." : "لطفا یک نوع رابطه را انتخاب کنید.", + "Please select a target." : "لطفا یک هدف را انتخاب کنید.", + "Please select a label for relation selection." : "لطفا یک برچسب برای انتخاب رابطه انتخاب کنید.", + "The column \"{column}\" was created." : "ستون \"{column}\" ایجاد شد.", + "Sorry, something went wrong." : "متأسفانه، مشکلی پیش آمد.", + "Could not create new column." : "امکان ایجاد ستون جدید وجود نداشت.", "Type" : "نوع", - "Text line" : "Text line", + "Text line" : "خط متنی", "Simple text" : "متن ساده", "Rich text" : "متن غنی", - "Single selection" : "Single selection", - "Multiple selection" : "Multiple selection", - "Yes/No" : "Yes/No", + "Single selection" : "انتخاب تکی", + "Multiple selection" : "انتخاب چندگانه", + "Yes/No" : "بله/خیر", "Time" : "زمان", - "Add more" : "Add more", + "Add more" : "افزودن موارد بیشتر", "Save" : "ذخیره", + "The title character limit is 200 characters. Please use a shorter title." : "عنوان باید حداکثر ۲۰۰ کاراکتر باشد. لطفاً عنوان کوتاه‌تری انتخاب کنید.", + "Cannot create new application. Title is missing." : "امکان ایجاد برنامه جدید وجود ندارد. عنوان وارد نشده است.", + "Could not create new application" : "امکان ایجاد برنامه جدید وجود نداشت", + "Create an application" : "ایجاد یک برنامه", "Title" : "عنوان", + "Select icon for the application" : "انتخاب آیکون برای برنامه", + "Select icon" : "انتخاب آیکون", + "Title of the new application" : "عنوان برنامه جدید", + "Description of the new application" : "توضیحات برنامه جدید", "Resources" : "منابع", - "Create row" : "Create row", + "Show in app list" : "نمایش در لیست برنامه‌ها", + "This can be overridden by a per-account preference" : "این تنظیم می‌تواند با اولویت هر حساب کاربری بازنویسی شود", + "Create application" : "ایجاد برنامه", + "Fill form" : "پر کردن فرم", + "Create row" : "ایجاد ردیف", + "Fill form again" : "دوباره فرم را پر کنید", "Submit" : "ارسال", - "Row successfully created." : "Row successfully created.", - "Could not create new row" : "Could not create new row", - "Save row" : "Save row", - "Cannot create new table. Title is missing." : "Cannot create new table. Title is missing.", - "Could not create new table" : "Could not create new table", - "Could not load templates." : "Could not load templates.", - "Create table" : "Create table", - "Select emoji for table" : "Select emoji for table", - "Select emoji" : "Select emoji", - "Title of the new table" : "Title of the new table", - "🔧 Custom table" : "🔧 Custom table", - "Custom table from scratch." : "Custom table from scratch.", - "Are you sure you want to delete column \"{column}\"?" : "Are you sure you want to delete column \"{column}\"?", - "Error occurred while deleting column \"{column}\"." : "Error occurred while deleting column \"{column}\".", - "Delete column" : "ستون را حذف کنید", + "Form successfully submitted." : "فرم با موفقیت ارسال شد.", + "Row successfully created." : "ردیف با موفقیت ایجاد شد.", + "Could not create new row" : "امکان ایجاد ردیف جدید وجود نداشت", + "\"{columnTitle}\" should not be empty" : "\"{columnTitle}\" نباید خالی باشد", + "Save row" : "ذخیره ردیف", + "Cannot create new table. Title is missing." : "امکان ایجاد جدول جدید وجود ندارد. عنوان وارد نشده است.", + "Could not create new table" : "امکان ایجاد جدول جدید وجود نداشت", + "Could not load templates." : "امکان بارگذاری الگوها وجود نداشت.", + "Create table" : "ایجاد جدول", + "Select emoji for table" : "انتخاب ایموجی برای جدول", + "Select emoji" : "انتخاب ایموجی", + "Title of the new table" : "عنوان جدول جدید", + "🔧 Custom table" : "🔧 جدول سفارشی", + "Custom table from scratch." : "جدول سفارشی از ابتدا.", + "📄 Import table" : "📄 وارد کردن جدول", + "Import table from file." : "وارد کردن جدول از فایل.", + "📄 Import Scheme" : "📄 درون‌ریزی طرح‌واره", + "Import Scheme from file." : "وارد کردن طرح از فایل.", + "Are you sure you want to delete column \"{column}\"?" : "آیا مطمئن هستید که می‌خواهید ستون \"{column}\" را حذف کنید؟", + "Error occurred while deleting column \"{column}\"." : "هنگام حذف ستون \"{column}\" خطایی رخ داد.", + "Delete column" : "حذف ستون", + "Do you really want to delete the application \"{context}\"? This will also delete the shares and unshare the resources that are connected to this application." : "آیا واقعاً می‌خواهید برنامه \"{context}\" را حذف کنید؟ این کار اشتراک‌ها را نیز حذف کرده و منابع متصل به این برنامه را از اشتراک خارج می‌کند.", + "Application \"{context}\" removed." : "برنامه \"{context}\" حذف شد.", + "Confirm application deletion" : "تأیید حذف برنامه", "Cancel" : "لغو", "Delete" : "حذف", - "Error occurred while deleting rows." : "Error occurred while deleting rows.", + "Error occurred while deleting rows." : "هنگام حذف ردیف‌ها خطایی رخ داد.", "_Delete row_::_Delete rows_" : ["Delete row","Delete rows"], "_Are you sure you want to delete the selected row?_::_Are you sure you want to delete the %n selected rows?_" : ["Are you sure you want to delete the selected row?","Are you sure you want to delete the %n selected rows?"], - "Do you really want to delete the table \"{table}\"? This will also delete all data, views and shares that are connected to this table." : "Do you really want to delete the table \"{table}\"? This will also delete all data, views and shares that are connected to this table.", - "Table \"{emoji}{table}\" removed." : "Table \"{emoji}{table}\" removed.", - "Confirm table deletion" : "Confirm table deletion", - "Do you really want to delete the view \"{view}\"?" : "Do you really want to delete the view \"{view}\"?", - "View \"{emoji}{view}\" removed." : "View \"{emoji}{view}\" removed.", - "Confirm view deletion" : "Confirm view deletion", - "Cannot update column. Title is missing." : "Cannot update column. Title is missing.", - "The column \"{column}\" was updated." : "The column \"{column}\" was updated.", - "Edit column" : "Edit column", - "Could not delete row." : "Could not delete row.", - "Edit row" : "Edit row", + "Do you really want to delete the table \"{table}\"? This will also delete all data, views and shares that are connected to this table." : "آیا واقعاً می‌خواهید جدول \"{table}\" را حذف کنید؟ این کار تمام داده‌ها، نماها و اشتراک‌های متصل به این جدول را نیز حذف می‌کند.", + "Table \"{emoji}{table}\" removed." : "جدول \"{emoji}{table}\" حذف شد.", + "Confirm table deletion" : "تأیید حذف جدول", + "Do you really want to delete the view \"{view}\"?" : "آیا واقعاً می‌خواهید نمای \"{view}\" را حذف کنید؟", + "View \"{emoji}{view}\" removed." : "نمایش \"{emoji}{view}\" حذف شد.", + "Confirm view deletion" : "تأیید حذف نمایش", + "Cannot update column. Title is missing." : "امکان به‌روزرسانی ستون وجود ندارد. عنوان وارد نشده است.", + "The column \"{column}\" was updated." : "ستون \"{column}\" به‌روزرسانی شد.", + "Edit column" : "ویرایش ستون", + "Cannot update application. Title is missing." : "امکان به‌روزرسانی برنامه وجود ندارد. عنوان وارد نشده است.", + "Updated application \"{contextTitle}\"." : "برنامه \"{contextTitle}\" به‌روزرسانی شد.", + "Edit application" : "ویرایش برنامه", + "Select an icon for application" : "انتخاب آیکون برای برنامه", + "Title of the application" : "عنوان برنامه", + "Description of the application" : "توضیحات برنامه", + "I really want to delete this application!" : "واقعاً می‌خواهم این برنامه را حذف کنم!", + "Transfer application" : "انتقال برنامه", + "Could not delete row." : "امکان حذف سطر وجود نداشت.", + "Edit row" : "ویرایش سطر", "Edit" : "ویرایش", - "Activity" : "فعالیت", - "I really want to delete this row!" : "I really want to delete this row!", - "Manage" : "Manage", + "Activity" : "فعالیت‌ها", + "I really want to delete this row!" : "واقعاً می‌خواهم این سطر را حذف کنم!", + "Column order" : "ترتیب ستون‌ها", + "Default sorting" : "مرتب‌سازی پیش‌فرض", + "Manage" : "مدیریت", "Owner" : "مالک", - "I really want to delete this table!" : "I really want to delete this table!", - "Create missing columns" : "Create missing columns", - "Close" : "بسته", - "Could not import data due to unknown errors." : "Could not import data due to unknown errors.", - "Please select a file." : "لطفا فایل مورد نظر را انتخاب کنید ", - "Select file for the import" : "Select file for the import", - "Could not import, not authorized. Are you logged in?" : "Could not import, not authorized. Are you logged in?", - "Could not import, missing needed permission." : "Could not import, missing needed permission.", - "Could not import, needed resources were not found." : "Could not import, needed resources were not found.", - "Select from Files" : "از میان پرونده ها انتخاب کنید", - "Upload from device" : "Upload from device", - "⚠️ You don't have the permission to create columns." : "⚠️ You don't have the permission to create columns.", + "I really want to delete this table!" : "واقعاً می‌خواهم این جدول را حذف کنم!", + "Change owner" : "تغییر مالک", + "Could not create table" : "امکان ایجاد جدول وجود نداشت", + "File import started, this might take a while. You will be notified once it finished." : "وارد کردن فایل آغاز شد، ممکن است مدتی طول بکشد. پس از اتمام به شما اطلاع داده خواهد شد.", + "You must select an existing table" : "باید یک جدول موجود را انتخاب کنید", + "Could not import data to table" : "امکان وارد کردن داده به جدول وجود نداشت", + "Import file into Tables" : "وارد کردن فایل به Tables", + "Import as new table" : "وارد کردن به عنوان جدول جدید", + "This will create a new table from the data in this file." : "این کار یک جدول جدید از داده‌های موجود در این فایل ایجاد می‌کند.", + "Import into existing table" : "وارد کردن به جدول موجود", + "This will import the data from this file into an already existing table." : "این کار داده‌های این فایل را به یک جدول موجود وارد می‌کند.", + "Select the table to import into" : "جدول مورد نظر برای وارد کردن را انتخاب کنید", + "Select an existing table" : "یک جدول موجود را انتخاب کنید", + "Create missing columns" : "ایجاد ستون‌های缺失", + "Import successful" : "وارد کردن با موفقیت انجام شد", + "Close" : "بستن", + "Could not import data due to unknown errors." : "به دلیل خطاهای ناشناخته امکان وارد کردن داده وجود نداشت.", + "Import table" : "وارد کردن جدول", + "Preview imported table" : "پیش‌نمایش جدول وارد شده", + "The selected file is not supported." : "فایل انتخاب شده پشتیبانی نمی‌شود.", + "Please select a file." : "لطفاً یک فایل را انتخاب کنید.", + "Please select column for mapping." : "لطفاً ستون مورد نظر برای نگاشت را انتخاب کنید.", + "Cannot map same exist column for multiple columns." : "نمی‌توان یک ستون موجود را برای چندین ستون نگاشت کرد.", + "Select file for the import" : "فایل مورد نظر برای وارد کردن را انتخاب کنید", + "Could not import, not authorized. Are you logged in?" : "امکان وارد کردن وجود ندارد، دسترسی ندارید. آیا وارد سیستم شده‌اید؟", + "Could not import, missing needed permission." : "امکان وارد کردن وجود ندارد، مجوز لازم وجود ندارد.", + "Could not import, needed resources were not found." : "امکان وارد کردن وجود ندارد، منابع مورد نیاز یافت نشدند.", + "Add data to the table from a file" : "افزودن داده به جدول از یک فایل", + "Select from Files" : "انتخاب از فایل‌ها", + "Upload from device" : "بارگذاری از دستگاه", + "Supported formats: xlsx, xls, csv, html, xml" : "فرمت‌های پشتیبانی‌شده: xlsx, xls, csv, html, xml", + "First row of the file must contain column headings without gaps." : "ردیف اول فایل باید شامل عنوان ستون‌ها بدون فاصله باشد.", + "⚠️ You don't have the permission to create columns." : "⚠️ شما اجازهٔ ساخت ستون را ندارید.", "Preview" : "پیش‌نمایش", - "Failed" : "Failed", - "Loading table data" : "Loading table data", - "Result" : "شروع به اسکنیک", - "Found columns" : "Found columns", - "Matching columns" : "Matching columns", - "Created columns" : "Created columns", - "Inserted rows" : "Inserted rows", - "Value parsing errors" : "Value parsing errors", - "Row creation errors" : "Row creation errors", + "Importing data from " : "در حال وارد کردن داده از ", + "This might take a while..." : "ممکن است کمی طول بکشد...", + "Failed" : "ناموفق", + "Loading table data" : "در حال بارگذاری داده‌های جدول", + "ID (Meta)" : "شناسه (فراداده)", + "Create new column" : "ایجاد ستون جدید", + "Import to existing column" : "وارد کردن به ستون موجود", + "Existing column" : "ستون موجود", + "Ignore column" : "نادیده گرفتن ستون", + "Result" : "نتیجه", + "Found columns" : "ستون‌های یافت‌شده", + "Matching columns" : "ستون‌های منطبق", + "Created columns" : "ستون‌های ایجادشده", + "Inserted rows" : "ردیف‌های درج‌شده", + "Updated rows" : "ردیف‌های به‌روزرسانی‌شده", + "Value parsing errors" : "خطاهای تجزیه مقدار", + "Row creation errors" : "خطاهای ایجاد ردیف", + "Import scheme" : "طرح واردات", + "Context \"{name}\" transferred to {user}" : "بافت \"{name}\" به {user} منتقل شد", + "Transfer the application \"{context}\" to another user" : "انتقال برنامه \"{context}\" به کاربر دیگر", "Transfer" : "انتقال", - "Create View" : "Create View", - "Save modified View" : "Save modified View", - "Save View" : "Save View", - "Save as new view" : "Save as new view", - "Cannot create view." : "Cannot create view.", - "Cannot update view." : "Cannot update view.", - "Title is missing." : "Title is missing.", - "Could not create new view" : "Could not create new view", - "Could not update view" : "Could not update view", - "Select emoji for view" : "Select emoji for view", - "Title of the new view" : "Title of the new view", - "New title of the view" : "New title of the view", - "Filter" : "پالایه", + "Table \"{emoji}{table}\" transferred to {user}" : "جدول \"{emoji}{table}\" به {user} منتقل شد", + "Transfer table" : "انتقال جدول", + "Transfer this table to another user" : "انتقال این جدول به کاربر دیگر", + "Create View" : "ایجاد نما", + "Save modified View" : "ذخیره نمای ویرایش‌شده", + "Save View" : "ذخیره نما", + "Save as new view" : "ذخیره به عنوان نمای جدید", + "Cannot create view." : "امکان ایجاد نما وجود ندارد.", + "Cannot update view." : "امکان به‌روزرسانی نما وجود ندارد.", + "Title is missing." : "عنوان وجود ندارد.", + "Could not create new view" : "نمای جدید ایجاد نشد", + "Could not update view" : "نما به‌روزرسانی نشد", + "Select emoji for view" : "انتخاب ایموجی برای نما", + "Title of the new view" : "عنوان نمای جدید", + "New title of the view" : "عنوان جدید نما", + "Filter" : "فیلتر", "Sort" : "مرتب‌سازی", - "Do you really want to delete the table \"{table}\"?" : "Do you really want to delete the table \"{table}\"?", - "Export" : "دریافت خروجی", - "Add to favorites" : "افزودن به برگزیده‌ها", - "Remove from favorites" : "حذف از برگزیده‌ها", - "Delete table" : "Delete table", - "Copy" : "رونوشت", - "Could not configure new view" : "Could not configure new view", - "Duplicate view" : "Duplicate view", - "Favorites" : "مورد علاقه‌ها", - "Your results are filtered." : "Your results are filtered.", - "Clear filter" : "پاک کردن پالایه", - "Share with accounts or groups" : "هم‌رسانی با حساب‌ها یا گروه‌ها", - "No recommendations. Start typing." : "هیچ توصیه ای نیست شروع به تایپ کنید.", - "Receiver type" : "Receiver type", - "Create time" : "Create time", - "Share ID" : "Share ID", - "Copy internal link to clipboard" : "Copy internal link to clipboard", - "Internal link" : "پیوند داخلی", + "Delete application" : "حذف برنامه", + "Do you really want to delete the table \"{table}\"?" : "آیا واقعاً می‌خواهید جدول \"{table}\" را حذف کنید؟", + "Export" : "خروجی", + "Add to favorites" : "افزودن به موارد دلخواه", + "Remove from favorites" : "حذف از موارد دلخواه", + "Archive table" : "بایگانی جدول", + "Unarchive table" : "خارج کردن جدول از بایگانی", + "Delete table" : "حذف جدول", + "Copy" : "کپی", + "Could not configure new view" : "امکان پیکربندی نمای جدید وجود ندارد", + "Duplicate view" : "تکراری‌سازی نما", + "Filter items" : "فیلتر کردن آیتم‌ها", + "Favorites" : "موارد دلخواه", + "Archived tables" : "جداول بایگانی‌شده", + "Applications" : "برنامه‌ها", + "Your results are filtered." : "نتایج شما فیلتر شده است.", + "Clear filter" : "پاک کردن فیلتر", + "Share with accounts, groups or teams" : "اشتراک‌گذاری با حساب‌ها، گروه‌ها یا تیم‌ها", + "Share with accounts or groups" : "اشتراک‌گذاری با حساب‌ها یا گروه‌ها", + "User, group or team …" : "کاربر، گروه یا تیم …", + "User or group …" : "کاربر یا گروه …", + "Failed to fetch share recommendations" : "دریافت پیشنهادهای اشتراک‌گذاری ناموفق بود", + "No recommendations. Start typing." : "هیچ پیشنهادی وجود ندارد. شروع به تایپ کنید.", + "Receiver type" : "نوع دریافت‌کننده", + "Create time" : "زمان ایجاد", + "Share ID" : "شناسه اشتراک‌گذاری", + "Copy internal link to clipboard" : "کپی لینک داخلی در کلیپ‌بورد", + "Only works for users with access to this view" : "فقط برای کاربرانی که به این نما دسترسی دارند کار می‌کند", + "Only works for users with access to this table" : "فقط برای کاربرانی که به این جدول دسترسی دارند کار می‌کند", + "Internal link" : "لینک داخلی", + "Any application created by a demoted share recipients using a shared table will continue to consume its data." : "هر برنامه‌ای که توسط دریافت‌کنندگان اشتراک تنزل‌یافته با استفاده از یک جدول اشتراکی ایجاد شود، به مصرف داده‌های آن ادامه خواهد داد.", "group" : "گروه", - "Table manager" : "Table manager", + "team" : "تیم", + "Table manager" : "مدیر جدول", "Permissions" : "مجوزها", - "Read data" : "Read data", - "Create data" : "Create data", - "Update data" : "Update data", - "Delete data" : "Delete data", - "Promote to table manager" : "Promote to table manager", - "Demote to normal share" : "Demote to normal share", - "Open main table to adjust table management permissions" : "Open main table to adjust table management permissions", - "No shares" : "اشتراک گذاری وجود ندارد", - "View only" : "تنها مشاهده", - "Can edit" : "توانایی ویرایش", - "Custom permissions" : "Custom permissions", + "Read data" : "خواندن داده", + "Create data" : "ایجاد داده", + "Update data" : "به‌روزرسانی داده", + "Delete data" : "حذف داده", + "Promote to table manager" : "ارتقا به مدیر جدول", + "Demote to normal share" : "تنزل به اشتراک عادی", + "Open main table to adjust table management permissions" : "جدول اصلی را باز کنید تا مجوزهای مدیریت جدول را تنظیم کنید", + "No shares" : "بدون اشتراک", + "After the promotion of the share recipient to table manager, any applications created by share recipients that utilise this table will continue to access its data, even if you later demote them." : "پس از ارتقای دریافت‌کننده اشتراک به مدیر جدول، هر برنامه‌ای که توسط دریافت‌کنندگان اشتراک ایجاد شده و از این جدول استفاده می‌کند، حتی اگر بعداً آن‌ها را تنزل دهید، به داده‌های آن دسترسی خواهد داشت.", + "Confirm table manager promotion" : "تأیید ارتقا به مدیر جدول", + "View only" : "فقط مشاهده", + "Can edit" : "قابل ویرایش", + "Custom permissions" : "مجوزهای سفارشی", + "Quick share options, current: {option}" : "گزینه‌های اشتراک‌گذاری سریع، فعلی: {option}", "Read" : "خواندن", - "Update" : "به‌روز رسانی", - "Link copied to clipboard" : "پیوند در حافظه موقت کپی شده", + "Update" : "به‌روزرسانی", + "Error creating link share" : "خطا در ایجاد اشتراک لینک", + "Error deleting link share" : "خطا در حذف اشتراک لینک", + "Link copied to clipboard" : "لینک در کلیپ‌بورد کپی شد", + "Error copying link" : "خطا در کپی لینک", + "Password copied" : "رمز عبور کپی شد", + "Error copying password" : "خطا در کپی کردن رمز عبور", "Create public link" : "ایجاد لینک عمومی", - "Create a new share link" : "پیوند اشتراک گذاری جدیدی ایجاد کنید", - "Set password" : "تنظیم گذرواژه", - "Password" : "گذرواژه", - "Share link" : "اشتراک‌گذاری لینک", - "Delete link" : "حذف پیوند", - "Public links" : "Public links", - "No view in context" : "No view in context", - "From {ownerName}" : "From {ownerName}", + "Create a new share link" : "ایجاد لینک اشتراک‌گذاری جدید", + "Set password" : "تنظیم رمز عبور", + "Password" : "رمز عبور", + "Share link" : "لینک اشتراک‌گذاری", + "Copy public share link" : "کپی لینک اشتراک‌گذاری عمومی", + "Delete link" : "حذف لینک", + "Public links" : "لینک‌های عمومی", + "No view in context" : "عدم نمایش در بافت", + "From {ownerName}" : "از {ownerName}", "Created at" : "ایجاد شده در", - "Ownership" : "Ownership", - "View ID" : "View ID", - "Sharing" : "هم‌رسانی", + "Ownership" : "مالکیت", + "View ID" : "شناسه نمایش", + "Sharing" : "اشتراک‌گذاری", "API" : "API", - "This is your API endpoint for this view" : "This is your API endpoint for this view", - "Copy to clipboard" : "رونوشت به تخته‌گیره", - "Your permissions" : "Your permissions", - "Create new table" : "Create new table", + "This is your API endpoint for this view" : "این نقطه پایانی API برای این نمایش است", + "Copy to clipboard" : "کپی در کلیپ‌بورد", + "Your permissions" : "مجوزهای شما", + "This application could not be found" : "این برنامه پیدا نشد", + "Some resources in this application could not be loaded" : "برخی منابع در این برنامه بارگذاری نشدند", + "Create new table" : "ایجاد جدول جدید", "Searching …" : "جستجوکردن …", - "No elements found." : "عنصری یافت نشد", - "Share with accounts" : "هم‌رسانی با حساب‌ها", + "No elements found." : "هیچ عنصری یافت نشد.", + "Select a table or view" : "یک جدول یا نمایش انتخاب کنید", + "No selected resources" : "هیچ منبعی انتخاب نشده است", + "Shared resources permissions" : "مجوزهای منابع اشتراک‌گذاری شده", + "Read resource" : "خواندن منبع", + "Create resource" : "ایجاد منبع", + "Update resource" : "به‌روزرسانی منبع", + "Delete resource" : "حذف منبع", + "No shared resources" : "هیچ منبع اشتراک‌گذاری شده‌ای وجود ندارد", + "Share with accounts" : "اشتراک‌گذاری با حساب‌ها", "Error" : "خطا", - "Could not load editor, text not available." : "Could not load editor, text not available.", - "Download" : "بارگیری", - "Create rows" : "Create rows", - "You are not allowed to read this table, but you can still create rows." : "You are not allowed to read this table, but you can still create rows.", - "No permissions" : "No permissions", - "You have no permissions for this table." : "You have no permissions for this table.", + "Could not load editor, text not available." : "ویرایشگر بارگذاری نشد، متن در دسترس نیست.", + "Icon {iconName} loading" : "بارگذاری آیکون {iconName}", + "Download" : "دانلود", + "This is a public form." : "این یک فرم عمومی است.", + "Create rows" : "ایجاد ردیف‌ها", + "You can add one or more replies." : "می‌توانید یک یا چند پاسخ اضافه کنید.", + "You are not allowed to read this table, but you can still create rows." : "شما مجاز به خواندن این جدول نیستید، اما همچنان می‌توانید ردیف ایجاد کنید.", + "No permissions" : "بدون مجوز", + "You have no permissions for this table." : "شما هیچ مجوزی برای این جدول ندارید.", "Search" : "جستجو", - "URL" : "آدرس", - "Could not load link provider results." : "Could not load link provider results.", - "Url" : "آدرس", - "This option is outdated." : "This option is outdated.", + "Clear value" : "پاک کردن مقدار", + "URL" : "URL", + "Could not load link provider results." : "نتایج ارائه‌دهنده لینک بارگذاری نشد.", + "Url" : "Url", + "Invalid protocol. Allowed: {allowed}" : "پروتکل نامعتبر. مجاز: {allowed}", + "Link providers" : "ارائه‌دهندگان لینک", + "This option is outdated." : "این گزینه قدیمی است", "Options" : "گزینه‌ها", - "Back" : "Back", - "Select operator" : "Select operator", - "Search for value" : "Search for value", - "Select options" : "Select options", - "Keyword and submit" : "Keyword and submit", - "Or use magic values" : "Or use magic values", - "Sorting" : "مرتب سازی", - "Sort asc" : "Sort asc", - "Sort desc" : "Sort desc", - "Filtering" : "Filtering", - "Select Operator" : "Select Operator", - "Select value" : "Select value", - "Manage column" : "Manage column", - "Column manage actions" : "Column manage actions", - "Hide column" : "Hide column", - "Undo" : "برگرداندن", - "Redo" : "Redo", - "Bold" : "درشت", - "Italic" : "Italic", - "Bullet list" : "Bullet list", - "Ordered list" : "Ordered list", - "Strike" : "Strike", - "Heading 1" : "Heading 1", - "Heading 2" : "Heading 2", - "Heading 3" : "Heading 3", + "This relation does not exist anymore." : "این رابطه دیگر وجود ندارد.", + "Select relation value" : "انتخاب ارزش رابطه", + "Set {star} stars" : "تنظیم {star} ستاره", + "Cell input" : "ورودی سلول", + "Back" : "بازگشت", + "Select operator" : "انتخاب اپراتور", + "Search for value" : "جستجوی مقدار", + "Select options" : "انتخاب گزینه‌ها", + "Keyword and submit" : "کلمه کلیدی و ارسال", + "Or use magic values" : "یا از مقادیر جادویی استفاده کنید", + "Unpin column" : "جدا کردن ستون", + "Pin column" : "سنجاق کردن ستون", + "Sorting" : "مرتب‌سازی", + "Sort asc" : "مرتب‌سازی صعودی", + "Sort desc" : "مرتب‌سازی نزولی", + "Filtering" : "فیلتر کردن", + "Select Operator" : "انتخاب اپراتور", + "Select value" : "انتخاب مقدار", + "Manage column" : "مدیریت ستون", + "Column manage actions" : "اقدامات مدیریت ستون", + "Hide column" : "مخفی کردن ستون", + "Copy row" : "کپی ردیف", + "Undo" : "بازگردانی", + "Redo" : "انجام دوباره", + "Bold" : "پررنگ", + "Italic" : "کج", + "Bullet list" : "لیست گلوله‌ای", + "Ordered list" : "لیست شماره‌دار", + "Strike" : "خط خورده", + "Heading 1" : "عنوان ۱", + "Heading 2" : "عنوان ۲", + "Heading 3" : "عنوان ۳", "Code" : "کد", - "Task list" : "Task list", - "Set today as default" : "Set today as default", - "Set now as default" : "Set now as default", - "Enter a column title" : "Enter a column title", - "Add column to other views" : "Add column to other views", - "Default value" : "Default value", - "Decimals" : "Decimals", - "Minimum" : "Minimum", - "Maximum" : "Maximum", + "Task list" : "لیست وظایف", + "Set today as default" : "تنظیم امروز به عنوان پیش‌فرض", + "Set now as default" : "تنظیم اکنون به عنوان پیش‌فرض", + "Enter a column title" : "عنوان ستون را وارد کنید", + "Column width" : "عرض ستون", + "Enter a column width between {min} and {max}" : "عرض ستون را بین {min} و {max} وارد کنید", + "Add column to other views" : "افزودن ستون به سایر نماها", + "The default value is lower than the minimum allowed value." : "مقدار پیش‌فرض کمتر از حداقل مجاز است", + "The default value is greater than the maximum allowed value." : "مقدار پیش‌فرض بیشتر از حداکثر مجاز است", + "Default value" : "مقدار پیش‌فرض", + "Decimals" : "اعشار", + "Minimum" : "حداقل", + "Maximum" : "حداکثر", "Prefix" : "پیشوند", "Suffix" : "پسوند", "Default" : "پیش‌فرض", - "Reduce stars" : "Reduce stars", - "Increase stars" : "Increase stars", - "First option" : "First option", - "Second option" : "Second option", + "Reduce stars" : "کاهش ستاره‌ها", + "Increase stars" : "افزایش ستاره‌ها", + "Relation type" : "نوع رابطه", + "Select relation type" : "انتخاب نوع رابطه", + "Select target" : "انتخاب هدف", + "Label for relation selection" : "برچسب برای انتخاب رابطه", + "Select label for relation selection" : "انتخاب برچسب برای انتخاب رابطه", + "Only text and number columns can be used as label" : "فقط ستون‌های متنی و عددی می‌توانند به عنوان برچسب استفاده شوند", + "First option" : "گزینه اول", + "Second option" : "گزینه دوم", "Delete option" : "گزینه حذف", - "Add option" : "Add option", - "You can set a default value by clicking on one of the radio buttons next to the label fields." : "You can set a default value by clicking on one of the radio buttons next to the label fields.", - "Click here to unset default selection." : "Click here to unset default selection.", - "You can set default values by marking the checkboxes next to the label fields." : "You can set default values by marking the checkboxes next to the label fields.", - "Allowed pattern (regex)" : "Allowed pattern (regex)", - "Maximum text length" : "Maximum text length", - "Could not load link providers." : "Could not load link providers.", - "Allowed types" : "Allowed types", - "The provided types depends on your system setup. You can use the same providers like the fulltext-search." : "The provided types depends on your system setup. You can use the same providers like the fulltext-search.", - "This field is mandatory" : "This field is mandatory", - "Copy link" : "کپی کردن لینک", - "Open link" : "لینک را باز کنید", - "Show fullscreen" : "Show fullscreen", - "Close editor" : "Close editor", - "Create Row" : "Create Row", - "Export CSV" : "Export CSV", - "Uncheck all" : "Uncheck all", + "Add option" : "گزینه افزودن", + "You can set a default value by clicking on one of the radio buttons next to the label fields." : "با کلیک روی یکی از دکمه‌های رادیویی کنار فیلدهای برچسب می‌توانید یک مقدار پیش‌فرض تنظیم کنید.", + "Click here to unset default selection." : "برای لغو انتخاب پیش‌فرض اینجا کلیک کنید.", + "You can set default values by marking the checkboxes next to the label fields." : "با علامت‌زدن چک‌باکس‌های کنار فیلدهای برچسب می‌توانید مقادیر پیش‌فرض را تنظیم کنید.", + "Allowed pattern (regex)" : "الگوی مجاز (regex)", + "Maximum text length" : "حداکثر طول متن", + "Unique value" : "مقدار یکتا", + "Could not load link providers." : "امکان بارگذاری ارائه‌دهندگان پیوند وجود ندارد.", + "Allowed types" : "انواع مجاز", + "Please select at least one provider." : "لطفاً حداقل یک ارائه‌دهنده را انتخاب کنید.", + "The provided types depends on your system setup. You can use the same providers like the fulltext-search." : "انواع ارائه‌شده به تنظیمات سیستم شما بستگی دارد. می‌توانید از همان ارائه‌دهندگان جستجوی تمام‌متن استفاده کنید.", + "Select multiple items" : "انتخاب چند آیتم", + "Show user status" : "نمایش وضعیت کاربر", + "Please select a new time" : "لطفاً یک زمان جدید انتخاب کنید", + "This field is mandatory" : "این فیلد اجباری است", + "You can not insert any links in this field. Please configure at least one link provider in the column configuration." : "نمی‌توانید هیچ پیوندی در این فیلد وارد کنید. لطفاً حداقل یک ارائه‌دهنده پیوند در تنظیمات ستون پیکربندی کنید.", + "Copy link" : "کپی پیوند", + "Open link" : "باز کردن پیوند", + "Show fullscreen" : "نمایش تمام‌صفحه", + "Close editor" : "بستن ویرایشگر", + "Create Row" : "ایجاد ردیف", + "Export selected rows" : "خروجی گرفتن از ردیف‌های انتخاب‌شده", + "Uncheck all" : "لغو انتخاب همه", "_%n selected row_::_%n selected rows_" : ["%n selected row","%n selected rows"], - "Confirmation" : "Confirmation", - "Confirm" : "تائید", + "Go to first page" : "رفتن به صفحه اول", + "Go to previous page" : "رفتن به صفحه قبل", + "Page" : "صفحه", + "Page number" : "شماره صفحه", + "Per page" : "در هر صفحه", + "Go to next page" : "رفتن به صفحه بعد", + "Go to last page" : "رفتن به صفحه آخر", + "Confirmation" : "تأیید", + "Confirm" : "تأیید", "_{nb} row_::_{nb} rows_" : ["{nb} row","{nb} rows"], - "Could not fetch columns for content preview." : "Could not fetch columns for content preview.", - "Could not fetch rows for content preview." : "Could not fetch rows for content preview.", - "Render mode" : "Render mode", - "Content" : "Content", - "Select" : "گزینش
", - "Insert" : "Insert", - "Could not load search results." : "Could not load search results.", - "Could not create share." : "Could not create share.", - "Could not remove share." : "Could not remove share.", - "Could not update share." : "Could not update share.", - "Filter operator" : "Filter operator", - "Contains" : "Contains", - "Begins with" : "Begins with", - "Ends with" : "Ends with", - "Is equal" : "Is equal", - "Is greater than" : "Is greater than", - "Is greater than or equal" : "Is greater than or equal", - "Is lower than" : "Is lower than", - "Is lower than or equal" : "Is lower than or equal", - "Is empty" : "Is empty", - "Magic field" : "Magic field", - "Me (user ID)" : "Me (user ID)", - "Me (name)" : "Me (name)", - "Checked" : "Checked", - "Unchecked" : "بازرسی نشده", - "This year" : "امسال.", + "Could not fetch columns for content preview." : "امکان دریافت ستون‌ها برای پیش‌نمایش محتوا وجود ندارد.", + "Could not fetch rows for content preview." : "امکان دریافت ردیف‌ها برای پیش‌نمایش محتوا وجود ندارد.", + "Render mode" : "حالت رندر", + "Content" : "محتوا", + "Select" : "انتخاب", + "Insert" : "درج", + "Could not load search results." : "امکان بارگذاری نتایج جستجو وجود ندارد.", + "Search for tables and views..." : "جستجوی جداول و نماها...", + "Import into Tables" : "وارد کردن به جداول", + "Could not create share." : "امکان ایجاد اشتراک‌گذاری وجود ندارد.", + "Could not create public link." : "امکان ایجاد پیوند عمومی وجود ندارد.", + "Could not remove share." : "امکان حذف اشتراک‌گذاری وجود ندارد.", + "Could not update share." : "به‌روزرسانی اشتراک امکان‌پذیر نیست", + "Could not update cell" : "به‌روزرسانی سلول امکان‌پذیر نیست", + "Filter operator" : "عملگر فیلتر", + "Contains items" : "شامل موارد", + "Contains" : "شامل می‌شود", + "Does not contain" : "شامل نمی‌شود", + "Begins with" : "شروع می‌شود با", + "Ends with" : "پایان می‌یابد با", + "Is equal" : "برابر است با", + "Is not equal" : "برابر نیست با", + "Is greater than" : "بزرگ‌تر از", + "Is greater than or equal" : "بزرگ‌تر یا مساوی", + "Is lower than" : "کوچک‌تر از", + "Is lower than or equal" : "کوچک‌تر یا مساوی", + "Is empty" : "خالی است", + "Magic field" : "فیلد جادویی", + "Me (user ID)" : "من (شناسه کاربر)", + "Me (name)" : "من (نام)", + "Checked" : "علامت‌خورده", + "Unchecked" : "علامت‌نخورده", + "This year" : "امسال", "This month" : "این ماه", "This week" : "این هفته", - "Now" : "Now", - "Select a date" : "تاریخ را انتخاب کنید", + "Now" : "اکنون", + "Exact date" : "تاریخ دقیق", + "Select a date" : "یک تاریخ انتخاب کنید", + "Number of days ahead" : "تعداد روزهای آینده", + "Enter number of days" : "تعداد روزها را وارد کنید", + "Number of days ago" : "تعداد روزهای قبل", "ID" : "شناسه", - "Creator" : "Creator", - "Last editor" : "Last editor", - "Last edited at" : "Last edited at", - "Clipboard is not available" : "تخته گیره موحود نیست", - "seconds ago" : "یک ثانیه پیش", - "Unknown error." : "Unknown error.", - "Request is not authorized. Are you logged in?" : "Request is not authorized. Are you logged in?", - "Request not allowed." : "Request not allowed.", - "Resource not found." : "Resource not found.", - "Could not load columns." : "Could not load columns.", - "Could not insert column." : "Could not insert column.", - "Could not update column." : "Could not update column.", - "Could not remove column." : "Could not remove column.", - "Could not load rows." : "Could not load rows.", - "Outdated data. View is reloaded" : "Outdated data. View is reloaded", - "Could not insert row." : "Could not insert row.", - "Could not remove row." : "Could not remove row.", - "Could not insert table." : "Could not insert table.", - "Could not load tables." : "Could not load tables.", - "Could not fetch tables" : "Could not fetch tables", - "Could not load shared views." : "Could not load shared views.", - "Could not load shared views" : "Could not load shared views", - "Could not insert view." : "Could not insert view.", - "Could not update view." : "Could not update view.", - "Could not remove view." : "Could not remove view.", - "Could not reload view." : "Could not reload view.", - "Could not update table." : "Could not update table.", - "Could not remove table." : "Could not remove table.", - "Share not found" : "اشتراک گذاری یافت نشد", - "This share does not exist or is no longer available" : "این سهم وجود ندارد یا دیگر در دسترس نیست", + "Creator" : "ایجادکننده", + "Last editor" : "آخرین ویرایشگر", + "Last edited at" : "آخرین ویرایش در", + "Copied to clipboard." : "در کلیپ‌بورد کپی شد.", + "Clipboard is not available" : "کلیپ‌بورد در دسترس نیست", + "seconds ago" : "ثانیه پیش", + "{shareTypeString}..." : "{shareTypeString}...", + "Unsupported source: {source}" : "منبع پشتیبانی‌نشده: {source}", + "Failed to fetch {shareTypeString}" : "دریافت {shareTypeString} ناموفق بود", + "This {type} could not be found" : "این {type} یافت نشد", + "An error occurred while loading the {type}" : "هنگام بارگذاری {type} خطایی رخ داد", + "Unknown error." : "خطای ناشناخته.", + "Request is not authorized. Are you logged in?" : "درخواست مجاز نیست. آیا وارد شده‌اید؟", + "Request not allowed." : "درخواست مجاز نیست.", + "Resource not found." : "منبع یافت نشد.", + "Could not load columns." : "بارگذاری ستون‌ها امکان‌پذیر نیست.", + "Could not insert column." : "درج ستون امکان‌پذیر نیست.", + "Could not update column." : "به‌روزرسانی ستون امکان‌پذیر نیست.", + "Could not remove column." : "حذف ستون امکان‌پذیر نیست.", + "Could not load relation data." : "داده‌های رابطه را بارگیری نشد.", + "Could not load rows." : "بارگذاری ردیف‌ها امکان‌پذیر نیست.", + "Outdated data. View is reloaded" : "داده‌های قدیمی. نمایش دوباره بارگذاری شد", + "Could not insert row." : "امکان درج سطر وجود نداشت", + "Could not remove row." : "امکان حذف سطر وجود نداشت", + "Could not verify row. View is reloaded" : "امکان تأیید سطر وجود نداشت. نمایش دوباره بارگذاری شد", + "Could not insert table." : "امکان درج جدول وجود نداشت", + "Could not load tables." : "امکان بارگذاری جداول وجود نداشت", + "Could not fetch tables" : "امکان واکشی جداول وجود نداشت", + "Could not load shared views." : "امکان بارگذاری نماهای اشتراکی وجود نداشت", + "Could not load shared views" : "امکان بارگذاری نماهای اشتراکی وجود نداشت", + "Could not fetch templates" : "امکان واکشی قالب‌ها وجود نداشت", + "Could not insert view." : "امکان درج نما وجود نداشت", + "Could not update view." : "امکان به‌روزرسانی نما وجود نداشت", + "Could not remove view." : "امکان حذف نما وجود نداشت", + "Could not reload view." : "امکان بارگذاری مجدد نما وجود نداشت", + "Could not update table." : "امکان به‌روزرسانی جدول وجود نداشت", + "Could not mark view as favorite" : "امکان علامت‌گذاری نما به عنوان موردعلاقه وجود نداشت", + "Could not remove view from favorites" : "امکان حذف نما از موارد علاقه‌مندی وجود نداشت", + "Could not mark table as favorite" : "امکان علامت‌گذاری جدول به عنوان موردعلاقه وجود نداشت", + "Could not remove table from favorites" : "امکان حذف جدول از موارد علاقه‌مندی وجود نداشت", + "Could not add application share." : "امکان افزودن اشتراک برنامه وجود نداشت", + "Could not remove application share." : "امکان حذف اشتراک برنامه وجود نداشت", + "Could not update display mode." : "امکان به‌روزرسانی حالت نمایش وجود نداشت", + "Could not insert application." : "امکان درج برنامه وجود نداشت", + "Could not update application." : "امکان به‌روزرسانی برنامه وجود نداشت", + "Could not transfer table." : "امکان انتقال جدول وجود نداشت", + "Could not load applications." : "امکان بارگذاری برنامه‌ها وجود نداشت", + "Could not fetch applications" : "امکان واکشی برنامه‌ها وجود نداشت", + "Could not load application." : "امکان بارگذاری برنامه وجود نداشت", + "Could not fetch application" : "امکان واکشی برنامه وجود نداشت", + "Could not load table." : "امکان بارگذاری جدول وجود نداشت", + "Could not fetch table" : "امکان واکشی جدول وجود نداشت", + "Could not load view" : "امکان بارگذاری نما وجود نداشت", + "Could not fetch view" : "امکان واکشی نما وجود نداشت", + "Could not verify export permissions." : "امکان تأیید مجوزهای خروجی وجود نداشت", + "Could not transfer application." : "امکان انتقال برنامه وجود نداشت", + "Could not remove application." : "امکان حذف برنامه وجود نداشت", + "Could not remove table." : "امکان حذف جدول وجود نداشت", + "Share not found" : "اشتراک یافت نشد", + "This share does not exist or is no longer available" : "این اشتراک وجود ندارد یا دیگر در دسترس نیست", "Back to %s" : "بازگشت به %s" }, "nplurals=2; plural=(n > 1);"); diff --git a/l10n/fa.json b/l10n/fa.json index 1e003519aa..38606a6276 100644 --- a/l10n/fa.json +++ b/l10n/fa.json @@ -1,470 +1,707 @@ { "translations": { - "Tables" : "جدول‌ها", - "Nextcloud Tables" : "Nextcloud Tables", - "Select table" : "Select table", - "Select columns" : "Select columns", - "e.g. 1,2,4 or leave empty" : "e.g. 1,2,4 or leave empty", - "Timestamp of data load" : "Timestamp of data load", + "You have created a new table {table}" : "شما جدول جدید {table} را ایجاد کردید", + "{user} has created a new table {table}" : "{user} جدول جدید {table} را ایجاد کرد", + "You have deleted the table {table}" : "شما جدول {table} را حذف کردید", + "{user} has deleted the table {table}" : "{user} جدول {table} را حذف کرد", + "You have renamed the table {before} to {table}" : "شما نام جدول {before} را به {table} تغییر دادید", + "{user} has renamed the table {before} to {table}" : "{user} نام جدول {before} را به {table} تغییر داده است", + "You have updated the description of table {table} to {after}" : "شما توضیحات جدول {table} را به {after} به‌روزرسانی کرده‌اید", + "{user} has updated the description of table {table} to {after}" : "{user} توضیحات جدول {table} را به {after} به‌روزرسانی کرده است", + "You have created a new row {row} in table {table}" : "شما یک سطر جدید به نام {row} در جدول {table} ایجاد کرده‌اید", + "{user} has created a new row {row} in table {table}" : "{user} یک سطر جدید به نام {row} در جدول {table} ایجاد کرده است", + "_You have updated cell %1$s on row {row} in table {table}_::_You have updated cells %1$s on row {row} in table {table}_" : ["شما سلول %1$s را در ردیف {row} از جدول {table} به‌روزرسانی کردید","شما سلول‌های %1$s را در ردیف {row} از جدول {table} به‌روزرسانی کردید"], + "_{user} has updated cell %1$s on row {row} in table {table}_::_{user} has updated cells %1$s on row {row} in table {table}_" : ["{user} سلول %1$s را در ردیف {row} از جدول {table} به‌روزرسانی کرد","{user} سلول‌های %1$s را در ردیف {row} از جدول {table} به‌روزرسانی کرد"], + "You have deleted the row {row} in table {table}" : "شما سطر {row} را در جدول {table} حذف کرده‌اید", + "{user} has deleted the row {row} in table {table}" : "{user} سطر {row} را در جدول {table} حذف کرده است", + "You have imported file to table {table}" : "شما فایلی را به جدول {table} وارد کرده‌اید", + "{user} has imported file to table {table}" : "{user} فایلی را به جدول {table} وارد کرده است", + "Found columns: {foundColumnsCount}" : "ستون‌های یافت شده: {foundColumnsCount}", + "Matching columns: {matchingColumnsCount}" : "ستون‌های منطبق: {matchingColumnsCount}", + "Created columns: {createdColumnsCount}" : "ستون‌های ایجاد شده: {createdColumnsCount}", + "Inserted rows: {insertedRowsCount}" : "سطرهای درج شده: {insertedRowsCount}", + "Updated rows: {updatedRowsCount}" : "سطرهای به‌روزرسانی شده: {updatedRowsCount}", + "Value parsing errors: {errorsParsingCount}" : "خطاهای تجزیه مقادیر: {errorsParsingCount}", + "Row creation errors: {errorsCount}" : "خطاهای ایجاد سطر: {errorsCount}", + "Tables" : "جداول", + "A table or row was changed" : "یک جدول یا سطر تغییر کرد", + "Nextcloud Tables" : "نکست‌کلود Tables", + "Select table" : "انتخاب جدول", + "Select columns" : "انتخاب ستون‌ها", + "e.g. 1,2,4 or leave empty" : "مثلاً 1,2,4 یا خالی بگذارید", + "Timestamp of data load" : "زمان بارگذاری داده", "No" : "خیر", "Yes" : "بله", - "Could not update row." : "Could not update row.", - "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" : "حجم پروندهٔ بارگذاری شده بیش‌تر از MAX_FILE_SIZE مشخّص شده در فرم HTML است", - "The file was only partially uploaded" : "پرونده به صورت ناقص بارگذاری شده بود", - "No file was uploaded" : "هیچ پرونده‌ای بارگذاری نشده", - "Missing a temporary folder" : "یک شاخهٔ موقّتی گم شده", - "Could not write file to disk" : "نتوانست پرونده را روی دیسک بنویسد", - "A PHP extension stopped the file upload" : "یک افزونهٔ پی‌اچ‌پی بارگذاری پرونده را متوقّف کرد", - "No file uploaded or file size exceeds maximum of %s" : "پرونده‌ای بارگذاری نشد و یا حجم پرونده بیش از بیشینه مجاز %s بود", - "Nextcloud tables" : "Nextcloud tables", + "Count" : "تعداد", + "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "خطای غیرمنتظره‌ای رخ داد. جزئیات بیشتر در لاگ‌ها موجود است. لطفاً با مدیر سیستم خود تماس بگیرید.", + "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "خطای دسترسی رخ داد. جزئیات بیشتر در لاگ‌ها موجود است. لطفاً با مدیر سیستم خود تماس بگیرید.", + "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "خطای «پیدا نشد» رخ داد. جزئیات بیشتر در لاگ‌ها موجود است. لطفاً با مدیر سیستم خود تماس بگیرید.", + "Could not create row." : "امکان ایجاد سطر وجود نداشت.", + "Could not update row." : "امکان به‌روزرسانی سطر وجود نداشت.", + "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" : "فایل آپلود شده از دستور MAX_FILE_SIZE که در فرم HTML مشخص شده بود فراتر رفته است", + "The file was only partially uploaded" : "فایل فقط به صورت جزئی آپلود شد", + "No file was uploaded" : "هیچ فایلی آپلود نشد", + "Missing a temporary folder" : "پوشه موقت وجود ندارد", + "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 بیشتر است", + "Deleted team %s." : "تیم %s حذف شد.", + "Nextcloud tables" : "جداول نکست‌کلود", "_%n row_::_%n rows_" : ["%n row","%n rows"], - "This column was automatically created by the import service." : "This column was automatically created by the import service.", - "ToDo list" : "ToDo list", - "Setup a simple todo-list." : "Setup a simple todo-list.", + "table" : "جدول", + "table view" : "نمای جدول", + "Column width must be between %1$s and %2$s." : "عرض ستون باید بین %1$s و %2$s باشد.", + "This column was automatically created by the import service." : "این ستون به‌طور خودکار توسط سرویس واردات ایجاد شده است.", + "Column \"%s\" contains a non-unique value." : "ستون \"%s\" حاوی مقدار غیریکتا است.", + "Column \"%s\" contains an invalid protocol. Only http and https are allowed." : "ستون \"%s\" حاوی پروتکل نامعتبر است. فقط http و https مجاز هستند.", + "Welcome to %s Tables!" : "به جداول %s خوش آمدید!", + "ToDo list" : "لیست کارها", + "Setup a simple todo-list." : "یک لیست ساده از کارها ایجاد کنید.", "Members" : "اعضا", - "List of members with some basic attributes." : "List of members with some basic attributes.", - "Customers" : "Customers", - "Manage your customers." : "Manage your customers.", - "Vacation requests" : "Vacation requests", - "Use this table to collect and manage vacation requests." : "Use this table to collect and manage vacation requests.", - "Weight tracking" : "Weight tracking", - "Track your weight and other health measures." : "Track your weight and other health measures.", + "List of members with some basic attributes." : "لیست اعضا با برخی ویژگی‌های پایه.", + "Customers" : "مشتریان", + "Manage your customers." : "مشتریان خود را مدیریت کنید.", + "Vacation requests" : "درخواست‌های مرخصی", + "Use this table to collect and manage vacation requests." : "از این جدول برای جمع‌آوری و مدیریت درخواست‌های مرخصی استفاده کنید.", + "Weight tracking" : "پیگیری وزن", + "Track your weight and other health measures." : "وزن و سایر شاخص‌های سلامتی خود را پیگیری کنید.", "Date" : "تاریخ", - "Weight" : "Weight", - "Body fat" : "Body fat", - "Feeling over all" : "Feeling over all", + "Weight" : "وزن", + "Body fat" : "چربی بدن", + "Feeling over all" : "احساس کلی", "Comments" : "نظرات", - "feel sick" : "feel sick", - "party-time" : "party-time", + "feel sick" : "احساس بیماری می‌کنم", + "party-time" : "وقت خوش", "Name" : "نام", - "Account manager" : "Account manager", - "Contract type" : "Contract type", - "Contract start" : "Contract start", - "Contract end" : "Contract end", + "Account manager" : "مدیر حساب", + "Contract type" : "نوع قرارداد", + "Contract start" : "شروع قرارداد", + "Contract end" : "پایان قرارداد", "Description" : "توضیحات", - "Contact information" : "Contact information", - "Quality of relationship" : "Quality of relationship", - "Comment" : "دیدگاه", - "Dog" : "Dog", - "Dog food every week" : "Dog food every week", - "The dog is our best friend." : "The dog is our best friend.", - "Standard, SLA Level 2" : "Standard, SLA Level 2", - "Likes treats" : "Likes treats", - "Cat" : "Cat", - "Cat food every week" : "Cat food every week", - "The cat is also our best friend." : "The cat is also our best friend.", - "Standard, SLA Level 1" : "Standard, SLA Level 1", - "New customer, let's see if there is more." : "New customer, let's see if there is more.", - "Horse" : "Horse", - "Hay and straw" : "Hay and straw", - "Summer only" : "Summer only", - "Special" : "Special", - "Maybe we can make it fix for every year?!" : "Maybe we can make it fix for every year?!", - "Employee name" : "Employee name", + "Contact information" : "اطلاعات تماس", + "Quality of relationship" : "کیفیت رابطه", + "Comment" : "نظر", + "Dog" : "سگ", + "Dog food every week" : "غذای سگ هر هفته", + "The dog is our best friend." : "سگ بهترین دوست ماست.", + "Standard, SLA Level 2" : "استاندارد، سطح SLA 2", + "Likes treats" : "تشویقی دوست دارد", + "Cat" : "گربه", + "Cat food every week" : "غذای گربه هر هفته", + "The cat is also our best friend." : "گربه نیز بهترین دوست ماست.", + "Standard, SLA Level 1" : "استاندارد، سطح SLA 1", + "New customer, let's see if there is more." : "مشتری جدید، ببینیم بیشتر هست یا نه.", + "Horse" : "اسب", + "Hay and straw" : "یونجه و کاه", + "Summer only" : "فقط تابستان", + "Special" : "ویژه", + "Maybe we can make it fix for every year?!" : "شاید بتوانیم آن را برای هر سال ثابت کنیم؟!", + "Employee name" : "نام کارمند", "from" : "از", - "When is your vacation starting?" : "When is your vacation starting?", + "When is your vacation starting?" : "مرخصی شما از چه تاریخی شروع می‌شود؟", "to" : "به", - "When is your vacation ending?" : "When is your vacation ending?", - "Number of working days" : "Number of working days", - "How many working days are included?" : "How many working days are included?", - "Request date" : "Request date", - "Approved" : "تایید شده", - "Approve date" : "Approve date", - "Approved by" : "Approved by", - "The Boss" : "The Boss", - "We have to talk about that." : "We have to talk about that.", - "Create Vacation Request" : "Create Vacation Request", - "Open Request" : "Open Request", - "Request Status" : "Request Status", - "Closed requests" : "Closed requests", - "Position" : "Position", - "Skills" : "Skills", - "Birthday" : "روز تولد", - "Santa Claus" : "Santa Claus", - "Make happy people" : "Make happy people", - "Task" : "Task", - "Title or short description" : "Title or short description", - "Target" : "Target", - "Date, time or whatever" : "Date, time or whatever", + "When is your vacation ending?" : "تعطیلات شما کی تمام می‌شود؟", + "Number of working days" : "تعداد روزهای کاری", + "How many working days are included?" : "چند روز کاری شامل می‌شود؟", + "Request date" : "تاریخ درخواست", + "Approved" : "تأیید شده", + "Approve date" : "تاریخ تأیید", + "Approved by" : "تأیید شده توسط", + "The Boss" : "رئیس", + "Bob will help for this time" : "باب این بار کمک خواهد کرد", + "We have to talk about that." : "باید در مورد آن صحبت کنیم.", + "Create Vacation Request" : "ایجاد درخواست مرخصی", + "Open Request" : "درخواست باز", + "Request Status" : "وضعیت درخواست", + "Closed requests" : "درخواست‌های بسته شده", + "Position" : "موقعیت شغلی", + "Skills" : "مهارت‌ها", + "Birthday" : "تاریخ تولد", + "Santa Claus" : "بابا نوئل", + "Make happy people" : "مردم را شاد کنید", + "Task" : "وظیفه", + "Title or short description" : "عنوان یا توضیح کوتاه", + "Target" : "هدف", + "Date, time or whatever" : "تاریخ، زمان یا هر چیز دیگر", "Progress" : "پیشرفت", - "Proofed" : "Proofed", - "Create initial milestones" : "Create initial milestones", - "Create some milestones to structure the project." : "Create some milestones to structure the project.", - "Plan to discuss for the kickoff meeting." : "Plan to discuss for the kickoff meeting.", - "Wow, that was hard work, but now it's done." : "Wow, that was hard work, but now it's done.", - "Kickoff meeting" : "Kickoff meeting", - "We will have a kickoff meeting in person." : "We will have a kickoff meeting in person.", - "Project is kicked-off and we know the vision and our first tasks." : "Project is kicked-off and we know the vision and our first tasks.", - "That was nice in person again. We collected some action points, had a look at the documentation..." : "That was nice in person again. We collected some action points, had a look at the documentation...", - "Set up some documentation and collaboration tools" : "Set up some documentation and collaboration tools", - "Where and in what way do we collaborate?" : "Where and in what way do we collaborate?", - "We know what we are doing." : "We know what we are doing.", - "Add more actions" : "Add more actions", - "I guess we need more actions in here..." : "I guess we need more actions in here...", - "What" : "What", - "How to do" : "How to do", - "Ease of use" : "Ease of use", - "Done" : "Done", - "Open the tables app" : "Open the tables app", - "Add your first row" : "Add your first row", - "Edit a row" : "Edit a row", - "Add a new column" : "Add a new column", - "Read the docs" : "Read the docs", - "Manage data the way you need it." : "Manage data the way you need it.", - "Table" : "Table", - "View" : "نمایش", + "Proofed" : "اثبات شده", + "Create initial milestones" : "ایجاد نقاط عطف اولیه", + "Create some milestones to structure the project." : "چند نقطه عطف برای ساختاردهی پروژه ایجاد کنید.", + "Plan to discuss for the kickoff meeting." : "برنامه‌ریزی برای بحث در جلسه شروع پروژه.", + "Wow, that was hard work, but now it's done." : "وای، کار سختی بود، اما حالا تمام شده است.", + "Kickoff meeting" : "جلسه شروع پروژه", + "We will have a kickoff meeting in person." : "یک جلسه شروع پروژه حضوری خواهیم داشت.", + "Project is kicked-off and we know the vision and our first tasks." : "پروژه شروع شده است و ما چشم‌انداز و اولین وظایف خود را می‌دانیم.", + "That was nice in person again. We collected some action points, had a look at the documentation..." : "دوباره حضوری بودن خوب بود. چند نکته عملی جمع‌آوری کردیم، به مستندات نگاهی انداختیم...", + "Set up some documentation and collaboration tools" : "راه‌اندازی ابزارهای مستندسازی و همکاری", + "Where and in what way do we collaborate?" : "کجا و به چه صورت همکاری می‌کنیم؟", + "We know what we are doing." : "می‌دانیم چه کار می‌کنیم.", + "We have heard that %s could be a nice solution for it, should give it a try." : "شنیده‌ایم که %s می‌تواند راه‌حل خوبی برای آن باشد، باید امتحانش کنیم.", + "Add more actions" : "افزودن اقدامات بیشتر", + "I guess we need more actions in here..." : "حدس می‌زنم اینجا به اقدامات بیشتری نیاز داریم...", + "What" : "چه چیزی", + "How to do" : "نحوه انجام", + "Ease of use" : "سهولت استفاده", + "Done" : "انجام شده", + "Open the tables app" : "برنامه Tables را باز کنید", + "Reachable via the Tables icon in the apps list." : "قابل دسترسی از طریق آیکون Tables در لیست برنامه‌ها.", + "Add your first row" : "اولین ردیف خود را اضافه کنید", + "Use the *+ Create row* button and enter some data inside of the form." : "از دکمه *+ ایجاد ردیف* استفاده کنید و داده‌هایی را درون فرم وارد کنید.", + "Edit a row" : "ویرایش یک ردیف", + "Go to a row you want to edit and use the *pencil* edit button. Maybe you want to add a *Done* status to this row?" : "به ردیفی که می‌خواهید ویرایش کنید بروید و از دکمه ویرایش *مداد* استفاده کنید. شاید بخواهید وضعیت *انجام شده* را به این ردیف اضافه کنید؟", + "Add a new column" : "افزودن ستون جدید", + "You can add, remove and adjust columns as you need. Open the three-dot-menu on the upper right of this table and choose *Create column*. Fill in the data you want, at least a title and column type." : "می‌توانید ستون‌ها را به دلخواه اضافه، حذف و تنظیم کنید. منوی سه‌نقطه را در بالای سمت راست این جدول باز کرده و گزینه *ایجاد ستون* را انتخاب کنید. داده‌های مورد نظر خود را پر کنید، حداقل یک عنوان و نوع ستون الزامی است.", + "Create views for tables" : "ایجاد نماها برای جداول", + "Filter data and save table presets as views to share and combine them into applications." : "فیلتر کردن داده‌ها و ذخیره پیش‌تنظیمات جدول به عنوان نما برای اشتراک‌گذاری و ترکیب آن‌ها در برنامه‌ها", + "Create applications" : "ایجاد برنامه‌ها", + "Combine different tables and views into no-code applications for any purpose. This makes them easily accessible directly in the app bar." : "جداول و نماهای مختلف را برای هر منظوری در برنامه‌های بدون کد ترکیب کنید. این کار دسترسی آسان به آن‌ها را مستقیماً در نوار برنامه فراهم می‌کند.", + "Read the docs" : "مطالعه مستندات", + "If you want to go through the documentation, it can be found here: [Nextcloud Tables documentation](%s)" : "اگر می‌خواهید مستندات را مرور کنید، آن را اینجا بیابید: [مستندات نکست‌کلود Tables](%s)", + "Check yourself!" : "خودتان امتحان کنید!", + "All tables, columns, rows, contexts, and sharing information including all tables owned or shared, their structure and content" : "تمام جداول، ستون‌ها، ردیف‌ها، زمینه‌ها و اطلاعات اشتراک‌گذاری شامل تمام جداول مالکیت‌شده یا اشتراک‌گذاری‌شده، ساختار و محتوای آن‌ها", + "Manage data the way you need it." : "داده‌ها را به روشی که نیاز دارید مدیریت کنید.", + "Manage data the way you need it.\n\nWith this app you are able to create your own tables with individual columns. You can start with a template or from scratch and add your wanted columns.\nYou can choose from the following column types:\n- Text line or rich text\n- Link to urls or other nextcloud resources\n- Numbers\n- Progress bar\n- Stars rating\n- Yes/No tick\n- Date and/or time\n- (Multi) selection\n- Users, groups and teams\n\nShare your tables and views with users and groups within your cloud.\n\nHave a good time and manage whatever you want." : "داده‌ها را به روشی که نیاز دارید مدیریت کنید.", + "Table" : "جدول", + "View" : "نما", "Today" : "امروز", - "Last edit" : "Last edit", - "Create" : "ساخت", - "Column ID" : "Column ID", - "Table ID" : "Table ID", + "Last edit" : "آخرین ویرایش", + "Create" : "ایجاد", + "Column ID" : "شناسه ستون", + "Table ID" : "شناسه جدول", "Text" : "متن", "Link" : "پیوند", - "Number" : "Number", - "Stars rating" : "Stars rating", - "Progress bar" : "Progress bar", + "Number" : "عدد", + "Stars rating" : "رتبه‌بندی ستاره‌ای", + "Progress bar" : "نوار پیشرفت", "Selection" : "انتخاب", - "Date and time" : "Date and time", - "Users and groups" : "Users and groups", - "Move" : "انتقال", - "Metadata" : "ابرداده", - "Move up" : "حرکت به بالا", - "Move down" : "حرکت به پایین", - "Add new sorting rule" : "Add new sorting rule", + "Date and time" : "تاریخ و زمان", + "Users and groups" : "کاربران و گروه‌ها", + "Relation" : "رابطه", + "Column type" : "نوع ستون", + "Move" : "جابه‌جایی", + "Metadata" : "فراداده", + "Move up" : "انتقال به بالا", + "Move down" : "انتقال به پایین", + "Rules are applied in order. The first rule sorts all rows, and any additional rules determine the order within any group of rows that share the same value." : "قوانین به ترتیب اعمال می‌شوند. اولین قانون همه ردیف‌ها را مرتب می‌کند و قوانین اضافی ترتیب را در هر گروه از ردیف‌هایی که مقدار یکسانی دارند تعیین می‌کنند.", + "Add new sorting rule" : "افزودن قانون مرتب‌سازی جدید", "Read only" : "فقط خواندنی", - "Mandatory" : "Mandatory", + "Mandatory" : "اجباری", "JJJJ-MM-DD hh:mm" : "JJJJ-MM-DD hh:mm", "JJJJ-MM-DD" : "JJJJ-MM-DD", "hh:mm" : "hh:mm", - "Search Value" : "Search Value", - "Column" : "Column", - "Operator" : "Operator", - "Delete filter" : "Delete filter", - "Filtering rows" : "Filtering rows", - "OR" : "OR", - "Add new filter group" : "Add new filter group", - "... that meet all of the following conditions" : "... that meet all of the following conditions", - "Add new filter" : "Add new filter", - "Ascending" : "Ascending", - "Descending" : "Descending", - "Reactivate sorting rule" : "Reactivate sorting rule", - "Delete sorting rule" : "Delete sorting rule", - "Override sorting rules" : "Override sorting rules", - "Updated table \"{emoji}{table}\"." : "Updated table \"{emoji}{table}\".", - "Cannot update table. Title is missing." : "Cannot update table. Title is missing.", - "Could not fetch shares." : "Could not fetch shares.", - "Views" : "Views", - "Create view" : "Create view", - "Rows" : "Rows", - "Columns" : "Columns", - "Last edited" : "Last edited", - "Shares" : "اشتراک گذاری ها", - "Actions" : "کنش‌ها", - "Edit view" : "Edit view", - "Share" : "هم‌رسانی", - "Integration" : "ادغام", - "Delete view" : "Delete view", - "Total" : "جمع", - "Data" : "داده", - "Manage table" : "Manage table", - "Edit table" : "Edit table", - "Create column" : "Create column", + "Search Value" : "جستجوی مقدار", + "Column" : "ستون", + "Operator" : "عملگر", + "Delete filter" : "حذف فیلتر", + "Filtering rows" : "فیلتر کردن ردیف‌ها", + "OR" : "یا", + "Add new filter group" : "افزودن گروه فیلتر جدید", + "... that meet all of the following conditions" : "که همه شرایط زیر را داشته باشند", + "Add new filter" : "افزودن فیلتر جدید", + "Ascending" : "صعودی", + "Descending" : "نزولی", + "Reactivate sorting rule" : "فعال‌سازی دوباره قانون مرتب‌سازی", + "Delete sorting rule" : "حذف قانون مرتب‌سازی", + "Among the sorting rules are some to which you have no permissions. However, if you like, you can override the sorting." : "در میان قوانین مرتب‌سازی، برخی هستند که شما دسترسی ندارید. با این حال، در صورت تمایل می‌توانید مرتب‌سازی را بازنویسی کنید.", + "Override sorting rules" : "بازنویسی قوانین مرتب‌سازی", + "Updated table \"{emoji}{table}\"." : "جدول \"{emoji}{table}\" به‌روزرسانی شد.", + "Cannot update table. Title is missing." : "امکان به‌روزرسانی جدول وجود ندارد. عنوان موجود نیست.", + "Could not fetch shares." : "امکان دریافت اشتراک‌ها وجود نداشت.", + "Views" : "نماها", + "Create view" : "ایجاد نما", + "Rows" : "ردیف‌ها", + "Columns" : "ستون‌ها", + "Last edited" : "آخرین ویرایش", + "Shares" : "اشتراک‌ها", + "Actions" : "اقدامات", + "Edit view" : "ویرایش نما", + "Share" : "اشتراک‌گذاری", + "Integration" : "یکپارچه‌سازی", + "Delete view" : "حذف نما", + "Total" : "مجموع", + "Data" : "داده‌ها", + "Manage table" : "مدیریت جدول", + "Edit table" : "ویرایش جدول", + "Create column" : "ایجاد ستون", "Import" : "وارد کردن", - "Export as CSV" : "Export as CSV", - "Filtered view" : "Filtered view", - "Reset local adjustments" : "Reset local adjustments", - "No columns" : "No columns", - "We need at least one column, please be so kind and create one." : "We need at least one column, please be so kind and create one.", - "No columns selected" : "No columns selected", - "The view is empty. Edit which columns should be displayed." : "The view is empty. Edit which columns should be displayed.", - "Manage view" : "Manage view", - "Please insert a title for the new column." : "Please insert a title for the new column.", - "You need to select a type for the new column." : "You need to select a type for the new column.", - "The column \"{column}\" was created." : "The column \"{column}\" was created.", - "Sorry, something went wrong." : "Sorry, something went wrong.", - "Could not create new column." : "Could not create new column.", + "Export all rows" : "خروجی گرفتن از همه ردیف‌ها", + "Export filtered rows" : "خروجی گرفتن از ردیف‌های فیلترشده", + "Filtered view" : "نمای فیلترشده", + "Reset local adjustments" : "بازنشانی تنظیمات محلی", + "No columns" : "بدون ستون", + "We need at least one column, please be so kind and create one." : "حداقل به یک ستون نیاز داریم، لطفاً یکی ایجاد کنید.", + "No columns selected" : "هیچ ستونی انتخاب نشده است", + "The view is empty. Edit which columns should be displayed." : "نما خالی است. ویرایش کنید که کدام ستون‌ها نمایش داده شوند.", + "Your access was revoked. Reload the page to update your permissions." : "دسترسی شما لغو شد. برای به‌روزرسانی مجوزهای خود، صفحه را بارگذاری مجدد کنید.", + "Manage view" : "مدیریت نما", + "Please insert a title for the new column." : "لطفاً یک عنوان برای ستون جدید وارد کنید.", + "Cannot save column. Column width must be between {min} and {max}." : "امکان ذخیره ستون وجود ندارد. عرض ستون باید بین {min} و {max} باشد.", + "You need to select a type for the new column." : "باید یک نوع برای ستون جدید انتخاب کنید.", + "Please select a relation type." : "لطفا یک نوع رابطه را انتخاب کنید.", + "Please select a target." : "لطفا یک هدف را انتخاب کنید.", + "Please select a label for relation selection." : "لطفا یک برچسب برای انتخاب رابطه انتخاب کنید.", + "The column \"{column}\" was created." : "ستون \"{column}\" ایجاد شد.", + "Sorry, something went wrong." : "متأسفانه، مشکلی پیش آمد.", + "Could not create new column." : "امکان ایجاد ستون جدید وجود نداشت.", "Type" : "نوع", - "Text line" : "Text line", + "Text line" : "خط متنی", "Simple text" : "متن ساده", "Rich text" : "متن غنی", - "Single selection" : "Single selection", - "Multiple selection" : "Multiple selection", - "Yes/No" : "Yes/No", + "Single selection" : "انتخاب تکی", + "Multiple selection" : "انتخاب چندگانه", + "Yes/No" : "بله/خیر", "Time" : "زمان", - "Add more" : "Add more", + "Add more" : "افزودن موارد بیشتر", "Save" : "ذخیره", + "The title character limit is 200 characters. Please use a shorter title." : "عنوان باید حداکثر ۲۰۰ کاراکتر باشد. لطفاً عنوان کوتاه‌تری انتخاب کنید.", + "Cannot create new application. Title is missing." : "امکان ایجاد برنامه جدید وجود ندارد. عنوان وارد نشده است.", + "Could not create new application" : "امکان ایجاد برنامه جدید وجود نداشت", + "Create an application" : "ایجاد یک برنامه", "Title" : "عنوان", + "Select icon for the application" : "انتخاب آیکون برای برنامه", + "Select icon" : "انتخاب آیکون", + "Title of the new application" : "عنوان برنامه جدید", + "Description of the new application" : "توضیحات برنامه جدید", "Resources" : "منابع", - "Create row" : "Create row", + "Show in app list" : "نمایش در لیست برنامه‌ها", + "This can be overridden by a per-account preference" : "این تنظیم می‌تواند با اولویت هر حساب کاربری بازنویسی شود", + "Create application" : "ایجاد برنامه", + "Fill form" : "پر کردن فرم", + "Create row" : "ایجاد ردیف", + "Fill form again" : "دوباره فرم را پر کنید", "Submit" : "ارسال", - "Row successfully created." : "Row successfully created.", - "Could not create new row" : "Could not create new row", - "Save row" : "Save row", - "Cannot create new table. Title is missing." : "Cannot create new table. Title is missing.", - "Could not create new table" : "Could not create new table", - "Could not load templates." : "Could not load templates.", - "Create table" : "Create table", - "Select emoji for table" : "Select emoji for table", - "Select emoji" : "Select emoji", - "Title of the new table" : "Title of the new table", - "🔧 Custom table" : "🔧 Custom table", - "Custom table from scratch." : "Custom table from scratch.", - "Are you sure you want to delete column \"{column}\"?" : "Are you sure you want to delete column \"{column}\"?", - "Error occurred while deleting column \"{column}\"." : "Error occurred while deleting column \"{column}\".", - "Delete column" : "ستون را حذف کنید", + "Form successfully submitted." : "فرم با موفقیت ارسال شد.", + "Row successfully created." : "ردیف با موفقیت ایجاد شد.", + "Could not create new row" : "امکان ایجاد ردیف جدید وجود نداشت", + "\"{columnTitle}\" should not be empty" : "\"{columnTitle}\" نباید خالی باشد", + "Save row" : "ذخیره ردیف", + "Cannot create new table. Title is missing." : "امکان ایجاد جدول جدید وجود ندارد. عنوان وارد نشده است.", + "Could not create new table" : "امکان ایجاد جدول جدید وجود نداشت", + "Could not load templates." : "امکان بارگذاری الگوها وجود نداشت.", + "Create table" : "ایجاد جدول", + "Select emoji for table" : "انتخاب ایموجی برای جدول", + "Select emoji" : "انتخاب ایموجی", + "Title of the new table" : "عنوان جدول جدید", + "🔧 Custom table" : "🔧 جدول سفارشی", + "Custom table from scratch." : "جدول سفارشی از ابتدا.", + "📄 Import table" : "📄 وارد کردن جدول", + "Import table from file." : "وارد کردن جدول از فایل.", + "📄 Import Scheme" : "📄 درون‌ریزی طرح‌واره", + "Import Scheme from file." : "وارد کردن طرح از فایل.", + "Are you sure you want to delete column \"{column}\"?" : "آیا مطمئن هستید که می‌خواهید ستون \"{column}\" را حذف کنید؟", + "Error occurred while deleting column \"{column}\"." : "هنگام حذف ستون \"{column}\" خطایی رخ داد.", + "Delete column" : "حذف ستون", + "Do you really want to delete the application \"{context}\"? This will also delete the shares and unshare the resources that are connected to this application." : "آیا واقعاً می‌خواهید برنامه \"{context}\" را حذف کنید؟ این کار اشتراک‌ها را نیز حذف کرده و منابع متصل به این برنامه را از اشتراک خارج می‌کند.", + "Application \"{context}\" removed." : "برنامه \"{context}\" حذف شد.", + "Confirm application deletion" : "تأیید حذف برنامه", "Cancel" : "لغو", "Delete" : "حذف", - "Error occurred while deleting rows." : "Error occurred while deleting rows.", + "Error occurred while deleting rows." : "هنگام حذف ردیف‌ها خطایی رخ داد.", "_Delete row_::_Delete rows_" : ["Delete row","Delete rows"], "_Are you sure you want to delete the selected row?_::_Are you sure you want to delete the %n selected rows?_" : ["Are you sure you want to delete the selected row?","Are you sure you want to delete the %n selected rows?"], - "Do you really want to delete the table \"{table}\"? This will also delete all data, views and shares that are connected to this table." : "Do you really want to delete the table \"{table}\"? This will also delete all data, views and shares that are connected to this table.", - "Table \"{emoji}{table}\" removed." : "Table \"{emoji}{table}\" removed.", - "Confirm table deletion" : "Confirm table deletion", - "Do you really want to delete the view \"{view}\"?" : "Do you really want to delete the view \"{view}\"?", - "View \"{emoji}{view}\" removed." : "View \"{emoji}{view}\" removed.", - "Confirm view deletion" : "Confirm view deletion", - "Cannot update column. Title is missing." : "Cannot update column. Title is missing.", - "The column \"{column}\" was updated." : "The column \"{column}\" was updated.", - "Edit column" : "Edit column", - "Could not delete row." : "Could not delete row.", - "Edit row" : "Edit row", + "Do you really want to delete the table \"{table}\"? This will also delete all data, views and shares that are connected to this table." : "آیا واقعاً می‌خواهید جدول \"{table}\" را حذف کنید؟ این کار تمام داده‌ها، نماها و اشتراک‌های متصل به این جدول را نیز حذف می‌کند.", + "Table \"{emoji}{table}\" removed." : "جدول \"{emoji}{table}\" حذف شد.", + "Confirm table deletion" : "تأیید حذف جدول", + "Do you really want to delete the view \"{view}\"?" : "آیا واقعاً می‌خواهید نمای \"{view}\" را حذف کنید؟", + "View \"{emoji}{view}\" removed." : "نمایش \"{emoji}{view}\" حذف شد.", + "Confirm view deletion" : "تأیید حذف نمایش", + "Cannot update column. Title is missing." : "امکان به‌روزرسانی ستون وجود ندارد. عنوان وارد نشده است.", + "The column \"{column}\" was updated." : "ستون \"{column}\" به‌روزرسانی شد.", + "Edit column" : "ویرایش ستون", + "Cannot update application. Title is missing." : "امکان به‌روزرسانی برنامه وجود ندارد. عنوان وارد نشده است.", + "Updated application \"{contextTitle}\"." : "برنامه \"{contextTitle}\" به‌روزرسانی شد.", + "Edit application" : "ویرایش برنامه", + "Select an icon for application" : "انتخاب آیکون برای برنامه", + "Title of the application" : "عنوان برنامه", + "Description of the application" : "توضیحات برنامه", + "I really want to delete this application!" : "واقعاً می‌خواهم این برنامه را حذف کنم!", + "Transfer application" : "انتقال برنامه", + "Could not delete row." : "امکان حذف سطر وجود نداشت.", + "Edit row" : "ویرایش سطر", "Edit" : "ویرایش", - "Activity" : "فعالیت", - "I really want to delete this row!" : "I really want to delete this row!", - "Manage" : "Manage", + "Activity" : "فعالیت‌ها", + "I really want to delete this row!" : "واقعاً می‌خواهم این سطر را حذف کنم!", + "Column order" : "ترتیب ستون‌ها", + "Default sorting" : "مرتب‌سازی پیش‌فرض", + "Manage" : "مدیریت", "Owner" : "مالک", - "I really want to delete this table!" : "I really want to delete this table!", - "Create missing columns" : "Create missing columns", - "Close" : "بسته", - "Could not import data due to unknown errors." : "Could not import data due to unknown errors.", - "Please select a file." : "لطفا فایل مورد نظر را انتخاب کنید ", - "Select file for the import" : "Select file for the import", - "Could not import, not authorized. Are you logged in?" : "Could not import, not authorized. Are you logged in?", - "Could not import, missing needed permission." : "Could not import, missing needed permission.", - "Could not import, needed resources were not found." : "Could not import, needed resources were not found.", - "Select from Files" : "از میان پرونده ها انتخاب کنید", - "Upload from device" : "Upload from device", - "⚠️ You don't have the permission to create columns." : "⚠️ You don't have the permission to create columns.", + "I really want to delete this table!" : "واقعاً می‌خواهم این جدول را حذف کنم!", + "Change owner" : "تغییر مالک", + "Could not create table" : "امکان ایجاد جدول وجود نداشت", + "File import started, this might take a while. You will be notified once it finished." : "وارد کردن فایل آغاز شد، ممکن است مدتی طول بکشد. پس از اتمام به شما اطلاع داده خواهد شد.", + "You must select an existing table" : "باید یک جدول موجود را انتخاب کنید", + "Could not import data to table" : "امکان وارد کردن داده به جدول وجود نداشت", + "Import file into Tables" : "وارد کردن فایل به Tables", + "Import as new table" : "وارد کردن به عنوان جدول جدید", + "This will create a new table from the data in this file." : "این کار یک جدول جدید از داده‌های موجود در این فایل ایجاد می‌کند.", + "Import into existing table" : "وارد کردن به جدول موجود", + "This will import the data from this file into an already existing table." : "این کار داده‌های این فایل را به یک جدول موجود وارد می‌کند.", + "Select the table to import into" : "جدول مورد نظر برای وارد کردن را انتخاب کنید", + "Select an existing table" : "یک جدول موجود را انتخاب کنید", + "Create missing columns" : "ایجاد ستون‌های缺失", + "Import successful" : "وارد کردن با موفقیت انجام شد", + "Close" : "بستن", + "Could not import data due to unknown errors." : "به دلیل خطاهای ناشناخته امکان وارد کردن داده وجود نداشت.", + "Import table" : "وارد کردن جدول", + "Preview imported table" : "پیش‌نمایش جدول وارد شده", + "The selected file is not supported." : "فایل انتخاب شده پشتیبانی نمی‌شود.", + "Please select a file." : "لطفاً یک فایل را انتخاب کنید.", + "Please select column for mapping." : "لطفاً ستون مورد نظر برای نگاشت را انتخاب کنید.", + "Cannot map same exist column for multiple columns." : "نمی‌توان یک ستون موجود را برای چندین ستون نگاشت کرد.", + "Select file for the import" : "فایل مورد نظر برای وارد کردن را انتخاب کنید", + "Could not import, not authorized. Are you logged in?" : "امکان وارد کردن وجود ندارد، دسترسی ندارید. آیا وارد سیستم شده‌اید؟", + "Could not import, missing needed permission." : "امکان وارد کردن وجود ندارد، مجوز لازم وجود ندارد.", + "Could not import, needed resources were not found." : "امکان وارد کردن وجود ندارد، منابع مورد نیاز یافت نشدند.", + "Add data to the table from a file" : "افزودن داده به جدول از یک فایل", + "Select from Files" : "انتخاب از فایل‌ها", + "Upload from device" : "بارگذاری از دستگاه", + "Supported formats: xlsx, xls, csv, html, xml" : "فرمت‌های پشتیبانی‌شده: xlsx, xls, csv, html, xml", + "First row of the file must contain column headings without gaps." : "ردیف اول فایل باید شامل عنوان ستون‌ها بدون فاصله باشد.", + "⚠️ You don't have the permission to create columns." : "⚠️ شما اجازهٔ ساخت ستون را ندارید.", "Preview" : "پیش‌نمایش", - "Failed" : "Failed", - "Loading table data" : "Loading table data", - "Result" : "شروع به اسکنیک", - "Found columns" : "Found columns", - "Matching columns" : "Matching columns", - "Created columns" : "Created columns", - "Inserted rows" : "Inserted rows", - "Value parsing errors" : "Value parsing errors", - "Row creation errors" : "Row creation errors", + "Importing data from " : "در حال وارد کردن داده از ", + "This might take a while..." : "ممکن است کمی طول بکشد...", + "Failed" : "ناموفق", + "Loading table data" : "در حال بارگذاری داده‌های جدول", + "ID (Meta)" : "شناسه (فراداده)", + "Create new column" : "ایجاد ستون جدید", + "Import to existing column" : "وارد کردن به ستون موجود", + "Existing column" : "ستون موجود", + "Ignore column" : "نادیده گرفتن ستون", + "Result" : "نتیجه", + "Found columns" : "ستون‌های یافت‌شده", + "Matching columns" : "ستون‌های منطبق", + "Created columns" : "ستون‌های ایجادشده", + "Inserted rows" : "ردیف‌های درج‌شده", + "Updated rows" : "ردیف‌های به‌روزرسانی‌شده", + "Value parsing errors" : "خطاهای تجزیه مقدار", + "Row creation errors" : "خطاهای ایجاد ردیف", + "Import scheme" : "طرح واردات", + "Context \"{name}\" transferred to {user}" : "بافت \"{name}\" به {user} منتقل شد", + "Transfer the application \"{context}\" to another user" : "انتقال برنامه \"{context}\" به کاربر دیگر", "Transfer" : "انتقال", - "Create View" : "Create View", - "Save modified View" : "Save modified View", - "Save View" : "Save View", - "Save as new view" : "Save as new view", - "Cannot create view." : "Cannot create view.", - "Cannot update view." : "Cannot update view.", - "Title is missing." : "Title is missing.", - "Could not create new view" : "Could not create new view", - "Could not update view" : "Could not update view", - "Select emoji for view" : "Select emoji for view", - "Title of the new view" : "Title of the new view", - "New title of the view" : "New title of the view", - "Filter" : "پالایه", + "Table \"{emoji}{table}\" transferred to {user}" : "جدول \"{emoji}{table}\" به {user} منتقل شد", + "Transfer table" : "انتقال جدول", + "Transfer this table to another user" : "انتقال این جدول به کاربر دیگر", + "Create View" : "ایجاد نما", + "Save modified View" : "ذخیره نمای ویرایش‌شده", + "Save View" : "ذخیره نما", + "Save as new view" : "ذخیره به عنوان نمای جدید", + "Cannot create view." : "امکان ایجاد نما وجود ندارد.", + "Cannot update view." : "امکان به‌روزرسانی نما وجود ندارد.", + "Title is missing." : "عنوان وجود ندارد.", + "Could not create new view" : "نمای جدید ایجاد نشد", + "Could not update view" : "نما به‌روزرسانی نشد", + "Select emoji for view" : "انتخاب ایموجی برای نما", + "Title of the new view" : "عنوان نمای جدید", + "New title of the view" : "عنوان جدید نما", + "Filter" : "فیلتر", "Sort" : "مرتب‌سازی", - "Do you really want to delete the table \"{table}\"?" : "Do you really want to delete the table \"{table}\"?", - "Export" : "دریافت خروجی", - "Add to favorites" : "افزودن به برگزیده‌ها", - "Remove from favorites" : "حذف از برگزیده‌ها", - "Delete table" : "Delete table", - "Copy" : "رونوشت", - "Could not configure new view" : "Could not configure new view", - "Duplicate view" : "Duplicate view", - "Favorites" : "مورد علاقه‌ها", - "Your results are filtered." : "Your results are filtered.", - "Clear filter" : "پاک کردن پالایه", - "Share with accounts or groups" : "هم‌رسانی با حساب‌ها یا گروه‌ها", - "No recommendations. Start typing." : "هیچ توصیه ای نیست شروع به تایپ کنید.", - "Receiver type" : "Receiver type", - "Create time" : "Create time", - "Share ID" : "Share ID", - "Copy internal link to clipboard" : "Copy internal link to clipboard", - "Internal link" : "پیوند داخلی", + "Delete application" : "حذف برنامه", + "Do you really want to delete the table \"{table}\"?" : "آیا واقعاً می‌خواهید جدول \"{table}\" را حذف کنید؟", + "Export" : "خروجی", + "Add to favorites" : "افزودن به موارد دلخواه", + "Remove from favorites" : "حذف از موارد دلخواه", + "Archive table" : "بایگانی جدول", + "Unarchive table" : "خارج کردن جدول از بایگانی", + "Delete table" : "حذف جدول", + "Copy" : "کپی", + "Could not configure new view" : "امکان پیکربندی نمای جدید وجود ندارد", + "Duplicate view" : "تکراری‌سازی نما", + "Filter items" : "فیلتر کردن آیتم‌ها", + "Favorites" : "موارد دلخواه", + "Archived tables" : "جداول بایگانی‌شده", + "Applications" : "برنامه‌ها", + "Your results are filtered." : "نتایج شما فیلتر شده است.", + "Clear filter" : "پاک کردن فیلتر", + "Share with accounts, groups or teams" : "اشتراک‌گذاری با حساب‌ها، گروه‌ها یا تیم‌ها", + "Share with accounts or groups" : "اشتراک‌گذاری با حساب‌ها یا گروه‌ها", + "User, group or team …" : "کاربر، گروه یا تیم …", + "User or group …" : "کاربر یا گروه …", + "Failed to fetch share recommendations" : "دریافت پیشنهادهای اشتراک‌گذاری ناموفق بود", + "No recommendations. Start typing." : "هیچ پیشنهادی وجود ندارد. شروع به تایپ کنید.", + "Receiver type" : "نوع دریافت‌کننده", + "Create time" : "زمان ایجاد", + "Share ID" : "شناسه اشتراک‌گذاری", + "Copy internal link to clipboard" : "کپی لینک داخلی در کلیپ‌بورد", + "Only works for users with access to this view" : "فقط برای کاربرانی که به این نما دسترسی دارند کار می‌کند", + "Only works for users with access to this table" : "فقط برای کاربرانی که به این جدول دسترسی دارند کار می‌کند", + "Internal link" : "لینک داخلی", + "Any application created by a demoted share recipients using a shared table will continue to consume its data." : "هر برنامه‌ای که توسط دریافت‌کنندگان اشتراک تنزل‌یافته با استفاده از یک جدول اشتراکی ایجاد شود، به مصرف داده‌های آن ادامه خواهد داد.", "group" : "گروه", - "Table manager" : "Table manager", + "team" : "تیم", + "Table manager" : "مدیر جدول", "Permissions" : "مجوزها", - "Read data" : "Read data", - "Create data" : "Create data", - "Update data" : "Update data", - "Delete data" : "Delete data", - "Promote to table manager" : "Promote to table manager", - "Demote to normal share" : "Demote to normal share", - "Open main table to adjust table management permissions" : "Open main table to adjust table management permissions", - "No shares" : "اشتراک گذاری وجود ندارد", - "View only" : "تنها مشاهده", - "Can edit" : "توانایی ویرایش", - "Custom permissions" : "Custom permissions", + "Read data" : "خواندن داده", + "Create data" : "ایجاد داده", + "Update data" : "به‌روزرسانی داده", + "Delete data" : "حذف داده", + "Promote to table manager" : "ارتقا به مدیر جدول", + "Demote to normal share" : "تنزل به اشتراک عادی", + "Open main table to adjust table management permissions" : "جدول اصلی را باز کنید تا مجوزهای مدیریت جدول را تنظیم کنید", + "No shares" : "بدون اشتراک", + "After the promotion of the share recipient to table manager, any applications created by share recipients that utilise this table will continue to access its data, even if you later demote them." : "پس از ارتقای دریافت‌کننده اشتراک به مدیر جدول، هر برنامه‌ای که توسط دریافت‌کنندگان اشتراک ایجاد شده و از این جدول استفاده می‌کند، حتی اگر بعداً آن‌ها را تنزل دهید، به داده‌های آن دسترسی خواهد داشت.", + "Confirm table manager promotion" : "تأیید ارتقا به مدیر جدول", + "View only" : "فقط مشاهده", + "Can edit" : "قابل ویرایش", + "Custom permissions" : "مجوزهای سفارشی", + "Quick share options, current: {option}" : "گزینه‌های اشتراک‌گذاری سریع، فعلی: {option}", "Read" : "خواندن", - "Update" : "به‌روز رسانی", - "Link copied to clipboard" : "پیوند در حافظه موقت کپی شده", + "Update" : "به‌روزرسانی", + "Error creating link share" : "خطا در ایجاد اشتراک لینک", + "Error deleting link share" : "خطا در حذف اشتراک لینک", + "Link copied to clipboard" : "لینک در کلیپ‌بورد کپی شد", + "Error copying link" : "خطا در کپی لینک", + "Password copied" : "رمز عبور کپی شد", + "Error copying password" : "خطا در کپی کردن رمز عبور", "Create public link" : "ایجاد لینک عمومی", - "Create a new share link" : "پیوند اشتراک گذاری جدیدی ایجاد کنید", - "Set password" : "تنظیم گذرواژه", - "Password" : "گذرواژه", - "Share link" : "اشتراک‌گذاری لینک", - "Delete link" : "حذف پیوند", - "Public links" : "Public links", - "No view in context" : "No view in context", - "From {ownerName}" : "From {ownerName}", + "Create a new share link" : "ایجاد لینک اشتراک‌گذاری جدید", + "Set password" : "تنظیم رمز عبور", + "Password" : "رمز عبور", + "Share link" : "لینک اشتراک‌گذاری", + "Copy public share link" : "کپی لینک اشتراک‌گذاری عمومی", + "Delete link" : "حذف لینک", + "Public links" : "لینک‌های عمومی", + "No view in context" : "عدم نمایش در بافت", + "From {ownerName}" : "از {ownerName}", "Created at" : "ایجاد شده در", - "Ownership" : "Ownership", - "View ID" : "View ID", - "Sharing" : "هم‌رسانی", + "Ownership" : "مالکیت", + "View ID" : "شناسه نمایش", + "Sharing" : "اشتراک‌گذاری", "API" : "API", - "This is your API endpoint for this view" : "This is your API endpoint for this view", - "Copy to clipboard" : "رونوشت به تخته‌گیره", - "Your permissions" : "Your permissions", - "Create new table" : "Create new table", + "This is your API endpoint for this view" : "این نقطه پایانی API برای این نمایش است", + "Copy to clipboard" : "کپی در کلیپ‌بورد", + "Your permissions" : "مجوزهای شما", + "This application could not be found" : "این برنامه پیدا نشد", + "Some resources in this application could not be loaded" : "برخی منابع در این برنامه بارگذاری نشدند", + "Create new table" : "ایجاد جدول جدید", "Searching …" : "جستجوکردن …", - "No elements found." : "عنصری یافت نشد", - "Share with accounts" : "هم‌رسانی با حساب‌ها", + "No elements found." : "هیچ عنصری یافت نشد.", + "Select a table or view" : "یک جدول یا نمایش انتخاب کنید", + "No selected resources" : "هیچ منبعی انتخاب نشده است", + "Shared resources permissions" : "مجوزهای منابع اشتراک‌گذاری شده", + "Read resource" : "خواندن منبع", + "Create resource" : "ایجاد منبع", + "Update resource" : "به‌روزرسانی منبع", + "Delete resource" : "حذف منبع", + "No shared resources" : "هیچ منبع اشتراک‌گذاری شده‌ای وجود ندارد", + "Share with accounts" : "اشتراک‌گذاری با حساب‌ها", "Error" : "خطا", - "Could not load editor, text not available." : "Could not load editor, text not available.", - "Download" : "بارگیری", - "Create rows" : "Create rows", - "You are not allowed to read this table, but you can still create rows." : "You are not allowed to read this table, but you can still create rows.", - "No permissions" : "No permissions", - "You have no permissions for this table." : "You have no permissions for this table.", + "Could not load editor, text not available." : "ویرایشگر بارگذاری نشد، متن در دسترس نیست.", + "Icon {iconName} loading" : "بارگذاری آیکون {iconName}", + "Download" : "دانلود", + "This is a public form." : "این یک فرم عمومی است.", + "Create rows" : "ایجاد ردیف‌ها", + "You can add one or more replies." : "می‌توانید یک یا چند پاسخ اضافه کنید.", + "You are not allowed to read this table, but you can still create rows." : "شما مجاز به خواندن این جدول نیستید، اما همچنان می‌توانید ردیف ایجاد کنید.", + "No permissions" : "بدون مجوز", + "You have no permissions for this table." : "شما هیچ مجوزی برای این جدول ندارید.", "Search" : "جستجو", - "URL" : "آدرس", - "Could not load link provider results." : "Could not load link provider results.", - "Url" : "آدرس", - "This option is outdated." : "This option is outdated.", + "Clear value" : "پاک کردن مقدار", + "URL" : "URL", + "Could not load link provider results." : "نتایج ارائه‌دهنده لینک بارگذاری نشد.", + "Url" : "Url", + "Invalid protocol. Allowed: {allowed}" : "پروتکل نامعتبر. مجاز: {allowed}", + "Link providers" : "ارائه‌دهندگان لینک", + "This option is outdated." : "این گزینه قدیمی است", "Options" : "گزینه‌ها", - "Back" : "Back", - "Select operator" : "Select operator", - "Search for value" : "Search for value", - "Select options" : "Select options", - "Keyword and submit" : "Keyword and submit", - "Or use magic values" : "Or use magic values", - "Sorting" : "مرتب سازی", - "Sort asc" : "Sort asc", - "Sort desc" : "Sort desc", - "Filtering" : "Filtering", - "Select Operator" : "Select Operator", - "Select value" : "Select value", - "Manage column" : "Manage column", - "Column manage actions" : "Column manage actions", - "Hide column" : "Hide column", - "Undo" : "برگرداندن", - "Redo" : "Redo", - "Bold" : "درشت", - "Italic" : "Italic", - "Bullet list" : "Bullet list", - "Ordered list" : "Ordered list", - "Strike" : "Strike", - "Heading 1" : "Heading 1", - "Heading 2" : "Heading 2", - "Heading 3" : "Heading 3", + "This relation does not exist anymore." : "این رابطه دیگر وجود ندارد.", + "Select relation value" : "انتخاب ارزش رابطه", + "Set {star} stars" : "تنظیم {star} ستاره", + "Cell input" : "ورودی سلول", + "Back" : "بازگشت", + "Select operator" : "انتخاب اپراتور", + "Search for value" : "جستجوی مقدار", + "Select options" : "انتخاب گزینه‌ها", + "Keyword and submit" : "کلمه کلیدی و ارسال", + "Or use magic values" : "یا از مقادیر جادویی استفاده کنید", + "Unpin column" : "جدا کردن ستون", + "Pin column" : "سنجاق کردن ستون", + "Sorting" : "مرتب‌سازی", + "Sort asc" : "مرتب‌سازی صعودی", + "Sort desc" : "مرتب‌سازی نزولی", + "Filtering" : "فیلتر کردن", + "Select Operator" : "انتخاب اپراتور", + "Select value" : "انتخاب مقدار", + "Manage column" : "مدیریت ستون", + "Column manage actions" : "اقدامات مدیریت ستون", + "Hide column" : "مخفی کردن ستون", + "Copy row" : "کپی ردیف", + "Undo" : "بازگردانی", + "Redo" : "انجام دوباره", + "Bold" : "پررنگ", + "Italic" : "کج", + "Bullet list" : "لیست گلوله‌ای", + "Ordered list" : "لیست شماره‌دار", + "Strike" : "خط خورده", + "Heading 1" : "عنوان ۱", + "Heading 2" : "عنوان ۲", + "Heading 3" : "عنوان ۳", "Code" : "کد", - "Task list" : "Task list", - "Set today as default" : "Set today as default", - "Set now as default" : "Set now as default", - "Enter a column title" : "Enter a column title", - "Add column to other views" : "Add column to other views", - "Default value" : "Default value", - "Decimals" : "Decimals", - "Minimum" : "Minimum", - "Maximum" : "Maximum", + "Task list" : "لیست وظایف", + "Set today as default" : "تنظیم امروز به عنوان پیش‌فرض", + "Set now as default" : "تنظیم اکنون به عنوان پیش‌فرض", + "Enter a column title" : "عنوان ستون را وارد کنید", + "Column width" : "عرض ستون", + "Enter a column width between {min} and {max}" : "عرض ستون را بین {min} و {max} وارد کنید", + "Add column to other views" : "افزودن ستون به سایر نماها", + "The default value is lower than the minimum allowed value." : "مقدار پیش‌فرض کمتر از حداقل مجاز است", + "The default value is greater than the maximum allowed value." : "مقدار پیش‌فرض بیشتر از حداکثر مجاز است", + "Default value" : "مقدار پیش‌فرض", + "Decimals" : "اعشار", + "Minimum" : "حداقل", + "Maximum" : "حداکثر", "Prefix" : "پیشوند", "Suffix" : "پسوند", "Default" : "پیش‌فرض", - "Reduce stars" : "Reduce stars", - "Increase stars" : "Increase stars", - "First option" : "First option", - "Second option" : "Second option", + "Reduce stars" : "کاهش ستاره‌ها", + "Increase stars" : "افزایش ستاره‌ها", + "Relation type" : "نوع رابطه", + "Select relation type" : "انتخاب نوع رابطه", + "Select target" : "انتخاب هدف", + "Label for relation selection" : "برچسب برای انتخاب رابطه", + "Select label for relation selection" : "انتخاب برچسب برای انتخاب رابطه", + "Only text and number columns can be used as label" : "فقط ستون‌های متنی و عددی می‌توانند به عنوان برچسب استفاده شوند", + "First option" : "گزینه اول", + "Second option" : "گزینه دوم", "Delete option" : "گزینه حذف", - "Add option" : "Add option", - "You can set a default value by clicking on one of the radio buttons next to the label fields." : "You can set a default value by clicking on one of the radio buttons next to the label fields.", - "Click here to unset default selection." : "Click here to unset default selection.", - "You can set default values by marking the checkboxes next to the label fields." : "You can set default values by marking the checkboxes next to the label fields.", - "Allowed pattern (regex)" : "Allowed pattern (regex)", - "Maximum text length" : "Maximum text length", - "Could not load link providers." : "Could not load link providers.", - "Allowed types" : "Allowed types", - "The provided types depends on your system setup. You can use the same providers like the fulltext-search." : "The provided types depends on your system setup. You can use the same providers like the fulltext-search.", - "This field is mandatory" : "This field is mandatory", - "Copy link" : "کپی کردن لینک", - "Open link" : "لینک را باز کنید", - "Show fullscreen" : "Show fullscreen", - "Close editor" : "Close editor", - "Create Row" : "Create Row", - "Export CSV" : "Export CSV", - "Uncheck all" : "Uncheck all", + "Add option" : "گزینه افزودن", + "You can set a default value by clicking on one of the radio buttons next to the label fields." : "با کلیک روی یکی از دکمه‌های رادیویی کنار فیلدهای برچسب می‌توانید یک مقدار پیش‌فرض تنظیم کنید.", + "Click here to unset default selection." : "برای لغو انتخاب پیش‌فرض اینجا کلیک کنید.", + "You can set default values by marking the checkboxes next to the label fields." : "با علامت‌زدن چک‌باکس‌های کنار فیلدهای برچسب می‌توانید مقادیر پیش‌فرض را تنظیم کنید.", + "Allowed pattern (regex)" : "الگوی مجاز (regex)", + "Maximum text length" : "حداکثر طول متن", + "Unique value" : "مقدار یکتا", + "Could not load link providers." : "امکان بارگذاری ارائه‌دهندگان پیوند وجود ندارد.", + "Allowed types" : "انواع مجاز", + "Please select at least one provider." : "لطفاً حداقل یک ارائه‌دهنده را انتخاب کنید.", + "The provided types depends on your system setup. You can use the same providers like the fulltext-search." : "انواع ارائه‌شده به تنظیمات سیستم شما بستگی دارد. می‌توانید از همان ارائه‌دهندگان جستجوی تمام‌متن استفاده کنید.", + "Select multiple items" : "انتخاب چند آیتم", + "Show user status" : "نمایش وضعیت کاربر", + "Please select a new time" : "لطفاً یک زمان جدید انتخاب کنید", + "This field is mandatory" : "این فیلد اجباری است", + "You can not insert any links in this field. Please configure at least one link provider in the column configuration." : "نمی‌توانید هیچ پیوندی در این فیلد وارد کنید. لطفاً حداقل یک ارائه‌دهنده پیوند در تنظیمات ستون پیکربندی کنید.", + "Copy link" : "کپی پیوند", + "Open link" : "باز کردن پیوند", + "Show fullscreen" : "نمایش تمام‌صفحه", + "Close editor" : "بستن ویرایشگر", + "Create Row" : "ایجاد ردیف", + "Export selected rows" : "خروجی گرفتن از ردیف‌های انتخاب‌شده", + "Uncheck all" : "لغو انتخاب همه", "_%n selected row_::_%n selected rows_" : ["%n selected row","%n selected rows"], - "Confirmation" : "Confirmation", - "Confirm" : "تائید", + "Go to first page" : "رفتن به صفحه اول", + "Go to previous page" : "رفتن به صفحه قبل", + "Page" : "صفحه", + "Page number" : "شماره صفحه", + "Per page" : "در هر صفحه", + "Go to next page" : "رفتن به صفحه بعد", + "Go to last page" : "رفتن به صفحه آخر", + "Confirmation" : "تأیید", + "Confirm" : "تأیید", "_{nb} row_::_{nb} rows_" : ["{nb} row","{nb} rows"], - "Could not fetch columns for content preview." : "Could not fetch columns for content preview.", - "Could not fetch rows for content preview." : "Could not fetch rows for content preview.", - "Render mode" : "Render mode", - "Content" : "Content", - "Select" : "گزینش
", - "Insert" : "Insert", - "Could not load search results." : "Could not load search results.", - "Could not create share." : "Could not create share.", - "Could not remove share." : "Could not remove share.", - "Could not update share." : "Could not update share.", - "Filter operator" : "Filter operator", - "Contains" : "Contains", - "Begins with" : "Begins with", - "Ends with" : "Ends with", - "Is equal" : "Is equal", - "Is greater than" : "Is greater than", - "Is greater than or equal" : "Is greater than or equal", - "Is lower than" : "Is lower than", - "Is lower than or equal" : "Is lower than or equal", - "Is empty" : "Is empty", - "Magic field" : "Magic field", - "Me (user ID)" : "Me (user ID)", - "Me (name)" : "Me (name)", - "Checked" : "Checked", - "Unchecked" : "بازرسی نشده", - "This year" : "امسال.", + "Could not fetch columns for content preview." : "امکان دریافت ستون‌ها برای پیش‌نمایش محتوا وجود ندارد.", + "Could not fetch rows for content preview." : "امکان دریافت ردیف‌ها برای پیش‌نمایش محتوا وجود ندارد.", + "Render mode" : "حالت رندر", + "Content" : "محتوا", + "Select" : "انتخاب", + "Insert" : "درج", + "Could not load search results." : "امکان بارگذاری نتایج جستجو وجود ندارد.", + "Search for tables and views..." : "جستجوی جداول و نماها...", + "Import into Tables" : "وارد کردن به جداول", + "Could not create share." : "امکان ایجاد اشتراک‌گذاری وجود ندارد.", + "Could not create public link." : "امکان ایجاد پیوند عمومی وجود ندارد.", + "Could not remove share." : "امکان حذف اشتراک‌گذاری وجود ندارد.", + "Could not update share." : "به‌روزرسانی اشتراک امکان‌پذیر نیست", + "Could not update cell" : "به‌روزرسانی سلول امکان‌پذیر نیست", + "Filter operator" : "عملگر فیلتر", + "Contains items" : "شامل موارد", + "Contains" : "شامل می‌شود", + "Does not contain" : "شامل نمی‌شود", + "Begins with" : "شروع می‌شود با", + "Ends with" : "پایان می‌یابد با", + "Is equal" : "برابر است با", + "Is not equal" : "برابر نیست با", + "Is greater than" : "بزرگ‌تر از", + "Is greater than or equal" : "بزرگ‌تر یا مساوی", + "Is lower than" : "کوچک‌تر از", + "Is lower than or equal" : "کوچک‌تر یا مساوی", + "Is empty" : "خالی است", + "Magic field" : "فیلد جادویی", + "Me (user ID)" : "من (شناسه کاربر)", + "Me (name)" : "من (نام)", + "Checked" : "علامت‌خورده", + "Unchecked" : "علامت‌نخورده", + "This year" : "امسال", "This month" : "این ماه", "This week" : "این هفته", - "Now" : "Now", - "Select a date" : "تاریخ را انتخاب کنید", + "Now" : "اکنون", + "Exact date" : "تاریخ دقیق", + "Select a date" : "یک تاریخ انتخاب کنید", + "Number of days ahead" : "تعداد روزهای آینده", + "Enter number of days" : "تعداد روزها را وارد کنید", + "Number of days ago" : "تعداد روزهای قبل", "ID" : "شناسه", - "Creator" : "Creator", - "Last editor" : "Last editor", - "Last edited at" : "Last edited at", - "Clipboard is not available" : "تخته گیره موحود نیست", - "seconds ago" : "یک ثانیه پیش", - "Unknown error." : "Unknown error.", - "Request is not authorized. Are you logged in?" : "Request is not authorized. Are you logged in?", - "Request not allowed." : "Request not allowed.", - "Resource not found." : "Resource not found.", - "Could not load columns." : "Could not load columns.", - "Could not insert column." : "Could not insert column.", - "Could not update column." : "Could not update column.", - "Could not remove column." : "Could not remove column.", - "Could not load rows." : "Could not load rows.", - "Outdated data. View is reloaded" : "Outdated data. View is reloaded", - "Could not insert row." : "Could not insert row.", - "Could not remove row." : "Could not remove row.", - "Could not insert table." : "Could not insert table.", - "Could not load tables." : "Could not load tables.", - "Could not fetch tables" : "Could not fetch tables", - "Could not load shared views." : "Could not load shared views.", - "Could not load shared views" : "Could not load shared views", - "Could not insert view." : "Could not insert view.", - "Could not update view." : "Could not update view.", - "Could not remove view." : "Could not remove view.", - "Could not reload view." : "Could not reload view.", - "Could not update table." : "Could not update table.", - "Could not remove table." : "Could not remove table.", - "Share not found" : "اشتراک گذاری یافت نشد", - "This share does not exist or is no longer available" : "این سهم وجود ندارد یا دیگر در دسترس نیست", + "Creator" : "ایجادکننده", + "Last editor" : "آخرین ویرایشگر", + "Last edited at" : "آخرین ویرایش در", + "Copied to clipboard." : "در کلیپ‌بورد کپی شد.", + "Clipboard is not available" : "کلیپ‌بورد در دسترس نیست", + "seconds ago" : "ثانیه پیش", + "{shareTypeString}..." : "{shareTypeString}...", + "Unsupported source: {source}" : "منبع پشتیبانی‌نشده: {source}", + "Failed to fetch {shareTypeString}" : "دریافت {shareTypeString} ناموفق بود", + "This {type} could not be found" : "این {type} یافت نشد", + "An error occurred while loading the {type}" : "هنگام بارگذاری {type} خطایی رخ داد", + "Unknown error." : "خطای ناشناخته.", + "Request is not authorized. Are you logged in?" : "درخواست مجاز نیست. آیا وارد شده‌اید؟", + "Request not allowed." : "درخواست مجاز نیست.", + "Resource not found." : "منبع یافت نشد.", + "Could not load columns." : "بارگذاری ستون‌ها امکان‌پذیر نیست.", + "Could not insert column." : "درج ستون امکان‌پذیر نیست.", + "Could not update column." : "به‌روزرسانی ستون امکان‌پذیر نیست.", + "Could not remove column." : "حذف ستون امکان‌پذیر نیست.", + "Could not load relation data." : "داده‌های رابطه را بارگیری نشد.", + "Could not load rows." : "بارگذاری ردیف‌ها امکان‌پذیر نیست.", + "Outdated data. View is reloaded" : "داده‌های قدیمی. نمایش دوباره بارگذاری شد", + "Could not insert row." : "امکان درج سطر وجود نداشت", + "Could not remove row." : "امکان حذف سطر وجود نداشت", + "Could not verify row. View is reloaded" : "امکان تأیید سطر وجود نداشت. نمایش دوباره بارگذاری شد", + "Could not insert table." : "امکان درج جدول وجود نداشت", + "Could not load tables." : "امکان بارگذاری جداول وجود نداشت", + "Could not fetch tables" : "امکان واکشی جداول وجود نداشت", + "Could not load shared views." : "امکان بارگذاری نماهای اشتراکی وجود نداشت", + "Could not load shared views" : "امکان بارگذاری نماهای اشتراکی وجود نداشت", + "Could not fetch templates" : "امکان واکشی قالب‌ها وجود نداشت", + "Could not insert view." : "امکان درج نما وجود نداشت", + "Could not update view." : "امکان به‌روزرسانی نما وجود نداشت", + "Could not remove view." : "امکان حذف نما وجود نداشت", + "Could not reload view." : "امکان بارگذاری مجدد نما وجود نداشت", + "Could not update table." : "امکان به‌روزرسانی جدول وجود نداشت", + "Could not mark view as favorite" : "امکان علامت‌گذاری نما به عنوان موردعلاقه وجود نداشت", + "Could not remove view from favorites" : "امکان حذف نما از موارد علاقه‌مندی وجود نداشت", + "Could not mark table as favorite" : "امکان علامت‌گذاری جدول به عنوان موردعلاقه وجود نداشت", + "Could not remove table from favorites" : "امکان حذف جدول از موارد علاقه‌مندی وجود نداشت", + "Could not add application share." : "امکان افزودن اشتراک برنامه وجود نداشت", + "Could not remove application share." : "امکان حذف اشتراک برنامه وجود نداشت", + "Could not update display mode." : "امکان به‌روزرسانی حالت نمایش وجود نداشت", + "Could not insert application." : "امکان درج برنامه وجود نداشت", + "Could not update application." : "امکان به‌روزرسانی برنامه وجود نداشت", + "Could not transfer table." : "امکان انتقال جدول وجود نداشت", + "Could not load applications." : "امکان بارگذاری برنامه‌ها وجود نداشت", + "Could not fetch applications" : "امکان واکشی برنامه‌ها وجود نداشت", + "Could not load application." : "امکان بارگذاری برنامه وجود نداشت", + "Could not fetch application" : "امکان واکشی برنامه وجود نداشت", + "Could not load table." : "امکان بارگذاری جدول وجود نداشت", + "Could not fetch table" : "امکان واکشی جدول وجود نداشت", + "Could not load view" : "امکان بارگذاری نما وجود نداشت", + "Could not fetch view" : "امکان واکشی نما وجود نداشت", + "Could not verify export permissions." : "امکان تأیید مجوزهای خروجی وجود نداشت", + "Could not transfer application." : "امکان انتقال برنامه وجود نداشت", + "Could not remove application." : "امکان حذف برنامه وجود نداشت", + "Could not remove table." : "امکان حذف جدول وجود نداشت", + "Share not found" : "اشتراک یافت نشد", + "This share does not exist or is no longer available" : "این اشتراک وجود ندارد یا دیگر در دسترس نیست", "Back to %s" : "بازگشت به %s" },"pluralForm" :"nplurals=2; plural=(n > 1);" } \ No newline at end of file diff --git a/l10n/fi.js b/l10n/fi.js index 86fe154b8a..99bd7426ff 100644 --- a/l10n/fi.js +++ b/l10n/fi.js @@ -19,6 +19,7 @@ OC.L10N.register( "Timestamp of data load" : "Tietojen lataamisen aikaleima", "No" : "Ei", "Yes" : "Kyllä", + "Count" : "Määrä", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Tapahtui odottamaton virhe. Lisätietoja on lokitiedostoissa. Ota yhteyttä pääkäyttäjään.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Tapahtui käyttöoikeusvirhe. Lisätietoja on lokitiedostoissa. Ota yhteyttä pääkäyttäjään.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Tapahtui 'ei löytynyt' - virhe, jota ei löydy. Lisätietoja on lokitiedostoissa. Ota yhteyttä pääkäyttäjään.", @@ -194,7 +195,6 @@ OC.L10N.register( "Edit table" : "Muokkaa taulukkoa", "Create column" : "Luo sarake", "Import" : "Tuo", - "Export as CSV" : "Vie CSV:nä", "Filtered view" : "Suodatettu näkymä", "Reset local adjustments" : "Nollaa paikallisten säädöt", "No columns" : "Ei sarakkeita", @@ -485,7 +485,6 @@ OC.L10N.register( "Show fullscreen" : "Näytä koko näyttö", "Close editor" : "Sulje muokkain", "Create Row" : "Luo rivi", - "Export CSV" : "Vie CSV", "Uncheck all" : "Poista kaikki valinnat", "_%n selected row_::_%n selected rows_" : ["%n valittu rivi","%n valittua riviä"], "Go to first page" : "Siirry ensimmäiselle sivulle", diff --git a/l10n/fi.json b/l10n/fi.json index ca87c0b9e0..35ddf705e3 100644 --- a/l10n/fi.json +++ b/l10n/fi.json @@ -17,6 +17,7 @@ "Timestamp of data load" : "Tietojen lataamisen aikaleima", "No" : "Ei", "Yes" : "Kyllä", + "Count" : "Määrä", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Tapahtui odottamaton virhe. Lisätietoja on lokitiedostoissa. Ota yhteyttä pääkäyttäjään.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Tapahtui käyttöoikeusvirhe. Lisätietoja on lokitiedostoissa. Ota yhteyttä pääkäyttäjään.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Tapahtui 'ei löytynyt' - virhe, jota ei löydy. Lisätietoja on lokitiedostoissa. Ota yhteyttä pääkäyttäjään.", @@ -192,7 +193,6 @@ "Edit table" : "Muokkaa taulukkoa", "Create column" : "Luo sarake", "Import" : "Tuo", - "Export as CSV" : "Vie CSV:nä", "Filtered view" : "Suodatettu näkymä", "Reset local adjustments" : "Nollaa paikallisten säädöt", "No columns" : "Ei sarakkeita", @@ -483,7 +483,6 @@ "Show fullscreen" : "Näytä koko näyttö", "Close editor" : "Sulje muokkain", "Create Row" : "Luo rivi", - "Export CSV" : "Vie CSV", "Uncheck all" : "Poista kaikki valinnat", "_%n selected row_::_%n selected rows_" : ["%n valittu rivi","%n valittua riviä"], "Go to first page" : "Siirry ensimmäiselle sivulle", diff --git a/l10n/fr.js b/l10n/fr.js index 43fe51c146..44276f98dd 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -24,6 +24,7 @@ OC.L10N.register( "Timestamp of data load" : "Horodatage du chargement de données", "No" : "Non", "Yes" : "Oui", + "Count" : "Nombre", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Une erreur inattendue est survenue. Davantage de détails peuvent être trouvés dans les logs. Veuillez contacter votre administrateur. ", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Une erreur de permissions est survenue. Davantage de détails peuvent être trouvés dans les logs. Veuillez contacter votre administrateur.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Une erreur \"Non trouvé\" est survenue. Davantage de détails peuvent être trouvés dans les logs. Veuillez contacter votre administrateur.", @@ -215,7 +216,6 @@ OC.L10N.register( "Edit table" : "Modifier le tableau", "Create column" : "Créer une colonne", "Import" : "Importer", - "Export as CSV" : "Exporter en CSV", "Filtered view" : "Vue filtrée", "Reset local adjustments" : "Réinitialiser les ajustements locaux", "No columns" : "Aucune colonne", @@ -388,7 +388,7 @@ OC.L10N.register( "Archive table" : "Archiver le tableau", "Unarchive table" : "Désarchiver le tableau", "Delete table" : "Supprimer le tableau", - "Copy" : "Copier", + "Copy" : "Copie", "Could not configure new view" : "Impossible de configurer la nouvelle vue", "Duplicate view" : "Dupliquer la vue", "Filter items" : "Filtrer les éléments", @@ -413,13 +413,13 @@ OC.L10N.register( "Any application created by a demoted share recipients using a shared table will continue to consume its data." : "Toute application créée par un destinataire du partage déchu de ses droits à l'aide d'un tableau partagé continuera à utiliser ses données.", "group" : "groupe", "team" : "équipe", - "Table manager" : "Gestionaire de tableau", + "Table manager" : "Gestionnaire de tableau", "Permissions" : "Permissions", "Read data" : "Lire les données", "Create data" : "Créer des données", "Update data" : "Mettre à jour les données", "Delete data" : "Supprimer des données", - "Promote to table manager" : "Promouvoir gestionaire de tableau", + "Promote to table manager" : "Promouvoir gestionnaire de tableau", "Demote to normal share" : "Rétrograder au partage normal", "Open main table to adjust table management permissions" : "Ouvrir le tableau principal pour ajuster les autorisations de permissions du tableau", "No shares" : "Aucun partage", @@ -557,7 +557,6 @@ OC.L10N.register( "Show fullscreen" : "Afficher en plein écran", "Close editor" : "Fermer l'éditeur", "Create Row" : "Créer une ligne", - "Export CSV" : "Exporter en CSV", "Uncheck all" : "Tout décocher", "_%n selected row_::_%n selected rows_" : ["%n ligne sélectionnée","%n lignes sélectionnées","%n lignes sélectionnées"], "Go to first page" : "Aller à la première page", diff --git a/l10n/fr.json b/l10n/fr.json index 469165a96f..35f9fa7f8b 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -22,6 +22,7 @@ "Timestamp of data load" : "Horodatage du chargement de données", "No" : "Non", "Yes" : "Oui", + "Count" : "Nombre", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Une erreur inattendue est survenue. Davantage de détails peuvent être trouvés dans les logs. Veuillez contacter votre administrateur. ", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Une erreur de permissions est survenue. Davantage de détails peuvent être trouvés dans les logs. Veuillez contacter votre administrateur.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Une erreur \"Non trouvé\" est survenue. Davantage de détails peuvent être trouvés dans les logs. Veuillez contacter votre administrateur.", @@ -213,7 +214,6 @@ "Edit table" : "Modifier le tableau", "Create column" : "Créer une colonne", "Import" : "Importer", - "Export as CSV" : "Exporter en CSV", "Filtered view" : "Vue filtrée", "Reset local adjustments" : "Réinitialiser les ajustements locaux", "No columns" : "Aucune colonne", @@ -386,7 +386,7 @@ "Archive table" : "Archiver le tableau", "Unarchive table" : "Désarchiver le tableau", "Delete table" : "Supprimer le tableau", - "Copy" : "Copier", + "Copy" : "Copie", "Could not configure new view" : "Impossible de configurer la nouvelle vue", "Duplicate view" : "Dupliquer la vue", "Filter items" : "Filtrer les éléments", @@ -411,13 +411,13 @@ "Any application created by a demoted share recipients using a shared table will continue to consume its data." : "Toute application créée par un destinataire du partage déchu de ses droits à l'aide d'un tableau partagé continuera à utiliser ses données.", "group" : "groupe", "team" : "équipe", - "Table manager" : "Gestionaire de tableau", + "Table manager" : "Gestionnaire de tableau", "Permissions" : "Permissions", "Read data" : "Lire les données", "Create data" : "Créer des données", "Update data" : "Mettre à jour les données", "Delete data" : "Supprimer des données", - "Promote to table manager" : "Promouvoir gestionaire de tableau", + "Promote to table manager" : "Promouvoir gestionnaire de tableau", "Demote to normal share" : "Rétrograder au partage normal", "Open main table to adjust table management permissions" : "Ouvrir le tableau principal pour ajuster les autorisations de permissions du tableau", "No shares" : "Aucun partage", @@ -555,7 +555,6 @@ "Show fullscreen" : "Afficher en plein écran", "Close editor" : "Fermer l'éditeur", "Create Row" : "Créer une ligne", - "Export CSV" : "Exporter en CSV", "Uncheck all" : "Tout décocher", "_%n selected row_::_%n selected rows_" : ["%n ligne sélectionnée","%n lignes sélectionnées","%n lignes sélectionnées"], "Go to first page" : "Aller à la première page", diff --git a/l10n/ga.js b/l10n/ga.js index 9372502e46..9f2496352b 100644 --- a/l10n/ga.js +++ b/l10n/ga.js @@ -33,6 +33,7 @@ OC.L10N.register( "Timestamp of data load" : "Stampa ama an ualaigh sonraí", "No" : "Níl", "Yes" : "Tá", + "Count" : "Áireamh", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Tharla earráid gan choinne. Is féidir tuilleadh sonraí a fháil sna logs. Déan teagmháil le do riarachán le do thoil.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Tharla earráid cheada. Is féidir tuilleadh sonraí a fháil sna logs. Déan teagmháil le do riarachán le do thoil.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Tharla earráid gan aimsiú. Is féidir tuilleadh sonraí a fháil sna logs. Déan teagmháil le do riarachán le do thoil.", @@ -178,6 +179,7 @@ OC.L10N.register( "Selection" : "Roghnú", "Date and time" : "Dáta agus am", "Users and groups" : "Úsáideoirí agus grúpaí", + "Relation" : "Gaol", "Column type" : "Cineál colún", "Move" : "Bog", "Metadata" : "Meiteashonraí", @@ -225,7 +227,8 @@ OC.L10N.register( "Edit table" : "Cuir tábla in eagar", "Create column" : "Cruthaigh colún", "Import" : "Iompórtáil", - "Export as CSV" : "Easpórtáil mar CSV", + "Export all rows" : "Easpórtáil na sraitheanna go léir", + "Export filtered rows" : "Easpórtáil sraitheanna scagtha", "Filtered view" : "Amharc scagtha", "Reset local adjustments" : "Athshocraigh coigeartuithe áitiúla", "No columns" : "Uimh colúin", @@ -237,6 +240,9 @@ OC.L10N.register( "Please insert a title for the new column." : "Cuir isteach teideal don cholún nua le do thoil.", "Cannot save column. Column width must be between {min} and {max}." : "Ní féidir an colún a shábháil. Ní mór leithead an cholúin a bheith idir {min} agus {max}.", "You need to select a type for the new column." : "Ní mór duit cineál a roghnú don cholún nua.", + "Please select a relation type." : "Roghnaigh cineál caidrimh le do thoil.", + "Please select a target." : "Roghnaigh sprioc le do thoil.", + "Please select a label for relation selection." : "Roghnaigh lipéad le do thoil le haghaidh roghnú caidrimh.", "The column \"{column}\" was created." : "Cruthaíodh an colún \"{column}\".", "Sorry, something went wrong." : "Tá brón orm, chuaigh rud éigin mícheart.", "Could not create new column." : "Níorbh fhéidir colún nua a chruthú.", @@ -502,6 +508,8 @@ OC.L10N.register( "Link providers" : "Soláthraithe naisc", "This option is outdated." : "Tá an rogha seo as dáta.", "Options" : "Roghanna", + "This relation does not exist anymore." : "Níl an gaol seo ann a thuilleadh.", + "Select relation value" : "Roghnaigh luach caidrimh", "Set {star} stars" : "Socraigh {star} réaltaí", "Cell input" : "Ionchur cille", "Back" : "Ar ais", @@ -521,6 +529,7 @@ OC.L10N.register( "Manage column" : "Bainistigh colún", "Column manage actions" : "Colún gníomhartha a bhainistiú", "Hide column" : "Folaigh colún", + "Copy row" : "Cóipeáil an tsraith", "Undo" : "Cealaigh", "Redo" : "Athdhéan", "Bold" : "Trom", @@ -550,6 +559,12 @@ OC.L10N.register( "Default" : "Réamhshocrú", "Reduce stars" : "Laghdaigh na réaltaí", "Increase stars" : "Méadú ar na réaltaí", + "Relation type" : "Cineál caidrimh", + "Select relation type" : "Roghnaigh cineál caidrimh", + "Select target" : "Roghnaigh sprioc", + "Label for relation selection" : "Lipéad le haghaidh roghnú caidrimh", + "Select label for relation selection" : "Roghnaigh lipéad le haghaidh roghnú caidrimh", + "Only text and number columns can be used as label" : "Ní féidir ach colúin téacs agus uimhreacha a úsáid mar lipéad", "First option" : "An chéad rogha", "Second option" : "An dara rogha", "Delete option" : "Scrios rogha", @@ -574,7 +589,7 @@ OC.L10N.register( "Show fullscreen" : "Taispeáin lánscáileán", "Close editor" : "Dún eagarthóir", "Create Row" : "Cruthaigh Rae", - "Export CSV" : "Easpórtáil CSV", + "Export selected rows" : "Easpórtáil na sraitheanna roghnaithe", "Uncheck all" : "Díthiceáil go léir", "_%n selected row_::_%n selected rows_" : ["%n ró roghnaithe","%n ró roghnaithe","%n ró roghnaithe","%n ró roghnaithe","%n ró roghnaithe"], "Go to first page" : "Téigh chuig an gcéad leathanach", @@ -648,6 +663,7 @@ OC.L10N.register( "Could not insert column." : "Níorbh fhéidir an colún a chur isteach.", "Could not update column." : "Níorbh fhéidir an colún a nuashonrú.", "Could not remove column." : "Níorbh fhéidir an colún a bhaint.", + "Could not load relation data." : "Níorbh fhéidir sonraí caidrimh a luchtú.", "Could not load rows." : "Níorbh fhéidir sraitheanna a lódáil.", "Outdated data. View is reloaded" : "Sonraí atá as dáta. Athlódáiltear an radharc", "Could not insert row." : "Níorbh fhéidir ró a chur isteach.", diff --git a/l10n/ga.json b/l10n/ga.json index 4a7e6fb604..7a801c7f55 100644 --- a/l10n/ga.json +++ b/l10n/ga.json @@ -31,6 +31,7 @@ "Timestamp of data load" : "Stampa ama an ualaigh sonraí", "No" : "Níl", "Yes" : "Tá", + "Count" : "Áireamh", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Tharla earráid gan choinne. Is féidir tuilleadh sonraí a fháil sna logs. Déan teagmháil le do riarachán le do thoil.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Tharla earráid cheada. Is féidir tuilleadh sonraí a fháil sna logs. Déan teagmháil le do riarachán le do thoil.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Tharla earráid gan aimsiú. Is féidir tuilleadh sonraí a fháil sna logs. Déan teagmháil le do riarachán le do thoil.", @@ -176,6 +177,7 @@ "Selection" : "Roghnú", "Date and time" : "Dáta agus am", "Users and groups" : "Úsáideoirí agus grúpaí", + "Relation" : "Gaol", "Column type" : "Cineál colún", "Move" : "Bog", "Metadata" : "Meiteashonraí", @@ -223,7 +225,8 @@ "Edit table" : "Cuir tábla in eagar", "Create column" : "Cruthaigh colún", "Import" : "Iompórtáil", - "Export as CSV" : "Easpórtáil mar CSV", + "Export all rows" : "Easpórtáil na sraitheanna go léir", + "Export filtered rows" : "Easpórtáil sraitheanna scagtha", "Filtered view" : "Amharc scagtha", "Reset local adjustments" : "Athshocraigh coigeartuithe áitiúla", "No columns" : "Uimh colúin", @@ -235,6 +238,9 @@ "Please insert a title for the new column." : "Cuir isteach teideal don cholún nua le do thoil.", "Cannot save column. Column width must be between {min} and {max}." : "Ní féidir an colún a shábháil. Ní mór leithead an cholúin a bheith idir {min} agus {max}.", "You need to select a type for the new column." : "Ní mór duit cineál a roghnú don cholún nua.", + "Please select a relation type." : "Roghnaigh cineál caidrimh le do thoil.", + "Please select a target." : "Roghnaigh sprioc le do thoil.", + "Please select a label for relation selection." : "Roghnaigh lipéad le do thoil le haghaidh roghnú caidrimh.", "The column \"{column}\" was created." : "Cruthaíodh an colún \"{column}\".", "Sorry, something went wrong." : "Tá brón orm, chuaigh rud éigin mícheart.", "Could not create new column." : "Níorbh fhéidir colún nua a chruthú.", @@ -500,6 +506,8 @@ "Link providers" : "Soláthraithe naisc", "This option is outdated." : "Tá an rogha seo as dáta.", "Options" : "Roghanna", + "This relation does not exist anymore." : "Níl an gaol seo ann a thuilleadh.", + "Select relation value" : "Roghnaigh luach caidrimh", "Set {star} stars" : "Socraigh {star} réaltaí", "Cell input" : "Ionchur cille", "Back" : "Ar ais", @@ -519,6 +527,7 @@ "Manage column" : "Bainistigh colún", "Column manage actions" : "Colún gníomhartha a bhainistiú", "Hide column" : "Folaigh colún", + "Copy row" : "Cóipeáil an tsraith", "Undo" : "Cealaigh", "Redo" : "Athdhéan", "Bold" : "Trom", @@ -548,6 +557,12 @@ "Default" : "Réamhshocrú", "Reduce stars" : "Laghdaigh na réaltaí", "Increase stars" : "Méadú ar na réaltaí", + "Relation type" : "Cineál caidrimh", + "Select relation type" : "Roghnaigh cineál caidrimh", + "Select target" : "Roghnaigh sprioc", + "Label for relation selection" : "Lipéad le haghaidh roghnú caidrimh", + "Select label for relation selection" : "Roghnaigh lipéad le haghaidh roghnú caidrimh", + "Only text and number columns can be used as label" : "Ní féidir ach colúin téacs agus uimhreacha a úsáid mar lipéad", "First option" : "An chéad rogha", "Second option" : "An dara rogha", "Delete option" : "Scrios rogha", @@ -572,7 +587,7 @@ "Show fullscreen" : "Taispeáin lánscáileán", "Close editor" : "Dún eagarthóir", "Create Row" : "Cruthaigh Rae", - "Export CSV" : "Easpórtáil CSV", + "Export selected rows" : "Easpórtáil na sraitheanna roghnaithe", "Uncheck all" : "Díthiceáil go léir", "_%n selected row_::_%n selected rows_" : ["%n ró roghnaithe","%n ró roghnaithe","%n ró roghnaithe","%n ró roghnaithe","%n ró roghnaithe"], "Go to first page" : "Téigh chuig an gcéad leathanach", @@ -646,6 +661,7 @@ "Could not insert column." : "Níorbh fhéidir an colún a chur isteach.", "Could not update column." : "Níorbh fhéidir an colún a nuashonrú.", "Could not remove column." : "Níorbh fhéidir an colún a bhaint.", + "Could not load relation data." : "Níorbh fhéidir sonraí caidrimh a luchtú.", "Could not load rows." : "Níorbh fhéidir sraitheanna a lódáil.", "Outdated data. View is reloaded" : "Sonraí atá as dáta. Athlódáiltear an radharc", "Could not insert row." : "Níorbh fhéidir ró a chur isteach.", diff --git a/l10n/gl.js b/l10n/gl.js index c8f092a45a..4fcf9f9231 100644 --- a/l10n/gl.js +++ b/l10n/gl.js @@ -24,6 +24,7 @@ OC.L10N.register( "Timestamp of data load" : "Marca de tempo da carga de datos", "No" : "Non", "Yes" : "Si", + "Count" : "Conta", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Produciuse un erro non agardado. Pódense atopar máis detalles nos rexistros. Póñase en contacto coa administración da instancia.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Produciuse un erro de permisos. Pódense atopar máis detalles nos rexistros. Póñase en contacto coa administración da instancia.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Produciuse un erro non atopado. Pódense atopar máis detalles nos rexistros. Póñase en contacto coa administración da instancia.", @@ -213,7 +214,6 @@ OC.L10N.register( "Edit table" : "Editar a táboa", "Create column" : "Crear columna", "Import" : "Importar", - "Export as CSV" : "Exportar como CSV", "Filtered view" : "Vista filtrada", "Reset local adjustments" : "Restabelecer os axustes locais", "No columns" : "Non hai columnas", @@ -550,7 +550,6 @@ OC.L10N.register( "Show fullscreen" : "Amosar a pantalla completa", "Close editor" : "Pechar o editor", "Create Row" : "Crear unha fila", - "Export CSV" : "Exportar a CSV", "Uncheck all" : "Desmarcar todo", "_%n selected row_::_%n selected rows_" : ["%n fila seleccionada","%n filas seleccionadas"], "Go to first page" : "Ir á primeira páxina", diff --git a/l10n/gl.json b/l10n/gl.json index ca2e88f5bf..07ac7aeafe 100644 --- a/l10n/gl.json +++ b/l10n/gl.json @@ -22,6 +22,7 @@ "Timestamp of data load" : "Marca de tempo da carga de datos", "No" : "Non", "Yes" : "Si", + "Count" : "Conta", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Produciuse un erro non agardado. Pódense atopar máis detalles nos rexistros. Póñase en contacto coa administración da instancia.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Produciuse un erro de permisos. Pódense atopar máis detalles nos rexistros. Póñase en contacto coa administración da instancia.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Produciuse un erro non atopado. Pódense atopar máis detalles nos rexistros. Póñase en contacto coa administración da instancia.", @@ -211,7 +212,6 @@ "Edit table" : "Editar a táboa", "Create column" : "Crear columna", "Import" : "Importar", - "Export as CSV" : "Exportar como CSV", "Filtered view" : "Vista filtrada", "Reset local adjustments" : "Restabelecer os axustes locais", "No columns" : "Non hai columnas", @@ -548,7 +548,6 @@ "Show fullscreen" : "Amosar a pantalla completa", "Close editor" : "Pechar o editor", "Create Row" : "Crear unha fila", - "Export CSV" : "Exportar a CSV", "Uncheck all" : "Desmarcar todo", "_%n selected row_::_%n selected rows_" : ["%n fila seleccionada","%n filas seleccionadas"], "Go to first page" : "Ir á primeira páxina", diff --git a/l10n/hr.js b/l10n/hr.js index a2ef78b8d1..ef768366e4 100644 --- a/l10n/hr.js +++ b/l10n/hr.js @@ -5,6 +5,7 @@ OC.L10N.register( "Timestamp of data load" : "Vremenska oznaka učitavanja podataka", "No" : "Ne", "Yes" : "Da", + "Count" : "Broj", "The file was uploaded" : "Datoteka je otpremljena", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Otpremljena datoteka premašuje postavku upload_max_filesize u datoteci php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Otpremljena datoteka premašuje postavku MAX_FILE_SIZE koja je navedena u obrascu HTML-a", @@ -62,7 +63,6 @@ OC.L10N.register( "Total" : "Ukupno", "Data" : "Podaci", "Import" : "Uvezi", - "Export as CSV" : "Izvezi kao CSV", "Type" : "Vrsta", "Simple text" : "Jednostavan tekst", "Rich text" : "Bogat tekst", diff --git a/l10n/hr.json b/l10n/hr.json index 4f2a183a84..4048d5cfe4 100644 --- a/l10n/hr.json +++ b/l10n/hr.json @@ -3,6 +3,7 @@ "Timestamp of data load" : "Vremenska oznaka učitavanja podataka", "No" : "Ne", "Yes" : "Da", + "Count" : "Broj", "The file was uploaded" : "Datoteka je otpremljena", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Otpremljena datoteka premašuje postavku upload_max_filesize u datoteci php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Otpremljena datoteka premašuje postavku MAX_FILE_SIZE koja je navedena u obrascu HTML-a", @@ -60,7 +61,6 @@ "Total" : "Ukupno", "Data" : "Podaci", "Import" : "Uvezi", - "Export as CSV" : "Izvezi kao CSV", "Type" : "Vrsta", "Simple text" : "Jednostavan tekst", "Rich text" : "Bogat tekst", diff --git a/l10n/hu.js b/l10n/hu.js index 25f7a9bc11..bdc130222d 100644 --- a/l10n/hu.js +++ b/l10n/hu.js @@ -9,6 +9,7 @@ OC.L10N.register( "Timestamp of data load" : "Az adatbetöltés időbélyege", "No" : "Nem", "Yes" : "Igen", + "Count" : "Darabszám", "Could not create row." : "Nem sikerült létrehozni a sort.", "Could not update row." : "Nem sikerült a sor frissítése.", "The file was uploaded" : "A fájl feltöltve", @@ -176,7 +177,6 @@ OC.L10N.register( "Edit table" : "Táblázat szerkesztése", "Create column" : "Oszlop létrehozása", "Import" : "Importálás", - "Export as CSV" : "Exportálás CSV-ként", "Filtered view" : "Szűrt nézet", "Reset local adjustments" : "Helyi beállítások alaphelyzetbe állítása", "No columns" : "Nincsenek oszlopok", @@ -407,7 +407,6 @@ OC.L10N.register( "Show fullscreen" : "Teljesképernyős nézet", "Close editor" : "Szerkesztő bezárása", "Create Row" : "Sor létrehozása", - "Export CSV" : "CSV exportálása", "Uncheck all" : "Összes bejelölésének megszüntetése", "_%n selected row_::_%n selected rows_" : ["%n kiválasztott sor","%n kiválasztott sor"], "Go to first page" : "Ugrás az első oldalra", diff --git a/l10n/hu.json b/l10n/hu.json index 36f1be2e91..22f1787b09 100644 --- a/l10n/hu.json +++ b/l10n/hu.json @@ -7,6 +7,7 @@ "Timestamp of data load" : "Az adatbetöltés időbélyege", "No" : "Nem", "Yes" : "Igen", + "Count" : "Darabszám", "Could not create row." : "Nem sikerült létrehozni a sort.", "Could not update row." : "Nem sikerült a sor frissítése.", "The file was uploaded" : "A fájl feltöltve", @@ -174,7 +175,6 @@ "Edit table" : "Táblázat szerkesztése", "Create column" : "Oszlop létrehozása", "Import" : "Importálás", - "Export as CSV" : "Exportálás CSV-ként", "Filtered view" : "Szűrt nézet", "Reset local adjustments" : "Helyi beállítások alaphelyzetbe állítása", "No columns" : "Nincsenek oszlopok", @@ -405,7 +405,6 @@ "Show fullscreen" : "Teljesképernyős nézet", "Close editor" : "Szerkesztő bezárása", "Create Row" : "Sor létrehozása", - "Export CSV" : "CSV exportálása", "Uncheck all" : "Összes bejelölésének megszüntetése", "_%n selected row_::_%n selected rows_" : ["%n kiválasztott sor","%n kiválasztott sor"], "Go to first page" : "Ugrás az első oldalra", diff --git a/l10n/id.js b/l10n/id.js index ca27c23cbd..fd37ade281 100644 --- a/l10n/id.js +++ b/l10n/id.js @@ -56,7 +56,6 @@ OC.L10N.register( "Total" : "Total", "Data" : "Data", "Import" : "Impor", - "Export as CSV" : "Ekspor sebagai CSV", "Type" : "tipe", "Simple text" : "Teks sederhana", "Rich text" : "Teks kaya", diff --git a/l10n/id.json b/l10n/id.json index a6cf697911..df76aa45f9 100644 --- a/l10n/id.json +++ b/l10n/id.json @@ -54,7 +54,6 @@ "Total" : "Total", "Data" : "Data", "Import" : "Impor", - "Export as CSV" : "Ekspor sebagai CSV", "Type" : "tipe", "Simple text" : "Teks sederhana", "Rich text" : "Teks kaya", diff --git a/l10n/it.js b/l10n/it.js index fee9497b77..2ddf0e9f6e 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -12,6 +12,7 @@ OC.L10N.register( "Timestamp of data load" : "Marca temporale del caricamento dati", "No" : "No", "Yes" : "Sì", + "Count" : "Conto", "The file was uploaded" : "Il file è stato caricato", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Il file caricato supera la direttiva upload_max_filesize in php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Il file caricato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML", @@ -123,7 +124,6 @@ OC.L10N.register( "Edit table" : "Modifica tabella", "Create column" : "Crea colonna", "Import" : "Importa", - "Export as CSV" : "Esporta come CSV", "No columns" : "Nessuna colonna", "We need at least one column, please be so kind and create one." : "Abbiamo bisogno di almeno una colonna, per favore siate così gentili da crearne una.", "No columns selected" : "Nessuna colonna selezionata", diff --git a/l10n/it.json b/l10n/it.json index 2f44f0d796..bc5bb2c6ef 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -10,6 +10,7 @@ "Timestamp of data load" : "Marca temporale del caricamento dati", "No" : "No", "Yes" : "Sì", + "Count" : "Conto", "The file was uploaded" : "Il file è stato caricato", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Il file caricato supera la direttiva upload_max_filesize in php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Il file caricato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML", @@ -121,7 +122,6 @@ "Edit table" : "Modifica tabella", "Create column" : "Crea colonna", "Import" : "Importa", - "Export as CSV" : "Esporta come CSV", "No columns" : "Nessuna colonna", "We need at least one column, please be so kind and create one." : "Abbiamo bisogno di almeno una colonna, per favore siate così gentili da crearne una.", "No columns selected" : "Nessuna colonna selezionata", diff --git a/l10n/ja.js b/l10n/ja.js index f4452e24fb..115a1cd09a 100644 --- a/l10n/ja.js +++ b/l10n/ja.js @@ -181,7 +181,6 @@ OC.L10N.register( "Edit table" : "表を編集", "Create column" : "列の作成", "Import" : "インポート", - "Export as CSV" : "CSV にエクスポート", "Filtered view" : "絞り込まれたビュー", "No columns" : "列がありません", "We need at least one column, please be so kind and create one." : "少なくとも1つ以上の列が必要です。", @@ -408,7 +407,6 @@ OC.L10N.register( "Copy link" : "リンクをコピー", "Open link" : "リンクを開く", "Close editor" : "エディタを閉じる", - "Export CSV" : "CSVエクスポート", "Uncheck all" : "すべてチェックを外す", "Go to first page" : "最初のページへ", "Go to previous page" : "前のページへ", diff --git a/l10n/ja.json b/l10n/ja.json index 2587ca7f9c..dcb26c3495 100644 --- a/l10n/ja.json +++ b/l10n/ja.json @@ -179,7 +179,6 @@ "Edit table" : "表を編集", "Create column" : "列の作成", "Import" : "インポート", - "Export as CSV" : "CSV にエクスポート", "Filtered view" : "絞り込まれたビュー", "No columns" : "列がありません", "We need at least one column, please be so kind and create one." : "少なくとも1つ以上の列が必要です。", @@ -406,7 +405,6 @@ "Copy link" : "リンクをコピー", "Open link" : "リンクを開く", "Close editor" : "エディタを閉じる", - "Export CSV" : "CSVエクスポート", "Uncheck all" : "すべてチェックを外す", "Go to first page" : "最初のページへ", "Go to previous page" : "前のページへ", diff --git a/l10n/kab.js b/l10n/kab.js index 488bea8a36..754b80a893 100644 --- a/l10n/kab.js +++ b/l10n/kab.js @@ -1,71 +1,169 @@ OC.L10N.register( "tables", { + "Tables" : "Tifelwa", "No" : "Uhu", "Yes" : "Ih", + "Count" : "Amḍan amatu", "The file was uploaded" : "Ulac afaylu yettwaznen", "The file was only partially uploaded" : "Afaylu, cwiṭ kan i yettwaznen segs", "No file was uploaded" : "Ulac afaylu i d-yettwasulin", "Missing a temporary folder" : "Ixuṣ ukaram akudan", + "table" : "tafelwit", + "Members" : "Imedrawen", + "Customers" : "Imsaɣen", "Date" : "Azemz", + "Weight" : "Taẓeyt", "Comments" : "Commentaires", "Name" : "Nom", "Description" : "Aglam", + "Contact information" : "Tilɣa n unermis", "Comment" : "Commentaire", + "Dog" : "Aqjun", + "Cat" : "Amcic", + "Horse" : "Aεuwdiw", + "Special" : "Uzzig", + "from" : "sɣur", + "to" : "ɣer", + "Approved" : "Yettwaqbel", + "Position" : "Adig", + "Skills" : "Tiwezza", + "Birthday" : "Azemz n tlalit", + "Task" : "Tawuri", + "Target" : "Asaḍas", "Progress" : "Asfari", + "What" : "Acu", "Done" : "Immed", "Table" : "Tafelwit", + "View" : "Askan", "Today" : "Ass-a", "Create" : "Snulfu-d", "Text" : "Aḍris", "Link" : "Aseɣwen", + "Number" : "Uṭṭun", + "Selection" : "Tafrant", + "Date and time" : "Azemz aked usrag", "Move" : "Senkez", + "Metadata" : "Adferisefka", + "Move up" : "Ali", + "Move down" : "Ader", + "Read only" : "Taɣuri kan", + "Column" : "Tagejdit", + "Operator" : "Amahal", + "OR" : "OR", + "Ascending" : "S walluy", + "Descending" : "S usider", + "Views" : "Timezriyin", + "Rows" : "Aduren", + "Columns" : "Ijga", "Actions" : "Tigawin", "Share" : "Bḍu", + "Total" : "Aɣrud", + "Data" : "Isefka", + "Edit table" : "Ẓreg tafelwit", + "Import" : "Kter", "Type" : "Anaw", "Yes/No" : "Ih/Uhu", + "Time" : "Akud", + "Add more" : "Rnu ugar", "Save" : "Sekles", "Title" : "Azwel", + "Resources" : "Tiɣbula", + "Submit" : "Azen", + "Create table" : "Snulfu-d tadabut", + "Delete column" : "Kkes tigejdit", "Cancel" : "Sefsex", "Delete" : "Kkes", "Edit" : "Ẓreg", "Activity" : "Armud", + "Manage" : "Sefrek", "Owner" : "Bab", + "Import successful" : "Taktert tella-d akken ilaq", "Close" : "Mdel", "Please select a file." : "Ttxil fren afaylu.", + "Preview" : "Pre-timeẓriwt", + "Failed" : "Ur yeddi ara", + "Result" : "Aḍris wiki id yefka sakin aderrec", "Transfer" : "Seḍfeṛ", "Filter" : "Sizdeg", "Sort" : "Smizzwer", + "Delete application" : "Kkes asnas", "Export" : "Sifeḍ", "Add to favorites" : "Rnu ismal", "Remove from favorites" : "Kkes-it seg ismal", + "Delete table" : "Kkes tafelwit", "Copy" : "Nɣel", "Favorites" : "Imenyafen", + "Applications" : "Isnasen", + "group" : "agraw", + "Permissions" : "Tasirag", + "Read data" : "Ɣer isefka", + "Delete data" : "Kkes isefka", + "View only" : "Askan kan", "Read" : "Taɣuri", + "Update" : "Leqqem", "Set password" : "Sbadu awal uffir", "Password" : "Awal n uɛeddi", "Share link" : "Bḍu aseɣwen", + "Created at" : "Yettwarna di", "Sharing" : "Beṭṭu", + "API" : "API", "Copy to clipboard" : "Nɣel-it ar tecfawit", "Searching …" : "Anadi …", "Error" : "Erreur", "Download" : "Sider", + "No permissions" : "Ulac tisirag", "Search" : "Nadi", + "Clear value" : "Sfeḍ azal", "URL" : "URL", "Options" : "Iɣewwaṛen", "Back" : "Retour", + "Select options" : "Fren iɣewwaṛen", + "Sorting" : "Asmizzwer", + "Undo" : "Sefsex", + "Redo" : "Ales", + "Bold" : "Azuran", + "Italic" : "Uknan", + "Bullet list" : "Tabdart s tneqqidin", + "Ordered list" : "Tabdart n usmizzwer", + "Heading 1" : "Azwel 1", + "Heading 2" : "Azwel 2", + "Heading 3" : "Azwel 3", + "Code" : "Angal", + "Default value" : "Azal n lexṣas", + "Decimals" : "imrawanen", + "Minimum" : "Minimum", + "Maximum" : "Afellay", + "Prefix" : "Azwir", + "Suffix" : "Adfir", "Default" : "Prédéfini(e)", "Add option" : "Rnu aɣewwaṛ", "Copy link" : "Nɣel aseɣwen", "Open link" : "Nɣel aseɣwen", "Close editor" : "Mdel amaẓrag", + "Go to first page" : "Ddu ɣer usebter amezwaru", + "Go to previous page" : "Ddu ɣer usebter yezrin", + "Page" : "Asebter", + "Page number" : "Uḍḍun n usebtar", + "Per page" : "I wsebtar", + "Go to next page" : "Ddu ɣer usebter i d-iteddun", + "Go to last page" : "Ddu ɣer usebter aneggaru", + "Confirmation" : "Asentem", "Confirm" : "Serggeg", "Content" : "Agbur", "Select" : "Fren", + "Insert" : "Ger", + "Contains" : "Igber", + "Is empty" : "D ilem", "This year" : "Aseggas-a", + "This month" : "Aggur-a", "This week" : "Dduṛt-a", "Now" : "Tura", + "Select a date" : "Fren Azemz", + "ID" : "Asulay", + "Creator" : "Amernay", "seconds ago" : "Tasinin aya", + "Unknown error." : "Anezri ur nettwassen ara.", "Back to %s" : "Uɣal ar %s" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/kab.json b/l10n/kab.json index acce08156e..26afda4caa 100644 --- a/l10n/kab.json +++ b/l10n/kab.json @@ -1,69 +1,167 @@ { "translations": { + "Tables" : "Tifelwa", "No" : "Uhu", "Yes" : "Ih", + "Count" : "Amḍan amatu", "The file was uploaded" : "Ulac afaylu yettwaznen", "The file was only partially uploaded" : "Afaylu, cwiṭ kan i yettwaznen segs", "No file was uploaded" : "Ulac afaylu i d-yettwasulin", "Missing a temporary folder" : "Ixuṣ ukaram akudan", + "table" : "tafelwit", + "Members" : "Imedrawen", + "Customers" : "Imsaɣen", "Date" : "Azemz", + "Weight" : "Taẓeyt", "Comments" : "Commentaires", "Name" : "Nom", "Description" : "Aglam", + "Contact information" : "Tilɣa n unermis", "Comment" : "Commentaire", + "Dog" : "Aqjun", + "Cat" : "Amcic", + "Horse" : "Aεuwdiw", + "Special" : "Uzzig", + "from" : "sɣur", + "to" : "ɣer", + "Approved" : "Yettwaqbel", + "Position" : "Adig", + "Skills" : "Tiwezza", + "Birthday" : "Azemz n tlalit", + "Task" : "Tawuri", + "Target" : "Asaḍas", "Progress" : "Asfari", + "What" : "Acu", "Done" : "Immed", "Table" : "Tafelwit", + "View" : "Askan", "Today" : "Ass-a", "Create" : "Snulfu-d", "Text" : "Aḍris", "Link" : "Aseɣwen", + "Number" : "Uṭṭun", + "Selection" : "Tafrant", + "Date and time" : "Azemz aked usrag", "Move" : "Senkez", + "Metadata" : "Adferisefka", + "Move up" : "Ali", + "Move down" : "Ader", + "Read only" : "Taɣuri kan", + "Column" : "Tagejdit", + "Operator" : "Amahal", + "OR" : "OR", + "Ascending" : "S walluy", + "Descending" : "S usider", + "Views" : "Timezriyin", + "Rows" : "Aduren", + "Columns" : "Ijga", "Actions" : "Tigawin", "Share" : "Bḍu", + "Total" : "Aɣrud", + "Data" : "Isefka", + "Edit table" : "Ẓreg tafelwit", + "Import" : "Kter", "Type" : "Anaw", "Yes/No" : "Ih/Uhu", + "Time" : "Akud", + "Add more" : "Rnu ugar", "Save" : "Sekles", "Title" : "Azwel", + "Resources" : "Tiɣbula", + "Submit" : "Azen", + "Create table" : "Snulfu-d tadabut", + "Delete column" : "Kkes tigejdit", "Cancel" : "Sefsex", "Delete" : "Kkes", "Edit" : "Ẓreg", "Activity" : "Armud", + "Manage" : "Sefrek", "Owner" : "Bab", + "Import successful" : "Taktert tella-d akken ilaq", "Close" : "Mdel", "Please select a file." : "Ttxil fren afaylu.", + "Preview" : "Pre-timeẓriwt", + "Failed" : "Ur yeddi ara", + "Result" : "Aḍris wiki id yefka sakin aderrec", "Transfer" : "Seḍfeṛ", "Filter" : "Sizdeg", "Sort" : "Smizzwer", + "Delete application" : "Kkes asnas", "Export" : "Sifeḍ", "Add to favorites" : "Rnu ismal", "Remove from favorites" : "Kkes-it seg ismal", + "Delete table" : "Kkes tafelwit", "Copy" : "Nɣel", "Favorites" : "Imenyafen", + "Applications" : "Isnasen", + "group" : "agraw", + "Permissions" : "Tasirag", + "Read data" : "Ɣer isefka", + "Delete data" : "Kkes isefka", + "View only" : "Askan kan", "Read" : "Taɣuri", + "Update" : "Leqqem", "Set password" : "Sbadu awal uffir", "Password" : "Awal n uɛeddi", "Share link" : "Bḍu aseɣwen", + "Created at" : "Yettwarna di", "Sharing" : "Beṭṭu", + "API" : "API", "Copy to clipboard" : "Nɣel-it ar tecfawit", "Searching …" : "Anadi …", "Error" : "Erreur", "Download" : "Sider", + "No permissions" : "Ulac tisirag", "Search" : "Nadi", + "Clear value" : "Sfeḍ azal", "URL" : "URL", "Options" : "Iɣewwaṛen", "Back" : "Retour", + "Select options" : "Fren iɣewwaṛen", + "Sorting" : "Asmizzwer", + "Undo" : "Sefsex", + "Redo" : "Ales", + "Bold" : "Azuran", + "Italic" : "Uknan", + "Bullet list" : "Tabdart s tneqqidin", + "Ordered list" : "Tabdart n usmizzwer", + "Heading 1" : "Azwel 1", + "Heading 2" : "Azwel 2", + "Heading 3" : "Azwel 3", + "Code" : "Angal", + "Default value" : "Azal n lexṣas", + "Decimals" : "imrawanen", + "Minimum" : "Minimum", + "Maximum" : "Afellay", + "Prefix" : "Azwir", + "Suffix" : "Adfir", "Default" : "Prédéfini(e)", "Add option" : "Rnu aɣewwaṛ", "Copy link" : "Nɣel aseɣwen", "Open link" : "Nɣel aseɣwen", "Close editor" : "Mdel amaẓrag", + "Go to first page" : "Ddu ɣer usebter amezwaru", + "Go to previous page" : "Ddu ɣer usebter yezrin", + "Page" : "Asebter", + "Page number" : "Uḍḍun n usebtar", + "Per page" : "I wsebtar", + "Go to next page" : "Ddu ɣer usebter i d-iteddun", + "Go to last page" : "Ddu ɣer usebter aneggaru", + "Confirmation" : "Asentem", "Confirm" : "Serggeg", "Content" : "Agbur", "Select" : "Fren", + "Insert" : "Ger", + "Contains" : "Igber", + "Is empty" : "D ilem", "This year" : "Aseggas-a", + "This month" : "Aggur-a", "This week" : "Dduṛt-a", "Now" : "Tura", + "Select a date" : "Fren Azemz", + "ID" : "Asulay", + "Creator" : "Amernay", "seconds ago" : "Tasinin aya", + "Unknown error." : "Anezri ur nettwassen ara.", "Back to %s" : "Uɣal ar %s" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/ko.js b/l10n/ko.js index 8bcb5d51d7..42d98f2795 100644 --- a/l10n/ko.js +++ b/l10n/ko.js @@ -9,6 +9,7 @@ OC.L10N.register( "Timestamp of data load" : "데이터 로드 시 타임스탬프", "No" : "아니오", "Yes" : "예", + "Count" : "총수", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "알 수 없는 오류가 발생했습니다. 더 자세한 정보는 로그를 참조하세요. 관리자에게 문의하십시오.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "권한 오류가 발생했습니다. 더 자세한 정보는 로그를 참조하세요. 관리자에게 문의하십시오.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "'찾을 수 없음' 오류가 발생했습니다. 더 자세한 정보는 로그를 참조하세요. 관리자에게 문의하십시오.", @@ -170,7 +171,6 @@ OC.L10N.register( "Edit table" : "표 편집", "Create column" : "행 만들기", "Import" : "가져오기", - "Export as CSV" : "CSV로 내보내기", "Filtered view" : "필더링된 보기", "No columns" : "행 없음", "We need at least one column, please be so kind and create one." : "최소 하나의 행이 필요합니다. 생성하십시오.", @@ -390,7 +390,6 @@ OC.L10N.register( "Show fullscreen" : "최대화면으로 보기", "Close editor" : "편집기 닫기", "Create Row" : "행 만들기", - "Export CSV" : "CSV로 내보내기", "Uncheck all" : "모두 선택 해제", "_%n selected row_::_%n selected rows_" : ["%n개의 행 선택됨"], "Go to previous page" : "이전 페이지로 이동", diff --git a/l10n/ko.json b/l10n/ko.json index e2cfb50bc2..3e4305597a 100644 --- a/l10n/ko.json +++ b/l10n/ko.json @@ -7,6 +7,7 @@ "Timestamp of data load" : "데이터 로드 시 타임스탬프", "No" : "아니오", "Yes" : "예", + "Count" : "총수", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "알 수 없는 오류가 발생했습니다. 더 자세한 정보는 로그를 참조하세요. 관리자에게 문의하십시오.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "권한 오류가 발생했습니다. 더 자세한 정보는 로그를 참조하세요. 관리자에게 문의하십시오.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "'찾을 수 없음' 오류가 발생했습니다. 더 자세한 정보는 로그를 참조하세요. 관리자에게 문의하십시오.", @@ -168,7 +169,6 @@ "Edit table" : "표 편집", "Create column" : "행 만들기", "Import" : "가져오기", - "Export as CSV" : "CSV로 내보내기", "Filtered view" : "필더링된 보기", "No columns" : "행 없음", "We need at least one column, please be so kind and create one." : "최소 하나의 행이 필요합니다. 생성하십시오.", @@ -388,7 +388,6 @@ "Show fullscreen" : "최대화면으로 보기", "Close editor" : "편집기 닫기", "Create Row" : "행 만들기", - "Export CSV" : "CSV로 내보내기", "Uncheck all" : "모두 선택 해제", "_%n selected row_::_%n selected rows_" : ["%n개의 행 선택됨"], "Go to previous page" : "이전 페이지로 이동", diff --git a/l10n/lo.js b/l10n/lo.js index 34bd09021a..1d53c0a467 100644 --- a/l10n/lo.js +++ b/l10n/lo.js @@ -24,6 +24,7 @@ OC.L10N.register( "Timestamp of data load" : "ເວລາທີ່ຂໍ້ມູນຖືກໂຫຼດ", "No" : "ບໍ່", "Yes" : "ແມ່ນ", + "Count" : "ຈຳນວນ", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "ເກີດຂໍ້ຜິດພາດທີ່ບໍ່ຄາດຄິດ. ສາມາດເບິ່ງລາຍລະອຽດເພີ່ມເຕີມໄດ້ໃນບັນທຶກ. ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "ເກີດຂໍ້ຜິດພາດດ້ານການອະນຸຍາດ. ສາມາດເບິ່ງລາຍລະອຽດເພີ່ມເຕີມໄດ້ໃນບັນທຶກ. ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "ເກີດຂໍ້ຜິດພາດຊອກບໍ່ພົບ. ສາມາດເບິ່ງລາຍລະອຽດເພີ່ມເຕີມໄດ້ໃນບັນທຶກ. ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ.", @@ -211,7 +212,6 @@ OC.L10N.register( "Edit table" : "ແກ້ໄຂຕາຕະລາງ", "Create column" : "ສ້າງຖັນ", "Import" : "ນຳເຂົ້າ", - "Export as CSV" : "ສົ່ງອອກເປັນ CSV", "Filtered view" : "ມຸມມອງທີ່ຖືກກັ່ນຕອງ", "Reset local adjustments" : "ຣີເຊັດການປັບປ່ຽນໃນເຄື່ອງ", "No columns" : "ບໍ່ມີຖັນ", @@ -541,7 +541,6 @@ OC.L10N.register( "Show fullscreen" : "ສະແດງເຕັມຈໍ", "Close editor" : "ປິດຕົວແກ້ໄຂ", "Create Row" : "ສ້າງແຖວ", - "Export CSV" : "ສົ່ງອອກ CSV", "Uncheck all" : "ຍົກເລີກການເລືອກທັງໝົດ", "_%n selected row_::_%n selected rows_" : ["ເລືອກ %n ແຖວ"], "Go to first page" : "ໄປໜ້າທຳອິດ", diff --git a/l10n/lo.json b/l10n/lo.json index 203893b6ea..2eb07ed0cb 100644 --- a/l10n/lo.json +++ b/l10n/lo.json @@ -22,6 +22,7 @@ "Timestamp of data load" : "ເວລາທີ່ຂໍ້ມູນຖືກໂຫຼດ", "No" : "ບໍ່", "Yes" : "ແມ່ນ", + "Count" : "ຈຳນວນ", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "ເກີດຂໍ້ຜິດພາດທີ່ບໍ່ຄາດຄິດ. ສາມາດເບິ່ງລາຍລະອຽດເພີ່ມເຕີມໄດ້ໃນບັນທຶກ. ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "ເກີດຂໍ້ຜິດພາດດ້ານການອະນຸຍາດ. ສາມາດເບິ່ງລາຍລະອຽດເພີ່ມເຕີມໄດ້ໃນບັນທຶກ. ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "ເກີດຂໍ້ຜິດພາດຊອກບໍ່ພົບ. ສາມາດເບິ່ງລາຍລະອຽດເພີ່ມເຕີມໄດ້ໃນບັນທຶກ. ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ.", @@ -209,7 +210,6 @@ "Edit table" : "ແກ້ໄຂຕາຕະລາງ", "Create column" : "ສ້າງຖັນ", "Import" : "ນຳເຂົ້າ", - "Export as CSV" : "ສົ່ງອອກເປັນ CSV", "Filtered view" : "ມຸມມອງທີ່ຖືກກັ່ນຕອງ", "Reset local adjustments" : "ຣີເຊັດການປັບປ່ຽນໃນເຄື່ອງ", "No columns" : "ບໍ່ມີຖັນ", @@ -539,7 +539,6 @@ "Show fullscreen" : "ສະແດງເຕັມຈໍ", "Close editor" : "ປິດຕົວແກ້ໄຂ", "Create Row" : "ສ້າງແຖວ", - "Export CSV" : "ສົ່ງອອກ CSV", "Uncheck all" : "ຍົກເລີກການເລືອກທັງໝົດ", "_%n selected row_::_%n selected rows_" : ["ເລືອກ %n ແຖວ"], "Go to first page" : "ໄປໜ້າທຳອິດ", diff --git a/l10n/lt_LT.js b/l10n/lt_LT.js index ff449f85c5..b888f0fd31 100644 --- a/l10n/lt_LT.js +++ b/l10n/lt_LT.js @@ -33,6 +33,7 @@ OC.L10N.register( "Timestamp of data load" : "Duomenų įkėlimo laiko žyma", "No" : "Ne", "Yes" : "Taip", + "Count" : "Suskaičiuoti", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Įvyko netikėta klaida. Daugiau informacijos rasite žurnaluose. Susisiekite su savo administracija.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Įvyko leidimo klaida. Daugiau informacijos rasite žurnaluose. Susisiekite su savo administracija.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Įvyko klaida „nerasta“. Daugiau informacijos rasite žurnaluose. Susisiekite su savo administracija.", @@ -178,6 +179,7 @@ OC.L10N.register( "Selection" : "Pasirinkimas", "Date and time" : "Data ir laikas", "Users and groups" : "Vartotojai ir grupės", + "Relation" : "Sąsaja", "Column type" : "Stulpelio tipas", "Move" : "Perkelti", "Metadata" : "Metaduomenys", @@ -225,7 +227,8 @@ OC.L10N.register( "Edit table" : "Taisyti lentelę", "Create column" : "Sukurti stulpelį", "Import" : "Importuoti", - "Export as CSV" : "Eksportuoti kaip CSV", + "Export all rows" : "Eksportuoti visas eilutes", + "Export filtered rows" : "Eksportuoti filtruotas eilutes", "Filtered view" : "Filtruotas vaizdas", "Reset local adjustments" : "Iš naujo nustatykite vietinius nustatymus", "No columns" : "Nėra stulpelių", @@ -237,6 +240,9 @@ OC.L10N.register( "Please insert a title for the new column." : "Įrašykite naujo stulpelio pavadinimą.", "Cannot save column. Column width must be between {min} and {max}." : "Nepavyksta išsaugoti stulpelio. Stulpelio plotis turi būti nuo {min} iki {max}.", "You need to select a type for the new column." : "Turite pasirinkti naujo stulpelio tipą.", + "Please select a relation type." : "Pasirinkite sąsajos tipą.", + "Please select a target." : "Prašome pasirinkite paskirties vietą.", + "Please select a label for relation selection." : "Prašome pasirinkite etiketę pasirinktai sąsajai.", "The column \"{column}\" was created." : "Stulpelis „{column}“ buvo sukurtas.", "Sorry, something went wrong." : "Atleiskite, kažkas nutiko.", "Could not create new column." : "Nepavyko sukurti naujo stulpelio.", @@ -502,6 +508,8 @@ OC.L10N.register( "Link providers" : "Nuorodų teikėjai", "This option is outdated." : "Ši parinktis yra pasenusi.", "Options" : "Parinktys", + "This relation does not exist anymore." : "Šis sąsaja nebeegzistuoja.", + "Select relation value" : "Pasirinkite sąsajos reikšmę", "Set {star} stars" : "Nustatyti {star} žvaigždutes", "Cell input" : "Langelio įvestis", "Back" : "Atgal", @@ -521,6 +529,7 @@ OC.L10N.register( "Manage column" : "Tvarkyti stulpelį", "Column manage actions" : "Stulpelių tvarkymo veiksmai", "Hide column" : "Slėpti stulpelį", + "Copy row" : "Kopijuoti eilutę", "Undo" : "Atšaukti", "Redo" : "Grąžinti", "Bold" : "Paryškinta", @@ -550,6 +559,12 @@ OC.L10N.register( "Default" : "Numatytoji", "Reduce stars" : "Sumažinti žvaigždžių skaičių", "Increase stars" : "Padidinkite žvaigždčių skaičių", + "Relation type" : "Sąsajos tipas", + "Select relation type" : "Pasirinkite sąsajos tipą", + "Select target" : "Pasirinkti paskirties vietą.", + "Label for relation selection" : "Sąsajos pasirinkimo etiketė", + "Select label for relation selection" : "Pasirinkti etiketę pasirinktai sąsajai.", + "Only text and number columns can be used as label" : "Kaip etiketę galima naudoti tik teksto ir skaičių stulpelius", "First option" : "Pirmasis variantas", "Second option" : "Antras variantas", "Delete option" : "Ištrinti variantą", @@ -557,7 +572,7 @@ OC.L10N.register( "You can set a default value by clicking on one of the radio buttons next to the label fields." : "Numatytąją reikšmę galite nustatyti spustelėdami vieną iš radijo mygtukų šalia etikečių laukų.", "Click here to unset default selection." : "Spustelėkite čia, jei norite atšaukti numatytąjį pasirinkimą.", "You can set default values by marking the checkboxes next to the label fields." : "Numatytąsias reikšmes galite nustatyti pažymėdami žymimuosius langelius šalia etikečių laukų.", - "Allowed pattern (regex)" : "Leidžiamas modelis (regex)", + "Allowed pattern (regex)" : "Leidžiamas šablonas (reguliarioji išraiška)", "Maximum text length" : "Maksimalus teksto ilgis", "Unique value" : "Unikali reikšmė", "Could not load link providers." : "Nepavyko įkelti nuorodų teikėjų.", @@ -574,7 +589,7 @@ OC.L10N.register( "Show fullscreen" : "Rodyti per visą ekraną", "Close editor" : "Užverti redaktorių", "Create Row" : "Sukurti eilutę", - "Export CSV" : "Eksportuoti CSV", + "Export selected rows" : "Eksportuoti pasirinktas eilutes", "Uncheck all" : "Panaikinkite visų žymėjimą", "_%n selected row_::_%n selected rows_" : ["%n pasirinkta eilutė","%n pasirinktos eilutės","%n pasirinktų eilučių","%n pasirinktų eilučių"], "Go to first page" : "Eiti į pirmą puslapį", @@ -648,6 +663,7 @@ OC.L10N.register( "Could not insert column." : "Nepavyko įterpti stulpelio.", "Could not update column." : "Nepavyko atnaujinti stulpelio.", "Could not remove column." : "Nepavyko pašalinti stulpelio.", + "Could not load relation data." : "Nepavyko įkelti sąsajos duomenų.", "Could not load rows." : "Nepavyko įkelti eilučių.", "Outdated data. View is reloaded" : "Pasenę duomenys. Rodinys yra įkeliamas iš naujo", "Could not insert row." : "Nepavyko įterpti eilutės.", diff --git a/l10n/lt_LT.json b/l10n/lt_LT.json index 4773f33af8..64cfb78b6d 100644 --- a/l10n/lt_LT.json +++ b/l10n/lt_LT.json @@ -31,6 +31,7 @@ "Timestamp of data load" : "Duomenų įkėlimo laiko žyma", "No" : "Ne", "Yes" : "Taip", + "Count" : "Suskaičiuoti", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Įvyko netikėta klaida. Daugiau informacijos rasite žurnaluose. Susisiekite su savo administracija.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Įvyko leidimo klaida. Daugiau informacijos rasite žurnaluose. Susisiekite su savo administracija.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Įvyko klaida „nerasta“. Daugiau informacijos rasite žurnaluose. Susisiekite su savo administracija.", @@ -176,6 +177,7 @@ "Selection" : "Pasirinkimas", "Date and time" : "Data ir laikas", "Users and groups" : "Vartotojai ir grupės", + "Relation" : "Sąsaja", "Column type" : "Stulpelio tipas", "Move" : "Perkelti", "Metadata" : "Metaduomenys", @@ -223,7 +225,8 @@ "Edit table" : "Taisyti lentelę", "Create column" : "Sukurti stulpelį", "Import" : "Importuoti", - "Export as CSV" : "Eksportuoti kaip CSV", + "Export all rows" : "Eksportuoti visas eilutes", + "Export filtered rows" : "Eksportuoti filtruotas eilutes", "Filtered view" : "Filtruotas vaizdas", "Reset local adjustments" : "Iš naujo nustatykite vietinius nustatymus", "No columns" : "Nėra stulpelių", @@ -235,6 +238,9 @@ "Please insert a title for the new column." : "Įrašykite naujo stulpelio pavadinimą.", "Cannot save column. Column width must be between {min} and {max}." : "Nepavyksta išsaugoti stulpelio. Stulpelio plotis turi būti nuo {min} iki {max}.", "You need to select a type for the new column." : "Turite pasirinkti naujo stulpelio tipą.", + "Please select a relation type." : "Pasirinkite sąsajos tipą.", + "Please select a target." : "Prašome pasirinkite paskirties vietą.", + "Please select a label for relation selection." : "Prašome pasirinkite etiketę pasirinktai sąsajai.", "The column \"{column}\" was created." : "Stulpelis „{column}“ buvo sukurtas.", "Sorry, something went wrong." : "Atleiskite, kažkas nutiko.", "Could not create new column." : "Nepavyko sukurti naujo stulpelio.", @@ -500,6 +506,8 @@ "Link providers" : "Nuorodų teikėjai", "This option is outdated." : "Ši parinktis yra pasenusi.", "Options" : "Parinktys", + "This relation does not exist anymore." : "Šis sąsaja nebeegzistuoja.", + "Select relation value" : "Pasirinkite sąsajos reikšmę", "Set {star} stars" : "Nustatyti {star} žvaigždutes", "Cell input" : "Langelio įvestis", "Back" : "Atgal", @@ -519,6 +527,7 @@ "Manage column" : "Tvarkyti stulpelį", "Column manage actions" : "Stulpelių tvarkymo veiksmai", "Hide column" : "Slėpti stulpelį", + "Copy row" : "Kopijuoti eilutę", "Undo" : "Atšaukti", "Redo" : "Grąžinti", "Bold" : "Paryškinta", @@ -548,6 +557,12 @@ "Default" : "Numatytoji", "Reduce stars" : "Sumažinti žvaigždžių skaičių", "Increase stars" : "Padidinkite žvaigždčių skaičių", + "Relation type" : "Sąsajos tipas", + "Select relation type" : "Pasirinkite sąsajos tipą", + "Select target" : "Pasirinkti paskirties vietą.", + "Label for relation selection" : "Sąsajos pasirinkimo etiketė", + "Select label for relation selection" : "Pasirinkti etiketę pasirinktai sąsajai.", + "Only text and number columns can be used as label" : "Kaip etiketę galima naudoti tik teksto ir skaičių stulpelius", "First option" : "Pirmasis variantas", "Second option" : "Antras variantas", "Delete option" : "Ištrinti variantą", @@ -555,7 +570,7 @@ "You can set a default value by clicking on one of the radio buttons next to the label fields." : "Numatytąją reikšmę galite nustatyti spustelėdami vieną iš radijo mygtukų šalia etikečių laukų.", "Click here to unset default selection." : "Spustelėkite čia, jei norite atšaukti numatytąjį pasirinkimą.", "You can set default values by marking the checkboxes next to the label fields." : "Numatytąsias reikšmes galite nustatyti pažymėdami žymimuosius langelius šalia etikečių laukų.", - "Allowed pattern (regex)" : "Leidžiamas modelis (regex)", + "Allowed pattern (regex)" : "Leidžiamas šablonas (reguliarioji išraiška)", "Maximum text length" : "Maksimalus teksto ilgis", "Unique value" : "Unikali reikšmė", "Could not load link providers." : "Nepavyko įkelti nuorodų teikėjų.", @@ -572,7 +587,7 @@ "Show fullscreen" : "Rodyti per visą ekraną", "Close editor" : "Užverti redaktorių", "Create Row" : "Sukurti eilutę", - "Export CSV" : "Eksportuoti CSV", + "Export selected rows" : "Eksportuoti pasirinktas eilutes", "Uncheck all" : "Panaikinkite visų žymėjimą", "_%n selected row_::_%n selected rows_" : ["%n pasirinkta eilutė","%n pasirinktos eilutės","%n pasirinktų eilučių","%n pasirinktų eilučių"], "Go to first page" : "Eiti į pirmą puslapį", @@ -646,6 +661,7 @@ "Could not insert column." : "Nepavyko įterpti stulpelio.", "Could not update column." : "Nepavyko atnaujinti stulpelio.", "Could not remove column." : "Nepavyko pašalinti stulpelio.", + "Could not load relation data." : "Nepavyko įkelti sąsajos duomenų.", "Could not load rows." : "Nepavyko įkelti eilučių.", "Outdated data. View is reloaded" : "Pasenę duomenys. Rodinys yra įkeliamas iš naujo", "Could not insert row." : "Nepavyko įterpti eilutės.", diff --git a/l10n/lv.js b/l10n/lv.js index 56e6e3175c..22ab3cc910 100644 --- a/l10n/lv.js +++ b/l10n/lv.js @@ -12,7 +12,7 @@ OC.L10N.register( "Missing a temporary folder" : "Trūkst pagaidu mapes", "Could not write file to disk" : "Nevarēja ierakstīt datni diskā", "A PHP extension stopped the file upload" : "PHP paplašinājums apturēja datnes augšupielādi", - "Members" : "Biedri", + "Members" : "Dalībnieki", "Date" : "Datums", "Comments" : "Piebildes", "Name" : "Nosaukums", @@ -55,6 +55,7 @@ OC.L10N.register( "Delete" : "Izdzēst", "Edit" : "Labot", "Activity" : "Darbības", + "Owner" : "Īpašnieks", "Close" : "Aizvērt", "Please select a file." : "Lūgums atlasīt datni.", "Select from Files" : "Atlasīt no Datnēm", @@ -115,6 +116,7 @@ OC.L10N.register( "This month" : "Šis mēnesis", "This week" : "Šonedēļ", "Now" : "Tagad", - "seconds ago" : "pirms vairākām sekundēm" + "seconds ago" : "pirms vairākām sekundēm", + "Back to %s" : "Atgriezties %s" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); diff --git a/l10n/lv.json b/l10n/lv.json index 618aec0bee..2f2a70b05b 100644 --- a/l10n/lv.json +++ b/l10n/lv.json @@ -10,7 +10,7 @@ "Missing a temporary folder" : "Trūkst pagaidu mapes", "Could not write file to disk" : "Nevarēja ierakstīt datni diskā", "A PHP extension stopped the file upload" : "PHP paplašinājums apturēja datnes augšupielādi", - "Members" : "Biedri", + "Members" : "Dalībnieki", "Date" : "Datums", "Comments" : "Piebildes", "Name" : "Nosaukums", @@ -53,6 +53,7 @@ "Delete" : "Izdzēst", "Edit" : "Labot", "Activity" : "Darbības", + "Owner" : "Īpašnieks", "Close" : "Aizvērt", "Please select a file." : "Lūgums atlasīt datni.", "Select from Files" : "Atlasīt no Datnēm", @@ -113,6 +114,7 @@ "This month" : "Šis mēnesis", "This week" : "Šonedēļ", "Now" : "Tagad", - "seconds ago" : "pirms vairākām sekundēm" + "seconds ago" : "pirms vairākām sekundēm", + "Back to %s" : "Atgriezties %s" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" } \ No newline at end of file diff --git a/l10n/mk.js b/l10n/mk.js index c643c1218e..c4e85eb95c 100644 --- a/l10n/mk.js +++ b/l10n/mk.js @@ -49,7 +49,6 @@ OC.L10N.register( "Integration" : "Интеграција", "Total" : "Вкупно", "Import" : "Увези", - "Export as CSV" : "Извези како CSV", "Type" : "Вид", "Rich text" : "Богат текст", "Time" : "Време", diff --git a/l10n/mk.json b/l10n/mk.json index 59f92a4f73..6d606c6d5e 100644 --- a/l10n/mk.json +++ b/l10n/mk.json @@ -47,7 +47,6 @@ "Integration" : "Интеграција", "Total" : "Вкупно", "Import" : "Увези", - "Export as CSV" : "Извези како CSV", "Type" : "Вид", "Rich text" : "Богат текст", "Time" : "Време", diff --git a/l10n/mn.js b/l10n/mn.js index a7d2fb0024..780edeade3 100644 --- a/l10n/mn.js +++ b/l10n/mn.js @@ -4,6 +4,7 @@ OC.L10N.register( "Timestamp of data load" : "Өгөгдөл ачаалсан цагийн тэмдэг", "No" : "Үгүй", "Yes" : "Тийм", + "Count" : "Тоо", "The file was uploaded" : "Файл байршуулагдлаа", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Байршуулсан файл php.ini дахь upload_max_filesize хязгаараас хэтэрсэн", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Байршуулсан файл HTML маягтад заасан MAX_FILE_SIZE хязгаараас хэтэрсэн байна", @@ -50,7 +51,6 @@ OC.L10N.register( "Share" : "–¢“Ø–≥—ç—ç—Ö", "Total" : "–ù–∏–π—Ç", "Import" : "‚Äì√≤‚Äì¬∫‚Äì√∏‚Äì√¶‚Äî√Ñ‚Äî√á", - "Export as CSV" : "CSV болгон экспортлох", "Type" : "–¢”©—Ä”©–ª", "Rich text" : "Баялаг текст", "Time" : "–¶–∞–≥", diff --git a/l10n/mn.json b/l10n/mn.json index 17c1c395a5..e97170dcb7 100644 --- a/l10n/mn.json +++ b/l10n/mn.json @@ -2,6 +2,7 @@ "Timestamp of data load" : "Өгөгдөл ачаалсан цагийн тэмдэг", "No" : "Үгүй", "Yes" : "Тийм", + "Count" : "Тоо", "The file was uploaded" : "Файл байршуулагдлаа", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Байршуулсан файл php.ini дахь upload_max_filesize хязгаараас хэтэрсэн", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Байршуулсан файл HTML маягтад заасан MAX_FILE_SIZE хязгаараас хэтэрсэн байна", @@ -48,7 +49,6 @@ "Share" : "–¢“Ø–≥—ç—ç—Ö", "Total" : "–ù–∏–π—Ç", "Import" : "‚Äì√≤‚Äì¬∫‚Äì√∏‚Äì√¶‚Äî√Ñ‚Äî√á", - "Export as CSV" : "CSV болгон экспортлох", "Type" : "–¢”©—Ä”©–ª", "Rich text" : "Баялаг текст", "Time" : "–¶–∞–≥", diff --git a/l10n/nb.js b/l10n/nb.js index 7b1a748eb1..aa5fe0e37e 100644 --- a/l10n/nb.js +++ b/l10n/nb.js @@ -9,6 +9,7 @@ OC.L10N.register( "Timestamp of data load" : "Tidsstempel for datainnlasting", "No" : "Nei", "Yes" : "Ja", + "Count" : "Telle", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Det oppstod en uventet feil. Flere detaljer finner du i loggene. Ta kontakt med administrasjonen din.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Det oppstod en rettighetsfeil. Flere detaljer finner du i loggene. Ta kontakt med administrasjonen din.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Det oppstod en ikke funnet feil. Flere detaljer finner du i loggene. Ta kontakt med administrasjonen din.", @@ -182,7 +183,6 @@ OC.L10N.register( "Edit table" : "Rediger tabell", "Create column" : "Lag kolonne", "Import" : "Importer", - "Export as CSV" : "Eksporter som CSV", "Filtered view" : "Filtrert visning", "Reset local adjustments" : "Tilbakestill lokale justeringer", "No columns" : "Ingen kolonner", @@ -490,7 +490,6 @@ OC.L10N.register( "Show fullscreen" : "Vis fullskjerm", "Close editor" : "Lukk tekstredigerer", "Create Row" : "Opprett rad", - "Export CSV" : "Eksporter CSV", "Uncheck all" : "Fravelg alle", "_%n selected row_::_%n selected rows_" : ["%n merket rad","%n merkede rader"], "Go to first page" : "Gå til første side", diff --git a/l10n/nb.json b/l10n/nb.json index 25baa46e30..6b6221c56d 100644 --- a/l10n/nb.json +++ b/l10n/nb.json @@ -7,6 +7,7 @@ "Timestamp of data load" : "Tidsstempel for datainnlasting", "No" : "Nei", "Yes" : "Ja", + "Count" : "Telle", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Det oppstod en uventet feil. Flere detaljer finner du i loggene. Ta kontakt med administrasjonen din.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Det oppstod en rettighetsfeil. Flere detaljer finner du i loggene. Ta kontakt med administrasjonen din.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Det oppstod en ikke funnet feil. Flere detaljer finner du i loggene. Ta kontakt med administrasjonen din.", @@ -180,7 +181,6 @@ "Edit table" : "Rediger tabell", "Create column" : "Lag kolonne", "Import" : "Importer", - "Export as CSV" : "Eksporter som CSV", "Filtered view" : "Filtrert visning", "Reset local adjustments" : "Tilbakestill lokale justeringer", "No columns" : "Ingen kolonner", @@ -488,7 +488,6 @@ "Show fullscreen" : "Vis fullskjerm", "Close editor" : "Lukk tekstredigerer", "Create Row" : "Opprett rad", - "Export CSV" : "Eksporter CSV", "Uncheck all" : "Fravelg alle", "_%n selected row_::_%n selected rows_" : ["%n merket rad","%n merkede rader"], "Go to first page" : "Gå til første side", diff --git a/l10n/nl.js b/l10n/nl.js index 73aa4f4d9a..03f639c83b 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -9,6 +9,7 @@ OC.L10N.register( "Timestamp of data load" : "Tijdstempel van de datalading", "No" : "Nee", "Yes" : "Ja", + "Count" : "Aantal", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Er is een onverwachte fout opgetreden. Er zijn meer details beschikbaar in de logboeken. Neem alstublieft contact op met uw beheerder.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Er is een rechtenfout opgetreden. Er zijn meer details beschikbaar in de logboeken. Neem alstublieft contact op met uw beheerder.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Er is een niet gevonden-fout opgetreden. Er zijn meer details beschikbaar in de logboeken. Neem alstublieft contact op met uw beheerder.", @@ -89,6 +90,7 @@ OC.L10N.register( "Plan to discuss for the kickoff meeting." : "Plan een discussie over de kickoff vergadering.", "Kickoff meeting" : "Kickoff vergadering", "We will have a kickoff meeting in person." : "We zullen een persoonlijke kickoff vergadering hebben", + "What" : "Wat", "Done" : "Klaar", "Table" : "Tabel", "View" : "Bekijken", @@ -108,6 +110,7 @@ OC.L10N.register( "Mandatory" : "Verplicht", "Column" : "Kolom", "Operator" : "Operator", + "Delete filter" : "Filter verwijderen", "Ascending" : "Oplopend", "Descending" : "Aflopend", "Views" : "Bekeken", @@ -123,7 +126,6 @@ OC.L10N.register( "Edit table" : "Bewerk tabel", "Create column" : "Aanmaken kolom", "Import" : "Import", - "Export as CSV" : "Exporteer als CSV", "Sorry, something went wrong." : "Sorry, er is iets fout gegaan.", "Type" : "Type", "Simple text" : "Verkorte tekst", @@ -204,8 +206,10 @@ OC.L10N.register( "Back" : "Terug", "Select options" : "Selecteer opties", "Sorting" : "Sorteren", + "Select value" : "Selecteer waarde", "Bold" : "Vet", "Italic" : "Cursief", + "Bullet list" : "Opsommingslijst", "Ordered list" : "Gesorteerde lijst", "Heading 1" : "Kop 1", "Heading 2" : "Kop 2", @@ -231,11 +235,14 @@ OC.L10N.register( "Open link" : "Open link", "Close editor" : "Sluit editor", "Go to previous page" : "Ga naar vorige pagina", + "Page" : "Pagina", "Confirmation" : "Bevestiging", "Confirm" : "Bevestigen", "Content" : "Inhoud", "Select" : "Selecteer", "Insert" : "Invoegen", + "Filter operator" : "Filteroperator", + "Checked" : "Aangevinkt", "Unchecked" : "Niet gecontroleerd", "This year" : "Dit jaar", "This month" : "Deze maand", diff --git a/l10n/nl.json b/l10n/nl.json index 67bbe31822..cdf44819a6 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -7,6 +7,7 @@ "Timestamp of data load" : "Tijdstempel van de datalading", "No" : "Nee", "Yes" : "Ja", + "Count" : "Aantal", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Er is een onverwachte fout opgetreden. Er zijn meer details beschikbaar in de logboeken. Neem alstublieft contact op met uw beheerder.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Er is een rechtenfout opgetreden. Er zijn meer details beschikbaar in de logboeken. Neem alstublieft contact op met uw beheerder.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Er is een niet gevonden-fout opgetreden. Er zijn meer details beschikbaar in de logboeken. Neem alstublieft contact op met uw beheerder.", @@ -87,6 +88,7 @@ "Plan to discuss for the kickoff meeting." : "Plan een discussie over de kickoff vergadering.", "Kickoff meeting" : "Kickoff vergadering", "We will have a kickoff meeting in person." : "We zullen een persoonlijke kickoff vergadering hebben", + "What" : "Wat", "Done" : "Klaar", "Table" : "Tabel", "View" : "Bekijken", @@ -106,6 +108,7 @@ "Mandatory" : "Verplicht", "Column" : "Kolom", "Operator" : "Operator", + "Delete filter" : "Filter verwijderen", "Ascending" : "Oplopend", "Descending" : "Aflopend", "Views" : "Bekeken", @@ -121,7 +124,6 @@ "Edit table" : "Bewerk tabel", "Create column" : "Aanmaken kolom", "Import" : "Import", - "Export as CSV" : "Exporteer als CSV", "Sorry, something went wrong." : "Sorry, er is iets fout gegaan.", "Type" : "Type", "Simple text" : "Verkorte tekst", @@ -202,8 +204,10 @@ "Back" : "Terug", "Select options" : "Selecteer opties", "Sorting" : "Sorteren", + "Select value" : "Selecteer waarde", "Bold" : "Vet", "Italic" : "Cursief", + "Bullet list" : "Opsommingslijst", "Ordered list" : "Gesorteerde lijst", "Heading 1" : "Kop 1", "Heading 2" : "Kop 2", @@ -229,11 +233,14 @@ "Open link" : "Open link", "Close editor" : "Sluit editor", "Go to previous page" : "Ga naar vorige pagina", + "Page" : "Pagina", "Confirmation" : "Bevestiging", "Confirm" : "Bevestigen", "Content" : "Inhoud", "Select" : "Selecteer", "Insert" : "Invoegen", + "Filter operator" : "Filteroperator", + "Checked" : "Aangevinkt", "Unchecked" : "Niet gecontroleerd", "This year" : "Dit jaar", "This month" : "Deze maand", diff --git a/l10n/nn_NO.js b/l10n/nn_NO.js index 5f8dfaa4a0..cf268ca090 100644 --- a/l10n/nn_NO.js +++ b/l10n/nn_NO.js @@ -12,6 +12,7 @@ OC.L10N.register( "from" : "frå", "to" : "til", "Birthday" : "Bursdag", + "Done" : "Ferdig", "Today" : "I dag", "Create" : "Lag", "Link" : "Lenkje", diff --git a/l10n/nn_NO.json b/l10n/nn_NO.json index 22e7be8766..6c4e89a741 100644 --- a/l10n/nn_NO.json +++ b/l10n/nn_NO.json @@ -10,6 +10,7 @@ "from" : "frå", "to" : "til", "Birthday" : "Bursdag", + "Done" : "Ferdig", "Today" : "I dag", "Create" : "Lag", "Link" : "Lenkje", diff --git a/l10n/pl.js b/l10n/pl.js index 10fa5b278b..a4421f8f70 100644 --- a/l10n/pl.js +++ b/l10n/pl.js @@ -9,6 +9,7 @@ OC.L10N.register( "Timestamp of data load" : "Znacznik czasu ładowania danych", "No" : "Nie", "Yes" : "Tak", + "Count" : "Ilość pobrań", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Wystąpił nieoczekiwany błąd. Więcej szczegółów można odnaleźć w logach. Skontaktuj się z administratorem.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Wystąpił błąd z uprawnieniami. Więcej szczegółów można odnaleźć w logach. Skontaktuj się z administratorem.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Wystąpił błąd: nie znaleziono. Więcej szczegółów można odnaleźć w logach. Skontaktuj się z administratorem.", @@ -123,7 +124,6 @@ OC.L10N.register( "Edit table" : "Edytuj tabelę", "Create column" : "Utwórz kolumnę", "Import" : "Importuj", - "Export as CSV" : "Eksportuj jako CSV", "Please insert a title for the new column." : "Wstaw tytuł nowej kolumny.", "You need to select a type for the new column." : "Musisz wybrać rodzaj nowej kolumny.", "The column \"{column}\" was created." : "Kolumna \"{column}\" została utworzona.", diff --git a/l10n/pl.json b/l10n/pl.json index 339eccb99b..ef950f6a9e 100644 --- a/l10n/pl.json +++ b/l10n/pl.json @@ -7,6 +7,7 @@ "Timestamp of data load" : "Znacznik czasu ładowania danych", "No" : "Nie", "Yes" : "Tak", + "Count" : "Ilość pobrań", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Wystąpił nieoczekiwany błąd. Więcej szczegółów można odnaleźć w logach. Skontaktuj się z administratorem.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Wystąpił błąd z uprawnieniami. Więcej szczegółów można odnaleźć w logach. Skontaktuj się z administratorem.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Wystąpił błąd: nie znaleziono. Więcej szczegółów można odnaleźć w logach. Skontaktuj się z administratorem.", @@ -121,7 +122,6 @@ "Edit table" : "Edytuj tabelę", "Create column" : "Utwórz kolumnę", "Import" : "Importuj", - "Export as CSV" : "Eksportuj jako CSV", "Please insert a title for the new column." : "Wstaw tytuł nowej kolumny.", "You need to select a type for the new column." : "Musisz wybrać rodzaj nowej kolumny.", "The column \"{column}\" was created." : "Kolumna \"{column}\" została utworzona.", diff --git a/l10n/pt_BR.js b/l10n/pt_BR.js index 99f41dac6a..31c3847d12 100644 --- a/l10n/pt_BR.js +++ b/l10n/pt_BR.js @@ -33,6 +33,7 @@ OC.L10N.register( "Timestamp of data load" : "Marca temporal do carregamento dos dados", "No" : "Não", "Yes" : "Sim", + "Count" : "Número", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Um erro inesperado ocorreu. Mais detalhes podem ser encontrados nos logs. Entre em contato com sua administração.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocorreu um erro de permissão. Mais detalhes podem ser encontrados nos logs. Entre em contato com sua administração.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocorreu um erro não encontrado. Mais detalhes podem ser encontrados nos logs. Entre em contato com sua administração.", @@ -178,6 +179,7 @@ OC.L10N.register( "Selection" : "Seleção", "Date and time" : "Data e hora", "Users and groups" : "Usuários e grupos", + "Relation" : "Relação", "Column type" : "Tipo de coluna", "Move" : "Mover", "Metadata" : "Metadados", @@ -225,7 +227,8 @@ OC.L10N.register( "Edit table" : "Editar tabela", "Create column" : "Criar coluna", "Import" : "Importar", - "Export as CSV" : "Exportar como CSV", + "Export all rows" : "Exportar todas as linhas", + "Export filtered rows" : "Exportar linhas filtradas", "Filtered view" : "Visualização filtrada", "Reset local adjustments" : "Redefinir ajustes locais", "No columns" : "Nenhuma coluna", @@ -237,6 +240,9 @@ OC.L10N.register( "Please insert a title for the new column." : "Por favor, insira um título para a nova coluna.", "Cannot save column. Column width must be between {min} and {max}." : "Não é possível salvar a coluna. A largura da coluna deve estar entre {min} e {max}. ", "You need to select a type for the new column." : "Você precisa selecionar um tipo para a nova coluna.", + "Please select a relation type." : "Selecione um tipo de relação.", + "Please select a target." : "Selecione um destino.", + "Please select a label for relation selection." : "Selecione um rótulo para a seleção de relações.", "The column \"{column}\" was created." : "A coluna \"{column}\" foi criada.", "Sorry, something went wrong." : "Desculpe, algo deu errado.", "Could not create new column." : "Não foi possível criar nova coluna.", @@ -502,6 +508,8 @@ OC.L10N.register( "Link providers" : "Provedores de links", "This option is outdated." : "Esta opção está desatualizada.", "Options" : "Opções", + "This relation does not exist anymore." : "Essa relação não existe mais.", + "Select relation value" : "Selecione o valor da relação", "Set {star} stars" : "Definir {star} estrelas", "Cell input" : "Entrada de célula", "Back" : "Voltar", @@ -521,6 +529,7 @@ OC.L10N.register( "Manage column" : "Gerenciar coluna", "Column manage actions" : "Ações de gerenciamento de coluna", "Hide column" : "Ocultar coluna", + "Copy row" : "Copiar linha", "Undo" : "Desfazer", "Redo" : "Refazer", "Bold" : "Negrito", @@ -550,6 +559,12 @@ OC.L10N.register( "Default" : "Padrão", "Reduce stars" : "Menos estrelas", "Increase stars" : "Mais estrelas", + "Relation type" : "Tipo de relação", + "Select relation type" : "Selecione o tipo de relação", + "Select target" : "Selecione o destino", + "Label for relation selection" : "Rótulo para seleção de relação", + "Select label for relation selection" : "Selecione o rótulo para a seleção da relação", + "Only text and number columns can be used as label" : "Apenas colunas de texto e de números podem ser usadas como rótulo", "First option" : "Primeira opção", "Second option" : "Segunda opção", "Delete option" : "Excluir opção", @@ -574,7 +589,7 @@ OC.L10N.register( "Show fullscreen" : "Mostrar em tela cheia", "Close editor" : "Fechar editor", "Create Row" : "Criar Linha", - "Export CSV" : "Exportar CSV", + "Export selected rows" : "Exportar linhas selecionadas", "Uncheck all" : "Desmarcar todos", "_%n selected row_::_%n selected rows_" : ["%n linha selecionada","%n linhas selecionadas","%n linhas selecionadas"], "Go to first page" : "Ir para a primeira página", @@ -648,6 +663,7 @@ OC.L10N.register( "Could not insert column." : "Não foi possível colar coluna.", "Could not update column." : "Não foi possível atualizar coluna", "Could not remove column." : "Não foi possível remover coluna.", + "Could not load relation data." : "Não foi possível carregar os dados da relação.", "Could not load rows." : "Não foi possível carregar linhas", "Outdated data. View is reloaded" : "Dados desatualizados. Visualização é recarregada", "Could not insert row." : "Não foi possível colar linha.", diff --git a/l10n/pt_BR.json b/l10n/pt_BR.json index 24429d0171..0a293a45b5 100644 --- a/l10n/pt_BR.json +++ b/l10n/pt_BR.json @@ -31,6 +31,7 @@ "Timestamp of data load" : "Marca temporal do carregamento dos dados", "No" : "Não", "Yes" : "Sim", + "Count" : "Número", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Um erro inesperado ocorreu. Mais detalhes podem ser encontrados nos logs. Entre em contato com sua administração.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocorreu um erro de permissão. Mais detalhes podem ser encontrados nos logs. Entre em contato com sua administração.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocorreu um erro não encontrado. Mais detalhes podem ser encontrados nos logs. Entre em contato com sua administração.", @@ -176,6 +177,7 @@ "Selection" : "Seleção", "Date and time" : "Data e hora", "Users and groups" : "Usuários e grupos", + "Relation" : "Relação", "Column type" : "Tipo de coluna", "Move" : "Mover", "Metadata" : "Metadados", @@ -223,7 +225,8 @@ "Edit table" : "Editar tabela", "Create column" : "Criar coluna", "Import" : "Importar", - "Export as CSV" : "Exportar como CSV", + "Export all rows" : "Exportar todas as linhas", + "Export filtered rows" : "Exportar linhas filtradas", "Filtered view" : "Visualização filtrada", "Reset local adjustments" : "Redefinir ajustes locais", "No columns" : "Nenhuma coluna", @@ -235,6 +238,9 @@ "Please insert a title for the new column." : "Por favor, insira um título para a nova coluna.", "Cannot save column. Column width must be between {min} and {max}." : "Não é possível salvar a coluna. A largura da coluna deve estar entre {min} e {max}. ", "You need to select a type for the new column." : "Você precisa selecionar um tipo para a nova coluna.", + "Please select a relation type." : "Selecione um tipo de relação.", + "Please select a target." : "Selecione um destino.", + "Please select a label for relation selection." : "Selecione um rótulo para a seleção de relações.", "The column \"{column}\" was created." : "A coluna \"{column}\" foi criada.", "Sorry, something went wrong." : "Desculpe, algo deu errado.", "Could not create new column." : "Não foi possível criar nova coluna.", @@ -500,6 +506,8 @@ "Link providers" : "Provedores de links", "This option is outdated." : "Esta opção está desatualizada.", "Options" : "Opções", + "This relation does not exist anymore." : "Essa relação não existe mais.", + "Select relation value" : "Selecione o valor da relação", "Set {star} stars" : "Definir {star} estrelas", "Cell input" : "Entrada de célula", "Back" : "Voltar", @@ -519,6 +527,7 @@ "Manage column" : "Gerenciar coluna", "Column manage actions" : "Ações de gerenciamento de coluna", "Hide column" : "Ocultar coluna", + "Copy row" : "Copiar linha", "Undo" : "Desfazer", "Redo" : "Refazer", "Bold" : "Negrito", @@ -548,6 +557,12 @@ "Default" : "Padrão", "Reduce stars" : "Menos estrelas", "Increase stars" : "Mais estrelas", + "Relation type" : "Tipo de relação", + "Select relation type" : "Selecione o tipo de relação", + "Select target" : "Selecione o destino", + "Label for relation selection" : "Rótulo para seleção de relação", + "Select label for relation selection" : "Selecione o rótulo para a seleção da relação", + "Only text and number columns can be used as label" : "Apenas colunas de texto e de números podem ser usadas como rótulo", "First option" : "Primeira opção", "Second option" : "Segunda opção", "Delete option" : "Excluir opção", @@ -572,7 +587,7 @@ "Show fullscreen" : "Mostrar em tela cheia", "Close editor" : "Fechar editor", "Create Row" : "Criar Linha", - "Export CSV" : "Exportar CSV", + "Export selected rows" : "Exportar linhas selecionadas", "Uncheck all" : "Desmarcar todos", "_%n selected row_::_%n selected rows_" : ["%n linha selecionada","%n linhas selecionadas","%n linhas selecionadas"], "Go to first page" : "Ir para a primeira página", @@ -646,6 +661,7 @@ "Could not insert column." : "Não foi possível colar coluna.", "Could not update column." : "Não foi possível atualizar coluna", "Could not remove column." : "Não foi possível remover coluna.", + "Could not load relation data." : "Não foi possível carregar os dados da relação.", "Could not load rows." : "Não foi possível carregar linhas", "Outdated data. View is reloaded" : "Dados desatualizados. Visualização é recarregada", "Could not insert row." : "Não foi possível colar linha.", diff --git a/l10n/pt_PT.js b/l10n/pt_PT.js index 9e48964cab..c2616e2cf7 100644 --- a/l10n/pt_PT.js +++ b/l10n/pt_PT.js @@ -1,8 +1,41 @@ OC.L10N.register( "tables", { + "You have created a new table {table}" : "Você criou uma nova tabela {table}", + "{user} has created a new table {table}" : "{user} criou uma nova tabela {table}", + "You have deleted the table {table}" : "Você excluiu a tabela {table}", + "{user} has deleted the table {table}" : "{user} excluiu a tabela {table}", + "You have renamed the table {before} to {table}" : "Você renomeou a tabela {before} para {table}", + "You have updated the description of table {table} to {after}" : "Você atualizou a descrição da tabela {table} para {after}", + "{user} has updated the description of table {table} to {after}" : "{user} atualizou a descrição da tabela {table} para {after}", + "You have created a new row {row} in table {table}" : "Você criou uma nova linha {row} na tabela {table}", + "{user} has created a new row {row} in table {table}" : "{user} criou uma nova linha {row} na tabela {table}", + "You have deleted the row {row} in table {table}" : "Você excluiu a linha {row} na tabela {table}", + "{user} has deleted the row {row} in table {table}" : "{user} excluiu a linha {row} na tabela {table}", + "You have imported file to table {table}" : "Você importou o arquivo para a tabela {table}", + "{user} has imported file to table {table}" : "{user} importou o arquivo para a tabela {table}", + "Found columns: {foundColumnsCount}" : "Colunas encontradas: {foundColumnsCount}", + "Matching columns: {matchingColumnsCount}" : "Colunas correspondentes: {matchingColumnsCount}", + "Created columns: {createdColumnsCount}" : "Colunas criadas: {createdColumnsCount}", + "Inserted rows: {insertedRowsCount}" : "Linhas inseridas: {insertedRowsCount}", + "Updated rows: {updatedRowsCount}" : "Linhas atualizadas: {updatedRowsCount}", + "Value parsing errors: {errorsParsingCount}" : "Erros na análise de valores: {errorsParsingCount}", + "Row creation errors: {errorsCount}" : "Erro na criação de linhas: {errorsCount}", + "Tables" : "Tabelas", + "A table or row was changed" : "Uma tabela ou linha foi alterada", + "Nextcloud Tables" : "Nextcloud Tabelas", + "Select table" : "Selecionar tabela", + "Select columns" : "Selecionar colunas", + "e.g. 1,2,4 or leave empty" : "p. ex., 1,2,4 ou deixe vazio", + "Timestamp of data load" : "Marca temporal do carregamento de dados", "No" : "Não", "Yes" : "Sim", + "Count" : "Número", + "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Um erro inesperado ocorreu. Mais detalhes podem ser encontrados nos logs. Entre em contato com sua administração.", + "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocorreu um erro de permissão. Mais detalhes podem ser encontrados nos logs. Entre em contato com sua administração.", + "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocorreu um erro não encontrado. Mais detalhes podem ser encontrados nos logs. Entre em contato com sua administração.", + "Could not create row." : "Não foi possível criar a linha.", + "Could not update row." : "Não foi possível atualizar a linha.", "The file was uploaded" : "O ficheiro foi carregado", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "O ficheiro carregado excede a diretiva upload_max_filesize no php.ini ", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "O ficheiro carregado excede a diretiva MAX_FILE_SIZE especificada no formulário HTML", @@ -12,118 +45,625 @@ OC.L10N.register( "Could not write file to disk" : "Não foi possível escrever o ficheiro no disco.", "A PHP extension stopped the file upload" : "Uma extensão PHP parou o carregamento do ficheiro", "No file uploaded or file size exceeds maximum of %s" : "Nenhum ficheiro carregado ou o tamanho do ficheiro excede o máximo de%s", + "Deleted team %s." : "Equipe %s excluída.", + "Nextcloud tables" : "Nextcloud Tabelas", + "table" : "tabela", + "table view" : "Visualização de tabela", + "Column width must be between %1$s and %2$s." : "A largura da coluna deve estar entre %1$s e %2$s.", + "This column was automatically created by the import service." : "Esta coluna foi criada automaticamente pelo serviço de importação.", + "Column \"%s\" contains a non-unique value." : "A coluna \"%s\" contém um valor não único.", + "Welcome to %s Tables!" : "Bem-vindo ao %s Tabelas!", "ToDo list" : "Lista ToDo", + "Setup a simple todo-list." : "Criar uma lista de tarefas simples", "Members" : "Membros", + "List of members with some basic attributes." : "Lista de membros com alguns atributos básicos", + "Customers" : "Clientes", + "Manage your customers." : "Gerencie seus clientes.", + "Vacation requests" : "Pedidos de férias", + "Use this table to collect and manage vacation requests." : "Use esta tabela para coletar e gerenciar pedidos de férias.", + "Weight tracking" : "Acompanhamento de peso", + "Track your weight and other health measures." : "Acompanhe seu peso e outras medidas de saúde.", "Date" : "Data", "Weight" : "Peso", "Body fat" : "Gordura corporal", + "Feeling over all" : "Sentimento geral", "Comments" : "Comentários", + "feel sick" : "sentindo doente", + "party-time" : "vontade de festejar", "Name" : "Nome", + "Account manager" : "Gerente de contas", + "Contract type" : "Tipo de contrato", + "Contract start" : "Início do contrato", + "Contract end" : "Fim do contrato", "Description" : "Descrição", + "Contact information" : "Informações de contato", + "Quality of relationship" : "Qualidade do relacionamento", "Comment" : "Comentário", + "Dog" : "Cachorro", + "Dog food every week" : "Ração para cachorro toda semana", + "The dog is our best friend." : "O cão é nosso melhor amigo.", + "Standard, SLA Level 2" : "Padrão, ANS Nível 2", + "Likes treats" : "Gosta de guloseimas", + "Cat" : "Gato", + "Cat food every week" : "Ração para gato toda semana", + "The cat is also our best friend." : "O gato é nosso melhor amigo também.", + "Standard, SLA Level 1" : "Padrão, ANS Nível 1", + "New customer, let's see if there is more." : "Novo cliente, vamos ver se há mais.", + "Horse" : "Cavalo", + "Summer only" : "Somente no verão", + "Special" : "Especial", + "Employee name" : "Nome do funcionário", "from" : "De", + "When is your vacation starting?" : "Quando começam suas férias?", "to" : "Para", + "When is your vacation ending?" : "Quando terminam suas férias?", + "Number of working days" : "Número de dias úteis", + "How many working days are included?" : "Quantos dias úteis estão incluídos?", + "Request date" : "Data do pedido", "Approved" : "Aprovado", + "Approve date" : "Aprovar data", + "Approved by" : "Aprovado por", + "The Boss" : "O Chefe", + "Bob will help for this time" : "Bob ajudará nesse tempo", + "We have to talk about that." : "Temos que falar sobre isso.", + "Create Vacation Request" : "Criar Pedido de Férias", + "Open Request" : "Abrir Pedido", + "Request Status" : "Status do Pedido", + "Closed requests" : "Pedidos encerrados", "Position" : "Position", + "Skills" : "Habilidades", "Birthday" : "Aniversário", + "Santa Claus" : "Papai Noel", + "Make happy people" : "Fazer pessoas felizes", + "Task" : "Tarefa", + "Title or short description" : "Título ou descrição breve", "Target" : "Objetivo", + "Date, time or whatever" : "Data, hora ou o que for", "Progress" : "Progresso", + "Proofed" : "Verificado", + "Create initial milestones" : "Criar marcos iniciais", + "Create some milestones to structure the project." : "Crie alguns marcos para estruturar o projeto.", + "Plan to discuss for the kickoff meeting." : "Plano a ser discutido na reunião inicial.", + "Wow, that was hard work, but now it's done." : "Uau, foi um trabalho árduo, mas agora está pronto.", + "Kickoff meeting" : "Reunião inicial", + "Project is kicked-off and we know the vision and our first tasks." : "O projeto é iniciado e conhecemos a visão e nossas primeiras tarefas.", + "That was nice in person again. We collected some action points, had a look at the documentation..." : "Foi bom estar pessoalmente de novo. Coletamos alguns pontos de ação, demos uma olhada na documentação...", + "Set up some documentation and collaboration tools" : "Configure algumas ferramentas de documentação e colaboração", + "Where and in what way do we collaborate?" : "Onde e de que forma podemos colaborar?", + "We know what we are doing." : "Sabemos o que estamos fazendo.", + "We have heard that %s could be a nice solution for it, should give it a try." : "Ouvimos dizer que %s pode ser uma boa solução para isso.", + "Add more actions" : "Adicionar mais ações", + "What" : "O que", + "How to do" : "Como fazer", + "Ease of use" : "Facilidade de uso", "Done" : "Concluído", + "Open the tables app" : "Abrir o aplicativo tabelas", + "Reachable via the Tables icon in the apps list." : "Acessível por meio do ícone Tabelas na lista de aplicativos.", + "Add your first row" : "Adicionar sua primeira linha", + "Use the *+ Create row* button and enter some data inside of the form." : "Use o botão *+ Criar linha* e insira alguns dados dentro do formulário.", + "Edit a row" : "Modificar uma linha", + "Go to a row you want to edit and use the *pencil* edit button. Maybe you want to add a *Done* status to this row?" : "Vá até a linha que deseja editar e use o botão de edição *lápis*. Talvez você queira adicionar um status *Concluído* a essa linha?", + "Add a new column" : "Adicionar uma nova coluna", + "You can add, remove and adjust columns as you need. Open the three-dot-menu on the upper right of this table and choose *Create column*. Fill in the data you want, at least a title and column type." : "Você pode adicionar, remover e ajustar colunas conforme sua necessidade. Abra o menu de três pontos no canto superior direito desta tabela e selecione *Criar coluna*. Preencha os dados que você deseja, pelo menos um título e um tipo de coluna.", + "Create views for tables" : "Criar visualizações para tabelas", + "Filter data and save table presets as views to share and combine them into applications." : "Filtre dados e salve predefinições para tabelas como visualizações para compartilhá-las e combiná-las em aplicativos.", + "Create applications" : "Criar aplicativos", + "Combine different tables and views into no-code applications for any purpose. This makes them easily accessible directly in the app bar." : "Combine tabelas e visualizações diferentes em aplicativos sem código para qualquer finalidade. Isso os torna facilmente acessíveis diretamente na barra de aplicativos.", + "Read the docs" : "Ler a documentação", + "If you want to go through the documentation, it can be found here: [Nextcloud Tables documentation](%s)" : "Se você quiser consultar a documentação, ela pode ser encontrada aqui: [documentação de Nextcloud Tabelas](%s)", + "Check yourself!" : "Verifique você mesmo!", + "All tables, columns, rows, contexts, and sharing information including all tables owned or shared, their structure and content" : "Todas as tabelas, colunas, linhas, contextos e informações compartilhadas, incluindo todas as tabelas pertencentes ou compartilhadas, sua estrutura e conteúdo", + "Manage data the way you need it." : "Gerencie os dados da maneira que você precisa.", + "Manage data the way you need it.\n\nWith this app you are able to create your own tables with individual columns. You can start with a template or from scratch and add your wanted columns.\nYou can choose from the following column types:\n- Text line or rich text\n- Link to urls or other nextcloud resources\n- Numbers\n- Progress bar\n- Stars rating\n- Yes/No tick\n- Date and/or time\n- (Multi) selection\n- Users, groups and teams\n\nShare your tables and views with users and groups within your cloud.\n\nHave a good time and manage whatever you want." : "Gerencie os dados da maneira que você precisa.\n\nCom este aplicativo, você pode criar suas próprias tabelas com colunas individuais. Você pode começar com um modelo ou do zero e adicionar as colunas desejadas.\nVocê pode escolher entre os seguintes tipos de coluna:\n- Linha de texto ou texto rich\n- Vincula URLs ou outros recursos do Nextcloud\n- Números\n- Barra de progresso\n- Classificação por estrelas\n- Marcador Sim/Não\n- (Multi-)seleção\n- Usuários, grupos e equipes\n\nCompartilhe suas tabelas e visualizações com usuários e grupos na sua nuvem.\n\nDivirta-se e administre o que quiser.", + "Table" : "Tabela", "View" : "Ver", "Today" : "Hoje", + "Last edit" : "Última edição", "Create" : "Criar", + "Column ID" : "ID da coluna", + "Table ID" : "ID da tabela", "Text" : "Texto", "Link" : "Link", + "Number" : "Número", + "Stars rating" : "Classificação por estrelas", + "Progress bar" : "Barra de progresso", "Selection" : "Seleção", + "Date and time" : "Data e hora", + "Users and groups" : "Usuários e grupos", + "Relation" : "Relação", + "Column type" : "Tipo de coluna", "Move" : "Mover", "Metadata" : "Metadados", "Move up" : "Mover para cima", "Move down" : "Mover para baixo", + "Rules are applied in order. The first rule sorts all rows, and any additional rules determine the order within any group of rows that share the same value." : "As regras são aplicadas em ordem. A primeira regra ordena todas as linhas, e quaisquer regras adicionais determinam a ordem dentro de qualquer grupo de linhas que compartilhem o mesmo valor.", "Read only" : "Apenas leitura", + "Mandatory" : "Obrigatório", + "JJJJ-MM-DD hh:mm" : "AAAA-MM-DD hh:mm", + "JJJJ-MM-DD" : "AAAA-MM-DD", + "Search Value" : "Pesquisar Valor", + "Column" : "Coluna", "Operator" : "Operador", + "Delete filter" : "Excluir filtro", + "Filtering rows" : "Filtrar linhas", + "OR" : "OU", + "Add new filter group" : "Adicionar novo grupo de filtros", + "... that meet all of the following conditions" : "... que satisfazem todas as condições a seguir", + "Add new filter" : "Adicionar novo filtro", "Ascending" : "Ascending", "Descending" : "Descending", + "Reactivate sorting rule" : "Reativar regra de ordenação", + "Delete sorting rule" : "Excluir regra de ordenação", + "Among the sorting rules are some to which you have no permissions. However, if you like, you can override the sorting." : "Entre as regras de ordenação estão algumas para as quais você não tem permissão. No entanto, se desejar, você pode sobrescrever a ordenação.", + "Updated table \"{emoji}{table}\"." : "Tabela \"{emoji}{table}\" atualizada.", + "Cannot update table. Title is missing." : "Não é possível atualizar a tabela. O título está faltando.", + "Could not fetch shares." : "Não foi possível buscar os compartilhamentos.", "Views" : "Vistas", + "Create view" : "Criar visualização", + "Rows" : "Linhas", + "Columns" : "Colunas", + "Last edited" : "Última edição", "Shares" : "Partilhas", "Actions" : "Ações", + "Edit view" : "Editar visualização", "Share" : "Partilhar", "Integration" : "Integração", + "Delete view" : "Excluir visualização", "Total" : "Total", "Data" : "Dados", + "Manage table" : "Gerenciar tabela", + "Edit table" : "Editar tabela", + "Create column" : "Criar coluna", "Import" : "Importar", + "Export all rows" : "Exportar todas as linhas", + "Export filtered rows" : "Exportar linhas filtradas", + "Filtered view" : "Visualização filtrada", + "Reset local adjustments" : "Redefinir ajustes locais", + "We need at least one column, please be so kind and create one." : "Precisamos de pelo menos uma coluna, por favor, faça a gentileza de criar uma.", + "No columns selected" : "Nenhuma coluna selecionada", + "The view is empty. Edit which columns should be displayed." : "A visualização está vazia. Edite quais colunas devem ser exibidas.", + "Your access was revoked. Reload the page to update your permissions." : "Seu acesso foi revogado. Atualize a página para renovar suas permissões.", + "Manage view" : "Gerenciar visualização", + "Please insert a title for the new column." : "Por favor, insira um título para a nova coluna.", + "Cannot save column. Column width must be between {min} and {max}." : "Não é possível salvar a coluna. A largura da coluna deve estar entre {min} e {max}. ", + "You need to select a type for the new column." : "Você precisa selecionar um tipo para a nova coluna.", + "Please select a relation type." : "Selecione um tipo de relação.", + "Please select a target." : "Selecione um destino.", + "Please select a label for relation selection." : "Selecione um rótulo para a seleção de relações.", + "The column \"{column}\" was created." : "A coluna \"{column}\" foi criada.", + "Sorry, something went wrong." : "Desculpe, algo deu errado.", + "Could not create new column." : "Não foi possível criar nova coluna.", "Type" : "Tipo", + "Text line" : "Linha de texto", "Simple text" : "Texto simples", + "Rich text" : "Texto rich", + "Multiple selection" : "Seleção múltipla", + "Yes/No" : "Sim/Não", "Time" : "Tempo", + "Add more" : "Adicionar mais", "Save" : "Guardar", + "The title character limit is 200 characters. Please use a shorter title." : "O limite de caracteres do título é de 200 caracteres. Por favor, use um título mais curto.", + "Cannot create new application. Title is missing." : "Não é possível criar um novo aplicativo. Falta o título.", + "Could not create new application" : "Não foi possível criar novo aplicativo", + "Create an application" : "Criar um aplicativo", "Title" : "Título", + "Select icon for the application" : "Selecione um ícone para o aplicativo", + "Select icon" : "Selecionar ícone", + "Title of the new application" : "Título do novo aplicativo", + "Description of the new application" : "Descrição do novo aplicativo", "Resources" : "Recursos", + "Show in app list" : "Mostrar na lista de aplicativos", + "This can be overridden by a per-account preference" : "Isso pode ser substituído por uma preferência por conta", + "Create application" : "Criar aplicativo", + "Fill form" : "Preencher formulário", + "Create row" : "Criar linha", + "Fill form again" : "Preencher formulário novamente", "Submit" : "Submeter", + "Row successfully created." : "Linha criada com sucesso.", + "Could not create new row" : "Não foi possível criar uma nova linha", + "\"{columnTitle}\" should not be empty" : "\"{columnTitle}\" não deve estar vazio", + "Save row" : "Salvar linha", + "Cannot create new table. Title is missing." : "Não é possível criar nova tabela. Está faltando o título.", + "Could not create new table" : "Não foi possível criar nova tabela", + "Could not load templates." : "Não foi possível carregar os models.", + "Create table" : "Criar tabela", + "Select emoji for table" : "Selecione emoji para tabela", + "Select emoji" : "Selecionar emoji", + "🔧 Custom table" : "🔧 Tabela personalizada", + "Custom table from scratch." : "Tabela personalizada do zero.", + "📄 Import table" : "📄 Importar tabela", + "Import table from file." : "Importar tabela de um arquivo.", + "📄 Import Scheme" : "📄 Importar esquema", + "Import Scheme from file." : "Importar Esquema de um arquivo.", + "Are you sure you want to delete column \"{column}\"?" : "Tem certeza de que você quer excluir a coluna \"{column}\"?", + "Error occurred while deleting column \"{column}\"." : "Ocorreu um erro ao excluir a coluna \"{column}\".", "Delete column" : "Eliminar coluna", + "Do you really want to delete the application \"{context}\"? This will also delete the shares and unshare the resources that are connected to this application." : "Você realmente deseja excluir o aplicativo \"{context}\"? Isso também excluirá os compartilhamentos e descompartilhará os recursos conectados a este aplicativo.", + "Application \"{context}\" removed." : "Aplicativo \"{context}\" removido.", + "Confirm application deletion" : "Confirmar exclusão do aplicativo", "Cancel" : "Cancelar", "Delete" : "Apagar", + "Error occurred while deleting rows." : "Ocorreu um erro ao excluir linhas.", + "Do you really want to delete the table \"{table}\"? This will also delete all data, views and shares that are connected to this table." : "Tem certeza que você quer excluir a tabela \"{table}\"? Isso também afetará todos os dados, visualizações e compartilhamentos que estão conectados a esta tabela.", + "Table \"{emoji}{table}\" removed." : "Tabela \"{emoji}{table}\" removida.", + "Confirm table deletion" : "Confirmar exclusão da tabela", + "Do you really want to delete the view \"{view}\"?" : "Você realmente deseja excluir a visualização \"{view}\"?", + "View \"{emoji}{view}\" removed." : "Visualização \"{emoji}{view}\" excluída.", + "Confirm view deletion" : "Confirmar exclusão da visualização", + "Cannot update column. Title is missing." : "Não é possível atualizar a coluna. Está faltando o título.", + "The column \"{column}\" was updated." : "A coluna \"{column}\" foi atualizada.", + "Edit column" : "Editar coluna", + "Cannot update application. Title is missing." : "Não é possível atualizar o aplicativo. Falta o título.", + "Updated application \"{contextTitle}\"." : "Aplicativo \"{contextTitle}\" atualizado.", + "Edit application" : "Editar aplicativo", + "Select an icon for application" : "Selecione um ícone para o aplicativo", + "Description of the application" : "Descrição do aplicativo", + "I really want to delete this application!" : "Eu realmente quero excluir este aplicativo!", + "Transfer application" : "Transferir aplicativo", + "Edit row" : "Editar linha", "Edit" : "Editar", "Activity" : "Atividade", + "I really want to delete this row!" : "Eu realmente quero excluir esta linha!", + "Column order" : "Ordem da coluna", + "Default sorting" : "Ordenação padrão", "Manage" : "Gerir", "Owner" : "Proprietário", + "I really want to delete this table!" : "Eu realmente quero excluir esta tabela!", + "Change owner" : "Alterar proprietário", + "Could not create table" : "Não foi possível criar a tabela", + "File import started, this might take a while. You will be notified once it finished." : "A importação do arquivo foi iniciada; ela pode demorar um pouco. Você será notificado assim que terminar.", + "You must select an existing table" : "Você deve selecionar uma tabela existente", + "Could not import data to table" : "Não foi possível importar dados para a tabela", + "Import file into Tables" : "Importar arquivo para Tabelas", + "Import as new table" : "Importar como nova tabela", + "This will create a new table from the data in this file." : "Isso criará uma nova tabela com os dados deste arquivo.", + "Import into existing table" : "Importar para tabela existente", + "This will import the data from this file into an already existing table." : "Isto importará os dados deste arquivo para uma tabela já existente.", + "Select the table to import into" : "Selecione a tabela para importar", + "Select an existing table" : "Selecione uma tabela existente", + "Create missing columns" : "Criar colunas ausentes", + "Import successful" : "Importação bem-sucedida", "Close" : "Fechar", + "Could not import data due to unknown errors." : "Não foi possível importar dados devido a erros desconhecidos.", + "Import table" : "Importar tabela", + "Preview imported table" : "Visualizar tabela importada", + "The selected file is not supported." : "O arquivo selecionado não é compatível.", "Please select a file." : "Por favor, selecione um ficheiro.", + "Please select column for mapping." : "Por favor, selecione a coluna para mapeamento.", + "Cannot map same exist column for multiple columns." : "Não é possível mapear a mesma coluna existente para diversas colunas.", + "Could not import, not authorized. Are you logged in?" : "Não foi possível importar, não autorizado. Você está logado?", + "Could not import, missing needed permission." : "Não foi possível importar, falta de permissões necessárias.", + "Could not import, needed resources were not found." : "Não foi possível importar, os recursos necessários não foram encontrados.", + "Add data to the table from a file" : "Adicionar dados à tabela a partir de um arquivo", "Select from Files" : "Selecione dos ficheiros", + "Upload from device" : "Carregar do dispositivo", + "Supported formats: xlsx, xls, csv, html, xml" : "Formatos suportados: xlsx, xls, csv, html, xml", + "First row of the file must contain column headings without gaps." : "A primeira linha do arquivo deve conter os títulos das colunas sem espaços.", "Preview" : "Pré-visualizar", + "Importing data from " : "Importando dados de", + "This might take a while..." : "Isso pode demorar um pouco...", + "Failed" : "Falhou", + "Loading table data" : "Carregando dados da tabela", + "ID (Meta)" : "ID (Meta)", + "Create new column" : "Criar nova coluna", + "Import to existing column" : "Importar para coluna existente", + "Existing column" : "Coluna existente", + "Ignore column" : "Ignorar coluna", + "Result" : "Resultado", + "Found columns" : "Colunas encontradas", + "Matching columns" : "Colunas correspondentes", + "Created columns" : "Colunas criadas", + "Inserted rows" : "Linhas coladas", + "Updated rows" : "Linhas atualizadas", + "Row creation errors" : "Erros de criação de linhas", + "Import scheme" : "Importar esquema", + "Context \"{name}\" transferred to {user}" : "Contexto \"{name}\" transferido para {user}", + "Transfer the application \"{context}\" to another user" : "Transferir o aplicativo \"{context}\" para outro usuário", "Transfer" : "Transfere", + "Table \"{emoji}{table}\" transferred to {user}" : "Tabela \"{emoji}{table}\" transferida para {user}", + "Transfer table" : "Transferir tabela", + "Transfer this table to another user" : "Transferir esta tabela para outro usuário", + "Create View" : "Criar Visualização", + "Save modified View" : "Salvar Visualização modificada", + "Save View" : "Salvar Visualização", + "Save as new view" : "Salvar como nova visualização", + "Cannot create view." : "Não é possível criar visualização.", + "Cannot update view." : "Não é possível atualizar visualização.", + "Title is missing." : "Título está faltando.", + "Could not create new view" : "Não foi possível criar nova visualização", + "Could not update view" : "Não foi possível atualizar visualização", + "Select emoji for view" : "Selecione emoji para visualização", + "Title of the new view" : "Título da nova visualização", "Filter" : "Filtro", "Sort" : "Ordenar", + "Delete application" : "Excluir aplicativo", + "Do you really want to delete the table \"{table}\"?" : "Você realmente deseja excluir a tabela \"{table}\"?", "Export" : "Exportar", + "Add to favorites" : "Adicionar aos favoritos", "Remove from favorites" : "Remover dos favoritos", + "Archive table" : "Arquivar tabela", + "Unarchive table" : "Desarquivar tabela", + "Delete table" : "Excluir tabela", "Copy" : "copiar", + "Could not configure new view" : "Não foi possível configurar nova visualização", + "Duplicate view" : "Duplicar visualização", + "Filter items" : "Filtrar itens", "Favorites" : "Favoritos", + "Archived tables" : "Tabelas arquivadas", + "Applications" : "Aplicativos", + "Your results are filtered." : "Seus resultados são filtrados.", "Clear filter" : "Limpar filtro", + "Share with accounts, groups or teams" : "Compartilhar com contas, grupos ou equipes", + "Share with accounts or groups" : "Compartilhar com contas ou grupos", + "User, group or team …" : "Usuário, grupo ou equipe …", + "User or group …" : "Usuário ou grupo …", + "Failed to fetch share recommendations" : "Falha ao buscar recomendações de compartilhamento", "No recommendations. Start typing." : "Nenhuma recomendação. Comece a escrever ", + "Receiver type" : "Tipo de destinatário", + "Create time" : "Data de criação", + "Share ID" : "ID do compartilhamento", "Copy internal link to clipboard" : "Copiar ligação interna para a área de transferência", + "Only works for users with access to this view" : "Funciona apenas para usuários com acesso a esta visualização", "Internal link" : "Ligação interna", + "Any application created by a demoted share recipients using a shared table will continue to consume its data." : "Qualquer aplicativo criado por um destinatário de compartilhamento rebaixado usando uma tabela compartilhada continuará a consumir seus dados.", "group" : "grupo", + "team" : "equipe", + "Table manager" : "Gerente de tabela", + "Permissions" : "Permissões", + "Read data" : "Ler dados", + "Create data" : "Criar dados", + "Update data" : "Atualizar dados", "Delete data" : "Apagar dados", + "Promote to table manager" : "Promover para gerente de tabela", + "Demote to normal share" : "Rebaixar para compartilhamento normal", + "Open main table to adjust table management permissions" : "Abrir tabela principal para ajustar gerenciamento de permissões da tabela", + "No shares" : "Sem compartilhamentos", + "After the promotion of the share recipient to table manager, any applications created by share recipients that utilise this table will continue to access its data, even if you later demote them." : "Após a promoção do destinatário do compartilhamento a gerente de tabela, todos os aplicativos criados pelos destinatários do compartilhamento que utilizam esta tabela continuarão a acessar seus dados, mesmo que você os rebaixe posteriormente.", "View only" : "Visualizar apenas", "Can edit" : "Pode editar", + "Custom permissions" : "Permissões personalizadas", + "Quick share options, current: {option}" : "Opções de compartilhamento rápido, atualmente: {option}", "Read" : "Ler", "Update" : "Atualizar", + "Error creating link share" : "Erro ao criar o compartilhamento por link", + "Error deleting link share" : "Erro ao excluir o compartilhamento por link", "Link copied to clipboard" : "Ligação copiada para a área de transferência", + "Error copying link" : "Erro ao copiar o compartilhamento por link", + "Error copying password" : "Erro ao copiar a senha", "Create public link" : "Criar link público", + "Create a new share link" : "Criar um novo link de compartilhamento", "Set password" : "Definir palavra-passe", "Password" : "Password", "Share link" : "Partilhar ligação", + "Copy public share link" : "Copiar link de compartilhamento público", + "Delete link" : "Excluir link", + "Public links" : "Links públicos", + "No view in context" : "Nenhuma visualização no contexto", + "From {ownerName}" : "De {ownerName}", "Created at" : "Criado em", + "Ownership" : "Proprietário", + "View ID" : "ID da visualização", "Sharing" : "Partilha", + "API" : "API", + "This is your API endpoint for this view" : "Este é o endpoint da API desta visualização", "Copy to clipboard" : "Copiar para área de transferência", + "Your permissions" : "Suas permissões", + "This application could not be found" : "Este aplicativo não pôde ser encontrado", + "Some resources in this application could not be loaded" : "Alguns recursos deste aplicativo não puderam ser carregados", + "Create new table" : "Criar nova tabela", "Searching …" : "À procura …", "No elements found." : "Não foram encontrados elementos.", + "Select a table or view" : "Selecionar uma tabela ou visualização", + "No selected resources" : "Nenhum recurso selecionado", + "Shared resources permissions" : "Permissões de recursos compartilhados", + "Read resource" : "Ler recurso", + "Create resource" : "Criar recurso", + "Update resource" : "Atualizar recurso", + "Delete resource" : "Excluir recurso", + "No shared resources" : "Sem recursos compartilhados", + "Share with accounts" : "Compartilhar com contas", "Error" : "Erro", + "Could not load editor, text not available." : "Não foi possível carregar editor, texto não disponível.", + "Icon {iconName} loading" : "Ícone {iconName} carregando", "Download" : "Transferir", + "Create rows" : "Criar linhas", + "You can add one or more replies." : "Você pode adicionar uma ou mais respostas.", + "You are not allowed to read this table, but you can still create rows." : "Você não tem permissão para ler essa tabela, mas ainda pode criar linhas.", + "No permissions" : "Sem permissões", + "You have no permissions for this table." : "Você não tem permissões para esta tabela.", "Search" : "Pesquisa sobre", + "Clear value" : "Limpar valor", "URL" : "URL", + "Could not load link provider results." : "Não foi possível carregar os resultados do provedor de links.", + "Url" : "Url", + "Invalid protocol. Allowed: {allowed}" : "Protocolo inválido. Permitido: {allowed}", + "Link providers" : "Provedores de links", + "This option is outdated." : "Esta opção está desatualizada.", "Options" : "Opções", + "This relation does not exist anymore." : "Essa relação não existe mais.", + "Select relation value" : "Selecione o valor da relação", + "Set {star} stars" : "Definir {star} estrelas", + "Cell input" : "Entrada de célula", "Back" : "Voltar", + "Select operator" : "Selecione operador", + "Search for value" : "Pesquisar por valor", + "Select options" : "Selecione opções", + "Keyword and submit" : "Palavra-chave e enviar", + "Or use magic values" : "Ou usar valores mágicos", + "Unpin column" : "Desfixar coluna", + "Pin column" : "Fixar coluna", "Sorting" : "Ordenação", + "Sort asc" : "Ordenar asc", + "Sort desc" : "Ordenar desc", + "Filtering" : "Filtros", + "Select Operator" : "Selecione Operador", + "Select value" : "Selecione valor", + "Column manage actions" : "Ações de gerenciamento de coluna", + "Hide column" : "Ocultar coluna", + "Copy row" : "Copiar linha", "Undo" : "Desfazer", "Redo" : "Repetir", "Bold" : "Negrito", "Italic" : "Itálico", + "Bullet list" : "Lista de pontos", + "Ordered list" : "Lista ordenada", + "Strike" : "Tachado", + "Heading 1" : "Título 1", "Heading 2" : "Título 2", "Heading 3" : "Título 3", + "Code" : "Código", + "Task list" : "Lista de tarefas", + "Set today as default" : "Definir hoje como padrão", + "Set now as default" : "Definir agora como padrão", + "Enter a column title" : "Insira um título de coluna", + "Column width" : "Largura da coluna", + "Enter a column width between {min} and {max}" : "Insira uma largura da coluna entre {min} e {max}", + "Add column to other views" : "Adicionar coluna para outras visualizações", + "The default value is lower than the minimum allowed value." : "O valor padrão é menor do que o valor mínimo permitido.", + "The default value is greater than the maximum allowed value." : "O valor padrão é maior do que o valor máximo permitido.", + "Default value" : "Valor padrão", + "Decimals" : "Decimais", + "Maximum" : "Máximo", "Prefix" : "Prefixo", "Suffix" : "Sufixo", "Default" : "Predefinido", + "Reduce stars" : "Menos estrelas", + "Relation type" : "Tipo de relação", + "Select relation type" : "Selecione o tipo de relação", + "Select target" : "Selecione o destino", + "Label for relation selection" : "Rótulo para seleção de relação", + "Select label for relation selection" : "Selecione o rótulo para a seleção da relação", + "Only text and number columns can be used as label" : "Apenas colunas de texto e de números podem ser usadas como rótulo", + "First option" : "Primeira opção", + "Second option" : "Segunda opção", + "Delete option" : "Excluir opção", + "Add option" : "Adicionar opção", + "You can set a default value by clicking on one of the radio buttons next to the label fields." : "Você pode definir um valor padrão clicando em um dos botões de opção ao lado dos campos de rótulo.", + "You can set default values by marking the checkboxes next to the label fields." : "Você pode definir valores padrão marcando as caixas de seleção ao lado dos campos de rótulo.", + "Allowed pattern (regex)" : "Padrão permitido (expressão regular)", + "Maximum text length" : "Comprimento máximo do texto", + "Unique value" : "Valor único", + "Could not load link providers." : "Não foi possível carregar os provedores de links.", + "Allowed types" : "Tipos permitidos", + "Please select at least one provider." : "Selecione pelo menos um provedor.", + "The provided types depends on your system setup. You can use the same providers like the fulltext-search." : "Os tipos fornecidos dependem da configuração de seu sistema. Você pode usar os mesmos provedores que a pesquisa de texto completo.", + "Select multiple items" : "Selecione vários itens", + "Show user status" : "Mostrar status do usuário", + "Please select a new time" : "Por favor, selecione um novo horário", + "This field is mandatory" : "Este campo é obrigatório", + "You can not insert any links in this field. Please configure at least one link provider in the column configuration." : "Não é possível inserir nenhum link neste campo. Configure pelo menos um provedor de link na configuração da coluna.", "Copy link" : "Copiar hiperligação", + "Open link" : "Abrir link", + "Show fullscreen" : "Mostrar em tela cheia", "Close editor" : "Fechar editor", + "Create Row" : "Criar Linha", + "Export selected rows" : "Exportar linhas selecionadas", + "Uncheck all" : "Desmarcar todos", + "Go to previous page" : "Ir para a página anterior", + "Page" : "Página", + "Page number" : "Número da página", + "Per page" : "Por página", + "Go to next page" : "Ir para a próxima página", + "Go to last page" : "Ir para a última página", + "Confirmation" : "Confirmação", "Confirm" : "Confirmar", + "Could not fetch columns for content preview." : "Não foi possível buscar colunas para visualização do conteúdo.", + "Could not fetch rows for content preview." : "Não foi possível buscar linhas para visualização do conteúdo.", + "Render mode" : "Modo de renderização", "Content" : "Conteúdo", "Select" : "Selecionar", + "Insert" : "Colar", + "Could not load search results." : "Não foi possível carregar resultados da pesquisa.", + "Search for tables and views..." : "Pesquisar tabelas e visualizações…", + "Import into Tables" : "Importar para Tabelas", + "Could not create share." : "Não foi possível criar compartilhamento.", + "Could not create public link." : "Não foi possível criar o link público.", + "Could not update share." : "Não foi possível atualizar compartilhamento.", + "Could not update cell" : "Não foi possível atualizar a célula", + "Filter operator" : "Operador de filtro", + "Contains items" : "Contém intens", + "Contains" : "Contém", + "Does not contain" : "Não contém", + "Begins with" : "Começa com", + "Ends with" : "Termina com", + "Is equal" : "É igual", + "Is not equal" : "Não é igual", + "Is greater than" : "É maior que", + "Is lower than" : "É menor que", + "Is lower than or equal" : "É menor ou igual", + "Is empty" : "É vazio", + "Magic field" : "Campo mágico", + "Me (user ID)" : "Eu (ID de usuário)", + "Me (name)" : "Eu (nome)", + "Checked" : "Marcado", + "Unchecked" : "Não marcado", "This year" : "Este ano", "This month" : "Este mês", "This week" : "Esta semana", "Now" : "Agora", + "Exact date" : "Data exata", + "Select a date" : "Selecione uma data", + "Number of days ahead" : "Número de dias pela frente", + "Enter number of days" : "Insira o número de dias", + "Number of days ago" : "Número de dias atrás", "ID" : "ID", + "Creator" : "Criador", + "Last editor" : "Último editor", + "Last edited at" : "Última edição em", + "Copied to clipboard." : "Copiado para a área de transferência.", "seconds ago" : "segundos atrás", + "{shareTypeString}..." : "{shareTypeString}...", + "Unsupported source: {source}" : "Fonte não compatível: {source}", + "Failed to fetch {shareTypeString}" : "Falha ao buscar {shareTypeString}", + "This {type} could not be found" : "Não foi possível encontrar este {type}", + "An error occurred while loading the {type}" : "Ocorreu um erro ao carregar o {type}", + "Unknown error." : "Erro desconhecido.", + "Request is not authorized. Are you logged in?" : "Solicitação não autorizada. Você está logado?", + "Request not allowed." : "Solicitação não permitida.", + "Resource not found." : "Recurso não encontrado.", + "Could not load columns." : "Não foi possível carregar colunas.", + "Could not insert column." : "Não foi possível colar coluna.", + "Could not update column." : "Não foi possível atualizar coluna", + "Could not remove column." : "Não foi possível remover coluna.", + "Could not load relation data." : "Não foi possível carregar os dados da relação.", + "Could not load rows." : "Não foi possível carregar linhas", + "Outdated data. View is reloaded" : "Dados desatualizados. Visualização é recarregada", + "Could not insert row." : "Não foi possível colar linha.", + "Could not remove row." : "Não foi possível remover linha.", + "Could not verify row. View is reloaded" : "Não foi possível verificar a linha. A visualização foi recarregada.", + "Could not insert table." : "Não foi possível colar tabela.", + "Could not load tables." : "Não foi possível carregar tabelas.", + "Could not fetch tables" : "Não foi possível buscar tabelas", + "Could not load shared views." : "Não foi possível carregar visualizações compartilhadas.", + "Could not load shared views" : "Não foi possível carregar visualizações compartilhadas", + "Could not fetch templates" : "Não foi possível buscar modelos", + "Could not insert view." : "Não foi possível colar visualização.", + "Could not update view." : "Não foi possível atualizar visualização.", + "Could not remove view." : "Não foi possível excluir visualização.", + "Could not reload view." : "Não foi possível recarregar visualização.", + "Could not update table." : "Não foi possível atualizar tabela.", + "Could not mark view as favorite" : "Não foi possível marcar a visualização como favorita", + "Could not remove view from favorites" : "Não foi possível remover a visualização dos favoritos", + "Could not remove table from favorites" : "Não foi possível remover a tabela dos favoritos", + "Could not add application share." : "Não foi possível adicionar o compartilhamento de aplicativo.", + "Could not remove application share." : "Não foi possível remover o compartilhamento de aplicativo.", + "Could not update display mode." : "Não foi possível atualizar o modo de exibição.", + "Could not insert application." : "Não foi possível colar aplicativo.", + "Could not update application." : "Não foi possível atualizar o aplicativo.", + "Could not transfer table." : "Não foi possível transferir tabela.", + "Could not fetch applications" : "Não foi possível buscar aplicativos", + "Could not load application." : "Não foi possível carregar o aplicativo.", + "Could not fetch application" : "Não foi possível buscar o aplicativo", + "Could not load table." : "Não foi possível carregar a tabela.", + "Could not fetch table" : "Não foi possível buscar a tabela", + "Could not load view" : "Não foi possível carregar visualização", + "Could not fetch view" : "Não foi possível buscar visualização", + "Could not verify export permissions." : "Não foi possível verificar as permissões de exportação.", + "Could not transfer application." : "Não foi possível transferir o aplicativo.", + "Could not remove application." : "Não foi possível remover o aplicativo.", + "Could not remove table." : "Não foi possível remover tabela.", "Share not found" : "Partilha não encontrada", + "This share does not exist or is no longer available" : "Este compartilhamento não existe ou não está mais disponível", "Back to %s" : "Voltar para %s" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/pt_PT.json b/l10n/pt_PT.json index 6097221c9b..ffc82e961e 100644 --- a/l10n/pt_PT.json +++ b/l10n/pt_PT.json @@ -1,6 +1,39 @@ { "translations": { + "You have created a new table {table}" : "Você criou uma nova tabela {table}", + "{user} has created a new table {table}" : "{user} criou uma nova tabela {table}", + "You have deleted the table {table}" : "Você excluiu a tabela {table}", + "{user} has deleted the table {table}" : "{user} excluiu a tabela {table}", + "You have renamed the table {before} to {table}" : "Você renomeou a tabela {before} para {table}", + "You have updated the description of table {table} to {after}" : "Você atualizou a descrição da tabela {table} para {after}", + "{user} has updated the description of table {table} to {after}" : "{user} atualizou a descrição da tabela {table} para {after}", + "You have created a new row {row} in table {table}" : "Você criou uma nova linha {row} na tabela {table}", + "{user} has created a new row {row} in table {table}" : "{user} criou uma nova linha {row} na tabela {table}", + "You have deleted the row {row} in table {table}" : "Você excluiu a linha {row} na tabela {table}", + "{user} has deleted the row {row} in table {table}" : "{user} excluiu a linha {row} na tabela {table}", + "You have imported file to table {table}" : "Você importou o arquivo para a tabela {table}", + "{user} has imported file to table {table}" : "{user} importou o arquivo para a tabela {table}", + "Found columns: {foundColumnsCount}" : "Colunas encontradas: {foundColumnsCount}", + "Matching columns: {matchingColumnsCount}" : "Colunas correspondentes: {matchingColumnsCount}", + "Created columns: {createdColumnsCount}" : "Colunas criadas: {createdColumnsCount}", + "Inserted rows: {insertedRowsCount}" : "Linhas inseridas: {insertedRowsCount}", + "Updated rows: {updatedRowsCount}" : "Linhas atualizadas: {updatedRowsCount}", + "Value parsing errors: {errorsParsingCount}" : "Erros na análise de valores: {errorsParsingCount}", + "Row creation errors: {errorsCount}" : "Erro na criação de linhas: {errorsCount}", + "Tables" : "Tabelas", + "A table or row was changed" : "Uma tabela ou linha foi alterada", + "Nextcloud Tables" : "Nextcloud Tabelas", + "Select table" : "Selecionar tabela", + "Select columns" : "Selecionar colunas", + "e.g. 1,2,4 or leave empty" : "p. ex., 1,2,4 ou deixe vazio", + "Timestamp of data load" : "Marca temporal do carregamento de dados", "No" : "Não", "Yes" : "Sim", + "Count" : "Número", + "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Um erro inesperado ocorreu. Mais detalhes podem ser encontrados nos logs. Entre em contato com sua administração.", + "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocorreu um erro de permissão. Mais detalhes podem ser encontrados nos logs. Entre em contato com sua administração.", + "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Ocorreu um erro não encontrado. Mais detalhes podem ser encontrados nos logs. Entre em contato com sua administração.", + "Could not create row." : "Não foi possível criar a linha.", + "Could not update row." : "Não foi possível atualizar a linha.", "The file was uploaded" : "O ficheiro foi carregado", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "O ficheiro carregado excede a diretiva upload_max_filesize no php.ini ", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "O ficheiro carregado excede a diretiva MAX_FILE_SIZE especificada no formulário HTML", @@ -10,118 +43,625 @@ "Could not write file to disk" : "Não foi possível escrever o ficheiro no disco.", "A PHP extension stopped the file upload" : "Uma extensão PHP parou o carregamento do ficheiro", "No file uploaded or file size exceeds maximum of %s" : "Nenhum ficheiro carregado ou o tamanho do ficheiro excede o máximo de%s", + "Deleted team %s." : "Equipe %s excluída.", + "Nextcloud tables" : "Nextcloud Tabelas", + "table" : "tabela", + "table view" : "Visualização de tabela", + "Column width must be between %1$s and %2$s." : "A largura da coluna deve estar entre %1$s e %2$s.", + "This column was automatically created by the import service." : "Esta coluna foi criada automaticamente pelo serviço de importação.", + "Column \"%s\" contains a non-unique value." : "A coluna \"%s\" contém um valor não único.", + "Welcome to %s Tables!" : "Bem-vindo ao %s Tabelas!", "ToDo list" : "Lista ToDo", + "Setup a simple todo-list." : "Criar uma lista de tarefas simples", "Members" : "Membros", + "List of members with some basic attributes." : "Lista de membros com alguns atributos básicos", + "Customers" : "Clientes", + "Manage your customers." : "Gerencie seus clientes.", + "Vacation requests" : "Pedidos de férias", + "Use this table to collect and manage vacation requests." : "Use esta tabela para coletar e gerenciar pedidos de férias.", + "Weight tracking" : "Acompanhamento de peso", + "Track your weight and other health measures." : "Acompanhe seu peso e outras medidas de saúde.", "Date" : "Data", "Weight" : "Peso", "Body fat" : "Gordura corporal", + "Feeling over all" : "Sentimento geral", "Comments" : "Comentários", + "feel sick" : "sentindo doente", + "party-time" : "vontade de festejar", "Name" : "Nome", + "Account manager" : "Gerente de contas", + "Contract type" : "Tipo de contrato", + "Contract start" : "Início do contrato", + "Contract end" : "Fim do contrato", "Description" : "Descrição", + "Contact information" : "Informações de contato", + "Quality of relationship" : "Qualidade do relacionamento", "Comment" : "Comentário", + "Dog" : "Cachorro", + "Dog food every week" : "Ração para cachorro toda semana", + "The dog is our best friend." : "O cão é nosso melhor amigo.", + "Standard, SLA Level 2" : "Padrão, ANS Nível 2", + "Likes treats" : "Gosta de guloseimas", + "Cat" : "Gato", + "Cat food every week" : "Ração para gato toda semana", + "The cat is also our best friend." : "O gato é nosso melhor amigo também.", + "Standard, SLA Level 1" : "Padrão, ANS Nível 1", + "New customer, let's see if there is more." : "Novo cliente, vamos ver se há mais.", + "Horse" : "Cavalo", + "Summer only" : "Somente no verão", + "Special" : "Especial", + "Employee name" : "Nome do funcionário", "from" : "De", + "When is your vacation starting?" : "Quando começam suas férias?", "to" : "Para", + "When is your vacation ending?" : "Quando terminam suas férias?", + "Number of working days" : "Número de dias úteis", + "How many working days are included?" : "Quantos dias úteis estão incluídos?", + "Request date" : "Data do pedido", "Approved" : "Aprovado", + "Approve date" : "Aprovar data", + "Approved by" : "Aprovado por", + "The Boss" : "O Chefe", + "Bob will help for this time" : "Bob ajudará nesse tempo", + "We have to talk about that." : "Temos que falar sobre isso.", + "Create Vacation Request" : "Criar Pedido de Férias", + "Open Request" : "Abrir Pedido", + "Request Status" : "Status do Pedido", + "Closed requests" : "Pedidos encerrados", "Position" : "Position", + "Skills" : "Habilidades", "Birthday" : "Aniversário", + "Santa Claus" : "Papai Noel", + "Make happy people" : "Fazer pessoas felizes", + "Task" : "Tarefa", + "Title or short description" : "Título ou descrição breve", "Target" : "Objetivo", + "Date, time or whatever" : "Data, hora ou o que for", "Progress" : "Progresso", + "Proofed" : "Verificado", + "Create initial milestones" : "Criar marcos iniciais", + "Create some milestones to structure the project." : "Crie alguns marcos para estruturar o projeto.", + "Plan to discuss for the kickoff meeting." : "Plano a ser discutido na reunião inicial.", + "Wow, that was hard work, but now it's done." : "Uau, foi um trabalho árduo, mas agora está pronto.", + "Kickoff meeting" : "Reunião inicial", + "Project is kicked-off and we know the vision and our first tasks." : "O projeto é iniciado e conhecemos a visão e nossas primeiras tarefas.", + "That was nice in person again. We collected some action points, had a look at the documentation..." : "Foi bom estar pessoalmente de novo. Coletamos alguns pontos de ação, demos uma olhada na documentação...", + "Set up some documentation and collaboration tools" : "Configure algumas ferramentas de documentação e colaboração", + "Where and in what way do we collaborate?" : "Onde e de que forma podemos colaborar?", + "We know what we are doing." : "Sabemos o que estamos fazendo.", + "We have heard that %s could be a nice solution for it, should give it a try." : "Ouvimos dizer que %s pode ser uma boa solução para isso.", + "Add more actions" : "Adicionar mais ações", + "What" : "O que", + "How to do" : "Como fazer", + "Ease of use" : "Facilidade de uso", "Done" : "Concluído", + "Open the tables app" : "Abrir o aplicativo tabelas", + "Reachable via the Tables icon in the apps list." : "Acessível por meio do ícone Tabelas na lista de aplicativos.", + "Add your first row" : "Adicionar sua primeira linha", + "Use the *+ Create row* button and enter some data inside of the form." : "Use o botão *+ Criar linha* e insira alguns dados dentro do formulário.", + "Edit a row" : "Modificar uma linha", + "Go to a row you want to edit and use the *pencil* edit button. Maybe you want to add a *Done* status to this row?" : "Vá até a linha que deseja editar e use o botão de edição *lápis*. Talvez você queira adicionar um status *Concluído* a essa linha?", + "Add a new column" : "Adicionar uma nova coluna", + "You can add, remove and adjust columns as you need. Open the three-dot-menu on the upper right of this table and choose *Create column*. Fill in the data you want, at least a title and column type." : "Você pode adicionar, remover e ajustar colunas conforme sua necessidade. Abra o menu de três pontos no canto superior direito desta tabela e selecione *Criar coluna*. Preencha os dados que você deseja, pelo menos um título e um tipo de coluna.", + "Create views for tables" : "Criar visualizações para tabelas", + "Filter data and save table presets as views to share and combine them into applications." : "Filtre dados e salve predefinições para tabelas como visualizações para compartilhá-las e combiná-las em aplicativos.", + "Create applications" : "Criar aplicativos", + "Combine different tables and views into no-code applications for any purpose. This makes them easily accessible directly in the app bar." : "Combine tabelas e visualizações diferentes em aplicativos sem código para qualquer finalidade. Isso os torna facilmente acessíveis diretamente na barra de aplicativos.", + "Read the docs" : "Ler a documentação", + "If you want to go through the documentation, it can be found here: [Nextcloud Tables documentation](%s)" : "Se você quiser consultar a documentação, ela pode ser encontrada aqui: [documentação de Nextcloud Tabelas](%s)", + "Check yourself!" : "Verifique você mesmo!", + "All tables, columns, rows, contexts, and sharing information including all tables owned or shared, their structure and content" : "Todas as tabelas, colunas, linhas, contextos e informações compartilhadas, incluindo todas as tabelas pertencentes ou compartilhadas, sua estrutura e conteúdo", + "Manage data the way you need it." : "Gerencie os dados da maneira que você precisa.", + "Manage data the way you need it.\n\nWith this app you are able to create your own tables with individual columns. You can start with a template or from scratch and add your wanted columns.\nYou can choose from the following column types:\n- Text line or rich text\n- Link to urls or other nextcloud resources\n- Numbers\n- Progress bar\n- Stars rating\n- Yes/No tick\n- Date and/or time\n- (Multi) selection\n- Users, groups and teams\n\nShare your tables and views with users and groups within your cloud.\n\nHave a good time and manage whatever you want." : "Gerencie os dados da maneira que você precisa.\n\nCom este aplicativo, você pode criar suas próprias tabelas com colunas individuais. Você pode começar com um modelo ou do zero e adicionar as colunas desejadas.\nVocê pode escolher entre os seguintes tipos de coluna:\n- Linha de texto ou texto rich\n- Vincula URLs ou outros recursos do Nextcloud\n- Números\n- Barra de progresso\n- Classificação por estrelas\n- Marcador Sim/Não\n- (Multi-)seleção\n- Usuários, grupos e equipes\n\nCompartilhe suas tabelas e visualizações com usuários e grupos na sua nuvem.\n\nDivirta-se e administre o que quiser.", + "Table" : "Tabela", "View" : "Ver", "Today" : "Hoje", + "Last edit" : "Última edição", "Create" : "Criar", + "Column ID" : "ID da coluna", + "Table ID" : "ID da tabela", "Text" : "Texto", "Link" : "Link", + "Number" : "Número", + "Stars rating" : "Classificação por estrelas", + "Progress bar" : "Barra de progresso", "Selection" : "Seleção", + "Date and time" : "Data e hora", + "Users and groups" : "Usuários e grupos", + "Relation" : "Relação", + "Column type" : "Tipo de coluna", "Move" : "Mover", "Metadata" : "Metadados", "Move up" : "Mover para cima", "Move down" : "Mover para baixo", + "Rules are applied in order. The first rule sorts all rows, and any additional rules determine the order within any group of rows that share the same value." : "As regras são aplicadas em ordem. A primeira regra ordena todas as linhas, e quaisquer regras adicionais determinam a ordem dentro de qualquer grupo de linhas que compartilhem o mesmo valor.", "Read only" : "Apenas leitura", + "Mandatory" : "Obrigatório", + "JJJJ-MM-DD hh:mm" : "AAAA-MM-DD hh:mm", + "JJJJ-MM-DD" : "AAAA-MM-DD", + "Search Value" : "Pesquisar Valor", + "Column" : "Coluna", "Operator" : "Operador", + "Delete filter" : "Excluir filtro", + "Filtering rows" : "Filtrar linhas", + "OR" : "OU", + "Add new filter group" : "Adicionar novo grupo de filtros", + "... that meet all of the following conditions" : "... que satisfazem todas as condições a seguir", + "Add new filter" : "Adicionar novo filtro", "Ascending" : "Ascending", "Descending" : "Descending", + "Reactivate sorting rule" : "Reativar regra de ordenação", + "Delete sorting rule" : "Excluir regra de ordenação", + "Among the sorting rules are some to which you have no permissions. However, if you like, you can override the sorting." : "Entre as regras de ordenação estão algumas para as quais você não tem permissão. No entanto, se desejar, você pode sobrescrever a ordenação.", + "Updated table \"{emoji}{table}\"." : "Tabela \"{emoji}{table}\" atualizada.", + "Cannot update table. Title is missing." : "Não é possível atualizar a tabela. O título está faltando.", + "Could not fetch shares." : "Não foi possível buscar os compartilhamentos.", "Views" : "Vistas", + "Create view" : "Criar visualização", + "Rows" : "Linhas", + "Columns" : "Colunas", + "Last edited" : "Última edição", "Shares" : "Partilhas", "Actions" : "Ações", + "Edit view" : "Editar visualização", "Share" : "Partilhar", "Integration" : "Integração", + "Delete view" : "Excluir visualização", "Total" : "Total", "Data" : "Dados", + "Manage table" : "Gerenciar tabela", + "Edit table" : "Editar tabela", + "Create column" : "Criar coluna", "Import" : "Importar", + "Export all rows" : "Exportar todas as linhas", + "Export filtered rows" : "Exportar linhas filtradas", + "Filtered view" : "Visualização filtrada", + "Reset local adjustments" : "Redefinir ajustes locais", + "We need at least one column, please be so kind and create one." : "Precisamos de pelo menos uma coluna, por favor, faça a gentileza de criar uma.", + "No columns selected" : "Nenhuma coluna selecionada", + "The view is empty. Edit which columns should be displayed." : "A visualização está vazia. Edite quais colunas devem ser exibidas.", + "Your access was revoked. Reload the page to update your permissions." : "Seu acesso foi revogado. Atualize a página para renovar suas permissões.", + "Manage view" : "Gerenciar visualização", + "Please insert a title for the new column." : "Por favor, insira um título para a nova coluna.", + "Cannot save column. Column width must be between {min} and {max}." : "Não é possível salvar a coluna. A largura da coluna deve estar entre {min} e {max}. ", + "You need to select a type for the new column." : "Você precisa selecionar um tipo para a nova coluna.", + "Please select a relation type." : "Selecione um tipo de relação.", + "Please select a target." : "Selecione um destino.", + "Please select a label for relation selection." : "Selecione um rótulo para a seleção de relações.", + "The column \"{column}\" was created." : "A coluna \"{column}\" foi criada.", + "Sorry, something went wrong." : "Desculpe, algo deu errado.", + "Could not create new column." : "Não foi possível criar nova coluna.", "Type" : "Tipo", + "Text line" : "Linha de texto", "Simple text" : "Texto simples", + "Rich text" : "Texto rich", + "Multiple selection" : "Seleção múltipla", + "Yes/No" : "Sim/Não", "Time" : "Tempo", + "Add more" : "Adicionar mais", "Save" : "Guardar", + "The title character limit is 200 characters. Please use a shorter title." : "O limite de caracteres do título é de 200 caracteres. Por favor, use um título mais curto.", + "Cannot create new application. Title is missing." : "Não é possível criar um novo aplicativo. Falta o título.", + "Could not create new application" : "Não foi possível criar novo aplicativo", + "Create an application" : "Criar um aplicativo", "Title" : "Título", + "Select icon for the application" : "Selecione um ícone para o aplicativo", + "Select icon" : "Selecionar ícone", + "Title of the new application" : "Título do novo aplicativo", + "Description of the new application" : "Descrição do novo aplicativo", "Resources" : "Recursos", + "Show in app list" : "Mostrar na lista de aplicativos", + "This can be overridden by a per-account preference" : "Isso pode ser substituído por uma preferência por conta", + "Create application" : "Criar aplicativo", + "Fill form" : "Preencher formulário", + "Create row" : "Criar linha", + "Fill form again" : "Preencher formulário novamente", "Submit" : "Submeter", + "Row successfully created." : "Linha criada com sucesso.", + "Could not create new row" : "Não foi possível criar uma nova linha", + "\"{columnTitle}\" should not be empty" : "\"{columnTitle}\" não deve estar vazio", + "Save row" : "Salvar linha", + "Cannot create new table. Title is missing." : "Não é possível criar nova tabela. Está faltando o título.", + "Could not create new table" : "Não foi possível criar nova tabela", + "Could not load templates." : "Não foi possível carregar os models.", + "Create table" : "Criar tabela", + "Select emoji for table" : "Selecione emoji para tabela", + "Select emoji" : "Selecionar emoji", + "🔧 Custom table" : "🔧 Tabela personalizada", + "Custom table from scratch." : "Tabela personalizada do zero.", + "📄 Import table" : "📄 Importar tabela", + "Import table from file." : "Importar tabela de um arquivo.", + "📄 Import Scheme" : "📄 Importar esquema", + "Import Scheme from file." : "Importar Esquema de um arquivo.", + "Are you sure you want to delete column \"{column}\"?" : "Tem certeza de que você quer excluir a coluna \"{column}\"?", + "Error occurred while deleting column \"{column}\"." : "Ocorreu um erro ao excluir a coluna \"{column}\".", "Delete column" : "Eliminar coluna", + "Do you really want to delete the application \"{context}\"? This will also delete the shares and unshare the resources that are connected to this application." : "Você realmente deseja excluir o aplicativo \"{context}\"? Isso também excluirá os compartilhamentos e descompartilhará os recursos conectados a este aplicativo.", + "Application \"{context}\" removed." : "Aplicativo \"{context}\" removido.", + "Confirm application deletion" : "Confirmar exclusão do aplicativo", "Cancel" : "Cancelar", "Delete" : "Apagar", + "Error occurred while deleting rows." : "Ocorreu um erro ao excluir linhas.", + "Do you really want to delete the table \"{table}\"? This will also delete all data, views and shares that are connected to this table." : "Tem certeza que você quer excluir a tabela \"{table}\"? Isso também afetará todos os dados, visualizações e compartilhamentos que estão conectados a esta tabela.", + "Table \"{emoji}{table}\" removed." : "Tabela \"{emoji}{table}\" removida.", + "Confirm table deletion" : "Confirmar exclusão da tabela", + "Do you really want to delete the view \"{view}\"?" : "Você realmente deseja excluir a visualização \"{view}\"?", + "View \"{emoji}{view}\" removed." : "Visualização \"{emoji}{view}\" excluída.", + "Confirm view deletion" : "Confirmar exclusão da visualização", + "Cannot update column. Title is missing." : "Não é possível atualizar a coluna. Está faltando o título.", + "The column \"{column}\" was updated." : "A coluna \"{column}\" foi atualizada.", + "Edit column" : "Editar coluna", + "Cannot update application. Title is missing." : "Não é possível atualizar o aplicativo. Falta o título.", + "Updated application \"{contextTitle}\"." : "Aplicativo \"{contextTitle}\" atualizado.", + "Edit application" : "Editar aplicativo", + "Select an icon for application" : "Selecione um ícone para o aplicativo", + "Description of the application" : "Descrição do aplicativo", + "I really want to delete this application!" : "Eu realmente quero excluir este aplicativo!", + "Transfer application" : "Transferir aplicativo", + "Edit row" : "Editar linha", "Edit" : "Editar", "Activity" : "Atividade", + "I really want to delete this row!" : "Eu realmente quero excluir esta linha!", + "Column order" : "Ordem da coluna", + "Default sorting" : "Ordenação padrão", "Manage" : "Gerir", "Owner" : "Proprietário", + "I really want to delete this table!" : "Eu realmente quero excluir esta tabela!", + "Change owner" : "Alterar proprietário", + "Could not create table" : "Não foi possível criar a tabela", + "File import started, this might take a while. You will be notified once it finished." : "A importação do arquivo foi iniciada; ela pode demorar um pouco. Você será notificado assim que terminar.", + "You must select an existing table" : "Você deve selecionar uma tabela existente", + "Could not import data to table" : "Não foi possível importar dados para a tabela", + "Import file into Tables" : "Importar arquivo para Tabelas", + "Import as new table" : "Importar como nova tabela", + "This will create a new table from the data in this file." : "Isso criará uma nova tabela com os dados deste arquivo.", + "Import into existing table" : "Importar para tabela existente", + "This will import the data from this file into an already existing table." : "Isto importará os dados deste arquivo para uma tabela já existente.", + "Select the table to import into" : "Selecione a tabela para importar", + "Select an existing table" : "Selecione uma tabela existente", + "Create missing columns" : "Criar colunas ausentes", + "Import successful" : "Importação bem-sucedida", "Close" : "Fechar", + "Could not import data due to unknown errors." : "Não foi possível importar dados devido a erros desconhecidos.", + "Import table" : "Importar tabela", + "Preview imported table" : "Visualizar tabela importada", + "The selected file is not supported." : "O arquivo selecionado não é compatível.", "Please select a file." : "Por favor, selecione um ficheiro.", + "Please select column for mapping." : "Por favor, selecione a coluna para mapeamento.", + "Cannot map same exist column for multiple columns." : "Não é possível mapear a mesma coluna existente para diversas colunas.", + "Could not import, not authorized. Are you logged in?" : "Não foi possível importar, não autorizado. Você está logado?", + "Could not import, missing needed permission." : "Não foi possível importar, falta de permissões necessárias.", + "Could not import, needed resources were not found." : "Não foi possível importar, os recursos necessários não foram encontrados.", + "Add data to the table from a file" : "Adicionar dados à tabela a partir de um arquivo", "Select from Files" : "Selecione dos ficheiros", + "Upload from device" : "Carregar do dispositivo", + "Supported formats: xlsx, xls, csv, html, xml" : "Formatos suportados: xlsx, xls, csv, html, xml", + "First row of the file must contain column headings without gaps." : "A primeira linha do arquivo deve conter os títulos das colunas sem espaços.", "Preview" : "Pré-visualizar", + "Importing data from " : "Importando dados de", + "This might take a while..." : "Isso pode demorar um pouco...", + "Failed" : "Falhou", + "Loading table data" : "Carregando dados da tabela", + "ID (Meta)" : "ID (Meta)", + "Create new column" : "Criar nova coluna", + "Import to existing column" : "Importar para coluna existente", + "Existing column" : "Coluna existente", + "Ignore column" : "Ignorar coluna", + "Result" : "Resultado", + "Found columns" : "Colunas encontradas", + "Matching columns" : "Colunas correspondentes", + "Created columns" : "Colunas criadas", + "Inserted rows" : "Linhas coladas", + "Updated rows" : "Linhas atualizadas", + "Row creation errors" : "Erros de criação de linhas", + "Import scheme" : "Importar esquema", + "Context \"{name}\" transferred to {user}" : "Contexto \"{name}\" transferido para {user}", + "Transfer the application \"{context}\" to another user" : "Transferir o aplicativo \"{context}\" para outro usuário", "Transfer" : "Transfere", + "Table \"{emoji}{table}\" transferred to {user}" : "Tabela \"{emoji}{table}\" transferida para {user}", + "Transfer table" : "Transferir tabela", + "Transfer this table to another user" : "Transferir esta tabela para outro usuário", + "Create View" : "Criar Visualização", + "Save modified View" : "Salvar Visualização modificada", + "Save View" : "Salvar Visualização", + "Save as new view" : "Salvar como nova visualização", + "Cannot create view." : "Não é possível criar visualização.", + "Cannot update view." : "Não é possível atualizar visualização.", + "Title is missing." : "Título está faltando.", + "Could not create new view" : "Não foi possível criar nova visualização", + "Could not update view" : "Não foi possível atualizar visualização", + "Select emoji for view" : "Selecione emoji para visualização", + "Title of the new view" : "Título da nova visualização", "Filter" : "Filtro", "Sort" : "Ordenar", + "Delete application" : "Excluir aplicativo", + "Do you really want to delete the table \"{table}\"?" : "Você realmente deseja excluir a tabela \"{table}\"?", "Export" : "Exportar", + "Add to favorites" : "Adicionar aos favoritos", "Remove from favorites" : "Remover dos favoritos", + "Archive table" : "Arquivar tabela", + "Unarchive table" : "Desarquivar tabela", + "Delete table" : "Excluir tabela", "Copy" : "copiar", + "Could not configure new view" : "Não foi possível configurar nova visualização", + "Duplicate view" : "Duplicar visualização", + "Filter items" : "Filtrar itens", "Favorites" : "Favoritos", + "Archived tables" : "Tabelas arquivadas", + "Applications" : "Aplicativos", + "Your results are filtered." : "Seus resultados são filtrados.", "Clear filter" : "Limpar filtro", + "Share with accounts, groups or teams" : "Compartilhar com contas, grupos ou equipes", + "Share with accounts or groups" : "Compartilhar com contas ou grupos", + "User, group or team …" : "Usuário, grupo ou equipe …", + "User or group …" : "Usuário ou grupo …", + "Failed to fetch share recommendations" : "Falha ao buscar recomendações de compartilhamento", "No recommendations. Start typing." : "Nenhuma recomendação. Comece a escrever ", + "Receiver type" : "Tipo de destinatário", + "Create time" : "Data de criação", + "Share ID" : "ID do compartilhamento", "Copy internal link to clipboard" : "Copiar ligação interna para a área de transferência", + "Only works for users with access to this view" : "Funciona apenas para usuários com acesso a esta visualização", "Internal link" : "Ligação interna", + "Any application created by a demoted share recipients using a shared table will continue to consume its data." : "Qualquer aplicativo criado por um destinatário de compartilhamento rebaixado usando uma tabela compartilhada continuará a consumir seus dados.", "group" : "grupo", + "team" : "equipe", + "Table manager" : "Gerente de tabela", + "Permissions" : "Permissões", + "Read data" : "Ler dados", + "Create data" : "Criar dados", + "Update data" : "Atualizar dados", "Delete data" : "Apagar dados", + "Promote to table manager" : "Promover para gerente de tabela", + "Demote to normal share" : "Rebaixar para compartilhamento normal", + "Open main table to adjust table management permissions" : "Abrir tabela principal para ajustar gerenciamento de permissões da tabela", + "No shares" : "Sem compartilhamentos", + "After the promotion of the share recipient to table manager, any applications created by share recipients that utilise this table will continue to access its data, even if you later demote them." : "Após a promoção do destinatário do compartilhamento a gerente de tabela, todos os aplicativos criados pelos destinatários do compartilhamento que utilizam esta tabela continuarão a acessar seus dados, mesmo que você os rebaixe posteriormente.", "View only" : "Visualizar apenas", "Can edit" : "Pode editar", + "Custom permissions" : "Permissões personalizadas", + "Quick share options, current: {option}" : "Opções de compartilhamento rápido, atualmente: {option}", "Read" : "Ler", "Update" : "Atualizar", + "Error creating link share" : "Erro ao criar o compartilhamento por link", + "Error deleting link share" : "Erro ao excluir o compartilhamento por link", "Link copied to clipboard" : "Ligação copiada para a área de transferência", + "Error copying link" : "Erro ao copiar o compartilhamento por link", + "Error copying password" : "Erro ao copiar a senha", "Create public link" : "Criar link público", + "Create a new share link" : "Criar um novo link de compartilhamento", "Set password" : "Definir palavra-passe", "Password" : "Password", "Share link" : "Partilhar ligação", + "Copy public share link" : "Copiar link de compartilhamento público", + "Delete link" : "Excluir link", + "Public links" : "Links públicos", + "No view in context" : "Nenhuma visualização no contexto", + "From {ownerName}" : "De {ownerName}", "Created at" : "Criado em", + "Ownership" : "Proprietário", + "View ID" : "ID da visualização", "Sharing" : "Partilha", + "API" : "API", + "This is your API endpoint for this view" : "Este é o endpoint da API desta visualização", "Copy to clipboard" : "Copiar para área de transferência", + "Your permissions" : "Suas permissões", + "This application could not be found" : "Este aplicativo não pôde ser encontrado", + "Some resources in this application could not be loaded" : "Alguns recursos deste aplicativo não puderam ser carregados", + "Create new table" : "Criar nova tabela", "Searching …" : "À procura …", "No elements found." : "Não foram encontrados elementos.", + "Select a table or view" : "Selecionar uma tabela ou visualização", + "No selected resources" : "Nenhum recurso selecionado", + "Shared resources permissions" : "Permissões de recursos compartilhados", + "Read resource" : "Ler recurso", + "Create resource" : "Criar recurso", + "Update resource" : "Atualizar recurso", + "Delete resource" : "Excluir recurso", + "No shared resources" : "Sem recursos compartilhados", + "Share with accounts" : "Compartilhar com contas", "Error" : "Erro", + "Could not load editor, text not available." : "Não foi possível carregar editor, texto não disponível.", + "Icon {iconName} loading" : "Ícone {iconName} carregando", "Download" : "Transferir", + "Create rows" : "Criar linhas", + "You can add one or more replies." : "Você pode adicionar uma ou mais respostas.", + "You are not allowed to read this table, but you can still create rows." : "Você não tem permissão para ler essa tabela, mas ainda pode criar linhas.", + "No permissions" : "Sem permissões", + "You have no permissions for this table." : "Você não tem permissões para esta tabela.", "Search" : "Pesquisa sobre", + "Clear value" : "Limpar valor", "URL" : "URL", + "Could not load link provider results." : "Não foi possível carregar os resultados do provedor de links.", + "Url" : "Url", + "Invalid protocol. Allowed: {allowed}" : "Protocolo inválido. Permitido: {allowed}", + "Link providers" : "Provedores de links", + "This option is outdated." : "Esta opção está desatualizada.", "Options" : "Opções", + "This relation does not exist anymore." : "Essa relação não existe mais.", + "Select relation value" : "Selecione o valor da relação", + "Set {star} stars" : "Definir {star} estrelas", + "Cell input" : "Entrada de célula", "Back" : "Voltar", + "Select operator" : "Selecione operador", + "Search for value" : "Pesquisar por valor", + "Select options" : "Selecione opções", + "Keyword and submit" : "Palavra-chave e enviar", + "Or use magic values" : "Ou usar valores mágicos", + "Unpin column" : "Desfixar coluna", + "Pin column" : "Fixar coluna", "Sorting" : "Ordenação", + "Sort asc" : "Ordenar asc", + "Sort desc" : "Ordenar desc", + "Filtering" : "Filtros", + "Select Operator" : "Selecione Operador", + "Select value" : "Selecione valor", + "Column manage actions" : "Ações de gerenciamento de coluna", + "Hide column" : "Ocultar coluna", + "Copy row" : "Copiar linha", "Undo" : "Desfazer", "Redo" : "Repetir", "Bold" : "Negrito", "Italic" : "Itálico", + "Bullet list" : "Lista de pontos", + "Ordered list" : "Lista ordenada", + "Strike" : "Tachado", + "Heading 1" : "Título 1", "Heading 2" : "Título 2", "Heading 3" : "Título 3", + "Code" : "Código", + "Task list" : "Lista de tarefas", + "Set today as default" : "Definir hoje como padrão", + "Set now as default" : "Definir agora como padrão", + "Enter a column title" : "Insira um título de coluna", + "Column width" : "Largura da coluna", + "Enter a column width between {min} and {max}" : "Insira uma largura da coluna entre {min} e {max}", + "Add column to other views" : "Adicionar coluna para outras visualizações", + "The default value is lower than the minimum allowed value." : "O valor padrão é menor do que o valor mínimo permitido.", + "The default value is greater than the maximum allowed value." : "O valor padrão é maior do que o valor máximo permitido.", + "Default value" : "Valor padrão", + "Decimals" : "Decimais", + "Maximum" : "Máximo", "Prefix" : "Prefixo", "Suffix" : "Sufixo", "Default" : "Predefinido", + "Reduce stars" : "Menos estrelas", + "Relation type" : "Tipo de relação", + "Select relation type" : "Selecione o tipo de relação", + "Select target" : "Selecione o destino", + "Label for relation selection" : "Rótulo para seleção de relação", + "Select label for relation selection" : "Selecione o rótulo para a seleção da relação", + "Only text and number columns can be used as label" : "Apenas colunas de texto e de números podem ser usadas como rótulo", + "First option" : "Primeira opção", + "Second option" : "Segunda opção", + "Delete option" : "Excluir opção", + "Add option" : "Adicionar opção", + "You can set a default value by clicking on one of the radio buttons next to the label fields." : "Você pode definir um valor padrão clicando em um dos botões de opção ao lado dos campos de rótulo.", + "You can set default values by marking the checkboxes next to the label fields." : "Você pode definir valores padrão marcando as caixas de seleção ao lado dos campos de rótulo.", + "Allowed pattern (regex)" : "Padrão permitido (expressão regular)", + "Maximum text length" : "Comprimento máximo do texto", + "Unique value" : "Valor único", + "Could not load link providers." : "Não foi possível carregar os provedores de links.", + "Allowed types" : "Tipos permitidos", + "Please select at least one provider." : "Selecione pelo menos um provedor.", + "The provided types depends on your system setup. You can use the same providers like the fulltext-search." : "Os tipos fornecidos dependem da configuração de seu sistema. Você pode usar os mesmos provedores que a pesquisa de texto completo.", + "Select multiple items" : "Selecione vários itens", + "Show user status" : "Mostrar status do usuário", + "Please select a new time" : "Por favor, selecione um novo horário", + "This field is mandatory" : "Este campo é obrigatório", + "You can not insert any links in this field. Please configure at least one link provider in the column configuration." : "Não é possível inserir nenhum link neste campo. Configure pelo menos um provedor de link na configuração da coluna.", "Copy link" : "Copiar hiperligação", + "Open link" : "Abrir link", + "Show fullscreen" : "Mostrar em tela cheia", "Close editor" : "Fechar editor", + "Create Row" : "Criar Linha", + "Export selected rows" : "Exportar linhas selecionadas", + "Uncheck all" : "Desmarcar todos", + "Go to previous page" : "Ir para a página anterior", + "Page" : "Página", + "Page number" : "Número da página", + "Per page" : "Por página", + "Go to next page" : "Ir para a próxima página", + "Go to last page" : "Ir para a última página", + "Confirmation" : "Confirmação", "Confirm" : "Confirmar", + "Could not fetch columns for content preview." : "Não foi possível buscar colunas para visualização do conteúdo.", + "Could not fetch rows for content preview." : "Não foi possível buscar linhas para visualização do conteúdo.", + "Render mode" : "Modo de renderização", "Content" : "Conteúdo", "Select" : "Selecionar", + "Insert" : "Colar", + "Could not load search results." : "Não foi possível carregar resultados da pesquisa.", + "Search for tables and views..." : "Pesquisar tabelas e visualizações…", + "Import into Tables" : "Importar para Tabelas", + "Could not create share." : "Não foi possível criar compartilhamento.", + "Could not create public link." : "Não foi possível criar o link público.", + "Could not update share." : "Não foi possível atualizar compartilhamento.", + "Could not update cell" : "Não foi possível atualizar a célula", + "Filter operator" : "Operador de filtro", + "Contains items" : "Contém intens", + "Contains" : "Contém", + "Does not contain" : "Não contém", + "Begins with" : "Começa com", + "Ends with" : "Termina com", + "Is equal" : "É igual", + "Is not equal" : "Não é igual", + "Is greater than" : "É maior que", + "Is lower than" : "É menor que", + "Is lower than or equal" : "É menor ou igual", + "Is empty" : "É vazio", + "Magic field" : "Campo mágico", + "Me (user ID)" : "Eu (ID de usuário)", + "Me (name)" : "Eu (nome)", + "Checked" : "Marcado", + "Unchecked" : "Não marcado", "This year" : "Este ano", "This month" : "Este mês", "This week" : "Esta semana", "Now" : "Agora", + "Exact date" : "Data exata", + "Select a date" : "Selecione uma data", + "Number of days ahead" : "Número de dias pela frente", + "Enter number of days" : "Insira o número de dias", + "Number of days ago" : "Número de dias atrás", "ID" : "ID", + "Creator" : "Criador", + "Last editor" : "Último editor", + "Last edited at" : "Última edição em", + "Copied to clipboard." : "Copiado para a área de transferência.", "seconds ago" : "segundos atrás", + "{shareTypeString}..." : "{shareTypeString}...", + "Unsupported source: {source}" : "Fonte não compatível: {source}", + "Failed to fetch {shareTypeString}" : "Falha ao buscar {shareTypeString}", + "This {type} could not be found" : "Não foi possível encontrar este {type}", + "An error occurred while loading the {type}" : "Ocorreu um erro ao carregar o {type}", + "Unknown error." : "Erro desconhecido.", + "Request is not authorized. Are you logged in?" : "Solicitação não autorizada. Você está logado?", + "Request not allowed." : "Solicitação não permitida.", + "Resource not found." : "Recurso não encontrado.", + "Could not load columns." : "Não foi possível carregar colunas.", + "Could not insert column." : "Não foi possível colar coluna.", + "Could not update column." : "Não foi possível atualizar coluna", + "Could not remove column." : "Não foi possível remover coluna.", + "Could not load relation data." : "Não foi possível carregar os dados da relação.", + "Could not load rows." : "Não foi possível carregar linhas", + "Outdated data. View is reloaded" : "Dados desatualizados. Visualização é recarregada", + "Could not insert row." : "Não foi possível colar linha.", + "Could not remove row." : "Não foi possível remover linha.", + "Could not verify row. View is reloaded" : "Não foi possível verificar a linha. A visualização foi recarregada.", + "Could not insert table." : "Não foi possível colar tabela.", + "Could not load tables." : "Não foi possível carregar tabelas.", + "Could not fetch tables" : "Não foi possível buscar tabelas", + "Could not load shared views." : "Não foi possível carregar visualizações compartilhadas.", + "Could not load shared views" : "Não foi possível carregar visualizações compartilhadas", + "Could not fetch templates" : "Não foi possível buscar modelos", + "Could not insert view." : "Não foi possível colar visualização.", + "Could not update view." : "Não foi possível atualizar visualização.", + "Could not remove view." : "Não foi possível excluir visualização.", + "Could not reload view." : "Não foi possível recarregar visualização.", + "Could not update table." : "Não foi possível atualizar tabela.", + "Could not mark view as favorite" : "Não foi possível marcar a visualização como favorita", + "Could not remove view from favorites" : "Não foi possível remover a visualização dos favoritos", + "Could not remove table from favorites" : "Não foi possível remover a tabela dos favoritos", + "Could not add application share." : "Não foi possível adicionar o compartilhamento de aplicativo.", + "Could not remove application share." : "Não foi possível remover o compartilhamento de aplicativo.", + "Could not update display mode." : "Não foi possível atualizar o modo de exibição.", + "Could not insert application." : "Não foi possível colar aplicativo.", + "Could not update application." : "Não foi possível atualizar o aplicativo.", + "Could not transfer table." : "Não foi possível transferir tabela.", + "Could not fetch applications" : "Não foi possível buscar aplicativos", + "Could not load application." : "Não foi possível carregar o aplicativo.", + "Could not fetch application" : "Não foi possível buscar o aplicativo", + "Could not load table." : "Não foi possível carregar a tabela.", + "Could not fetch table" : "Não foi possível buscar a tabela", + "Could not load view" : "Não foi possível carregar visualização", + "Could not fetch view" : "Não foi possível buscar visualização", + "Could not verify export permissions." : "Não foi possível verificar as permissões de exportação.", + "Could not transfer application." : "Não foi possível transferir o aplicativo.", + "Could not remove application." : "Não foi possível remover o aplicativo.", + "Could not remove table." : "Não foi possível remover tabela.", "Share not found" : "Partilha não encontrada", + "This share does not exist or is no longer available" : "Este compartilhamento não existe ou não está mais disponível", "Back to %s" : "Voltar para %s" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/ro.js b/l10n/ro.js index fd6bf066ea..5c0fefd6d5 100644 --- a/l10n/ro.js +++ b/l10n/ro.js @@ -5,6 +5,7 @@ OC.L10N.register( "Timestamp of data load" : "Marca temporală a încărcării datelor", "No" : "Nu", "Yes" : "Da", + "Count" : "Număr", "The file was uploaded" : "Fișierul a fost încărcat", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Fișierul încărcat depășește directiva upload_max_filesize din php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Fișierul încărcat depășește directiva MAX_FILE_SIZE specificată în formularul HTML", diff --git a/l10n/ro.json b/l10n/ro.json index 7e49c570a2..3866406cd6 100644 --- a/l10n/ro.json +++ b/l10n/ro.json @@ -3,6 +3,7 @@ "Timestamp of data load" : "Marca temporală a încărcării datelor", "No" : "Nu", "Yes" : "Da", + "Count" : "Număr", "The file was uploaded" : "Fișierul a fost încărcat", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Fișierul încărcat depășește directiva upload_max_filesize din php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Fișierul încărcat depășește directiva MAX_FILE_SIZE specificată în formularul HTML", diff --git a/l10n/ru.js b/l10n/ru.js index cbb0bbaccc..8e3bab5af4 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -9,6 +9,7 @@ OC.L10N.register( "Timestamp of data load" : "Время загрузки данных", "No" : "Нет", "Yes" : "Да", + "Count" : "Количество", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Произошла непредвиденная ошибка. Более подробную информацию можно найти в журналах. Пожалуйста, обратитесь к своему администратору.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Произошла ошибка разрешения. Более подробную информацию можно найти в журналах. Пожалуйста, обратитесь к своему администратору.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Произошла ошибка «не найдено». Более подробную информацию можно найти в журналах. Обратитесь к своей администрации.", @@ -152,7 +153,6 @@ OC.L10N.register( "Edit table" : "Редактировать таблицу", "Create column" : "Создать столбец", "Import" : "Импортировать", - "Export as CSV" : "Экспортировать в файл CSV", "No columns" : "Не создано ни одного столбца", "No columns selected" : "Не выбрано ни одного столюца", "The view is empty. Edit which columns should be displayed." : "Это пустое представление. Настройте набор отображаемых столбцов.", @@ -344,7 +344,6 @@ OC.L10N.register( "Open link" : "Открыть ссылку", "Close editor" : "Закрыть редактор", "Create Row" : "Создать строку", - "Export CSV" : "Экспорт как CSV", "Go to first page" : "Перейти на первую страницу", "Go to previous page" : "Перейти к предыдущей странице", "Page number" : "Номер страницы", diff --git a/l10n/ru.json b/l10n/ru.json index 7019b38c7f..b8fcb915df 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -7,6 +7,7 @@ "Timestamp of data load" : "Время загрузки данных", "No" : "Нет", "Yes" : "Да", + "Count" : "Количество", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Произошла непредвиденная ошибка. Более подробную информацию можно найти в журналах. Пожалуйста, обратитесь к своему администратору.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Произошла ошибка разрешения. Более подробную информацию можно найти в журналах. Пожалуйста, обратитесь к своему администратору.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Произошла ошибка «не найдено». Более подробную информацию можно найти в журналах. Обратитесь к своей администрации.", @@ -150,7 +151,6 @@ "Edit table" : "Редактировать таблицу", "Create column" : "Создать столбец", "Import" : "Импортировать", - "Export as CSV" : "Экспортировать в файл CSV", "No columns" : "Не создано ни одного столбца", "No columns selected" : "Не выбрано ни одного столюца", "The view is empty. Edit which columns should be displayed." : "Это пустое представление. Настройте набор отображаемых столбцов.", @@ -342,7 +342,6 @@ "Open link" : "Открыть ссылку", "Close editor" : "Закрыть редактор", "Create Row" : "Создать строку", - "Export CSV" : "Экспорт как CSV", "Go to first page" : "Перейти на первую страницу", "Go to previous page" : "Перейти к предыдущей странице", "Page number" : "Номер страницы", diff --git a/l10n/si.js b/l10n/si.js index ae5288122f..3dc240dc8d 100644 --- a/l10n/si.js +++ b/l10n/si.js @@ -20,6 +20,7 @@ OC.L10N.register( "Time" : "වේලාව", "Save" : "සුරකින්න", "Cancel" : "අවලංගු කරන්න", + "Delete" : "Delete", "Edit" : "සංස්කරණය", "Activity" : "ක්‍රියාකාරකම", "Owner" : "හිමිකරු", diff --git a/l10n/si.json b/l10n/si.json index 9d721e48bc..09c6ecaf3c 100644 --- a/l10n/si.json +++ b/l10n/si.json @@ -18,6 +18,7 @@ "Time" : "වේලාව", "Save" : "සුරකින්න", "Cancel" : "අවලංගු කරන්න", + "Delete" : "Delete", "Edit" : "සංස්කරණය", "Activity" : "ක්‍රියාකාරකම", "Owner" : "හිමිකරු", diff --git a/l10n/sk.js b/l10n/sk.js index 7bfaf4cf99..38947629bf 100644 --- a/l10n/sk.js +++ b/l10n/sk.js @@ -24,6 +24,7 @@ OC.L10N.register( "Timestamp of data load" : "Časové razítko načítaných údajov", "No" : "Nie", "Yes" : "Áno", + "Count" : "Počet", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Vyskytla sa neočakávaná chyba. Viac podrobností nájdete v protokole. Obráťte sa na svojho administrátora.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Vyskytla sa chyba oprávnenia. Viac podrobností nájdete v protokole. Obráťte sa na svojho administrátora.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Vyskytla sa neočakávaná chyba. Viac podrobností nájdete v protokole. Obráťte sa na svojho administrátora.", @@ -211,7 +212,6 @@ OC.L10N.register( "Edit table" : "Upraviť tabuľku", "Create column" : "Vytvoriť stĺpec", "Import" : "Import", - "Export as CSV" : "Exportovať do CSV", "Filtered view" : "Filtrované zobrazenie", "Reset local adjustments" : "Zahodiť miestne úpravy", "No columns" : "Žiadne stĺpce", @@ -429,6 +429,7 @@ OC.L10N.register( "Set password" : "Nastaviť heslo", "Password" : "Heslo", "Share link" : "Zdieľať odkaz", + "Delete link" : "Odstrániť odkaz", "Public links" : "Verejné odkazy", "No view in context" : "V tomto kontexte nie je žiadny pohľad", "From {ownerName}" : "Od {ownerName}", @@ -541,7 +542,6 @@ OC.L10N.register( "Show fullscreen" : "Zobrazenie na celú obrazovku", "Close editor" : "Zavrieť editor", "Create Row" : "Vytvoriť riadok", - "Export CSV" : "Exportovať CSV", "Uncheck all" : "Odznačiť všetko", "_%n selected row_::_%n selected rows_" : ["%n vybraný riadok","%n vybrané riadky","%n vybraných riadkov","%n vybraných riadkov"], "Go to first page" : "Ísť na prvú stránku", diff --git a/l10n/sk.json b/l10n/sk.json index bff5d46580..7187d2d1fe 100644 --- a/l10n/sk.json +++ b/l10n/sk.json @@ -22,6 +22,7 @@ "Timestamp of data load" : "Časové razítko načítaných údajov", "No" : "Nie", "Yes" : "Áno", + "Count" : "Počet", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Vyskytla sa neočakávaná chyba. Viac podrobností nájdete v protokole. Obráťte sa na svojho administrátora.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Vyskytla sa chyba oprávnenia. Viac podrobností nájdete v protokole. Obráťte sa na svojho administrátora.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Vyskytla sa neočakávaná chyba. Viac podrobností nájdete v protokole. Obráťte sa na svojho administrátora.", @@ -209,7 +210,6 @@ "Edit table" : "Upraviť tabuľku", "Create column" : "Vytvoriť stĺpec", "Import" : "Import", - "Export as CSV" : "Exportovať do CSV", "Filtered view" : "Filtrované zobrazenie", "Reset local adjustments" : "Zahodiť miestne úpravy", "No columns" : "Žiadne stĺpce", @@ -427,6 +427,7 @@ "Set password" : "Nastaviť heslo", "Password" : "Heslo", "Share link" : "Zdieľať odkaz", + "Delete link" : "Odstrániť odkaz", "Public links" : "Verejné odkazy", "No view in context" : "V tomto kontexte nie je žiadny pohľad", "From {ownerName}" : "Od {ownerName}", @@ -539,7 +540,6 @@ "Show fullscreen" : "Zobrazenie na celú obrazovku", "Close editor" : "Zavrieť editor", "Create Row" : "Vytvoriť riadok", - "Export CSV" : "Exportovať CSV", "Uncheck all" : "Odznačiť všetko", "_%n selected row_::_%n selected rows_" : ["%n vybraný riadok","%n vybrané riadky","%n vybraných riadkov","%n vybraných riadkov"], "Go to first page" : "Ísť na prvú stránku", diff --git a/l10n/sl.js b/l10n/sl.js index e21e5d7c38..22b512e543 100644 --- a/l10n/sl.js +++ b/l10n/sl.js @@ -9,6 +9,7 @@ OC.L10N.register( "Timestamp of data load" : "Časovni žig podatkovnega nabora", "No" : "Ne", "Yes" : "Da", + "Count" : "Števec", "Could not create row." : "Vrstice ni mogoče ustvariti.", "Could not update row." : "Vrstice ni mogoče posodobiti.", "The file was uploaded" : "Datoteka je uspešno poslana.", @@ -168,7 +169,6 @@ OC.L10N.register( "Edit table" : "Uredi razpredelnico", "Create column" : "Dodaj stolpec", "Import" : "Uvozi", - "Export as CSV" : "Izvozi v zapis CSV", "Filtered view" : "Filtriran pogled", "Reset local adjustments" : "Počisti krajevne prilagoditve", "No columns" : "Ni stolpcev", @@ -264,6 +264,7 @@ OC.L10N.register( "Copy" : "Kopiraj", "Duplicate view" : "Podvoji pogled", "Favorites" : "Priljubljeno", + "Applications" : "Programi", "Your results are filtered." : "Rezultati so filtrirani.", "Clear filter" : "Počisti filter", "No recommendations. Start typing." : "Ni priporočil; začnite z vpisovanjem", @@ -290,6 +291,7 @@ OC.L10N.register( "Set password" : "Nastavi geslo", "Password" : "Geslo", "Share link" : "Povezava za souporabo", + "Public links" : "Javne povezave", "From {ownerName}" : "Priprava: {ownerName}", "Created at" : "Ustvarjeno", "Ownership" : "Lastništvo", @@ -351,7 +353,6 @@ OC.L10N.register( "This field is mandatory" : "To polje je obvezno", "Copy link" : "Kopiraj povezavo", "Close editor" : "Zapri urejevalnik", - "Export CSV" : "Izvozi CSV", "_%n selected row_::_%n selected rows_" : ["%n izbrana vrstica","%n izbrani vrstici","%n izbrane vrstice","%n izbranih vrstic"], "Confirmation" : "Potrjevanje", "Confirm" : "Potrdi", @@ -372,6 +373,7 @@ OC.L10N.register( "This year" : "Letos", "This month" : "Zadnji mesec", "This week" : "še ta teden", + "Now" : "Zdaj", "Select a date" : "Izbor datuma", "ID" : "ID", "Clipboard is not available" : "Odložišče ni na voljo", diff --git a/l10n/sl.json b/l10n/sl.json index 2a5b55f057..01cde1122d 100644 --- a/l10n/sl.json +++ b/l10n/sl.json @@ -7,6 +7,7 @@ "Timestamp of data load" : "Časovni žig podatkovnega nabora", "No" : "Ne", "Yes" : "Da", + "Count" : "Števec", "Could not create row." : "Vrstice ni mogoče ustvariti.", "Could not update row." : "Vrstice ni mogoče posodobiti.", "The file was uploaded" : "Datoteka je uspešno poslana.", @@ -166,7 +167,6 @@ "Edit table" : "Uredi razpredelnico", "Create column" : "Dodaj stolpec", "Import" : "Uvozi", - "Export as CSV" : "Izvozi v zapis CSV", "Filtered view" : "Filtriran pogled", "Reset local adjustments" : "Počisti krajevne prilagoditve", "No columns" : "Ni stolpcev", @@ -262,6 +262,7 @@ "Copy" : "Kopiraj", "Duplicate view" : "Podvoji pogled", "Favorites" : "Priljubljeno", + "Applications" : "Programi", "Your results are filtered." : "Rezultati so filtrirani.", "Clear filter" : "Počisti filter", "No recommendations. Start typing." : "Ni priporočil; začnite z vpisovanjem", @@ -288,6 +289,7 @@ "Set password" : "Nastavi geslo", "Password" : "Geslo", "Share link" : "Povezava za souporabo", + "Public links" : "Javne povezave", "From {ownerName}" : "Priprava: {ownerName}", "Created at" : "Ustvarjeno", "Ownership" : "Lastništvo", @@ -349,7 +351,6 @@ "This field is mandatory" : "To polje je obvezno", "Copy link" : "Kopiraj povezavo", "Close editor" : "Zapri urejevalnik", - "Export CSV" : "Izvozi CSV", "_%n selected row_::_%n selected rows_" : ["%n izbrana vrstica","%n izbrani vrstici","%n izbrane vrstice","%n izbranih vrstic"], "Confirmation" : "Potrjevanje", "Confirm" : "Potrdi", @@ -370,6 +371,7 @@ "This year" : "Letos", "This month" : "Zadnji mesec", "This week" : "še ta teden", + "Now" : "Zdaj", "Select a date" : "Izbor datuma", "ID" : "ID", "Clipboard is not available" : "Odložišče ni na voljo", diff --git a/l10n/sr.js b/l10n/sr.js index fafc42d40d..5f8264fa71 100644 --- a/l10n/sr.js +++ b/l10n/sr.js @@ -24,6 +24,7 @@ OC.L10N.register( "Timestamp of data load" : "Временска ознака учитавања података", "No" : "Не", "Yes" : "Да", + "Count" : "Бројач", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Дошло је до неочекиване грешке. Више детаља можете да пронађете у дневницима. Молимо вас да се обратите администрацији.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Дошло је до грешке у вези са дозволама. Више детаља можете да пронађете у дневницима. Молимо вас да се обратите администрацији.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Дошло је до грешке непостојања. Више детаља можете да пронађете у дневницима. Молимо вас да се обратите администрацији.", @@ -211,7 +212,6 @@ OC.L10N.register( "Edit table" : "Уреди табелу", "Create column" : "Креирај колону", "Import" : "Увоз", - "Export as CSV" : "Извези као CSV", "Filtered view" : "Филтрирани поглед", "Reset local adjustments" : "Ресетуј локална подешавања", "No columns" : "Нема колона", @@ -542,7 +542,6 @@ OC.L10N.register( "Show fullscreen" : "Прикажи у пуном екрану", "Close editor" : "Затвори едитор", "Create Row" : "Креирај ред", - "Export CSV" : "Извези CSV", "Uncheck all" : "Одштиклирај све", "_%n selected row_::_%n selected rows_" : ["%n изабрани ред","%n изабрана реда","%n изабраних редова"], "Go to first page" : "Иди на прву страницу", diff --git a/l10n/sr.json b/l10n/sr.json index 1472b8e1b4..ac4aceeb2a 100644 --- a/l10n/sr.json +++ b/l10n/sr.json @@ -22,6 +22,7 @@ "Timestamp of data load" : "Временска ознака учитавања података", "No" : "Не", "Yes" : "Да", + "Count" : "Бројач", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Дошло је до неочекиване грешке. Више детаља можете да пронађете у дневницима. Молимо вас да се обратите администрацији.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Дошло је до грешке у вези са дозволама. Више детаља можете да пронађете у дневницима. Молимо вас да се обратите администрацији.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Дошло је до грешке непостојања. Више детаља можете да пронађете у дневницима. Молимо вас да се обратите администрацији.", @@ -209,7 +210,6 @@ "Edit table" : "Уреди табелу", "Create column" : "Креирај колону", "Import" : "Увоз", - "Export as CSV" : "Извези као CSV", "Filtered view" : "Филтрирани поглед", "Reset local adjustments" : "Ресетуј локална подешавања", "No columns" : "Нема колона", @@ -540,7 +540,6 @@ "Show fullscreen" : "Прикажи у пуном екрану", "Close editor" : "Затвори едитор", "Create Row" : "Креирај ред", - "Export CSV" : "Извези CSV", "Uncheck all" : "Одштиклирај све", "_%n selected row_::_%n selected rows_" : ["%n изабрани ред","%n изабрана реда","%n изабраних редова"], "Go to first page" : "Иди на прву страницу", diff --git a/l10n/sv.js b/l10n/sv.js index 06df7ac4df..4578c64184 100644 --- a/l10n/sv.js +++ b/l10n/sv.js @@ -33,6 +33,7 @@ OC.L10N.register( "Timestamp of data load" : "Tidstämpel för datainläsning", "No" : "Nej", "Yes" : "Ja", + "Count" : "Antal", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Ett oväntat fel inträffade. Mer information finns i loggarna. Kontakta din administratör.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "En behörighetsfel uppstod. Mer information finns i loggarna. Kontakta din administratör.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Ett inte hitta-fel uppstod. Mer information finns i loggarna. Kontakta din administratör.", @@ -193,7 +194,8 @@ OC.L10N.register( "Edit table" : "Redigera tabell", "Create column" : "Skapa kolumn", "Import" : "Importera", - "Export as CSV" : "Exportera som CSV", + "Export all rows" : "Exportera alla rader", + "Export filtered rows" : "Exportera filtrerade rader", "Filtered view" : "Filtrerad vy", "Reset local adjustments" : "Återställ lokala justeringar", "No columns" : "Inga kolumner", @@ -489,6 +491,7 @@ OC.L10N.register( "Manage column" : "Hantera kolumn", "Column manage actions" : "Hantera kolumnåtgärder", "Hide column" : "Dölj kolumn", + "Copy row" : "Kopiera rad", "Undo" : "Ångra", "Redo" : "Gör om", "Bold" : "Fet", @@ -542,7 +545,7 @@ OC.L10N.register( "Show fullscreen" : "Visa fullskärm", "Close editor" : "Stäng redigeraren", "Create Row" : "Skapa rad", - "Export CSV" : "Exportera CSV", + "Export selected rows" : "Exportera markerade rader", "Uncheck all" : "Avmarkera alla", "_%n selected row_::_%n selected rows_" : ["%n vald rad","%n valda rader"], "Go to first page" : "Gå till första sidan", diff --git a/l10n/sv.json b/l10n/sv.json index df1ff54f6d..5002da0253 100644 --- a/l10n/sv.json +++ b/l10n/sv.json @@ -31,6 +31,7 @@ "Timestamp of data load" : "Tidstämpel för datainläsning", "No" : "Nej", "Yes" : "Ja", + "Count" : "Antal", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Ett oväntat fel inträffade. Mer information finns i loggarna. Kontakta din administratör.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "En behörighetsfel uppstod. Mer information finns i loggarna. Kontakta din administratör.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Ett inte hitta-fel uppstod. Mer information finns i loggarna. Kontakta din administratör.", @@ -191,7 +192,8 @@ "Edit table" : "Redigera tabell", "Create column" : "Skapa kolumn", "Import" : "Importera", - "Export as CSV" : "Exportera som CSV", + "Export all rows" : "Exportera alla rader", + "Export filtered rows" : "Exportera filtrerade rader", "Filtered view" : "Filtrerad vy", "Reset local adjustments" : "Återställ lokala justeringar", "No columns" : "Inga kolumner", @@ -487,6 +489,7 @@ "Manage column" : "Hantera kolumn", "Column manage actions" : "Hantera kolumnåtgärder", "Hide column" : "Dölj kolumn", + "Copy row" : "Kopiera rad", "Undo" : "Ångra", "Redo" : "Gör om", "Bold" : "Fet", @@ -540,7 +543,7 @@ "Show fullscreen" : "Visa fullskärm", "Close editor" : "Stäng redigeraren", "Create Row" : "Skapa rad", - "Export CSV" : "Exportera CSV", + "Export selected rows" : "Exportera markerade rader", "Uncheck all" : "Avmarkera alla", "_%n selected row_::_%n selected rows_" : ["%n vald rad","%n valda rader"], "Go to first page" : "Gå till första sidan", diff --git a/l10n/sw.js b/l10n/sw.js index 0f5e877b1e..7790e3b3aa 100644 --- a/l10n/sw.js +++ b/l10n/sw.js @@ -8,6 +8,7 @@ OC.L10N.register( "Timestamp of data load" : "Muhuri wa muda wa upakiaji wa data", "No" : "Hapana", "Yes" : "Ndiyo", + "Count" : "Hesabu", "The file was uploaded" : "Faili lilipakiwa", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Faili lililopakiwa linazidi kiwango cha juu cha ukubwa wa faili linalielekea katika php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Faili iliyopakiliwa imezidi kiwango cha ukubwa wa faili iliyoelekezwa maalum katika fomu ya HTML", @@ -64,7 +65,6 @@ OC.L10N.register( "Data" : "Data", "Edit table" : "Hariri jedwali", "Import" : "Import", - "Export as CSV" : "Safirisha kama CSV", "Type" : "Aina", "Simple text" : "Simple text", "Time" : "Muda", @@ -164,7 +164,6 @@ OC.L10N.register( "Open link" : "Fungua kiungio", "Close editor" : "Funga mhariri", "Create Row" : "Create Row", - "Export CSV" : "Export CSV", "Uncheck all" : "Uncheck all", "_%n selected row_::_%n selected rows_" : ["%n selected row","%n selected rows"], "Go to first page" : "Nenda ukurasa wa kwanza", diff --git a/l10n/sw.json b/l10n/sw.json index 95f71d8a2b..ab47bbdc88 100644 --- a/l10n/sw.json +++ b/l10n/sw.json @@ -6,6 +6,7 @@ "Timestamp of data load" : "Muhuri wa muda wa upakiaji wa data", "No" : "Hapana", "Yes" : "Ndiyo", + "Count" : "Hesabu", "The file was uploaded" : "Faili lilipakiwa", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Faili lililopakiwa linazidi kiwango cha juu cha ukubwa wa faili linalielekea katika php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Faili iliyopakiliwa imezidi kiwango cha ukubwa wa faili iliyoelekezwa maalum katika fomu ya HTML", @@ -62,7 +63,6 @@ "Data" : "Data", "Edit table" : "Hariri jedwali", "Import" : "Import", - "Export as CSV" : "Safirisha kama CSV", "Type" : "Aina", "Simple text" : "Simple text", "Time" : "Muda", @@ -162,7 +162,6 @@ "Open link" : "Fungua kiungio", "Close editor" : "Funga mhariri", "Create Row" : "Create Row", - "Export CSV" : "Export CSV", "Uncheck all" : "Uncheck all", "_%n selected row_::_%n selected rows_" : ["%n selected row","%n selected rows"], "Go to first page" : "Nenda ukurasa wa kwanza", diff --git a/l10n/tr.js b/l10n/tr.js index 18801c4101..27555e7c72 100644 --- a/l10n/tr.js +++ b/l10n/tr.js @@ -1,20 +1,29 @@ OC.L10N.register( "tables", { - "You have created a new table {table}" : "{table} tablosunu eklediniz", - "{user} has created a new table {table}" : "{user}, {table} tablosunu ekledi", + "You have created a new table {table}" : "Yeni {table} tablosunu oluşturdunuz", + "{user} has created a new table {table}" : "{user}, yeni {table} tablosunu oluşturdu", "You have deleted the table {table}" : "{table} tablosunu sildiniz", "{user} has deleted the table {table}" : "{user}, {table} tablosunu sildi", "You have renamed the table {before} to {table}" : "{before} tablosunun adını {table} olarak değiştirdiniz", "{user} has renamed the table {before} to {table}" : "{user}, {before} tablosunun adını {table} olarak değiştirdi", "You have updated the description of table {table} to {after}" : "{table} tablosunun açıklamasını {after} olarak güncellediniz", "{user} has updated the description of table {table} to {after}" : "{user}, {table} tablosunun açıklamasını {after} olarak güncelledi", - "You have created a new row {row} in table {table}" : "{table} tablosuna yeni {row} satırını eklediniz", - "{user} has created a new row {row} in table {table}" : "{user}, {table} tablosuna yeni {row} satırını ekledi", + "You have created a new row {row} in table {table}" : "{table} tablosunda yeni {row} satırını oluşturdunuz", + "{user} has created a new row {row} in table {table}" : "{user}, {table} tablosunda yeni {row} satırını oluşturdu", "_You have updated cell %1$s on row {row} in table {table}_::_You have updated cells %1$s on row {row} in table {table}_" : ["{table} tablosunda {row} satırında %1$s hücreyi güncellediniz","{table} tablosunda {row} satırında %1$s hücreyi güncellediniz"], "_{user} has updated cell %1$s on row {row} in table {table}_::_{user} has updated cells %1$s on row {row} in table {table}_" : ["{user} kullanıcısı {table} tablosunda {row} satırında %1$s hücreyi güncelledi","{user} kullanıcısı {table} tablosunda {row} satırında %1$s hücreyi güncelledi"], "You have deleted the row {row} in table {table}" : "{table} tablosundaki {row} satırını sildiniz", "{user} has deleted the row {row} in table {table}" : "{user}, {table} tablosundaki {row} satırını sildi", + "You have imported file to table {table}" : "{table} tablosu içine dosya aktardınız ", + "{user} has imported file to table {table}" : "{user}, {table} tablosu içine dosya aktardı", + "Found columns: {foundColumnsCount}" : "Bulunan sütun: {foundColumnsCount}", + "Matching columns: {matchingColumnsCount}" : "Eşleşen sütun: {matchingColumnsCount}", + "Created columns: {createdColumnsCount}" : "Oluşturulan sütunlar: {createdColumnsCount}", + "Inserted rows: {insertedRowsCount}" : "Eklenen satır: {insertedRowsCount}", + "Updated rows: {updatedRowsCount}" : "Güncellenen satır: {updatedRowsCount}", + "Value parsing errors: {errorsParsingCount}" : "Değer işleme sorunu: {errorsParsingCount}", + "Row creation errors: {errorsCount}" : "Satır oluşturma sorunu: {errorsCount}", "Tables" : "Tablolar", "A table or row was changed" : "Bir tablo ya da satır değiştirildi", "Nextcloud Tables" : "Nextcloud tabloları", @@ -24,6 +33,7 @@ OC.L10N.register( "Timestamp of data load" : "Veri yüklemesinin zaman damgası", "No" : "Hayır", "Yes" : "Evet", + "Count" : "Sayı", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Beklenmeyen bir sorun çıktı. Ayrıntılı bilgi almak için günlük kayıtlarına bakabilirsiniz. Lütfen yöneticiniz ile görüşün.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Bir izin sorunu çıktı. Ayrıntılı bilgi almak için günlük kayıtlarına bakabilirsiniz. Lütfen yöneticiniz ile görüşün.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Bir bulunamama sorunu çıktı. Ayrıntılı bilgi almak için günlük kayıtlarına bakabilirsiniz. Lütfen yöneticiniz ile görüşün.", @@ -38,6 +48,7 @@ OC.L10N.register( "Could not write file to disk" : "Dosya diske yazılamadı", "A PHP extension stopped the file upload" : "Bir PHP eklentisi dosyanın yüklenmesini engelledi", "No file uploaded or file size exceeds maximum of %s" : "Herhangi bir dosya yüklenmedi ya da %s olan en büyük dosya boyutu sınırı aşıldı", + "Deleted team %s." : "%s takımı silindi.", "Nextcloud tables" : "Nextcloud tabloları", "_%n row_::_%n rows_" : ["%n satır","%n satır"], "table" : "tablo", @@ -45,6 +56,7 @@ OC.L10N.register( "Column width must be between %1$s and %2$s." : "Sütun genişliği %1$s ile %2$s arasında olmalıdır.", "This column was automatically created by the import service." : "Bu sütun, içe aktarma hizmeti tarafından otomatik olarak oluşturuldu.", "Column \"%s\" contains a non-unique value." : "\"%s\" sütununda benzersiz olmayan bir değer var.", + "Column \"%s\" contains an invalid protocol. Only http and https are allowed." : "\"%s\" sütunundaki iletişim kuralı geçersiz. Yalnızca http ve https kullanılabilir.", "Welcome to %s Tables!" : "%s tablolar uygulamasına hoş geldiniz!", "ToDo list" : "Yapılacaklar listesi", "Setup a simple todo-list." : "Basit bir yapılacaklar listesi oluşturun", @@ -100,7 +112,7 @@ OC.L10N.register( "Approved by" : "Onaylayan", "The Boss" : "Patron", "Bob will help for this time" : "Bu sürede Bob yardımcı olacak", - "We have to talk about that." : "Bunun hakkında konuşmalıyız.", + "We have to talk about that." : "Bununla ilgili konuşmalıyız.", "Create Vacation Request" : "Tatil isteği oluştur", "Open Request" : "İstek aç", "Request Status" : "İstek durumu", @@ -116,8 +128,8 @@ OC.L10N.register( "Date, time or whatever" : "Tarih, saat ya da her neyse", "Progress" : "İlerleme", "Proofed" : "Kanıtlandı", - "Create initial milestones" : "Başlangıç kilometre taşlarını ekle", - "Create some milestones to structure the project." : "Projeyi yapılandırmak için bazı kilometre taşları ekleyin.", + "Create initial milestones" : "Başlangıç kilometre taşlarını oluştur", + "Create some milestones to structure the project." : "Projeyi yapılandırmak için bazı kilometre taşları oluşturun.", "Plan to discuss for the kickoff meeting." : "Başlangıç toplantısı için görüşme planlayın.", "Wow, that was hard work, but now it's done." : "Çok iş vardı ancak hepsi tamam.", "Kickoff meeting" : "Başlangıç toplantısı", @@ -137,12 +149,12 @@ OC.L10N.register( "Open the tables app" : "Tablolar uygulamasını aç", "Reachable via the Tables icon in the apps list." : "Uygulamalar listesindeki Tablolar simgesinden ulaşılabilir.", "Add your first row" : "İlk satırınızı ekleyin", - "Use the *+ Create row* button and enter some data inside of the form." : "*+ Satır ekle* düğmesini kullanın ve formun içine bazı veriler yazın.", + "Use the *+ Create row* button and enter some data inside of the form." : "*+ Satır oluştur* düğmesini kullanın ve formun içine bazı veriler yazın.", "Edit a row" : "Bir satırı düzenle", "Go to a row you want to edit and use the *pencil* edit button. Maybe you want to add a *Done* status to this row?" : "Düzenlemek istediğiniz satıra gidin ve *kalem* düzenleme düğmesine tıklayın. Belki bu satıra *Tamamlandı* durumu eklemek istersiniz?", "Add a new column" : "Yeni bir sütun ekle", - "You can add, remove and adjust columns as you need. Open the three-dot-menu on the upper right of this table and choose *Create column*. Fill in the data you want, at least a title and column type." : "Gereksinimlerinize göre sütun ekleyebilir, kaldırabilir ve ayarlayabilirsiniz. Bu tablonun sağ üst köşesindeki üç nokta menüsünü açın ve *Sütun ekle* üzerine tıklayın. İstediğiniz verileri, en azından bir başlık ve sütun türünü yazın.", - "Create views for tables" : "Tablolar için görünümler ekleyin", + "You can add, remove and adjust columns as you need. Open the three-dot-menu on the upper right of this table and choose *Create column*. Fill in the data you want, at least a title and column type." : "Gereksinimlerinize göre sütunlar oluşturabilir, kaldırabilir ve ayarlayabilirsiniz. Bu tablonun sağ üst köşesindeki üç nokta menüsünü açın ve *Sütun oluştur* üzerine tıklayın. İstediğiniz verileri, en azından bir başlık ve sütun türünü yazın.", + "Create views for tables" : "Tablolar için görünümler oluşturun", "Filter data and save table presets as views to share and combine them into applications." : "Verileri süzün, hazır tablo ayarlarını görünümler olarak kaydederek paylaşın ve uygulamalarla birleştirin.", "Create applications" : "Uygulamalar oluşturun", "Combine different tables and views into no-code applications for any purpose. This makes them easily accessible directly in the app bar." : "Herhangi bir amaç için farklı tabloları ve görünümleri kod kullanmadan uygulamalara birleştirin. Bu uygulamalara doğrudan uygulama çubuğundan kolayca erişilebilir.", @@ -156,7 +168,7 @@ OC.L10N.register( "View" : "Görüntüle", "Today" : "Bugün", "Last edit" : "Son düzenleme", - "Create" : "Ekle", + "Create" : "Oluştur", "Column ID" : "Sütun kimliği", "Table ID" : "Tablo kimliği", "Text" : "Yazı", @@ -172,6 +184,7 @@ OC.L10N.register( "Metadata" : "Üst veriler", "Move up" : "Yukarı taşı", "Move down" : "Aşağı taşı", + "Rules are applied in order. The first rule sorts all rows, and any additional rules determine the order within any group of rows that share the same value." : "Kurallar sırayla uygulanır. İlk kural tüm satırları sıralar ve herhangi bir ek kural, aynı değeri paylaşan herhangi bir satır grubu içindeki sırayı belirler.", "Add new sorting rule" : "Yeni sıralama kuralı ekle", "Read only" : "Salt okunur", "Mandatory" : "Zorunlu", @@ -197,7 +210,7 @@ OC.L10N.register( "Cannot update table. Title is missing." : "Tablo güncellenemedi. Başlık eksik.", "Could not fetch shares." : "Paylaşımlar alınamadı.", "Views" : "Görünümler", - "Create view" : "Görünüm ekle", + "Create view" : "Görünüm oluştur", "Rows" : "Satırlar", "Columns" : "Sütunlar", "Last edited" : "Son düzenlenme", @@ -211,22 +224,24 @@ OC.L10N.register( "Data" : "Veriler", "Manage table" : "Tabloları yönetme", "Edit table" : "Tabloyu düzenle", - "Create column" : "Sütun ekle", + "Create column" : "Sütun oluştur", "Import" : "İçe aktar", - "Export as CSV" : "CSV olarak dışa aktar", + "Export all rows" : "Tüm satırları dışa aktar", + "Export filtered rows" : "Süzülmüş satırları dışa aktar", "Filtered view" : "Süzülmüş görünüm", "Reset local adjustments" : "Yerel ayarları sıfırla", "No columns" : "Henüz bir sütun eklenmemiş", - "We need at least one column, please be so kind and create one." : "En az bir sütun olması gerekiyor. Lütfen bir sütun ekleyin.", + "We need at least one column, please be so kind and create one." : "En az bir sütun olması gerekiyor. Lütfen bir sütun oluşturun.", "No columns selected" : "Herhangi bir sütun seçilmemiş", "The view is empty. Edit which columns should be displayed." : "Görünüm boş. Görüntülenecek sütunları düzenleyin.", + "Your access was revoked. Reload the page to update your permissions." : "Erişme izniniz geçersiz kılınmış. İzinlerinizi güncellemek için sayfayı yeniden yükleyin.", "Manage view" : "Görünüm yönetimi", "Please insert a title for the new column." : "Lütfen yeni sütunun başlığı yazın", "Cannot save column. Column width must be between {min} and {max}." : "Sütun kaydedilemedi. Sütun genişliği {min} ile {max} arasında olmalıdır.", "You need to select a type for the new column." : "Yeni sütun için bir tür seçmelisiniz.", - "The column \"{column}\" was created." : "\"{column}\" sütunu eklendi.", + "The column \"{column}\" was created." : "\"{column}\" sütunu oluşturuldu.", "Sorry, something went wrong." : "Ne yazık ki bir sorun çıktı.", - "Could not create new column." : "Yeni sütun eklenemedi.", + "Could not create new column." : "Yeni sütun oluşturulamadı.", "Type" : "Tür", "Text line" : "Yazı satırı", "Simple text" : "Basit yazı", @@ -250,10 +265,13 @@ OC.L10N.register( "Show in app list" : "Uygulama listesinde görüntüle", "This can be overridden by a per-account preference" : "Bu ayar, her hesap için ayrı yapılarak değiştirilebilir", "Create application" : "Uygulama oluştur", - "Create row" : "Satır ekle", + "Fill form" : "Formu doldur", + "Create row" : "Satır oluştur", + "Fill form again" : "Formu yeniden doldur", "Submit" : "Gönder", - "Row successfully created." : "Satır eklendi.", - "Could not create new row" : "Yeni satır eklenemedi", + "Form successfully submitted." : "Form gönderildi.", + "Row successfully created." : "Satır oluşturuldu.", + "Could not create new row" : "Yeni satır oluşturulamadı", "\"{columnTitle}\" should not be empty" : "\"{columnTitle}\" boş olamaz", "Save row" : "Satırı kaydet", "Cannot create new table. Title is missing." : "Yeni tablo oluşturulamadı. Başlık eksik.", @@ -302,11 +320,14 @@ OC.L10N.register( "Edit" : "Düzenle", "Activity" : "İşlem", "I really want to delete this row!" : "Bu satırı silmek istediğime eminim!", + "Column order" : "Sütun sıralaması", + "Default sorting" : "Varsayılan sıralama", "Manage" : "Yönetim", "Owner" : "Sahibi", "I really want to delete this table!" : "Bu tabloyu silmek istediğime eminim!", "Change owner" : "Sahibi değiştir", "Could not create table" : "Tablo oluşturulamadı", + "File import started, this might take a while. You will be notified once it finished." : "Dosya içe aktarma işlemi başladı. Tamamlanması biraz zaman alabilir. Bittiğinde size bildirilecek.", "You must select an existing table" : "Var olan bir tablo seçmelisiniz", "Could not import data to table" : "Veriler tablo içine aktarılamadı", "Import file into Tables" : "Dosyayı Tablolar içine aktar", @@ -335,7 +356,7 @@ OC.L10N.register( "Upload from device" : "Aygıttan yükle", "Supported formats: xlsx, xls, csv, html, xml" : "Desteklenen biçimler: xlsx, xls, csv, html, xml.", "First row of the file must contain column headings without gaps." : "Dosyanın ilk satırında boşluk olmadan sütun başlıkları bulunmalıdır.", - "⚠️ You don't have the permission to create columns." : "Sütunlar oluşturma izniniz yok.", + "⚠️ You don't have the permission to create columns." : "Sütun oluşturma izniniz yok.", "Preview" : "Ön izleme", "Importing data from " : "Şuradaki veriler içe aktarılıyor", "This might take a while..." : "Bu işlemin tamamlanması biraz zaman alabilir...", @@ -361,14 +382,14 @@ OC.L10N.register( "Table \"{emoji}{table}\" transferred to {user}" : "\"{emoji}{table}\" tablosu {user} kullanıcısına aktarıldı", "Transfer table" : "Tabloyu aktar", "Transfer this table to another user" : "Bu tabloyu başka bir kullanıcıya aktar", - "Create View" : "Görünüm ekle", + "Create View" : "Görünüm oluştur", "Save modified View" : "Değiştirilmiş görünümü kaydet", "Save View" : "Görünümü kaydet", "Save as new view" : "Yeni görünüm olarak kaydet", - "Cannot create view." : "Görünüm eklenemedi.", + "Cannot create view." : "Görünüm oluşturulamadı.", "Cannot update view." : "Görünüm güncellenemedi.", "Title is missing." : "Başlık eksik.", - "Could not create new view" : "Yeni görünüm eklenemedi", + "Could not create new view" : "Yeni görünüm oluşturulamadı", "Could not update view" : "Görünüm güncellenemedi", "Select emoji for view" : "Görünüm için bir emoji seçin", "Title of the new view" : "Yeni görünümün başlığı", @@ -411,7 +432,7 @@ OC.L10N.register( "Table manager" : "Tablo yönetimi", "Permissions" : "İzinler", "Read data" : "Verileri okuma", - "Create data" : "Verileri ekleme", + "Create data" : "Veriler oluşturma", "Update data" : "Verileri güncelleme", "Delete data" : "Verileri sil", "Promote to table manager" : "Tablo yöneticiliğine yükselt", @@ -423,6 +444,7 @@ OC.L10N.register( "View only" : "Yalnızca görüntüleme", "Can edit" : "Düzenleyebilir", "Custom permissions" : "Özel izinler", + "Quick share options, current: {option}" : "Hızlı paylaş seçenekleri. Şu anda: {option}", "Read" : "Okunmuş", "Update" : "Güncelle", "Error creating link share" : "Bağlantı paylaşımı oluşturulurken sorun çıktı", @@ -451,14 +473,14 @@ OC.L10N.register( "Your permissions" : "İzinleriniz", "This application could not be found" : "Uygulama bulunamadı", "Some resources in this application could not be loaded" : "Bu uygulamanın bazı kaynakları yüklenemedi", - "Create new table" : "Tablo ekle", + "Create new table" : "Yeni tablo oluştur", "Searching …" : "Aranıyor…", "No elements found." : "Herhangi bir bileşen bulunamadı.", "Select a table or view" : "Bir tablo ya da görünüm seçin", "No selected resources" : "Herhangi bir kaynak seçilmemiş", "Shared resources permissions" : "Paylaşılmış kaynak izinleri", "Read resource" : "Kaynak okuma", - "Create resource" : "Kaynak ekleme", + "Create resource" : "Kaynak oluşturma", "Update resource" : "Kaynak güncelleme", "Delete resource" : "Kaynak silme", "No shared resources" : "Paylaşılmış bir kaynak yok", @@ -467,8 +489,10 @@ OC.L10N.register( "Could not load editor, text not available." : "Düzenleyici yüklenemedi. Yazı kullanılamıyor.", "Icon {iconName} loading" : "{iconName} simgesi yükleniyor", "Download" : "İndir", - "Create rows" : "Satır ekle", - "You are not allowed to read this table, but you can still create rows." : "Bu tabloyu okuma izniniz yok ancak satır ekleyebilirsiniz.", + "This is a public form." : "Bu form herkese açık.", + "Create rows" : "Satır oluştur", + "You can add one or more replies." : "Bir veya birkaç yanıt ekleyebilirsiniz.", + "You are not allowed to read this table, but you can still create rows." : "Bu tabloyu okuma izniniz yok ancak satır oluşturabilirsiniz.", "No permissions" : "Herhangi bir izin yok", "You have no permissions for this table." : "Bu tablo üzerinde herhangi bir izniniz yok.", "Search" : "Arama", @@ -488,6 +512,8 @@ OC.L10N.register( "Select options" : "Seçenekleri seçin", "Keyword and submit" : "Anahtar sözcük ve gönder", "Or use magic values" : "Ya da sihirli değerleri kullanın", + "Unpin column" : "Sütunun sabitlemesini kaldır", + "Pin column" : "Sütunu sabitle", "Sorting" : "Sıralama", "Sort asc" : "Artan sıralama", "Sort desc" : "Azalan sıralama", @@ -497,6 +523,7 @@ OC.L10N.register( "Manage column" : "Sütun yönetimi", "Column manage actions" : "Sütun yönetimi işlemleri", "Hide column" : "Sütunu gizle", + "Copy row" : "Satırı kopyala", "Undo" : "Geri al", "Redo" : "Yinele", "Bold" : "Koyu", @@ -549,13 +576,15 @@ OC.L10N.register( "Open link" : "Bağlantıyı aç", "Show fullscreen" : "Tam ekranda görüntüle", "Close editor" : "Düzenleyiciyi kapat", - "Create Row" : "Satır ekle", - "Export CSV" : "CSV olarak dışa aktar", + "Create Row" : "Satır oluştur", + "Export selected rows" : "Seçilmiş satırları dışa aktar", "Uncheck all" : "Tümünü bırak", "_%n selected row_::_%n selected rows_" : ["%n satır seçilmiş","%n satır seçilmiş"], "Go to first page" : "İlk sayfaya git", "Go to previous page" : "Önceki sayfaya git", + "Page" : "Sayfa", "Page number" : "Sayfa numarası", + "Per page" : "Bir sayfada", "Go to next page" : "Sonraki sayfaya git", "Go to last page" : "Son sayfaya git", "Confirmation" : "Onaylama", @@ -576,6 +605,7 @@ OC.L10N.register( "Could not update share." : "Paylaşım güncellenemedi.", "Could not update cell" : "Hücre güncellenemedi", "Filter operator" : "Süzgeç işlemi", + "Contains items" : "Ögeler içeren", "Contains" : "Şunu içeren", "Does not contain" : "Şunu içermeyen", "Begins with" : "Şununla başlayan", @@ -655,6 +685,7 @@ OC.L10N.register( "Could not fetch table" : "Tablo alınamadı", "Could not load view" : "Görünüm yüklenemedi", "Could not fetch view" : "Görünüm alınamadı", + "Could not verify export permissions." : "Dışa aktarma izinleri doğrulanamadı.", "Could not transfer application." : "Uygulama aktarılamadı.", "Could not remove application." : "Uygulama kaldırılamadı.", "Could not remove table." : "Tablo silinemedi.", diff --git a/l10n/tr.json b/l10n/tr.json index 5a8b50009f..9f76b02ef8 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -1,18 +1,27 @@ { "translations": { - "You have created a new table {table}" : "{table} tablosunu eklediniz", - "{user} has created a new table {table}" : "{user}, {table} tablosunu ekledi", + "You have created a new table {table}" : "Yeni {table} tablosunu oluşturdunuz", + "{user} has created a new table {table}" : "{user}, yeni {table} tablosunu oluşturdu", "You have deleted the table {table}" : "{table} tablosunu sildiniz", "{user} has deleted the table {table}" : "{user}, {table} tablosunu sildi", "You have renamed the table {before} to {table}" : "{before} tablosunun adını {table} olarak değiştirdiniz", "{user} has renamed the table {before} to {table}" : "{user}, {before} tablosunun adını {table} olarak değiştirdi", "You have updated the description of table {table} to {after}" : "{table} tablosunun açıklamasını {after} olarak güncellediniz", "{user} has updated the description of table {table} to {after}" : "{user}, {table} tablosunun açıklamasını {after} olarak güncelledi", - "You have created a new row {row} in table {table}" : "{table} tablosuna yeni {row} satırını eklediniz", - "{user} has created a new row {row} in table {table}" : "{user}, {table} tablosuna yeni {row} satırını ekledi", + "You have created a new row {row} in table {table}" : "{table} tablosunda yeni {row} satırını oluşturdunuz", + "{user} has created a new row {row} in table {table}" : "{user}, {table} tablosunda yeni {row} satırını oluşturdu", "_You have updated cell %1$s on row {row} in table {table}_::_You have updated cells %1$s on row {row} in table {table}_" : ["{table} tablosunda {row} satırında %1$s hücreyi güncellediniz","{table} tablosunda {row} satırında %1$s hücreyi güncellediniz"], "_{user} has updated cell %1$s on row {row} in table {table}_::_{user} has updated cells %1$s on row {row} in table {table}_" : ["{user} kullanıcısı {table} tablosunda {row} satırında %1$s hücreyi güncelledi","{user} kullanıcısı {table} tablosunda {row} satırında %1$s hücreyi güncelledi"], "You have deleted the row {row} in table {table}" : "{table} tablosundaki {row} satırını sildiniz", "{user} has deleted the row {row} in table {table}" : "{user}, {table} tablosundaki {row} satırını sildi", + "You have imported file to table {table}" : "{table} tablosu içine dosya aktardınız ", + "{user} has imported file to table {table}" : "{user}, {table} tablosu içine dosya aktardı", + "Found columns: {foundColumnsCount}" : "Bulunan sütun: {foundColumnsCount}", + "Matching columns: {matchingColumnsCount}" : "Eşleşen sütun: {matchingColumnsCount}", + "Created columns: {createdColumnsCount}" : "Oluşturulan sütunlar: {createdColumnsCount}", + "Inserted rows: {insertedRowsCount}" : "Eklenen satır: {insertedRowsCount}", + "Updated rows: {updatedRowsCount}" : "Güncellenen satır: {updatedRowsCount}", + "Value parsing errors: {errorsParsingCount}" : "Değer işleme sorunu: {errorsParsingCount}", + "Row creation errors: {errorsCount}" : "Satır oluşturma sorunu: {errorsCount}", "Tables" : "Tablolar", "A table or row was changed" : "Bir tablo ya da satır değiştirildi", "Nextcloud Tables" : "Nextcloud tabloları", @@ -22,6 +31,7 @@ "Timestamp of data load" : "Veri yüklemesinin zaman damgası", "No" : "Hayır", "Yes" : "Evet", + "Count" : "Sayı", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Beklenmeyen bir sorun çıktı. Ayrıntılı bilgi almak için günlük kayıtlarına bakabilirsiniz. Lütfen yöneticiniz ile görüşün.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Bir izin sorunu çıktı. Ayrıntılı bilgi almak için günlük kayıtlarına bakabilirsiniz. Lütfen yöneticiniz ile görüşün.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Bir bulunamama sorunu çıktı. Ayrıntılı bilgi almak için günlük kayıtlarına bakabilirsiniz. Lütfen yöneticiniz ile görüşün.", @@ -36,6 +46,7 @@ "Could not write file to disk" : "Dosya diske yazılamadı", "A PHP extension stopped the file upload" : "Bir PHP eklentisi dosyanın yüklenmesini engelledi", "No file uploaded or file size exceeds maximum of %s" : "Herhangi bir dosya yüklenmedi ya da %s olan en büyük dosya boyutu sınırı aşıldı", + "Deleted team %s." : "%s takımı silindi.", "Nextcloud tables" : "Nextcloud tabloları", "_%n row_::_%n rows_" : ["%n satır","%n satır"], "table" : "tablo", @@ -43,6 +54,7 @@ "Column width must be between %1$s and %2$s." : "Sütun genişliği %1$s ile %2$s arasında olmalıdır.", "This column was automatically created by the import service." : "Bu sütun, içe aktarma hizmeti tarafından otomatik olarak oluşturuldu.", "Column \"%s\" contains a non-unique value." : "\"%s\" sütununda benzersiz olmayan bir değer var.", + "Column \"%s\" contains an invalid protocol. Only http and https are allowed." : "\"%s\" sütunundaki iletişim kuralı geçersiz. Yalnızca http ve https kullanılabilir.", "Welcome to %s Tables!" : "%s tablolar uygulamasına hoş geldiniz!", "ToDo list" : "Yapılacaklar listesi", "Setup a simple todo-list." : "Basit bir yapılacaklar listesi oluşturun", @@ -98,7 +110,7 @@ "Approved by" : "Onaylayan", "The Boss" : "Patron", "Bob will help for this time" : "Bu sürede Bob yardımcı olacak", - "We have to talk about that." : "Bunun hakkında konuşmalıyız.", + "We have to talk about that." : "Bununla ilgili konuşmalıyız.", "Create Vacation Request" : "Tatil isteği oluştur", "Open Request" : "İstek aç", "Request Status" : "İstek durumu", @@ -114,8 +126,8 @@ "Date, time or whatever" : "Tarih, saat ya da her neyse", "Progress" : "İlerleme", "Proofed" : "Kanıtlandı", - "Create initial milestones" : "Başlangıç kilometre taşlarını ekle", - "Create some milestones to structure the project." : "Projeyi yapılandırmak için bazı kilometre taşları ekleyin.", + "Create initial milestones" : "Başlangıç kilometre taşlarını oluştur", + "Create some milestones to structure the project." : "Projeyi yapılandırmak için bazı kilometre taşları oluşturun.", "Plan to discuss for the kickoff meeting." : "Başlangıç toplantısı için görüşme planlayın.", "Wow, that was hard work, but now it's done." : "Çok iş vardı ancak hepsi tamam.", "Kickoff meeting" : "Başlangıç toplantısı", @@ -135,12 +147,12 @@ "Open the tables app" : "Tablolar uygulamasını aç", "Reachable via the Tables icon in the apps list." : "Uygulamalar listesindeki Tablolar simgesinden ulaşılabilir.", "Add your first row" : "İlk satırınızı ekleyin", - "Use the *+ Create row* button and enter some data inside of the form." : "*+ Satır ekle* düğmesini kullanın ve formun içine bazı veriler yazın.", + "Use the *+ Create row* button and enter some data inside of the form." : "*+ Satır oluştur* düğmesini kullanın ve formun içine bazı veriler yazın.", "Edit a row" : "Bir satırı düzenle", "Go to a row you want to edit and use the *pencil* edit button. Maybe you want to add a *Done* status to this row?" : "Düzenlemek istediğiniz satıra gidin ve *kalem* düzenleme düğmesine tıklayın. Belki bu satıra *Tamamlandı* durumu eklemek istersiniz?", "Add a new column" : "Yeni bir sütun ekle", - "You can add, remove and adjust columns as you need. Open the three-dot-menu on the upper right of this table and choose *Create column*. Fill in the data you want, at least a title and column type." : "Gereksinimlerinize göre sütun ekleyebilir, kaldırabilir ve ayarlayabilirsiniz. Bu tablonun sağ üst köşesindeki üç nokta menüsünü açın ve *Sütun ekle* üzerine tıklayın. İstediğiniz verileri, en azından bir başlık ve sütun türünü yazın.", - "Create views for tables" : "Tablolar için görünümler ekleyin", + "You can add, remove and adjust columns as you need. Open the three-dot-menu on the upper right of this table and choose *Create column*. Fill in the data you want, at least a title and column type." : "Gereksinimlerinize göre sütunlar oluşturabilir, kaldırabilir ve ayarlayabilirsiniz. Bu tablonun sağ üst köşesindeki üç nokta menüsünü açın ve *Sütun oluştur* üzerine tıklayın. İstediğiniz verileri, en azından bir başlık ve sütun türünü yazın.", + "Create views for tables" : "Tablolar için görünümler oluşturun", "Filter data and save table presets as views to share and combine them into applications." : "Verileri süzün, hazır tablo ayarlarını görünümler olarak kaydederek paylaşın ve uygulamalarla birleştirin.", "Create applications" : "Uygulamalar oluşturun", "Combine different tables and views into no-code applications for any purpose. This makes them easily accessible directly in the app bar." : "Herhangi bir amaç için farklı tabloları ve görünümleri kod kullanmadan uygulamalara birleştirin. Bu uygulamalara doğrudan uygulama çubuğundan kolayca erişilebilir.", @@ -154,7 +166,7 @@ "View" : "Görüntüle", "Today" : "Bugün", "Last edit" : "Son düzenleme", - "Create" : "Ekle", + "Create" : "Oluştur", "Column ID" : "Sütun kimliği", "Table ID" : "Tablo kimliği", "Text" : "Yazı", @@ -170,6 +182,7 @@ "Metadata" : "Üst veriler", "Move up" : "Yukarı taşı", "Move down" : "Aşağı taşı", + "Rules are applied in order. The first rule sorts all rows, and any additional rules determine the order within any group of rows that share the same value." : "Kurallar sırayla uygulanır. İlk kural tüm satırları sıralar ve herhangi bir ek kural, aynı değeri paylaşan herhangi bir satır grubu içindeki sırayı belirler.", "Add new sorting rule" : "Yeni sıralama kuralı ekle", "Read only" : "Salt okunur", "Mandatory" : "Zorunlu", @@ -195,7 +208,7 @@ "Cannot update table. Title is missing." : "Tablo güncellenemedi. Başlık eksik.", "Could not fetch shares." : "Paylaşımlar alınamadı.", "Views" : "Görünümler", - "Create view" : "Görünüm ekle", + "Create view" : "Görünüm oluştur", "Rows" : "Satırlar", "Columns" : "Sütunlar", "Last edited" : "Son düzenlenme", @@ -209,22 +222,24 @@ "Data" : "Veriler", "Manage table" : "Tabloları yönetme", "Edit table" : "Tabloyu düzenle", - "Create column" : "Sütun ekle", + "Create column" : "Sütun oluştur", "Import" : "İçe aktar", - "Export as CSV" : "CSV olarak dışa aktar", + "Export all rows" : "Tüm satırları dışa aktar", + "Export filtered rows" : "Süzülmüş satırları dışa aktar", "Filtered view" : "Süzülmüş görünüm", "Reset local adjustments" : "Yerel ayarları sıfırla", "No columns" : "Henüz bir sütun eklenmemiş", - "We need at least one column, please be so kind and create one." : "En az bir sütun olması gerekiyor. Lütfen bir sütun ekleyin.", + "We need at least one column, please be so kind and create one." : "En az bir sütun olması gerekiyor. Lütfen bir sütun oluşturun.", "No columns selected" : "Herhangi bir sütun seçilmemiş", "The view is empty. Edit which columns should be displayed." : "Görünüm boş. Görüntülenecek sütunları düzenleyin.", + "Your access was revoked. Reload the page to update your permissions." : "Erişme izniniz geçersiz kılınmış. İzinlerinizi güncellemek için sayfayı yeniden yükleyin.", "Manage view" : "Görünüm yönetimi", "Please insert a title for the new column." : "Lütfen yeni sütunun başlığı yazın", "Cannot save column. Column width must be between {min} and {max}." : "Sütun kaydedilemedi. Sütun genişliği {min} ile {max} arasında olmalıdır.", "You need to select a type for the new column." : "Yeni sütun için bir tür seçmelisiniz.", - "The column \"{column}\" was created." : "\"{column}\" sütunu eklendi.", + "The column \"{column}\" was created." : "\"{column}\" sütunu oluşturuldu.", "Sorry, something went wrong." : "Ne yazık ki bir sorun çıktı.", - "Could not create new column." : "Yeni sütun eklenemedi.", + "Could not create new column." : "Yeni sütun oluşturulamadı.", "Type" : "Tür", "Text line" : "Yazı satırı", "Simple text" : "Basit yazı", @@ -248,10 +263,13 @@ "Show in app list" : "Uygulama listesinde görüntüle", "This can be overridden by a per-account preference" : "Bu ayar, her hesap için ayrı yapılarak değiştirilebilir", "Create application" : "Uygulama oluştur", - "Create row" : "Satır ekle", + "Fill form" : "Formu doldur", + "Create row" : "Satır oluştur", + "Fill form again" : "Formu yeniden doldur", "Submit" : "Gönder", - "Row successfully created." : "Satır eklendi.", - "Could not create new row" : "Yeni satır eklenemedi", + "Form successfully submitted." : "Form gönderildi.", + "Row successfully created." : "Satır oluşturuldu.", + "Could not create new row" : "Yeni satır oluşturulamadı", "\"{columnTitle}\" should not be empty" : "\"{columnTitle}\" boş olamaz", "Save row" : "Satırı kaydet", "Cannot create new table. Title is missing." : "Yeni tablo oluşturulamadı. Başlık eksik.", @@ -300,11 +318,14 @@ "Edit" : "Düzenle", "Activity" : "İşlem", "I really want to delete this row!" : "Bu satırı silmek istediğime eminim!", + "Column order" : "Sütun sıralaması", + "Default sorting" : "Varsayılan sıralama", "Manage" : "Yönetim", "Owner" : "Sahibi", "I really want to delete this table!" : "Bu tabloyu silmek istediğime eminim!", "Change owner" : "Sahibi değiştir", "Could not create table" : "Tablo oluşturulamadı", + "File import started, this might take a while. You will be notified once it finished." : "Dosya içe aktarma işlemi başladı. Tamamlanması biraz zaman alabilir. Bittiğinde size bildirilecek.", "You must select an existing table" : "Var olan bir tablo seçmelisiniz", "Could not import data to table" : "Veriler tablo içine aktarılamadı", "Import file into Tables" : "Dosyayı Tablolar içine aktar", @@ -333,7 +354,7 @@ "Upload from device" : "Aygıttan yükle", "Supported formats: xlsx, xls, csv, html, xml" : "Desteklenen biçimler: xlsx, xls, csv, html, xml.", "First row of the file must contain column headings without gaps." : "Dosyanın ilk satırında boşluk olmadan sütun başlıkları bulunmalıdır.", - "⚠️ You don't have the permission to create columns." : "Sütunlar oluşturma izniniz yok.", + "⚠️ You don't have the permission to create columns." : "Sütun oluşturma izniniz yok.", "Preview" : "Ön izleme", "Importing data from " : "Şuradaki veriler içe aktarılıyor", "This might take a while..." : "Bu işlemin tamamlanması biraz zaman alabilir...", @@ -359,14 +380,14 @@ "Table \"{emoji}{table}\" transferred to {user}" : "\"{emoji}{table}\" tablosu {user} kullanıcısına aktarıldı", "Transfer table" : "Tabloyu aktar", "Transfer this table to another user" : "Bu tabloyu başka bir kullanıcıya aktar", - "Create View" : "Görünüm ekle", + "Create View" : "Görünüm oluştur", "Save modified View" : "Değiştirilmiş görünümü kaydet", "Save View" : "Görünümü kaydet", "Save as new view" : "Yeni görünüm olarak kaydet", - "Cannot create view." : "Görünüm eklenemedi.", + "Cannot create view." : "Görünüm oluşturulamadı.", "Cannot update view." : "Görünüm güncellenemedi.", "Title is missing." : "Başlık eksik.", - "Could not create new view" : "Yeni görünüm eklenemedi", + "Could not create new view" : "Yeni görünüm oluşturulamadı", "Could not update view" : "Görünüm güncellenemedi", "Select emoji for view" : "Görünüm için bir emoji seçin", "Title of the new view" : "Yeni görünümün başlığı", @@ -409,7 +430,7 @@ "Table manager" : "Tablo yönetimi", "Permissions" : "İzinler", "Read data" : "Verileri okuma", - "Create data" : "Verileri ekleme", + "Create data" : "Veriler oluşturma", "Update data" : "Verileri güncelleme", "Delete data" : "Verileri sil", "Promote to table manager" : "Tablo yöneticiliğine yükselt", @@ -421,6 +442,7 @@ "View only" : "Yalnızca görüntüleme", "Can edit" : "Düzenleyebilir", "Custom permissions" : "Özel izinler", + "Quick share options, current: {option}" : "Hızlı paylaş seçenekleri. Şu anda: {option}", "Read" : "Okunmuş", "Update" : "Güncelle", "Error creating link share" : "Bağlantı paylaşımı oluşturulurken sorun çıktı", @@ -449,14 +471,14 @@ "Your permissions" : "İzinleriniz", "This application could not be found" : "Uygulama bulunamadı", "Some resources in this application could not be loaded" : "Bu uygulamanın bazı kaynakları yüklenemedi", - "Create new table" : "Tablo ekle", + "Create new table" : "Yeni tablo oluştur", "Searching …" : "Aranıyor…", "No elements found." : "Herhangi bir bileşen bulunamadı.", "Select a table or view" : "Bir tablo ya da görünüm seçin", "No selected resources" : "Herhangi bir kaynak seçilmemiş", "Shared resources permissions" : "Paylaşılmış kaynak izinleri", "Read resource" : "Kaynak okuma", - "Create resource" : "Kaynak ekleme", + "Create resource" : "Kaynak oluşturma", "Update resource" : "Kaynak güncelleme", "Delete resource" : "Kaynak silme", "No shared resources" : "Paylaşılmış bir kaynak yok", @@ -465,8 +487,10 @@ "Could not load editor, text not available." : "Düzenleyici yüklenemedi. Yazı kullanılamıyor.", "Icon {iconName} loading" : "{iconName} simgesi yükleniyor", "Download" : "İndir", - "Create rows" : "Satır ekle", - "You are not allowed to read this table, but you can still create rows." : "Bu tabloyu okuma izniniz yok ancak satır ekleyebilirsiniz.", + "This is a public form." : "Bu form herkese açık.", + "Create rows" : "Satır oluştur", + "You can add one or more replies." : "Bir veya birkaç yanıt ekleyebilirsiniz.", + "You are not allowed to read this table, but you can still create rows." : "Bu tabloyu okuma izniniz yok ancak satır oluşturabilirsiniz.", "No permissions" : "Herhangi bir izin yok", "You have no permissions for this table." : "Bu tablo üzerinde herhangi bir izniniz yok.", "Search" : "Arama", @@ -486,6 +510,8 @@ "Select options" : "Seçenekleri seçin", "Keyword and submit" : "Anahtar sözcük ve gönder", "Or use magic values" : "Ya da sihirli değerleri kullanın", + "Unpin column" : "Sütunun sabitlemesini kaldır", + "Pin column" : "Sütunu sabitle", "Sorting" : "Sıralama", "Sort asc" : "Artan sıralama", "Sort desc" : "Azalan sıralama", @@ -495,6 +521,7 @@ "Manage column" : "Sütun yönetimi", "Column manage actions" : "Sütun yönetimi işlemleri", "Hide column" : "Sütunu gizle", + "Copy row" : "Satırı kopyala", "Undo" : "Geri al", "Redo" : "Yinele", "Bold" : "Koyu", @@ -547,13 +574,15 @@ "Open link" : "Bağlantıyı aç", "Show fullscreen" : "Tam ekranda görüntüle", "Close editor" : "Düzenleyiciyi kapat", - "Create Row" : "Satır ekle", - "Export CSV" : "CSV olarak dışa aktar", + "Create Row" : "Satır oluştur", + "Export selected rows" : "Seçilmiş satırları dışa aktar", "Uncheck all" : "Tümünü bırak", "_%n selected row_::_%n selected rows_" : ["%n satır seçilmiş","%n satır seçilmiş"], "Go to first page" : "İlk sayfaya git", "Go to previous page" : "Önceki sayfaya git", + "Page" : "Sayfa", "Page number" : "Sayfa numarası", + "Per page" : "Bir sayfada", "Go to next page" : "Sonraki sayfaya git", "Go to last page" : "Son sayfaya git", "Confirmation" : "Onaylama", @@ -574,6 +603,7 @@ "Could not update share." : "Paylaşım güncellenemedi.", "Could not update cell" : "Hücre güncellenemedi", "Filter operator" : "Süzgeç işlemi", + "Contains items" : "Ögeler içeren", "Contains" : "Şunu içeren", "Does not contain" : "Şunu içermeyen", "Begins with" : "Şununla başlayan", @@ -653,6 +683,7 @@ "Could not fetch table" : "Tablo alınamadı", "Could not load view" : "Görünüm yüklenemedi", "Could not fetch view" : "Görünüm alınamadı", + "Could not verify export permissions." : "Dışa aktarma izinleri doğrulanamadı.", "Could not transfer application." : "Uygulama aktarılamadı.", "Could not remove application." : "Uygulama kaldırılamadı.", "Could not remove table." : "Tablo silinemedi.", diff --git a/l10n/ug.js b/l10n/ug.js index 9ee67d7d39..16c7109fa6 100644 --- a/l10n/ug.js +++ b/l10n/ug.js @@ -24,6 +24,7 @@ OC.L10N.register( "Timestamp of data load" : "سانلىق مەلۇمات يۈكلەش ۋاقتى", "No" : "ياق", "Yes" : "ھەئە", + "Count" : "ساناپ بېقىڭ", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "ئويلىمىغان خاتالىق يۈز بەردى. تېخىمۇ كۆپ تەپسىلاتلارنى خاتىرىلەردىن تاپقىلى بولىدۇ. باشقۇرغۇچىڭىز بىلەن ئالاقىلىشىڭ.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "ئىجازەت خاتالىقى كۆرۈلدى. تېخىمۇ كۆپ تەپسىلاتلارنى خاتىرىلەردىن تاپقىلى بولىدۇ. باشقۇرغۇچىڭىز بىلەن ئالاقىلىشىڭ.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "تېپىلمىغان خاتالىق كۆرۈلدى. تېخىمۇ كۆپ تەپسىلاتلارنى خاتىرىلەردىن تاپقىلى بولىدۇ. باشقۇرغۇچىڭىز بىلەن ئالاقىلىشىڭ.", @@ -211,7 +212,6 @@ OC.L10N.register( "Edit table" : "جەدۋەلنى تەھرىرلەش", "Create column" : "ئىستون قۇرۇش", "Import" : "ئەكىر", - "Export as CSV" : "CSV قىلىپ چىقىرىش", "Filtered view" : "سۈزۈلگەن كۆرۈنۈش", "Reset local adjustments" : "يەرلىك تەڭشەشنى ئەسلىگە كەلتۈرۈڭ", "No columns" : "ستون يوق", @@ -542,7 +542,6 @@ OC.L10N.register( "Show fullscreen" : "پۈتۈن ئېكراننى كۆرسىتىش", "Close editor" : "تەھرىرلىگۈچنى تاقاش", "Create Row" : "قۇر قۇر", - "Export CSV" : "CSV نى چىقىرىش", "Uncheck all" : "ھەممىنى تاللاڭ", "_%n selected row_::_%n selected rows_" : ["تاللانغان %n قۇر","تاللانغان %n قۇر"], "Go to first page" : "بىرىنچى بەتكە بېرىڭ", diff --git a/l10n/ug.json b/l10n/ug.json index 555dde5954..351c16d732 100644 --- a/l10n/ug.json +++ b/l10n/ug.json @@ -22,6 +22,7 @@ "Timestamp of data load" : "سانلىق مەلۇمات يۈكلەش ۋاقتى", "No" : "ياق", "Yes" : "ھەئە", + "Count" : "ساناپ بېقىڭ", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "ئويلىمىغان خاتالىق يۈز بەردى. تېخىمۇ كۆپ تەپسىلاتلارنى خاتىرىلەردىن تاپقىلى بولىدۇ. باشقۇرغۇچىڭىز بىلەن ئالاقىلىشىڭ.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "ئىجازەت خاتالىقى كۆرۈلدى. تېخىمۇ كۆپ تەپسىلاتلارنى خاتىرىلەردىن تاپقىلى بولىدۇ. باشقۇرغۇچىڭىز بىلەن ئالاقىلىشىڭ.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "تېپىلمىغان خاتالىق كۆرۈلدى. تېخىمۇ كۆپ تەپسىلاتلارنى خاتىرىلەردىن تاپقىلى بولىدۇ. باشقۇرغۇچىڭىز بىلەن ئالاقىلىشىڭ.", @@ -209,7 +210,6 @@ "Edit table" : "جەدۋەلنى تەھرىرلەش", "Create column" : "ئىستون قۇرۇش", "Import" : "ئەكىر", - "Export as CSV" : "CSV قىلىپ چىقىرىش", "Filtered view" : "سۈزۈلگەن كۆرۈنۈش", "Reset local adjustments" : "يەرلىك تەڭشەشنى ئەسلىگە كەلتۈرۈڭ", "No columns" : "ستون يوق", @@ -540,7 +540,6 @@ "Show fullscreen" : "پۈتۈن ئېكراننى كۆرسىتىش", "Close editor" : "تەھرىرلىگۈچنى تاقاش", "Create Row" : "قۇر قۇر", - "Export CSV" : "CSV نى چىقىرىش", "Uncheck all" : "ھەممىنى تاللاڭ", "_%n selected row_::_%n selected rows_" : ["تاللانغان %n قۇر","تاللانغان %n قۇر"], "Go to first page" : "بىرىنچى بەتكە بېرىڭ", diff --git a/l10n/uk.js b/l10n/uk.js index 144b959179..779e7d3b24 100644 --- a/l10n/uk.js +++ b/l10n/uk.js @@ -15,6 +15,15 @@ OC.L10N.register( "_{user} has updated cell %1$s on row {row} in table {table}_::_{user} has updated cells %1$s on row {row} in table {table}_" : ["{user} оновив(-ла) комірку %1$s у рядку {row} таблиці {table}","{user} оновив(-ла) комірки %1$s у рядку {row} таблиці {table}","{user} оновив(-ла) комірки %1$s у рядку {row} таблиці {table}","{user} оновив(-ла) комірки %1$s у рядку {row} таблиці {table}"], "You have deleted the row {row} in table {table}" : "Ви вилучили рядок {row} у таблиці {table}", "{user} has deleted the row {row} in table {table}" : "{user} вилучив(-ла) рядок {row} у таблиці {table}", + "You have imported file to table {table}" : "Імпортовано файл до таблиці {table}", + "{user} has imported file to table {table}" : "{user} імпортував(-ла) файл до таблиці {table}", + "Found columns: {foundColumnsCount}" : "Знайдено стовпців: {foundColumnsCount}", + "Matching columns: {matchingColumnsCount}" : "Знайдено відповідних стовпців: {matchingColumnsCount}", + "Created columns: {createdColumnsCount}" : "Створено стовпців: {createdColumnsCount}", + "Inserted rows: {insertedRowsCount}" : "Вставлено рядків: {insertedRowsCount}", + "Updated rows: {updatedRowsCount}" : "Оновлено рядків: {updatedRowsCount}", + "Value parsing errors: {errorsParsingCount}" : "Помилок під час обробки значень: {errorsParsingCount}", + "Row creation errors: {errorsCount}" : "Помилок під час створення рядку: {errorsCount}", "Tables" : "Таблиці", "A table or row was changed" : "Таблицю або рядок було змінено", "Nextcloud Tables" : "Таблиці", @@ -24,6 +33,7 @@ OC.L10N.register( "Timestamp of data load" : "Мітка часу завантаження даних", "No" : "Ні", "Yes" : "Так", + "Count" : "Лічильник", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Сталася неочікувана помилка. Докладну інформацію можна знайти в журналі. Будь ласка, зверніться до вашого адміністратора.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Виникла помилка з доступом. Докладну інформацію можна знайти в журналі. Будь ласка, зверніться до вашого адміністратора.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Сталася помилка відсутніх даних. Докладну інформацію можна знайти в журналі. Будь ласка, зверніться до вашого адміністратора.", @@ -169,6 +179,7 @@ OC.L10N.register( "Selection" : "Вибір", "Date and time" : "Дата та час", "Users and groups" : "Користувачі та групи", + "Relation" : "Зв'язок", "Column type" : "Тип стовпця", "Move" : "Перемістити", "Metadata" : "Метадані", @@ -216,7 +227,8 @@ OC.L10N.register( "Edit table" : "Редагувати таблицю", "Create column" : "Додати стовпець", "Import" : "Імпорт", - "Export as CSV" : "Експорт у CSV", + "Export all rows" : "Експортувати всі рядки", + "Export filtered rows" : "Експортувати відфільтровані рядки", "Filtered view" : "Подання з фільтром", "Reset local adjustments" : "Скинути фільтри", "No columns" : "Відсутні стовпці", @@ -228,6 +240,9 @@ OC.L10N.register( "Please insert a title for the new column." : "Додайте заголовок до нового стовпця.", "Cannot save column. Column width must be between {min} and {max}." : "Неможливо зберегти стовпець. Ширина стовпця має бути між {min} та {max}.", "You need to select a type for the new column." : "Потрібно вибрати тип нового стовпця.", + "Please select a relation type." : "Виберіть тип зв'язку.", + "Please select a target." : "Виберіть призначення.", + "Please select a label for relation selection." : "Виберіть ярлик для вибору зв'язку.", "The column \"{column}\" was created." : "Стовпець \"{column}\" було додано.", "Sorry, something went wrong." : "От халепа, щось пішло не так.", "Could not create new column." : "Не вдалося додати стовпець.", @@ -316,6 +331,7 @@ OC.L10N.register( "I really want to delete this table!" : "Я справді хочу вилучити цю таблицю!", "Change owner" : "Змінити власника", "Could not create table" : "Не вдалося створити таблицю", + "File import started, this might take a while. You will be notified once it finished." : "Розпочато імпорт файлу. Ви отримаєте сповіщення про завершення операції.", "You must select an existing table" : "Ви маєте обрати наявну таблицю", "Could not import data to table" : "Не вдалося імпортувати дані до таблиці", "Import file into Tables" : "Імпортувати файл до Таблиць", @@ -395,7 +411,7 @@ OC.L10N.register( "Copy" : "Копія", "Could not configure new view" : "Не вдалося налаштувати нове подання", "Duplicate view" : "Зробити копію подання", - "Filter items" : "Фільтрувати", + "Filter items" : "Швидкий фільтр ...", "Favorites" : "Із зірочкою", "Archived tables" : "Архівовані таблиці", "Applications" : "Застосунки", @@ -492,6 +508,8 @@ OC.L10N.register( "Link providers" : "Посилання постачальників", "This option is outdated." : "Ця опція застаріла.", "Options" : "Параметри", + "This relation does not exist anymore." : "Цей зв'язок вже відсутній.", + "Select relation value" : "Виберіть значення для зв'язку.", "Set {star} stars" : "Додати {star} зірки", "Cell input" : "Вхідний сигнал комірки", "Back" : "Назад", @@ -511,6 +529,7 @@ OC.L10N.register( "Manage column" : "Керування стовпцями", "Column manage actions" : "Дії з керування стовпцями", "Hide column" : "Приховати стовпець", + "Copy row" : "Копіювати рядок", "Undo" : "Скасувати", "Redo" : "Повторити", "Bold" : "Грубий", @@ -540,6 +559,12 @@ OC.L10N.register( "Default" : "За замовчуванням", "Reduce stars" : "Зменшити число зірочок", "Increase stars" : "Збільшити число зірочок", + "Relation type" : "Тип зв'язку", + "Select relation type" : "Виберіть тип зв'язку", + "Select target" : "Виберіть призначення", + "Label for relation selection" : "Ярлик для вибору зв'язку", + "Select label for relation selection" : "Виберіть ярлик для вибору зв'язку", + "Only text and number columns can be used as label" : "Лише стовпці, що містять текст та цифри можна використовувати як ярлики", "First option" : "Варіант 1", "Second option" : "Варіант 2", "Delete option" : "Вилучити опцію", @@ -564,7 +589,7 @@ OC.L10N.register( "Show fullscreen" : "На весь екран", "Close editor" : "Закрити редактор", "Create Row" : "Додати рядок", - "Export CSV" : "Експорт у CSV", + "Export selected rows" : "Експортувати вибрані рядки", "Uncheck all" : "Зняти все", "_%n selected row_::_%n selected rows_" : ["Вибрано %n рядок","Вибрано %n рядки","Вибрано %n рядків","Вибрано %n рядків"], "Go to first page" : "На першу сторінку", @@ -638,6 +663,7 @@ OC.L10N.register( "Could not insert column." : "Не вдалося вставити стовпці.", "Could not update column." : "Не вдалося оновити стовпець.", "Could not remove column." : "Не вдалося вилучити стовпець.", + "Could not load relation data." : "Не вдалося завантажити дані щодо зв'язку.", "Could not load rows." : "Не вдалося завантажити рядки.", "Outdated data. View is reloaded" : "Застарілі дані. Подання завантажено повторно", "Could not insert row." : "Не вдалося вставити рядок.", diff --git a/l10n/uk.json b/l10n/uk.json index 1fe9f57c22..65282c7eb8 100644 --- a/l10n/uk.json +++ b/l10n/uk.json @@ -13,6 +13,15 @@ "_{user} has updated cell %1$s on row {row} in table {table}_::_{user} has updated cells %1$s on row {row} in table {table}_" : ["{user} оновив(-ла) комірку %1$s у рядку {row} таблиці {table}","{user} оновив(-ла) комірки %1$s у рядку {row} таблиці {table}","{user} оновив(-ла) комірки %1$s у рядку {row} таблиці {table}","{user} оновив(-ла) комірки %1$s у рядку {row} таблиці {table}"], "You have deleted the row {row} in table {table}" : "Ви вилучили рядок {row} у таблиці {table}", "{user} has deleted the row {row} in table {table}" : "{user} вилучив(-ла) рядок {row} у таблиці {table}", + "You have imported file to table {table}" : "Імпортовано файл до таблиці {table}", + "{user} has imported file to table {table}" : "{user} імпортував(-ла) файл до таблиці {table}", + "Found columns: {foundColumnsCount}" : "Знайдено стовпців: {foundColumnsCount}", + "Matching columns: {matchingColumnsCount}" : "Знайдено відповідних стовпців: {matchingColumnsCount}", + "Created columns: {createdColumnsCount}" : "Створено стовпців: {createdColumnsCount}", + "Inserted rows: {insertedRowsCount}" : "Вставлено рядків: {insertedRowsCount}", + "Updated rows: {updatedRowsCount}" : "Оновлено рядків: {updatedRowsCount}", + "Value parsing errors: {errorsParsingCount}" : "Помилок під час обробки значень: {errorsParsingCount}", + "Row creation errors: {errorsCount}" : "Помилок під час створення рядку: {errorsCount}", "Tables" : "Таблиці", "A table or row was changed" : "Таблицю або рядок було змінено", "Nextcloud Tables" : "Таблиці", @@ -22,6 +31,7 @@ "Timestamp of data load" : "Мітка часу завантаження даних", "No" : "Ні", "Yes" : "Так", + "Count" : "Лічильник", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "Сталася неочікувана помилка. Докладну інформацію можна знайти в журналі. Будь ласка, зверніться до вашого адміністратора.", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "Виникла помилка з доступом. Докладну інформацію можна знайти в журналі. Будь ласка, зверніться до вашого адміністратора.", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "Сталася помилка відсутніх даних. Докладну інформацію можна знайти в журналі. Будь ласка, зверніться до вашого адміністратора.", @@ -167,6 +177,7 @@ "Selection" : "Вибір", "Date and time" : "Дата та час", "Users and groups" : "Користувачі та групи", + "Relation" : "Зв'язок", "Column type" : "Тип стовпця", "Move" : "Перемістити", "Metadata" : "Метадані", @@ -214,7 +225,8 @@ "Edit table" : "Редагувати таблицю", "Create column" : "Додати стовпець", "Import" : "Імпорт", - "Export as CSV" : "Експорт у CSV", + "Export all rows" : "Експортувати всі рядки", + "Export filtered rows" : "Експортувати відфільтровані рядки", "Filtered view" : "Подання з фільтром", "Reset local adjustments" : "Скинути фільтри", "No columns" : "Відсутні стовпці", @@ -226,6 +238,9 @@ "Please insert a title for the new column." : "Додайте заголовок до нового стовпця.", "Cannot save column. Column width must be between {min} and {max}." : "Неможливо зберегти стовпець. Ширина стовпця має бути між {min} та {max}.", "You need to select a type for the new column." : "Потрібно вибрати тип нового стовпця.", + "Please select a relation type." : "Виберіть тип зв'язку.", + "Please select a target." : "Виберіть призначення.", + "Please select a label for relation selection." : "Виберіть ярлик для вибору зв'язку.", "The column \"{column}\" was created." : "Стовпець \"{column}\" було додано.", "Sorry, something went wrong." : "От халепа, щось пішло не так.", "Could not create new column." : "Не вдалося додати стовпець.", @@ -314,6 +329,7 @@ "I really want to delete this table!" : "Я справді хочу вилучити цю таблицю!", "Change owner" : "Змінити власника", "Could not create table" : "Не вдалося створити таблицю", + "File import started, this might take a while. You will be notified once it finished." : "Розпочато імпорт файлу. Ви отримаєте сповіщення про завершення операції.", "You must select an existing table" : "Ви маєте обрати наявну таблицю", "Could not import data to table" : "Не вдалося імпортувати дані до таблиці", "Import file into Tables" : "Імпортувати файл до Таблиць", @@ -393,7 +409,7 @@ "Copy" : "Копія", "Could not configure new view" : "Не вдалося налаштувати нове подання", "Duplicate view" : "Зробити копію подання", - "Filter items" : "Фільтрувати", + "Filter items" : "Швидкий фільтр ...", "Favorites" : "Із зірочкою", "Archived tables" : "Архівовані таблиці", "Applications" : "Застосунки", @@ -490,6 +506,8 @@ "Link providers" : "Посилання постачальників", "This option is outdated." : "Ця опція застаріла.", "Options" : "Параметри", + "This relation does not exist anymore." : "Цей зв'язок вже відсутній.", + "Select relation value" : "Виберіть значення для зв'язку.", "Set {star} stars" : "Додати {star} зірки", "Cell input" : "Вхідний сигнал комірки", "Back" : "Назад", @@ -509,6 +527,7 @@ "Manage column" : "Керування стовпцями", "Column manage actions" : "Дії з керування стовпцями", "Hide column" : "Приховати стовпець", + "Copy row" : "Копіювати рядок", "Undo" : "Скасувати", "Redo" : "Повторити", "Bold" : "Грубий", @@ -538,6 +557,12 @@ "Default" : "За замовчуванням", "Reduce stars" : "Зменшити число зірочок", "Increase stars" : "Збільшити число зірочок", + "Relation type" : "Тип зв'язку", + "Select relation type" : "Виберіть тип зв'язку", + "Select target" : "Виберіть призначення", + "Label for relation selection" : "Ярлик для вибору зв'язку", + "Select label for relation selection" : "Виберіть ярлик для вибору зв'язку", + "Only text and number columns can be used as label" : "Лише стовпці, що містять текст та цифри можна використовувати як ярлики", "First option" : "Варіант 1", "Second option" : "Варіант 2", "Delete option" : "Вилучити опцію", @@ -562,7 +587,7 @@ "Show fullscreen" : "На весь екран", "Close editor" : "Закрити редактор", "Create Row" : "Додати рядок", - "Export CSV" : "Експорт у CSV", + "Export selected rows" : "Експортувати вибрані рядки", "Uncheck all" : "Зняти все", "_%n selected row_::_%n selected rows_" : ["Вибрано %n рядок","Вибрано %n рядки","Вибрано %n рядків","Вибрано %n рядків"], "Go to first page" : "На першу сторінку", @@ -636,6 +661,7 @@ "Could not insert column." : "Не вдалося вставити стовпці.", "Could not update column." : "Не вдалося оновити стовпець.", "Could not remove column." : "Не вдалося вилучити стовпець.", + "Could not load relation data." : "Не вдалося завантажити дані щодо зв'язку.", "Could not load rows." : "Не вдалося завантажити рядки.", "Outdated data. View is reloaded" : "Застарілі дані. Подання завантажено повторно", "Could not insert row." : "Не вдалося вставити рядок.", diff --git a/l10n/uz.js b/l10n/uz.js index 2f812aeade..afcbe2d4bf 100644 --- a/l10n/uz.js +++ b/l10n/uz.js @@ -8,6 +8,7 @@ OC.L10N.register( "Timestamp of data load" : "Ma'lumotlarni yuklash vaqt belgisi", "No" : "No", "Yes" : "Yes", + "Count" : "Hisoblash", "The file was uploaded" : "Fayl yuklangan edi", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Yuklangan fayl php.ini dagi php-dagi upload_max_filesize direktivasidan oshadi", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yuklangan fayl HTML shaklida ko'rsatilgan MAX_FILE_SIZE direktivasidan oshadi", diff --git a/l10n/uz.json b/l10n/uz.json index 96db74fa5d..05f11f7553 100644 --- a/l10n/uz.json +++ b/l10n/uz.json @@ -6,6 +6,7 @@ "Timestamp of data load" : "Ma'lumotlarni yuklash vaqt belgisi", "No" : "No", "Yes" : "Yes", + "Count" : "Hisoblash", "The file was uploaded" : "Fayl yuklangan edi", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Yuklangan fayl php.ini dagi php-dagi upload_max_filesize direktivasidan oshadi", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yuklangan fayl HTML shaklida ko'rsatilgan MAX_FILE_SIZE direktivasidan oshadi", diff --git a/l10n/vi.js b/l10n/vi.js index db5b58209d..9cb25c9b73 100644 --- a/l10n/vi.js +++ b/l10n/vi.js @@ -132,7 +132,6 @@ OC.L10N.register( "Edit table" : "Chỉnh sửa bảng", "Create column" : "Tạo cột", "Import" : "Nhập vào", - "Export as CSV" : "Xuất ra dưới dạng CSV", "No columns" : "Không có cột ", "We need at least one column, please be so kind and create one." : "Chúng tôi cần ít nhất một cột, vui lòng tạo một cột.", "No columns selected" : "Không có cột nào được chọn", diff --git a/l10n/vi.json b/l10n/vi.json index 93e5c0bfc5..6d1d51f957 100644 --- a/l10n/vi.json +++ b/l10n/vi.json @@ -130,7 +130,6 @@ "Edit table" : "Chỉnh sửa bảng", "Create column" : "Tạo cột", "Import" : "Nhập vào", - "Export as CSV" : "Xuất ra dưới dạng CSV", "No columns" : "Không có cột ", "We need at least one column, please be so kind and create one." : "Chúng tôi cần ít nhất một cột, vui lòng tạo một cột.", "No columns selected" : "Không có cột nào được chọn", diff --git a/l10n/zh_CN.js b/l10n/zh_CN.js index e8d2599fea..e364d6c6c9 100644 --- a/l10n/zh_CN.js +++ b/l10n/zh_CN.js @@ -9,6 +9,7 @@ OC.L10N.register( "Timestamp of data load" : "数据加载时间戳", "No" : "否", "Yes" : "是", + "Count" : "计数", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "一个意料之外的问题发生了。 更多详细信息可以在日志中找到。 请联系您的管理部门。", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "发生权限错误。 更多详细信息可以在日志中找到。 请联系您的管理部门。", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "发生未找到错误。 更多详细信息可以在日志中找到。 请联系您的管理部门。", @@ -182,7 +183,6 @@ OC.L10N.register( "Edit table" : "编辑表", "Create column" : "创建列", "Import" : "导入", - "Export as CSV" : "导出为CSV", "Filtered view" : "过滤视图", "Reset local adjustments" : "重置本地设置", "No columns" : "没有列", diff --git a/l10n/zh_CN.json b/l10n/zh_CN.json index a0e77b72c9..9b81cb80ff 100644 --- a/l10n/zh_CN.json +++ b/l10n/zh_CN.json @@ -7,6 +7,7 @@ "Timestamp of data load" : "数据加载时间戳", "No" : "否", "Yes" : "是", + "Count" : "计数", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "一个意料之外的问题发生了。 更多详细信息可以在日志中找到。 请联系您的管理部门。", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "发生权限错误。 更多详细信息可以在日志中找到。 请联系您的管理部门。", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "发生未找到错误。 更多详细信息可以在日志中找到。 请联系您的管理部门。", @@ -180,7 +181,6 @@ "Edit table" : "编辑表", "Create column" : "创建列", "Import" : "导入", - "Export as CSV" : "导出为CSV", "Filtered view" : "过滤视图", "Reset local adjustments" : "重置本地设置", "No columns" : "没有列", diff --git a/l10n/zh_HK.js b/l10n/zh_HK.js index 3a25b23c0c..9e06e8bf24 100644 --- a/l10n/zh_HK.js +++ b/l10n/zh_HK.js @@ -15,6 +15,15 @@ OC.L10N.register( "_{user} has updated cell %1$s on row {row} in table {table}_::_{user} has updated cells %1$s on row {row} in table {table}_" : ["{user} 已在 {table} 數據庫表的第 {row} 行更新了儲存格 %1$s"], "You have deleted the row {row} in table {table}" : "您已刪除表格 {table} 中的 {row} 列", "{user} has deleted the row {row} in table {table}" : "{user} 已刪除表格 {table} 中的 {row} 列", + "You have imported file to table {table}" : "你已將檔案匯入至資料表 {table}", + "{user} has imported file to table {table}" : "{user} 已將檔案匯入至資料表 {table}", + "Found columns: {foundColumnsCount}" : "找到欄位:{foundColumnsCount}", + "Matching columns: {matchingColumnsCount}" : "符合欄位:{matchingColumnsCount}", + "Created columns: {createdColumnsCount}" : "已建立欄位:{createdColumnsCount}", + "Inserted rows: {insertedRowsCount}" : "已插入列數:{insertedRowsCount}", + "Updated rows: {updatedRowsCount}" : "已更新列數:{updatedRowsCount}", + "Value parsing errors: {errorsParsingCount}" : "數值解析錯誤:{errorsParsingCount}", + "Row creation errors: {errorsCount}" : "建立列時發生錯誤:{errorsCount}", "Tables" : "數據庫表", "A table or row was changed" : "已變更表格或列", "Nextcloud Tables" : "Nextcloud 表格", @@ -24,6 +33,7 @@ OC.L10N.register( "Timestamp of data load" : "數據加載時間戳", "No" : "否", "Yes" : "是", + "Count" : "次數", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "發生了意料之外的錯誤。可在紀錄檔中找到更多詳細資訊。請聯絡您的管理員。", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "發生了權限錯誤。可在紀錄檔中找到更多詳細資訊。請聯絡您的管理員。", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "發生了找不到的錯誤。可在紀錄檔中找到更多詳細資訊。請聯絡您的管理員。", @@ -46,6 +56,7 @@ OC.L10N.register( "Column width must be between %1$s and %2$s." : "欄寬必須在 %1$s 到 %2$s 間。", "This column was automatically created by the import service." : "此直欄為自動從匯入服務建立。", "Column \"%s\" contains a non-unique value." : "直欄 \"%s\" 含有非唯一數值。", + "Column \"%s\" contains an invalid protocol. Only http and https are allowed." : "欄位「%s」包含無效協定,只允許使用 http 與 https。", "Welcome to %s Tables!" : "歡迎使用 %s 數據庫表!", "ToDo list" : "待辦清單", "Setup a simple todo-list." : "設置一個簡單的待辦事項清單。", @@ -215,7 +226,8 @@ OC.L10N.register( "Edit table" : "編輯數據庫表", "Create column" : "創建直欄", "Import" : "導入", - "Export as CSV" : "匯出為 CSV", + "Export all rows" : "匯出所有列", + "Export filtered rows" : "匯出已篩選列", "Filtered view" : "已過濾檢視", "Reset local adjustments" : "重置局部調整", "No columns" : "沒有直欄", @@ -253,8 +265,11 @@ OC.L10N.register( "Show in app list" : "在應用程式清單中顯示", "This can be overridden by a per-account preference" : "這可以被每個帳戶的偏好設置覆蓋", "Create application" : "建立應用程式", + "Fill form" : "填寫表單", "Create row" : "創建列", + "Fill form again" : "再次填寫表單", "Submit" : "遞交", + "Form successfully submitted." : "表單已成功提交。", "Row successfully created." : "成功建立一列。", "Could not create new row" : "無法創建新列", "\"{columnTitle}\" should not be empty" : "\"{columnTitle}\" 不應為空", @@ -312,6 +327,7 @@ OC.L10N.register( "I really want to delete this table!" : "我真的很想刪除此數據庫表!", "Change owner" : "更新所有者", "Could not create table" : "無法創建數據庫表", + "File import started, this might take a while. You will be notified once it finished." : "檔案匯入已開始,可能需時一段時間。完成後你將收到通知。", "You must select an existing table" : "您必須選擇一個現有的數據庫表", "Could not import data to table" : "無法將數據導入到數據庫表", "Import file into Tables" : "導入檔案至數據庫表", @@ -428,6 +444,7 @@ OC.L10N.register( "View only" : "僅檢視", "Can edit" : "可編輯", "Custom permissions" : "自訂權限", + "Quick share options, current: {option}" : "快速分享選項,目前為:{option}", "Read" : "已讀", "Update" : "更新", "Error creating link share" : "創建連結分享出錯", @@ -472,7 +489,9 @@ OC.L10N.register( "Could not load editor, text not available." : "無法加載編輯器,文本不可用。", "Icon {iconName} loading" : "正在載入圖示 {iconName}", "Download" : "下載", + "This is a public form." : "這是一個公開表單。", "Create rows" : "創建列", + "You can add one or more replies." : "你可以新增一個或多個回覆。", "You are not allowed to read this table, but you can still create rows." : "您不能讀取此數據庫表,但您仍然可以創建列。", "No permissions" : "沒有權限", "You have no permissions for this table." : "您無權操作此數據庫表。", @@ -504,6 +523,7 @@ OC.L10N.register( "Manage column" : "管理直欄", "Column manage actions" : "直欄管理操作", "Hide column" : "隱藏直欄", + "Copy row" : "複製行", "Undo" : "撤消", "Redo" : "重做", "Bold" : "粗體", @@ -557,7 +577,7 @@ OC.L10N.register( "Show fullscreen" : "顯示全螢幕", "Close editor" : "關閉編輯器", "Create Row" : "創建列", - "Export CSV" : "匯出為 CSV", + "Export selected rows" : "匯出已選取列", "Uncheck all" : "取消全選", "_%n selected row_::_%n selected rows_" : ["%n 已選擇的列"], "Go to first page" : "前往第一頁", @@ -585,6 +605,7 @@ OC.L10N.register( "Could not update share." : "無法更新分享。", "Could not update cell" : "無法更新儲存格", "Filter operator" : "過濾器運算符", + "Contains items" : "包含項目", "Contains" : "包含", "Does not contain" : "不包含", "Begins with" : "開始於", diff --git a/l10n/zh_HK.json b/l10n/zh_HK.json index 297b6f1487..35117ccf2d 100644 --- a/l10n/zh_HK.json +++ b/l10n/zh_HK.json @@ -13,6 +13,15 @@ "_{user} has updated cell %1$s on row {row} in table {table}_::_{user} has updated cells %1$s on row {row} in table {table}_" : ["{user} 已在 {table} 數據庫表的第 {row} 行更新了儲存格 %1$s"], "You have deleted the row {row} in table {table}" : "您已刪除表格 {table} 中的 {row} 列", "{user} has deleted the row {row} in table {table}" : "{user} 已刪除表格 {table} 中的 {row} 列", + "You have imported file to table {table}" : "你已將檔案匯入至資料表 {table}", + "{user} has imported file to table {table}" : "{user} 已將檔案匯入至資料表 {table}", + "Found columns: {foundColumnsCount}" : "找到欄位:{foundColumnsCount}", + "Matching columns: {matchingColumnsCount}" : "符合欄位:{matchingColumnsCount}", + "Created columns: {createdColumnsCount}" : "已建立欄位:{createdColumnsCount}", + "Inserted rows: {insertedRowsCount}" : "已插入列數:{insertedRowsCount}", + "Updated rows: {updatedRowsCount}" : "已更新列數:{updatedRowsCount}", + "Value parsing errors: {errorsParsingCount}" : "數值解析錯誤:{errorsParsingCount}", + "Row creation errors: {errorsCount}" : "建立列時發生錯誤:{errorsCount}", "Tables" : "數據庫表", "A table or row was changed" : "已變更表格或列", "Nextcloud Tables" : "Nextcloud 表格", @@ -22,6 +31,7 @@ "Timestamp of data load" : "數據加載時間戳", "No" : "否", "Yes" : "是", + "Count" : "次數", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "發生了意料之外的錯誤。可在紀錄檔中找到更多詳細資訊。請聯絡您的管理員。", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "發生了權限錯誤。可在紀錄檔中找到更多詳細資訊。請聯絡您的管理員。", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "發生了找不到的錯誤。可在紀錄檔中找到更多詳細資訊。請聯絡您的管理員。", @@ -44,6 +54,7 @@ "Column width must be between %1$s and %2$s." : "欄寬必須在 %1$s 到 %2$s 間。", "This column was automatically created by the import service." : "此直欄為自動從匯入服務建立。", "Column \"%s\" contains a non-unique value." : "直欄 \"%s\" 含有非唯一數值。", + "Column \"%s\" contains an invalid protocol. Only http and https are allowed." : "欄位「%s」包含無效協定,只允許使用 http 與 https。", "Welcome to %s Tables!" : "歡迎使用 %s 數據庫表!", "ToDo list" : "待辦清單", "Setup a simple todo-list." : "設置一個簡單的待辦事項清單。", @@ -213,7 +224,8 @@ "Edit table" : "編輯數據庫表", "Create column" : "創建直欄", "Import" : "導入", - "Export as CSV" : "匯出為 CSV", + "Export all rows" : "匯出所有列", + "Export filtered rows" : "匯出已篩選列", "Filtered view" : "已過濾檢視", "Reset local adjustments" : "重置局部調整", "No columns" : "沒有直欄", @@ -251,8 +263,11 @@ "Show in app list" : "在應用程式清單中顯示", "This can be overridden by a per-account preference" : "這可以被每個帳戶的偏好設置覆蓋", "Create application" : "建立應用程式", + "Fill form" : "填寫表單", "Create row" : "創建列", + "Fill form again" : "再次填寫表單", "Submit" : "遞交", + "Form successfully submitted." : "表單已成功提交。", "Row successfully created." : "成功建立一列。", "Could not create new row" : "無法創建新列", "\"{columnTitle}\" should not be empty" : "\"{columnTitle}\" 不應為空", @@ -310,6 +325,7 @@ "I really want to delete this table!" : "我真的很想刪除此數據庫表!", "Change owner" : "更新所有者", "Could not create table" : "無法創建數據庫表", + "File import started, this might take a while. You will be notified once it finished." : "檔案匯入已開始,可能需時一段時間。完成後你將收到通知。", "You must select an existing table" : "您必須選擇一個現有的數據庫表", "Could not import data to table" : "無法將數據導入到數據庫表", "Import file into Tables" : "導入檔案至數據庫表", @@ -426,6 +442,7 @@ "View only" : "僅檢視", "Can edit" : "可編輯", "Custom permissions" : "自訂權限", + "Quick share options, current: {option}" : "快速分享選項,目前為:{option}", "Read" : "已讀", "Update" : "更新", "Error creating link share" : "創建連結分享出錯", @@ -470,7 +487,9 @@ "Could not load editor, text not available." : "無法加載編輯器,文本不可用。", "Icon {iconName} loading" : "正在載入圖示 {iconName}", "Download" : "下載", + "This is a public form." : "這是一個公開表單。", "Create rows" : "創建列", + "You can add one or more replies." : "你可以新增一個或多個回覆。", "You are not allowed to read this table, but you can still create rows." : "您不能讀取此數據庫表,但您仍然可以創建列。", "No permissions" : "沒有權限", "You have no permissions for this table." : "您無權操作此數據庫表。", @@ -502,6 +521,7 @@ "Manage column" : "管理直欄", "Column manage actions" : "直欄管理操作", "Hide column" : "隱藏直欄", + "Copy row" : "複製行", "Undo" : "撤消", "Redo" : "重做", "Bold" : "粗體", @@ -555,7 +575,7 @@ "Show fullscreen" : "顯示全螢幕", "Close editor" : "關閉編輯器", "Create Row" : "創建列", - "Export CSV" : "匯出為 CSV", + "Export selected rows" : "匯出已選取列", "Uncheck all" : "取消全選", "_%n selected row_::_%n selected rows_" : ["%n 已選擇的列"], "Go to first page" : "前往第一頁", @@ -583,6 +603,7 @@ "Could not update share." : "無法更新分享。", "Could not update cell" : "無法更新儲存格", "Filter operator" : "過濾器運算符", + "Contains items" : "包含項目", "Contains" : "包含", "Does not contain" : "不包含", "Begins with" : "開始於", diff --git a/l10n/zh_TW.js b/l10n/zh_TW.js index 023ca3d3aa..e025dc0571 100644 --- a/l10n/zh_TW.js +++ b/l10n/zh_TW.js @@ -33,6 +33,7 @@ OC.L10N.register( "Timestamp of data load" : "資料載入時間戳", "No" : "否", "Yes" : "是", + "Count" : "次數", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "發生了意料之外的錯誤。可在紀錄檔中找到更多詳細資訊。請聯絡您的管理員。", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "發生了權限錯誤。可在紀錄檔中找到更多詳細資訊。請聯絡您的管理員。", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "發生了找不到的錯誤。可在紀錄檔中找到更多詳細資訊。請聯絡您的管理員。", @@ -178,6 +179,7 @@ OC.L10N.register( "Selection" : "選取", "Date and time" : "日期與時間", "Users and groups" : "使用者與群組", + "Relation" : "關係", "Column type" : "欄類型", "Move" : "移動", "Metadata" : "詮釋資料", @@ -225,7 +227,8 @@ OC.L10N.register( "Edit table" : "編輯表格", "Create column" : "建立欄", "Import" : "匯入", - "Export as CSV" : "匯出為 CSV", + "Export all rows" : "匯出所有列", + "Export filtered rows" : "匯出過濾後的列", "Filtered view" : "已過濾檢視", "Reset local adjustments" : "重設局部調整", "No columns" : "無欄", @@ -237,6 +240,9 @@ OC.L10N.register( "Please insert a title for the new column." : "請輸入新欄位的標題。", "Cannot save column. Column width must be between {min} and {max}." : "無法儲存欄位。欄位寬度必須在 {min} 至 {max} 間。", "You need to select a type for the new column." : "您必須為新欄位選取類型。", + "Please select a relation type." : "請選取關係類型。", + "Please select a target." : "請選取目標。", + "Please select a label for relation selection." : "請選取標籤以進行關係篩選。", "The column \"{column}\" was created." : "欄位「{column}」已建立。", "Sorry, something went wrong." : "抱歉,發生了一點問題。", "Could not create new column." : "無法建立新欄位。", @@ -502,6 +508,8 @@ OC.L10N.register( "Link providers" : "連結提供者", "This option is outdated." : "此選項已過時。", "Options" : "選項", + "This relation does not exist anymore." : "此關係已不存在。", + "Select relation value" : "選取關係值", "Set {star} stars" : "設定 {star} 顆星星", "Cell input" : "儲存格輸入", "Back" : "返回", @@ -521,6 +529,7 @@ OC.L10N.register( "Manage column" : "管理欄位", "Column manage actions" : "欄位管理動作", "Hide column" : "隱藏欄位", + "Copy row" : "複製列", "Undo" : "復原", "Redo" : "重作", "Bold" : "粗體", @@ -550,6 +559,12 @@ OC.L10N.register( "Default" : "預設", "Reduce stars" : "減少星星", "Increase stars" : "增加星星", + "Relation type" : "關係類型", + "Select relation type" : "選取關係類型", + "Select target" : "選取目標", + "Label for relation selection" : "關係選取標籤", + "Select label for relation selection" : "選取標籤以進行關係選取", + "Only text and number columns can be used as label" : "只有文字與數字欄位可作為標籤使用", "First option" : "第一選項", "Second option" : "第二選項", "Delete option" : "刪除選項", @@ -574,7 +589,7 @@ OC.L10N.register( "Show fullscreen" : "顯示全螢幕", "Close editor" : "關閉編輯器", "Create Row" : "建立列", - "Export CSV" : "匯出 CSV", + "Export selected rows" : "匯出選定的列", "Uncheck all" : "取消勾選全部", "_%n selected row_::_%n selected rows_" : ["%n 個選定的列"], "Go to first page" : "前往第一頁", @@ -648,6 +663,7 @@ OC.L10N.register( "Could not insert column." : "無法插入欄。", "Could not update column." : "無法更新欄。", "Could not remove column." : "無法移除欄。", + "Could not load relation data." : "無法載入關係資料。", "Could not load rows." : "無法載入列。", "Outdated data. View is reloaded" : "過期資料。檢視已重新載入", "Could not insert row." : "無法插入列。", diff --git a/l10n/zh_TW.json b/l10n/zh_TW.json index 1d92a10bca..d281e7a295 100644 --- a/l10n/zh_TW.json +++ b/l10n/zh_TW.json @@ -31,6 +31,7 @@ "Timestamp of data load" : "資料載入時間戳", "No" : "否", "Yes" : "是", + "Count" : "次數", "An unexpected error occurred. More details can be found in the logs. Please reach out to your administration." : "發生了意料之外的錯誤。可在紀錄檔中找到更多詳細資訊。請聯絡您的管理員。", "A permission error occurred. More details can be found in the logs. Please reach out to your administration." : "發生了權限錯誤。可在紀錄檔中找到更多詳細資訊。請聯絡您的管理員。", "A not found error occurred. More details can be found in the logs. Please reach out to your administration." : "發生了找不到的錯誤。可在紀錄檔中找到更多詳細資訊。請聯絡您的管理員。", @@ -176,6 +177,7 @@ "Selection" : "選取", "Date and time" : "日期與時間", "Users and groups" : "使用者與群組", + "Relation" : "關係", "Column type" : "欄類型", "Move" : "移動", "Metadata" : "詮釋資料", @@ -223,7 +225,8 @@ "Edit table" : "編輯表格", "Create column" : "建立欄", "Import" : "匯入", - "Export as CSV" : "匯出為 CSV", + "Export all rows" : "匯出所有列", + "Export filtered rows" : "匯出過濾後的列", "Filtered view" : "已過濾檢視", "Reset local adjustments" : "重設局部調整", "No columns" : "無欄", @@ -235,6 +238,9 @@ "Please insert a title for the new column." : "請輸入新欄位的標題。", "Cannot save column. Column width must be between {min} and {max}." : "無法儲存欄位。欄位寬度必須在 {min} 至 {max} 間。", "You need to select a type for the new column." : "您必須為新欄位選取類型。", + "Please select a relation type." : "請選取關係類型。", + "Please select a target." : "請選取目標。", + "Please select a label for relation selection." : "請選取標籤以進行關係篩選。", "The column \"{column}\" was created." : "欄位「{column}」已建立。", "Sorry, something went wrong." : "抱歉,發生了一點問題。", "Could not create new column." : "無法建立新欄位。", @@ -500,6 +506,8 @@ "Link providers" : "連結提供者", "This option is outdated." : "此選項已過時。", "Options" : "選項", + "This relation does not exist anymore." : "此關係已不存在。", + "Select relation value" : "選取關係值", "Set {star} stars" : "設定 {star} 顆星星", "Cell input" : "儲存格輸入", "Back" : "返回", @@ -519,6 +527,7 @@ "Manage column" : "管理欄位", "Column manage actions" : "欄位管理動作", "Hide column" : "隱藏欄位", + "Copy row" : "複製列", "Undo" : "復原", "Redo" : "重作", "Bold" : "粗體", @@ -548,6 +557,12 @@ "Default" : "預設", "Reduce stars" : "減少星星", "Increase stars" : "增加星星", + "Relation type" : "關係類型", + "Select relation type" : "選取關係類型", + "Select target" : "選取目標", + "Label for relation selection" : "關係選取標籤", + "Select label for relation selection" : "選取標籤以進行關係選取", + "Only text and number columns can be used as label" : "只有文字與數字欄位可作為標籤使用", "First option" : "第一選項", "Second option" : "第二選項", "Delete option" : "刪除選項", @@ -572,7 +587,7 @@ "Show fullscreen" : "顯示全螢幕", "Close editor" : "關閉編輯器", "Create Row" : "建立列", - "Export CSV" : "匯出 CSV", + "Export selected rows" : "匯出選定的列", "Uncheck all" : "取消勾選全部", "_%n selected row_::_%n selected rows_" : ["%n 個選定的列"], "Go to first page" : "前往第一頁", @@ -646,6 +661,7 @@ "Could not insert column." : "無法插入欄。", "Could not update column." : "無法更新欄。", "Could not remove column." : "無法移除欄。", + "Could not load relation data." : "無法載入關係資料。", "Could not load rows." : "無法載入列。", "Outdated data. View is reloaded" : "過期資料。檢視已重新載入", "Could not insert row." : "無法插入列。", diff --git a/lib/Activity/ActivityManager.php b/lib/Activity/ActivityManager.php index fd54a40b88..7ec0070972 100644 --- a/lib/Activity/ActivityManager.php +++ b/lib/Activity/ActivityManager.php @@ -277,7 +277,6 @@ public function getActivityMessage($language, $subjectIdentifier) { $l->t('Row creation errors: {errorsCount}'), ]; return implode("\n", $lines); - default: return null; } diff --git a/lib/Activity/TablesProvider.php b/lib/Activity/TablesProvider.php index 2ec665acf0..fe23c4f55d 100644 --- a/lib/Activity/TablesProvider.php +++ b/lib/Activity/TablesProvider.php @@ -8,6 +8,7 @@ namespace OCA\Tables\Activity; +use OCP\Activity\Exceptions\UnknownActivityException; use OCP\Activity\IEvent; use OCP\Activity\IProvider; use OCP\IURLGenerator; @@ -25,9 +26,12 @@ public function __construct( ) { } + /** + * @throws UnknownActivityException + */ public function parse($language, IEvent $event, ?IEvent $previousEvent = null): IEvent { if ($event->getApp() !== 'tables') { - throw new \InvalidArgumentException(); + throw new UnknownActivityException(); } $event = $this->setIcon($event); diff --git a/lib/Analytics/AnalyticsDatasource.php b/lib/Analytics/AnalyticsDatasource.php index 5a61416fd0..170f35ddc8 100644 --- a/lib/Analytics/AnalyticsDatasource.php +++ b/lib/Analytics/AnalyticsDatasource.php @@ -8,6 +8,7 @@ namespace OCA\Tables\Analytics; use OCA\Analytics\Datasource\IDatasource; +use OCA\Tables\Db\Column; use OCA\Tables\Errors\InternalError; use OCA\Tables\Errors\NotFoundError; use OCA\Tables\Errors\PermissionError; @@ -21,6 +22,7 @@ use Psr\Log\LoggerInterface; class AnalyticsDatasource implements IDatasource { + private LoggerInterface $logger; private IL10N $l10n; private TableService $tableService; @@ -120,9 +122,24 @@ public function getTemplate(): array { $tableString = $tableString . $view->getTableId() . ':' . $view->getId() . '-' . $view->getTitle() . '/'; } // add the tables to a dropdown in the data source settings - $template[] = ['id' => 'tableId', 'name' => $this->l10n->t('Select table'), 'type' => 'tf', 'placeholder' => $tableString]; - $template[] = ['id' => 'columns', 'name' => $this->l10n->t('Select columns'), 'placeholder' => $this->l10n->t('e.g. 1,2,4 or leave empty'), 'type' => 'columnPicker']; - $template[] = ['id' => 'timestamp', 'name' => $this->l10n->t('Timestamp of data load'), 'placeholder' => 'false-' . $this->l10n->t('No') . '/true-' . $this->l10n->t('Yes'), 'type' => 'tf']; + $template[] = [ + 'id' => 'tableId', + 'name' => $this->l10n->t('Select table'), + 'type' => 'tf', + 'placeholder' => $tableString + ]; + $template[] = [ + 'id' => 'columns', + 'name' => $this->l10n->t('Select columns'), + 'placeholder' => $this->l10n->t('e.g. 1,2,4 or leave empty'), + 'type' => 'columnPicker' + ]; + $template[] = [ + 'id' => 'timestamp', + 'name' => $this->l10n->t('Timestamp of data load'), + 'placeholder' => 'false-' . $this->l10n->t('No') . '/true-' . $this->l10n->t('Yes'), + 'type' => 'tf' + ]; return $template; } @@ -166,7 +183,7 @@ public function readData($option): array { // get the selected columns from the data source options $selectedColumns = []; if (isset($option['columns']) && strlen($option['columns']) > 0) { - $selectedColumns = str_getcsv($option['columns']); + $selectedColumns = str_getcsv($option['columns'], ',', '"', '\\'); } $data = []; @@ -183,8 +200,12 @@ public function readData($option): array { } unset($rows); - return ['header' => $header, 'dimensions' => array_slice($header, 0, count($header) - 1), 'data' => $data, //'rawdata' => $data, - 'error' => 0,]; + return [ + 'header' => $header, + 'dimensions' => array_slice($header, 0, count($header) - 1), + 'data' => $data, //'rawdata' => $data, + 'error' => 0, + ]; } /** @@ -219,6 +240,7 @@ private function getData(int $nodeId, ?int $limit, ?int $offset, ?string $nodeTy foreach ($columns as $column) { $header[] = $column->getTitle(); } + $header[] = $this->l10n->t('Count'); $data[] = $header; // now add the rows @@ -229,29 +251,171 @@ private function getData(int $nodeId, ?int $limit, ?int $offset, ?string $nodeTy $value = ''; foreach ($rowData as $datum) { if ($datum['columnId'] === $column->getId()) { - // if column type selection, the corresponding labels need to be fetched - if ($column->getType() === 'selection') { - foreach ($column->getSelectionOptionsArray() as $option) { - if ($option['id'] === $datum['value']) { - $value = $option['label']; - } - } - } else { - $value = $datum['value']; - } + $value = $this->formatValue($column, $datum['value']); } } - // Tables does not deliver any values for "blank" default columns - if ($value === '' && $column->getType() === 'number') { - $value = $column->getNumberDefault(); + // Tables does not deliver any values for "blank" default columns. + if ($value === '') { + $value = $this->formatDefaultValue($column); } $line[] = $value; } + $line[] = 1; // constant 1 for the count column $data[] = $line; } return $data; } + private function formatValue(Column $column, mixed $value): mixed { + return match ($column->getType()) { + Column::TYPE_SELECTION => $this->formatSelectionValue($column, $value), + Column::TYPE_TEXT => $this->formatTextValue($column, $value), + Column::TYPE_USERGROUP => $this->formatUsergroupValue($value), + default => $value, + }; + } + + private function formatDefaultValue(Column $column): mixed { + return match ($column->getType()) { + Column::TYPE_NUMBER => $column->getNumberDefault() ?? '', + Column::TYPE_SELECTION => $this->formatSelectionValue($column, $this->parseDefaultValue($column->getSelectionDefault())), + Column::TYPE_TEXT => $this->formatTextValue($column, $column->getTextDefault() ?? ''), + Column::TYPE_DATETIME => $this->formatDatetimeDefaultValue($column), + Column::TYPE_USERGROUP => $this->formatUsergroupValue($this->parseDefaultValue($column->getUsergroupDefault())), + default => '', + }; + } + + private function formatSelectionValue(Column $column, mixed $value): mixed { + if ($column->getSubtype() === Column::SUBTYPE_SELECTION_CHECK) { + return $this->formatBooleanValue($value); + } + + if ($this->isMultiSelection($column)) { + return implode(', ', $this->getSelectionLabels($column, $this->normalizeArrayValue($value))); + } + if ($value === null || $value === '') { + return ''; + } + + foreach ($column->getSelectionOptionsArray() as $option) { + if ((int)$option['id'] === (int)$value) { + return $option['label']; + } + } + + return ''; + } + + private function isMultiSelection(Column $column): bool { + return in_array($column->getSubtype(), [Column::SUBTYPE_SELECTION_MULTI, 'multi'], true); + } + + /** + * @param list $values + * @return list + */ + private function getSelectionLabels(Column $column, array $values): array { + $labels = []; + foreach ($values as $value) { + foreach ($column->getSelectionOptionsArray() as $option) { + if ((int)$option['id'] === (int)$value) { + $labels[] = $option['label']; + break; + } + } + } + return $labels; + } + + private function formatBooleanValue(mixed $value): string { + if ($value === true || $value === 1 || $value === '1' || $value === 'true' || $value === 'TRUE') { + return 'true'; + } + if ($value === false || $value === 0 || $value === '0' || $value === 'false' || $value === 'FALSE') { + return 'false'; + } + return ''; + } + + private function formatTextValue(Column $column, mixed $value): string { + if ($value === null || $value === '') { + return ''; + } + + $value = (string)$value; + if ($column->getSubtype() === 'link') { + return $this->formatLinkValue($value); + } + + return trim(strip_tags($value)); + } + + private function formatLinkValue(string $value): string { + $data = json_decode($value, true); + if (is_array($data)) { + $title = $data['title'] ?? ''; + $link = $data['resourceUrl'] ?? $data['value'] ?? ''; + if ($title !== '' && $link !== '') { + return $title . ' (' . $link . ')'; + } + return $link ?: $title; + } + + return $value; + } + + private function formatDatetimeDefaultValue(Column $column): string { + return match ($column->getDatetimeDefault()) { + 'today' => date('Y-m-d'), + 'now' => $column->getSubtype() === Column::SUBTYPE_DATETIME_TIME ? date('H:i') : date('Y-m-d H:i'), + default => '', + }; + } + + private function formatUsergroupValue(mixed $value): string { + $items = $this->normalizeArrayValue($value); + $labels = []; + + foreach ($items as $item) { + if (is_array($item)) { + $labels[] = (string)($item['displayName'] ?? $item['id'] ?? ''); + } else { + $labels[] = (string)$item; + } + } + + return implode(', ', array_filter($labels, static fn (string $label): bool => $label !== '')); + } + + private function parseDefaultValue(?string $value): mixed { + if ($value === null || $value === '') { + return ''; + } + + $decoded = json_decode($value, true); + return json_last_error() === JSON_ERROR_NONE ? $decoded : $value; + } + + /** + * @return list + */ + private function normalizeArrayValue(mixed $value): array { + if ($value === null || $value === '') { + return []; + } + if (is_array($value)) { + return array_is_list($value) ? $value : [$value]; + } + if (is_string($value)) { + $decoded = json_decode($value, true); + if (json_last_error() === JSON_ERROR_NONE) { + return $this->normalizeArrayValue($decoded); + } + } + return [$value]; + } + /** * filter only the selected columns in the given sequence * diff --git a/lib/Api/V1Api.php b/lib/Api/V1Api.php index 03b9cccf38..bff1779b07 100644 --- a/lib/Api/V1Api.php +++ b/lib/Api/V1Api.php @@ -4,6 +4,7 @@ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Api; use OCA\Tables\Errors\InternalError; diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index a1355b0629..76c2c2a45c 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -4,10 +4,12 @@ * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\AppInfo; use Exception; use OCA\Analytics\Datasource\DatasourceEvent; +use OCA\Circles\Events\CircleDestroyedEvent; use OCA\Tables\Capabilities; use OCA\Tables\Event\RowDeletedEvent; use OCA\Tables\Event\TableDeletedEvent; @@ -17,6 +19,7 @@ use OCA\Tables\Listener\AnalyticsDatasourceListener; use OCA\Tables\Listener\BeforeTemplateRenderedListener; use OCA\Tables\Listener\LoadAdditionalListener; +use OCA\Tables\Listener\ReceiverCleanupListener; use OCA\Tables\Listener\TablesReferenceListener; use OCA\Tables\Listener\UserDeletedListener; use OCA\Tables\Listener\WhenRowDeletedAuditLogListener; @@ -39,7 +42,9 @@ use OCP\Collaboration\Reference\RenderReferenceEvent; use OCP\Collaboration\Resources\LoadAdditionalScriptsEvent; use OCP\DB\Events\AddMissingIndicesEvent; +use OCP\Group\Events\GroupDeletedEvent; use OCP\User\Events\BeforeUserDeletedEvent; +use OCP\User\Events\UserDeletedEvent; use Psr\Container\ContainerInterface; class Application extends App implements IBootstrap { @@ -86,6 +91,9 @@ public function register(IRegistrationContext $context): void { $context->registerEventListener(RowDeletedEvent::class, WhenRowDeletedAuditLogListener::class); $context->registerEventListener(TableOwnershipTransferredEvent::class, WhenTableTransferredAuditLogListener::class); $context->registerEventListener(AddMissingIndicesEvent::class, AddMissingIndicesListener::class); + $context->registerEventListener(UserDeletedEvent::class, ReceiverCleanupListener::class); + $context->registerEventListener(GroupDeletedEvent::class, ReceiverCleanupListener::class); + $context->registerEventListener(CircleDestroyedEvent::class, ReceiverCleanupListener::class); $context->registerSearchProvider(SearchTablesProvider::class); diff --git a/lib/BackgroundJob/ConvertViewColumnsFormat.php b/lib/BackgroundJob/ConvertViewColumnsFormat.php index e06adbdc58..8ac5eeed1c 100644 --- a/lib/BackgroundJob/ConvertViewColumnsFormat.php +++ b/lib/BackgroundJob/ConvertViewColumnsFormat.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\BackgroundJob; use OCA\Tables\Service\ValueObject\ViewColumnInformation; diff --git a/lib/Command/AddTable.php b/lib/Command/AddTable.php index 0a3a2d12c1..944a7eb7c9 100644 --- a/lib/Command/AddTable.php +++ b/lib/Command/AddTable.php @@ -7,6 +7,7 @@ namespace OCA\Tables\Command; +use InvalidArgumentException; use OCA\Tables\Errors\InternalError; use OCA\Tables\Errors\PermissionError; use OCA\Tables\Service\TableService; @@ -78,7 +79,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int unset($arr['rowsCount']); unset($arr['ownerDisplayName']); $output->writeln(json_encode($arr, JSON_PRETTY_PRINT)); - } catch (InternalError|PermissionError|Exception $e) { + } catch (InternalError|PermissionError|Exception|InvalidArgumentException $e) { $output->writeln('Error occurred: ' . $e->getMessage()); $this->logger->warning('Following error occurred during executing occ command "' . self::class . '"', ['exception' => $e]); return 1; diff --git a/lib/Command/Clean.php b/lib/Command/Clean.php index b99ba518d7..40e49efcd5 100644 --- a/lib/Command/Clean.php +++ b/lib/Command/Clean.php @@ -106,7 +106,6 @@ private function getNextRow():void { } } - /** * Take each data set from all rows and check if the column (mapped by id) exists * diff --git a/lib/Command/CleanLegacy.php b/lib/Command/CleanLegacy.php index ce3563b8e2..b335750b67 100644 --- a/lib/Command/CleanLegacy.php +++ b/lib/Command/CleanLegacy.php @@ -103,7 +103,6 @@ private function getNextRow():void { } } - /** * Take each data set from all rows and check if the column (mapped by id) exists * diff --git a/lib/Command/ListContexts.php b/lib/Command/ListContexts.php index 64d81c0337..3b1afbf86f 100644 --- a/lib/Command/ListContexts.php +++ b/lib/Command/ListContexts.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Command; use OC\Core\Command\Base; diff --git a/lib/Command/RenameTable.php b/lib/Command/RenameTable.php index 8f656cd86f..d525d65da4 100644 --- a/lib/Command/RenameTable.php +++ b/lib/Command/RenameTable.php @@ -7,6 +7,7 @@ namespace OCA\Tables\Command; +use InvalidArgumentException; use OCA\Tables\Errors\InternalError; use OCA\Tables\Service\TableService; use Psr\Log\LoggerInterface; @@ -84,7 +85,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int unset($arr['rowsCount']); unset($arr['ownerDisplayName']); $output->writeln(json_encode($arr, JSON_PRETTY_PRINT)); - } catch (InternalError $e) { + } catch (InternalError|InvalidArgumentException $e) { $output->writeln('Error occurred: ' . $e->getMessage()); $this->logger->warning('Following error occurred during executing occ command "' . self::class . '"', ['exception' => $e]); return 1; diff --git a/lib/Command/ShowContext.php b/lib/Command/ShowContext.php index ec3dbcc848..248d7d4a69 100644 --- a/lib/Command/ShowContext.php +++ b/lib/Command/ShowContext.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Command; use OC\Core\Command\Base; diff --git a/lib/Constants/ColumnType.php b/lib/Constants/ColumnType.php index 1be1f5ecdf..f296de2f74 100644 --- a/lib/Constants/ColumnType.php +++ b/lib/Constants/ColumnType.php @@ -15,4 +15,5 @@ enum ColumnType: string { case SELECTION = 'selection'; case DATETIME = 'datetime'; case PEOPLE = 'usergroup'; + case RELATION = 'relation'; } diff --git a/lib/Controller/AOCSController.php b/lib/Controller/AOCSController.php index 86d0598eb4..b74a0839d5 100644 --- a/lib/Controller/AOCSController.php +++ b/lib/Controller/AOCSController.php @@ -4,6 +4,7 @@ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Controller; use Exception; diff --git a/lib/Controller/Api1Controller.php b/lib/Controller/Api1Controller.php index 9eccdd274a..1467e46c57 100644 --- a/lib/Controller/Api1Controller.php +++ b/lib/Controller/Api1Controller.php @@ -25,6 +25,7 @@ use OCA\Tables\ResponseDefinitions; use OCA\Tables\Service\ColumnService; use OCA\Tables\Service\ImportService; +use OCA\Tables\Service\RelationService; use OCA\Tables\Service\RowService; use OCA\Tables\Service\ShareService; use OCA\Tables\Service\TableService; @@ -61,6 +62,7 @@ class Api1Controller extends ApiController { private RowService $rowService; private ImportService $importService; private ViewService $viewService; + private RelationService $relationService; private ViewMapper $viewMapper; private IL10N $l10N; @@ -72,7 +74,6 @@ class Api1Controller extends ApiController { use Errors; - public function __construct( IRequest $request, TableService $service, @@ -81,6 +82,7 @@ public function __construct( RowService $rowService, ImportService $importService, ViewService $viewService, + RelationService $relationService, ViewMapper $viewMapper, V1Api $v1Api, LoggerInterface $logger, @@ -94,6 +96,7 @@ public function __construct( $this->rowService = $rowService; $this->importService = $importService; $this->viewService = $viewService; + $this->relationService = $relationService; $this->viewMapper = $viewMapper; $this->userId = $userId; $this->v1Api = $v1Api; @@ -131,9 +134,10 @@ public function index(): DataResponse { * @param string|null $emoji Emoji for the table * @param string $template Template to use if wanted * - * @return DataResponse|DataResponse + * @return DataResponse|DataResponse * * 200: Tables returned + * 400: Invalid request data */ #[NoAdminRequired] #[NoCSRFRequired] @@ -142,6 +146,10 @@ public function index(): DataResponse { public function createTable(string $title, ?string $emoji, string $template = 'custom'): DataResponse { try { return new DataResponse($this->tableService->create($title, $template, $emoji)->jsonSerialize()); + } catch (InvalidArgumentException $e) { + $this->logger->warning('An invalid request occurred: ' . $e->getMessage(), ['exception' => $e]); + $message = ['message' => $e->getMessage()]; + return new DataResponse($message, Http::STATUS_BAD_REQUEST); } catch (InternalError|Exception $e) { $this->logger->error('An internal error or exception occurred: ' . $e->getMessage(), ['exception' => $e]); $message = ['message' => $e->getMessage()]; @@ -232,9 +240,10 @@ public function getTable(int $tableId): DataResponse { * @param string|null $title New table title * @param string|null $emoji New table emoji * @param bool $archived Whether the table is archived - * @return DataResponse|DataResponse + * @return DataResponse|DataResponse * * 200: Tables returned + * 400: Invalid request data * 403: No permissions * 404: Not found */ @@ -246,6 +255,10 @@ public function getTable(int $tableId): DataResponse { public function updateTable(int $tableId, ?string $title = null, ?string $emoji = null, ?bool $archived = false): DataResponse { try { return new DataResponse($this->tableService->update($tableId, $title, $emoji, null, $archived, $this->userId)->jsonSerialize()); + } catch (InvalidArgumentException $e) { + $this->logger->warning('An invalid request occurred: ' . $e->getMessage(), ['exception' => $e]); + $message = ['message' => $e->getMessage()]; + return new DataResponse($message, Http::STATUS_BAD_REQUEST); } catch (PermissionError $e) { $this->logger->warning('A permission error occurred: ' . $e->getMessage(), ['exception' => $e]); $message = ['message' => $e->getMessage()]; @@ -817,13 +830,77 @@ public function indexViewColumns(int $viewId): DataResponse { } } + /** + * Get all relation data for a table + * + * @param int $tableId Table ID + * @return DataResponse>, array{}>|DataResponse + * + * 200: Relation data returned + * 403: No permissions + * 404: Not found + */ + #[NoAdminRequired] + #[NoCSRFRequired] + #[CORS] + #[RequirePermission(permission: Application::PERMISSION_READ, type: Application::NODE_TYPE_TABLE, idParam: 'tableId')] + public function indexTableRelations(int $tableId): DataResponse { + try { + return new DataResponse($this->relationService->getRelationsForTable($tableId)); + } catch (PermissionError $e) { + $this->logger->warning('A permission error occurred: ' . $e->getMessage(), ['exception' => $e]); + $message = ['message' => $e->getMessage()]; + return new DataResponse($message, Http::STATUS_FORBIDDEN); + } catch (InternalError $e) { + $this->logger->error('An internal error or exception occurred: ' . $e->getMessage(), ['exception' => $e]); + $message = ['message' => $e->getMessage()]; + return new DataResponse($message, Http::STATUS_INTERNAL_SERVER_ERROR); + } catch (NotFoundError $e) { + $this->logger->info('A not found error occurred: ' . $e->getMessage(), ['exception' => $e]); + $message = ['message' => $e->getMessage()]; + return new DataResponse($message, Http::STATUS_NOT_FOUND); + } + } + + /** + * Get all relation data for a view + * + * @param int $viewId View ID + * @return DataResponse>, array{}>|DataResponse + * + * 200: Relation data returned + * 403: No permissions + * 404: Not found + */ + #[NoAdminRequired] + #[NoCSRFRequired] + #[CORS] + #[RequirePermission(permission: Application::PERMISSION_READ, type: Application::NODE_TYPE_VIEW, idParam: 'viewId')] + public function indexViewRelations(int $viewId): DataResponse { + try { + return new DataResponse($this->relationService->getRelationsForView($viewId)); + } catch (PermissionError $e) { + $this->logger->warning('A permission error occurred: ' . $e->getMessage(), ['exception' => $e]); + $message = ['message' => $e->getMessage()]; + return new DataResponse($message, Http::STATUS_FORBIDDEN); + } catch (InternalError $e) { + $this->logger->error('An internal error or exception occurred: ' . $e->getMessage(), ['exception' => $e]); + $message = ['message' => $e->getMessage()]; + return new DataResponse($message, Http::STATUS_INTERNAL_SERVER_ERROR); + } catch (NotFoundError $e) { + $this->logger->info('A not found error occurred: ' . $e->getMessage(), ['exception' => $e]); + $message = ['message' => $e->getMessage()]; + return new DataResponse($message, Http::STATUS_NOT_FOUND); + } + } + /** * Create a column * * @param int|null $tableId Table ID * @param int|null $viewId View ID * @param string $title Title - * @param 'text'|'number'|'datetime'|'select'|'usergroup' $type Column main type + * @param 'text'|'number'|'datetime'|'select'|'usergroup'|'relation' $type Column main type * @param string|null $subtype Column sub type * @param bool $mandatory Is the column mandatory * @param string|null $description Description @@ -1601,7 +1678,7 @@ public function createTableShare(int $tableId, string $receiver, string $receive * * @param int $tableId Table ID * @param string $title Title - * @param 'text'|'number'|'datetime'|'select'|'usergroup' $type Column main type + * @param 'text'|'number'|'datetime'|'select'|'usergroup'|'relation' $type Column main type * @param string|null $subtype Column sub type * @param bool $mandatory Is the column mandatory * @param string|null $description Description diff --git a/lib/Controller/ApiColumnsController.php b/lib/Controller/ApiColumnsController.php index fc73b40688..a71a6c6f93 100644 --- a/lib/Controller/ApiColumnsController.php +++ b/lib/Controller/ApiColumnsController.php @@ -31,7 +31,6 @@ */ class ApiColumnsController extends ACommonColumnsOCSController { - public function __construct( IRequest $request, LoggerInterface $logger, @@ -130,11 +129,12 @@ public function show(int $id): DataResponse { * * * @return DataResponse|DataResponse|DataResponse * * * 200: Column created + * 400: Invalid request data * 403: No permission * 404: Not found * @throws InternalError @@ -147,26 +147,30 @@ public function show(int $id): DataResponse { public function createNumberColumn(int $baseNodeId, string $title, ?float $numberDefault, ?int $numberDecimals, ?string $numberPrefix, ?string $numberSuffix, ?float $numberMin, ?float $numberMax, ?string $subtype = null, ?string $description = null, ?array $selectedViewIds = [], bool $mandatory = false, string $baseNodeType = 'table', array $customSettings = []): DataResponse { $tableId = $baseNodeType === 'table' ? $baseNodeId : null; $viewId = $baseNodeType === 'view' ? $baseNodeId : null; - $column = $this->service->create( - $this->userId, - $tableId, - $viewId, - new ColumnDto( - title: $title, - type: ColumnType::NUMBER->value, - subtype: $subtype, - mandatory: $mandatory, - description: $description, - numberDefault: $numberDefault, - numberMin: $numberMin, - numberMax: $numberMax, - numberDecimals: $numberDecimals, - numberPrefix: $numberPrefix, - numberSuffix: $numberSuffix, - customSettings: json_encode($customSettings), - ), - $selectedViewIds - ); + try { + $column = $this->service->create( + $this->userId, + $tableId, + $viewId, + new ColumnDto( + title: $title, + type: ColumnType::NUMBER->value, + subtype: $subtype, + mandatory: $mandatory, + description: $description, + numberDefault: $numberDefault, + numberMin: $numberMin, + numberMax: $numberMax, + numberDecimals: $numberDecimals, + numberPrefix: $numberPrefix, + numberSuffix: $numberSuffix, + customSettings: json_encode($customSettings), + ), + $selectedViewIds + ); + } catch (BadRequestError $e) { + return $this->handleBadRequestError($e); + } return new DataResponse($column->jsonSerialize()); } @@ -193,11 +197,12 @@ public function createNumberColumn(int $baseNodeId, string $title, ?float $numbe * @param array $customSettings Custom settings for the * column * @return DataResponse|DataResponse|DataResponse * * * 200: Column created + * 400: Invalid request data * 403: No permission * 404: Not found * @throws InternalError @@ -210,24 +215,28 @@ public function createNumberColumn(int $baseNodeId, string $title, ?float $numbe public function createTextColumn(int $baseNodeId, string $title, ?string $textDefault, ?string $textAllowedPattern, ?int $textMaxLength, ?bool $textUnique = false, ?string $subtype = null, ?string $description = null, ?array $selectedViewIds = [], bool $mandatory = false, string $baseNodeType = 'table', array $customSettings = []): DataResponse { $tableId = $baseNodeType === 'table' ? $baseNodeId : null; $viewId = $baseNodeType === 'view' ? $baseNodeId : null; - $column = $this->service->create( - $this->userId, - $tableId, - $viewId, - new ColumnDto( - title: $title, - type: ColumnType::TEXT->value, - subtype: $subtype, - mandatory: $mandatory, - description: $description, - textDefault: $textDefault, - textAllowedPattern: $textAllowedPattern, - textMaxLength: $textMaxLength, - textUnique: $textUnique, - customSettings: json_encode($customSettings), - ), - $selectedViewIds - ); + try { + $column = $this->service->create( + $this->userId, + $tableId, + $viewId, + new ColumnDto( + title: $title, + type: ColumnType::TEXT->value, + subtype: $subtype, + mandatory: $mandatory, + description: $description, + textDefault: $textDefault, + textAllowedPattern: $textAllowedPattern, + textMaxLength: $textMaxLength, + textUnique: $textUnique, + customSettings: json_encode($customSettings), + ), + $selectedViewIds + ); + } catch (BadRequestError $e) { + return $this->handleBadRequestError($e); + } return new DataResponse($column->jsonSerialize()); } @@ -256,11 +265,12 @@ public function createTextColumn(int $baseNodeId, string $title, ?string $textDe * * * @return DataResponse|DataResponse|DataResponse * * * 200: Column created + * 400: Invalid request data * 403: No permission * 404: Not found * @throws InternalError @@ -273,22 +283,26 @@ public function createTextColumn(int $baseNodeId, string $title, ?string $textDe public function createSelectionColumn(int $baseNodeId, string $title, string $selectionOptions, ?string $selectionDefault, ?string $subtype = null, ?string $description = null, ?array $selectedViewIds = [], bool $mandatory = false, string $baseNodeType = 'table', array $customSettings = []): DataResponse { $tableId = $baseNodeType === 'table' ? $baseNodeId : null; $viewId = $baseNodeType === 'view' ? $baseNodeId : null; - $column = $this->service->create( - $this->userId, - $tableId, - $viewId, - new ColumnDto( - title: $title, - type: ColumnType::SELECTION->value, - subtype: $subtype, - mandatory: $mandatory, - description: $description, - selectionOptions: $selectionOptions, - selectionDefault: $selectionDefault, - customSettings: json_encode($customSettings), - ), - $selectedViewIds - ); + try { + $column = $this->service->create( + $this->userId, + $tableId, + $viewId, + new ColumnDto( + title: $title, + type: ColumnType::SELECTION->value, + subtype: $subtype, + mandatory: $mandatory, + description: $description, + selectionOptions: $selectionOptions, + selectionDefault: $selectionDefault, + customSettings: json_encode($customSettings), + ), + $selectedViewIds + ); + } catch (BadRequestError $e) { + return $this->handleBadRequestError($e); + } return new DataResponse($column->jsonSerialize()); } @@ -314,11 +328,12 @@ public function createSelectionColumn(int $baseNodeId, string $title, string $se * * * @return DataResponse|DataResponse|DataResponse * * * 200: Column created + * 400: Invalid request data * 403: No permission * 404: Not found * @throws InternalError @@ -331,21 +346,25 @@ public function createSelectionColumn(int $baseNodeId, string $title, string $se public function createDatetimeColumn(int $baseNodeId, string $title, ?string $datetimeDefault, ?string $subtype = null, ?string $description = null, ?array $selectedViewIds = [], bool $mandatory = false, string $baseNodeType = 'table', array $customSettings = []): DataResponse { $tableId = $baseNodeType === 'table' ? $baseNodeId : null; $viewId = $baseNodeType === 'view' ? $baseNodeId : null; - $column = $this->service->create( - $this->userId, - $tableId, - $viewId, - new ColumnDto( - title: $title, - type: ColumnType::DATETIME->value, - subtype: $subtype, - mandatory: $mandatory, - description: $description, - datetimeDefault: $datetimeDefault, - customSettings: json_encode($customSettings), - ), - $selectedViewIds - ); + try { + $column = $this->service->create( + $this->userId, + $tableId, + $viewId, + new ColumnDto( + title: $title, + type: ColumnType::DATETIME->value, + subtype: $subtype, + mandatory: $mandatory, + description: $description, + datetimeDefault: $datetimeDefault, + customSettings: json_encode($customSettings), + ), + $selectedViewIds + ); + } catch (BadRequestError $e) { + return $this->handleBadRequestError($e); + } return new DataResponse($column->jsonSerialize()); } @@ -374,11 +393,12 @@ public function createDatetimeColumn(int $baseNodeId, string $title, ?string $da * * * @return DataResponse|DataResponse|DataResponse * * * 200: Column created + * 400: Invalid request data * 403: No permission * 404: Not found * @throws InternalError @@ -391,25 +411,29 @@ public function createDatetimeColumn(int $baseNodeId, string $title, ?string $da public function createUsergroupColumn(int $baseNodeId, string $title, ?string $usergroupDefault, ?bool $usergroupMultipleItems = null, ?bool $usergroupSelectUsers = null, ?bool $usergroupSelectGroups = null, ?bool $usergroupSelectTeams = null, ?bool $showUserStatus = null, ?string $description = null, ?array $selectedViewIds = [], bool $mandatory = false, string $baseNodeType = 'table', array $customSettings = []): DataResponse { $tableId = $baseNodeType === 'table' ? $baseNodeId : null; $viewId = $baseNodeType === 'view' ? $baseNodeId : null; - $column = $this->service->create( - $this->userId, - $tableId, - $viewId, - new ColumnDto( - title: $title, - type: ColumnType::PEOPLE->value, - mandatory: $mandatory, - description: $description, - usergroupDefault: $usergroupDefault, - usergroupMultipleItems: $usergroupMultipleItems, - usergroupSelectUsers: $usergroupSelectUsers, - usergroupSelectGroups: $usergroupSelectGroups, - usergroupSelectTeams: $usergroupSelectTeams, - showUserStatus: $showUserStatus, - customSettings: json_encode($customSettings), - ), - $selectedViewIds - ); + try { + $column = $this->service->create( + $this->userId, + $tableId, + $viewId, + new ColumnDto( + title: $title, + type: ColumnType::PEOPLE->value, + mandatory: $mandatory, + description: $description, + usergroupDefault: $usergroupDefault, + usergroupMultipleItems: $usergroupMultipleItems, + usergroupSelectUsers: $usergroupSelectUsers, + usergroupSelectGroups: $usergroupSelectGroups, + usergroupSelectTeams: $usergroupSelectTeams, + showUserStatus: $showUserStatus, + customSettings: json_encode($customSettings), + ), + $selectedViewIds + ); + } catch (BadRequestError $e) { + return $this->handleBadRequestError($e); + } return new DataResponse($column->jsonSerialize()); } } diff --git a/lib/Controller/ApiFavoriteController.php b/lib/Controller/ApiFavoriteController.php index 05271b4cb7..de23d1f46a 100644 --- a/lib/Controller/ApiFavoriteController.php +++ b/lib/Controller/ApiFavoriteController.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Controller; use Exception; @@ -65,7 +66,6 @@ public function create(int $nodeType, int $nodeId): DataResponse { } } - /** * [api v2] Remove a node (table or view) to from favorites * diff --git a/lib/Controller/ApiGeneralController.php b/lib/Controller/ApiGeneralController.php index e376ea754c..ef26a6c818 100644 --- a/lib/Controller/ApiGeneralController.php +++ b/lib/Controller/ApiGeneralController.php @@ -41,7 +41,6 @@ public function __construct( $this->viewService = $viewService; } - /** * [api v2] Returns all main resources * diff --git a/lib/Controller/ApiTablesController.php b/lib/Controller/ApiTablesController.php index 7510929b37..7ad79e84de 100644 --- a/lib/Controller/ApiTablesController.php +++ b/lib/Controller/ApiTablesController.php @@ -10,6 +10,7 @@ use Exception; use OCA\Tables\AppInfo\Application; use OCA\Tables\Dto\Column as ColumnDto; +use OCA\Tables\Errors\BadRequestError; use OCA\Tables\Errors\InternalError; use OCA\Tables\Errors\NotFoundError; use OCA\Tables\Errors\PermissionError; @@ -263,6 +264,13 @@ public function createFromScheme(string $title, string $emoji, string $descripti } $this->logger->warning('An invalid request occurred: ' . $e->getMessage(), ['exception' => $e]); return new DataResponse(['message' => $e->getMessage()], Http::STATUS_BAD_REQUEST); + } catch (BadRequestError $e) { + try { + $this->db->rollBack(); + } catch (\OCP\DB\Exception $re) { + return $this->handleError($re); + } + return $this->handleBadRequestError($e); } catch (InternalError|Exception $e) { try { $this->db->rollBack(); @@ -281,14 +289,18 @@ public function createFromScheme(string $title, string $emoji, string $descripti * @param string|null $description Description for the table * @param string $template Template to use if wanted * - * @return DataResponse|DataResponse + * @return DataResponse|DataResponse * * 200: Tables returned + * 400: Invalid request data */ #[NoAdminRequired] public function create(string $title, ?string $emoji, ?string $description, string $template = 'custom'): DataResponse { try { return new DataResponse($this->service->create($title, $template, $emoji, $description)->jsonSerialize()); + } catch (\InvalidArgumentException $e) { + $this->logger->warning('An invalid request occurred: ' . $e->getMessage(), ['exception' => $e]); + return new DataResponse(['message' => $e->getMessage()], Http::STATUS_BAD_REQUEST); } catch (InternalError|Exception $e) { return $this->handleError($e); } diff --git a/lib/Controller/ContextController.php b/lib/Controller/ContextController.php index 7f994741b2..18860fb6b2 100644 --- a/lib/Controller/ContextController.php +++ b/lib/Controller/ContextController.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Controller; use InvalidArgumentException; diff --git a/lib/Controller/ImportController.php b/lib/Controller/ImportController.php index 2159d29282..1ad66ed339 100644 --- a/lib/Controller/ImportController.php +++ b/lib/Controller/ImportController.php @@ -214,7 +214,6 @@ public function importUploadInView(int $viewId, bool $createMissingColumns = tru } } - #[NoAdminRequired] #[UserRateLimit(limit: 20, period: 60)] #[RequirePermission(permission: Application::PERMISSION_CREATE, type: Application::NODE_TYPE_VIEW, idParam: 'viewId')] diff --git a/lib/Controller/SearchController.php b/lib/Controller/SearchController.php index 297e4d1334..13c732a65b 100644 --- a/lib/Controller/SearchController.php +++ b/lib/Controller/SearchController.php @@ -34,7 +34,6 @@ public function __construct( $this->logger = $logger; } - #[NoAdminRequired] public function all(string $term = ''): DataResponse { return $this->handleError(function () use ($term) { diff --git a/lib/Controller/ShareController.php b/lib/Controller/ShareController.php index aa8c55cc6c..388552d1b8 100644 --- a/lib/Controller/ShareController.php +++ b/lib/Controller/ShareController.php @@ -30,7 +30,6 @@ class ShareController extends Controller { use Errors; - public function __construct( IRequest $request, LoggerInterface $logger, @@ -53,7 +52,6 @@ public function sharePolicy(): DataResponse { ]); } - #[NoAdminRequired] #[RequirePermission(permission: Application::PERMISSION_MANAGE, type: Application::NODE_TYPE_TABLE, idParam: 'tableId')] public function index(int $tableId): DataResponse { diff --git a/lib/Controller/TableController.php b/lib/Controller/TableController.php index 07045e71c6..11f9a3ad95 100644 --- a/lib/Controller/TableController.php +++ b/lib/Controller/TableController.php @@ -27,7 +27,6 @@ class TableController extends Controller { use Errors; - public function __construct( IRequest $request, LoggerInterface $logger, @@ -39,7 +38,6 @@ public function __construct( $this->userId = $userId; } - #[NoAdminRequired] public function index(): DataResponse { return $this->handleError(function () { diff --git a/lib/Controller/ViewController.php b/lib/Controller/ViewController.php index 2828dc4021..474b7a5c20 100644 --- a/lib/Controller/ViewController.php +++ b/lib/Controller/ViewController.php @@ -36,7 +36,6 @@ class ViewController extends Controller { use Errors; - public function __construct( IRequest $request, LoggerInterface $logger, @@ -52,7 +51,6 @@ public function __construct( $this->userId = $userId; } - #[NoAdminRequired] #[RequirePermission(permission: Application::PERMISSION_READ, type: Application::NODE_TYPE_TABLE, idParam: 'tableId')] public function index(int $tableId): DataResponse { diff --git a/lib/Db/Column.php b/lib/Db/Column.php index 7ebcdacf35..52698e607f 100644 --- a/lib/Db/Column.php +++ b/lib/Db/Column.php @@ -8,7 +8,6 @@ namespace OCA\Tables\Db; use JsonSerializable; - use OCA\Tables\Constants\ColumnType; use OCA\Tables\Dto\Column as ColumnDto; use OCA\Tables\ResponseDefinitions; @@ -103,6 +102,7 @@ class Column extends EntitySuper implements JsonSerializable { public const TYPE_NUMBER = 'number'; public const TYPE_DATETIME = 'datetime'; public const TYPE_USERGROUP = 'usergroup'; + public const TYPE_RELATION = 'relation'; public const SUBTYPE_DATETIME_DATE = 'date'; public const SUBTYPE_DATETIME_TIME = 'time'; @@ -114,6 +114,10 @@ class Column extends EntitySuper implements JsonSerializable { public const META_ID_TITLE = 'id'; + public const RELATION_TYPE = 'relationType'; + public const RELATION_TARGET_ID = 'targetId'; + public const RELATION_LABEL_COLUMN = 'labelColumn'; + protected ?string $title = null; protected ?int $tableId = null; protected ?string $createdBy = null; diff --git a/lib/Db/ColumnMapper.php b/lib/Db/ColumnMapper.php index 5f2f23d771..527b728d97 100644 --- a/lib/Db/ColumnMapper.php +++ b/lib/Db/ColumnMapper.php @@ -164,7 +164,6 @@ public function getColumnTypes(array $neededColumnIds): array { return $out; } - /** * @param int $tableId * @return int diff --git a/lib/Db/Context.php b/lib/Db/Context.php index 671e4be10e..3fa14f56b5 100644 --- a/lib/Db/Context.php +++ b/lib/Db/Context.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Db; use JsonSerializable; diff --git a/lib/Db/ContextMapper.php b/lib/Db/ContextMapper.php index 25bb809ddc..3acbbe9633 100644 --- a/lib/Db/ContextMapper.php +++ b/lib/Db/ContextMapper.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Db; use OCA\Tables\AppInfo\Application; diff --git a/lib/Db/ContextNavigation.php b/lib/Db/ContextNavigation.php index e39aecb4f3..0ddb1215f0 100644 --- a/lib/Db/ContextNavigation.php +++ b/lib/Db/ContextNavigation.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Db; use OCP\AppFramework\Db\Entity; diff --git a/lib/Db/ContextNavigationMapper.php b/lib/Db/ContextNavigationMapper.php index bc318ce4cb..a81b6406f4 100644 --- a/lib/Db/ContextNavigationMapper.php +++ b/lib/Db/ContextNavigationMapper.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Db; use OCP\AppFramework\Db\Entity; diff --git a/lib/Db/ContextNodeRelation.php b/lib/Db/ContextNodeRelation.php index 70233bf2ef..fbabd3e4da 100644 --- a/lib/Db/ContextNodeRelation.php +++ b/lib/Db/ContextNodeRelation.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Db; use OCP\AppFramework\Db\Entity; diff --git a/lib/Db/ContextNodeRelationMapper.php b/lib/Db/ContextNodeRelationMapper.php index be1944564a..82eaf7bee6 100644 --- a/lib/Db/ContextNodeRelationMapper.php +++ b/lib/Db/ContextNodeRelationMapper.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Db; use OCP\AppFramework\Db\DoesNotExistException; diff --git a/lib/Db/LegacyRow.php b/lib/Db/LegacyRow.php index 690fecba4b..6a0b190795 100644 --- a/lib/Db/LegacyRow.php +++ b/lib/Db/LegacyRow.php @@ -8,7 +8,6 @@ namespace OCA\Tables\Db; use JsonSerializable; - use OCP\AppFramework\Db\Entity; /** diff --git a/lib/Db/LegacyRowMapper.php b/lib/Db/LegacyRowMapper.php index 84ee4450e1..95f04a2bb7 100644 --- a/lib/Db/LegacyRowMapper.php +++ b/lib/Db/LegacyRowMapper.php @@ -193,7 +193,6 @@ public function countRowsForView(View $view, $userId): int { } } - public function getRowIdsOfView(View $view, $userId): array { $qb = $this->db->getQueryBuilder(); $qb->select('t1.id') @@ -218,7 +217,6 @@ public function getRowIdsOfView(View $view, $userId): array { } } - private function addFilterToQuery(IQueryBuilder $qb, View $view, array $neededColumnTypes, string $userId): void { $enrichedFilters = $view->getFilterArray(); if (count($enrichedFilters) > 0) { @@ -276,7 +274,6 @@ public function findAllByView(View $view, string $userId, ?int $limit = null, ?i ->from($this->table, 't1') ->where($qb->expr()->eq('table_id', $qb->createNamedParameter($view->getTableId(), IQueryBuilder::PARAM_INT))); - $neededColumnIds = $this->getAllColumnIdsFromView($view, $qb); $neededColumnsTypes = $this->columnMapper->getColumnTypes($neededColumnIds); diff --git a/lib/Db/LogItem.php b/lib/Db/LogItem.php index 0a33fa652b..763333b0ea 100644 --- a/lib/Db/LogItem.php +++ b/lib/Db/LogItem.php @@ -8,7 +8,6 @@ namespace OCA\Tables\Db; use JsonSerializable; - use OCP\AppFramework\Db\Entity; /** diff --git a/lib/Db/Page.php b/lib/Db/Page.php index f56fceedae..5ceeb1bd00 100644 --- a/lib/Db/Page.php +++ b/lib/Db/Page.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Db; use OCP\AppFramework\Db\Entity; diff --git a/lib/Db/PageContent.php b/lib/Db/PageContent.php index a56147e54c..966f48fc53 100644 --- a/lib/Db/PageContent.php +++ b/lib/Db/PageContent.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Db; use OCP\AppFramework\Db\Entity; diff --git a/lib/Db/Row2Mapper.php b/lib/Db/Row2Mapper.php index d24c372d97..7ec48500f9 100644 --- a/lib/Db/Row2Mapper.php +++ b/lib/Db/Row2Mapper.php @@ -30,6 +30,8 @@ class Row2Mapper { use TTransactional; + private const DB_CHUNK_SIZE = 1_000; + private RowSleeveMapper $rowSleeveMapper; private ?string $userId; private IDBConnection $db; @@ -197,6 +199,24 @@ public function findAll(array $showColumnIds, int $tableId, ?int $limit = null, * @throws InternalError */ private function getRows(array $rowIds, array $columnIds): array { + if (empty($rowIds) || empty($columnIds)) { + return []; + } + + $allRows = []; + foreach (array_chunk($rowIds, self::DB_CHUNK_SIZE) as $rowIdChunk) { + $allRows[] = $this->getRowsChunk($rowIdChunk, $columnIds); + } + return array_merge(...$allRows); + } + + /** + * @param array $rowIds + * @param array $columnIds + * @return Row2[] + * @throws InternalError + */ + private function getRowsChunk(array $rowIds, array $columnIds): array { $qb = $this->db->getQueryBuilder(); $qbSqlForColumnTypes = null; @@ -467,30 +487,37 @@ private function getFilterExpression(IQueryBuilder $qb, Column $column, string $ $filterExpression = $qb->expr()->like('value', $qb->createNamedParameter('%' . $this->db->escapeLikeParameter($value) . '%', $paramType)); break; case 'does-not-contain': - $filterExpressions = []; if (is_array($value) && $column->getType() === Column::TYPE_USERGROUP) { + $filterExpressions = []; $filterExpressions[] = $qb2->expr()->andX( - $qb->expr()->neq('value', $qb->createNamedParameter($value[UsergroupType::USER])), + $qb->expr()->eq('value', $qb->createNamedParameter($value[UsergroupType::USER])), $qb->expr()->eq('value_type', $qb->createNamedParameter(UsergroupType::USER, IQueryBuilder::PARAM_INT)) ); if (!empty($value[UsergroupType::GROUP])) { $filterExpressions[] = $qb2->expr()->andX( - $qb->expr()->notIn('value', $qb->createNamedParameter($value[UsergroupType::GROUP], IQueryBuilder::PARAM_STR_ARRAY)), + $qb->expr()->in('value', $qb->createNamedParameter($value[UsergroupType::GROUP], IQueryBuilder::PARAM_STR_ARRAY)), $qb->expr()->eq('value_type', $qb->createNamedParameter(UsergroupType::GROUP, IQueryBuilder::PARAM_INT)) ); } if (!empty($value[UsergroupType::CIRCLE])) { $filterExpressions[] = $qb2->expr()->andX( - $qb->expr()->notIn('value', $qb->createNamedParameter($value[UsergroupType::CIRCLE], IQueryBuilder::PARAM_STR_ARRAY)), + $qb->expr()->in('value', $qb->createNamedParameter($value[UsergroupType::CIRCLE], IQueryBuilder::PARAM_STR_ARRAY)), $qb->expr()->eq('value_type', $qb->createNamedParameter(UsergroupType::CIRCLE, IQueryBuilder::PARAM_INT)) ); } - $filterExpression = $qb2->expr()->andX(...$filterExpressions); - $includeDefault = false; - break; - } + $qb2->andWhere($qb2->expr()->orX(...$filterExpressions)); + return $this->db->getQueryBuilder() + ->selectAlias('sl3.id', 'row_id') + ->from('tables_row_sleeves', 'sl3') + ->where( + $qb->expr()->eq('sl3.table_id', $qb->createNamedParameter($column->getTableId(), IQueryBuilder::PARAM_INT)) + ) + ->andWhere( + $qb->expr()->notIn('sl3.id', $qb->createFunction($qb2->getSQL())) + ); + } $includeDefault = !str_contains((string)($defaultValue ?? ''), $value); if ($column->getType() === 'selection' && $column->getSubtype() === 'multi') { $value = str_replace(['"', '\''], '', $value); @@ -608,6 +635,8 @@ private function getSqlOperator(string $operator, IQueryBuilder $qb, string $col return $qb->expr()->like($columnName, $qb->createNamedParameter($this->db->escapeLikeParameter($value) . '%', $paramType)); case 'contains': return $qb->expr()->like($columnName, $qb->createNamedParameter('%' . $this->db->escapeLikeParameter($value) . '%', $paramType)); + case 'does-not-contain': + return $qb->expr()->notLike($columnName, $qb->createNamedParameter('%' . $this->db->escapeLikeParameter($value) . '%', $paramType)); case 'is-equal': return $qb->expr()->eq($columnName, $qb->createNamedParameter($value, $paramType)); case 'is-not-equal': @@ -657,12 +686,10 @@ private function parseEntities(IResult $result, array $sleeves): array { $column = $this->columnMapper->find($rowData['column_id']); $columnType = $column->getType(); - $cellClassName = 'OCA\Tables\Db\RowCell' . ucfirst($columnType); - $entity = call_user_func($cellClassName . '::fromRowData', $rowData); // >5.2.3 if (!isset($cellMapperCache[$columnType])) { $cellMapperCache[$columnType] = $this->getCellMapperFromType($columnType); } - $value = $cellMapperCache[$columnType]->formatEntity($column, $entity); + $value = $cellMapperCache[$columnType]->formatRowData($column, $rowData); $compositeKey = (string)$rowData['row_id'] . ',' . (string)$rowData['column_id']; if ($cellMapperCache[$columnType]->hasMultipleValues()) { if (array_key_exists($compositeKey, $rowValues)) { diff --git a/lib/Db/RowCellMapperSuper.php b/lib/Db/RowCellMapperSuper.php index 28c75945f4..be377c5d87 100644 --- a/lib/Db/RowCellMapperSuper.php +++ b/lib/Db/RowCellMapperSuper.php @@ -27,14 +27,14 @@ public function __construct(IDBConnection $db, string $table, string $class) { } /** - * Format a row cell entity to API response array + * Format a row cell raw value from DB to API response array * - * @param T $cell + * @param array $row * @return TOutgoing */ - public function formatEntity(Column $column, RowCellSuper $cell) { + public function formatRowData(Column $column, array $row) { /** @var TOutgoing $value */ - $value = $cell->getValue(); + $value = $row['value']; return $value; } /* @@ -87,7 +87,6 @@ public function deleteAllForColumnAndRow(int $columnId, int $rowId): void { $qb->executeStatement(); } - /** * @throws Exception */ diff --git a/lib/Db/RowCellNumberMapper.php b/lib/Db/RowCellNumberMapper.php index 15e55bddad..5c9bd5247f 100644 --- a/lib/Db/RowCellNumberMapper.php +++ b/lib/Db/RowCellNumberMapper.php @@ -20,17 +20,17 @@ public function __construct(IDBConnection $db) { parent::__construct($db, $this->table, RowCellNumber::class); } - public function formatEntity(Column $column, RowCellSuper $cell) { - $value = $cell->getValue(); + public function formatRowData(Column $column, array $row) { + $value = $row['value']; if ($value === '') { return null; } $decimals = $column->getNumberDecimals() ?? 0; if ($decimals === 0) { return (int)$value; - } else { - return round(floatval($value), $decimals); } + + return round(floatval($value), $decimals); } public function applyDataToEntity(Column $column, RowCellSuper $cell, $data): void { diff --git a/lib/Db/RowCellRelation.php b/lib/Db/RowCellRelation.php new file mode 100644 index 0000000000..d47abac068 --- /dev/null +++ b/lib/Db/RowCellRelation.php @@ -0,0 +1,24 @@ + */ +class RowCellRelation extends RowCellSuper { + protected ?int $value = null; + + public function __construct() { + parent::__construct(); + $this->addType('value', 'integer'); + } + + public function jsonSerialize(): array { + return parent::jsonSerializePreparation($this->value); + } +} diff --git a/lib/Db/RowCellRelationMapper.php b/lib/Db/RowCellRelationMapper.php new file mode 100644 index 0000000000..fcbd3edb03 --- /dev/null +++ b/lib/Db/RowCellRelationMapper.php @@ -0,0 +1,36 @@ + */ +class RowCellRelationMapper extends RowCellMapperSuper { + protected string $table = 'tables_row_cells_relation'; + + public function __construct(IDBConnection $db) { + parent::__construct($db, $this->table, RowCellRelation::class); + } + + /** + * @inheritDoc + */ + public function hasMultipleValues(): bool { + return false; + } + + /** + * @inheritDoc + */ + public function getDbParamType() { + return IQueryBuilder::PARAM_INT; + } +} diff --git a/lib/Db/RowCellSelectionMapper.php b/lib/Db/RowCellSelectionMapper.php index 86393cf41f..eba5332f1e 100644 --- a/lib/Db/RowCellSelectionMapper.php +++ b/lib/Db/RowCellSelectionMapper.php @@ -29,8 +29,8 @@ public function applyDataToEntity(Column $column, RowCellSuper $cell, $data): vo $cell->setValue($this->valueToJsonDbValue($column, $data)); } - public function formatEntity(Column $column, RowCellSuper $cell) { - return json_decode($cell->getValue()); + public function formatRowData(Column $column, array $row) { + return json_decode($row['value']); } private function valueToJsonDbValue(Column $column, $value): string { diff --git a/lib/Db/RowCellSuper.php b/lib/Db/RowCellSuper.php index 89dc379807..29c3e366bb 100644 --- a/lib/Db/RowCellSuper.php +++ b/lib/Db/RowCellSuper.php @@ -8,7 +8,6 @@ namespace OCA\Tables\Db; use JsonSerializable; - use OCP\AppFramework\Db\Entity; /** @@ -37,29 +36,9 @@ public function __construct() { $this->addType('rowId', 'integer'); } - /** - * Same as Entity::fromRow but ignoring unknown properties - */ - public static function fromRowData(array $row): RowCellSuper { - $instance = new static(); - - foreach ($row as $key => $value) { - $property = $instance->columnToProperty($key); - $setter = 'set' . ucfirst($property); - ; - if (property_exists($instance, $property)) { - $instance->$setter($value); - } - } - - $instance->resetUpdatedFields(); - - return $instance; - } - /** * @param float|null|string $value - * @param int $value_type + * @param int $valueType */ public function jsonSerializePreparation(string|float|null $value, int $valueType = 0): array { return [ diff --git a/lib/Db/RowCellUsergroupMapper.php b/lib/Db/RowCellUsergroupMapper.php index c086a50025..af975a8c37 100644 --- a/lib/Db/RowCellUsergroupMapper.php +++ b/lib/Db/RowCellUsergroupMapper.php @@ -42,18 +42,20 @@ public function applyDataToEntity(Column $column, RowCellSuper $cell, $data): vo $cell->setValueWrapper($data); } - public function formatEntity(Column $column, RowCellSuper $cell) { - $displayName = $cell->getValue(); - if ($cell->getValueType() === UsergroupType::USER) { - $displayName = $this->userManager->getDisplayName($cell->getValue()) ?? $cell->getValue(); - } elseif ($cell->getValueType() === UsergroupType::CIRCLE) { - $displayName = $this->circleHelper->getCircleDisplayName($cell->getValue(), ($this->userSession->getUser()?->getUID() ?: '')) ?: $cell->getValue(); - } elseif ($cell->getValueType() === UsergroupType::GROUP) { - $displayName = $this->groupHelper->getGroupDisplayName($cell->getValue()) ?: $cell->getValue(); + public function formatRowData(Column $column, array $row) { + $value = $row['value']; + $valueType = (int)$row['value_type']; + $displayName = $value; + if ($valueType === UsergroupType::USER) { + $displayName = $this->userManager->getDisplayName($value) ?? $value; + } elseif ($valueType === UsergroupType::CIRCLE) { + $displayName = $this->circleHelper->getCircleDisplayName($value, ($this->userSession->getUser()?->getUID() ?: '')) ?: $value; + } elseif ($valueType === UsergroupType::GROUP) { + $displayName = $this->groupHelper->getGroupDisplayName($value) ?: $value; } return [ - 'id' => $cell->getValue(), - 'type' => $cell->getValueType(), + 'id' => $value, + 'type' => $valueType, 'displayName' => $displayName, ]; } diff --git a/lib/Db/RowSleeve.php b/lib/Db/RowSleeve.php index 3c765e8173..b909a3f44f 100644 --- a/lib/Db/RowSleeve.php +++ b/lib/Db/RowSleeve.php @@ -8,7 +8,6 @@ namespace OCA\Tables\Db; use JsonSerializable; - use OCP\AppFramework\Db\Entity; /** diff --git a/lib/Db/Share.php b/lib/Db/Share.php index 7f89380618..c6b6a1fd7c 100644 --- a/lib/Db/Share.php +++ b/lib/Db/Share.php @@ -8,7 +8,6 @@ namespace OCA\Tables\Db; use JsonSerializable; - use OCA\Tables\ResponseDefinitions; /** diff --git a/lib/Db/ShareMapper.php b/lib/Db/ShareMapper.php index 72f05c7d8e..bb59ce7ceb 100644 --- a/lib/Db/ShareMapper.php +++ b/lib/Db/ShareMapper.php @@ -250,4 +250,15 @@ public function changeReceiverForNode(string $nodeType, int $nodeId, string $new ->andWhere($qb->expr()->eq('receiver_type', $qb->createNamedParameter('user', IQueryBuilder::PARAM_STR))) ->executeStatement(); } + + /** + * @throws Exception + */ + public function deleteByReceiver(string $receiver, string $receiverType): int { + $qb = $this->db->getQueryBuilder(); + return $qb->delete($this->table) + ->where($qb->expr()->eq('receiver', $qb->createNamedParameter($receiver, IQueryBuilder::PARAM_STR))) + ->andWhere($qb->expr()->eq('receiver_type', $qb->createNamedParameter($receiverType, IQueryBuilder::PARAM_STR))) + ->executeStatement(); + } } diff --git a/lib/Db/TableMapper.php b/lib/Db/TableMapper.php index 0e50d0bab9..e6785f79a1 100644 --- a/lib/Db/TableMapper.php +++ b/lib/Db/TableMapper.php @@ -152,7 +152,6 @@ public function search(?string $term = null, ?string $userId = null, ?int $limit )); } - if ($limit !== null) { $qb->setMaxResults($limit); } diff --git a/lib/Db/ViewMapper.php b/lib/Db/ViewMapper.php index 2f4a41c8b1..531803be5f 100644 --- a/lib/Db/ViewMapper.php +++ b/lib/Db/ViewMapper.php @@ -169,7 +169,6 @@ public function search(?string $term = null, ?string $userId = null, ?int $limit )); } - if ($limit !== null) { $qb->setMaxResults($limit); } diff --git a/lib/Event/AbstractRowEvent.php b/lib/Event/AbstractRowEvent.php index 802f96bbe0..a1dfebfe20 100644 --- a/lib/Event/AbstractRowEvent.php +++ b/lib/Event/AbstractRowEvent.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Event; use OCA\Tables\Db\Row2; diff --git a/lib/Event/RowAddedEvent.php b/lib/Event/RowAddedEvent.php index 5d1b9c9aee..60e270ab44 100644 --- a/lib/Event/RowAddedEvent.php +++ b/lib/Event/RowAddedEvent.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Event; final class RowAddedEvent extends AbstractRowEvent { diff --git a/lib/Event/RowDeletedEvent.php b/lib/Event/RowDeletedEvent.php index e7e83192e6..adc015faf9 100644 --- a/lib/Event/RowDeletedEvent.php +++ b/lib/Event/RowDeletedEvent.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Event; final class RowDeletedEvent extends AbstractRowEvent { diff --git a/lib/Event/RowUpdatedEvent.php b/lib/Event/RowUpdatedEvent.php index 09f1c05571..e6faa5c82f 100644 --- a/lib/Event/RowUpdatedEvent.php +++ b/lib/Event/RowUpdatedEvent.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Event; final class RowUpdatedEvent extends AbstractRowEvent { diff --git a/lib/Event/TableDeletedEvent.php b/lib/Event/TableDeletedEvent.php index 66b6051bc9..3f09059864 100644 --- a/lib/Event/TableDeletedEvent.php +++ b/lib/Event/TableDeletedEvent.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Event; use OCA\Tables\Db\Table; diff --git a/lib/Event/TableOwnershipTransferredEvent.php b/lib/Event/TableOwnershipTransferredEvent.php index 72b94bea0d..02859389d2 100644 --- a/lib/Event/TableOwnershipTransferredEvent.php +++ b/lib/Event/TableOwnershipTransferredEvent.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Event; use OCA\Tables\Db\Table; diff --git a/lib/Event/ViewDeletedEvent.php b/lib/Event/ViewDeletedEvent.php index 5ead40b294..dc2ffbf4c9 100644 --- a/lib/Event/ViewDeletedEvent.php +++ b/lib/Event/ViewDeletedEvent.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Event; use OCA\Tables\Db\View; diff --git a/lib/Helper/ColumnsHelper.php b/lib/Helper/ColumnsHelper.php index 385f7a1ed5..f926d2ba3c 100644 --- a/lib/Helper/ColumnsHelper.php +++ b/lib/Helper/ColumnsHelper.php @@ -20,6 +20,7 @@ class ColumnsHelper { Column::TYPE_DATETIME, Column::TYPE_SELECTION, Column::TYPE_USERGROUP, + Column::TYPE_RELATION, ]; /** @@ -37,6 +38,9 @@ public function resolveSearchValue(string $placeholder, string $userId, ?Column if (str_starts_with($placeholder, '@selection-id-')) { return substr($placeholder, 14); } + if (str_starts_with($placeholder, '@relation-id-')) { + return substr($placeholder, 13); + } $placeholderParts = explode(':', $placeholder, 2); $placeholderName = ltrim($placeholderParts[0], '@'); diff --git a/lib/Listener/AnalyticsDatasourceListener.php b/lib/Listener/AnalyticsDatasourceListener.php index cccf725b60..1c361d4c64 100644 --- a/lib/Listener/AnalyticsDatasourceListener.php +++ b/lib/Listener/AnalyticsDatasourceListener.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Listener; use OCA\Analytics\Datasource\DatasourceEvent; diff --git a/lib/Listener/ReceiverCleanupListener.php b/lib/Listener/ReceiverCleanupListener.php new file mode 100644 index 0000000000..f35213c9b2 --- /dev/null +++ b/lib/Listener/ReceiverCleanupListener.php @@ -0,0 +1,48 @@ + */ +class ReceiverCleanupListener implements IEventListener { + public function __construct( + private ShareMapper $shareMapper, + private LoggerInterface $logger, + ) { + } + + public function handle(Event $event): void { + if ($event instanceof UserDeletedEvent) { + $this->cleanupByParticipant(ShareReceiverType::USER, $event->getUser()->getUID()); + } elseif ($event instanceof GroupDeletedEvent) { + $this->cleanupByParticipant(ShareReceiverType::GROUP, $event->getGroup()->getGID()); + } elseif ($event instanceof CircleDestroyedEvent) { + $this->cleanupByParticipant(ShareReceiverType::CIRCLE, $event->getCircle()->getSingleId()); + } + } + + private function cleanupByParticipant(string $type, string $participant): void { + try { + $this->shareMapper->deleteByReceiver($participant, $type); + } catch (\Throwable $e) { + $this->logger->warning('cleanup table shares for deleted receiver has failed: ' . $e->getMessage(), [ + 'exception' => $e, + 'receiver_type' => $type, + 'receiver' => $participant, + ]); + } + } +} diff --git a/lib/Listener/WhenRowDeletedAuditLogListener.php b/lib/Listener/WhenRowDeletedAuditLogListener.php index 1f8627d7c3..356e3a6514 100644 --- a/lib/Listener/WhenRowDeletedAuditLogListener.php +++ b/lib/Listener/WhenRowDeletedAuditLogListener.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Listener; use OCA\Tables\Event\RowDeletedEvent; diff --git a/lib/Listener/WhenTableDeletedAuditLogListener.php b/lib/Listener/WhenTableDeletedAuditLogListener.php index 8c58b2c614..55e4a15662 100644 --- a/lib/Listener/WhenTableDeletedAuditLogListener.php +++ b/lib/Listener/WhenTableDeletedAuditLogListener.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Listener; use OCA\Tables\Event\TableDeletedEvent; diff --git a/lib/Listener/WhenTableTransferredAuditLogListener.php b/lib/Listener/WhenTableTransferredAuditLogListener.php index dcf6a60519..8c78951e03 100644 --- a/lib/Listener/WhenTableTransferredAuditLogListener.php +++ b/lib/Listener/WhenTableTransferredAuditLogListener.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Listener; use OCA\Tables\Event\TableOwnershipTransferredEvent; diff --git a/lib/Listener/WhenViewDeletedAuditLogListener.php b/lib/Listener/WhenViewDeletedAuditLogListener.php index 6e0db13488..0c2f816648 100644 --- a/lib/Listener/WhenViewDeletedAuditLogListener.php +++ b/lib/Listener/WhenViewDeletedAuditLogListener.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Listener; use OCA\Tables\Event\ViewDeletedEvent; diff --git a/lib/Migration/Version000000Date20210921000000.php b/lib/Migration/Version000000Date20210921000000.php index 3db8458a38..d8b41a588c 100644 --- a/lib/Migration/Version000000Date20210921000000.php +++ b/lib/Migration/Version000000Date20210921000000.php @@ -7,6 +7,7 @@ * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Migration; use Closure; diff --git a/lib/Migration/Version000200Date20220428000000.php b/lib/Migration/Version000200Date20220428000000.php index 67eef3d332..68cb92e57b 100644 --- a/lib/Migration/Version000200Date20220428000000.php +++ b/lib/Migration/Version000200Date20220428000000.php @@ -7,6 +7,7 @@ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Migration; use Closure; diff --git a/lib/Migration/Version000203Date20230124000000.php b/lib/Migration/Version000203Date20230124000000.php index bc27c20711..1c595c7bad 100644 --- a/lib/Migration/Version000203Date20230124000000.php +++ b/lib/Migration/Version000203Date20230124000000.php @@ -7,6 +7,7 @@ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Migration; use Closure; diff --git a/lib/Migration/Version000400Date20230406000000.php b/lib/Migration/Version000400Date20230406000000.php index d6e84990b8..c8ca44756b 100644 --- a/lib/Migration/Version000400Date20230406000000.php +++ b/lib/Migration/Version000400Date20230406000000.php @@ -7,6 +7,7 @@ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Migration; use Closure; diff --git a/lib/Migration/Version000600Date20230703000000.php b/lib/Migration/Version000600Date20230703000000.php index 6a15cb5ef6..ac9ce69b76 100644 --- a/lib/Migration/Version000600Date20230703000000.php +++ b/lib/Migration/Version000600Date20230703000000.php @@ -7,6 +7,7 @@ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Migration; use Closure; diff --git a/lib/Migration/Version000700Date20230916000000.php b/lib/Migration/Version000700Date20230916000000.php index 8173ff70bc..84a38a10bf 100644 --- a/lib/Migration/Version000700Date20230916000000.php +++ b/lib/Migration/Version000700Date20230916000000.php @@ -7,6 +7,7 @@ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Migration; use Closure; diff --git a/lib/Migration/Version000800Date20240222000000.php b/lib/Migration/Version000800Date20240222000000.php index a6e9546b1b..c782f583f8 100644 --- a/lib/Migration/Version000800Date20240222000000.php +++ b/lib/Migration/Version000800Date20240222000000.php @@ -7,6 +7,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Migration; use Closure; diff --git a/lib/Migration/Version000800Date20240828000000.php b/lib/Migration/Version000800Date20240828000000.php index 96ac21abc0..b742b6d749 100644 --- a/lib/Migration/Version000800Date20240828000000.php +++ b/lib/Migration/Version000800Date20240828000000.php @@ -7,6 +7,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Migration; use Closure; diff --git a/lib/Migration/Version000900Date20240314000000.php b/lib/Migration/Version000900Date20240314000000.php index 3929cc5197..6c47e6b6e4 100644 --- a/lib/Migration/Version000900Date20240314000000.php +++ b/lib/Migration/Version000900Date20240314000000.php @@ -7,6 +7,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Migration; use Closure; diff --git a/lib/Migration/Version000900Date20250408000000.php b/lib/Migration/Version000900Date20250408000000.php index 3b6a93fd91..1392ec36e0 100644 --- a/lib/Migration/Version000900Date20250408000000.php +++ b/lib/Migration/Version000900Date20250408000000.php @@ -7,6 +7,7 @@ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Migration; use Closure; diff --git a/lib/Migration/Version000900Date20250710000000.php b/lib/Migration/Version000900Date20250710000000.php index b9847f0ccc..d2f4162ee9 100644 --- a/lib/Migration/Version000900Date20250710000000.php +++ b/lib/Migration/Version000900Date20250710000000.php @@ -7,6 +7,7 @@ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Migration; use Closure; diff --git a/lib/Migration/Version000920Date20250422000000.php b/lib/Migration/Version000920Date20250422000000.php index cc1390a800..425d16f68d 100644 --- a/lib/Migration/Version000920Date20250422000000.php +++ b/lib/Migration/Version000920Date20250422000000.php @@ -7,6 +7,7 @@ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Migration; use Closure; diff --git a/lib/Migration/Version001000Date20250720000000.php b/lib/Migration/Version001000Date20250720000000.php index 883ad7c92d..845a2c1aaf 100644 --- a/lib/Migration/Version001000Date20250720000000.php +++ b/lib/Migration/Version001000Date20250720000000.php @@ -7,6 +7,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Migration; use Closure; diff --git a/lib/Migration/Version002001Date20260109000000.php b/lib/Migration/Version002001Date20260109000000.php new file mode 100644 index 0000000000..72414a20d8 --- /dev/null +++ b/lib/Migration/Version002001Date20260109000000.php @@ -0,0 +1,47 @@ +createRowValueTable($schema, 'relation', Types::INTEGER); + return $changes; + } + + private function createRowValueTable(ISchemaWrapper $schema, string $name, string $type): ?ISchemaWrapper { + if (!$schema->hasTable('tables_row_cells_' . $name)) { + $table = $schema->createTable('tables_row_cells_' . $name); + $table->addColumn('id', Types::INTEGER, [ + 'autoincrement' => true, + 'notnull' => true, + ]); + $table->addColumn('column_id', Types::INTEGER, ['notnull' => true]); + $table->addColumn('row_id', Types::INTEGER, ['notnull' => true]); + $table->addColumn('value', $type, ['notnull' => false]); + $table->addColumn('last_edit_at', Types::DATETIME, ['notnull' => true]); + $table->addColumn('last_edit_by', Types::STRING, ['notnull' => true, 'length' => 64]); + $table->addIndex(['column_id', 'row_id']); + $table->addIndex(['column_id', 'value']); + $table->setPrimaryKey(['id']); + return $schema; + } + + return null; + } +} diff --git a/lib/Model/Public/Row.php b/lib/Model/Public/Row.php index d21db098b0..7c30d03729 100644 --- a/lib/Model/Public/Row.php +++ b/lib/Model/Public/Row.php @@ -34,7 +34,6 @@ public function __construct( ) { } - /** * @return array{"tableId": int, "rowId": int, "previousValues": null|array, "values": null|array} * diff --git a/lib/Search/SearchTablesProvider.php b/lib/Search/SearchTablesProvider.php index f5b08693a3..858e5dbf6d 100644 --- a/lib/Search/SearchTablesProvider.php +++ b/lib/Search/SearchTablesProvider.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Search; use OCA\Tables\AppInfo\Application; diff --git a/lib/Service/ColumnService.php b/lib/Service/ColumnService.php index fe56029974..1f7322e8f1 100644 --- a/lib/Service/ColumnService.php +++ b/lib/Service/ColumnService.php @@ -22,6 +22,7 @@ use OCA\Tables\Errors\PermissionError; use OCA\Tables\Helper\UserHelper; use OCA\Tables\ResponseDefinitions; +use OCA\Tables\Service\ValueObject\Title; use OCA\Tables\Service\ValueObject\ViewColumnInformation; use OCA\Tables\Validation\ColumnDtoValidator; use OCP\AppFramework\Db\DoesNotExistException; @@ -72,7 +73,6 @@ public function __construct( $this->columnDtoValidator = $columnDtoValidator; } - /** * @throws InternalError * @throws PermissionError @@ -224,6 +224,7 @@ public function find(int $id, ?string $userId = null): Column { * @param array $selectedViewIds * @return Column * + * @throws BadRequestError * @throws InternalError * @throws PermissionError|NotFoundError */ @@ -237,7 +238,12 @@ public function create( if (ColumnType::tryFrom($columnDto->getType()) === null) { throw new BadRequestError('Column type ' . $columnDto->getType() . ' does not exist.'); } - $this->columnDtoValidator->validate($columnDto); + $this->columnDtoValidator->validate($columnDto, true); + $columnTitle = $this->normalizeTitle($columnDto->getTitle(), true); + if ($columnTitle === null) { + throw new BadRequestError('Title is missing.'); + } + // security if ($viewId) { try { @@ -281,7 +287,7 @@ public function create( // Add number to title to avoid duplicate $columns = $this->mapper->findAllByTable($table->getId()); $i = 1; - $newTitle = $columnDto->getTitle(); + $newTitle = $columnTitle; while (true) { $found = false; foreach ($columns as $column) { @@ -293,7 +299,7 @@ public function create( if (!$found) { break; } - $newTitle = $columnDto->getTitle() . ' (' . $i . ')'; + $newTitle = $columnTitle . ' (' . $i . ')'; $i++; } @@ -339,6 +345,7 @@ public function create( * @param string|null $userId * @param ColumnDto $columnDto * @return Column + * @throws BadRequestError * @throws InternalError */ public function update( @@ -355,9 +362,10 @@ public function update( throw new PermissionError('update column id = ' . $columnId . ' is not allowed.'); } $this->columnDtoValidator->validate($columnDto); + $title = $this->normalizeTitle($columnDto->getTitle(), false); - if ($columnDto->getTitle() !== null) { - $item->setTitle($columnDto->getTitle()); + if ($title !== null) { + $item->setTitle($title); } if ($columnDto->getType() !== null) { $item->setType($columnDto->getType()); @@ -404,6 +412,8 @@ public function update( $this->updateMetadata($item, $userId); return $this->enhanceColumn($this->mapper->update($item)); + } catch (BadRequestError $e) { + throw $e; } catch (Exception $e) { $this->logger->error($e->getMessage()); throw new InternalError($e->getMessage()); @@ -440,6 +450,21 @@ private function validateCustomSettings(?string $customSettings): void { } } + private function normalizeTitle(?string $title, bool $required): ?string { + if ($title === null) { + if ($required) { + throw new BadRequestError('Title is missing.'); + } + return null; + } + + try { + return (string)new Title($title); + } catch (\InvalidArgumentException $e) { + throw new BadRequestError($e->getMessage(), 0, $e); + } + } + private function updateMetadata(Column $column, ?string $userId, bool $setCreateData = false): void { if ($userId) { $column->setLastEditBy($userId); diff --git a/lib/Service/ColumnTypes/NumberBusiness.php b/lib/Service/ColumnTypes/NumberBusiness.php index 1c7b2bb328..a0a549a48b 100644 --- a/lib/Service/ColumnTypes/NumberBusiness.php +++ b/lib/Service/ColumnTypes/NumberBusiness.php @@ -23,7 +23,6 @@ public function parseValue($value, Column $column): string { return json_encode(floatval($value)); } - /** * @param mixed $value (int|float|string|null) * @param Column $column diff --git a/lib/Service/ColumnTypes/RelationBusiness.php b/lib/Service/ColumnTypes/RelationBusiness.php new file mode 100644 index 0000000000..7ca0a73ba8 --- /dev/null +++ b/lib/Service/ColumnTypes/RelationBusiness.php @@ -0,0 +1,98 @@ +logger->warning('No column given, but expected on ' . __FUNCTION__ . ' within ' . __CLASS__, ['exception' => new \Exception()]); + return ''; + } + + $relationData = $this->relationService->getRelationData($column); + // try to find value by label + $matchingRelation = array_filter($relationData, fn (array $relation) => $relation['label'] === $value); + if (!empty($matchingRelation)) { + return json_encode(reset($matchingRelation)['id']); + } + + // if not found, try to find by id + if (is_numeric($value) && isset($relationData[(int)$value])) { + return json_encode($value); + } + + return ''; + } + + /** + * @param mixed $value (array|string|null) + * @param Column|null $column + * @return bool + */ + public function canBeParsed($value, ?Column $column = null): bool { + if (!$column) { + $this->logger->warning('No column given, but expected on ' . __FUNCTION__ . ' within ' . __CLASS__, ['exception' => new \Exception()]); + return false; + } + if ($value === null) { + return true; + } + + $relationData = $this->relationService->getRelationData($column); + // try to find value by label + $matchingRelation = array_filter($relationData, fn (array $relation) => $relation['label'] === $value); + if (!empty($matchingRelation)) { + return true; + } + // if not found, try to find by id + if (is_numeric($value) && isset($relationData[(int)$value])) { + return true; + } + + return false; + } + + public function validateValue(mixed $value, Column $column, string $userId, int $tableId, ?int $rowId): void { + if ($value === null || $value === '') { + return; + } + // Validate that the value exists in the target table/view + $relationData = $this->relationService->getRelationData($column); + + // Try to find value by label first + $matchingRelation = array_filter($relationData, fn (array $relation) => $relation['label'] === $value); + if (!empty($matchingRelation)) { + return; + } + + // If not found by label, try to find by id + if (is_numeric($value) && isset($relationData[(int)$value])) { + return; + } + + throw new BadRequestError('Relation value does not exist in the target table/view'); + } +} diff --git a/lib/Service/ColumnTypes/SelectionBusiness.php b/lib/Service/ColumnTypes/SelectionBusiness.php index 2b01427963..3fd6f19c76 100644 --- a/lib/Service/ColumnTypes/SelectionBusiness.php +++ b/lib/Service/ColumnTypes/SelectionBusiness.php @@ -24,7 +24,7 @@ public function parseValue($value, Column $column): string { foreach ($column->getSelectionOptionsArray() as $option) { if ($option['id'] === $intValue) { - return json_encode($option['id']); + return json_encode((string)$option['id']); } } diff --git a/lib/Service/ContextService.php b/lib/Service/ContextService.php index 9d123767f4..9a32490199 100644 --- a/lib/Service/ContextService.php +++ b/lib/Service/ContextService.php @@ -132,7 +132,6 @@ public function create(string $name, string $iconName, string $description, arra $context->setOwnerId($ownerId); $context->setOwnerType($ownerType); - $this->atomic(function () use ($context, $nodes) { $this->contextMapper->insert($context); diff --git a/lib/Service/FavoritesService.php b/lib/Service/FavoritesService.php index 51a0794e6d..cb09d62807 100644 --- a/lib/Service/FavoritesService.php +++ b/lib/Service/FavoritesService.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Service; use OCA\Tables\AppInfo\Application; diff --git a/lib/Service/ImportService.php b/lib/Service/ImportService.php index 20e90f4cbc..d8adc4b521 100644 --- a/lib/Service/ImportService.php +++ b/lib/Service/ImportService.php @@ -240,6 +240,10 @@ private function getPreviewData(Worksheet $worksheet): array { $value = $cell->getValue(); // $cellIterator`s index is based on 1, not 0. $colIndex = $cellIterator->getCurrentColumnIndex() - 1; + if (!array_key_exists($colIndex, $this->columns)) { + continue; + } + $column = $this->columns[$colIndex]; if (!array_key_exists($colIndex, $columns)) { @@ -474,7 +478,6 @@ public function scheduleImport(?int $tableId, ?int $viewId, string $path, bool $ ); } - /** * @param string $userId * @param ?int $tableId @@ -639,7 +642,7 @@ private function upsertRow(Row $row, array $columnBusinesses): void { if (!$cell || $cell->getValue() === null) { $this->logger->info('Cell is empty while fetching rows data for importing.'); if ($column->getMandatory()) { - $this->logger->warning('Mandatory column was not set'); + $this->logger->warning('Mandatory column "' . $column->getTitle() . '" was not set'); $this->countErrors++; return; } diff --git a/lib/Service/PermissionsService.php b/lib/Service/PermissionsService.php index 3140f1de46..74f3169692 100644 --- a/lib/Service/PermissionsService.php +++ b/lib/Service/PermissionsService.php @@ -49,6 +49,18 @@ class PermissionsService { private ContextMapper $contextMapper; + /** @var array> Per-request group IDs keyed by user ID. */ + private array $groupIdsByUserId = []; + + /** @var array> Per-request circle IDs keyed by user ID. */ + private array $circleIdsByUserId = []; + + /** @var array Per-request shared permissions keyed by node and user. */ + private array $sharedPermissionsByNode = []; + + /** @var array Per-request context permissions keyed by node and user. */ + private array $contextPermissionsByNode = []; + public function __construct( LoggerInterface $logger, ?string $userId, @@ -71,7 +83,6 @@ public function __construct( $this->circleHelper = $circleHelper; } - /** * @param string|null $userId * @param bool $canBeEmpty @@ -99,7 +110,6 @@ public function preCheckUserId(?string $userId = null, bool $canBeEmpty = true): return $userId; } - // ***** TABLES permissions ***** public function canReadTable(Table $table, ?string $userId = null): bool { @@ -278,7 +288,6 @@ public function canManageViewById(int $viewId, ?string $userId = null): bool { return $this->canManageView($view, $userId); } - // ***** COLUMNS permissions ***** public function canReadColumnsByViewId(int $viewId, ?string $userId = null): bool { @@ -318,10 +327,8 @@ public function canDeleteColumnsByTableId(int $tableId, ?string $userId = null): return $this->canManageTableById($tableId, $userId); } - // ***** ROWS permissions ***** - /** * @param int $elementId * @param 'table'|'view' $nodeType @@ -397,10 +404,8 @@ public function canDeleteRowsByTableId(?int $tableId = null, ?string $userId = n return false; } return $this->checkPermissionById($tableId, 'table', 'delete', $userId); - } - // ***** SHARE permissions ***** public function canReadShare(Share $share, ?string $userId = null): bool { @@ -423,7 +428,6 @@ public function canReadShare(Share $share, ?string $userId = null): bool { return false; } - if ($share->getSender() === $userId) { return true; } @@ -457,9 +461,18 @@ public function canReadShare(Share $share, ?string $userId = null): bool { * @throws NotFoundError|InternalError */ public function getSharedPermissionsIfSharedWithMe(int $elementId, string $elementType, string $userId): Permissions { + $cacheKey = $this->buildPermissionCacheKey($elementId, $elementType, $userId); + if (array_key_exists($cacheKey, $this->sharedPermissionsByNode)) { + $permissions = $this->sharedPermissionsByNode[$cacheKey]; + if ($permissions === null) { + throw new NotFoundError('No share for ' . $elementType . ' and given user ID found.'); + } + return $permissions; + } + try { - $groupIds = $this->userHelper->getGroupIdsForUser($userId) ?? []; - $userCircleIds = $this->circleHelper->getCircleIdsForUser($userId) ?? []; + $groupIds = $this->getGroupIdsForUser($userId); + $userCircleIds = $this->getCircleIdsForUser($userId); $shares = $this->shareMapper->findAllSharesForNodeTo($elementType, $elementId, $userId, $groupIds, $userCircleIds); } catch (Exception|InternalError $e) { $this->logger->warning('Exception occurred: ' . $e->getMessage() . ' Permission denied.'); @@ -522,23 +535,32 @@ public function getSharedPermissionsIfSharedWithMe(int $elementId, string $eleme || ($table && $this->canReadTable($table, $userId)) ); - return new Permissions( + $permissions = new Permissions( read: $read, create: $create, update: $update, delete: $delete, manage: $manage, ); + $this->sharedPermissionsByNode[$cacheKey] = $permissions; + return $permissions; } + $this->sharedPermissionsByNode[$cacheKey] = null; throw new NotFoundError('No share for ' . $elementType . ' and given user ID found.'); } - - // private methods ========================================================================== - /** * @throws NotFoundError */ public function getPermissionIfAvailableThroughContext(int $nodeId, string $nodeType, string $userId): int { + $cacheKey = $this->buildPermissionCacheKey($nodeId, $nodeType, $userId); + if (array_key_exists($cacheKey, $this->contextPermissionsByNode)) { + $permissions = $this->contextPermissionsByNode[$cacheKey]; + if ($permissions === null) { + throw new NotFoundError('Node not found in any context'); + } + return $permissions; + } + $permissions = 0; $found = false; $iNodeType = ConversionHelper::stringNodeType2Const($nodeType); @@ -549,6 +571,7 @@ public function getPermissionIfAvailableThroughContext(int $nodeId, string $node && $context->getOwnerId() === $userId) { // Making someone owner of a context, makes this person also having manage permissions on the node. // This is sort of an intended "privilege escalation". + $this->contextPermissionsByNode[$cacheKey] = Application::PERMISSION_ALL; return Application::PERMISSION_ALL; } foreach ($context->getNodes() as $nodeRelation) { @@ -556,8 +579,10 @@ public function getPermissionIfAvailableThroughContext(int $nodeId, string $node } } if (!$found) { + $this->contextPermissionsByNode[$cacheKey] = null; throw new NotFoundError('Node not found in any context'); } + $this->contextPermissionsByNode[$cacheKey] = $permissions; return $permissions; } @@ -580,6 +605,42 @@ public function setPublicContext(): void { $this->isPublicContext = true; } + /** + * @return list + */ + private function getGroupIdsForUser(string $userId): array { + if (!array_key_exists($userId, $this->groupIdsByUserId)) { + $groupIds = []; + foreach ($this->userHelper->getGroupIdsForUser($userId) ?? [] as $groupId) { + if (is_string($groupId)) { + $groupIds[] = $groupId; + } + } + $this->groupIdsByUserId[$userId] = $groupIds; + } + return $this->groupIdsByUserId[$userId]; + } + + /** + * @return list + */ + private function getCircleIdsForUser(string $userId): array { + if (!array_key_exists($userId, $this->circleIdsByUserId)) { + $circleIds = []; + foreach ($this->circleHelper->getCircleIdsForUser($userId) ?? [] as $circleId) { + if (is_string($circleId)) { + $circleIds[] = $circleId; + } + } + $this->circleIdsByUserId[$userId] = $circleIds; + } + return $this->circleIdsByUserId[$userId]; + } + + private function buildPermissionCacheKey(int $nodeId, string $nodeType, string $userId): string { + return $nodeType . ':' . $nodeId . ':' . $userId; + } + private function hasPermission(int $existingPermissions, string $permissionName): bool { $constantName = 'PERMISSION_' . strtoupper($permissionName); try { diff --git a/lib/Service/RelationService.php b/lib/Service/RelationService.php new file mode 100644 index 0000000000..7c53b3b875 --- /dev/null +++ b/lib/Service/RelationService.php @@ -0,0 +1,213 @@ + Cache for relation data */ + private array $cacheRelationData = []; + + public function __construct( + private ColumnMapper $columnMapper, + private ViewMapper $viewMapper, + private Row2Mapper $row2Mapper, + private ColumnService $columnService, + private ?string $userId, + ) { + } + + /** + * Get all relation data for a table + * + * @param int $tableId + * @return array Relation data grouped by column ID + * @throws InternalError + * @throws NotFoundError + * @throws PermissionError + */ + public function getRelationsForTable(int $tableId): array { + // Check table permissions through ColumnService + $columns = $this->columnService->findAllByTable($tableId); + + $relationColumns = array_filter($columns, function ($column) { + return $column->getType() === Column::TYPE_RELATION; + }); + + return $this->getRelationsForColumns($relationColumns); + } + + /** + * Get all relation data for a view + * + * @param int $viewId + * @return array Relation data grouped by column ID + * @throws InternalError + * @throws NotFoundError + * @throws PermissionError + */ + public function getRelationsForView(int $viewId): array { + // Check view permissions through ColumnService + $columns = $this->columnService->findAllByView($viewId); + + $relationColumns = array_filter($columns, function ($column) { + return $column->getType() === Column::TYPE_RELATION; + }); + + return $this->getRelationsForColumns($relationColumns); + } + + /** + * Get relation data for specific columns + * + * @param Column[] $relationColumns + * @return array Relation data grouped by column ID + * @throws InternalError + */ + private function getRelationsForColumns(array $relationColumns): array { + // Group columns by their target (relationType + targetId + labelColumn) + $result = []; + $groupedColumns = $this->groupColumnsByTarget($relationColumns); + foreach ($groupedColumns as $target => $columns) { + $relationData = $this->getRelationDataForTarget($target, $columns[0]); + + // Assign the same data to all columns with this target + foreach ($columns as $column) { + $result[$column->getId()] = $relationData; + } + } + + return $result; + } + + /** + * Group relation columns by their target configuration + * + * @param Column[] $columns + * @return array + */ + private function groupColumnsByTarget(array $columns): array { + $groups = []; + + foreach ($columns as $column) { + $settings = $column->getCustomSettingsArray(); + if (empty($settings['relationType']) || empty($settings['targetId']) || empty($settings['labelColumn'])) { + continue; + } + + $target = sprintf('%s_%s_%s', $settings['relationType'], $settings['targetId'], $settings['labelColumn']); + if (!isset($groups[$target])) { + $groups[$target] = []; + } + $groups[$target][] = $column; + } + + return $groups; + } + + /** + * Get relation data for a specific column + * + * @param Column $column + * @return array Indexed per row id + */ + public function getRelationData(Column $column): array { + if ($column->getType() !== Column::TYPE_RELATION) { + return []; + } + + $settings = $column->getCustomSettingsArray(); + if (empty($settings['relationType']) || empty($settings['targetId']) || empty($settings['labelColumn'])) { + return []; + } + + $target = sprintf('%s_%s_%s', $settings['relationType'], $settings['targetId'], $settings['labelColumn']); + + return $this->getRelationDataForTarget($target, $column); + } + + /** + * Get relation data for a specific target + * + * @param string $target + * @param Column $column + * @return array Indexed per row id + * @throws InternalError + */ + private function getRelationDataForTarget(string $target, Column $column): array { + // Check cache first + $cacheKey = $target . '_' . ($this->userId ?? 'anonymous'); + if (isset($this->cacheRelationData[$cacheKey])) { + return $this->cacheRelationData[$cacheKey]; + } + + $settings = $column->getCustomSettingsArray(); + if (empty($settings[Column::RELATION_TYPE]) || empty($settings[Column::RELATION_TARGET_ID]) || empty($settings[Column::RELATION_LABEL_COLUMN])) { + $this->cacheRelationData[$cacheKey] = []; + return []; + } + + $isView = $settings[Column::RELATION_TYPE] === 'view'; + $targetId = $settings[Column::RELATION_TARGET_ID] ?? null; + + try { + $targetColumn = $this->columnMapper->find($settings[Column::RELATION_LABEL_COLUMN]); + if ($isView) { + $view = $this->viewMapper->find($targetId); + $rows = $this->row2Mapper->findAll( + [$targetColumn->getId()], + $view->getTableId(), + null, + null, + $view->getFilterArray(), + $view->getSortArray(), + $this->userId + ); + } else { + $rows = $this->row2Mapper->findAll( + [$targetColumn->getId()], + $targetId, + null, + null, + null, + null, + $this->userId + ); + } + } catch (DoesNotExistException $e) { + $this->cacheRelationData[$cacheKey] = []; + return []; + } + + $result = []; + foreach ($rows as $row) { + $data = $row->getData(); + $displayFieldData = array_filter($data, function ($item) use ($settings) { + return $item['columnId'] === (int)$settings[Column::RELATION_LABEL_COLUMN]; + }); + $value = reset($displayFieldData)['value'] ?? null; + + // Structure compatible with Row2 format: {id: int, label: string} + $rowId = (int)$row->getId(); + $result[$rowId] = [ + 'id' => $rowId, + 'label' => (string)$value, + ]; + } + + $this->cacheRelationData[$cacheKey] = $result; + return $result; + } +} diff --git a/lib/Service/RowService.php b/lib/Service/RowService.php index d07afeed63..2c37ca335a 100644 --- a/lib/Service/RowService.php +++ b/lib/Service/RowService.php @@ -126,7 +126,15 @@ public function findAllByView(int $viewId, string $userId, ?int $limit = null, ? if ($this->permissionsService->canReadRowsByElementId($viewId, 'view', $userId)) { $view = $this->viewMapper->find($viewId); - return $this->row2Mapper->findAll($view->getColumnIds(), $view->getTableId(), $limit, $offset, $view->getFilterArray(), $view->getSortArray(), $userId); + return $this->row2Mapper->findAll( + $view->getColumnIds(), + $view->getTableId(), + $limit, + $offset, + $view->getFilterArray(), + $view->getSortArray(), + $this->resolveFilterUserId($userId, $view), + ); } else { throw new PermissionError('no read access to view id = ' . $viewId); } @@ -136,6 +144,17 @@ public function findAllByView(int $viewId, string $userId, ?int $limit = null, ? } } + /** + * resolve userid used for field placeholders in view filters. + * if the request is made in a public and no userid is provided,use the view created_by id as fallback + */ + private function resolveFilterUserId(string $userId, View $view): string { + if ($userId === '' && $this->isPublicContext) { + return $view->getCreatedBy() ?? ''; + } + + return $userId; + } /** * @param int $rowId @@ -182,7 +201,7 @@ public function create(?int $tableId, ?int $viewId, RowDataInput|array $data, ?s if ($userId) { $this->userId = $userId; } - if ($this->userId === null || $this->userId === '') { + if ($this->userId === null || ($this->userId === '' && !$this->isPublicContext)) { $e = new \Exception('No user id in context, but needed.'); $this->logger->error($e->getMessage(), ['exception' => $e]); throw new InternalError(get_class($this) . ' - ' . __FUNCTION__ . ': ' . $e->getMessage()); @@ -571,7 +590,7 @@ public function updateSet( if ($userId) { $this->userId = $userId; } - if ($this->userId === null || $this->userId === '') { + if ($this->userId === null || ($this->userId === '' && !$this->isPublicContext)) { $e = new \Exception('No user id in context, but needed.'); $this->logger->error($e->getMessage(), ['exception' => $e]); throw new InternalError(get_class($this) . ' - ' . __FUNCTION__ . ': ' . $e->getMessage()); diff --git a/lib/Service/ShareService.php b/lib/Service/ShareService.php index faf6c1ea6f..72f8a09524 100644 --- a/lib/Service/ShareService.php +++ b/lib/Service/ShareService.php @@ -10,7 +10,6 @@ namespace OCA\Tables\Service; use DateTime; - use InvalidArgumentException; use OCA\Circles\Model\Circle; use OCA\Tables\AppInfo\Application; diff --git a/lib/Service/SuperService.php b/lib/Service/SuperService.php index 9379cdbca6..13ed13f249 100644 --- a/lib/Service/SuperService.php +++ b/lib/Service/SuperService.php @@ -16,6 +16,8 @@ class SuperService { protected ?string $userId; + protected bool $isPublicContext = false; + public function __construct(LoggerInterface $logger, ?string $userId, PermissionsService $permissionsService) { $this->permissionsService = $permissionsService; $this->logger = $logger; @@ -24,6 +26,7 @@ public function __construct(LoggerInterface $logger, ?string $userId, Permission public function setPublicContext(): void { $this->userId = ''; + $this->isPublicContext = true; $this->permissionsService->setPublicContext(); } } diff --git a/lib/Service/Support/AuditLogServiceInterface.php b/lib/Service/Support/AuditLogServiceInterface.php index 88847c730f..c93441011f 100644 --- a/lib/Service/Support/AuditLogServiceInterface.php +++ b/lib/Service/Support/AuditLogServiceInterface.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Service\Support; interface AuditLogServiceInterface { diff --git a/lib/Service/Support/DefaultAuditLogService.php b/lib/Service/Support/DefaultAuditLogService.php index 68f43dc4bb..b069c667bc 100644 --- a/lib/Service/Support/DefaultAuditLogService.php +++ b/lib/Service/Support/DefaultAuditLogService.php @@ -5,6 +5,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Tables\Service\Support; use OCP\EventDispatcher\IEventDispatcher; diff --git a/lib/Service/TableService.php b/lib/Service/TableService.php index 726ee1c73e..c06f89ccfd 100644 --- a/lib/Service/TableService.php +++ b/lib/Service/TableService.php @@ -26,6 +26,7 @@ use OCA\Tables\Model\SortRuleSet; use OCA\Tables\Model\TableScheme; use OCA\Tables\ResponseDefinitions; +use OCA\Tables\Service\ValueObject\Title; use OCP\App\IAppManager; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\MultipleObjectsReturnedException; @@ -228,7 +229,6 @@ private function setIsSharedState(Table $table, string $userId): void { } } - /** * @param int $id * @param string|null $userId @@ -271,10 +271,12 @@ public function find(int $id, bool $skipTableEnhancement = false, ?string $userI * @param string|null $userId * @return Table * @throws InternalError + * @throws \InvalidArgumentException * @noinspection DuplicatedCode */ public function create(string $title, string $template, ?string $emoji, ?string $description = '', ?string $userId = null): Table { $userId = $this->permissionsService->preCheckUserId($userId, false); // we can assume that the $userId is set + $title = (string)new Title($title); $time = new DateTime(); $item = new Table(); @@ -436,7 +438,6 @@ public function delete(int $id, ?string $userId = null): Table { } } - // delete all shares for that table $this->shareService->deleteAllForTable($item); @@ -475,6 +476,7 @@ public function delete(int $id, ?string $userId = null): Table { * @throws InternalError * @throws NotFoundError * @throws PermissionError + * @throws \InvalidArgumentException */ public function update(int $id, ?string $title, ?string $emoji, ?string $description, ?bool $archived = null, ?string $userId = null, ?ColumnSettings $columnSettings = null, ?SortRuleSet $sort = null): Table { $userId = $this->permissionsService->preCheckUserId($userId); @@ -497,6 +499,7 @@ public function update(int $id, ?string $title, ?string $emoji, ?string $descrip $changes = new ChangeSet($table); $time = new DateTime(); if ($title !== null) { + $title = (string)new Title($title); $table->setTitle($title); } if ($emoji !== null) { diff --git a/lib/Service/TableTemplateService.php b/lib/Service/TableTemplateService.php index c11fac37bf..8bab583984 100644 --- a/lib/Service/TableTemplateService.php +++ b/lib/Service/TableTemplateService.php @@ -240,7 +240,6 @@ private function makeCustomers(Table $table):void { 'title' => $this->l->t('Description'), 'type' => 'text', 'subtype' => $this->textRichColumnTypeName, - ]; $columns['description'] = $this->createColumn($table->id, $params); @@ -248,7 +247,6 @@ private function makeCustomers(Table $table):void { 'title' => $this->l->t('Contact information'), 'type' => 'text', 'subtype' => $this->textRichColumnTypeName, - ]; $columns['contactInformation'] = $this->createColumn($table->id, $params); @@ -265,7 +263,6 @@ private function makeCustomers(Table $table):void { 'title' => $this->l->t('Comment'), 'type' => 'text', 'subtype' => $this->textRichColumnTypeName, - ]; $columns['comment'] = $this->createColumn($table->id, $params); @@ -340,7 +337,6 @@ private function makeVacationRequests(Table $table):void { 'type' => 'text', 'subtype' => 'line', 'mandatory' => true, - ]; $columns['employee'] = $this->createColumn($table->id, $params); @@ -350,7 +346,6 @@ private function makeVacationRequests(Table $table):void { 'type' => 'datetime', 'subtype' => 'date', 'mandatory' => true, - ]; $columns['from'] = $this->createColumn($table->id, $params); @@ -360,7 +355,6 @@ private function makeVacationRequests(Table $table):void { 'type' => 'datetime', 'subtype' => 'date', 'mandatory' => true, - ]; $columns['to'] = $this->createColumn($table->id, $params); @@ -371,7 +365,6 @@ private function makeVacationRequests(Table $table):void { 'numberMin' => 0, 'numberMax' => 100, 'mandatory' => true, - ]; $columns['workingDays'] = $this->createColumn($table->id, $params); @@ -381,7 +374,6 @@ private function makeVacationRequests(Table $table):void { 'subtype' => 'date', 'mandatory' => true, 'datetimeDefault' => 'today', - ]; $columns['dateRequest'] = $this->createColumn($table->id, $params); @@ -389,7 +381,6 @@ private function makeVacationRequests(Table $table):void { 'title' => $this->l->t('Approved'), 'type' => 'selection', 'subtype' => 'check', - ]; $columns['approved'] = $this->createColumn($table->id, $params); @@ -397,7 +388,6 @@ private function makeVacationRequests(Table $table):void { 'title' => $this->l->t('Approve date'), 'type' => 'datetime', 'subtype' => 'date', - ]; $columns['dateApprove'] = $this->createColumn($table->id, $params); @@ -405,16 +395,13 @@ private function makeVacationRequests(Table $table):void { 'title' => $this->l->t('Approved by'), 'type' => 'text', 'subtype' => 'line', - ]; $columns['approveBy'] = $this->createColumn($table->id, $params); - $params = [ 'title' => $this->l->t('Comments'), 'type' => 'text', 'subtype' => $this->textRichColumnTypeName, - ]; $columns['comment'] = $this->createColumn($table->id, $params); @@ -463,7 +450,6 @@ private function makeVacationRequests(Table $table):void { $columns['dateRequest']->getId() => '2023-01-30', ]); - // let's add views $this->createView($table, [ @@ -535,7 +521,6 @@ private function makeMembers(Table $table):void { 'type' => 'text', 'subtype' => 'line', 'mandatory' => true, - ]; $columns['name'] = $this->createColumn($table->id, $params); @@ -543,7 +528,6 @@ private function makeMembers(Table $table):void { 'title' => $this->l->t('Position'), 'type' => 'text', 'subtype' => 'line', - ]; $columns['position'] = $this->createColumn($table->id, $params); @@ -551,7 +535,6 @@ private function makeMembers(Table $table):void { 'title' => $this->l->t('Skills'), 'type' => 'text', 'subtype' => $this->textRichColumnTypeName, - ]; $columns['skills'] = $this->createColumn($table->id, $params); @@ -559,7 +542,6 @@ private function makeMembers(Table $table):void { 'title' => $this->l->t('Birthday'), 'type' => 'datetime', 'subtype' => 'date', - ]; $columns['birthday'] = $this->createColumn($table->id, $params); @@ -567,7 +549,6 @@ private function makeMembers(Table $table):void { 'title' => $this->l->t('Comments'), 'type' => 'text', 'subtype' => $this->textRichColumnTypeName, - ]; $columns['comment'] = $this->createColumn($table->id, $params); @@ -601,7 +582,6 @@ private function makeTodo(Table $table): void { 'type' => 'text', 'subtype' => 'line', 'mandatory' => true, - ]; $columns['task'] = $this->createColumn($table->id, $params); @@ -611,7 +591,6 @@ private function makeTodo(Table $table): void { 'subtype' => $this->textRichColumnTypeName, 'description' => $this->l->t('Title or short description'), 'textMultiline' => true, - ]; $columns['description'] = $this->createColumn($table->id, $params); @@ -620,7 +599,6 @@ private function makeTodo(Table $table): void { 'type' => 'text', 'subtype' => $this->textRichColumnTypeName, 'description' => $this->l->t('Date, time or whatever'), - ]; $columns['target'] = $this->createColumn($table->id, $params); @@ -637,7 +615,6 @@ private function makeTodo(Table $table): void { 'title' => $this->l->t('Comments'), 'type' => 'text', 'subtype' => $this->textRichColumnTypeName, - ]; $columns['comments'] = $this->createColumn($table->id, $params); @@ -645,7 +622,6 @@ private function makeTodo(Table $table): void { 'title' => $this->l->t('Proofed'), 'type' => 'selection', 'subtype' => 'check', - ]; $columns['proofed'] = $this->createColumn($table->id, $params); @@ -695,7 +671,6 @@ private function makeTodo(Table $table): void { ]); } - /** * @psalm-suppress PossiblyNullReference * @param Table $table @@ -713,7 +688,6 @@ private function makeStartupTable(Table $table):void { 'title' => $this->l->t('What'), 'type' => 'text', 'subtype' => 'line', - ]; $columns['what'] = $this->createColumn($table->id, $params); @@ -721,7 +695,6 @@ private function makeStartupTable(Table $table):void { 'title' => $this->l->t('How to do'), 'type' => 'text', 'subtype' => $this->textRichColumnTypeName, - ]; $columns['how'] = $this->createColumn($table->id, $params); @@ -729,7 +702,6 @@ private function makeStartupTable(Table $table):void { 'title' => $this->l->t('Ease of use'), 'type' => 'number', 'subtype' => 'stars', - ]; $columns['ease'] = $this->createColumn($table->id, $params); @@ -738,11 +710,9 @@ private function makeStartupTable(Table $table):void { 'title' => $this->l->t('Done'), 'type' => 'selection', 'subtype' => 'check', - ]; $columns['done'] = $this->createColumn($table->id, $params); - // let's add some example rows $this->createRow($table, [ $columns['what']->getId() => $this->l->t('Open the tables app'), diff --git a/lib/Service/ValueObject/Title.php b/lib/Service/ValueObject/Title.php index a7f842e61a..3a21f76fd4 100644 --- a/lib/Service/ValueObject/Title.php +++ b/lib/Service/ValueObject/Title.php @@ -15,6 +15,12 @@ class Title implements Stringable { public function __construct( protected string $title, ) { + $this->title = $this->normalize($this->title); + + if ($this->title === '') { + throw new \InvalidArgumentException('Title is missing.'); + } + if (strlen($this->title) > 200) { throw new \InvalidArgumentException('Title exceed maximum length of 200 bytes'); } @@ -23,4 +29,9 @@ public function __construct( public function __toString(): string { return $this->title; } + + private function normalize(string $title): string { + $normalizedTitle = preg_replace('/^[\s\p{Z}]+|[\s\p{Z}]+$/u', '', $title); + return $normalizedTitle ?? trim($title); + } } diff --git a/lib/Service/ViewService.php b/lib/Service/ViewService.php index 9a8b558d68..8c5ad15890 100644 --- a/lib/Service/ViewService.php +++ b/lib/Service/ViewService.php @@ -173,7 +173,8 @@ public function findSharedViewsWithMe(?string $userId = null): array { ) { continue; } - $sharedViews[$node['node_id']] = $this->find($node['node_id'], false, $userId); + // All shared views are enhanced once in the final loop below. + $sharedViews[$node['node_id']] = $this->find($node['node_id'], true, $userId); } } @@ -183,7 +184,6 @@ public function findSharedViewsWithMe(?string $userId = null): array { return array_values($sharedViews); } - /** * @param string $title * @param string|null $emoji @@ -337,7 +337,6 @@ public function delete(int $id, ?string $userId = null): View { } } - /** * @param View $view * @param string|null $userId @@ -435,20 +434,26 @@ private function setIsSharedState(View $view, string $userId): void { $permissions = $this->permissionsService->getPermissionArrayForNodeFromContexts($view->getId(), 'view', $userId); } $view->setIsShared(true); + $canManageTable = false; try { try { $manageTableShare = $this->shareService->getSharedPermissionsIfSharedWithMe($view->getTableId(), 'table', $userId); } catch (NotFoundError) { $manageTableShare = $this->permissionsService->getPermissionArrayForNodeFromContexts($view->getTableId(), 'table', $userId); } - if ($manageTableShare->manage) { - $permissions->manageTable = true; - } + $canManageTable = $manageTableShare->manage; } catch (NotFoundError $e) { } catch (\Exception $e) { throw new InternalError($e->getMessage()); } - $view->setOnSharePermissions($permissions); + $view->setOnSharePermissions(new Permissions( + read: $permissions->read, + create: $permissions->create, + update: $permissions->update, + delete: $permissions->delete, + manage: $permissions->manage, + manageTable: $canManageTable, + )); } catch (NotFoundError $e) { } catch (\Exception $e) { $this->logger->warning('Exception occurred while setting shared permissions: ' . $e->getMessage() . ' No permissions granted.'); diff --git a/lib/Validation/ColumnDtoValidator.php b/lib/Validation/ColumnDtoValidator.php index c0cb8f58e2..03282ffe7a 100644 --- a/lib/Validation/ColumnDtoValidator.php +++ b/lib/Validation/ColumnDtoValidator.php @@ -9,12 +9,25 @@ use OCA\Tables\Dto\Column as ColumnDto; use OCA\Tables\Errors\BadRequestError; +use OCA\Tables\Service\ValueObject\Title; class ColumnDtoValidator { /** * @throws BadRequestError */ - public function validate(ColumnDto $columnDto): void { + public function validate(ColumnDto $columnDto, bool $requiresTitle = false): void { + $title = $columnDto->getTitle(); + if ($requiresTitle && $title === null) { + throw new BadRequestError('Title is missing.'); + } + if ($title !== null) { + try { + new Title($title); + } catch (\InvalidArgumentException $e) { + throw new BadRequestError($e->getMessage(), 0, $e); + } + } + $textMaxLength = $columnDto->getTextMaxLength(); if ($textMaxLength !== null && $textMaxLength < 0) { throw new BadRequestError('Maximum text length must be greater than or equal to 0.'); diff --git a/openapi.json b/openapi.json index 6a9442764f..b02bee3c14 100644 --- a/openapi.json +++ b/openapi.json @@ -1225,6 +1225,24 @@ } } }, + "400": { + "description": "Invalid request data", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } + } + } + } + }, "500": { "description": "", "content": { @@ -1329,6 +1347,24 @@ } } }, + "400": { + "description": "Invalid request data", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } + } + } + } + }, "403": { "description": "No permissions", "content": { @@ -3686,7 +3722,8 @@ "number", "datetime", "select", - "usergroup" + "usergroup", + "relation" ], "description": "Column main type" }, @@ -4114,7 +4151,8 @@ "number", "datetime", "select", - "usergroup" + "usergroup", + "relation" ], "description": "Column main type" }, @@ -6639,6 +6677,44 @@ } } }, + "400": { + "description": "Invalid request data", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } + } + } + } + } + } + } + } + }, "500": { "description": "", "content": { @@ -8836,6 +8912,44 @@ } } }, + "400": { + "description": "Invalid request data", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } + } + } + } + } + } + } + } + }, "403": { "description": "No permission", "content": { @@ -9140,6 +9254,44 @@ } } }, + "400": { + "description": "Invalid request data", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } + } + } + } + } + } + } + } + }, "403": { "description": "No permission", "content": { @@ -9432,6 +9584,44 @@ } } }, + "400": { + "description": "Invalid request data", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } + } + } + } + } + } + } + } + }, "403": { "description": "No permission", "content": { @@ -9723,6 +9913,44 @@ } } }, + "400": { + "description": "Invalid request data", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } + } + } + } + } + } + } + } + }, "403": { "description": "No permission", "content": { @@ -10024,6 +10252,44 @@ } } }, + "400": { + "description": "Invalid request data", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } + } + } + } + } + } + } + } + }, "403": { "description": "No permission", "content": { diff --git a/package-lock.json b/package-lock.json index 360012c80f..0cde75d81e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,34 +1,35 @@ { "name": "tables", - "version": "2.1.1", + "version": "2.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tables", - "version": "2.1.1", + "version": "2.2.0", "license": "AGPL-3.0-or-later", "dependencies": { + "@material-symbols/svg-400": "^0.45.4", "@mdi/svg": "^7.4.47", "@nextcloud/auth": "^2.6.0", - "@nextcloud/axios": "^2.5.2", + "@nextcloud/axios": "^2.6.0", "@nextcloud/capabilities": "^1.2.1", - "@nextcloud/dialogs": "^7.3.0", + "@nextcloud/dialogs": "^7.4.0", "@nextcloud/event-bus": "^3.3.3", "@nextcloud/files": "^4.0.0", "@nextcloud/initial-state": "^3.0.0", "@nextcloud/l10n": "^3.4.1", "@nextcloud/moment": "^1.3.5", "@nextcloud/router": "^3.1.0", - "@nextcloud/vue": "^8.37.0", - "@tiptap/extension-character-count": "^3.22.5", - "@tiptap/extension-task-item": "^3.22.5", - "@tiptap/extension-task-list": "^3.22.5", - "@tiptap/starter-kit": "^3.22.5", - "@tiptap/vue-2": "^3.22.5", + "@nextcloud/vue": "^8.39.0", + "@tiptap/extension-character-count": "^3.27.1", + "@tiptap/extension-task-item": "^3.27.1", + "@tiptap/extension-task-list": "^3.27.1", + "@tiptap/starter-kit": "^3.27.1", + "@tiptap/vue-2": "^3.27.1", "@vueuse/core": "^11.3.0", "debounce": "^3.0.0", - "dompurify": "^3.4.0", + "dompurify": "^3.4.11", "pinia": "^2.3.1", "vue": "^2.7.16", "vue-infinite-loading": "^2.4.5", @@ -45,21 +46,21 @@ "@nextcloud/eslint-config": "^8.4.2", "@nextcloud/stylelint-config": "^3.1.1", "@nextcloud/vite-config": "^1.7.2", - "@playwright/test": "^1.59.1", + "@playwright/test": "^1.61.1", "@vue/tsconfig": "^0.5.1", - "cypress": "^15.14.2", + "cypress": "^15.18.0", "cypress-downloadfile": "^1.2.4", - "cypress-vite": "^1.8.0", + "cypress-vite": "^1.10.2", "openapi-typescript": "^7.13.0", "typescript": "^5.3.3", - "vite": "^7.3.2" + "vite": "^7.3.6" }, "engines": { "node": "^24.0.0", "npm": "^11.3.0" }, "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.60.2" + "@rollup/rollup-linux-x64-gnu": "^4.62.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -73,13 +74,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -88,9 +89,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "peer": true, @@ -99,22 +100,22 @@ } }, "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -157,13 +158,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -187,15 +190,15 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -265,9 +268,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "peer": true, @@ -291,31 +294,31 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -403,27 +406,27 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "peer": true, @@ -448,27 +451,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -1669,35 +1672,35 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -1705,13 +1708,13 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1812,9 +1815,9 @@ } }, "node_modules/@cypress/request": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.10.tgz", - "integrity": "sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-4.0.1.tgz", + "integrity": "sha512-y20e+e6dFYkOUUJLVUZTsJRuTiXZaUQ32WD+R/ux/HBybbTx4ge7cNINcua0pU8+SNkKuRbOF12mBmzuzM8n5w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1831,24 +1834,13 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "~6.14.1", + "qs": "^6.15.2", "safe-buffer": "^5.1.2", "tough-cookie": "^5.0.0", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" + "tunnel-agent": "^0.6.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/@cypress/request/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "node": ">= 14.17.0" } }, "node_modules/@cypress/vue2": { @@ -1915,9 +1907,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", - "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], @@ -1932,9 +1924,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", - "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -1949,9 +1941,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", - "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -1966,9 +1958,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", - "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -1983,9 +1975,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", - "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -2000,9 +1992,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", - "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -2017,9 +2009,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", - "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -2034,9 +2026,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", - "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -2051,9 +2043,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", - "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -2068,9 +2060,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", - "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -2085,9 +2077,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", - "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -2102,9 +2094,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", - "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -2119,9 +2111,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", - "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -2136,9 +2128,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", - "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -2153,9 +2145,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", - "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -2170,9 +2162,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", - "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -2187,9 +2179,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -2204,9 +2196,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", - "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], @@ -2221,9 +2213,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", - "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -2238,9 +2230,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", - "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], @@ -2255,9 +2247,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", - "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -2272,9 +2264,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], @@ -2289,9 +2281,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", - "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -2306,9 +2298,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -2323,9 +2315,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -2340,9 +2332,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -2499,19 +2491,38 @@ "license": "MIT" }, "node_modules/@grpc/grpc-js": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.2.tgz", - "integrity": "sha512-nnR5nmL6lxF8YBqb6gWvEgLdLh/Fn+kvAdX5hUOnt48sNSb0riz/93ASd2E5gvanPA41X6Yp25bIfGRp1SMb2g==", + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.4.tgz", + "integrity": "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@grpc/proto-loader": "^0.7.13", + "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" }, "engines": { "node": ">=12.10.0" } }, + "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", + "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@grpc/proto-loader": { "version": "0.7.13", "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", @@ -2758,6 +2769,12 @@ "unist-util-is": "^3.0.0" } }, + "node_modules/@material-symbols/svg-400": { + "version": "0.45.4", + "resolved": "https://registry.npmjs.org/@material-symbols/svg-400/-/svg-400-0.45.4.tgz", + "integrity": "sha512-xVWG2K0MryMr6Ga0t1GXb0rseREUzGTZE3yqydVXk9zp5JscHyPO7VxfaXp504gouGVcQfs36Mbgo8/ClQF/zQ==", + "license": "Apache-2.0" + }, "node_modules/@mdi/js": { "version": "7.4.47", "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.4.47.tgz", @@ -2818,9 +2835,9 @@ } }, "node_modules/@microsoft/api-extractor/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { @@ -2941,14 +2958,13 @@ } }, "node_modules/@nextcloud/axios": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@nextcloud/axios/-/axios-2.5.2.tgz", - "integrity": "sha512-8frJb77jNMbz00TjsSqs1PymY0nIEbNM4mVmwen2tXY7wNgRai6uXilIlXKOYB9jR/F/HKRj6B4vUwVwZbhdbw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@nextcloud/axios/-/axios-2.6.0.tgz", + "integrity": "sha512-ehcIgyora8DAJ+STG6iFI4e+ufPVFrIA6o0FgMKeKdfyaxRJ9UM7L+n7V+rc/qv8sDiWC/hWIKwFtLw2W5yE4Q==", "license": "GPL-3.0-or-later", "dependencies": { - "@nextcloud/auth": "^2.5.1", - "@nextcloud/router": "^3.0.1", - "axios": "^1.12.2" + "@nextcloud/auth": "^2.6.0", + "axios": "^1.15.0" }, "engines": { "node": "^20.0.0 || ^22.0.0 || ^24.0.0" @@ -3017,34 +3033,97 @@ } }, "node_modules/@nextcloud/dialogs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@nextcloud/dialogs/-/dialogs-7.3.0.tgz", - "integrity": "sha512-pFuM10Dkvip+wSBaElcbSAN7Jynp41HJUh5kndRYpJipYl0SpNfjIe32+uNfOI43/tln4ScTlrfjIX6cK+3uHg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@nextcloud/dialogs/-/dialogs-7.4.0.tgz", + "integrity": "sha512-XAkRls7T1xIxH+E7ArW5+gY0CrqebT+3Pxo30u7XBc21UNgc8vhl4mv5SRiDe9OgSK6/QI0bPNMvCasSaSSVpA==", "license": "AGPL-3.0-or-later", "dependencies": { "@mdi/js": "^7.4.47", - "@nextcloud/auth": "^2.5.3", - "@nextcloud/axios": "^2.5.2", + "@nextcloud/auth": "^2.6.0", + "@nextcloud/axios": "^2.6.0", "@nextcloud/browser-storage": "^0.5.0", "@nextcloud/event-bus": "^3.3.3", "@nextcloud/files": "^4.0.0", "@nextcloud/initial-state": "^3.0.0", "@nextcloud/l10n": "^3.4.1", - "@nextcloud/paths": "^3.0.0", + "@nextcloud/paths": "^3.1.0", "@nextcloud/router": "^3.1.0", "@nextcloud/sharing": "^0.4.0", - "@nextcloud/vue": "^9.5.0", + "@nextcloud/vue": "^9.8.0", "@types/toastify-js": "^1.12.4", - "@vueuse/core": "^14.2.1", - "p-queue": "^9.0.1", + "@vueuse/core": "^14.3.0", + "p-queue": "^9.1.2", "toastify-js": "^1.12.0", - "vue": "^3.5.28", - "webdav": "^5.8.0" + "vue": "^3.5.34", + "webdav": "^5.10.0" }, "engines": { "node": "^20 || ^22 || ^24" } }, + "node_modules/@nextcloud/dialogs/node_modules/@babel/generator": { + "version": "8.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0-rc.5.tgz", + "integrity": "sha512-nFZPWz3FHIS7y6rMIVoa/WBwjdutfIaRJIBQjzn+t3RnecZoRNlGmGcyR2wb0T/IgSd50Kz/6dG8/LvMCRunjg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^8.0.0-rc.5", + "@babel/types": "^8.0.0-rc.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "@types/jsesc": "^2.5.0", + "jsesc": "^3.0.2" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@nextcloud/dialogs/node_modules/@babel/generator/node_modules/@babel/parser": { + "version": "8.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0-rc.5.tgz", + "integrity": "sha512-/Mfg83rK3+jsRbl4Vbd0jqxc6M1A1/WNFtgrowRM1unEsD3XcNnrBdMM0JWakd0/RN9lseQKwPduW1TiEwKOlQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^8.0.0-rc.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@nextcloud/dialogs/node_modules/@babel/helper-string-parser": { + "version": "8.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0-rc.5.tgz", + "integrity": "sha512-sN7R8rBvDurfaziNfDEIjIntlazmlkCDGO4SNl2RJ3wRCn+QxspLV7hzYAE8WWVd2joVuT8sUxeePdLp2idI1A==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@nextcloud/dialogs/node_modules/@babel/helper-validator-identifier": { + "version": "8.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0-rc.5.tgz", + "integrity": "sha512-ehJDxHvtbZ85RtX/L2fi0h9AGsBNqB5Euv1EB8RMAvGYvD+2X+QbpzzOpbklnNXO+WSZJNOaetw2BBj27xsWVg==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@nextcloud/dialogs/node_modules/@babel/types": { + "version": "8.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0-rc.5.tgz", + "integrity": "sha512-JeSVu/m8x/zpp4CLjYHVNXuhEyOkhPXuxM8YOXjh6L4LlvQNKuUNOTo5KdBuKAcTDHw8DquToTaEkhsBqPXOaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.0-rc.5", + "@babel/helper-validator-identifier": "^8.0.0-rc.5" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, "node_modules/@nextcloud/dialogs/node_modules/@ckpack/vue-color": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@ckpack/vue-color/-/vue-color-1.6.0.tgz", @@ -3078,15 +3157,15 @@ } }, "node_modules/@nextcloud/dialogs/node_modules/@nextcloud/vue": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-9.5.0.tgz", - "integrity": "sha512-CQxBfHhF+Q+2r7RXd+l/eSjttJU8A2JFUyq5VpvjfpIql355kejc8bbNnM1pKgGRGSBuW9qw5Ohx0puzHge10w==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-9.8.0.tgz", + "integrity": "sha512-pEYtoVRavaI8EQv7pERfIs16MI11LqFW3+S01b5c54PMsfG+vqXtxR3I8Pyapf39sond6Sjg8Yx5cyBxQ2Y+2A==", "license": "AGPL-3.0-or-later", "dependencies": { "@ckpack/vue-color": "^1.6.0", - "@floating-ui/dom": "^1.7.5", - "@nextcloud/auth": "^2.5.3", - "@nextcloud/axios": "^2.5.2", + "@floating-ui/dom": "^1.7.6", + "@nextcloud/auth": "^2.6.0", + "@nextcloud/axios": "^2.6.0", "@nextcloud/browser-storage": "^0.5.0", "@nextcloud/capabilities": "^1.2.1", "@nextcloud/event-bus": "^3.3.3", @@ -3094,20 +3173,22 @@ "@nextcloud/l10n": "^3.4.1", "@nextcloud/logger": "^3.0.3", "@nextcloud/router": "^3.1.0", - "@nextcloud/sharing": "^0.3.0", + "@nextcloud/sharing": "^0.4.0", + "@nextcloud/vue-select": "^4.1.0", "@vuepic/vue-datepicker": "^11.0.3", - "@vueuse/components": "^14.2.0", - "@vueuse/core": "^14.0.0", + "@vueuse/components": "^14.3.0", + "@vueuse/core": "^14.3.0", "blurhash": "^2.0.5", "clone": "^2.1.2", "debounce": "^3.0.0", - "dompurify": "^3.3.1", + "dompurify": "^3.4.2", "emoji-mart-vue-fast": "^15.0.5", "escape-html": "^1.0.3", "floating-vue": "^5.2.2", - "focus-trap": "^8.0.0", + "focus-trap": "^8.1.0", "linkifyjs": "^4.3.2", - "p-queue": "^9.1.0", + "mdast-util-to-string": "^4.0.0", + "p-queue": "^9.2.0", "rehype-external-links": "^3.0.0", "rehype-highlight": "^7.0.2", "rehype-react": "^8.0.0", @@ -3122,52 +3203,24 @@ "ts-md5": "^2.0.1", "unified": "^11.0.5", "unist-builder": "^4.0.0", - "unist-util-visit": "^5.1.0", + "unist-util-visit-parents": "^6.0.2", "vue": "^3.5.18", - "vue-router": "^5.0.2", - "vue-select": "^4.0.0-beta.6" + "vue-router": "^5.0.6" }, "engines": { "node": "^20.11.0 || ^22 || ^24" } }, - "node_modules/@nextcloud/dialogs/node_modules/@nextcloud/vue/node_modules/@nextcloud/files": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-3.12.2.tgz", - "integrity": "sha512-vBo8tf3Xh6efiF8CrEo3pKj9AtvAF6RdDGO1XKL65IxV8+UUd9Uxl2lUExHlzoDRRczCqfGfaWfRRaFhYqce5Q==", - "license": "AGPL-3.0-or-later", - "optional": true, - "dependencies": { - "@nextcloud/auth": "^2.5.3", - "@nextcloud/capabilities": "^1.2.1", - "@nextcloud/l10n": "^3.4.1", - "@nextcloud/logger": "^3.0.3", - "@nextcloud/paths": "^3.0.0", - "@nextcloud/router": "^3.1.0", - "@nextcloud/sharing": "^0.3.0", - "cancelable-promise": "^4.3.1", - "is-svg": "^6.1.0", - "typescript-event-target": "^1.1.1", - "webdav": "^5.8.0" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || ^24.0.0" - } - }, - "node_modules/@nextcloud/dialogs/node_modules/@nextcloud/vue/node_modules/@nextcloud/sharing": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.3.0.tgz", - "integrity": "sha512-kV7qeUZvd1fTKeFyH+W5Qq5rNOqG9rLATZM3U9MBxWXHJs3OxMqYQb8UQ3NYONzsX3zDGJmdQECIGHm1ei2sCA==", - "license": "GPL-3.0-or-later", - "dependencies": { - "@nextcloud/initial-state": "^3.0.0", - "is-svg": "^6.1.0" - }, + "node_modules/@nextcloud/dialogs/node_modules/@nextcloud/vue-select": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@nextcloud/vue-select/-/vue-select-4.1.0.tgz", + "integrity": "sha512-jQIu4XuUAuJr6qL/IKa63h3Vv/4OrP9latl2E6kqtffwLBV+qMSU4Gm+vsOfyqBbBSY4i3eeMfdyJi14O1Yqbg==", + "license": "MIT", "engines": { - "node": "^20.0.0 || ^22.0.0 || ^24.0.0" + "node": "^22 || ^24" }, - "optionalDependencies": { - "@nextcloud/files": "^3.12.0" + "peerDependencies": { + "vue": "^3" } }, "node_modules/@nextcloud/dialogs/node_modules/@types/hast": { @@ -3191,45 +3244,81 @@ "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", "license": "MIT" }, + "node_modules/@nextcloud/dialogs/node_modules/@vue/compiler-core": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.34.tgz", + "integrity": "sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/shared": "3.5.34", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@nextcloud/dialogs/node_modules/@vue/compiler-dom": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.34.tgz", + "integrity": "sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.34", + "@vue/shared": "3.5.34" + } + }, "node_modules/@nextcloud/dialogs/node_modules/@vue/compiler-sfc": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.29.tgz", - "integrity": "sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.34.tgz", + "integrity": "sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@vue/compiler-core": "3.5.29", - "@vue/compiler-dom": "3.5.29", - "@vue/compiler-ssr": "3.5.29", - "@vue/shared": "3.5.29", + "@babel/parser": "^7.29.3", + "@vue/compiler-core": "3.5.34", + "@vue/compiler-dom": "3.5.34", + "@vue/compiler-ssr": "3.5.34", + "@vue/shared": "3.5.34", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", - "postcss": "^8.5.6", + "postcss": "^8.5.14", "source-map-js": "^1.2.1" } }, - "node_modules/@nextcloud/dialogs/node_modules/@vue/devtools-shared": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.6.tgz", - "integrity": "sha512-Pp1JylTqlgMJvxW6MGyfTF8vGvlBSCAvMFaDCYa82Mgw7TT5eE5kkHgDvmOGHWeJE4zIDfCpCxHapsK2LtIAJg==", + "node_modules/@nextcloud/dialogs/node_modules/@vue/compiler-ssr": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.34.tgz", + "integrity": "sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==", "license": "MIT", "dependencies": { - "rfdc": "^1.4.1" + "@vue/compiler-dom": "3.5.34", + "@vue/shared": "3.5.34" } }, + "node_modules/@nextcloud/dialogs/node_modules/@vue/devtools-shared": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.1.2.tgz", + "integrity": "sha512-X9RyVFYAdkBe4IUf5v48TxBF/6QPmF8CmWrDAjXzfUHrgQ/HGfTC1A6TqgXqZ03ye66l3AD51BAGD69IvKM9sw==", + "license": "MIT" + }, "node_modules/@nextcloud/dialogs/node_modules/@vue/server-renderer": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.29.tgz", - "integrity": "sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.34.tgz", + "integrity": "sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.29", - "@vue/shared": "3.5.29" + "@vue/compiler-ssr": "3.5.34", + "@vue/shared": "3.5.34" }, "peerDependencies": { - "vue": "3.5.29" + "vue": "3.5.34" } }, + "node_modules/@nextcloud/dialogs/node_modules/@vue/shared": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz", + "integrity": "sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==", + "license": "MIT" + }, "node_modules/@nextcloud/dialogs/node_modules/@vuepic/vue-datepicker": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-11.0.3.tgz", @@ -3246,27 +3335,27 @@ } }, "node_modules/@nextcloud/dialogs/node_modules/@vueuse/components": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-14.2.1.tgz", - "integrity": "sha512-wB0SvwJ22mNm1hWCMI1wTWz4x55nDTugT5RIg/KCwlWc1vITWL6ry5VTU3SQzsMD2XcazJK8Be1siIsrBb/Vcw==", + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-14.3.0.tgz", + "integrity": "sha512-jnrJrecSfa8H+G6wtAwsCnMtKbKZDSpu5JZDuulZikWrHb6uuS5SyXP6M2b79tofxipm78VWDSzW+58pu1yglA==", "license": "MIT", "dependencies": { - "@vueuse/core": "14.2.1", - "@vueuse/shared": "14.2.1" + "@vueuse/core": "14.3.0", + "@vueuse/shared": "14.3.0" }, "peerDependencies": { "vue": "^3.5.0" } }, "node_modules/@nextcloud/dialogs/node_modules/@vueuse/core": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.2.1.tgz", - "integrity": "sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==", + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.3.0.tgz", + "integrity": "sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==", "license": "MIT", "dependencies": { "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "14.2.1", - "@vueuse/shared": "14.2.1" + "@vueuse/metadata": "14.3.0", + "@vueuse/shared": "14.3.0" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -3276,18 +3365,18 @@ } }, "node_modules/@nextcloud/dialogs/node_modules/@vueuse/metadata": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.2.1.tgz", - "integrity": "sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw==", + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.3.0.tgz", + "integrity": "sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@nextcloud/dialogs/node_modules/@vueuse/shared": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.2.1.tgz", - "integrity": "sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw==", + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.3.0.tgz", + "integrity": "sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" @@ -3311,6 +3400,18 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@nextcloud/dialogs/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/@nextcloud/dialogs/node_modules/floating-vue": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/floating-vue/-/floating-vue-5.2.2.tgz", @@ -3340,21 +3441,21 @@ } }, "node_modules/@nextcloud/dialogs/node_modules/focus-trap": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-8.0.0.tgz", - "integrity": "sha512-Aa84FOGHs99vVwufDMdq2qgOwXPC2e9U66GcqBhn1/jEHPDhJaP8PYhkIbqG9lhfL5Kddk/567lj46LLHYCRUw==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-8.2.1.tgz", + "integrity": "sha512-6CxwrrFRquH7pDXb1mWxudkU9LSfYBMRZutpgddb2o6iwCk7cIRrBhyY3c8SGKcmIKdeMTrGSNg4Bedh2RSF/w==", "license": "MIT", "dependencies": { "tabbable": "^6.4.0" } }, "node_modules/@nextcloud/dialogs/node_modules/p-queue": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.0.tgz", - "integrity": "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.0.tgz", + "integrity": "sha512-7NED7xhQ74Ngp4JP/2e0VZHp7vSWfJfqeiR92jPgxsz6m0Se4P03YoTKa9dDXyZ3r6P616gUXttrB6nnHYKang==", "license": "MIT", "dependencies": { - "eventemitter3": "^5.0.1", + "eventemitter3": "^5.0.4", "p-timeout": "^7.0.0" }, "engines": { @@ -3495,16 +3596,16 @@ } }, "node_modules/@nextcloud/dialogs/node_modules/vue": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.29.tgz", - "integrity": "sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.34.tgz", + "integrity": "sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.29", - "@vue/compiler-sfc": "3.5.29", - "@vue/runtime-dom": "3.5.29", - "@vue/server-renderer": "3.5.29", - "@vue/shared": "3.5.29" + "@vue/compiler-dom": "3.5.34", + "@vue/compiler-sfc": "3.5.34", + "@vue/runtime-dom": "3.5.34", + "@vue/server-renderer": "3.5.34", + "@vue/shared": "3.5.34" }, "peerDependencies": { "typescript": "*" @@ -3525,14 +3626,14 @@ } }, "node_modules/@nextcloud/dialogs/node_modules/vue-router": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.0.3.tgz", - "integrity": "sha512-nG1c7aAFac7NYj8Hluo68WyWfc41xkEjaR0ViLHCa3oDvTQ/nIuLJlXJX1NUPw/DXzx/8+OKMng045HHQKQKWw==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.0.7.tgz", + "integrity": "sha512-dqfk8kvRbCutmCOCj/XLDqDEYxc1wBdAOGLuVy5M93ifYMsBd5fIjfaPN4tQAbxr5IprdBDIox1gr4wYyOx/SA==", "license": "MIT", "dependencies": { - "@babel/generator": "^7.28.6", + "@babel/generator": "^8.0.0-rc.4", "@vue-macros/common": "^3.1.1", - "@vue/devtools-api": "^8.0.6", + "@vue/devtools-api": "^8.1.1", "ast-walker-scope": "^0.8.3", "chokidar": "^5.0.0", "json5": "^2.2.3", @@ -3553,9 +3654,9 @@ }, "peerDependencies": { "@pinia/colada": ">=0.21.2", - "@vue/compiler-sfc": "^3.5.17", + "@vue/compiler-sfc": "^3.5.34", "pinia": "^3.0.4", - "vue": "^3.5.0" + "vue": "^3.5.34" }, "peerDependenciesMeta": { "@pinia/colada": { @@ -3570,36 +3671,24 @@ } }, "node_modules/@nextcloud/dialogs/node_modules/vue-router/node_modules/@vue/devtools-api": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.0.6.tgz", - "integrity": "sha512-+lGBI+WTvJmnU2FZqHhEB8J1DXcvNlDeEalz77iYgOdY1jTj1ipSBaKj3sRhYcy+kqA8v/BSuvOz1XJucfQmUA==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.2.tgz", + "integrity": "sha512-vA0O112YqyDuNA1s7Yb2gCgToQ/OxOWiFDO5ThLCcDy0ldHnSd1dUTaSYhOldbqoNgumE4dxtGAoAaSUKUD1Zg==", "license": "MIT", "dependencies": { - "@vue/devtools-kit": "^8.0.6" + "@vue/devtools-kit": "^8.1.2" } }, "node_modules/@nextcloud/dialogs/node_modules/vue-router/node_modules/@vue/devtools-kit": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.6.tgz", - "integrity": "sha512-9zXZPTJW72OteDXeSa5RVML3zWDCRcO5t77aJqSs228mdopYj5AiTpihozbsfFJ0IodfNs7pSgOGO3qfCuxDtw==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.1.2.tgz", + "integrity": "sha512-f75/upc+GCyjXErpgPGz4582ujS0L/adAltGy+tqXMGUJpgAcfGr6CxnnhpZY8BHuMYt6KpbF8uaFrrQG66rGQ==", "license": "MIT", "dependencies": { - "@vue/devtools-shared": "^8.0.6", + "@vue/devtools-shared": "^8.1.2", "birpc": "^2.6.1", "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^2.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" - } - }, - "node_modules/@nextcloud/dialogs/node_modules/vue-select": { - "version": "4.0.0-beta.6", - "resolved": "https://registry.npmjs.org/vue-select/-/vue-select-4.0.0-beta.6.tgz", - "integrity": "sha512-K+zrNBSpwMPhAxYLTCl56gaMrWZGgayoWCLqe5rWwkB8aUbAUh7u6sXjIR7v4ckp2WKC7zEEUY27g6h1MRsIHw==", - "license": "MIT", - "peerDependencies": { - "vue": "3.x" + "perfect-debounce": "^2.0.0" } }, "node_modules/@nextcloud/e2e-test-server": { @@ -3842,9 +3931,9 @@ } }, "node_modules/@nextcloud/paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nextcloud/paths/-/paths-3.0.0.tgz", - "integrity": "sha512-+sTfTkIbVUa2Ue3bkz3R7F1mhddvHPOWUxkSNg7Q5dAsimVFBaTRgiBAJmsAag3JPsxyuS8kUgeb0zdEssRdTA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@nextcloud/paths/-/paths-3.1.0.tgz", + "integrity": "sha512-vtFYA/kthaUDzu6KejTOL1OwnOy7/yynq5zdB/UBpYacAWjUX5Ddh4OMWx3rEavkBJ9/QGhrFryNJLjNfe8OQA==", "license": "GPL-3.0-or-later", "engines": { "node": "^20.0.0 || ^22.0.0 || ^24.0.0" @@ -3973,14 +4062,14 @@ } }, "node_modules/@nextcloud/vue": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-8.37.0.tgz", - "integrity": "sha512-RbK0cc5MKCxFRgTc2Do4xTiI/AwF3ngAi9uphF0A9kwrvXqDxkLNx3Lb+VNA2bfYTmXPyNXIw4IxAcV+1tZbZQ==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-8.39.0.tgz", + "integrity": "sha512-TJgrFeVr82CN8ng4y+IxMBb7mKlww7Fot22z33+Q0zKgWvi5EoQ0vYescA3Drl8cIRSGktUdFm3xO2gAqvnwoA==", "license": "AGPL-3.0-or-later", "dependencies": { "@floating-ui/dom": "^1.7.6", "@linusborg/vue-simple-portal": "^0.1.5", - "@nextcloud/auth": "^2.5.3", + "@nextcloud/auth": "^2.6.0", "@nextcloud/axios": "^2.5.2", "@nextcloud/browser-storage": "^0.5.0", "@nextcloud/capabilities": "^1.2.1", @@ -3996,13 +4085,14 @@ "blurhash": "^2.0.5", "clone": "^2.1.2", "debounce": "^2.2.0", - "dompurify": "^3.3.3", + "dompurify": "^3.4.2", "emoji-mart-vue-fast": "^15.0.5", "escape-html": "^1.0.3", "floating-vue": "^1.0.0-beta.19", "focus-trap": "^7.8.0", "linkify-string": "^4.3.2", "md5": "^2.3.0", + "mdast-util-to-string": "^4.0.0", "p-queue": "^8.1.1", "rehype-external-links": "^3.0.0", "rehype-highlight": "^7.0.2", @@ -4010,7 +4100,6 @@ "remark-breaks": "^4.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", - "remark-stringify": "^11.0.0", "remark-unlink-protocols": "^1.0.0", "splitpanes": "^2.4.1", "string-length": "^5.0.1", @@ -4019,7 +4108,7 @@ "tributejs": "^5.1.3", "unified": "^11.0.1", "unist-builder": "^4.0.0", - "unist-util-visit": "^5.1.0", + "unist-util-visit-parents": "^6.0.2", "vue": "^2.7.16", "vue-color": "^2.8.1", "vue-frag": "^1.4.3", @@ -4227,13 +4316,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", - "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.1.tgz", + "integrity": "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.59.1" + "playwright": "1.61.1" }, "bin": { "playwright": "cli.js" @@ -4257,28 +4346,27 @@ "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@protobufjs/aspromise": "^1.1.1" } }, "node_modules/@protobufjs/float": { @@ -4288,13 +4376,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", @@ -4310,9 +4391,9 @@ "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", "dev": true, "license": "BSD-3-Clause" }, @@ -4719,12 +4800,15 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", - "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -5037,48 +5121,48 @@ "license": "MIT" }, "node_modules/@tiptap/core": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.23.1.tgz", - "integrity": "sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.27.1.tgz", + "integrity": "sha512-rV6Qn4wmC6BxfF+4mu6bqGWj9vA4oXXhsrpXaJL2uhjxeHAGofjwcHof2X84VYzeyXgdlsGmqKie4TAppVXZUQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/pm": "3.23.1" + "@tiptap/pm": "3.27.1" } }, "node_modules/@tiptap/extension-blockquote": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.23.1.tgz", - "integrity": "sha512-FdVZLZOkL06j3WLXOC2UeX7++Cj3qI2vfohruMJiz4vk1Q5UUH7G4+AykFzjzBJHrdEpkiRUkRpU1KZIWdbluw==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.27.1.tgz", + "integrity": "sha512-VMF7xJx6qEGiX6DTKNiL31NLqypOcd/4sNjFSe8rb41PwejBJh/nOqVIbBvWkiT6NMGFLxMhj7zJ8/zPo1hXeg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1" + "@tiptap/core": "3.27.1" } }, "node_modules/@tiptap/extension-bold": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.23.1.tgz", - "integrity": "sha512-EAYdNzyOjlQh2VBY1EhdxtiTjVMaOAD6P0ezms60dKRjd4oj/8grfXfUqwgo4NVdFb11Ks85vXoHuXJSylfR4A==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.27.1.tgz", + "integrity": "sha512-TlC5bsS+pqETTrlz4CZz9RO/cKBYtELGIxwtKeivUn3eNfnOxQbbu4WDsiwIfzRFyd0OMnKl6BPM2KnYEehoEQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1" + "@tiptap/core": "3.27.1" } }, "node_modules/@tiptap/extension-bubble-menu": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.23.1.tgz", - "integrity": "sha512-1advMCpPkHD/3ucZhYmNau8B4tF0L6iRAFhUOglp5bBZDuq13+rYujh3cm4vFmjH9KqThzpcUDn+ZU2c+mTMyw==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.27.1.tgz", + "integrity": "sha512-j/j8Qp9Z5nViade2m7zjrO/CYH/Ca80Qj7aqo0eUaei6FZQ5izlF9o4XQU5EFMAutV6mwynsPUp8FVo5sCuYfw==", "license": "MIT", "optional": true, "dependencies": { @@ -5089,93 +5173,93 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1", - "@tiptap/pm": "3.23.1" + "@tiptap/core": "3.27.1", + "@tiptap/pm": "3.27.1" } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.23.1.tgz", - "integrity": "sha512-owWnBBI4t+jqVDY0naDjhsAmrNGldh4czouef2K+mEf032B7uGsDVCwKp1qaX1JZesyYDfvXOaIwT22hNID2mw==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.27.1.tgz", + "integrity": "sha512-faCUHnRP47o9Zh9VZZX6EX/569udw9Vopm2PgEKPWuKLE2qaS5WBuUVU0iItdJmKUqaWiOZkpoW4jvnDmj0dfg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "3.23.1" + "@tiptap/extension-list": "3.27.1" } }, "node_modules/@tiptap/extension-character-count": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-character-count/-/extension-character-count-3.23.1.tgz", - "integrity": "sha512-BgXql4+Z+0KF1U1uW27zAygJXuNqDIjKv1Qx6svzSQ5n3TG04sAEGU8q3tyAGfkDxZHvZlZ7TQKPA+6bvDFnsA==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-character-count/-/extension-character-count-3.27.1.tgz", + "integrity": "sha512-rzZUyAh+fCVIYRB2ZXsLGweevUGZ/Xsi6snGCXbsFAX71+BZJ2rr0hKOoIKqSiW8q20+AY73rTbTT/G7bZqdGg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "3.23.1" + "@tiptap/extensions": "3.27.1" } }, "node_modules/@tiptap/extension-code": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.23.1.tgz", - "integrity": "sha512-nGuhb4YghgTfkejwWHrD9GSpwcC5kkVmm2sN/UY4yceDw+PkyysYKJWZehRLTOC8GNgSAhq/EeQeq14Xwk6dyg==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.27.1.tgz", + "integrity": "sha512-epOUpFfEmBzjvnqvjv2qHX7NAuLo5dlOGV690lWu+sAYMjibuJBeVvAiKPyFCfRCCTUxdbDB3jbaOA1yEcEJ7w==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1" + "@tiptap/core": "3.27.1" } }, "node_modules/@tiptap/extension-code-block": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.23.1.tgz", - "integrity": "sha512-BdJGqM57CsKgYrQUZz78vIG8Yn7EpsE2pA7iKn5tYoSXpYtt0IaU4qB1heH7lwWD/vVCAm0YQVD7/0F+0++yhA==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.27.1.tgz", + "integrity": "sha512-pHlzmZx2OlHfyQ0yRlT5UL4mGokz947DthZuYefN1OleVqOkHpWBG+2JQwqoNq6bmzMne92zbH32rhcJUEYSjA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1", - "@tiptap/pm": "3.23.1" + "@tiptap/core": "3.27.1", + "@tiptap/pm": "3.27.1" } }, "node_modules/@tiptap/extension-document": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.23.1.tgz", - "integrity": "sha512-NA5Rx59HRwG6Hb6LwLpC5lE7z6vCj6f90S7RNNsnE+CyiXNR/OhY2BcjuxiGnascHvsnsAbvxGU3ymKMDgvDVg==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.27.1.tgz", + "integrity": "sha512-8FbBTkfnRP4iVaoj+2h3iWa+H0eGDD3yTyVCwrmue/sQTkqUNUoSuAZa3GDG4Sd41xdPwTJxl9nUWGgM1qDCnw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1" + "@tiptap/core": "3.27.1" } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.23.1.tgz", - "integrity": "sha512-WRN7e/h9m3uI5j9/+L6jcPhHbTL6aKxfFfQWZHNf5M8TqSL1P+/2h034td0XMj3n48i4fWyzjVUV9+sz6t2fDw==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.27.1.tgz", + "integrity": "sha512-blFf9x9RG0Qr7P3FoAH/033ffa+mMLZn34trVs8Vi0Ppk6FmJAg5HpYFOtmYoeREdNDJ5rHJKV7SoACbOHgskQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "3.23.1" + "@tiptap/extensions": "3.27.1" } }, "node_modules/@tiptap/extension-floating-menu": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.23.1.tgz", - "integrity": "sha512-XrYHpLn1DpLFSGTko9F9xgbNamL6fGpWkK4wqgwPVbg/SJwQCDO/9p5D3DtJTwD+xgw4sQ9as4O6rt6jx8JT+Q==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.27.1.tgz", + "integrity": "sha512-BmJF1VqB7dSJkgAalrpVFj88WLhxKjcWPuWHOqf2ITrUU2832BhKLXKmxjWUy1gqV8PfNNVWtGfIERy7I0y0+Q==", "license": "MIT", "optional": true, "funding": { @@ -5184,242 +5268,242 @@ }, "peerDependencies": { "@floating-ui/dom": "^1.0.0", - "@tiptap/core": "3.23.1", - "@tiptap/pm": "3.23.1" + "@tiptap/core": "3.27.1", + "@tiptap/pm": "3.27.1" } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.23.1.tgz", - "integrity": "sha512-E4hB0xquUpEXy7kboLBazrFyRCsN0j0fsTFR8udgQf5xetAVPhOexSTKuzOcU/n0kxsKJin7laYYEag/Fd2KNw==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.27.1.tgz", + "integrity": "sha512-QoezN0wdvXIwLQ4ee2ccWDaX3RG0lzgQpIMpMz55oPDhpUVax1+19ApsS53LkcktpS4EbnPL4xO4DaJk0Vp7PQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "3.23.1" + "@tiptap/extensions": "3.27.1" } }, "node_modules/@tiptap/extension-hard-break": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.23.1.tgz", - "integrity": "sha512-XYkCKC5RVqMmmBk+nd22/6IDDx1OC54sdStH5VEHtfOrarriO0JztK8Mr0TijPPk9N4rKXsmndYZM2xyWZZytQ==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.27.1.tgz", + "integrity": "sha512-iv/m9hzl6jfSj9Q8UEjAxONvCoUDaP7M9SRCPx3PaLNxA230TTD6RE0Ye4zFJ8ze7ZVoJJMAqg9Qpq1iYg2JOQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1" + "@tiptap/core": "3.27.1" } }, "node_modules/@tiptap/extension-heading": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.23.1.tgz", - "integrity": "sha512-1z9yCSp8fevgX3r/4kWXO3of0WFCQWfYjWfHANvoJ4JQTYBkARjXlj1tbk5rrAJBFDDfKRkUpZOurXKgGo+h+g==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.27.1.tgz", + "integrity": "sha512-SrC4l1kEIyv9ZXFaI/8LQqU2MyMmjczw7XXsWUQOTN4YXv0JyVgMNR3cI/wz0d2xsTfBdZ1N85Tdng+Ga1t0Sg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1" + "@tiptap/core": "3.27.1" } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.23.1.tgz", - "integrity": "sha512-30XUHXdEZxcz1FCWjz9HW2EEq06NQcAye6rXGnvHo6Y60iJ6MRsrX5byvceFNF9DTVtOIcUFBQ/psIiRcoi0KA==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.27.1.tgz", + "integrity": "sha512-QlKE7qn5qMnIGVGhXQlvYedvLtNJ9z0dmit5w8vPb8tKzW4Spk6M7N2kruprrDA8GBwHfeR5wmF+njfUm34qxg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1", - "@tiptap/pm": "3.23.1" + "@tiptap/core": "3.27.1", + "@tiptap/pm": "3.27.1" } }, "node_modules/@tiptap/extension-italic": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.23.1.tgz", - "integrity": "sha512-lZB9YCjoVNDoPMguya66nBvaS/2YpGN5iAcjAGx/JQkCAZeOAtl9+ALMzbWPKH6tQP6m98YtkY1T7RXr++T0bA==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.27.1.tgz", + "integrity": "sha512-jGGeyn9uRUnNjSTHpbqhiGsp6KaYTSbV09jDXPJI9cDwfV9hpugLvpaCZd0BMBbhU1B1W6kOfX0BE15qX/HQfA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1" + "@tiptap/core": "3.27.1" } }, "node_modules/@tiptap/extension-link": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.23.1.tgz", - "integrity": "sha512-uOeyLqYQI0WG62agpFG24kVHSn3Z48gD8Y0uLLJbtzh/nDFC3d9So2sQGWlSVyMzsgkJ4k/9jNnxxsVO8qgJOg==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.27.1.tgz", + "integrity": "sha512-/2jBfsxBZUDGJmpZifqRQPz7f1E5qpS1BckTZ39TADzUJX+feKy7RJ3DtQ02+8y6SSMzvP9loGVjrk6zEMTk4g==", "license": "MIT", "dependencies": { - "linkifyjs": "^4.3.2" + "linkifyjs": "^4.3.3" }, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1", - "@tiptap/pm": "3.23.1" + "@tiptap/core": "3.27.1", + "@tiptap/pm": "3.27.1" } }, "node_modules/@tiptap/extension-list": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.23.1.tgz", - "integrity": "sha512-v1AeXPpagslgRZdOp7WdjCoO4TjjNP8RM2R6Gqx0/inGaNXnM8zCMshOxZlAb03Ad7kq/4RGJmkpM/Jjsi6dEQ==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.27.1.tgz", + "integrity": "sha512-c2Upru7lj0/ZV/Ibww6cNz6sUS8m6Dp/9uygFhYcZOd3X8M0xBIEk42c6m6SQehkPziVA8QOgNJz7sMqsbz1OQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1", - "@tiptap/pm": "3.23.1" + "@tiptap/core": "3.27.1", + "@tiptap/pm": "3.27.1" } }, "node_modules/@tiptap/extension-list-item": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.23.1.tgz", - "integrity": "sha512-Fk/884un5OSLCFxe2TbOmfp3sLMB5b76CnMjaSrvgfiaZnsV2WlJZGPXxCAPbxNIATTykNlSBsVuMBO7we64Vg==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.27.1.tgz", + "integrity": "sha512-zwRl01ETfCkWUvtvK5fw9bXtAajMPkvlkE3Cq6JvH3LF7XXJwDtNj5Tj7exacMpCaSZmlNc43vFb2rAYnrnwMA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "3.23.1" + "@tiptap/extension-list": "3.27.1" } }, "node_modules/@tiptap/extension-list-keymap": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.23.1.tgz", - "integrity": "sha512-sHbE5sxiJzhgGn94GUAzD4qKM9SyImBrOlAGS/EIe+pausjqQE7xi+YW0gRo2jG+gXhSYl4/oAGXQXzmSInSUQ==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.27.1.tgz", + "integrity": "sha512-OIMZNlzPSO8WRd4ic73Fxckzl4N1tesjjLL2XApaNA/uMpO0LoF6WSRPAWv+Z24Wp92ARRJAnRP7iZoI5+Jxig==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "3.23.1" + "@tiptap/extension-list": "3.27.1" } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.23.1.tgz", - "integrity": "sha512-3GG7YFhVJWw/HWmRxvMMUC296x7TPBQRLsH4ryEC1SMAmVJnbTIvetyvIcLqLEXGW7Rj41S7SO8qjOXVceSOTA==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.27.1.tgz", + "integrity": "sha512-GYrKqD//9nHJ2r80uXqbDMzRnFpGzbaEQRTSGaO/SH7DvXWFMow8evkOdjQ7PCQO07jNjJo75+A85Jwu3Ov3AA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "3.23.1" + "@tiptap/extension-list": "3.27.1" } }, "node_modules/@tiptap/extension-paragraph": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.23.1.tgz", - "integrity": "sha512-GC7b6yAjASl1q9sNkPmukZmVYMfxx03EEhpMMrLYJY9GBz82Ald927yYQsOqf2aKA/Rjo/aZMYCGtjXkGk6aBA==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.27.1.tgz", + "integrity": "sha512-7K7eo1gruOgAsnbK+GCV23AUVUI0cL1bTig8HaPneoFMVbig7vddk8jNLKBWO8TXVbG7TuHdnDN4F98vdtwh5Q==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1" + "@tiptap/core": "3.27.1" } }, "node_modules/@tiptap/extension-strike": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.23.1.tgz", - "integrity": "sha512-+R5LG0ZW9SDZc4weA79uq6uUduVsCEph9tRcoQCRA82IVIiPYSTxTLew9odalmk/Mc7vdZvOK5jjtO5jUVw/rg==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.27.1.tgz", + "integrity": "sha512-Y3DW1jlSlCNCyMGHP3+3qBNNPS83wuFz4RTYGjZtvRRTCRh7apZme9XRWMq1rN5mJ2Cr7fKocA2/5Bs13KgN6Q==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1" + "@tiptap/core": "3.27.1" } }, "node_modules/@tiptap/extension-task-item": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-task-item/-/extension-task-item-3.23.1.tgz", - "integrity": "sha512-6g1vwOlKasbm3XxWLHmOIF6ghKbpU02dmG/uFah0xcEcfcb5e+JSb7PCWyxnp8bpLntGRSv2/kmDj/ptE9UJiQ==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-task-item/-/extension-task-item-3.27.1.tgz", + "integrity": "sha512-HxS85Xqlf9voWpqW6yJNExjnqy9AcQbvL7K41gzKUIaXZdNxAyEkUg7wve7WAd7AUPI9yrS9WONplhmq7pWuJw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "3.23.1" + "@tiptap/extension-list": "3.27.1" } }, "node_modules/@tiptap/extension-task-list": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-task-list/-/extension-task-list-3.23.1.tgz", - "integrity": "sha512-/xn49drozPBtuavlggiu+8lJG/gWdTol1T3QlK16W+P1tbSic/7xk9m+AAQcnlcBTXPq9BuCs9nIcgEYkX6e1w==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-task-list/-/extension-task-list-3.27.1.tgz", + "integrity": "sha512-5LaJU3q/O6S1aNe9uj/VbZ7uS8G9mJMvJGNm/wRGyR3HcZtHAcFsPh9+woylQvUThD0qO9OMeGXkgqRSE+ayuA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "3.23.1" + "@tiptap/extension-list": "3.27.1" } }, "node_modules/@tiptap/extension-text": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.23.1.tgz", - "integrity": "sha512-k1Ki9bBV6mLz1mFP+Laqh1YHJ2MY0P8XzaMqpkgMndEBIJQ3XcpWQc5bfAlRnYcOI9ZXDbAgQ8CwgArxHmQWCQ==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.27.1.tgz", + "integrity": "sha512-6ZwaZwSrDh+KFFv6V1J79oO37yPs7y1bFxvk1/9Ih2rn3Xr5AWz+eMS+n8RpH3djBVVAQpdIAeYQgcn+VCSsTg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1" + "@tiptap/core": "3.27.1" } }, "node_modules/@tiptap/extension-underline": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.23.1.tgz", - "integrity": "sha512-+PvHyVozHyxJ9oWCIQx5JHBZ7LAa/sFJUOFaKyfmel4gL9AbP52MmvrciXARlZHd1WCULJtdbLan0+x5/D/9hQ==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.27.1.tgz", + "integrity": "sha512-N889J4nXN/TPfVt8uF9N1A0SY82E90zwc1y26lqOcw6KWNLmQrlhMh/9OD4ikLDbekmFpOBq/UicpHf/6S8hbQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1" + "@tiptap/core": "3.27.1" } }, "node_modules/@tiptap/extensions": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.23.1.tgz", - "integrity": "sha512-7UIn+idaVTVhdlP0KmgzBh8Csmwck357Dq4te5DuAxhSkN1gsXHlq39mpx907UYKJdSOgd+GMFeyOziPwSmbOQ==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.27.1.tgz", + "integrity": "sha512-1Tdx9faw8k0/83V6X+xCDVhV8yElGt95JxeW3YMkKQJI56QdlPz0xOdJPlMiSGJKinPyVier+x9LJD/YZUZIaw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.23.1", - "@tiptap/pm": "3.23.1" + "@tiptap/core": "3.27.1", + "@tiptap/pm": "3.27.1" } }, "node_modules/@tiptap/pm": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.23.1.tgz", - "integrity": "sha512-8G+TkNsUHHAAJYREpA6fw+Dw/m2Y3Go4/QMQM8RYepid+wTeE1wSv7sBA/CBrphhYmJSWeTyCPtgQIxnTJXMCA==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.27.1.tgz", + "integrity": "sha512-Ffjx+vimmBU7zH/KrpXzJid3+pziCe/VL2aexSTP63cyQwKQ65LkFkCKaIsSpFdQQuakVZBGWjCA5RoBV852pw==", "license": "MIT", "dependencies": { "prosemirror-changeset": "^2.3.0", @@ -5427,13 +5511,14 @@ "prosemirror-dropcursor": "^1.8.1", "prosemirror-gapcursor": "^1.3.2", "prosemirror-history": "^1.4.1", - "prosemirror-keymap": "^1.2.2", - "prosemirror-model": "^1.24.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.7", "prosemirror-schema-list": "^1.5.0", - "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.6.4", - "prosemirror-transform": "^1.10.2", - "prosemirror-view": "^1.38.1" + "prosemirror-state": "^1.4.4", + "prosemirror-tables": "^1.8.0", + "prosemirror-transform": "^1.12.0", + "prosemirror-view": "^1.41.8" }, "funding": { "type": "github", @@ -5441,35 +5526,35 @@ } }, "node_modules/@tiptap/starter-kit": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.23.1.tgz", - "integrity": "sha512-CURePHQagBaZIDJrHH3of4Nmi0VYGpZ6yBlkdFxFHBxY9aeG2/h5kn+oHo8GbzkSFsRV+9olzRgDTOULVgs8pQ==", - "license": "MIT", - "dependencies": { - "@tiptap/core": "^3.23.1", - "@tiptap/extension-blockquote": "^3.23.1", - "@tiptap/extension-bold": "^3.23.1", - "@tiptap/extension-bullet-list": "^3.23.1", - "@tiptap/extension-code": "^3.23.1", - "@tiptap/extension-code-block": "^3.23.1", - "@tiptap/extension-document": "^3.23.1", - "@tiptap/extension-dropcursor": "^3.23.1", - "@tiptap/extension-gapcursor": "^3.23.1", - "@tiptap/extension-hard-break": "^3.23.1", - "@tiptap/extension-heading": "^3.23.1", - "@tiptap/extension-horizontal-rule": "^3.23.1", - "@tiptap/extension-italic": "^3.23.1", - "@tiptap/extension-link": "^3.23.1", - "@tiptap/extension-list": "^3.23.1", - "@tiptap/extension-list-item": "^3.23.1", - "@tiptap/extension-list-keymap": "^3.23.1", - "@tiptap/extension-ordered-list": "^3.23.1", - "@tiptap/extension-paragraph": "^3.23.1", - "@tiptap/extension-strike": "^3.23.1", - "@tiptap/extension-text": "^3.23.1", - "@tiptap/extension-underline": "^3.23.1", - "@tiptap/extensions": "^3.23.1", - "@tiptap/pm": "^3.23.1" + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.27.1.tgz", + "integrity": "sha512-vfxRsqW8rCc0k4pzo0ilU3wobVi2wqVj88VZI2SlgZlNnUAkrDGDIAph7CTa9k9fshV+O1ivpEgPC5yC046jow==", + "license": "MIT", + "dependencies": { + "@tiptap/core": "^3.27.1", + "@tiptap/extension-blockquote": "^3.27.1", + "@tiptap/extension-bold": "^3.27.1", + "@tiptap/extension-bullet-list": "^3.27.1", + "@tiptap/extension-code": "^3.27.1", + "@tiptap/extension-code-block": "^3.27.1", + "@tiptap/extension-document": "^3.27.1", + "@tiptap/extension-dropcursor": "^3.27.1", + "@tiptap/extension-gapcursor": "^3.27.1", + "@tiptap/extension-hard-break": "^3.27.1", + "@tiptap/extension-heading": "^3.27.1", + "@tiptap/extension-horizontal-rule": "^3.27.1", + "@tiptap/extension-italic": "^3.27.1", + "@tiptap/extension-link": "^3.27.1", + "@tiptap/extension-list": "^3.27.1", + "@tiptap/extension-list-item": "^3.27.1", + "@tiptap/extension-list-keymap": "^3.27.1", + "@tiptap/extension-ordered-list": "^3.27.1", + "@tiptap/extension-paragraph": "^3.27.1", + "@tiptap/extension-strike": "^3.27.1", + "@tiptap/extension-text": "^3.27.1", + "@tiptap/extension-underline": "^3.27.1", + "@tiptap/extensions": "^3.27.1", + "@tiptap/pm": "^3.27.1" }, "funding": { "type": "github", @@ -5477,9 +5562,9 @@ } }, "node_modules/@tiptap/vue-2": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@tiptap/vue-2/-/vue-2-3.23.1.tgz", - "integrity": "sha512-HMTbh+h9UFyLk0N5A+woVjeLLFt2ZBgDJ2Fz1E6QLAUVOhhmu1GMLAxRKJYcgUHn5STTeN999g0GEO0XLWiKJQ==", + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@tiptap/vue-2/-/vue-2-3.27.1.tgz", + "integrity": "sha512-biDPcNrCoNHOnkDp6z1J1kNx2HK5dB6kGuphn4vwPJ/otqY3mONyEHlQ6GUxcDQxWqQxjROUzIEsbjTCMAoMQA==", "license": "MIT", "dependencies": { "vue-ts-types": "1.6.2" @@ -5489,12 +5574,12 @@ "url": "https://github.com/sponsors/ueberdosis" }, "optionalDependencies": { - "@tiptap/extension-bubble-menu": "^3.23.1", - "@tiptap/extension-floating-menu": "^3.23.1" + "@tiptap/extension-bubble-menu": "^3.27.1", + "@tiptap/extension-floating-menu": "^3.27.1" }, "peerDependencies": { - "@tiptap/core": "3.23.1", - "@tiptap/pm": "3.23.1", + "@tiptap/core": "3.27.1", + "@tiptap/pm": "3.27.1", "vue": "^2.6.0" } }, @@ -5556,6 +5641,12 @@ "@types/sizzle": "*" } }, + "node_modules/@types/jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==", + "license": "MIT" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -5658,17 +5749,6 @@ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz", @@ -6171,36 +6251,54 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.29.tgz", - "integrity": "sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.34.tgz", + "integrity": "sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.29" + "@vue/shared": "3.5.34" } }, + "node_modules/@vue/reactivity/node_modules/@vue/shared": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz", + "integrity": "sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==", + "license": "MIT" + }, "node_modules/@vue/runtime-core": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.29.tgz", - "integrity": "sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.34.tgz", + "integrity": "sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.29", - "@vue/shared": "3.5.29" + "@vue/reactivity": "3.5.34", + "@vue/shared": "3.5.34" } }, + "node_modules/@vue/runtime-core/node_modules/@vue/shared": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz", + "integrity": "sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==", + "license": "MIT" + }, "node_modules/@vue/runtime-dom": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.29.tgz", - "integrity": "sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.34.tgz", + "integrity": "sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.29", - "@vue/runtime-core": "3.5.29", - "@vue/shared": "3.5.29", + "@vue/reactivity": "3.5.34", + "@vue/runtime-core": "3.5.34", + "@vue/shared": "3.5.34", "csstype": "^3.2.3" } }, + "node_modules/@vue/runtime-dom/node_modules/@vue/shared": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz", + "integrity": "sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==", + "license": "MIT" + }, "node_modules/@vue/shared": { "version": "3.5.29", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.29.tgz", @@ -6529,6 +6627,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "peer": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -6851,16 +6950,42 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", - "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", + "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.11", + "follow-redirects": "^1.16.0", "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, + "node_modules/axios/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", @@ -6970,6 +7095,7 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -7047,6 +7173,7 @@ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -7127,13 +7254,13 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", - "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.6.tgz", + "integrity": "sha512-sd+Q65fjlWCYWtZKXiKfrUc8d+4jtp/8f0W2NkwzLtoW4bI6UDnWusLWIurHnmurW0XShIRxpwiOX4EoPtXUAg==", "dev": true, "license": "ISC", "dependencies": { - "bn.js": "^5.2.2", + "bn.js": "^5.2.3", "browserify-rsa": "^4.1.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", @@ -7281,16 +7408,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -7592,6 +7709,7 @@ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -7906,21 +8024,6 @@ "dev": true, "license": "MIT" }, - "node_modules/copy-anything": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", - "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", - "license": "MIT", - "dependencies": { - "is-what": "^5.2.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, "node_modules/core-js": { "version": "3.37.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", @@ -8175,14 +8278,14 @@ "license": "MIT" }, "node_modules/cypress": { - "version": "15.14.2", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.14.2.tgz", - "integrity": "sha512-xMWg/iEImeIThRQZdnf3BFJT1a84apM/R91Feoa4vVWGuYWDphMT5jLhRVTBVlCgi+6axegF1zqhNyjhug2SsQ==", + "version": "15.18.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.18.0.tgz", + "integrity": "sha512-aLfOYSLlVt1b6QSoVUjbCY27taZlYAT8ST47xQbwd9pvQrY/g5gXi12yItZTB+kxkkj+ZcvUYmRLUC95SlCJsw==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { - "@cypress/request": "^3.0.10", + "@cypress/request": "^4.0.0", "@cypress/xvfb": "^1.2.4", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", @@ -8202,7 +8305,6 @@ "eventemitter2": "6.4.7", "execa": "4.1.0", "executable": "^4.1.1", - "extract-zip": "2.0.1", "fs-extra": "^9.1.0", "hasha": "5.2.2", "is-installed-globally": "~0.4.0", @@ -8221,7 +8323,7 @@ "tree-kill": "1.2.2", "tslib": "1.14.1", "untildify": "^4.0.0", - "yauzl": "^2.10.0" + "yauzl": "^3.3.1" }, "bin": { "cypress": "bin/cypress" @@ -8257,17 +8359,15 @@ } }, "node_modules/cypress-vite": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/cypress-vite/-/cypress-vite-1.8.0.tgz", - "integrity": "sha512-rPkIpDzCIo+upsDkFa/NlrnzVumuQ45UcwL7a2k/n8WFIwsW8QYuQaWU2JiIKExP/LNQew3H3Hbs/bp26xC0Fw==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/cypress-vite/-/cypress-vite-1.10.2.tgz", + "integrity": "sha512-tmCH7riwzprnl5M21ZXfU4jzBY7XBFHLBOAZA7B+SXSYOHmMbNPFrt+Y45EzlW8DVQCTVWs/dH76zx3WXvCZAA==", "dev": true, "license": "MIT", - "dependencies": { - "chokidar": "^3.5.3", - "debug": "^4.3.4" - }, "peerDependencies": { - "vite": "^2.9.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + "chokidar": "^2 || ^3 || ^4 || ^5", + "debug": "^2 || ^3 || ^4", + "vite": "^2.9 || ^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "node_modules/cypress/node_modules/proxy-from-env": { @@ -8623,9 +8723,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.1.tgz", - "integrity": "sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.11.tgz", + "integrity": "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -8918,9 +9018,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -8931,31 +9031,49 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/escalade": { @@ -9698,9 +9816,9 @@ "license": "MIT" }, "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, "node_modules/events": { @@ -9772,27 +9890,6 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -9842,9 +9939,9 @@ "peer": true }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, "funding": [ { @@ -9859,9 +9956,9 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-builder": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.5.tgz", - "integrity": "sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", "funding": [ { "type": "github", @@ -9870,13 +9967,14 @@ ], "license": "MIT", "dependencies": { - "path-expression-matcher": "^1.1.3" + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" } }, "node_modules/fast-xml-parser": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.6.tgz", - "integrity": "sha512-Yd4vkROfJf8AuJrDIVMVmYfULKmIJszVsMv7Vo71aocsKgFxpdlpSHXSaInvyYfgw2PRuObQSW2GFpVMUjxu9A==", + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.7.tgz", + "integrity": "sha512-a6Qh1RMCNbSrU1+sAyAAZH3rTe+OaWJbNZIq0S+ifZciUUOQtlVxBJwoTUE2bYhysmG/RYyI5WJFIKdBahJdrQ==", "dev": true, "funding": [ { @@ -9913,16 +10011,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -9965,6 +10053,7 @@ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -10092,16 +10181,16 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -10355,6 +10444,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "peer": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -10634,9 +10724,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -11181,6 +11271,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "peer": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -11310,6 +11401,7 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -11347,6 +11439,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "peer": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -11417,6 +11510,7 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.12.0" } @@ -11599,18 +11693,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-what": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", - "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -11648,9 +11730,9 @@ "license": "MIT" }, "node_modules/joi": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-18.1.2.tgz", - "integrity": "sha512-rF5MAmps5esSlhCA+N1b6IYHDw9j/btzGaqfgie522jS02Ju/HXBxamlXVlKEHAxoMKQL77HWI8jlqWsFuekZA==", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-18.2.1.tgz", + "integrity": "sha512-2/OKlogiESf2Nh3TFCrRjrr9z1DRHeW0I+KReF67+4J0Ns+8hBtHRmoWAZ2OFU6I5+TWLEe6sVlSdXPjHm5UbQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -11684,10 +11766,20 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -11872,9 +11964,9 @@ } }, "node_modules/linkifyjs": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.2.tgz", - "integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.3.tgz", + "integrity": "sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg==", "license": "MIT" }, "node_modules/listr2": { @@ -12218,9 +12310,9 @@ } }, "node_modules/long": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", - "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "dev": true, "license": "Apache-2.0" }, @@ -13284,12 +13376,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -13355,15 +13441,16 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -13479,6 +13566,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -14011,10 +14099,12 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", + "peer": true, "engines": { "node": ">=8.6" }, @@ -14105,13 +14195,13 @@ } }, "node_modules/playwright": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", - "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", + "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.59.1" + "playwright-core": "1.61.1" }, "bin": { "playwright": "cli.js" @@ -14124,9 +14214,9 @@ } }, "node_modules/playwright-core": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", - "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", + "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -14172,9 +14262,9 @@ } }, "node_modules/postcss": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", - "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "funding": [ { "type": "opencollective", @@ -14191,7 +14281,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -14419,19 +14509,30 @@ "rope-sequence": "^1.3.0" } }, + "node_modules/prosemirror-inputrules": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz", + "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, "node_modules/prosemirror-keymap": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz", - "integrity": "sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", + "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", + "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0", "w3c-keyname": "^2.2.0" } }, "node_modules/prosemirror-model": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.24.1.tgz", - "integrity": "sha512-YM053N+vTThzlWJ/AtPtF1j0ebO36nvbmDy4U7qA2XQB8JVaQp1FmB9Jhrps8s+z+uxhhVTny4m20ptUvhk0Mg==", + "version": "1.25.7", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.7.tgz", + "integrity": "sha512-A79aN8QEFUwI6cax8Yq4Rpcx1TJZ3Kagn+ii7qLo4/V8H3mMiHrhFyhTyHHvpSnOgMPpWiDGSwM3etwrxE50ug==", "license": "MIT", "dependencies": { "orderedmap": "^2.0.0" @@ -14449,9 +14550,10 @@ } }, "node_modules/prosemirror-state": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", - "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", + "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", + "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-transform": "^1.0.0", @@ -14459,31 +14561,31 @@ } }, "node_modules/prosemirror-tables": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.6.4.tgz", - "integrity": "sha512-TkDY3Gw52gRFRfRn2f4wJv5WOgAOXLJA2CQJYIJ5+kdFbfj3acR4JUW6LX2e1hiEBiUwvEhzH5a3cZ5YSztpIA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz", + "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", "license": "MIT", "dependencies": { - "prosemirror-keymap": "^1.2.2", - "prosemirror-model": "^1.24.1", - "prosemirror-state": "^1.4.3", - "prosemirror-transform": "^1.10.2", - "prosemirror-view": "^1.37.2" + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.4", + "prosemirror-state": "^1.4.4", + "prosemirror-transform": "^1.10.5", + "prosemirror-view": "^1.41.4" } }, "node_modules/prosemirror-transform": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.2.tgz", - "integrity": "sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.0.tgz", + "integrity": "sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.21.0" } }, "node_modules/prosemirror-view": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.40.0.tgz", - "integrity": "sha512-2G3svX0Cr1sJjkD/DYWSe3cfV5VPVTBOxI9XQEGWJDFEpsZb/gh4MV29ctv+OJx2RFX4BLt09i+6zaGM/ldkCw==", + "version": "1.41.8", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.8.tgz", + "integrity": "sha512-TnKDdohEatgyZNGCDWIdccOHXhYloJwbwU+phw/a23KBvJIR9lWQWW7WHHK3vBdOLDNuF7TaX98GObUZOWkOnA==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.20.0", @@ -14492,25 +14594,24 @@ } }, "node_modules/protobufjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz", - "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.4.tgz", + "integrity": "sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw==", "dev": true, "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", - "long": "^5.0.0" + "long": "^5.3.2" }, "engines": { "node": ">=12.0.0" @@ -14569,9 +14670,9 @@ } }, "node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14676,6 +14777,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "peer": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -15141,87 +15243,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify/node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/remark-stringify/node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify/node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify/node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify/node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-unlink-protocols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/remark-unlink-protocols/-/remark-unlink-protocols-1.0.0.tgz", @@ -15390,6 +15411,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "devOptional": true, "license": "MIT" }, "node_modules/rimraf": { @@ -16068,15 +16090,6 @@ "spdx-ranges": "^2.0.0" } }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/split-ca": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", @@ -16814,18 +16827,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/superjson": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", - "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", - "license": "MIT", - "dependencies": { - "copy-anything": "^4" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -16877,9 +16878,9 @@ "peer": true }, "node_modules/systeminformation": { - "version": "5.31.5", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.5.tgz", - "integrity": "sha512-5SyLdip4/3alxD4Kh+63bUQTJmu7YMfYQTC+koZy7X73HgNqZSD2P4wOZQWtUncvPvcEmnfIjCoygN4MRoEejQ==", + "version": "5.31.7", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.7.tgz", + "integrity": "sha512-/8NC53e5nP9nmhn42/ncdOkyJnOoue/Vy+tJOyUGd1Yv66G069wK4rrziwhrqDETgk78CudTQupw5z19S5uoZw==", "dev": true, "license": "MIT", "os": [ @@ -17111,9 +17112,9 @@ "license": "MIT" }, "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", "dev": true, "license": "MIT", "engines": { @@ -17141,6 +17142,7 @@ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-number": "^7.0.0" }, @@ -17629,9 +17631,9 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -17914,13 +17916,13 @@ } }, "node_modules/vite": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", - "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", + "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.27.0", + "esbuild": "^0.27.0 || ^0.28.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", @@ -18043,9 +18045,9 @@ } }, "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", "cpu": [ "ppc64" ], @@ -18060,9 +18062,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ "arm" ], @@ -18077,9 +18079,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], @@ -18094,9 +18096,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], @@ -18111,9 +18113,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], @@ -18128,9 +18130,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], @@ -18145,9 +18147,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ "arm64" ], @@ -18162,9 +18164,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], @@ -18179,9 +18181,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], @@ -18196,9 +18198,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], @@ -18213,9 +18215,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ "ia32" ], @@ -18230,9 +18232,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], @@ -18247,9 +18249,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], @@ -18264,9 +18266,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], @@ -18281,9 +18283,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], @@ -18298,9 +18300,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ "s390x" ], @@ -18315,9 +18317,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ "x64" ], @@ -18332,9 +18334,9 @@ } }, "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ "arm64" ], @@ -18349,9 +18351,9 @@ } }, "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], @@ -18366,9 +18368,9 @@ } }, "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "cpu": [ "arm64" ], @@ -18383,9 +18385,9 @@ } }, "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], @@ -18400,9 +18402,9 @@ } }, "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ "x64" ], @@ -18417,9 +18419,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ "arm64" ], @@ -18434,9 +18436,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ "ia32" ], @@ -18451,9 +18453,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ "x64" ], @@ -18468,9 +18470,9 @@ } }, "node_modules/vite/node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -18481,32 +18483,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" } }, "node_modules/vite/node_modules/fdir": { @@ -18772,20 +18774,20 @@ } }, "node_modules/webdav": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/webdav/-/webdav-5.9.0.tgz", - "integrity": "sha512-OMJ6wtK1WvCO++aOLoQgE96S8KT4e5aaClWHmHXfFU369r4eyELN569B7EqT4OOUb99mmO58GkyuiCv/Ag6J0Q==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webdav/-/webdav-5.10.0.tgz", + "integrity": "sha512-fVPuRLtcduVGvSO7Tn/6TQCzIvI/g6BO/+xPRctCvi/GytYpjn4czxWbh4HsArsdom9qz9BI63k9/v2HBUui1A==", "license": "MIT", "dependencies": { "@buttercup/fetch": "^0.2.1", "base-64": "^1.0.0", "byte-length": "^1.0.2", "entities": "^6.0.1", - "fast-xml-parser": "^5.3.4", + "fast-xml-parser": "^5.7.2", "hot-patcher": "^2.0.1", "layerr": "^3.0.0", "md5": "^2.3.0", - "minimatch": "^9.0.5", + "minimatch": "^9.0.9", "nested-property": "^4.0.0", "node-fetch": "^3.3.2", "path-posix": "^1.0.0", @@ -18974,6 +18976,21 @@ "node": ">=12" } }, + "node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -19054,14 +19071,16 @@ } }, "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.4.0.tgz", + "integrity": "sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==", "dev": true, "license": "MIT", "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/yocto-queue": { diff --git a/package.json b/package.json index 714c30c9a3..97b87bcdd3 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "tables", "description": "Manage data within tables.", - "version": "2.1.1", - "author": "Florian Steffens { await expect(page.locator('.custom-table table tr td div').filter({ hasText: '5:15' }).first()).toBeVisible() // delete row - await page.locator('.NcTable tr td button').first().click() - await page.locator('button').filter({ hasText: 'Delete' }).click() - await page.locator('button').filter({ hasText: /I really/ }).click({ force: true }) + await openRowActionMenu(page, page.locator('[data-cy="customTableRow"]').first()) + await page.locator('[data-cy="deleteRowBtn"]').click() + await page.locator('[data-cy="confirmDialog"]').getByRole('button', { name: 'Confirm' }).click() + await expect(page.locator('[data-cy="customTableRow"]')).toHaveCount(0, { timeout: 10000 }) await removeColumn(page, columnTitle) }) diff --git a/playwright/e2e/column-datetimeDate.spec.ts b/playwright/e2e/column-datetimeDate.spec.ts index c81e15a107..8ea402b9c4 100644 --- a/playwright/e2e/column-datetimeDate.spec.ts +++ b/playwright/e2e/column-datetimeDate.spec.ts @@ -4,7 +4,7 @@ */ import { test, expect } from '../support/fixtures' -import { createDatetimeDateColumn, createTable, loadTable, removeColumn } from '../support/commands' +import { createDatetimeDateColumn, createTable, loadTable, openRowActionMenu, removeColumn } from '../support/commands' const columnTitle = 'date' const tableTitle = 'Test datetimeDate' @@ -29,9 +29,10 @@ test.describe('Test column ' + columnTitle, () => { await expect(page.locator('.custom-table table tr td div').filter({ hasText: '2023' }).first()).toBeVisible() // delete row - await page.locator('.NcTable tr td button').first().click() - await page.locator('button').filter({ hasText: 'Delete' }).click() - await page.locator('button').filter({ hasText: /I really/ }).click({ force: true }) + await openRowActionMenu(page, page.locator('[data-cy="customTableRow"]').first()) + await page.locator('[data-cy="deleteRowBtn"]').click() + await page.locator('[data-cy="confirmDialog"]').getByRole('button', { name: 'Confirm' }).click() + await expect(page.locator('[data-cy="customTableRow"]')).toHaveCount(0, { timeout: 10000 }) await removeColumn(page, columnTitle) }) diff --git a/playwright/e2e/column-datetimeTime.spec.ts b/playwright/e2e/column-datetimeTime.spec.ts index 460c4b7416..d69935a205 100644 --- a/playwright/e2e/column-datetimeTime.spec.ts +++ b/playwright/e2e/column-datetimeTime.spec.ts @@ -4,7 +4,7 @@ */ import { test, expect } from '../support/fixtures' -import { createDatetimeTimeColumn, createTable, loadTable, removeColumn } from '../support/commands' +import { createDatetimeTimeColumn, createTable, loadTable, openRowActionMenu, removeColumn } from '../support/commands' const columnTitle = 'time' const tableTitle = 'Test datetimeTime' @@ -27,9 +27,10 @@ test.describe('Test column ' + columnTitle, () => { await expect(page.locator('.custom-table table tr td div').filter({ hasText: '5:15' }).first()).toBeVisible() // delete row - await page.locator('.NcTable tr td button').first().click() - await page.locator('button').filter({ hasText: 'Delete' }).click() - await page.locator('button').filter({ hasText: /I really/ }).click({ force: true }) + await openRowActionMenu(page, page.locator('[data-cy="customTableRow"]').first()) + await page.locator('[data-cy="deleteRowBtn"]').click() + await page.locator('[data-cy="confirmDialog"]').getByRole('button', { name: 'Confirm' }).click() + await expect(page.locator('[data-cy="customTableRow"]')).toHaveCount(0, { timeout: 10000 }) await removeColumn(page, columnTitle) }) diff --git a/playwright/e2e/column-number.spec.ts b/playwright/e2e/column-number.spec.ts index 1b8fcf22f4..1168459d24 100644 --- a/playwright/e2e/column-number.spec.ts +++ b/playwright/e2e/column-number.spec.ts @@ -4,7 +4,7 @@ */ import { test, expect } from '../support/fixtures' -import { createNumberColumn, createTable, loadTable, removeColumn } from '../support/commands' +import { createNumberColumn, createTable, loadTable, openRowActionMenu, removeColumn } from '../support/commands' const columnTitle = 'num1' const tableTitle = 'Test number column' @@ -26,9 +26,10 @@ test.describe('Test column number', () => { await expect(page.locator('.custom-table table tr td div').filter({ hasText: '21.00' }).first()).toBeVisible() // delete row - await page.locator('.NcTable tr td button').first().click() - await page.locator('button').filter({ hasText: 'Delete' }).click() - await page.locator('button').filter({ hasText: /I really/ }).click({ force: true }) + await openRowActionMenu(page, page.locator('[data-cy="customTableRow"]').first()) + await page.locator('[data-cy="deleteRowBtn"]').click() + await page.locator('[data-cy="confirmDialog"]').getByRole('button', { name: 'Confirm' }).click() + await expect(page.locator('[data-cy="customTableRow"]')).toHaveCount(0, { timeout: 10000 }) // insert row with float value await page.locator('button').filter({ hasText: 'Create row' }).click() @@ -38,9 +39,10 @@ test.describe('Test column number', () => { await expect(page.locator('.custom-table table tr td div').filter({ hasText: '21.30' }).first()).toBeVisible() // delete row - await page.locator('.NcTable tr td button').first().click() - await page.locator('button').filter({ hasText: 'Delete' }).click() - await page.locator('button').filter({ hasText: /I really/ }).click({ force: true }) + await openRowActionMenu(page, page.locator('[data-cy="customTableRow"]').first()) + await page.locator('[data-cy="deleteRowBtn"]').click() + await page.locator('[data-cy="confirmDialog"]').getByRole('button', { name: 'Confirm' }).click() + await expect(page.locator('[data-cy="customTableRow"]')).toHaveCount(0, { timeout: 10000 }) await removeColumn(page, columnTitle) }) diff --git a/playwright/e2e/column-selection-multi.spec.ts b/playwright/e2e/column-selection-multi.spec.ts index e0aefa2e3b..559f2c1a35 100644 --- a/playwright/e2e/column-selection-multi.spec.ts +++ b/playwright/e2e/column-selection-multi.spec.ts @@ -4,7 +4,7 @@ */ import { test, expect } from '../support/fixtures' -import { createSelectionMultiColumn, createTable, loadTable, removeColumn } from '../support/commands' +import { createSelectionMultiColumn, createTable, loadTable, openRowActionMenu, removeColumn } from '../support/commands' const columnTitle = 'multi selection' const tableTitle = 'Test number column' @@ -42,15 +42,17 @@ test.describe('Test column ' + columnTitle, () => { await expect(page.locator('.custom-table table tr td .cell-multi-selection').filter({ hasText: 'third option' }).first()).toBeVisible() // delete first row - await page.locator('.NcTable tr td button').first().click() - await page.locator('button').filter({ hasText: 'Delete' }).click() - await page.locator('button').filter({ hasText: /I really/ }).click({ force: true }) + await openRowActionMenu(page, page.locator('[data-cy="customTableRow"]').first()) + await page.locator('[data-cy="deleteRowBtn"]').click() + await page.locator('[data-cy="confirmDialog"]').getByRole('button', { name: 'Confirm' }).click() + await expect(page.locator('[data-cy="customTableRow"]')).toHaveCount(1, { timeout: 10000 }) await expect(page.locator('.custom-table table tr td .cell-multi-selection', { hasText: 'first option' })).toBeHidden() await expect(page.locator('.custom-table table tr td .cell-multi-selection', { hasText: 'second option' })).toBeHidden() // edit second row (which is now first row) - await page.locator('.NcTable tr td button').first().click() + await openRowActionMenu(page, page.locator('[data-cy="customTableRow"]').first()) + await page.locator('[data-cy="editRowBtn"]').click() await page.locator('.modal__content .slot input').first().click() await page.locator('ul.vs__dropdown-menu li span[title="first option"]').first().click() await page.locator('.modal__content .title').first().click() @@ -60,9 +62,10 @@ test.describe('Test column ' + columnTitle, () => { await expect(page.locator('.custom-table table tr td .cell-multi-selection').filter({ hasText: 'third option' }).first()).toBeVisible() // delete first row - await page.locator('.NcTable tr td button').first().click() - await page.locator('button').filter({ hasText: 'Delete' }).click() - await page.locator('button').filter({ hasText: /I really/ }).click({ force: true }) + await openRowActionMenu(page, page.locator('[data-cy="customTableRow"]').first()) + await page.locator('[data-cy="deleteRowBtn"]').click() + await page.locator('[data-cy="confirmDialog"]').getByRole('button', { name: 'Confirm' }).click() + await expect(page.locator('[data-cy="customTableRow"]')).toHaveCount(0, { timeout: 10000 }) await removeColumn(page, columnTitle) }) @@ -79,6 +82,6 @@ test.describe('Test column ' + columnTitle, () => { await page.locator('button').filter({ hasText: 'Save' }).click() await expect(page.locator('.custom-table table tr td .cell-multi-selection').first()).toBeVisible() - await expect(page.locator('.NcTable tr td button').first()).toBeVisible() + await expect(page.locator('[data-cy="customTableRow"]').first()).toBeVisible() }) }) diff --git a/playwright/e2e/column-selection.spec.ts b/playwright/e2e/column-selection.spec.ts index 7382438360..88e73acd9d 100644 --- a/playwright/e2e/column-selection.spec.ts +++ b/playwright/e2e/column-selection.spec.ts @@ -4,7 +4,7 @@ */ import { test, expect } from '../support/fixtures' -import { createSelectionColumn, createTable, deleteTable, loadTable } from '../support/commands' +import { createSelectionColumn, createTable, deleteTable, loadTable, openRowActionMenu } from '../support/commands' const columnTitle = 'single selection' const tableTitle = 'Test number column' @@ -37,7 +37,9 @@ test.describe('Test column ' + columnTitle, () => { await expect(page.locator('[data-cy="ncTable"] tr td div').filter({ hasText: 'third option' }).first()).toBeVisible() // edit the explicitly created row - await page.locator('[data-cy="ncTable"] [data-cy="customTableRow"]:has-text("👋 third option")').locator('[data-cy="editRowBtn"]').click() + const thirdOptionRow = page.locator('[data-cy="ncTable"] [data-cy="customTableRow"]').filter({ hasText: '👋 third option' }).first() + await openRowActionMenu(page, thirdOptionRow) + await page.locator('[data-cy="editRowBtn"]').click() await page.locator('[data-cy="editRowModal"] .slot input').first().click() await page.locator('ul.vs__dropdown-menu li span[title="first option"]').first().click() await page.locator('[data-cy="editRowSaveButton"]').click() @@ -59,6 +61,6 @@ test.describe('Test column ' + columnTitle, () => { await page.locator('[data-cy="createRowSaveButton"]').click() await expect(page.locator('[data-cy="ncTable"] tr td div').first()).toBeVisible() - await expect(page.locator('[data-cy="ncTable"] [data-cy="editRowBtn"]').first()).toBeVisible() + await expect(page.locator('[data-cy="ncTable"] [data-cy="customTableRow"]').first()).toBeVisible() }) }) diff --git a/playwright/e2e/column-text-link.spec.ts b/playwright/e2e/column-text-link.spec.ts index 7276deea89..916e634f89 100644 --- a/playwright/e2e/column-text-link.spec.ts +++ b/playwright/e2e/column-text-link.spec.ts @@ -8,7 +8,7 @@ import * as fs from 'fs' import * as path from 'path' import { fileURLToPath } from 'url' import { uploadFile } from '../support/api' -import { createTable, createTextLinkColumn, loadTable } from '../support/commands' +import { createTable, createTextLinkColumn, loadTable, openRowActionMenu } from '../support/commands' const __dirname = path.dirname(fileURLToPath(import.meta.url)) test.describe('Test column text-link', () => { @@ -44,13 +44,35 @@ test.describe('Test column text-link', () => { await expect(page.locator('tr td a').filter({ hasText: 'nextcloud' }).first()).toBeVisible() await expect(page.locator('tr td a').filter({ hasText: 'NC_server_test' }).first()).toBeVisible() - await page.locator('[data-cy="ncTable"] [data-cy="editRowBtn"]').first().click({ force: true }) - const editDialog = page.getByRole('dialog', { name: 'Edit row' }) + const saveEditRow = async () => { + const editRowReqPromise = page.waitForResponse(r => r.url().includes('/apps/tables/row/') && r.request().method() === 'PUT') + await page.locator('[data-cy="editRowSaveButton"]').click() + const editRowResponse = await editRowReqPromise + expect(editRowResponse.ok()).toBeTruthy() + await expect(page.locator('[data-cy="editRowModal"]')).toBeHidden() + } + + const firstRow = page.locator('[data-cy="ncTable"] [data-cy="customTableRow"]').first() + await openRowActionMenu(page, firstRow) + await page.locator('[data-cy="editRowBtn"]').click() + let editDialog = page.getByRole('dialog', { name: 'Edit row' }) await editDialog.waitFor({ state: 'visible' }) - const urlInput = editDialog.getByRole('textbox', { name: 'URL' }) - await urlInput.click({ clickCount: 3 }) - await page.keyboard.insertText('https://github.com') + const urlInput = editDialog + .locator('.row.space-T', { hasText: 'Test plain url' }) + .locator('input[placeholder="URL"]') + .first() + await urlInput.fill('https://github.com') + await expect(urlInput).toHaveValue('https://github.com') + + await saveEditRow() + await expect(page.locator('tr td a').filter({ hasText: 'github' }).first()).toBeVisible() + + const editedRow = page.locator('[data-cy="ncTable"] [data-cy="customTableRow"]').first() + await openRowActionMenu(page, editedRow) + await page.locator('[data-cy="editRowBtn"]').click() + editDialog = page.getByRole('dialog', { name: 'Edit row' }) + await editDialog.waitFor({ state: 'visible' }) const editFilesResultsReqPromise = page.waitForResponse(r => r.url().includes('/search/providers/files/') && r.request().method() === 'GET') const fileCombobox = editDialog.getByRole('combobox', { name: 'Link providers' }) @@ -59,7 +81,7 @@ test.describe('Test column text-link', () => { await editFilesResultsReqPromise await page.getByRole('option', { name: /photo-test/i }).first().click() - await page.locator('[data-cy="editRowSaveButton"]').click() + await saveEditRow() await expect(page.locator('tr td a').filter({ hasText: 'github' }).first()).toBeVisible() await expect(page.locator('tr td a').filter({ hasText: 'photo' }).first()).toBeVisible() diff --git a/playwright/e2e/column-usergroup.spec.ts b/playwright/e2e/column-usergroup.spec.ts index b614e86ad6..744f2b88d9 100644 --- a/playwright/e2e/column-usergroup.spec.ts +++ b/playwright/e2e/column-usergroup.spec.ts @@ -5,11 +5,19 @@ import { test, expect } from '../support/fixtures' import { createRandomUser } from '../support/api' -import { createTable, createUsergroupColumn, loadTable } from '../support/commands' +import { createTable, createUsergroupColumn, loadTable, openRowActionMenu } from '../support/commands' const columnTitle = 'usergroup' const tableTitlePrefix = 'Test usergroup' +const saveEditRow = async (page) => { + const editRowReqPromise = page.waitForResponse(r => r.url().includes('/apps/tables/row/') && r.request().method() === 'PUT') + await page.locator('[data-cy="editRowSaveButton"]').click() + const editRowResponse = await editRowReqPromise + expect(editRowResponse.ok()).toBeTruthy() + await expect(page.locator('[data-cy="editRowModal"]')).toBeHidden() +} + test.describe('Test column ' + columnTitle, () => { test('Create column and rows with default values', async ({ userPage: { page, user }, request }) => { @@ -59,17 +67,23 @@ test.describe('Test column ' + columnTitle, () => { await page.locator('[data-cy="createRowSaveButton"]').click() await expect(page.locator('[data-cy="ncTable"] table tr td .user-bubble__name').filter({ hasText: user.userId }).first()).toBeVisible() - await page.locator('[data-cy="ncTable"] [data-cy="editRowBtn"]').first().click() - // deselect all - const deselectButtons = await page.locator('[data-cy="usergroupRowSelect"] .vs__deselect').all() - for (const button of deselectButtons) { - await button.click({ force: true }) - } + const firstRow = page.locator('[data-cy="ncTable"] [data-cy="customTableRow"]').first() + await openRowActionMenu(page, firstRow) + await page.locator('[data-cy="editRowBtn"]').click() + await expect(page.locator('[data-cy="editRowModal"]')).toBeVisible() - await page.locator('[data-cy="usergroupRowSelect"] input').clear() - await page.locator('[data-cy="usergroupRowSelect"] input').pressSequentially(nonLocalUser.userId) + const usergroupSelect = page.locator('[data-cy="editRowModal"] [data-cy="usergroupRowSelect"]') + await expect(usergroupSelect.locator('.vs__selected').filter({ hasText: user.userId }).first()).toBeVisible() + + await usergroupSelect.locator('input').pressSequentially(nonLocalUser.userId) await page.locator(`.vs__dropdown-menu [id="${nonLocalUser.userId}"]`).click() - await page.locator('[data-cy="editRowSaveButton"]').click() + await expect(usergroupSelect.locator('.vs__selected').filter({ hasText: nonLocalUser.userId }).first()).toBeVisible() + + const localUserSelection = usergroupSelect.locator('.vs__selected').filter({ hasText: user.userId }).first() + await localUserSelection.locator('.vs__deselect').click({ force: true }) + await expect(usergroupSelect.locator('.vs__selected').filter({ hasText: user.userId })).toBeHidden() + + await saveEditRow(page) await expect(page.locator('[data-cy="ncTable"] table tr td .user-bubble__name', { hasText: user.userId })).toBeHidden() await expect(page.locator('[data-cy="ncTable"] table tr td .user-bubble__name').filter({ hasText: nonLocalUser.userId }).first()).toBeVisible() diff --git a/playwright/e2e/context-navigation.spec.ts b/playwright/e2e/context-navigation.spec.ts index fcada0d98c..6b6f498ebf 100644 --- a/playwright/e2e/context-navigation.spec.ts +++ b/playwright/e2e/context-navigation.spec.ts @@ -4,12 +4,23 @@ */ import { test, expect } from '../support/fixtures' +import type { Page } from '@playwright/test' import { createContext, ensureNavigationOpen } from '../support/commands' -function appMenuEntry(page: import('@playwright/test').Page, contextTitle: string) { - return page - .locator('nav[aria-label="Applications menu"]') - .locator(`[title="${contextTitle}"]`) +// Returns the locator for an app menu entry, opening the NC34 waffle popover first if needed. +async function getAppMenuEntry(page: Page, contextTitle: string) { + const waffleBtn = page.locator('button.app-menu__waffle') + if (await waffleBtn.isVisible().catch(() => false)) { + // NC34+: app entries live inside a popover opened by the waffle button + const isExpanded = await waffleBtn.getAttribute('aria-expanded').catch(() => null) + if (isExpanded !== 'true') { + await waffleBtn.click() + await page.waitForTimeout(300) + } + return page.locator(`.app-menu__grid .app-item[title="${contextTitle}"]`) + } + // NC33: entries are always visible inline in the header nav + return page.locator('nav[aria-label="Applications menu"]').locator(`[title="${contextTitle}"]`) } test.describe('Test context navigation', () => { @@ -21,7 +32,7 @@ test.describe('Test context navigation', () => { await createContext(page, contextTitle, false) await page.reload({ waitUntil: 'domcontentloaded' }) await ensureNavigationOpen(page) - await expect(appMenuEntry(page, contextTitle)).toBeHidden() + await expect(await getAppMenuEntry(page, contextTitle)).toBeHidden() const contextButton = page .locator('[data-cy="navigationContextItem"]') @@ -49,6 +60,6 @@ test.describe('Test context navigation', () => { page.locator('[data-cy="navigationContextShowInNavSwitch"] input'), ).toBeChecked() - await expect(appMenuEntry(page, contextTitle)).toBeVisible() + await expect(await getAppMenuEntry(page, contextTitle)).toBeVisible() }) }) diff --git a/playwright/e2e/context.spec.ts b/playwright/e2e/context.spec.ts index 5b8e6f6200..c685f6e748 100644 --- a/playwright/e2e/context.spec.ts +++ b/playwright/e2e/context.spec.ts @@ -15,6 +15,7 @@ import { loadContext, loadTable, openContextEditModal, + openRowActionMenu, } from '../support/commands' import { login } from '../support/login' @@ -56,6 +57,7 @@ async function expectSelectedShare(page: Page, userId: string) { } test.describe('Manage a context', () => { + test.describe.configure({ mode: 'serial' }) test('Update and add resources', async ({ userPage: { page } }) => { const contextTitle = 'test application update' @@ -173,16 +175,24 @@ test.describe('Manage a context', () => { // verify that context was deleted from current user const contextNavItem = page.locator('[data-cy="navigationContextItem"]').filter({ hasText: contextTitle }).first() + const contextHref = await contextNavItem.locator('a').first().getAttribute('href') + const contextId = contextHref?.match(/\/application\/(\d+)/)?.[1] + if (!contextId) { + throw new Error(`Could not find context id for ${contextTitle}`) + } await contextNavItem.hover() await contextNavItem.getByRole('button', { name: /Actions|Open menu/i }).first().click({ force: true }) await page.locator('[data-cy="navigationContextDeleteBtn"]').filter({ hasText: 'Delete application' }).waitFor({ state: 'visible', timeout: 5000 }) await page.locator('[data-cy="navigationContextDeleteBtn"]').filter({ hasText: 'Delete application' }).click({ force: true }) - await expect(page.locator('[data-cy="deleteContextModal"]')).toBeVisible() + const deleteDialog = page.getByRole('dialog', { name: 'Confirm application deletion' }) + await expect(deleteDialog).toBeVisible() - const deleteResponse = page.waitForResponse(r => r.url().includes('/apps/tables/') && r.request().method() === 'DELETE') - await page.locator('[data-cy="deleteContextModal"] button').filter({ hasText: 'Delete' }).click() - await deleteResponse + const deleteResponsePromise = page.waitForResponse(r => r.url().includes(`/apps/tables/api/2/contexts/${contextId}`) && r.request().method() === 'DELETE') + await deleteDialog.getByRole('button', { name: 'Delete' }).click() + const deleteResponse = await deleteResponsePromise + expect(deleteResponse.ok()).toBeTruthy() + await expect(deleteDialog).toBeHidden({ timeout: 10000 }) // Wait for the navigation item to be hidden await expect(page.locator('[data-cy="navigationContextItem"]').filter({ hasText: contextTitle })).toBeHidden({ timeout: 15000 }) @@ -300,9 +310,11 @@ test.describe('Manage a context', () => { await expect(page.locator('[data-cy="ncTable"] table').filter({ hasText: 'first row' })).toBeVisible() - await page.locator('[data-cy="ncTable"] [data-cy="customTableRow"]').filter({ hasText: 'first row' }).locator('[data-cy="editRowBtn"]').click() - await page.locator('[data-cy="editRowDeleteButton"]').click() - await page.locator('[data-cy="editRowDeleteConfirmButton"]').click() + const firstRow = page.locator('[data-cy="ncTable"] [data-cy="customTableRow"]').filter({ hasText: 'first row' }).first() + await openRowActionMenu(page, firstRow) + await page.locator('[data-cy="deleteRowBtn"]').click() + await page.locator('[data-cy="confirmDialog"]').getByRole('button', { name: 'Confirm' }).click() + await page.locator('[data-cy="confirmDialog"]').waitFor({ state: 'hidden', timeout: 10000 }).catch(() => {}) await expect(page.locator('[data-cy="ncTable"] table', { hasText: 'first row' })).toBeHidden() }) diff --git a/playwright/e2e/tables-export-csv.spec.ts b/playwright/e2e/tables-export-csv.spec.ts index 5f61e6fb93..3a10c47167 100644 --- a/playwright/e2e/tables-export-csv.spec.ts +++ b/playwright/e2e/tables-export-csv.spec.ts @@ -5,20 +5,46 @@ import { test, expect } from '../support/fixtures' import * as fs from 'fs' +import { type Page } from '@playwright/test' import { clickOnTableThreeDotMenu, getTutorialTableName, loadTable } from '../support/commands' -test.describe('Import csv', () => { +async function fillSearchInput(page: Page, value: string) { + // Scope to the NcTable container to avoid matching Nextcloud header search elements + const searchInput = page.locator('[data-cy="ncTable"]').getByRole('textbox', { name: 'Search' }) + await expect(searchInput).toBeVisible({ timeout: 10000 }) + await searchInput.fill(value) + await page.waitForTimeout(600) // debounce in SearchForm is 500 ms +} - test('Export csv', async ({ userPage: { page } }) => { +async function clickSelectionBarAction(page: Page, label: string) { + await expect(page.locator('.icon-loading').first()).toBeHidden({ timeout: 10000 }) + await expect(page.locator('.selected-rows-option')).toBeVisible({ timeout: 10000 }) + // NcActionButton does not forward data-cy to the DOM; match by button text content instead. + // With inline=2 the items render as plain