mirror of
https://github.com/suitenumerique/docs.git
synced 2026-05-06 23:22:15 +02:00
Compare commits
16 Commits
renovate/g
...
refacto/re
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b383c58eb | ||
|
|
85128c7b11 | ||
|
|
5f700ed6c4 | ||
|
|
b0d9ed15c0 | ||
|
|
d41e44dcd5 | ||
|
|
07e7b3feb6 | ||
|
|
aa71cfdfc0 | ||
|
|
7afa17a181 | ||
|
|
af2b381097 | ||
|
|
5015d42677 | ||
|
|
738ff90fc7 | ||
|
|
0e8094c733 | ||
|
|
9231730bf0 | ||
|
|
21100b986d | ||
|
|
eaddbd83d7 | ||
|
|
22c587fdd0 |
8
.github/workflows/crowdin_download.yml
vendored
8
.github/workflows/crowdin_download.yml
vendored
@@ -23,7 +23,7 @@ jobs:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
- name: Create empty source files
|
||||
run: |
|
||||
touch src/backend/locale/django.pot
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
touch src/frontend/packages/i18n/locales/impress/translations-crowdin.json
|
||||
# crowdin workflow
|
||||
- name: crowdin action
|
||||
uses: crowdin/github-action@8868a33591d21088edfc398968173a3b98d51706 # v2
|
||||
uses: crowdin/github-action@v2
|
||||
with:
|
||||
config: crowdin/config.yml
|
||||
upload_sources: false
|
||||
@@ -51,7 +51,7 @@ jobs:
|
||||
CROWDIN_BASE_PATH: "../src/"
|
||||
# frontend i18n
|
||||
- name: Restore the frontend cache
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: "src/frontend/**/node_modules"
|
||||
key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }}
|
||||
@@ -61,7 +61,7 @@ jobs:
|
||||
run: yarn i18n:deploy
|
||||
# Create a new PR
|
||||
- name: Create a new Pull Request with new translated strings
|
||||
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8
|
||||
uses: peter-evans/create-pull-request@v7
|
||||
with:
|
||||
commit-message: |
|
||||
🌐(i18n) update translated strings
|
||||
|
||||
12
.github/workflows/crowdin_upload.yml
vendored
12
.github/workflows/crowdin_upload.yml
vendored
@@ -23,12 +23,12 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
# Backend i18n
|
||||
- name: Install Python
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: "3.14.4"
|
||||
python-version: "3.13.3"
|
||||
cache: "pip"
|
||||
- name: Upgrade pip and setuptools
|
||||
run: pip install --upgrade pip setuptools
|
||||
@@ -36,7 +36,7 @@ jobs:
|
||||
run: pip install --user .
|
||||
working-directory: src/backend
|
||||
- name: Restore the mail templates
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
id: mail-templates
|
||||
with:
|
||||
path: "src/backend/core/templates/mail"
|
||||
@@ -52,7 +52,7 @@ jobs:
|
||||
DJANGO_CONFIGURATION=Build python manage.py makemessages -a --keep-pot
|
||||
# frontend i18n
|
||||
- name: Restore the frontend cache
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: "src/frontend/**/node_modules"
|
||||
key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }}
|
||||
@@ -62,7 +62,7 @@ jobs:
|
||||
run: yarn i18n:extract
|
||||
# crowdin workflow
|
||||
- name: crowdin action
|
||||
uses: crowdin/github-action@8868a33591d21088edfc398968173a3b98d51706 # v2
|
||||
uses: crowdin/github-action@v2
|
||||
with:
|
||||
config: crowdin/config.yml
|
||||
upload_sources: true
|
||||
|
||||
16
.github/workflows/dependencies.yml
vendored
16
.github/workflows/dependencies.yml
vendored
@@ -23,16 +23,16 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
- name: Restore the frontend cache
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
id: front-node_modules
|
||||
with:
|
||||
path: "src/frontend/**/node_modules"
|
||||
key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }}
|
||||
- name: Setup Node.js
|
||||
if: steps.front-node_modules.outputs.cache-hit != 'true'
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: ${{ inputs.node_version }}
|
||||
- name: Install dependencies
|
||||
@@ -40,7 +40,7 @@ jobs:
|
||||
run: cd src/frontend/ && yarn install --frozen-lockfile
|
||||
- name: Cache install frontend
|
||||
if: steps.front-node_modules.outputs.cache-hit != 'true'
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: "src/frontend/**/node_modules"
|
||||
key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }}
|
||||
@@ -53,10 +53,10 @@ jobs:
|
||||
working-directory: src/mail
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Restore the mail templates
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
id: mail-templates
|
||||
with:
|
||||
path: "src/backend/core/templates/mail"
|
||||
@@ -64,7 +64,7 @@ jobs:
|
||||
|
||||
- name: Setup Node.js
|
||||
if: steps.mail-templates.outputs.cache-hit != 'true'
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: ${{ inputs.node_version }}
|
||||
|
||||
@@ -82,7 +82,7 @@ jobs:
|
||||
|
||||
- name: Cache mail templates
|
||||
if: steps.mail-templates.outputs.cache-hit != 'true'
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: "src/backend/core/templates/mail"
|
||||
key: mail-templates-${{ hashFiles('src/mail/mjml') }}
|
||||
|
||||
2
.github/workflows/docker-hub.yml
vendored
2
.github/workflows/docker-hub.yml
vendored
@@ -68,7 +68,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'preview')
|
||||
steps:
|
||||
- uses: numerique-gouv/action-argocd-webhook-notification@cac2ee67896eb13e84e804f60c4271370424eaa8 # main
|
||||
- uses: numerique-gouv/action-argocd-webhook-notification@main
|
||||
id: notify
|
||||
with:
|
||||
deployment_repo_path: "${{ secrets.DEPLOYMENT_REPO_URL }}"
|
||||
|
||||
14
.github/workflows/docker-publish.yml
vendored
14
.github/workflows/docker-publish.yml
vendored
@@ -47,20 +47,20 @@ jobs:
|
||||
contents: read
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Login to DockerHub
|
||||
if: ${{ inputs.should_push }}
|
||||
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_USER }}
|
||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ inputs.image_name }}
|
||||
- name: Generate platform-specific tags
|
||||
@@ -87,7 +87,7 @@ jobs:
|
||||
# trivyignores: ./.github/.trivyignore
|
||||
- name: Build and push (amd64)
|
||||
if: ${{ inputs.should_push }}||${{ vars.TRIVY_SCAN_ENABLED }} != 'true'
|
||||
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: ${{ inputs.context }}
|
||||
file: ${{ inputs.file }}
|
||||
@@ -102,7 +102,7 @@ jobs:
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
- name: Build and push (arm64)
|
||||
if: ${{ inputs.should_push }}
|
||||
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: ${{ inputs.context }}
|
||||
file: ${{ inputs.file }}
|
||||
|
||||
30
.github/workflows/e2e-tests.yml
vendored
30
.github/workflows/e2e-tests.yml
vendored
@@ -36,15 +36,15 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: "24.x"
|
||||
node-version: "22.x"
|
||||
|
||||
- name: Restore the frontend cache
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: "src/frontend/**/node_modules"
|
||||
key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }}
|
||||
@@ -52,7 +52,7 @@ jobs:
|
||||
|
||||
- name: Restore Playwright browsers cache
|
||||
id: playwright-cache
|
||||
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: ~/.cache/ms-playwright
|
||||
key: playwright-${{ runner.os }}-${{ hashFiles('src/frontend/yarn.lock', 'src/frontend/apps/e2e/yarn.lock') }}
|
||||
@@ -67,7 +67,7 @@ jobs:
|
||||
|
||||
- name: Save Playwright browsers cache
|
||||
if: steps.playwright-cache.outputs.cache-hit != 'true'
|
||||
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache/save@v4
|
||||
with:
|
||||
path: ~/.cache/ms-playwright
|
||||
key: ${{ steps.playwright-cache.outputs.cache-primary-key }}
|
||||
@@ -78,15 +78,15 @@ jobs:
|
||||
timeout-minutes: ${{ inputs.timeout-minutes }}
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: "24.x"
|
||||
node-version: "22.x"
|
||||
|
||||
- name: Restore the frontend cache
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: "src/frontend/**/node_modules"
|
||||
key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }}
|
||||
@@ -96,7 +96,7 @@ jobs:
|
||||
run: cat env.d/development/common.e2e >> env.d/development/common.local
|
||||
|
||||
- name: Restore Playwright browsers cache
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ~/.cache/ms-playwright
|
||||
key: playwright-${{ runner.os }}-${{ hashFiles('src/frontend/yarn.lock', 'src/frontend/apps/e2e/yarn.lock') }}
|
||||
@@ -111,7 +111,7 @@ jobs:
|
||||
- name: Restore last-run cache
|
||||
if: ${{ github.run_attempt > 1 }}
|
||||
id: restore-last-run
|
||||
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: src/frontend/apps/e2e/test-results/.last-run.json
|
||||
key: playwright-last-run-${{ github.run_id }}-${{ inputs.browser-name }}
|
||||
@@ -138,14 +138,14 @@ jobs:
|
||||
|
||||
- name: Save last-run cache
|
||||
if: always()
|
||||
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache/save@v4
|
||||
with:
|
||||
path: src/frontend/apps/e2e/test-results/.last-run.json
|
||||
key: playwright-last-run-${{ github.run_id }}-${{ inputs.browser-name }}
|
||||
|
||||
- name: Upload last-run artifact
|
||||
if: always()
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: playwright-instance-last-run-${{ inputs.browser-name }}
|
||||
path: src/frontend/apps/e2e/test-results/.last-run.json
|
||||
@@ -153,7 +153,7 @@ jobs:
|
||||
if-no-files-found: warn
|
||||
retention-days: 7
|
||||
|
||||
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
||||
- uses: actions/upload-artifact@v6
|
||||
if: always()
|
||||
with:
|
||||
name: playwright-${{ inputs.browser-name }}-report
|
||||
|
||||
36
.github/workflows/ghcr.yml
vendored
36
.github/workflows/ghcr.yml
vendored
@@ -25,14 +25,14 @@ jobs:
|
||||
packages: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ github.repository }}/backend
|
||||
tags: |
|
||||
@@ -42,13 +42,13 @@ jobs:
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=sha
|
||||
- name: Login to GHCR
|
||||
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
target: backend-production
|
||||
@@ -71,14 +71,14 @@ jobs:
|
||||
packages: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ github.repository }}/frontend
|
||||
tags: |
|
||||
@@ -88,13 +88,13 @@ jobs:
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=sha
|
||||
- name: Login to GHCR
|
||||
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: ./src/frontend/Dockerfile
|
||||
@@ -120,14 +120,14 @@ jobs:
|
||||
packages: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ github.repository }}/y-provider
|
||||
tags: |
|
||||
@@ -137,13 +137,13 @@ jobs:
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=sha
|
||||
- name: Login to GHCR
|
||||
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: ./src/frontend/servers/y-provider/Dockerfile
|
||||
|
||||
2
.github/workflows/helmfile-linter.yaml
vendored
2
.github/workflows/helmfile-linter.yaml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
steps:
|
||||
-
|
||||
name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
-
|
||||
name: Helmfile lint
|
||||
shell: bash
|
||||
|
||||
36
.github/workflows/impress-frontend.yml
vendored
36
.github/workflows/impress-frontend.yml
vendored
@@ -26,15 +26,15 @@ jobs:
|
||||
contents: read
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: "24.x"
|
||||
node-version: "22.x"
|
||||
|
||||
- name: Restore the frontend cache
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: "src/frontend/**/node_modules"
|
||||
key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }}
|
||||
@@ -50,14 +50,14 @@ jobs:
|
||||
contents: read
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: "24.x"
|
||||
node-version: "22.x"
|
||||
- name: Restore the frontend cache
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: "src/frontend/**/node_modules"
|
||||
key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }}
|
||||
@@ -91,11 +91,11 @@ jobs:
|
||||
issues: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Detect relevant changes
|
||||
id: changes
|
||||
uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4
|
||||
uses: dorny/paths-filter@v3
|
||||
with:
|
||||
filters: |
|
||||
lock:
|
||||
@@ -104,7 +104,7 @@ jobs:
|
||||
- 'src/frontend/apps/impress/**'
|
||||
|
||||
- name: Restore the frontend cache
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: "src/frontend/**/node_modules"
|
||||
key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }}
|
||||
@@ -112,13 +112,13 @@ jobs:
|
||||
|
||||
- name: Setup Node.js
|
||||
if: steps.changes.outputs.lock == 'true' || steps.changes.outputs.app == 'true'
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: "24.x"
|
||||
node-version: "22.x"
|
||||
|
||||
- name: Check bundle size changes
|
||||
if: steps.changes.outputs.lock == 'true' || steps.changes.outputs.app == 'true'
|
||||
uses: preactjs/compressed-size-action@66325aad6443cb7cf89c4bfcd414aea2367cda94 # v2
|
||||
uses: preactjs/compressed-size-action@v2
|
||||
with:
|
||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
build-script: "app:build"
|
||||
@@ -139,14 +139,14 @@ jobs:
|
||||
contents: read
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: "24.x"
|
||||
node-version: "22.x"
|
||||
- name: Restore the frontend cache
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: "src/frontend/**/node_modules"
|
||||
key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }}
|
||||
|
||||
24
.github/workflows/impress.yml
vendored
24
.github/workflows/impress.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
||||
if: github.event_name == 'pull_request' # Makes sense only for pull requests
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: show
|
||||
@@ -49,7 +49,7 @@ jobs:
|
||||
github.event_name == 'pull_request'
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 50
|
||||
- name: Check that the CHANGELOG has been modified in the current branch
|
||||
@@ -59,7 +59,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
- name: Check CHANGELOG max line length
|
||||
run: |
|
||||
max_line_length=$(cat CHANGELOG.md | grep -Ev "^\[.*\]: https://github.com" | wc -L)
|
||||
@@ -73,7 +73,7 @@ jobs:
|
||||
if: github.event_name == 'pull_request'
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
- name: Install codespell
|
||||
run: pip install --user codespell
|
||||
- name: Check for typos
|
||||
@@ -95,11 +95,11 @@ jobs:
|
||||
working-directory: src/backend
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
- name: Install Python
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: "3.14.4"
|
||||
python-version: "3.13.3"
|
||||
cache: "pip"
|
||||
- name: Upgrade pip and setuptools
|
||||
run: pip install --upgrade pip setuptools
|
||||
@@ -122,7 +122,7 @@ jobs:
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:18
|
||||
image: postgres:16
|
||||
env:
|
||||
POSTGRES_DB: impress
|
||||
POSTGRES_USER: dinum
|
||||
@@ -149,7 +149,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Create writable /data
|
||||
run: |
|
||||
@@ -157,7 +157,7 @@ jobs:
|
||||
sudo mkdir -p /data/static
|
||||
|
||||
- name: Restore the mail templates
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
|
||||
uses: actions/cache@v5
|
||||
id: mail-templates
|
||||
with:
|
||||
path: "src/backend/core/templates/mail"
|
||||
@@ -193,9 +193,9 @@ jobs:
|
||||
mc version enable impress/impress-media-storage"
|
||||
|
||||
- name: Install Python
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: "3.14.4"
|
||||
python-version: "3.13.3"
|
||||
cache: "pip"
|
||||
|
||||
- name: Install development dependencies
|
||||
|
||||
2
.github/workflows/label_preview.yml
vendored
2
.github/workflows/label_preview.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
if: contains(github.event.pull_request.labels.*.name, 'preview')
|
||||
steps:
|
||||
- uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3
|
||||
- uses: thollander/actions-comment-pull-request@v3
|
||||
with:
|
||||
message: |
|
||||
:rocket: Preview will be available at [https://${{ github.event.pull_request.number }}-docs.ppr-docs.beta.numerique.gouv.fr/](https://${{ github.event.pull_request.number }}-docs.ppr-docs.beta.numerique.gouv.fr/)
|
||||
|
||||
6
.github/workflows/release-helm-chart.yaml
vendored
6
.github/workflows/release-helm-chart.yaml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -23,12 +23,12 @@ jobs:
|
||||
run: rm -rf ./src/helm/extra
|
||||
|
||||
- name: Install Helm
|
||||
uses: azure/setup-helm@dda3372f752e03dde6b3237bc9431cdc2f7a02a2 # v5
|
||||
uses: azure/setup-helm@v4
|
||||
env:
|
||||
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
||||
|
||||
- name: Publish Helm charts
|
||||
uses: numerique-gouv/helm-gh-pages@2cf477ae49d7c70037ceb1685803f4f7bad9b981 # add-overwrite-option
|
||||
uses: numerique-gouv/helm-gh-pages@add-overwrite-option
|
||||
with:
|
||||
charts_dir: ./src/helm
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
38
CHANGELOG.md
38
CHANGELOG.md
@@ -8,9 +8,28 @@ and this project adheres to
|
||||
|
||||
### Added
|
||||
|
||||
- ✨(backend) create a dedicated endpoint to update document content
|
||||
- ⚡️(backend) stream s3 file content with a dedicated endpoint
|
||||
- ✨(backend) allow to use new ai feature using mistral sdk
|
||||
- ⚡️(frontend) add skeleton on content loading #2254
|
||||
|
||||
### Changed
|
||||
|
||||
- 🧵(backend) remove lock from db table #2272
|
||||
|
||||
### Fixed
|
||||
|
||||
- 💬(frontend) add missing link in onboarding description #2233
|
||||
- 🐛(frontend) sanitize pasted and dropped content in document title #2210
|
||||
- 🐛(frontend) Emoji menu doesn't display above comment box #2229
|
||||
- 🐛(frontend) Block menu doesn't stay open on 1st line #2229
|
||||
- 🐛(frontend) The "+" on the first line of a new doc doesn't work #2229
|
||||
|
||||
|
||||
## [v5.0.0] - 2026-04-08
|
||||
|
||||
### Added
|
||||
|
||||
- ✨(backend) create a dedicated endpoint to update document content #2171
|
||||
- ⚡️(backend) stream s3 file content with a dedicated endpoint #2171
|
||||
- ✨(backend) allow to use new ai feature using mistral sdk #2193
|
||||
|
||||
### Changed
|
||||
|
||||
@@ -33,11 +52,14 @@ and this project adheres to
|
||||
- 🐛(backend) load jwks url when OIDC_RS_PRIVATE_KEY_STR is set
|
||||
- 🐛(backend) Prevent moving document to its own descendant or self #2208
|
||||
- 🐛(backend) return 400 when restoring a non-deleted document #2225
|
||||
- 🐛(backend) fix race condition in reconciliation requests CSV import #2153
|
||||
- 🐛(backend) create_for_owner: add accesses before saving doc content #2124
|
||||
- 🐛(backend) enforce emoji validation for reactions #1965
|
||||
|
||||
### Removed
|
||||
|
||||
- 🔥(backend) remove deprecated descendants endpoint #2243
|
||||
- 🔥(backend) remove content in document responses
|
||||
- 🔥(backend) remove content in document responses #2171
|
||||
|
||||
## [v4.8.6] - 2026-04-08
|
||||
|
||||
@@ -76,7 +98,6 @@ and this project adheres to
|
||||
- ⚡️(frontend) add jitter to WS reconnection #2162
|
||||
- 🐛(frontend) fix tree pagination #2145
|
||||
- 🐛(nginx) add page reconciliation on nginx #2154
|
||||
- 🐛(backend) fix race condition in reconciliation requests CSV import #2153
|
||||
|
||||
## [v4.8.4] - 2026-03-25
|
||||
|
||||
@@ -98,9 +119,6 @@ and this project adheres to
|
||||
- 🐛(y-provider) destroy Y.Doc instances after each convert request #2129
|
||||
- 🐛(backend) remove deleted sub documents in favorite_list endpoint #2083
|
||||
|
||||
### Fixed
|
||||
|
||||
- 🐛(backend) create_for_owner: add accesses before saving doc content #2124
|
||||
|
||||
## [v4.8.3] - 2026-03-23
|
||||
|
||||
@@ -206,7 +224,6 @@ and this project adheres to
|
||||
|
||||
### Fixed
|
||||
|
||||
- 🐛(backend) enforce emoji validation for reactions #1965
|
||||
- 🐛(frontend) analytic feature flags problem #1953
|
||||
- 🐛(frontend) fix home collapsing panel #1954
|
||||
- 🐛(frontend) fix disabled color on icon Dropdown #1950
|
||||
@@ -1270,7 +1287,8 @@ and this project adheres to
|
||||
- ✨(frontend) Coming Soon page (#67)
|
||||
- 🚀 Impress, project to manage your documents easily and collaboratively.
|
||||
|
||||
[unreleased]: https://github.com/suitenumerique/docs/compare/v4.8.6...main
|
||||
[unreleased]: https://github.com/suitenumerique/docs/compare/v5.0.0...main
|
||||
[v5.0.0]: https://github.com/suitenumerique/docs/releases/v5.0.0
|
||||
[v4.8.6]: https://github.com/suitenumerique/docs/releases/v4.8.6
|
||||
[v4.8.5]: https://github.com/suitenumerique/docs/releases/v4.8.5
|
||||
[v4.8.4]: https://github.com/suitenumerique/docs/releases/v4.8.4
|
||||
|
||||
@@ -16,6 +16,8 @@ the following command inside your docker container:
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### [5.0.0] - 2026-04-30
|
||||
|
||||
We made several changes around document content management leading to several breaking changes in the API.
|
||||
|
||||
- The endpoint `/api/v1.0/documents/{document_id}/content/` has been renamed in `/api/v1.0/documents/{document_id}/formatted-content/`
|
||||
|
||||
@@ -4,10 +4,11 @@
|
||||
import binascii
|
||||
import mimetypes
|
||||
from base64 import b64decode
|
||||
from logging import getLogger
|
||||
from os.path import splitext
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import connection, transaction
|
||||
from django.db import IntegrityError, transaction
|
||||
from django.db.models import Q
|
||||
from django.utils.functional import lazy
|
||||
from django.utils.text import slugify
|
||||
@@ -25,6 +26,8 @@ from core.services.converter_services import (
|
||||
Converter,
|
||||
)
|
||||
|
||||
logger = getLogger(__name__)
|
||||
|
||||
|
||||
class UserSerializer(serializers.ModelSerializer):
|
||||
"""Serialize users."""
|
||||
@@ -467,18 +470,18 @@ class ServerCreateDocumentSerializer(serializers.Serializer):
|
||||
{"content": ["Could not convert content"]}
|
||||
) from err
|
||||
|
||||
with transaction.atomic():
|
||||
# locks the table to ensure safe concurrent access
|
||||
with connection.cursor() as cursor:
|
||||
cursor.execute(
|
||||
f'LOCK TABLE "{models.Document._meta.db_table}" ' # noqa: SLF001
|
||||
"IN SHARE ROW EXCLUSIVE MODE;"
|
||||
)
|
||||
|
||||
document = models.Document.add_root(
|
||||
title=validated_data["title"],
|
||||
creator=user,
|
||||
)
|
||||
while True:
|
||||
try:
|
||||
with transaction.atomic():
|
||||
document = models.Document.add_root(
|
||||
title=validated_data["title"],
|
||||
creator=user,
|
||||
)
|
||||
break
|
||||
except IntegrityError as e:
|
||||
if "impress_document_path_key" not in str(e):
|
||||
raise
|
||||
logger.warning("Path key conflict when creating document, retrying...")
|
||||
|
||||
if user:
|
||||
# Associate the document with the pre-existing user
|
||||
|
||||
@@ -19,7 +19,7 @@ from django.core.cache import cache
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.core.files.storage import default_storage
|
||||
from django.core.validators import URLValidator
|
||||
from django.db import connection, transaction
|
||||
from django.db import IntegrityError, connection, transaction
|
||||
from django.db import models as db
|
||||
from django.db.models.expressions import RawSQL
|
||||
from django.db.models.functions import Greatest, Left, Length
|
||||
@@ -708,18 +708,18 @@ class DocumentViewSet(
|
||||
{"file": ["Could not convert file content"]}
|
||||
) from err
|
||||
|
||||
with transaction.atomic():
|
||||
# locks the table to ensure safe concurrent access
|
||||
with connection.cursor() as cursor:
|
||||
cursor.execute(
|
||||
f'LOCK TABLE "{models.Document._meta.db_table}" ' # noqa: SLF001
|
||||
"IN SHARE ROW EXCLUSIVE MODE;"
|
||||
)
|
||||
|
||||
obj = models.Document.add_root(
|
||||
creator=self.request.user,
|
||||
**serializer.validated_data,
|
||||
)
|
||||
while True:
|
||||
try:
|
||||
with transaction.atomic():
|
||||
obj = models.Document.add_root(
|
||||
creator=self.request.user,
|
||||
**serializer.validated_data,
|
||||
)
|
||||
break
|
||||
except IntegrityError as e:
|
||||
if "impress_document_path_key" not in str(e):
|
||||
raise
|
||||
logger.warning("Path key conflict when creating document, retrying...")
|
||||
serializer.instance = obj
|
||||
models.DocumentAccess.objects.create(
|
||||
document=obj,
|
||||
|
||||
@@ -19,7 +19,7 @@ from django.core.cache import cache
|
||||
from django.core.files.base import ContentFile
|
||||
from django.core.files.storage import default_storage
|
||||
from django.core.mail import send_mail
|
||||
from django.db import connection, models, transaction
|
||||
from django.db import IntegrityError, models, transaction
|
||||
from django.db.models.functions import Left, Length
|
||||
from django.template.loader import render_to_string
|
||||
from django.utils import timezone
|
||||
@@ -277,24 +277,26 @@ class User(AbstractBaseUser, BaseModel, auth_models.PermissionsMixin):
|
||||
)
|
||||
return
|
||||
|
||||
with transaction.atomic():
|
||||
# locks the table to ensure safe concurrent access
|
||||
with connection.cursor() as cursor:
|
||||
cursor.execute(
|
||||
f'LOCK TABLE "{Document._meta.db_table}" ' # noqa: SLF001
|
||||
"IN SHARE ROW EXCLUSIVE MODE;"
|
||||
while True:
|
||||
try:
|
||||
with transaction.atomic():
|
||||
sandbox_document = Document.add_root(
|
||||
title=template_document.title,
|
||||
content=template_document.content,
|
||||
attachments=template_document.attachments,
|
||||
duplicated_from=template_document,
|
||||
creator=self,
|
||||
)
|
||||
DocumentAccess.objects.create(
|
||||
user=self, document=sandbox_document, role=RoleChoices.OWNER
|
||||
)
|
||||
break
|
||||
except IntegrityError as e:
|
||||
if "impress_document_path_key" not in str(e):
|
||||
raise
|
||||
logger.warning(
|
||||
"Path key conflict when creating sandbox document, retrying..."
|
||||
)
|
||||
sandbox_document = Document.add_root(
|
||||
title=template_document.title,
|
||||
content=template_document.content,
|
||||
attachments=template_document.attachments,
|
||||
duplicated_from=template_document,
|
||||
creator=self,
|
||||
)
|
||||
|
||||
DocumentAccess.objects.create(
|
||||
user=self, document=sandbox_document, role=RoleChoices.OWNER
|
||||
)
|
||||
|
||||
def _convert_valid_invitations(self):
|
||||
"""
|
||||
|
||||
@@ -161,7 +161,8 @@
|
||||
},
|
||||
"onboarding": {
|
||||
"enabled": true,
|
||||
"learn_more_url": ""
|
||||
"learn_more_url": "",
|
||||
"ready_template_url": ""
|
||||
},
|
||||
"help": {
|
||||
"documentation_url": ""
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Breton\n"
|
||||
"Language: br_FR\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr "Titouroù personel"
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr "Aotreoù"
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr "Deiziadoù a-bouez"
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr "Gwezennadur"
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr "Kuzhet"
|
||||
msgid "Favorite"
|
||||
msgstr "Sinedoù"
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Ur restr nevez a zo bet krouet ganeoc'h!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "C'hwi zo bet disklaeriet perc'henn ur restr nevez:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr "Ar vaezienn-mañ a zo rekis."
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "eilenn {title}"
|
||||
@@ -375,151 +375,151 @@ msgstr "Restr"
|
||||
msgid "Documents"
|
||||
msgstr "Restroù"
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr "Restr hep titl"
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr "Digeriñ"
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} en deus rannet ur restr ganeoc'h!"
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "{name} en deus pedet ac'hanoc'h gant ar rol \"{role}\" war ar restr da-heul:"
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} en deus rannet ur restr ganeoc'h: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Roud liamm ar restr/an implijer"
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Roudoù liamm ar restr/an implijer"
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "Ur roud liamm a zo dija evit an restr/an implijer."
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr "Restr muiañ-karet"
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr "Restroù muiañ-karet"
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "Ar restr-mañ a zo ur restr muiañ karet gant an implijer-mañ."
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr "Liamm restr/implijer"
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr "Liammoù restr/implijer"
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr "An implijer-mañ a zo dija er restr-mañ."
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Ar skipailh-mañ a zo dija en restr-mañ."
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr "An implijer pe ar skipailh a rank bezañ termenet, ket an daou avat."
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr "Goulenn tizhout ar restr"
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr "Goulennoù tizhout ar restr"
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr "An implijer en deus goulennet tizhout ar restr-mañ."
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr "{name} en defe c'hoant da dizhout ar restr-mañ!"
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr "{name} en defe c'hoant da dizhout ar restr da-heul:"
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr "{name} en defe c'hoant da dizhout ar restr: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr "postel"
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr "Pedadenn d'ur restr"
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr "Pedadennoù d'ur restr"
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Ar postel-mañ a zo liammet ouzh un implijer enskrivet."
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: German\n"
|
||||
"Language: de_DE\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr "Persönliche Daten"
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr "Berechtigungen"
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr "Wichtige Termine"
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr "Import-Job erstellt und in der Warteschlange."
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr "Baumstruktur"
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr "Maskiert"
|
||||
msgid "Favorite"
|
||||
msgstr "Favorit"
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Ein neues Dokument wurde in Ihrem Namen erstellt!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "Sie sind Besitzer eines neuen Dokuments:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr "Dies ist ein Pflichtfeld."
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr "Der Zugriff auf den Link '%(link_reach)s' ist aufgrund der Konfiguration übergeordneter Dokumente nicht erlaubt."
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "Kopie von {title}"
|
||||
@@ -149,15 +149,15 @@ msgstr "Rechts"
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr "id"
|
||||
msgstr "ID"
|
||||
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr "primärer Schlüssel für den Datensatz als UUID"
|
||||
msgstr "Primärschlüssel für den Datensatz als UUID"
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr "Erstellt"
|
||||
msgstr "Erstellt am"
|
||||
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
@@ -375,151 +375,151 @@ msgstr "Dokument"
|
||||
msgid "Documents"
|
||||
msgstr "Dokumente"
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr "Unbenanntes Dokument"
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr "Öffnen"
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} hat ein Dokument mit Ihnen geteilt!"
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "{name} hat Sie mit der Rolle \"{role}\" zu folgendem Dokument eingeladen:"
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} hat ein Dokument mit Ihnen geteilt: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Dokument/Benutzer Linkverfolgung"
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Dokument/Benutzer Linkverfolgung"
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "Für dieses Dokument/ diesen Benutzer ist bereits eine Linkverfolgung vorhanden."
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr "Dokumentenfavorit"
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr "Dokumentfavoriten"
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "Dieses Dokument ist bereits durch den gleichen Benutzer favorisiert worden."
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr "Dokument/Benutzerbeziehung"
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr "Dokument/Benutzerbeziehungen"
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Dieser Benutzer befindet sich bereits in diesem Dokument."
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Dieses Team befindet sich bereits in diesem Dokument."
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr "Benutzer oder Team müssen gesetzt werden, nicht beides."
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr "Dokument um Zugriff bitten"
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr "Dokumentenabfragen"
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr "Dieser Benutzer hat bereits um Zugang zu diesem Dokument gebeten."
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr "{name} möchte Zugriff auf ein Dokument erhalten!"
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr "{name} möchte auf das folgende Dokument zugreifen:"
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr "{name} bittet um Zugang zum Dokument: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr "Thread"
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr "Threads"
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr "Gast"
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr "Kommentar"
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr "Kommentare"
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr "Reaktion"
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr "Reaktionen"
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr "E-Mail-Adresse"
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr "Einladung zum Dokument"
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr "Dokumenteinladungen"
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Diese E-Mail ist bereits einem registrierten Benutzer zugeordnet."
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr "Docs AI"
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Greek\n"
|
||||
"Language: el_GR\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr "Προσωπικές πληροφορίες"
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr "Δικαιώματα"
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr "Σημαντικές ημερομηνίες"
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr "Η εργασία εισαγωγής δημιουργήθηκε και μπήκε στην ουρά."
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr "Επεξεργασία επιλεγμένων συμφωνιών χρηστών"
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr "Δομή δέντρου"
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr "Με κάλυψη"
|
||||
msgid "Favorite"
|
||||
msgstr "Αγαπημένο"
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Ένα νέο έγγραφο δημιουργήθηκε εκ μέρους σας!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "Σας παραχωρήθηκε η ιδιοκτησία ενός νέου εγγράφου:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr "Αυτό το πεδίο είναι υποχρεωτικό."
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr "Η εμβέλεια συνδέσμου '%(link_reach)s' δεν επιτρέπεται βάσει της διαμόρφωσης του γονικού εγγράφου."
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "αντίγραφο του {title}"
|
||||
@@ -382,151 +382,151 @@ msgstr "Έγγραφο"
|
||||
msgid "Documents"
|
||||
msgstr "Έγγραφα"
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr "Έγγραφο χωρίς τίτλο"
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr "Άνοιγμα"
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "Ο/Η {name} μοιράστηκε ένα έγγραφο μαζί σας!"
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "Ο/Η {name} σας προσκάλεσε με τον ρόλο \"{role}\" στο ακόλουθο έγγραφο:"
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "Ο/Η {name} μοιράστηκε ένα έγγραφο μαζί σας: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Ίχνος συνδέσμου εγγράφου/χρήστη"
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Ίχνη συνδέσμου εγγράφου/χρήστη"
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "Ένα ίχνος συνδέσμου υπάρχει ήδη για αυτό το έγγραφο/χρήστη."
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr "Αγαπημένο έγγραφο"
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr "Αγαπημένα έγγραφα"
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "Αυτό το έγγραφο στοχεύεται ήδη από μια σχέση αγαπημένου για τον ίδιο χρήστη."
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr "Σχέση εγγράφου/χρήστη"
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr "Σχέσεις εγγράφου/χρήστη"
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Αυτός ο χρήστης συμμετέχει ήδη σε αυτό το έγγραφο."
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Αυτή η ομάδα συμμετέχει ήδη σε αυτό το έγγραφο."
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr "Πρέπει να οριστεί είτε χρήστης είτε ομάδα, όχι και τα δύο."
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr "Αίτημα πρόσβασης σε έγγραφο"
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr "Αιτήματα πρόσβασης σε έγγραφα"
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr "Αυτός ο χρήστης έχει ήδη ζητήσει πρόσβαση σε αυτό το έγγραφο."
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr "Ο/Η {name} θα ήθελε πρόσβαση σε ένα έγγραφο!"
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr "Ο/Η {name} θα ήθελε πρόσβαση στο ακόλουθο έγγραφο:"
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr "Ο/Η {name} ζητά πρόσβαση στο έγγραφο: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr "Νήμα"
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr "Νήματα"
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr "Ανώνυμος"
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr "Σχόλιο"
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr "Σχόλια"
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr "Αυτό το emoji έχει χρησιμοποιηθεί ήδη ως αντίδραση σε αυτό το σχόλιο."
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr "Αντίδραση"
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr "Αντιδράσεις"
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr "διεύθυνση email"
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr "Πρόσκληση σε έγγραφο"
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr "Προσκλήσεις εγγράφου"
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Αυτό το email σχετίζεται ήδη με έναν εγγεγραμμένο χρήστη."
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr "Τεχνητή Νοημοσύνη (AI) Docs"
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: English\n"
|
||||
"Language: en_US\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr ""
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr ""
|
||||
@@ -375,151 +375,151 @@ msgstr ""
|
||||
msgid "Documents"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Spanish\n"
|
||||
"Language: es_ES\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr "Información Personal"
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr "Permisos"
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr "Fechas importantes"
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr "Estructura en árbol"
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr "Enmascarado"
|
||||
msgid "Favorite"
|
||||
msgstr "Favorito"
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "¡Un nuevo documento se ha creado por ti!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "Se le ha concedido la propiedad de un nuevo documento :"
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "copia de {title}"
|
||||
@@ -375,151 +375,151 @@ msgstr "Documento"
|
||||
msgid "Documents"
|
||||
msgstr "Documentos"
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr "Documento sin título"
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr "Abrir"
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "¡{name} ha compartido un documento contigo!"
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "Te ha invitado {name} al siguiente documento con el rol \"{role}\" :"
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} ha compartido un documento contigo: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Traza del enlace de documento/usuario"
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Trazas del enlace de documento/usuario"
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "Ya existe una traza de enlace para este documento/usuario."
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr "Documento favorito"
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr "Documentos favoritos"
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "Este documento ya ha sido marcado como favorito por el usuario."
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr "Relación documento/usuario"
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr "Relaciones documento/usuario"
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Este usuario ya forma parte del documento."
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Este equipo ya forma parte del documento."
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr "Debe establecerse un usuario o un equipo, no ambos."
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr "Solicitud de acceso"
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr "Solicitud de accesos"
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr "Este usuario ya ha solicitado acceso a este documento."
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr "¡{name} desea acceder a un documento!"
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr "{name} desea acceso al siguiente documento:"
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr "{name} está pidiendo acceso al documento: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr "Thread"
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr "Threads"
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr "Anónimo"
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr "Comentario"
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr "Comentarios"
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr "Reacción"
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr "Reacciones"
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr "dirección de correo electrónico"
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr "Invitación al documento"
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr "Invitaciones a documentos"
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Este correo electrónico está asociado a un usuario registrado."
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr "Docs AI"
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: French\n"
|
||||
"Language: fr_FR\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr "Infos Personnelles"
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr "Permissions"
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr "Dates importantes"
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr "Tâche d'importation créée et mise en file d'attente."
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr "Traiter les rapprochements de l'utilisateur sélectionné"
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr "Arborescence"
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr "Masqué"
|
||||
msgid "Favorite"
|
||||
msgstr "Favoris"
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Un nouveau document a été créé pour vous !"
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "Vous avez été déclaré propriétaire d'un nouveau document :"
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr "Ce champ est obligatoire."
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr "La portée du lien '%(link_reach)s' n'est pas autorisée en fonction de la configuration du document parent."
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "copie de {title}"
|
||||
@@ -382,151 +382,151 @@ msgstr "Document"
|
||||
msgid "Documents"
|
||||
msgstr "Documents"
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr "Document sans titre"
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr "Ouvrir"
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} a partagé un document avec vous!"
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "{name} vous a invité avec le rôle \"{role}\" sur le document suivant :"
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} a partagé un document avec vous : {title}"
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Trace du lien document/utilisateur"
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Traces du lien document/utilisateur"
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "Une trace de lien existe déjà pour ce document/utilisateur."
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr "Document favori"
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr "Documents favoris"
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "Ce document est déjà un favori de cet utilisateur."
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr "Relation document/utilisateur"
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr "Relations document/utilisateur"
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Cet utilisateur est déjà dans ce document."
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Cette équipe est déjà dans ce document."
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr "L'utilisateur ou l'équipe doivent être définis, pas les deux."
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr "Demande d'accès au document"
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr "Demande d'accès au document"
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr "Cet utilisateur a déjà demandé l'accès à ce document."
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr "{name} souhaiterait accéder au document suivant !"
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr "{name} souhaiterait accéder au document suivant :"
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr "{name} demande l'accès au document : {title}"
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr "Conversation"
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr "Conversations"
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr "Anonyme"
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr "Commentaire"
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr "Commentaires"
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr "Cet émoji a déjà été réagi à ce commentaire."
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr "Réaction"
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr "Réactions"
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr "adresse e-mail"
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr "Invitation à un document"
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr "Invitations à un document"
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Cette adresse email est déjà associée à un utilisateur inscrit."
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr "Docs IA"
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Italian\n"
|
||||
"Language: it_IT\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr "Informazioni personali"
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr "Permessi"
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr "Date importanti"
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr "Struttura ad albero"
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr "Preferiti"
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Un nuovo documento è stato creato a tuo nome!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "Sei ora proprietario di un nuovo documento:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "copia di {title}"
|
||||
@@ -375,151 +375,151 @@ msgstr "Documento"
|
||||
msgid "Documents"
|
||||
msgstr "Documenti"
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr "Documento senza titolo"
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr "Apri"
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} ha condiviso un documento con te!"
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "{name} ti ha invitato con il ruolo \"{role}\" nel seguente documento:"
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} ha condiviso un documento con te: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr "Documento preferito"
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr "Documenti preferiti"
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Questo utente è già presente in questo documento."
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Questo team è già presente in questo documento."
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr "indirizzo e-mail"
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr "Invito al documento"
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr "Inviti al documento"
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Questa email è già associata a un utente registrato."
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Dutch\n"
|
||||
"Language: nl_NL\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr "Persoonlijke informatie"
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr "Machtigingen"
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr "Belangrijke data"
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr "Import taak gemaakt en in de wachtrij geplaatst."
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr "Verwerk geselecteerde gebruikers samenvoeging"
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr "Boomstructuur"
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr "Gemaskeerd"
|
||||
msgid "Favorite"
|
||||
msgstr "Favoriet"
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Een nieuw document is namens u gemaakt!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "U heeft eigenaarschap van een nieuw document gekregen:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr "Dit veld is verplicht."
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr "Link bereik '%(link_reach)s' is niet toegestaan op basis van bovenliggende documentconfiguratie."
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "kopie van {title}"
|
||||
@@ -382,151 +382,151 @@ msgstr "Document"
|
||||
msgid "Documents"
|
||||
msgstr "Documenten"
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr "Naamloos Document"
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr "Open"
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} heeft een document met u gedeeld!"
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "{name} heeft u uitgenodigd met de rol \"{role}\" op het volgende document:"
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} heeft een document met u gedeeld: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Document/gebruiker link"
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Document/gebruiker link"
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "Een link bestaat al voor dit document/deze gebruiker."
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr "Document favoriet"
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr "Document favorieten"
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "Dit document is al in gebruik als favoriet door dezelfde gebruiker."
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr "Document/gebruiker relatie"
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr "Document/gebruiker relaties"
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr "De gebruiker bestaat al in dit document."
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Dit team bestaat al in dit document."
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr "Een gebruiker of team moet gekozen worden, maar niet beide."
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr "Document verzoekt om toegang"
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr "Document verzoekt om toegangen"
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr "Deze gebruiker heeft al om toegang tot dit document gevraagd."
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr "{name} verzoekt toegang tot een document!"
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr "{name} verzoekt toegang tot het volgende document:"
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr "{name} verzoekt toegang tot het document: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr "Kanaal"
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr "Kanalen"
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr "Anoniem"
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr "Reactie"
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr "Reacties"
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr "Deze emoji is al op deze opmerking gereageerd."
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr "Reactie"
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr "Reacties"
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr "e-mailadres"
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr "Document uitnodiging"
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr "Document uitnodigingen"
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Deze email is al geassocieerd met een geregistreerde gebruiker."
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr "Docs AI"
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Portuguese\n"
|
||||
"Language: pt_PT\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr "Informações Pessoais"
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr "Permissões"
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr "Datas importantes"
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr "Estrutura de árvore"
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr "Favorito"
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Um novo documento foi criado em seu nome!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "A propriedade de um novo documento foi concedida a você:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "cópia de {title}"
|
||||
@@ -375,151 +375,151 @@ msgstr ""
|
||||
msgid "Documents"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr "Abrir"
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Russian\n"
|
||||
"Language: ru_RU\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr "Личная информация"
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr "Разрешения"
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr "Важные даты"
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr "Задание по импорту создано и поставлено в очередь."
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr "Обработка выбранных пользовательских сверок"
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr "Древовидная структура"
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr "Скрытый"
|
||||
msgid "Favorite"
|
||||
msgstr "Избранное"
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Новый документ был создан от вашего имени!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "Вы назначены владельцем для нового документа:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr "Это поле обязательное."
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr "Доступ по ссылке '%(link_reach)s' запрещён в соответствии с настройками родительского документа."
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "копия {title}"
|
||||
@@ -382,151 +382,151 @@ msgstr "Документ"
|
||||
msgid "Documents"
|
||||
msgstr "Документы"
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr "Безымянный документ"
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr "Открыть"
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} делится с вами документом!"
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "{name} приглашает вас присоединиться к следующему документу с ролью \"{role}\":"
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} делится с вами документом: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Трассировка связи документ/пользователь"
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Трассировка связей документ/пользователь"
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "Для этого документа/пользователя уже существует трассировка ссылки."
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr "Избранный документ"
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr "Избранные документы"
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "Этот документ уже помечен как избранный для этого пользователя."
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr "Отношение документ/пользователь"
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr "Отношения документ/пользователь"
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Этот пользователь уже имеет доступ к этому документу."
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Эта команда уже имеет доступ к этому документу."
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr "Может быть выбран либо пользователь, либо команда, но не оба варианта сразу."
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr "Документ запрашивает доступ"
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr "Документ запрашивает доступы"
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr "Этот пользователь уже запросил доступ к этому документу."
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr "{name} хочет получить доступ к документу!"
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr "{name} хочет получить доступ к следующему документу:"
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr "{name} запрашивает доступ к документу: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr "Обсуждение"
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr "Обсуждения"
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr "Аноним"
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr "Комментарий"
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr "Комментарии"
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr "Этот эмодзи уже использован в этом комментарии."
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr "Реакция"
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr "Реакции"
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr "адрес электронной почты"
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr "Приглашение для документа"
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr "Приглашения для документов"
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Этот адрес уже связан с зарегистрированным пользователем."
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr "Docs ИИ"
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Slovenian\n"
|
||||
"Language: sl_SI\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr "Osebni podatki"
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr "Dovoljenja"
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr "Pomembni datumi"
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr "Drevesna struktura"
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr "Priljubljena"
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Nov dokument je bil ustvarjen v vašem imenu!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "Dodeljeno vam je bilo lastništvo nad novim dokumentom:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr ""
|
||||
@@ -375,151 +375,151 @@ msgstr "Dokument"
|
||||
msgid "Documents"
|
||||
msgstr "Dokumenti"
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr "Dokument brez naslova"
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr "Odpri"
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} je delil dokument z vami!"
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "{name} vas je povabil z vlogo \"{role}\" na naslednjem dokumentu:"
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} je delil dokument z vami: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Dokument/sled povezave uporabnika"
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Sledi povezav dokumenta/uporabnika"
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "Za ta dokument/uporabnika že obstaja sled povezave."
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr "Priljubljeni dokument"
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr "Priljubljeni dokumenti"
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "Ta dokument je že ciljno usmerjen s priljubljenim primerkom relacije za istega uporabnika."
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr "Odnos dokument/uporabnik"
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr "Odnosi dokument/uporabnik"
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Ta uporabnik je že v tem dokumentu."
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Ta ekipa je že v tem dokumentu."
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr "Nastaviti je treba bodisi uporabnika ali ekipo, a ne obojega."
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr "elektronski naslov"
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr "Vabilo na dokument"
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr "Vabila na dokument"
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Ta e-poštni naslov je že povezan z registriranim uporabnikom."
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Swedish\n"
|
||||
"Language: sv_SE\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr "Personuppgifter"
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr "Behörigheter"
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr "Viktiga datum"
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr ""
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr "Favoriter"
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Ett nytt dokument skapades åt dig!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "Du har beviljats äganderätt till ett nytt dokument:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr ""
|
||||
@@ -375,151 +375,151 @@ msgstr ""
|
||||
msgid "Documents"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr "Öppna"
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr "e-postadress"
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr "Bjud in dokument"
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr "Inbjudningar dokument"
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Denna e-postadress är redan associerad med en registrerad användare."
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Turkish\n"
|
||||
"Language: tr_TR\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr ""
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr ""
|
||||
@@ -375,151 +375,151 @@ msgstr ""
|
||||
msgid "Documents"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Ukrainian\n"
|
||||
"Language: uk_UA\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr "Особисті дані"
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr "Дозволи"
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr "Важливі дати"
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr "Завдання імпорту створено і поставлено в чергу."
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr "Обробити обрані узгодження користувача"
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr "Ієрархічна структура"
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr "Приховано"
|
||||
msgid "Favorite"
|
||||
msgstr "Обране"
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Новий документ був створений від вашого імені!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "Ви тепер є власником нового документа:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr "Це поле є обов’язковим."
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr "Доступ до посилання '%(link_reach)s' заборонено на основі конфігурації батьківського документа."
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "копія {title}"
|
||||
@@ -382,151 +382,151 @@ msgstr "Документ"
|
||||
msgid "Documents"
|
||||
msgstr "Документи"
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr "Документ без назви"
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr "Відкрити"
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} ділиться з вами документом!"
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "{name} запрошує вас для роботи з документом із роллю \"{role}\":"
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} ділиться з вами документом: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Трасування посилання Документ/користувач"
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Трасування посилань Документ/користувач"
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "Відстеження вже існуючих посилань для цього документа/користувача."
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr "Обраний документ"
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr "Обрані документи"
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "Цей документ вже вказаний як обраний для одного користувача."
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr "Відносини документ/користувач"
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr "Відносини документ/користувач"
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Цей користувач вже має доступ до цього документу."
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Ця команда вже має доступ до цього документа."
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr "Вкажіть користувача або команду, а не обох."
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr "Запит доступу до документа"
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr "Запит доступу для документа"
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr "Цей користувач вже попросив доступ до цього документа."
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr "{name} хоче отримати доступ до документа!"
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr "{name} бажає отримати доступ до наступного документа:"
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr "{name} запитує доступ до документа: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr "Обговорення"
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr "Обговорення"
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr "Анонім"
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr "Коментар"
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr "Коментарі"
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr "Цим емодзі вже відреагували на цей коментар."
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr "Реакція"
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr "Реакції"
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr "електронна адреса"
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr "Запрошення до редагування документа"
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr "Запрошення до редагування документів"
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Ця електронна пошта вже пов'язана з зареєстрованим користувачем."
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr "Docs ШІ"
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-04-02 09:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-08 13:28\n"
|
||||
"POT-Creation-Date: 2026-04-30 12:37+0000\n"
|
||||
"PO-Revision-Date: 2026-04-30 13:05\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Chinese Simplified\n"
|
||||
"Language: zh_CN\n"
|
||||
@@ -17,28 +17,28 @@ msgstr ""
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:30 core/admin.py:30
|
||||
#: build/lib/core/admin.py:33 core/admin.py:33
|
||||
msgid "Personal info"
|
||||
msgstr "個人資訊"
|
||||
|
||||
#: build/lib/core/admin.py:43 build/lib/core/admin.py:161 core/admin.py:43
|
||||
#: core/admin.py:161
|
||||
#: build/lib/core/admin.py:46 build/lib/core/admin.py:166 core/admin.py:46
|
||||
#: core/admin.py:166
|
||||
msgid "Permissions"
|
||||
msgstr "權限"
|
||||
|
||||
#: build/lib/core/admin.py:55 core/admin.py:55
|
||||
#: build/lib/core/admin.py:58 core/admin.py:58
|
||||
msgid "Important dates"
|
||||
msgstr "重要日期"
|
||||
|
||||
#: build/lib/core/admin.py:112 core/admin.py:112
|
||||
#: build/lib/core/admin.py:117 core/admin.py:117
|
||||
msgid "Import job created and queued."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:116 core/admin.py:116
|
||||
#: build/lib/core/admin.py:121 core/admin.py:121
|
||||
msgid "Process selected user reconciliations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/admin.py:171 core/admin.py:171
|
||||
#: build/lib/core/admin.py:176 core/admin.py:176
|
||||
msgid "Tree structure"
|
||||
msgstr "樹狀結構"
|
||||
|
||||
@@ -62,24 +62,24 @@ msgstr "已隱藏"
|
||||
msgid "Favorite"
|
||||
msgstr "我的最愛"
|
||||
|
||||
#: build/lib/core/api/serializers.py:544 core/api/serializers.py:544
|
||||
#: build/lib/core/api/serializers.py:507 core/api/serializers.py:507
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "已代表您建立新文件!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548
|
||||
#: build/lib/core/api/serializers.py:511 core/api/serializers.py:511
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "您已獲得新文件的所有權:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:584 core/api/serializers.py:584
|
||||
#: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
|
||||
msgid "This field is required."
|
||||
msgstr "此欄位為必填。"
|
||||
|
||||
#: build/lib/core/api/serializers.py:595 core/api/serializers.py:595
|
||||
#: build/lib/core/api/serializers.py:558 core/api/serializers.py:558
|
||||
#, python-format
|
||||
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
|
||||
msgstr "根據父文件設定,不允許連結範圍「%(link_reach)s」。"
|
||||
|
||||
#: build/lib/core/api/viewsets.py:1312 core/api/viewsets.py:1312
|
||||
#: build/lib/core/api/viewsets.py:1299 core/api/viewsets.py:1299
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "{title} 的副本"
|
||||
@@ -375,151 +375,151 @@ msgstr "文件"
|
||||
msgid "Documents"
|
||||
msgstr "文件"
|
||||
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1345
|
||||
#: core/models.py:940 core/models.py:1345
|
||||
#: build/lib/core/models.py:940 build/lib/core/models.py:1347
|
||||
#: core/models.py:940 core/models.py:1347
|
||||
msgid "Untitled Document"
|
||||
msgstr "未命名文件"
|
||||
|
||||
#: build/lib/core/models.py:1346 core/models.py:1346
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Open"
|
||||
msgstr "開啟"
|
||||
|
||||
#: build/lib/core/models.py:1381 core/models.py:1381
|
||||
#: build/lib/core/models.py:1383 core/models.py:1383
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} 與您分享了一份文件!"
|
||||
|
||||
#: build/lib/core/models.py:1385 core/models.py:1385
|
||||
#: build/lib/core/models.py:1387 core/models.py:1387
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "{name} 邀請您以「{role}」角色參與以下文件:"
|
||||
|
||||
#: build/lib/core/models.py:1391 core/models.py:1391
|
||||
#: build/lib/core/models.py:1393 core/models.py:1393
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} 與您分享了一份文件:{title}"
|
||||
|
||||
#: build/lib/core/models.py:1492 core/models.py:1492
|
||||
#: build/lib/core/models.py:1494 core/models.py:1494
|
||||
msgid "Document/user link trace"
|
||||
msgstr "文件/使用者連結追蹤"
|
||||
|
||||
#: build/lib/core/models.py:1493 core/models.py:1493
|
||||
#: build/lib/core/models.py:1495 core/models.py:1495
|
||||
msgid "Document/user link traces"
|
||||
msgstr "文件/使用者連結追蹤"
|
||||
|
||||
#: build/lib/core/models.py:1499 core/models.py:1499
|
||||
#: build/lib/core/models.py:1501 core/models.py:1501
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "此文件/使用者已存在連結追蹤。"
|
||||
|
||||
#: build/lib/core/models.py:1522 core/models.py:1522
|
||||
#: build/lib/core/models.py:1524 core/models.py:1524
|
||||
msgid "Document favorite"
|
||||
msgstr "文件收藏"
|
||||
|
||||
#: build/lib/core/models.py:1523 core/models.py:1523
|
||||
#: build/lib/core/models.py:1525 core/models.py:1525
|
||||
msgid "Document favorites"
|
||||
msgstr "文件收藏"
|
||||
|
||||
#: build/lib/core/models.py:1529 core/models.py:1529
|
||||
#: build/lib/core/models.py:1531 core/models.py:1531
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "此使用者已將此文件加入收藏。"
|
||||
|
||||
#: build/lib/core/models.py:1551 core/models.py:1551
|
||||
#: build/lib/core/models.py:1553 core/models.py:1553
|
||||
msgid "Document/user relation"
|
||||
msgstr "文件/使用者關聯"
|
||||
|
||||
#: build/lib/core/models.py:1552 core/models.py:1552
|
||||
#: build/lib/core/models.py:1554 core/models.py:1554
|
||||
msgid "Document/user relations"
|
||||
msgstr "文件/使用者關聯"
|
||||
|
||||
#: build/lib/core/models.py:1558 core/models.py:1558
|
||||
#: build/lib/core/models.py:1560 core/models.py:1560
|
||||
msgid "This user is already in this document."
|
||||
msgstr "此使用者已在此文件中。"
|
||||
|
||||
#: build/lib/core/models.py:1564 core/models.py:1564
|
||||
#: build/lib/core/models.py:1566 core/models.py:1566
|
||||
msgid "This team is already in this document."
|
||||
msgstr "此團隊已在此文件中。"
|
||||
|
||||
#: build/lib/core/models.py:1570 core/models.py:1570
|
||||
#: build/lib/core/models.py:1572 core/models.py:1572
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr "必須設定使用者或團隊其中之一,不能同時設定兩者。"
|
||||
|
||||
#: build/lib/core/models.py:1721 core/models.py:1721
|
||||
#: build/lib/core/models.py:1723 core/models.py:1723
|
||||
msgid "Document ask for access"
|
||||
msgstr "要求文件存取權"
|
||||
|
||||
#: build/lib/core/models.py:1722 core/models.py:1722
|
||||
#: build/lib/core/models.py:1724 core/models.py:1724
|
||||
msgid "Document ask for accesses"
|
||||
msgstr "要求文件存取權"
|
||||
|
||||
#: build/lib/core/models.py:1728 core/models.py:1728
|
||||
#: build/lib/core/models.py:1730 core/models.py:1730
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr "此使用者已要求過存取此文件的權限。"
|
||||
|
||||
#: build/lib/core/models.py:1785 core/models.py:1785
|
||||
#: build/lib/core/models.py:1787 core/models.py:1787
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr "{name} 想要存取文件!"
|
||||
|
||||
#: build/lib/core/models.py:1789 core/models.py:1789
|
||||
#: build/lib/core/models.py:1791 core/models.py:1791
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr "{name} 想要存取以下文件:"
|
||||
|
||||
#: build/lib/core/models.py:1795 core/models.py:1795
|
||||
#: build/lib/core/models.py:1797 core/models.py:1797
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr "{name} 正要求存取文件:{title}"
|
||||
|
||||
#: build/lib/core/models.py:1837 core/models.py:1837
|
||||
#: build/lib/core/models.py:1839 core/models.py:1839
|
||||
msgid "Thread"
|
||||
msgstr "對話串"
|
||||
|
||||
#: build/lib/core/models.py:1838 core/models.py:1838
|
||||
#: build/lib/core/models.py:1840 core/models.py:1840
|
||||
msgid "Threads"
|
||||
msgstr "對話串"
|
||||
|
||||
#: build/lib/core/models.py:1841 build/lib/core/models.py:1893
|
||||
#: core/models.py:1841 core/models.py:1893
|
||||
#: build/lib/core/models.py:1843 build/lib/core/models.py:1895
|
||||
#: core/models.py:1843 core/models.py:1895
|
||||
msgid "Anonymous"
|
||||
msgstr "匿名"
|
||||
|
||||
#: build/lib/core/models.py:1888 core/models.py:1888
|
||||
#: build/lib/core/models.py:1890 core/models.py:1890
|
||||
msgid "Comment"
|
||||
msgstr "評論"
|
||||
|
||||
#: build/lib/core/models.py:1889 core/models.py:1889
|
||||
#: build/lib/core/models.py:1891 core/models.py:1891
|
||||
msgid "Comments"
|
||||
msgstr "評論"
|
||||
|
||||
#: build/lib/core/models.py:1938 core/models.py:1938
|
||||
#: build/lib/core/models.py:1940 core/models.py:1940
|
||||
msgid "This emoji has already been reacted to this comment."
|
||||
msgstr "此評論已標記過此表情符號。"
|
||||
|
||||
#: build/lib/core/models.py:1942 core/models.py:1942
|
||||
#: build/lib/core/models.py:1944 core/models.py:1944
|
||||
msgid "Reaction"
|
||||
msgstr "回應"
|
||||
|
||||
#: build/lib/core/models.py:1943 core/models.py:1943
|
||||
#: build/lib/core/models.py:1945 core/models.py:1945
|
||||
msgid "Reactions"
|
||||
msgstr "回應"
|
||||
|
||||
#: build/lib/core/models.py:1953 core/models.py:1953
|
||||
#: build/lib/core/models.py:1955 core/models.py:1955
|
||||
msgid "email address"
|
||||
msgstr "電子郵件地址"
|
||||
|
||||
#: build/lib/core/models.py:1972 core/models.py:1972
|
||||
#: build/lib/core/models.py:1974 core/models.py:1974
|
||||
msgid "Document invitation"
|
||||
msgstr "文件邀請"
|
||||
|
||||
#: build/lib/core/models.py:1973 core/models.py:1973
|
||||
#: build/lib/core/models.py:1975 core/models.py:1975
|
||||
msgid "Document invitations"
|
||||
msgstr "文件邀請"
|
||||
|
||||
#: build/lib/core/models.py:1993 core/models.py:1993
|
||||
#: build/lib/core/models.py:1995 core/models.py:1995
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "此電子郵件地址已與已註冊使用者關聯。"
|
||||
|
||||
#: build/lib/impress/settings.py:808 impress/settings.py:808
|
||||
#: build/lib/impress/settings.py:837 impress/settings.py:837
|
||||
msgid "Docs AI"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "impress"
|
||||
version = "4.8.6"
|
||||
version = "5.0.0"
|
||||
authors = [{ "name" = "DINUM", "email" = "dev@mail.numerique.gouv.fr" }]
|
||||
classifiers = [
|
||||
"Development Status :: 5 - Production/Stable",
|
||||
|
||||
@@ -688,25 +688,23 @@ test.describe('Doc Editor', () => {
|
||||
test('it checks interlink feature', async ({ page, browserName }) => {
|
||||
const [randomDoc] = await createDoc(page, 'doc-interlink', browserName, 1);
|
||||
|
||||
await verifyDocName(page, randomDoc);
|
||||
|
||||
const { name: docChild1 } = await createRootSubPage(
|
||||
page,
|
||||
browserName,
|
||||
'doc-interlink-child-1',
|
||||
);
|
||||
|
||||
await verifyDocName(page, docChild1);
|
||||
|
||||
const { name: docChild2 } = await createRootSubPage(
|
||||
page,
|
||||
browserName,
|
||||
'doc-interlink-child-2',
|
||||
);
|
||||
|
||||
await verifyDocName(page, docChild2);
|
||||
|
||||
const treeRow = await getTreeRow(page, docChild2);
|
||||
|
||||
// To let the time for the emoji-picker to load
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
await treeRow.locator('.--docs--doc-icon').click();
|
||||
await page.getByRole('button', { name: '😀' }).first().click();
|
||||
|
||||
|
||||
@@ -104,6 +104,9 @@ test.describe('Doc Header', () => {
|
||||
browserName,
|
||||
1,
|
||||
);
|
||||
|
||||
await writeInEditor({ page, text: 'Hello Content' });
|
||||
|
||||
await page.getByRole('button', { name: 'Share' }).click();
|
||||
await updateShareLink(page, 'Public', 'Editing');
|
||||
|
||||
@@ -116,7 +119,9 @@ test.describe('Doc Header', () => {
|
||||
docTitle,
|
||||
});
|
||||
|
||||
// Wait for other page to sync
|
||||
await expect(otherPage.getByText('Hello Content')).toBeVisible();
|
||||
|
||||
// Wait for other page to broadcast sync
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
await page.keyboard.press('Escape');
|
||||
@@ -124,9 +129,8 @@ test.describe('Doc Header', () => {
|
||||
await expect(elTitle).toBeVisible();
|
||||
await elTitle.fill('Hello World');
|
||||
await elTitle.blur();
|
||||
await verifyDocName(page, 'Hello World');
|
||||
|
||||
// Wait for other page to sync
|
||||
// Wait for other page to broadcast sync
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
// Check other user page
|
||||
@@ -144,6 +148,36 @@ test.describe('Doc Header', () => {
|
||||
await cleanup();
|
||||
});
|
||||
|
||||
test('it pastes plain text in the title without keeping formatting', async ({
|
||||
page,
|
||||
browserName,
|
||||
}) => {
|
||||
await createDoc(page, 'doc-title-paste', browserName, 1);
|
||||
|
||||
const docTitle = page.getByRole('textbox', { name: 'Document title' });
|
||||
await docTitle.click();
|
||||
await page.keyboard.press('Control+a');
|
||||
|
||||
await page.evaluate(() => {
|
||||
const el = document.querySelector('[aria-label="Document title"]');
|
||||
if (!el) {
|
||||
return;
|
||||
}
|
||||
|
||||
const dt = new DataTransfer();
|
||||
dt.setData('text/plain', 'Pasted plain text');
|
||||
dt.setData('text/html', '<b><em>Pasted plain text</em></b>');
|
||||
el.dispatchEvent(
|
||||
new ClipboardEvent('paste', { clipboardData: dt, bubbles: true }),
|
||||
);
|
||||
});
|
||||
|
||||
await docTitle.blur();
|
||||
await expect(docTitle).toHaveText('Pasted plain text');
|
||||
// Ensure formatting tags from text/html were not inserted.
|
||||
await expect(docTitle.locator('b, em, strong, i')).toHaveCount(0);
|
||||
});
|
||||
|
||||
test('it updates the title doc adding a leading emoji', async ({
|
||||
page,
|
||||
browserName,
|
||||
@@ -501,7 +535,7 @@ test.describe('Doc Header', () => {
|
||||
browserName === 'webkit',
|
||||
'navigator.clipboard is not working with webkit and playwright',
|
||||
);
|
||||
const uuid = await mockedDocument(page, {
|
||||
await mockedDocument(page, {
|
||||
abilities: {
|
||||
destroy: false, // Means owner
|
||||
link_configuration: true,
|
||||
@@ -522,7 +556,6 @@ test.describe('Doc Header', () => {
|
||||
name: 'Share',
|
||||
exact: true,
|
||||
});
|
||||
await expect(shareButton).toBeVisible();
|
||||
|
||||
await shareButton.click();
|
||||
await page.getByRole('button', { name: 'Copy link' }).click();
|
||||
@@ -533,8 +566,8 @@ test.describe('Doc Header', () => {
|
||||
);
|
||||
const clipboardContent = await handle.jsonValue();
|
||||
|
||||
const origin = await page.evaluate(() => window.location.origin);
|
||||
expect(clipboardContent.trim()).toMatch(`${origin}/docs/${uuid}/`);
|
||||
const url = page.url();
|
||||
expect(clipboardContent.trim()).toMatch(url);
|
||||
});
|
||||
|
||||
test('it pins a document', async ({ page, browserName }) => {
|
||||
|
||||
@@ -31,6 +31,8 @@ test.describe('Inherited share accesses', () => {
|
||||
.getByRole('link')
|
||||
.click();
|
||||
|
||||
await page.getByRole('button', { name: 'close' }).first().click();
|
||||
|
||||
await verifyDocName(page, parentTitle);
|
||||
});
|
||||
|
||||
|
||||
@@ -185,23 +185,23 @@ test.describe('Doc Version', () => {
|
||||
|
||||
await page.getByLabel('Restore', { exact: true }).click();
|
||||
|
||||
await page.waitForTimeout(500);
|
||||
const mainEditor = page.getByLabel('Document editor');
|
||||
|
||||
await expect(editor.getByText('Hello')).toBeVisible();
|
||||
await expect(editor.getByText('World')).toBeHidden();
|
||||
await expect(mainEditor.getByText('Hello')).toBeVisible();
|
||||
await expect(mainEditor.getByText('World')).toBeHidden();
|
||||
|
||||
// The old comment is not restored
|
||||
await expect(editor.getByText('Hello')).toHaveCSS(
|
||||
await expect(mainEditor.getByText('Hello')).toHaveCSS(
|
||||
'background-color',
|
||||
'rgba(0, 0, 0, 0)',
|
||||
);
|
||||
|
||||
// We can add a new comment
|
||||
await editor.getByText('Hello').selectText();
|
||||
await mainEditor.getByText('Hello').selectText();
|
||||
await page.getByRole('button', { name: 'Add comment' }).click();
|
||||
|
||||
await thread.getByRole('paragraph').first().fill('This is a comment');
|
||||
await thread.locator('[data-test="save"]').click();
|
||||
await expect(editor.getByText('Hello')).toHaveClass('bn-thread-mark');
|
||||
await expect(mainEditor.getByText('Hello')).toHaveClass('bn-thread-mark');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -153,7 +153,8 @@ test.describe('Help feature', () => {
|
||||
theme_customization: {
|
||||
onboarding: {
|
||||
enabled: true,
|
||||
learn_more_url: 'https://example.com/learn-more',
|
||||
learn_more_url: 'http://localhost:3000/learn-more',
|
||||
ready_template_url: 'http://localhost:3000/ready-template',
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -184,18 +185,19 @@ test.describe('Help feature', () => {
|
||||
'0',
|
||||
);
|
||||
|
||||
await page.getByTestId('onboarding-step-3').click();
|
||||
await expect(page.getByTestId('onboarding-step-3')).toHaveAttribute(
|
||||
'tabindex',
|
||||
'0',
|
||||
);
|
||||
const step3 = page.getByTestId('onboarding-step-3');
|
||||
await step3.click();
|
||||
await expect(step3).toHaveAttribute('tabindex', '0');
|
||||
await expect(
|
||||
step3.getByRole('link', { name: 'ready-made template' }),
|
||||
).toHaveAttribute('href', 'http://localhost:3000/ready-template');
|
||||
|
||||
const learnMoreLink = page.getByRole('link', {
|
||||
name: 'Learn more docs features',
|
||||
});
|
||||
await expect(learnMoreLink).toHaveAttribute(
|
||||
'href',
|
||||
'https://example.com/learn-more',
|
||||
'http://localhost:3000/learn-more',
|
||||
);
|
||||
await learnMoreLink.click();
|
||||
|
||||
@@ -241,6 +243,16 @@ test.describe('Help feature', () => {
|
||||
await expect(
|
||||
modal.getByRole('button', { name: /Suivant/i }),
|
||||
).toBeVisible();
|
||||
await modal
|
||||
.getByText(/Tirez parti de la bibliothèque de contenu/)
|
||||
.first()
|
||||
.click();
|
||||
await expect(
|
||||
modal.getByText(/Commencez à partir de/).first(),
|
||||
).toBeVisible();
|
||||
await expect(modal.getByRole('link')).toHaveText(
|
||||
"modèles prêts à l'emploi",
|
||||
);
|
||||
});
|
||||
|
||||
test('Modal is displayed automatically on first connection', async ({
|
||||
|
||||
@@ -131,42 +131,64 @@ export const createDoc = async (
|
||||
await openHeaderMenu(page);
|
||||
}
|
||||
|
||||
const responsePromiseCreateDoc = page.waitForResponse(
|
||||
(response) =>
|
||||
response.url().includes('/api/v1.0/documents/') &&
|
||||
response.status() === 201 &&
|
||||
response.request().method() === 'POST',
|
||||
);
|
||||
|
||||
await page
|
||||
.getByRole('button', {
|
||||
name: 'New doc',
|
||||
})
|
||||
.click();
|
||||
|
||||
await page.waitForURL('**/docs/**', {
|
||||
timeout: 10000,
|
||||
waitUntil: 'networkidle',
|
||||
});
|
||||
|
||||
const responseCreateDoc = await responsePromiseCreateDoc;
|
||||
expect(responseCreateDoc.ok()).toBeTruthy();
|
||||
const { id: docId } = (await responseCreateDoc.json()) as { id: string };
|
||||
|
||||
const responsePromiseUpdateDoc = page.waitForResponse(
|
||||
(response) =>
|
||||
response.url().includes(`/api/v1.0/documents/${docId}`) &&
|
||||
response.status() === 200 &&
|
||||
response.request().method() === 'PATCH',
|
||||
);
|
||||
|
||||
const input = page.getByLabel('Document title');
|
||||
await expect(input).toBeVisible({
|
||||
timeout: 10000,
|
||||
});
|
||||
await expect(input).toHaveText('');
|
||||
await expect(input).toHaveText('', {
|
||||
timeout: 10000,
|
||||
});
|
||||
|
||||
await input.fill(randomDocs[i]);
|
||||
await input.blur();
|
||||
void input.blur();
|
||||
|
||||
const responseUpdateDoc = await responsePromiseUpdateDoc;
|
||||
expect(responseUpdateDoc.ok()).toBeTruthy();
|
||||
}
|
||||
|
||||
return randomDocs;
|
||||
};
|
||||
|
||||
export const verifyDocName = async (page: Page, docName: string) => {
|
||||
await expect(
|
||||
page.getByLabel('It is the card information about the document.'),
|
||||
).toBeVisible({
|
||||
const card = page.getByLabel(
|
||||
'It is the card information about the document.',
|
||||
);
|
||||
await expect(card).toBeVisible({
|
||||
timeout: 10000,
|
||||
});
|
||||
|
||||
/*replace toHaveText with toContainText to handle cases where emojis or other characters might be added*/
|
||||
try {
|
||||
await expect(
|
||||
page.getByRole('textbox', { name: 'Document title' }),
|
||||
).toContainText(docName, {
|
||||
timeout: 3000,
|
||||
});
|
||||
} catch {
|
||||
await expect(page.getByRole('heading', { name: docName })).toBeVisible();
|
||||
}
|
||||
await expect(card).toHaveText(new RegExp(docName), {
|
||||
timeout: 10000,
|
||||
});
|
||||
};
|
||||
|
||||
export const getGridRow = async (page: Page, title: string) => {
|
||||
@@ -228,11 +250,9 @@ export const updateDocTitle = async (page: Page, title: string) => {
|
||||
const input = page.getByRole('textbox', { name: 'Document title' });
|
||||
await expect(input).toHaveText('');
|
||||
await expect(input).toBeVisible();
|
||||
await input.click();
|
||||
await input.fill(title, {
|
||||
force: true,
|
||||
});
|
||||
await input.click();
|
||||
await input.blur();
|
||||
await verifyDocName(page, title);
|
||||
};
|
||||
@@ -248,10 +268,11 @@ export const waitForResponseCreateDoc = (page: Page) => {
|
||||
|
||||
export const mockedDocument = async (page: Page, data: object) => {
|
||||
// document/[ID]/ or document/[ID]/tree/ routes
|
||||
const uuid = crypto.randomUUID();
|
||||
let uuid: string | undefined;
|
||||
await page.route(/.*\/documents\/[^/]+\/(?:$|tree\/.*)/, async (route) => {
|
||||
const request = route.request();
|
||||
if (request.method().includes('GET') && !request.url().includes('page=')) {
|
||||
uuid = request.url().match(/\/documents\/([^/]+)\//)?.[1];
|
||||
const { abilities, ...doc } = data as unknown as {
|
||||
abilities?: Record<string, unknown>;
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "app-e2e",
|
||||
"version": "4.8.6",
|
||||
"version": "5.0.0",
|
||||
"repository": "https://github.com/suitenumerique/docs",
|
||||
"author": "DINUM",
|
||||
"license": "MIT",
|
||||
@@ -15,7 +15,7 @@
|
||||
"test:ui::chromium": "yarn test:ui --project=chromium"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "1.58.2",
|
||||
"@playwright/test": "1.59.1",
|
||||
"@types/node": "*",
|
||||
"@types/pdf-parse": "1.1.5",
|
||||
"eslint-plugin-docs": "*",
|
||||
@@ -24,7 +24,7 @@
|
||||
"dependencies": {
|
||||
"@types/pngjs": "6.0.5",
|
||||
"convert-stream": "1.0.2",
|
||||
"dotenv": "17.3.1",
|
||||
"dotenv": "17.4.2",
|
||||
"pdf-parse": "2.4.5",
|
||||
"pixelmatch": "7.1.0",
|
||||
"pngjs": "7.0.0"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"target": "es2020",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "app-impress",
|
||||
"version": "4.8.6",
|
||||
"version": "5.0.0",
|
||||
"repository": "https://github.com/suitenumerique/docs",
|
||||
"author": "DINUM",
|
||||
"license": "MIT",
|
||||
@@ -23,59 +23,59 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@ag-media/react-pdf-table": "2.0.3",
|
||||
"@ai-sdk/openai": "3.0.47",
|
||||
"@blocknote/code-block": "0.47.3",
|
||||
"@blocknote/core": "0.47.3",
|
||||
"@blocknote/mantine": "0.47.3",
|
||||
"@blocknote/react": "0.47.3",
|
||||
"@blocknote/xl-ai": "0.47.3",
|
||||
"@blocknote/xl-docx-exporter": "0.47.3",
|
||||
"@blocknote/xl-multi-column": "0.47.3",
|
||||
"@blocknote/xl-odt-exporter": "0.47.3",
|
||||
"@blocknote/xl-pdf-exporter": "0.47.3",
|
||||
"@ai-sdk/openai": "3.0.53",
|
||||
"@blocknote/code-block": "0.49.0",
|
||||
"@blocknote/core": "0.49.0",
|
||||
"@blocknote/mantine": "0.49.0",
|
||||
"@blocknote/react": "0.49.0",
|
||||
"@blocknote/xl-ai": "0.49.0",
|
||||
"@blocknote/xl-docx-exporter": "0.49.0",
|
||||
"@blocknote/xl-multi-column": "0.49.0",
|
||||
"@blocknote/xl-odt-exporter": "0.49.0",
|
||||
"@blocknote/xl-pdf-exporter": "0.49.0",
|
||||
"@dnd-kit/core": "6.3.1",
|
||||
"@dnd-kit/modifiers": "9.0.0",
|
||||
"@emoji-mart/data": "1.2.1",
|
||||
"@emoji-mart/react": "1.1.1",
|
||||
"@fontsource-variable/inter": "5.2.8",
|
||||
"@fontsource-variable/material-symbols-outlined": "5.2.38",
|
||||
"@fontsource-variable/material-symbols-outlined": "5.2.42",
|
||||
"@fontsource/material-icons": "5.2.7",
|
||||
"@gouvfr-lasuite/cunningham-react": "4.2.0",
|
||||
"@gouvfr-lasuite/cunningham-react": "4.3.0",
|
||||
"@gouvfr-lasuite/integration": "1.0.3",
|
||||
"@gouvfr-lasuite/ui-kit": "0.19.10",
|
||||
"@gouvfr-lasuite/ui-kit": "0.20.1",
|
||||
"@hocuspocus/provider": "3.4.4",
|
||||
"@mantine/core": "8.3.18",
|
||||
"@mantine/hooks": "8.3.18",
|
||||
"@react-aria/live-announcer": "3.4.4",
|
||||
"@mantine/core": "9.0.2",
|
||||
"@mantine/hooks": "9.0.2",
|
||||
"@react-aria/live-announcer": "3.5.0",
|
||||
"@react-pdf/renderer": "4.3.1",
|
||||
"@sentry/nextjs": "10.45.0",
|
||||
"@tanstack/react-query": "5.95.0",
|
||||
"@sentry/nextjs": "10.49.0",
|
||||
"@tanstack/react-query": "5.99.2",
|
||||
"@tiptap/extensions": "*",
|
||||
"ai": "6.0.134",
|
||||
"ai": "6.0.168",
|
||||
"canvg": "4.0.3",
|
||||
"clsx": "2.1.1",
|
||||
"cmdk": "1.1.1",
|
||||
"crisp-sdk-web": "1.0.27",
|
||||
"crisp-sdk-web": "1.1.1",
|
||||
"emoji-datasource-apple": "16.0.0",
|
||||
"emoji-mart": "5.6.0",
|
||||
"emoji-regex": "10.6.0",
|
||||
"i18next": "25.10.4",
|
||||
"i18next": "26.0.6",
|
||||
"i18next-browser-languagedetector": "8.2.1",
|
||||
"idb": "8.0.3",
|
||||
"lodash": "4.18.1",
|
||||
"luxon": "3.7.2",
|
||||
"next": "16.2.3",
|
||||
"posthog-js": "1.363.1",
|
||||
"next": "16.2.4",
|
||||
"posthog-js": "1.369.4",
|
||||
"react": "*",
|
||||
"react-aria-components": "1.16.0",
|
||||
"react-aria-components": "1.17.0",
|
||||
"react-dom": "*",
|
||||
"react-dropzone": "15.0.0",
|
||||
"react-i18next": "16.6.1",
|
||||
"react-i18next": "17.0.4",
|
||||
"react-intersection-observer": "10.0.3",
|
||||
"react-resizable-panels": "3.0.6",
|
||||
"react-select": "5.10.2",
|
||||
"styled-components": "6.3.12",
|
||||
"use-debounce": "10.1.0",
|
||||
"styled-components": "6.4.0",
|
||||
"use-debounce": "10.1.1",
|
||||
"uuid": "14.0.0",
|
||||
"y-protocols": "1.0.7",
|
||||
"yjs": "*",
|
||||
@@ -84,7 +84,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@svgr/webpack": "8.1.0",
|
||||
"@tanstack/react-query-devtools": "5.95.0",
|
||||
"@tanstack/react-query-devtools": "5.99.2",
|
||||
"@testing-library/dom": "10.4.1",
|
||||
"@testing-library/jest-dom": "6.9.1",
|
||||
"@testing-library/react": "16.3.2",
|
||||
@@ -96,18 +96,18 @@
|
||||
"@types/react-dom": "*",
|
||||
"@vitejs/plugin-react": "6.0.1",
|
||||
"cross-env": "10.1.0",
|
||||
"dotenv": "17.3.1",
|
||||
"dotenv": "17.4.2",
|
||||
"eslint-plugin-docs": "*",
|
||||
"fetch-mock": "9.11.0",
|
||||
"jsdom": "29.0.1",
|
||||
"jsdom": "29.0.2",
|
||||
"node-fetch": "2.7.0",
|
||||
"prettier": "3.8.1",
|
||||
"prettier": "3.8.3",
|
||||
"stylelint": "16.26.1",
|
||||
"stylelint-config-standard": "39.0.1",
|
||||
"stylelint-prettier": "5.0.3",
|
||||
"typescript": "*",
|
||||
"vitest": "4.1.0",
|
||||
"webpack": "5.105.4",
|
||||
"vitest": "4.1.4",
|
||||
"webpack": "5.106.2",
|
||||
"workbox-webpack-plugin": "7.1.0"
|
||||
},
|
||||
"packageManager": "yarn@1.22.22"
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
import { Ref, forwardRef } from 'react';
|
||||
import { ComponentPropsWithRef, Ref, forwardRef } from 'react';
|
||||
import { css } from 'styled-components';
|
||||
|
||||
import { Box, BoxType } from './Box';
|
||||
import { Box, BoxProps } from './Box';
|
||||
|
||||
export type BoxButtonType = Omit<BoxType, 'ref'> & {
|
||||
disabled?: boolean;
|
||||
ref?: Ref<HTMLButtonElement>;
|
||||
};
|
||||
export type BoxButtonType = BoxProps &
|
||||
Omit<ComponentPropsWithRef<'button'>, keyof BoxProps | 'ref'> & {
|
||||
disabled?: boolean;
|
||||
ref?: Ref<HTMLButtonElement>;
|
||||
};
|
||||
|
||||
/**
|
||||
* Styleless button that extends the Box component.
|
||||
@@ -59,7 +60,7 @@ const BoxButton = forwardRef<HTMLButtonElement, BoxButtonType>(
|
||||
if (disabled) {
|
||||
return;
|
||||
}
|
||||
props.onClick?.(event as unknown as React.MouseEvent<HTMLDivElement>);
|
||||
props.onClick?.(event);
|
||||
}}
|
||||
/>
|
||||
);
|
||||
|
||||
@@ -34,9 +34,7 @@ export const TextStyled = styled(Box)<TextProps>`
|
||||
|
||||
const Text = forwardRef<HTMLElement, ComponentPropsWithRef<typeof TextStyled>>(
|
||||
(props, ref) => {
|
||||
return (
|
||||
<TextStyled ref={ref as React.Ref<HTMLDivElement>} as="span" {...props} />
|
||||
);
|
||||
return <TextStyled ref={ref} as="span" {...props} />;
|
||||
},
|
||||
);
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import {
|
||||
Button,
|
||||
ButtonProps,
|
||||
Modal,
|
||||
ModalProps,
|
||||
ModalDefaultVariantProps,
|
||||
ModalSize,
|
||||
} from '@gouvfr-lasuite/cunningham-react';
|
||||
import { ReactNode, useEffect } from 'react';
|
||||
@@ -20,7 +20,7 @@ export type AlertModalProps = {
|
||||
title: string;
|
||||
cancelLabel?: string;
|
||||
confirmLabel?: string;
|
||||
} & Partial<ModalProps>;
|
||||
} & Partial<ModalDefaultVariantProps>;
|
||||
|
||||
export const AlertModal = ({
|
||||
cancelLabel,
|
||||
|
||||
@@ -49,7 +49,7 @@ export const SideModal = ({
|
||||
return (
|
||||
<>
|
||||
<SideModalStyle width={width} side={side} $css={$css} />
|
||||
<Modal {...modalProps} size={ModalSize.FULL}>
|
||||
<Modal {...modalProps} size={ModalSize.FULL} variant="default">
|
||||
{children}
|
||||
</Modal>
|
||||
</>
|
||||
|
||||
@@ -28,6 +28,7 @@ interface ThemeCustomization {
|
||||
onboarding?: {
|
||||
enabled: true;
|
||||
learn_more_url?: string;
|
||||
ready_template_url?: string;
|
||||
};
|
||||
translations?: Resource;
|
||||
waffle?: WaffleType;
|
||||
|
||||
@@ -70,6 +70,7 @@
|
||||
|
||||
.c__modal__title {
|
||||
padding: 0;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.c__modal__footer {
|
||||
|
||||
@@ -361,7 +361,7 @@
|
||||
--c--globals--font--weights--medium: 500;
|
||||
--c--globals--font--weights--bold: 600;
|
||||
--c--globals--font--weights--extrabold: 800;
|
||||
--c--globals--font--weights--black: 900;
|
||||
--c--globals--font--weights--black: 800;
|
||||
--c--globals--font--families--base:
|
||||
inter variable, roboto flex variable, sans-serif;
|
||||
--c--globals--font--families--accent:
|
||||
@@ -849,6 +849,18 @@
|
||||
--c--components--forms-checkbox--font-size: var(
|
||||
--c--globals--font--sizes--sm
|
||||
);
|
||||
--c--components--forms-input--border-radius: 4px;
|
||||
--c--components--forms-input--border-radius--hover: 4px;
|
||||
--c--components--forms-input--border-radius--focus: 4px;
|
||||
--c--components--forms-select--border-radius: 4px;
|
||||
--c--components--forms-select--border-radius--hover: 4px;
|
||||
--c--components--forms-select--border-radius--focus: 4px;
|
||||
--c--components--forms-textarea--border-radius: 4px;
|
||||
--c--components--forms-textarea--border-radius--hover: 4px;
|
||||
--c--components--forms-textarea--border-radius--focus: 4px;
|
||||
--c--components--forms-datepicker--border-radius: 4px;
|
||||
--c--components--forms-datepicker--border-radius--hover: 4px;
|
||||
--c--components--forms-datepicker--border-radius--focus: 4px;
|
||||
--c--components--badge--font-size: var(--c--globals--font--sizes--xs);
|
||||
--c--components--badge--border-radius: 12px;
|
||||
--c--components--badge--padding-inline: var(--c--globals--spacings--xs);
|
||||
@@ -1731,7 +1743,6 @@
|
||||
--c--globals--font--sizes--xs-alt: 3rem;
|
||||
--c--globals--font--weights--thin: 100;
|
||||
--c--globals--font--weights--extrabold: 800;
|
||||
--c--globals--font--weights--black: 900;
|
||||
--c--globals--font--families--accent:
|
||||
marianne, inter variable, roboto flex variable, sans-serif;
|
||||
--c--globals--font--families--base:
|
||||
@@ -2539,6 +2550,18 @@
|
||||
--c--components--forms-checkbox--font-size: var(
|
||||
--c--globals--font--sizes--sm
|
||||
);
|
||||
--c--components--forms-input--border-radius: 4px;
|
||||
--c--components--forms-input--border-radius--hover: 4px;
|
||||
--c--components--forms-input--border-radius--focus: 4px;
|
||||
--c--components--forms-select--border-radius: 4px;
|
||||
--c--components--forms-select--border-radius--hover: 4px;
|
||||
--c--components--forms-select--border-radius--focus: 4px;
|
||||
--c--components--forms-textarea--border-radius: 4px;
|
||||
--c--components--forms-textarea--border-radius--hover: 4px;
|
||||
--c--components--forms-textarea--border-radius--focus: 4px;
|
||||
--c--components--forms-datepicker--border-radius: 4px;
|
||||
--c--components--forms-datepicker--border-radius--hover: 4px;
|
||||
--c--components--forms-datepicker--border-radius--focus: 4px;
|
||||
--c--components--badge--font-size: var(--c--globals--font--sizes--xs);
|
||||
--c--components--badge--border-radius: 12px;
|
||||
--c--components--badge--padding-inline: var(--c--globals--spacings--xs);
|
||||
|
||||
@@ -372,7 +372,7 @@ export const tokens = {
|
||||
medium: 500,
|
||||
bold: 600,
|
||||
extrabold: 800,
|
||||
black: 900,
|
||||
black: 800,
|
||||
},
|
||||
families: {
|
||||
base: 'Inter Variable, Roboto Flex Variable, sans-serif',
|
||||
@@ -664,6 +664,26 @@ export const tokens = {
|
||||
'body--background-color-hover': '#F0F0F3',
|
||||
},
|
||||
'forms-checkbox': { 'font-size': '0.875rem' },
|
||||
'forms-input': {
|
||||
'border-radius': '4px',
|
||||
'border-radius--hover': '4px',
|
||||
'border-radius--focus': '4px',
|
||||
},
|
||||
'forms-select': {
|
||||
'border-radius': '4px',
|
||||
'border-radius--hover': '4px',
|
||||
'border-radius--focus': '4px',
|
||||
},
|
||||
'forms-textarea': {
|
||||
'border-radius': '4px',
|
||||
'border-radius--hover': '4px',
|
||||
'border-radius--focus': '4px',
|
||||
},
|
||||
'forms-datepicker': {
|
||||
'border-radius': '4px',
|
||||
'border-radius--hover': '4px',
|
||||
'border-radius--focus': '4px',
|
||||
},
|
||||
badge: {
|
||||
'font-size': '0.75rem',
|
||||
'border-radius': '12px',
|
||||
@@ -1334,7 +1354,7 @@ export const tokens = {
|
||||
'sm-alt': '3.5rem',
|
||||
'xs-alt': '3rem',
|
||||
},
|
||||
weights: { thin: 100, extrabold: 800, black: 900 },
|
||||
weights: { thin: 100, extrabold: 800 },
|
||||
families: {
|
||||
accent:
|
||||
'Marianne, Inter Variable, Roboto Flex Variable, sans-serif',
|
||||
@@ -1948,6 +1968,26 @@ export const tokens = {
|
||||
'body--background-color-hover': '#F0F0F3',
|
||||
},
|
||||
'forms-checkbox': { 'font-size': '0.875rem' },
|
||||
'forms-input': {
|
||||
'border-radius': '4px',
|
||||
'border-radius--hover': '4px',
|
||||
'border-radius--focus': '4px',
|
||||
},
|
||||
'forms-select': {
|
||||
'border-radius': '4px',
|
||||
'border-radius--hover': '4px',
|
||||
'border-radius--focus': '4px',
|
||||
},
|
||||
'forms-textarea': {
|
||||
'border-radius': '4px',
|
||||
'border-radius--hover': '4px',
|
||||
'border-radius--focus': '4px',
|
||||
},
|
||||
'forms-datepicker': {
|
||||
'border-radius': '4px',
|
||||
'border-radius--hover': '4px',
|
||||
'border-radius--focus': '4px',
|
||||
},
|
||||
badge: {
|
||||
'font-size': '0.75rem',
|
||||
'border-radius': '12px',
|
||||
|
||||
@@ -35,7 +35,7 @@ const initialState: ThemeStore = {
|
||||
colorsTokens: defaultTokens.globals.colors,
|
||||
componentTokens: defaultTokens.components,
|
||||
contextualTokens: defaultTokens.contextuals,
|
||||
currentTokens: tokens.themes[DEFAULT_THEME] as Partial<Tokens>,
|
||||
currentTokens: tokens.themes[DEFAULT_THEME],
|
||||
fontSizesTokens: defaultTokens.globals.font.sizes,
|
||||
setTheme: () => {},
|
||||
spacingsTokens: defaultTokens.globals.spacings,
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
import React from 'react';
|
||||
import React, { ComponentPropsWithRef } from 'react';
|
||||
|
||||
import { Box, BoxType } from '@/components';
|
||||
import { Box, BoxProps } from '@/components';
|
||||
|
||||
type AvatarSvgProps = {
|
||||
initials: string;
|
||||
background: string;
|
||||
fontFamily?: string;
|
||||
} & BoxType;
|
||||
type AvatarSvgProps = BoxProps &
|
||||
Omit<ComponentPropsWithRef<'svg'>, keyof BoxProps> & {
|
||||
initials: string;
|
||||
background: string;
|
||||
fontFamily?: string;
|
||||
};
|
||||
|
||||
export const AvatarSvg: React.FC<AvatarSvgProps> = ({
|
||||
initials,
|
||||
|
||||
@@ -11,11 +11,15 @@ vi.mock('@/stores', () => ({
|
||||
useResponsiveStore: () => ({ isDesktop: false }),
|
||||
}));
|
||||
|
||||
vi.mock('@/features/skeletons', () => ({
|
||||
useSkeletonStore: () => ({
|
||||
setIsSkeletonVisible: vi.fn(),
|
||||
}),
|
||||
}));
|
||||
vi.mock('@/features/skeletons', async () => {
|
||||
const actual = await vi.importActual<any>('../../../skeletons');
|
||||
return {
|
||||
...actual,
|
||||
useSkeletonStore: () => ({
|
||||
setIsSkeletonVisible: vi.fn(),
|
||||
}),
|
||||
};
|
||||
});
|
||||
|
||||
vi.mock('../../doc-management', async () => {
|
||||
const actual = await vi.importActual<any>('../../doc-management');
|
||||
|
||||
@@ -15,7 +15,6 @@ import { useCreateBlockNote } from '@blocknote/react';
|
||||
import { HocuspocusProvider } from '@hocuspocus/provider';
|
||||
import { useEffect, useMemo, useRef } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { css } from 'styled-components';
|
||||
import type { Awareness } from 'y-protocols/awareness';
|
||||
import * as Y from 'yjs';
|
||||
|
||||
@@ -35,14 +34,14 @@ import {
|
||||
useUploadStatus,
|
||||
} from '../hook';
|
||||
import { useEditorStore } from '../stores';
|
||||
import { cssEditor } from '../styles';
|
||||
import { DocsEditorStyle } from '../styles';
|
||||
import { DocsBlockNoteEditor } from '../types';
|
||||
import { randomColor } from '../utils';
|
||||
|
||||
import BlockNoteAI from './AI';
|
||||
import { BlockNoteSuggestionMenu } from './BlockNoteSuggestionMenu';
|
||||
import { BlockNoteToolbar } from './BlockNoteToolBar/BlockNoteToolbar';
|
||||
import { cssComments, useComments } from './comments/';
|
||||
import { DocsCommentsStyle, useComments } from './comments/';
|
||||
import {
|
||||
AccessibleImageBlock,
|
||||
CalloutBlock,
|
||||
@@ -260,13 +259,12 @@ export const BlockNoteEditor = ({ doc, provider }: BlockNoteEditorProps) => {
|
||||
}, [setEditor, editor]);
|
||||
|
||||
return (
|
||||
<Box
|
||||
ref={refEditorContainer}
|
||||
$css={css`
|
||||
${cssEditor};
|
||||
${cssComments(showComments, currentUserAvatarUrl)}
|
||||
`}
|
||||
>
|
||||
<Box ref={refEditorContainer} $height="100%">
|
||||
<DocsEditorStyle />
|
||||
<DocsCommentsStyle
|
||||
canSeeComment={canSeeComment}
|
||||
currentUserAvatarUrl={currentUserAvatarUrl}
|
||||
/>
|
||||
{errorAttachment && (
|
||||
<Box $margin={{ bottom: 'big', top: 'none', horizontal: 'large' }}>
|
||||
<TextErrors
|
||||
@@ -350,12 +348,9 @@ export const BlockNoteReader = ({
|
||||
useHeadings(editor);
|
||||
|
||||
return (
|
||||
<Box
|
||||
$css={css`
|
||||
${cssEditor};
|
||||
${cssComments(false)}
|
||||
`}
|
||||
>
|
||||
<Box>
|
||||
<DocsEditorStyle />
|
||||
<DocsCommentsStyle canSeeComment={false} />
|
||||
<BlockNoteView
|
||||
className="--docs--main-editor"
|
||||
editor={editor}
|
||||
|
||||
@@ -1,37 +1,41 @@
|
||||
import clsx from 'clsx';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { PropsWithChildren, useEffect, useState } from 'react';
|
||||
import { css } from 'styled-components';
|
||||
|
||||
import { Box, Loading } from '@/components';
|
||||
import { Box } from '@/components';
|
||||
import { DocHeader } from '@/docs/doc-header/';
|
||||
import {
|
||||
Doc,
|
||||
LinkReach,
|
||||
getDocLinkReach,
|
||||
useCollaboration,
|
||||
useIsCollaborativeEditable,
|
||||
useProviderStore,
|
||||
} from '@/docs/doc-management';
|
||||
import { TableContent } from '@/docs/doc-table-content/';
|
||||
import { useAuth } from '@/features/auth/';
|
||||
import { useSkeletonStore } from '@/features/skeletons';
|
||||
import { SkeletonEditorCore, useSkeletonStore } from '@/features/skeletons';
|
||||
import { useSkeletonFadeOut } from '@/features/skeletons/hooks/useFadeOut';
|
||||
import { useAnalytics } from '@/libs';
|
||||
import { useResponsiveStore } from '@/stores';
|
||||
|
||||
import { useCollaboration } from '../hook/useCollaboration';
|
||||
|
||||
import { BlockNoteEditor, BlockNoteReader } from './BlockNoteEditor';
|
||||
|
||||
const DOCS_EDITOR_CLASS = '--docs--doc-editor';
|
||||
|
||||
interface DocEditorContainerProps {
|
||||
docHeader: React.ReactNode;
|
||||
docEditor: React.ReactNode;
|
||||
isDeletedDoc: boolean;
|
||||
readOnly: boolean;
|
||||
}
|
||||
|
||||
export const DocEditorContainer = ({
|
||||
children,
|
||||
docHeader,
|
||||
docEditor,
|
||||
isDeletedDoc,
|
||||
readOnly,
|
||||
}: DocEditorContainerProps) => {
|
||||
}: PropsWithChildren<DocEditorContainerProps>) => {
|
||||
const { isDesktop } = useResponsiveStore();
|
||||
|
||||
return (
|
||||
@@ -39,8 +43,8 @@ export const DocEditorContainer = ({
|
||||
<Box
|
||||
$maxWidth="868px"
|
||||
$width="100%"
|
||||
$height="100%"
|
||||
className="--docs--doc-editor"
|
||||
$flex="1"
|
||||
className={DOCS_EDITOR_CLASS}
|
||||
>
|
||||
<Box
|
||||
$padding={{ horizontal: isDesktop ? '54px' : 'base' }}
|
||||
@@ -66,7 +70,7 @@ export const DocEditorContainer = ({
|
||||
})}
|
||||
$height="100%"
|
||||
>
|
||||
{docEditor}
|
||||
{children}
|
||||
</Box>
|
||||
</Box>
|
||||
</Box>
|
||||
@@ -82,23 +86,19 @@ interface DocEditorProps {
|
||||
export const DocEditor = ({ doc }: DocEditorProps) => {
|
||||
useCollaboration(doc.id);
|
||||
const { isDesktop } = useResponsiveStore();
|
||||
const { provider, isReady } = useProviderStore();
|
||||
const { isEditable, isLoading } = useIsCollaborativeEditable(doc);
|
||||
const isDeletedDoc = !!doc.deleted_at;
|
||||
const readOnly =
|
||||
!doc.abilities.partial_update || !isEditable || isLoading || isDeletedDoc;
|
||||
const { setIsSkeletonVisible } = useSkeletonStore();
|
||||
const isProviderReady = isReady && provider;
|
||||
const { trackEvent } = useAnalytics();
|
||||
const [hasTracked, setHasTracked] = useState(false);
|
||||
const { authenticated } = useAuth();
|
||||
const isPublicDoc = getDocLinkReach(doc) === LinkReach.PUBLIC;
|
||||
const { setIsSkeletonVisible } = useSkeletonStore();
|
||||
|
||||
useEffect(() => {
|
||||
if (isProviderReady) {
|
||||
setIsSkeletonVisible(false);
|
||||
}
|
||||
}, [isProviderReady, setIsSkeletonVisible]);
|
||||
setIsSkeletonVisible(false);
|
||||
}, [setIsSkeletonVisible, doc.id]);
|
||||
|
||||
/**
|
||||
* Track doc view event only once per doc change
|
||||
@@ -124,30 +124,57 @@ export const DocEditor = ({ doc }: DocEditorProps) => {
|
||||
});
|
||||
}, [authenticated, hasTracked, isPublicDoc, trackEvent]);
|
||||
|
||||
if (!isProviderReady || provider?.configuration.name !== doc.id) {
|
||||
return <Loading />;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
{isDesktop && <TableContent />}
|
||||
{isDesktop && <TableContent selector={`.${DOCS_EDITOR_CLASS}`} />}
|
||||
<DocEditorContainer
|
||||
docHeader={<DocHeader doc={doc} />}
|
||||
docEditor={
|
||||
readOnly ? (
|
||||
<BlockNoteReader
|
||||
initialContent={provider.document.getXmlFragment(
|
||||
'document-store',
|
||||
)}
|
||||
docId={doc.id}
|
||||
/>
|
||||
) : (
|
||||
<BlockNoteEditor doc={doc} provider={provider} />
|
||||
)
|
||||
}
|
||||
isDeletedDoc={isDeletedDoc}
|
||||
readOnly={readOnly}
|
||||
/>
|
||||
>
|
||||
<DocCoreEditor doc={doc} readOnly={readOnly} />
|
||||
</DocEditorContainer>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
interface DocCoreEditorProps {
|
||||
doc: Doc;
|
||||
readOnly: boolean;
|
||||
}
|
||||
|
||||
export const DocCoreEditor = ({ doc, readOnly }: DocCoreEditorProps) => {
|
||||
useCollaboration(doc.id);
|
||||
const { provider, isReady } = useProviderStore();
|
||||
const isProviderReady = isReady && provider;
|
||||
const showContent = !!(
|
||||
isProviderReady && provider?.configuration.name === doc.id
|
||||
);
|
||||
const { skeletonVisible, isFadingOut } = useSkeletonFadeOut(showContent);
|
||||
|
||||
if (
|
||||
skeletonVisible ||
|
||||
!isProviderReady ||
|
||||
provider?.configuration.name !== doc.id
|
||||
) {
|
||||
return (
|
||||
<SkeletonEditorCore
|
||||
isFadingOut={isFadingOut}
|
||||
$css={css`
|
||||
padding-top: 0px;
|
||||
`}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
if (readOnly) {
|
||||
return (
|
||||
<BlockNoteReader
|
||||
initialContent={provider.document.getXmlFragment('document-store')}
|
||||
docId={doc.id}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
return <BlockNoteEditor doc={doc} provider={provider} />;
|
||||
};
|
||||
|
||||
@@ -67,7 +67,7 @@ export class DocsThreadStore extends ThreadStore {
|
||||
continue;
|
||||
}
|
||||
|
||||
const state = states.get(clientId) as
|
||||
const state:
|
||||
| {
|
||||
[DocsThreadStore.COMMENTS_PING]?: {
|
||||
at: number;
|
||||
@@ -76,7 +76,7 @@ export class DocsThreadStore extends ThreadStore {
|
||||
threadId: string;
|
||||
};
|
||||
}
|
||||
| undefined;
|
||||
| undefined = states.get(clientId);
|
||||
|
||||
const ping = state?.commentsPing;
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { css } from 'styled-components';
|
||||
import { createGlobalStyle, css } from 'styled-components';
|
||||
|
||||
export const cssComments = (
|
||||
canSeeComment: boolean,
|
||||
currentUserAvatarUrl?: string,
|
||||
) => css`
|
||||
& .--docs--main-editor,
|
||||
& .--docs--main-editor .ProseMirror {
|
||||
export const DocsCommentsStyle = createGlobalStyle<{
|
||||
canSeeComment: boolean;
|
||||
currentUserAvatarUrl?: string;
|
||||
}>`
|
||||
.--docs--main-editor.bn-root,
|
||||
.--docs--main-editor.bn-root .ProseMirror {
|
||||
// Comments marks in the editor
|
||||
.bn-editor {
|
||||
// Resets blocknote comments styles
|
||||
@@ -14,30 +14,31 @@ export const cssComments = (
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
${canSeeComment &&
|
||||
css`
|
||||
.bn-thread-mark:not([data-orphan='true']) {
|
||||
background-color: color-mix(
|
||||
in srgb,
|
||||
var(--c--contextuals--background--palette--yellow--tertiary) 40%,
|
||||
transparent
|
||||
);
|
||||
border-bottom: 2px solid
|
||||
var(--c--contextuals--background--palette--yellow--secondary);
|
||||
|
||||
mix-blend-mode: multiply;
|
||||
|
||||
transition:
|
||||
background-color var(--c--globals--transitions--duration),
|
||||
border-bottom-color var(--c--globals--transitions--duration);
|
||||
|
||||
&:has(.bn-thread-mark-selected) {
|
||||
background-color: var(
|
||||
--c--contextuals--background--palette--yellow--tertiary
|
||||
${({ canSeeComment }) =>
|
||||
canSeeComment &&
|
||||
css`
|
||||
.bn-thread-mark:not([data-orphan='true']) {
|
||||
background-color: color-mix(
|
||||
in srgb,
|
||||
var(--c--contextuals--background--palette--yellow--tertiary) 40%,
|
||||
transparent
|
||||
);
|
||||
border-bottom: 2px solid
|
||||
var(--c--contextuals--background--palette--yellow--secondary);
|
||||
|
||||
mix-blend-mode: multiply;
|
||||
|
||||
transition:
|
||||
background-color var(--c--globals--transitions--duration),
|
||||
border-bottom-color var(--c--globals--transitions--duration);
|
||||
|
||||
&:has(.bn-thread-mark-selected) {
|
||||
background-color: var(
|
||||
--c--contextuals--background--palette--yellow--tertiary
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
`}
|
||||
`}
|
||||
|
||||
[data-show-selection] {
|
||||
color: HighlightText;
|
||||
@@ -82,6 +83,8 @@ export const cssComments = (
|
||||
|
||||
.bn-thread-comment {
|
||||
padding: 8px;
|
||||
flex-wrap: nowrap;
|
||||
gap: 0px;
|
||||
|
||||
& .bn-editor {
|
||||
padding-left: var(--c--globals--spacings--lg);
|
||||
@@ -105,10 +108,14 @@ export const cssComments = (
|
||||
|
||||
// Top bar (Name / Date / Actions) when actions displayed
|
||||
&:has(.bn-comment-actions) {
|
||||
& > .mantine-Group-root {
|
||||
max-width: 70%;
|
||||
& > .mantine-Group-root:first-child {
|
||||
right: 0.3rem !important;
|
||||
top: 0.3rem !important;
|
||||
background: linear-gradient(
|
||||
to left,
|
||||
#fff 90%,
|
||||
rgba(255, 255, 255, 0) 100%
|
||||
);
|
||||
}
|
||||
|
||||
.bn-menu-dropdown {
|
||||
@@ -124,7 +131,6 @@ export const cssComments = (
|
||||
|
||||
// Date
|
||||
span.mantine-focus-auto {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.bn-comment-actions {
|
||||
@@ -150,7 +156,8 @@ export const cssComments = (
|
||||
}
|
||||
|
||||
// Actions button edit comment
|
||||
.bn-container + .bn-comment-actions-wrapper {
|
||||
.bn-root + .bn-comment-actions-wrapper {
|
||||
margin-top: var(--c--globals--spacings--2xs);
|
||||
.bn-comment-actions {
|
||||
flex-direction: row-reverse;
|
||||
background: none;
|
||||
@@ -201,9 +208,8 @@ export const cssComments = (
|
||||
width: 26px;
|
||||
height: 26px;
|
||||
flex: 0 0 26px;
|
||||
background-image: ${currentUserAvatarUrl
|
||||
? `url("${currentUserAvatarUrl}")`
|
||||
: 'none'};
|
||||
background-image: ${({ currentUserAvatarUrl }) =>
|
||||
currentUserAvatarUrl ? `url("${currentUserAvatarUrl}")` : 'none'};
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
|
||||
@@ -41,7 +41,7 @@ export const LinkSelected = ({
|
||||
const router = useRouter();
|
||||
const href = `/docs/${docId}/`;
|
||||
|
||||
const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {
|
||||
const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
|
||||
e.preventDefault();
|
||||
|
||||
// If ctrl or command is pressed, it opens a new tab. If shift is pressed, it opens a new window
|
||||
@@ -53,7 +53,7 @@ export const LinkSelected = ({
|
||||
};
|
||||
|
||||
// This triggers on middle-mouse click
|
||||
const handleAuxClick = (e: React.MouseEvent<HTMLDivElement>) => {
|
||||
const handleAuxClick = (e: React.MouseEvent<HTMLButtonElement>) => {
|
||||
if (e.button !== 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,13 @@ const withMultiColumnNoDropHandler = <
|
||||
});
|
||||
};
|
||||
|
||||
let modulesXL = undefined;
|
||||
type ModulesXL =
|
||||
| (Omit<typeof XLMultiColumn, 'withMultiColumn'> & {
|
||||
withMultiColumn: typeof withMultiColumnNoDropHandler;
|
||||
})
|
||||
| undefined;
|
||||
|
||||
let modulesXL: ModulesXL = undefined;
|
||||
if (process.env.NEXT_PUBLIC_PUBLISH_AS_MIT === 'false') {
|
||||
modulesXL = {
|
||||
...XLMultiColumn,
|
||||
@@ -47,10 +53,4 @@ if (process.env.NEXT_PUBLIC_PUBLISH_AS_MIT === 'false') {
|
||||
};
|
||||
}
|
||||
|
||||
type ModulesXL =
|
||||
| (Omit<typeof XLMultiColumn, 'withMultiColumn'> & {
|
||||
withMultiColumn: typeof withMultiColumnNoDropHandler;
|
||||
})
|
||||
| undefined;
|
||||
|
||||
export default modulesXL as ModulesXL;
|
||||
export default modulesXL;
|
||||
|
||||
@@ -2,6 +2,7 @@ import { useQueryClient } from '@tanstack/react-query';
|
||||
import { useEffect } from 'react';
|
||||
|
||||
import { useCollaborationUrl } from '@/core/config';
|
||||
import { KEY_DOC } from '@/docs/doc-management/api/useDoc';
|
||||
import {
|
||||
KEY_DOC_CONTENT,
|
||||
useDocContent,
|
||||
@@ -10,13 +11,15 @@ import { useProviderStore } from '@/docs/doc-management/stores/useProviderStore'
|
||||
import { useIsOffline } from '@/features/service-worker/hooks/useOffline';
|
||||
import { useBroadcastStore } from '@/stores/useBroadcastStore';
|
||||
|
||||
import { KEY_DOC } from '../api';
|
||||
|
||||
export const useCollaboration = (room: string) => {
|
||||
const collaborationUrl = useCollaborationUrl(room);
|
||||
const { addTask } = useBroadcastStore();
|
||||
const queryClient = useQueryClient();
|
||||
const { setBroadcastProvider, cleanupBroadcast } = useBroadcastStore();
|
||||
const {
|
||||
setBroadcastProvider,
|
||||
cleanupBroadcast,
|
||||
provider: broadcastProvider,
|
||||
} = useBroadcastStore();
|
||||
const {
|
||||
provider,
|
||||
createProvider,
|
||||
@@ -65,7 +68,7 @@ export const useCollaboration = (room: string) => {
|
||||
* when the document visibility changes.
|
||||
*/
|
||||
useEffect(() => {
|
||||
if (!room || !isReady) {
|
||||
if (!room || broadcastProvider?.document?.guid !== room) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -74,7 +77,7 @@ export const useCollaboration = (room: string) => {
|
||||
queryKey: [KEY_DOC, { id: room }],
|
||||
});
|
||||
});
|
||||
}, [addTask, room, queryClient, isReady]);
|
||||
}, [addTask, room, queryClient, broadcastProvider?.document?.guid]);
|
||||
|
||||
/**
|
||||
* Set the provider when the collaboration URL and the document content are available.
|
||||
@@ -1,266 +1,306 @@
|
||||
import { css } from 'styled-components';
|
||||
import { createGlobalStyle } from 'styled-components';
|
||||
|
||||
export const cssEditor = css`
|
||||
.mantine-Menu-itemLabel,
|
||||
.mantine-Button-label {
|
||||
font-family: var(--c--components--button--font-family);
|
||||
}
|
||||
|
||||
&,
|
||||
& > .bn-container,
|
||||
& .ProseMirror {
|
||||
export const DocsEditorStyle = createGlobalStyle`
|
||||
.bn-root {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Token Mantime
|
||||
*/
|
||||
& > .bn-container {
|
||||
.bn-editor {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.mantine-Menu-itemLabel,
|
||||
.mantine-Button-label {
|
||||
font-family: var(--c--components--button--font-family);
|
||||
}
|
||||
|
||||
/**
|
||||
* Token Mantine
|
||||
*/
|
||||
--bn-colors-editor-text: var(
|
||||
--c--contextuals--content--semantic--neutral--primary
|
||||
);
|
||||
--bn-colors-side-menu: var(
|
||||
--c--contextuals--content--semantic--neutral--tertiary
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure long placeholder text is truncated with ellipsis
|
||||
*/
|
||||
.bn-block-content[data-is-empty-and-focused][data-content-type='paragraph']
|
||||
.bn-inline-content:has(> .ProseMirror-trailingBreak:only-child)::before {
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
width: inherit;
|
||||
height: inherit;
|
||||
}
|
||||
.bn-block-content[data-is-empty-and-focused][data-content-type='paragraph']
|
||||
.bn-inline-content:has(> .ProseMirror-trailingBreak:only-child) {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure images with unsafe URLs are not interactive
|
||||
*/
|
||||
img.bn-visual-media[src*='-unsafe'] {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Collaboration cursor styles
|
||||
*/
|
||||
.collaboration-cursor-custom__base {
|
||||
position: relative;
|
||||
}
|
||||
.collaboration-cursor-custom__caret {
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
width: 2px;
|
||||
bottom: 4%;
|
||||
left: -1px;
|
||||
}
|
||||
.collaboration-cursor-custom__label {
|
||||
color: #0d0d0d;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
user-select: none;
|
||||
position: absolute;
|
||||
top: -17px;
|
||||
left: 0px;
|
||||
padding: 0px 6px;
|
||||
border-radius: 0px;
|
||||
white-space: nowrap;
|
||||
transition: clip-path 0.3s ease-in-out;
|
||||
border-radius: 4px 4px 4px 0;
|
||||
box-shadow: inset -2px 2px 6px #ffffff00;
|
||||
clip-path: polygon(0 85%, 4% 85%, 4% 100%, 0% 100%);
|
||||
}
|
||||
.collaboration-cursor-custom__base[data-active]
|
||||
.collaboration-cursor-custom__label {
|
||||
pointer-events: none;
|
||||
box-shadow: inset -2px 2px 6px #ffffff88;
|
||||
clip-path: polygon(0 0, 100% 0%, 100% 100%, 0% 100%);
|
||||
}
|
||||
|
||||
/**
|
||||
* Side menu
|
||||
*/
|
||||
.bn-side-menu[data-block-type='heading'][data-level='1'] {
|
||||
height: 54px;
|
||||
}
|
||||
.bn-side-menu[data-block-type='heading'][data-level='2'] {
|
||||
height: 43px;
|
||||
}
|
||||
.bn-side-menu[data-block-type='heading'][data-level='3'] {
|
||||
height: 35px;
|
||||
}
|
||||
.bn-side-menu[data-block-type='divider'] {
|
||||
height: 38px;
|
||||
}
|
||||
.bn-side-menu .mantine-UnstyledButton-root svg {
|
||||
color: var(
|
||||
--c--contextuals--content--semantic--neutral--tertiary
|
||||
) !important;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callout, Paragraph and Heading blocks
|
||||
*/
|
||||
.bn-block {
|
||||
border-radius: var(--c--globals--spacings--3xs);
|
||||
}
|
||||
.bn-block-outer {
|
||||
border-radius: var(--c--globals--spacings--3xs);
|
||||
}
|
||||
.bn-block > .bn-block-content[data-background-color] {
|
||||
padding: var(--c--globals--spacings--3xs) var(--c--globals--spacings--3xs);
|
||||
border-radius: var(--c--globals--spacings--3xs);
|
||||
}
|
||||
.bn-block-content[data-content-type='checkListItem'][data-checked='true']
|
||||
.bn-inline-content {
|
||||
text-decoration: none;
|
||||
}
|
||||
.bn-default-styles h1 {
|
||||
font-size: 1.875rem;
|
||||
}
|
||||
.bn-default-styles h2 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
.bn-default-styles h3 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
a {
|
||||
color: var(--c--globals--colors--gray-600);
|
||||
cursor: pointer;
|
||||
}
|
||||
.bn-block-group
|
||||
.bn-block-group
|
||||
.bn-block-outer:not([data-prev-depth-changed]):before {
|
||||
border-left: none;
|
||||
}
|
||||
|
||||
.bn-toolbar {
|
||||
max-width: 95vw;
|
||||
}
|
||||
|
||||
/**
|
||||
* Quotes
|
||||
*/
|
||||
blockquote {
|
||||
border-left: 4px solid var(--c--globals--colors--gray-300);
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/**
|
||||
* AI
|
||||
/**
|
||||
* Ensure long placeholder text is truncated with ellipsis
|
||||
*/
|
||||
ins,
|
||||
[data-type='modification'] {
|
||||
background: var(--c--globals--colors--brand-100);
|
||||
border-bottom: 2px solid var(--c--globals--colors--brand-300);
|
||||
color: var(--c--globals--colors--brand-700);
|
||||
}
|
||||
|
||||
/**
|
||||
* Divider
|
||||
*/
|
||||
[data-content-type='divider'] hr {
|
||||
background: #d3d2cf;
|
||||
margin: 1rem 0;
|
||||
width: 100%;
|
||||
border: 1px solid #d3d2cf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checklist items
|
||||
*/
|
||||
.bn-block-content[data-content-type='checkListItem'] > div > input {
|
||||
appearance: none;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border: 2px solid
|
||||
var(--c--contextuals--content--semantic--neutral--tertiary);
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
align-self: center;
|
||||
margin-top: 2px;
|
||||
}
|
||||
.bn-block-content[data-content-type='checkListItem'] > div > input:checked {
|
||||
background-color: var(--c--contextuals--content--semantic--brand--tertiary);
|
||||
border-color: var(--c--contextuals--content--semantic--brand--tertiary);
|
||||
}
|
||||
.bn-block-content[data-content-type='checkListItem']
|
||||
> div
|
||||
> input:checked::after {
|
||||
content: 'check';
|
||||
font-family: 'Material Symbols Outlined Variable', sans-serif;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
color: var(--c--contextuals--content--semantic--overlay--primary);
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure consistent spacing between headings and paragraphs
|
||||
*/
|
||||
& .bn-block-outer:not(:first-child) {
|
||||
&:has(h1) {
|
||||
margin-top: 32px;
|
||||
}
|
||||
&:has(h2) {
|
||||
margin-top: 24px;
|
||||
}
|
||||
&:has(h3) {
|
||||
margin-top: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
& .bn-inline-content code {
|
||||
background-color: gainsboro;
|
||||
padding: 2px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
@media screen and (width <= 768px) {
|
||||
& .bn-editor {
|
||||
padding-right: 36px;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (width <= 560px) {
|
||||
.--docs--doc-readonly & .bn-editor {
|
||||
padding-left: 10px;
|
||||
}
|
||||
& .bn-editor {
|
||||
padding-right: 10px;
|
||||
}
|
||||
.bn-side-menu[data-block-type='heading'][data-level='1'] {
|
||||
height: 46px;
|
||||
}
|
||||
.bn-side-menu[data-block-type='heading'][data-level='2'] {
|
||||
height: 40px;
|
||||
}
|
||||
.bn-side-menu[data-block-type='heading'][data-level='3'] {
|
||||
height: 40px;
|
||||
}
|
||||
& .bn-editor h1 {
|
||||
font-size: 1.6rem;
|
||||
}
|
||||
& .bn-editor h2 {
|
||||
font-size: 1.35rem;
|
||||
}
|
||||
& .bn-editor h3 {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
.bn-block-content[data-is-empty-and-focused][data-content-type='paragraph']
|
||||
.bn-inline-content:has(> .ProseMirror-trailingBreak:only-child)::before {
|
||||
font-size: 14px;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
width: inherit;
|
||||
height: inherit;
|
||||
}
|
||||
.bn-block-content[data-is-empty-and-focused][data-content-type='paragraph']
|
||||
.bn-inline-content:has(> .ProseMirror-trailingBreak:only-child) {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure images with unsafe URLs are not interactive
|
||||
*/
|
||||
img.bn-visual-media[src*='-unsafe'] {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Collaboration cursor styles
|
||||
*/
|
||||
.collaboration-cursor-custom__base {
|
||||
position: relative;
|
||||
}
|
||||
.collaboration-cursor-custom__caret {
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
width: 2px;
|
||||
bottom: 4%;
|
||||
left: -1px;
|
||||
}
|
||||
.collaboration-cursor-custom__label {
|
||||
color: #0d0d0d;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
user-select: none;
|
||||
position: absolute;
|
||||
top: -17px;
|
||||
left: 0px;
|
||||
padding: 0px 6px;
|
||||
border-radius: 0px;
|
||||
white-space: nowrap;
|
||||
transition: clip-path 0.3s ease-in-out;
|
||||
border-radius: 4px 4px 4px 0;
|
||||
box-shadow: inset -2px 2px 6px #ffffff00;
|
||||
clip-path: polygon(0 85%, 4% 85%, 4% 100%, 0% 100%);
|
||||
}
|
||||
.collaboration-cursor-custom__base[data-active]
|
||||
.collaboration-cursor-custom__label {
|
||||
pointer-events: none;
|
||||
box-shadow: inset -2px 2px 6px #ffffff88;
|
||||
clip-path: polygon(0 0, 100% 0%, 100% 100%, 0% 100%);
|
||||
}
|
||||
|
||||
/**
|
||||
* Side menu
|
||||
*/
|
||||
.bn-side-menu .mantine-UnstyledButton-root svg {
|
||||
color: var(
|
||||
--c--contextuals--content--semantic--neutral--tertiary
|
||||
) !important;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callout, Paragraph and Heading blocks
|
||||
*/
|
||||
.bn-block {
|
||||
border-radius: var(--c--globals--spacings--3xs);
|
||||
}
|
||||
.bn-block-outer {
|
||||
border-radius: var(--c--globals--spacings--3xs);
|
||||
}
|
||||
.bn-block > .bn-block-content[data-background-color] {
|
||||
padding: var(--c--globals--spacings--3xs) var(--c--globals--spacings--3xs);
|
||||
border-radius: var(--c--globals--spacings--3xs);
|
||||
}
|
||||
.bn-block-content[data-content-type='checkListItem'][data-checked='true']
|
||||
.bn-inline-content {
|
||||
text-decoration: none;
|
||||
}
|
||||
a {
|
||||
color: var(--c--globals--colors--gray-600);
|
||||
cursor: pointer;
|
||||
}
|
||||
.bn-block-group
|
||||
.bn-block-group
|
||||
.bn-block-outer:not([data-prev-depth-changed]):before {
|
||||
border-left: none;
|
||||
}
|
||||
|
||||
.bn-toolbar {
|
||||
max-width: 95vw;
|
||||
}
|
||||
|
||||
/**
|
||||
* Quotes
|
||||
*/
|
||||
blockquote {
|
||||
border-left: 4px solid var(--c--globals--colors--gray-300);
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/**
|
||||
* AI
|
||||
*/
|
||||
ins,
|
||||
[data-type='modification'] {
|
||||
background: var(--c--globals--colors--brand-100);
|
||||
border-bottom: 2px solid var(--c--globals--colors--brand-300);
|
||||
color: var(--c--globals--colors--brand-700);
|
||||
}
|
||||
|
||||
/**
|
||||
* Divider
|
||||
*/
|
||||
[data-content-type='divider'] hr {
|
||||
background: #d3d2cf;
|
||||
margin: 1rem 0;
|
||||
width: 100%;
|
||||
border: 1px solid #d3d2cf;
|
||||
}
|
||||
.bn-side-menu[data-block-type='divider'] {
|
||||
height: 38px;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checklist items
|
||||
*/
|
||||
.bn-block-content[data-content-type='checkListItem'] > div > input {
|
||||
appearance: none;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border: 2px solid
|
||||
var(--c--contextuals--content--semantic--neutral--tertiary);
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
align-self: center;
|
||||
margin-top: 2px;
|
||||
}
|
||||
.bn-block-content[data-content-type='checkListItem'] > div > input:checked {
|
||||
background-color: var(--c--contextuals--content--semantic--brand--tertiary);
|
||||
border-color: var(--c--contextuals--content--semantic--brand--tertiary);
|
||||
}
|
||||
.bn-block-content[data-content-type='checkListItem']
|
||||
> div
|
||||
> input:checked::after {
|
||||
content: 'check';
|
||||
font-family: 'Material Symbols Outlined Variable', sans-serif;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
color: var(--c--contextuals--content--semantic--overlay--primary);
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
/**
|
||||
* Headings
|
||||
* Ensure consistent spacing between headings and paragraphs
|
||||
*/
|
||||
[data-content-type='heading'] {
|
||||
--level: 1.875rem;
|
||||
&[data-level='2'] {
|
||||
--level: 1.5rem;
|
||||
}
|
||||
&[data-level='3'] {
|
||||
--level: 1.25rem;
|
||||
}
|
||||
&[data-level='4'] {
|
||||
--level: 1.125rem;
|
||||
}
|
||||
&[data-level='5'] {
|
||||
--level: 1rem;
|
||||
}
|
||||
&[data-level='6'] {
|
||||
--level: 0.875rem;
|
||||
}
|
||||
}
|
||||
.bn-side-menu[data-block-type='heading'][data-level='1'] {
|
||||
height: 54px;
|
||||
}
|
||||
.bn-side-menu[data-block-type='heading'][data-level='2'] {
|
||||
height: 43px;
|
||||
}
|
||||
.bn-side-menu[data-block-type='heading'][data-level='3'] {
|
||||
height: 35px;
|
||||
}
|
||||
& .bn-default-styles h1 {
|
||||
font-size: 1.875rem;
|
||||
}
|
||||
& .bn-default-styles h2 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
& .bn-default-styles h3 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
& .bn-default-styles h4 {
|
||||
font-size: 1.125rem;
|
||||
}
|
||||
& .bn-default-styles h5 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
& .bn-default-styles h6 {
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
& .bn-block-outer:not(:first-child) {
|
||||
&:has(h1) {
|
||||
margin-top: 32px;
|
||||
}
|
||||
&:has(h2) {
|
||||
margin-top: 24px;
|
||||
}
|
||||
&:has(h3) {
|
||||
margin-top: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
& .bn-inline-content code {
|
||||
background-color: gainsboro;
|
||||
padding: 2px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
@media screen and (width <= 768px) {
|
||||
& .bn-editor {
|
||||
padding-right: 36px;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (width <= 560px) {
|
||||
.--docs--doc-readonly & .bn-editor {
|
||||
padding-left: 10px;
|
||||
}
|
||||
& .bn-editor {
|
||||
padding-right: 10px;
|
||||
}
|
||||
.bn-side-menu[data-block-type='heading'][data-level='1'] {
|
||||
height: 46px;
|
||||
}
|
||||
.bn-side-menu[data-block-type='heading'][data-level='2'] {
|
||||
height: 40px;
|
||||
}
|
||||
.bn-side-menu[data-block-type='heading'][data-level='3'] {
|
||||
height: 40px;
|
||||
}
|
||||
[data-content-type='heading'] {
|
||||
--level: 1.6rem;
|
||||
&[data-level='2'] {
|
||||
--level: 1.35rem;
|
||||
}
|
||||
&[data-level='3'] {
|
||||
--level: 1.2rem;
|
||||
}
|
||||
&[data-level='4'] {
|
||||
--level: 1.125rem;
|
||||
}
|
||||
&[data-level='5'] {
|
||||
--level: 1rem;
|
||||
}
|
||||
&[data-level='6'] {
|
||||
--level: 0.875rem;
|
||||
}
|
||||
}
|
||||
& .bn-editor h1 {
|
||||
font-size: 1.6rem;
|
||||
}
|
||||
.bn-block-content[data-is-empty-and-focused][data-content-type='paragraph']
|
||||
.bn-inline-content:has(> .ProseMirror-trailingBreak:only-child)::before {
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -11,7 +11,7 @@ import {
|
||||
useToastProvider,
|
||||
} from '@gouvfr-lasuite/cunningham-react';
|
||||
import { DocumentProps, pdf } from '@react-pdf/renderer';
|
||||
import jsonemoji from 'emoji-datasource-apple' assert { type: 'json' };
|
||||
import jsonemoji from 'emoji-datasource-apple' with { type: 'json' };
|
||||
import i18next from 'i18next';
|
||||
import JSZip from 'jszip';
|
||||
import { cloneElement, isValidElement, useState } from 'react';
|
||||
|
||||
@@ -16,6 +16,4 @@ if (process.env.NEXT_PUBLIC_PUBLISH_AS_MIT === 'false') {
|
||||
};
|
||||
}
|
||||
|
||||
type ModulesExport = typeof modulesExport;
|
||||
|
||||
export default modulesExport as ModulesExport;
|
||||
export default modulesExport;
|
||||
|
||||
@@ -84,7 +84,7 @@ const PRINT_ONLY_CONTENT_CSS = `
|
||||
|
||||
/* Ensure BlockNote content flows properly */
|
||||
.bn-editor,
|
||||
.bn-container,
|
||||
.bn-root,
|
||||
.--docs--main-editor,
|
||||
.bn-block-outer {
|
||||
height: auto !important;
|
||||
|
||||
@@ -68,7 +68,7 @@ export const BoutonShare = ({
|
||||
/>
|
||||
}
|
||||
onClick={(e) => {
|
||||
addLastFocus(e.currentTarget as HTMLElement);
|
||||
addLastFocus(e.currentTarget);
|
||||
open();
|
||||
}}
|
||||
size="medium"
|
||||
@@ -85,7 +85,7 @@ export const BoutonShare = ({
|
||||
color="brand"
|
||||
variant="tertiary"
|
||||
onClick={(e) => {
|
||||
addLastFocus(e.currentTarget as HTMLElement);
|
||||
addLastFocus(e.currentTarget);
|
||||
open();
|
||||
}}
|
||||
size="medium"
|
||||
|
||||
@@ -153,6 +153,40 @@ const DocTitleInput = ({ doc }: DocTitleProps) => {
|
||||
}
|
||||
};
|
||||
|
||||
const insertPlainText = (plainText: string, target: HTMLElement) => {
|
||||
const selection = window.getSelection();
|
||||
if (!selection || selection.rangeCount === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const range = selection.getRangeAt(0);
|
||||
if (!target.contains(range.commonAncestorContainer)) {
|
||||
target.focus();
|
||||
range.selectNodeContents(target);
|
||||
range.collapse(false);
|
||||
selection.removeAllRanges();
|
||||
selection.addRange(range);
|
||||
}
|
||||
range.deleteContents();
|
||||
range.insertNode(document.createTextNode(plainText));
|
||||
};
|
||||
|
||||
const handlePaste = (event: React.ClipboardEvent<HTMLSpanElement>) => {
|
||||
event.preventDefault();
|
||||
insertPlainText(
|
||||
event.clipboardData.getData('text/plain'),
|
||||
event.currentTarget,
|
||||
);
|
||||
};
|
||||
|
||||
const handleDrop = (event: React.DragEvent<HTMLSpanElement>) => {
|
||||
event.preventDefault();
|
||||
insertPlainText(
|
||||
event.dataTransfer.getData('text/plain'),
|
||||
event.currentTarget,
|
||||
);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
setTitleDisplay(isTopRoot ? doc.title : titleWithoutEmoji);
|
||||
}, [doc.title, isTopRoot, titleWithoutEmoji]);
|
||||
@@ -181,6 +215,8 @@ const DocTitleInput = ({ doc }: DocTitleProps) => {
|
||||
onBlurCapture={(event) =>
|
||||
handleTitleSubmit(event.target.textContent || '')
|
||||
}
|
||||
onPasteCapture={handlePaste}
|
||||
onDropCapture={handleDrop}
|
||||
$padding={{ right: 'big' }}
|
||||
$css={css`
|
||||
&[contenteditable='true']:empty:not(:focus):before {
|
||||
|
||||
@@ -244,7 +244,7 @@ export const DocToolBox = ({ doc }: DocToolBoxProps) => {
|
||||
<Icon iconName="download" $color="inherit" aria-hidden={true} />
|
||||
}
|
||||
onClick={(e) => {
|
||||
addLastFocus(e.currentTarget as HTMLElement);
|
||||
addLastFocus(e.currentTarget);
|
||||
setIsModalExportOpen(true);
|
||||
}}
|
||||
size={isSmallMobile ? 'small' : 'medium'}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
export * from './useCollaboration';
|
||||
export * from './useCopyDocLink';
|
||||
export * from './useCreateChildDocTree';
|
||||
export * from './useDocTitleUpdate';
|
||||
|
||||
@@ -14,7 +14,7 @@ import { MAIN_LAYOUT_ID } from '@/layouts/conf';
|
||||
|
||||
import { Heading } from './Heading';
|
||||
|
||||
export const TableContent = () => {
|
||||
export const TableContent = ({ selector }: { selector: string }) => {
|
||||
const { spacingsTokens, colorsTokens } = useCunninghamTheme();
|
||||
const [containerHeight, setContainerHeight] = useState('100vh');
|
||||
const { headings } = useHeadingStore();
|
||||
@@ -27,11 +27,29 @@ export const TableContent = () => {
|
||||
* Calculate container height based on the scrollable content
|
||||
*/
|
||||
useEffect(() => {
|
||||
const mainLayout = document.getElementById(MAIN_LAYOUT_ID);
|
||||
if (mainLayout) {
|
||||
setContainerHeight(`${mainLayout.scrollHeight}px`);
|
||||
const layout = document.querySelector<HTMLElement>(selector);
|
||||
if (!layout) {
|
||||
return;
|
||||
}
|
||||
}, []);
|
||||
|
||||
let timeout: ReturnType<typeof setTimeout>;
|
||||
const updateHeight = () => {
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(() => {
|
||||
setContainerHeight(`${layout.scrollHeight}px`);
|
||||
}, 300);
|
||||
};
|
||||
|
||||
updateHeight();
|
||||
|
||||
const observer = new ResizeObserver(updateHeight);
|
||||
observer.observe(layout);
|
||||
|
||||
return () => {
|
||||
clearTimeout(timeout);
|
||||
observer.disconnect();
|
||||
};
|
||||
}, [selector]);
|
||||
|
||||
const onOpen = () => {
|
||||
setIsOpen(true);
|
||||
|
||||
@@ -274,11 +274,16 @@ export const DocTree = ({ currentDoc }: DocTreeProps) => {
|
||||
/* Remove outline from TreeViewItem wrapper elements */
|
||||
.c__tree-view--row {
|
||||
outline: none !important;
|
||||
pointer-events: initial;
|
||||
&:focus-visible {
|
||||
outline: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
.c__tree-view--node {
|
||||
pointer-events: inherit;
|
||||
}
|
||||
|
||||
.c__tree-view--container {
|
||||
z-index: 1;
|
||||
margin-top: -10px;
|
||||
|
||||
@@ -85,15 +85,14 @@ export const DocVersionEditor = ({
|
||||
return (
|
||||
<DocEditorContainer
|
||||
docHeader={<DocVersionHeader />}
|
||||
docEditor={
|
||||
<BlockNoteReader
|
||||
initialContent={initialContent}
|
||||
docId={version.id}
|
||||
isMainEditor={false}
|
||||
/>
|
||||
}
|
||||
isDeletedDoc={false}
|
||||
readOnly={true}
|
||||
/>
|
||||
>
|
||||
<BlockNoteReader
|
||||
initialContent={initialContent}
|
||||
docId={version.id}
|
||||
isMainEditor={false}
|
||||
/>
|
||||
</DocEditorContainer>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -50,7 +50,7 @@ export const DocsGridItemSharedButton = ({ doc, disabled }: Props) => {
|
||||
onClick={(event) => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
addLastFocus(event.currentTarget as HTMLElement);
|
||||
addLastFocus(event.currentTarget);
|
||||
shareModal.open();
|
||||
}}
|
||||
color="brand"
|
||||
|
||||
@@ -109,6 +109,7 @@ export const useImport = ({ onDragOver }: UseImportProps) => {
|
||||
});
|
||||
},
|
||||
noClick: true,
|
||||
noKeyboard: true,
|
||||
});
|
||||
const { mutate: importDoc, isPending } = useImportDoc();
|
||||
|
||||
|
||||
@@ -2,7 +2,9 @@ import {
|
||||
ModalSize,
|
||||
OnboardingModal,
|
||||
type OnboardingModalProps,
|
||||
OnboardingStep,
|
||||
} from '@gouvfr-lasuite/ui-kit';
|
||||
import React, { ReactNode } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { createGlobalStyle } from 'styled-components';
|
||||
|
||||
@@ -10,9 +12,29 @@ import { useConfig } from '@/core/config/api/useConfig';
|
||||
|
||||
import { useOnboardingSteps } from '../hooks/useOnboardingSteps';
|
||||
|
||||
/**
|
||||
* typing was not correct on ui-kit side for the description prop of OnboardingStep,
|
||||
* it can be a string or a ReactNode but was typed as string only, so we need to override the
|
||||
* type here to be able to use ReactNode
|
||||
*/
|
||||
type OnboardingStepFixed = Omit<OnboardingStep, 'description'> & {
|
||||
description?: ReactNode;
|
||||
};
|
||||
|
||||
type OnboardingModalPropsFixed = Omit<OnboardingModalProps, 'steps'> & {
|
||||
steps?: OnboardingStepFixed[];
|
||||
};
|
||||
|
||||
const OnboardingModalFixed =
|
||||
OnboardingModal as React.ComponentType<OnboardingModalPropsFixed>;
|
||||
|
||||
const OnBoardingStyle = createGlobalStyle`
|
||||
.c__onboarding-modal__steps{
|
||||
height: auto;
|
||||
|
||||
& a{
|
||||
color:inherit;
|
||||
}
|
||||
}
|
||||
.c__onboarding-modal__content {
|
||||
height: 350px;
|
||||
@@ -32,7 +54,7 @@ const OnBoardingStyle = createGlobalStyle`
|
||||
*:not(.material-icons):not(.material-icons-filled):not(
|
||||
.material-symbols-outlined
|
||||
) {
|
||||
font-family: Marianne, Inter, Roboto Flex Variable, sans-serif;
|
||||
font-family: var(--c--globals--font--families--base);
|
||||
}
|
||||
|
||||
/* Separator between content and footer actions/link */
|
||||
@@ -56,6 +78,10 @@ const OnBoardingStyle = createGlobalStyle`
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
a{
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
& .c__onboarding-modal__body{
|
||||
justify-content: center;
|
||||
}
|
||||
@@ -81,7 +107,7 @@ export const OnBoarding = (props: OnBoardingProps) => {
|
||||
return (
|
||||
<>
|
||||
{props.isOpen ? <OnBoardingStyle /> : null}
|
||||
<OnboardingModal
|
||||
<OnboardingModalFixed
|
||||
size={ModalSize.LARGE}
|
||||
appName={t('Discover Docs')}
|
||||
mainTitle={t('Learn the core principles')}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { type OnboardingStep } from '@gouvfr-lasuite/ui-kit';
|
||||
import Image from 'next/image';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Trans, useTranslation } from 'react-i18next';
|
||||
|
||||
import { useConfig } from '@/core';
|
||||
import { useCunninghamTheme } from '@/cunningham';
|
||||
|
||||
import DragIndicatorIcon from '../assets/drag_indicator.svg';
|
||||
@@ -16,6 +17,9 @@ export interface OnboardingStepsData {
|
||||
|
||||
export const useOnboardingSteps = () => {
|
||||
const { t } = useTranslation();
|
||||
const { data: config } = useConfig();
|
||||
const readyTemplateUrl =
|
||||
config?.theme_customization?.onboarding?.ready_template_url;
|
||||
const { contextualTokens, colorsTokens } = useCunninghamTheme();
|
||||
const activeColor =
|
||||
contextualTokens.content.semantic.brand.tertiary ??
|
||||
@@ -122,8 +126,21 @@ export const useOnboardingSteps = () => {
|
||||
</OnboardingStepIcon>
|
||||
),
|
||||
title: t('Draw inspiration from the content library'),
|
||||
description: t(
|
||||
'Start from ready-made templates for common use cases, then customize them to match your workflow in minutes.',
|
||||
description: (
|
||||
<Trans
|
||||
t={t}
|
||||
i18nKey="Start from <Link>ready-made templates</Link> for common use cases, then customize them to match your workflow in minutes."
|
||||
components={{
|
||||
Link: (
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href={readyTemplateUrl}
|
||||
aria-label={t('Ready-made templates (opens in a new tab)')}
|
||||
/>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
),
|
||||
content: (
|
||||
<Image
|
||||
|
||||
@@ -50,7 +50,7 @@ export class RequestSerializer {
|
||||
|
||||
public static arrayBufferToString(buffer: ArrayBufferLike) {
|
||||
const decoder = new TextDecoder();
|
||||
return decoder.decode(buffer as ArrayBuffer);
|
||||
return decoder.decode(buffer);
|
||||
}
|
||||
|
||||
public static arrayBufferToJson<T>(buffer: ArrayBufferLike) {
|
||||
|
||||
@@ -15,7 +15,7 @@ const mockServiceWorkerScope = {
|
||||
(global as any).self = {
|
||||
...global,
|
||||
clients: mockServiceWorkerScope.clients,
|
||||
} as unknown as ServiceWorkerGlobalScope;
|
||||
};
|
||||
|
||||
describe('OfflinePlugin', () => {
|
||||
afterEach(() => vi.clearAllMocks());
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
import { Box } from '@/components';
|
||||
import { css, keyframes } from 'styled-components';
|
||||
|
||||
import { Box, BoxType } from '@/components';
|
||||
import { useCunninghamTheme } from '@/cunningham';
|
||||
import { useResponsiveStore } from '@/stores';
|
||||
|
||||
import { SkeletonCircle, SkeletonLine } from './SkeletionUI';
|
||||
|
||||
export const DocEditorSkeleton = () => {
|
||||
const { isDesktop } = useResponsiveStore();
|
||||
const { spacingsTokens } = useCunninghamTheme();
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* Main Editor Container */}
|
||||
@@ -17,80 +16,117 @@ export const DocEditorSkeleton = () => {
|
||||
$height="100%"
|
||||
className="--docs--doc-editor-skeleton"
|
||||
>
|
||||
{/* Header Skeleton */}
|
||||
<Box
|
||||
$padding={{ horizontal: isDesktop ? '70px' : 'base' }}
|
||||
className="--docs--doc-editor-header-skeleton"
|
||||
>
|
||||
<Box
|
||||
$width="100%"
|
||||
$padding={{ top: isDesktop ? '65px' : 'md' }}
|
||||
$gap={spacingsTokens['base']}
|
||||
>
|
||||
<Box
|
||||
$direction="row"
|
||||
$align="center"
|
||||
$width="100%"
|
||||
$padding={{ bottom: 'xs' }}
|
||||
>
|
||||
<Box
|
||||
$direction="row"
|
||||
$justify="space-between"
|
||||
$css="flex:1;"
|
||||
$gap="0.5rem 1rem"
|
||||
$align="center"
|
||||
$maxWidth="100%"
|
||||
>
|
||||
{/* Title and metadata skeleton */}
|
||||
<Box $gap="0.25rem" $css="flex:1;">
|
||||
{/* Title - "Untitled Document" style */}
|
||||
<SkeletonLine $width="35%" $height="40px" />
|
||||
|
||||
{/* Metadata (role and last update) */}
|
||||
<Box $direction="row" $gap="0.5rem" $align="center">
|
||||
<SkeletonLine $maxWidth="260px" $height="12px" />
|
||||
</Box>
|
||||
</Box>
|
||||
|
||||
{/* Toolbox skeleton (buttons) */}
|
||||
<Box $direction="row" $gap="0.75rem" $align="center">
|
||||
{/* Share button */}
|
||||
<SkeletonLine $width="90px" $height="40px" />
|
||||
{/* Download icon */}
|
||||
<SkeletonCircle $width="40px" $height="40px" />
|
||||
{/* Menu icon */}
|
||||
<SkeletonCircle $width="40px" $height="40px" />
|
||||
</Box>
|
||||
</Box>
|
||||
</Box>
|
||||
|
||||
{/* Separator */}
|
||||
<SkeletonLine $height="1px" />
|
||||
</Box>
|
||||
</Box>
|
||||
|
||||
{/* Content Skeleton */}
|
||||
<Box
|
||||
$direction="row"
|
||||
$width="100%"
|
||||
$css="overflow-x: clip; flex: 1;"
|
||||
$position="relative"
|
||||
className="--docs--doc-editor-content-skeleton"
|
||||
>
|
||||
<Box
|
||||
$css="flex:1;"
|
||||
$position="relative"
|
||||
$width="100%"
|
||||
$padding={{ horizontal: isDesktop ? '70px' : 'base', top: 'lg' }}
|
||||
>
|
||||
{/* Placeholder text similar to screenshot */}
|
||||
<Box $gap="0rem">
|
||||
{/* Single placeholder line like in the screenshot */}
|
||||
<SkeletonLine $width="85%" $height="20px" />
|
||||
</Box>
|
||||
</Box>
|
||||
</Box>
|
||||
<SkeletonEditorHeader />
|
||||
<SkeletonEditorCore />
|
||||
</Box>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
const SkeletonEditorHeader = () => {
|
||||
const { isDesktop } = useResponsiveStore();
|
||||
const { spacingsTokens } = useCunninghamTheme();
|
||||
|
||||
return (
|
||||
<Box
|
||||
$padding={{ horizontal: isDesktop ? '54px' : 'base' }}
|
||||
className="--docs--doc-editor-header-skeleton"
|
||||
>
|
||||
<Box
|
||||
$width="100%"
|
||||
$padding={{ top: isDesktop ? '65px' : 'md' }}
|
||||
$gap={spacingsTokens['base']}
|
||||
>
|
||||
<Box
|
||||
$direction="row"
|
||||
$align="center"
|
||||
$width="100%"
|
||||
$padding={{ bottom: 'xs' }}
|
||||
>
|
||||
<Box
|
||||
$direction="row"
|
||||
$justify="space-between"
|
||||
$css="flex:1;"
|
||||
$gap="0.5rem 1rem"
|
||||
$align="center"
|
||||
$maxWidth="100%"
|
||||
>
|
||||
{/* Title and metadata skeleton */}
|
||||
<Box $gap="0.25rem" $css="flex:1;">
|
||||
{/* Title - "Untitled Document" style */}
|
||||
<SkeletonLine $width="35%" $height="40px" />
|
||||
|
||||
{/* Metadata (role and last update) */}
|
||||
<Box $direction="row" $gap="0.5rem" $align="center">
|
||||
<SkeletonLine $maxWidth="260px" $height="12px" />
|
||||
</Box>
|
||||
</Box>
|
||||
|
||||
{/* Toolbox skeleton (buttons) */}
|
||||
<Box $direction="row" $gap={spacingsTokens['t']} $align="center">
|
||||
{/* Share button */}
|
||||
<SkeletonLine $width="90px" $height="40px" />
|
||||
{/* Download icon */}
|
||||
<SkeletonCircle $width="40px" $height="40px" />
|
||||
{/* Menu icon */}
|
||||
<SkeletonCircle $width="40px" $height="40px" />
|
||||
</Box>
|
||||
</Box>
|
||||
</Box>
|
||||
|
||||
{/* Separator */}
|
||||
<SkeletonLine $height="1px" />
|
||||
</Box>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
export const SKELETON_FADE_DURATION_MS = 150;
|
||||
const skeletonFadeOut = keyframes`
|
||||
from { opacity: 1; }
|
||||
to { opacity: 0; }
|
||||
`;
|
||||
|
||||
type SkeletonEditorCoreProps = Partial<BoxType> & {
|
||||
isFadingOut?: boolean;
|
||||
};
|
||||
|
||||
export const SkeletonEditorCore = ({
|
||||
isFadingOut,
|
||||
$css,
|
||||
...props
|
||||
}: SkeletonEditorCoreProps) => {
|
||||
const { isDesktop } = useResponsiveStore();
|
||||
|
||||
return (
|
||||
<Box
|
||||
$direction="row"
|
||||
$width="100%"
|
||||
$css="overflow-x: clip; flex: 1;"
|
||||
$position="relative"
|
||||
className="--docs--doc-editor-content-skeleton"
|
||||
>
|
||||
<Box
|
||||
$position="relative"
|
||||
$width="100%"
|
||||
$padding={{ horizontal: isDesktop ? '54px' : 'base', top: 'md' }}
|
||||
$flex="1"
|
||||
$css={css`
|
||||
${$css}
|
||||
${isFadingOut &&
|
||||
css`
|
||||
animation: ${skeletonFadeOut} ${SKELETON_FADE_DURATION_MS}ms
|
||||
ease-in-out forwards;
|
||||
`}
|
||||
`}
|
||||
{...props}
|
||||
>
|
||||
<Box $gap="1.5rem">
|
||||
<SkeletonLine $width="65%" $height="35px" />
|
||||
<SkeletonLine $width="55%" $height="25px" />
|
||||
<SkeletonLine $width="35%" $height="20px" />
|
||||
</Box>
|
||||
</Box>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
|
||||
import { SKELETON_FADE_DURATION_MS } from '../components/DocEditorSkeleton';
|
||||
|
||||
export const useSkeletonFadeOut = (showContent: boolean) => {
|
||||
const [skeletonVisible, setSkeletonVisible] = useState(!showContent);
|
||||
const [isFadingOut, setIsFadingOut] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (showContent) {
|
||||
setIsFadingOut(true);
|
||||
const timer = setTimeout(
|
||||
() => setSkeletonVisible(false),
|
||||
SKELETON_FADE_DURATION_MS,
|
||||
);
|
||||
return () => clearTimeout(timer);
|
||||
} else {
|
||||
setSkeletonVisible(true);
|
||||
setIsFadingOut(false);
|
||||
}
|
||||
}, [showContent]);
|
||||
|
||||
return { skeletonVisible, isFadingOut };
|
||||
};
|
||||
@@ -36,7 +36,6 @@ if (!isInitialized && !i18next.isInitialized) {
|
||||
lowerCaseLng: true,
|
||||
nsSeparator: false,
|
||||
keySeparator: false,
|
||||
showSupportNotice: false,
|
||||
})
|
||||
.then(() => {
|
||||
if (typeof document !== 'undefined') {
|
||||
|
||||
@@ -629,6 +629,7 @@
|
||||
"Change role for {{name}}": "Αλλαγή ρόλου για {{name}}",
|
||||
"Checklist applied": "Εφαρμόστηκε λίστα ελέγχου",
|
||||
"Choose a user": "Επιλέξτε ένα χρήστη",
|
||||
"Choose the email": "Επιλέξτε το email",
|
||||
"Choose the new location for <strong>{{title}}</strong>.": "Επιλέξτε τη νέα θέση για το <strong>{{title}}</strong>.",
|
||||
"Close the access request modal": "Κλείσιμο παραθύρου αίτησης πρόσβασης",
|
||||
"Close the delete modal": "Κλείσιμο παραθύρου διαγραφής",
|
||||
@@ -686,12 +687,15 @@
|
||||
"Document tree": "Δομή εγγράφου",
|
||||
"Document unpinned successfully!": "Το έγγραφο ξεκαρφιτσώθηκε επιτυχώς!",
|
||||
"Document visibility": "Ορατότητα εγγράφου",
|
||||
"Document {{activeId}} is over document {{overId}}.": "Το έγγραφο {{activeId}} είναι πάνω από το έγγραφο {{overId}}.",
|
||||
"Document {{id}} was dropped.": "Το έγγραφο {{id}} απορρίφθηκε.",
|
||||
"Documents grid": "Πλέγμα εγγράφων",
|
||||
"Docx": "Docx",
|
||||
"Download": "Λήψη",
|
||||
"Download anyway": "Λήψη οπωσδήποτε",
|
||||
"Download {{format}}": "Λήψη σε {{format}}",
|
||||
"Drag and drop status": "Κατάσταση μεταφοράς και απόθεσης",
|
||||
"Dragging was cancelled. Document {{id}} was dropped.": "Ακυρώθηκε η απόσυρση. Το έγγραφο {{id}} απορρίφθηκε.",
|
||||
"Draw inspiration from the content library": "Αντλήστε έμπνευση από τη βιβλιοθήκη περιεχομένου",
|
||||
"Duplicate": "Δημιουργία αντιγράφου",
|
||||
"Edit document emoji": "Επεξεργασία emoji εγγράφου",
|
||||
@@ -786,6 +790,7 @@
|
||||
"New sub-doc": "Νέο υπο-έγγραφο",
|
||||
"No document found": "Δεν βρέθηκε έγγραφο",
|
||||
"No documents found": "Δεν βρέθηκαν έγγραφα",
|
||||
"No results. Type a full email address to invite someone.": "Δεν υπάρχουν αποτελέσματα. Πληκτρολογήστε μια πλήρη διεύθυνση email για να προσκαλέσετε κάποιον.",
|
||||
"No text selected": "Δεν επιλέχθηκε κείμενο",
|
||||
"No versions": "Δεν υπάρχουν εκδόσεις",
|
||||
"Numbered list applied": "Εφαρμόστηκε αριθμημένη λίστα",
|
||||
@@ -813,6 +818,7 @@
|
||||
"Paragraph applied": "Εφαρμόστηκε παράγραφος",
|
||||
"Pending invitations": "Εκκρεμείς προσκλήσεις",
|
||||
"People with access via the parent document": "Άτομα με πρόσβαση μέσω του γονικού εγγράφου",
|
||||
"Picked up document {{id}}.": "Επιλέχθηκε το έγγραφο {{id}}.",
|
||||
"Pin": "Καρφίτσωμα",
|
||||
"Pinned documents": "Καρφιτσωμένα έγγραφα",
|
||||
"Please download it only if it comes from a trusted source.": "Παρακαλούμε πραγματοποιήστε λήψη μόνο εάν προέρχεται από αξιόπιστη πηγή.",
|
||||
@@ -873,6 +879,7 @@
|
||||
"Summarize": "Σύνοψη",
|
||||
"Summary": "Περίληψη",
|
||||
"The antivirus has detected an anomaly in your file.": "Το λογισμικό προστασίας από ιούς εντόπισε μια ανωμαλία στο αρχείο σας.",
|
||||
"The current document will be replaced, but you'll still find it in the version history.": "Το τρέχον έγγραφο θα αντικατασταθεί, αλλά θα το βρείτε ακόμα στο ιστορικό εκδόσεων.",
|
||||
"The document \"{{documentName}}\" has been successfully imported": "Το έγγραφο \"{{documentName}}\" εισήχθη επιτυχώς",
|
||||
"The document \"{{documentName}}\" import has failed": "Η εισαγωγή του εγγράφου \"{{documentName}}\" απέτυχε",
|
||||
"The document \"{{documentName}}\" import has failed (only .docx and .md files are allowed)": "Η εισαγωγή του εγγράφου \"{{documentName}}\" απέτυχε (επιτρέπονται μόνο αρχεία .docx και .md)",
|
||||
@@ -895,6 +902,7 @@
|
||||
"Too many requests. Please wait 60 seconds.": "Πάρα πολλά αιτήματα. Παρακαλούμε περιμένετε 60 δευτερόλεπτα.",
|
||||
"Trashbin": "Κάδος απορριμμάτων",
|
||||
"Type a name or email": "Πληκτρολογήστε όνομα ή email",
|
||||
"Type at least {{minLength}} characters to display user names": "Πληκτρολογήστε τουλάχιστον {{minLength}} χαρακτήρες για την εμφάνιση ονομάτων χρηστών",
|
||||
"Type the name of a document": "Πληκτρολογήστε το όνομα ενός εγγράφου",
|
||||
"Unpin": "Ξεκαρφίτσωμα",
|
||||
"Untitled document": "Έγγραφο χωρίς τίτλο",
|
||||
@@ -1191,6 +1199,7 @@
|
||||
"An error occurred...": "Une erreur s'est produite...",
|
||||
"An uncompromising writing experience.": "Une expérience d'écriture sans compromis.",
|
||||
"An unexpected error occurred.": "Une erreur inattendue s’est produite.",
|
||||
"An unexpected error occurred. Go grab a coffee or try to refresh the page.": "Une erreur inattendue est survenue. Allez prendre un café ou essayez d'actualiser la page.",
|
||||
"Analyzing file...": "Analyse du fichier...",
|
||||
"Anonymous": "Anonyme",
|
||||
"Anyone with the link can edit the document": "N'importe qui avec le lien peut éditer le document",
|
||||
@@ -1280,6 +1289,7 @@
|
||||
"Document {{activeId}} was dropped over document {{overId}}.": "Le document {{activeId}} a été abandonné sur le document {{overId}}.",
|
||||
"Document {{id}} is no longer over a droppable area.": "Le document {{id}} n'est plus au-dessus d'une zone dépotable.",
|
||||
"Document {{id}} was dropped.": "Le document {{id}} a été abandonné.",
|
||||
"Documentation": "Documentation",
|
||||
"Documents grid": "Grille des documents",
|
||||
"Docx": "Docx",
|
||||
"Download": "Télécharger",
|
||||
@@ -1315,6 +1325,7 @@
|
||||
"Flexible export.": "Un export flexible.",
|
||||
"Format": "Format",
|
||||
"Format your content with the toolbar": "Formatez votre contenu avec la barre d'outils",
|
||||
"Get Support": "Obtenir de l'aide",
|
||||
"Go to content": "Voir le contenu",
|
||||
"Govs ❤️ Open Source.": "Gouvernements ❤️ Open Source.",
|
||||
"HTML": "HTML",
|
||||
@@ -1432,6 +1443,7 @@
|
||||
"Request access modal": "Demande d'accès",
|
||||
"Reset": "Réinitialiser",
|
||||
"Reset search filters": "Réinitialiser les filtres de recherche",
|
||||
"Resize sidebar": "Redimensionner la barre latérale",
|
||||
"Restore": "Restaurer",
|
||||
"Restore version of {{date}}": "Restaurer la version de {{date}}",
|
||||
"Restoring an older version": "Restauration d'une ancienne version en cours",
|
||||
@@ -1440,6 +1452,7 @@
|
||||
"Search docs": "Rechercher des docs",
|
||||
"Search documents": "Rechercher des documents",
|
||||
"Search for a doc": "Rechercher un document",
|
||||
"Search for a document": "Rechercher un document",
|
||||
"Search modal": "Modale de recherche",
|
||||
"Search results": "Résultats de la recherche",
|
||||
"Select a document": "Sélectionnez un document",
|
||||
@@ -1462,11 +1475,14 @@
|
||||
"Show more": "Voir plus",
|
||||
"Show the side panel for {{title}}": "Afficher le panneau latéral pour {{title}}",
|
||||
"Show the table of contents": "Afficher la table des matières",
|
||||
"Sidebar width: medium": "Largeur de la barre latérale : moyenne",
|
||||
"Sidebar width: narrow": "Largeur de la barre latérale: étroite",
|
||||
"Sidebar width: wide": "Largeur de la barre latérale: large",
|
||||
"Simple and secure collaboration.": "Une collaboration simple et sécurisée.",
|
||||
"Simple document icon": "Icône simple du document",
|
||||
"Something bad happens, please retry.": "Une erreur inattendue s'est produite, veuillez réessayer.",
|
||||
"Start Writing": "Commencer à écrire",
|
||||
"Start from ready-made templates for common use cases, then customize them to match your workflow in minutes.": "Commencez à partir de modèles prêts à l'emploi pour les cas d'utilisation courants, puis personnalisez-les pour correspondre à votre flux de travail en quelques minutes.",
|
||||
"Start from <Link>ready-made templates</Link> for common use cases, then customize them to match your workflow in minutes.": "Commencez à partir de <Link>modèles prêts à l'emploi</Link> pour les cas d'utilisation courants, puis personnalisez-les pour correspondre à votre flux de travail en quelques minutes.",
|
||||
"Stop": "Arrêter",
|
||||
"Summarize": "Résumer",
|
||||
"Summary": "Sommaire",
|
||||
@@ -1532,6 +1548,7 @@
|
||||
"home-content-open-source-part2": "Vous pouvez facilement auto-héberger Docs (consultez notre <2>documentation</2> d'installation).<br/>Docs utilise une <7>licence</7> (MIT) adaptée à l'innovation et aux entreprises.<br/>Les contributions sont les bienvenues (consultez notre feuille de route <13>ici</13>).",
|
||||
"home-content-open-source-part3": "Docs est le résultat d'un effort conjoint mené par les gouvernements français 🇫🇷🥖 <1>(DINUM)</1> et allemand 🇩🇪🥨 <5>(ZenDiS)</5>.",
|
||||
"just now": "à l'instant",
|
||||
"mention a sub-doc...": "mentionner un sous-document...",
|
||||
"new window": "nouvelle fenêtre",
|
||||
"pdf": "pdf",
|
||||
"src_img_onboarding_step_1": "/assets/on-boarding/step_1_FR.gif",
|
||||
@@ -2054,6 +2071,7 @@
|
||||
"An error occurred...": "Произошла ошибка...",
|
||||
"An uncompromising writing experience.": "Бескомпромиссный опыт написания.",
|
||||
"An unexpected error occurred.": "Произошла непредвиденная ошибка.",
|
||||
"An unexpected error occurred. Go grab a coffee or try to refresh the page.": "Произошла непредвиденная ошибка. Сходите за чашкой кофе или попробуйте обновить страницу.",
|
||||
"Analyzing file...": "Анализ файла...",
|
||||
"Anonymous": "Аноним",
|
||||
"Anyone with the link can edit the document": "Любой, у кого есть ссылка, может редактировать документ",
|
||||
@@ -2143,6 +2161,7 @@
|
||||
"Document {{activeId}} was dropped over document {{overId}}.": "Документ {{activeId}} был сброшен поверх документа {{overId}}.",
|
||||
"Document {{id}} is no longer over a droppable area.": "Документ {{id}} больше не находится над местом, куда его можно поместить.",
|
||||
"Document {{id}} was dropped.": "Документ {{id}} сброшен.",
|
||||
"Documentation": "Документация",
|
||||
"Documents grid": "Сетка документов",
|
||||
"Docx": "Docx",
|
||||
"Download": "Загрузить",
|
||||
@@ -2178,6 +2197,7 @@
|
||||
"Flexible export.": "Полезные форматы экспорта.",
|
||||
"Format": "Формат",
|
||||
"Format your content with the toolbar": "Форматируйте содержимое с помощью панели инструментов",
|
||||
"Get Support": "Получить поддержку",
|
||||
"Go to content": "Перейти к содержимому",
|
||||
"Govs ❤️ Open Source.": "Govs ❤️ Open Source.",
|
||||
"HTML": "HTML",
|
||||
@@ -2295,6 +2315,7 @@
|
||||
"Request access modal": "Запрос доступа",
|
||||
"Reset": "Сброс",
|
||||
"Reset search filters": "Сбросить фильтры поиска",
|
||||
"Resize sidebar": "Изменить размер панели",
|
||||
"Restore": "Восстановить",
|
||||
"Restore version of {{date}}": "Восстановить версию от {{date}}",
|
||||
"Restoring an older version": "Восстановление более старой версии",
|
||||
@@ -2303,6 +2324,7 @@
|
||||
"Search docs": "Поиск документов",
|
||||
"Search documents": "Поиск документов",
|
||||
"Search for a doc": "Поиск документов",
|
||||
"Search for a document": "Поиск документа",
|
||||
"Search modal": "Поиск",
|
||||
"Search results": "Результаты поиска",
|
||||
"Select a document": "Выберите документ",
|
||||
@@ -2325,6 +2347,9 @@
|
||||
"Show more": "Показать ещё",
|
||||
"Show the side panel for {{title}}": "Показать боковую панель для {{title}}",
|
||||
"Show the table of contents": "Показать оглавление",
|
||||
"Sidebar width: medium": "Ширина боковой панели: средняя",
|
||||
"Sidebar width: narrow": "Ширина боковой панели: узкая",
|
||||
"Sidebar width: wide": "Ширина боковой панели: широкая",
|
||||
"Simple and secure collaboration.": "Простое и безопасное сотрудничество.",
|
||||
"Simple document icon": "Простой значок документа",
|
||||
"Something bad happens, please retry.": "Что-то пошло не так, повторите попытку.",
|
||||
@@ -2395,6 +2420,7 @@
|
||||
"home-content-open-source-part2": "Вы можете легко разместить Docs у себя (см. нашу <2>документацию по установке</2>).<br/>Docs использует <7>лицензию</7> (MIT), подходящую для инноваций и бизнеса.<br/>Мы приветствуем ваши вклады (см. наш план разработки <13>здесь</13>).",
|
||||
"home-content-open-source-part3": "Docs — это результат совместных усилий правительств Франции 🇫🇷🥖 <1>(DINUM)</1> и Германии 🇩🇪🥨 <5>(ZenDiS)</5>.",
|
||||
"just now": "только что",
|
||||
"mention a sub-doc...": "упоминание вложенного документа...",
|
||||
"new window": "новое окно",
|
||||
"pdf": "pdf",
|
||||
"src_img_onboarding_step_1": "src_img_onboarding_step_1",
|
||||
@@ -2543,6 +2569,7 @@
|
||||
"An error occurred...": "Виникла помилка...",
|
||||
"An uncompromising writing experience.": "Безкомпромісне задоволення від процесу письма.",
|
||||
"An unexpected error occurred.": "Сталася неочікувана помилка.",
|
||||
"An unexpected error occurred. Go grab a coffee or try to refresh the page.": "Сталася неочікувана помилка. Сходіть за кавою або спробуйте оновити сторінку.",
|
||||
"Analyzing file...": "Аналіз файлу...",
|
||||
"Anonymous": "Анонім",
|
||||
"Anyone with the link can edit the document": "Будь-хто з посиланням може редагувати документ",
|
||||
@@ -2632,6 +2659,7 @@
|
||||
"Document {{activeId}} was dropped over document {{overId}}.": "Документ {{activeId}} відпущений над документом {{overId}}.",
|
||||
"Document {{id}} is no longer over a droppable area.": "Документ {{id}} більше не в зоні для пересування.",
|
||||
"Document {{id}} was dropped.": "Документ {{id}} був відхилений.",
|
||||
"Documentation": "Документація",
|
||||
"Documents grid": "Сітка документів",
|
||||
"Docx": "Docx",
|
||||
"Download": "Завантажити",
|
||||
@@ -2667,6 +2695,7 @@
|
||||
"Flexible export.": "Гнучкий експорт.",
|
||||
"Format": "Формат",
|
||||
"Format your content with the toolbar": "Форматуйте вміст за допомогою панелі інструментів",
|
||||
"Get Support": "Отримати підтримку",
|
||||
"Go to content": "Перейти до вмісту",
|
||||
"Govs ❤️ Open Source.": "Govs ❤️ Open Source.",
|
||||
"HTML": "HTML",
|
||||
@@ -2784,6 +2813,7 @@
|
||||
"Request access modal": "Запит доступу",
|
||||
"Reset": "Скинути",
|
||||
"Reset search filters": "Скинути фільтри пошуку",
|
||||
"Resize sidebar": "Змінити розмір бічної панелі",
|
||||
"Restore": "Відновити",
|
||||
"Restore version of {{date}}": "Відновити версію від {{date}}",
|
||||
"Restoring an older version": "Відновлення старішої версії",
|
||||
@@ -2792,6 +2822,7 @@
|
||||
"Search docs": "Пошук документів",
|
||||
"Search documents": "Пошук документів",
|
||||
"Search for a doc": "Пошук документу",
|
||||
"Search for a document": "Пошук документа",
|
||||
"Search modal": "Пошук",
|
||||
"Search results": "Результати пошуку",
|
||||
"Select a document": "Оберіть документ",
|
||||
@@ -2814,6 +2845,9 @@
|
||||
"Show more": "Показати більше",
|
||||
"Show the side panel for {{title}}": "Показувати бічну панель для {{title}}",
|
||||
"Show the table of contents": "Показати зміст",
|
||||
"Sidebar width: medium": "Ширина бічної панелі: середня",
|
||||
"Sidebar width: narrow": "Ширина бічної панелі: вузька",
|
||||
"Sidebar width: wide": "Ширина бічної панелі: широка",
|
||||
"Simple and secure collaboration.": "Проста та безпечна співпраця.",
|
||||
"Simple document icon": "Проста піктограма документа",
|
||||
"Something bad happens, please retry.": "Сталася помилка, спробуйте ще раз.",
|
||||
@@ -2884,6 +2918,7 @@
|
||||
"home-content-open-source-part2": "Ви можете легко самостійно розмістити Docs (див. нашу <2>документацію з встановлення</2>).<br/>Docs використовує <7>ліцензію</7> (MIT), що підходить для інновацій та бізнесу.<br/>Внески вітаються (див. наш план розробки <13>тут</13>).",
|
||||
"home-content-open-source-part3": "Docs є результатом спільних зусиль, очолюваних урядами Франції 🇫🇷🥖 <1>(DINUM)</1> та Німеччини 🇩🇪🥨 <5>(ZenDiS)</5>.",
|
||||
"just now": "щойно",
|
||||
"mention a sub-doc...": "згадка про вкладений документ...",
|
||||
"new window": "нове вікно",
|
||||
"pdf": "pdf",
|
||||
"src_img_onboarding_step_1": "src_img_onboarding_step_1",
|
||||
|
||||
@@ -8,12 +8,16 @@
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* stylelint-disable-next-line selector-id-pattern */
|
||||
body > #__next > .c__app > div:has(> .c__loader) {
|
||||
min-height: 100vh;
|
||||
width: 100vw;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
* {
|
||||
|
||||
@@ -109,5 +109,7 @@ export const useBroadcastStore = create<BroadcastState>((set, get) => ({
|
||||
Object.values(get().tasks).forEach(({ task, observer }) => {
|
||||
task.unobserve(observer);
|
||||
});
|
||||
|
||||
set({ tasks: {}, provider: undefined });
|
||||
},
|
||||
}));
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"target": "es2020",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "impress",
|
||||
"version": "4.8.6",
|
||||
"version": "5.0.0",
|
||||
"private": true,
|
||||
"repository": "https://github.com/suitenumerique/docs",
|
||||
"author": "DINUM",
|
||||
@@ -31,16 +31,17 @@
|
||||
"server:test": "yarn COLLABORATION_SERVER run test"
|
||||
},
|
||||
"resolutions": {
|
||||
"@tiptap/extensions": "3.20.4",
|
||||
"@types/node": "24.12.0",
|
||||
"@tiptap/extensions": "3.22.4",
|
||||
"@types/node": "24.12.2",
|
||||
"@types/react": "19.2.14",
|
||||
"@types/react-dom": "19.2.3",
|
||||
"eslint": "10.1.0",
|
||||
"eslint": "10.2.1",
|
||||
"postcss": "8.5.10",
|
||||
"prosemirror-view": "1.41.7",
|
||||
"react": "19.2.4",
|
||||
"react-dom": "19.2.4",
|
||||
"typescript": "5.9.3",
|
||||
"prosemirror-view": "1.41.8",
|
||||
"react": "19.2.5",
|
||||
"react-dom": "19.2.5",
|
||||
"serialize-javascript": "7.0.5",
|
||||
"typescript": "6.0.3",
|
||||
"uuid": "14.0.0",
|
||||
"wrap-ansi": "10.0.0",
|
||||
"yjs": "13.6.30"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "eslint-plugin-docs",
|
||||
"version": "4.8.6",
|
||||
"version": "5.0.0",
|
||||
"repository": "https://github.com/suitenumerique/docs",
|
||||
"author": "DINUM",
|
||||
"license": "MIT",
|
||||
@@ -18,23 +18,23 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@eslint/js": "10.0.1",
|
||||
"@next/eslint-plugin-next": "16.2.1",
|
||||
"@tanstack/eslint-plugin-query": "5.95.0",
|
||||
"@typescript-eslint/eslint-plugin": "8.57.1",
|
||||
"@typescript-eslint/parser": "8.57.1",
|
||||
"@typescript-eslint/utils": "8.57.1",
|
||||
"@vitest/eslint-plugin": "1.6.13",
|
||||
"eslint-config-next": "16.2.1",
|
||||
"@next/eslint-plugin-next": "16.2.4",
|
||||
"@tanstack/eslint-plugin-query": "5.99.2",
|
||||
"@typescript-eslint/eslint-plugin": "8.59.0",
|
||||
"@typescript-eslint/parser": "8.59.0",
|
||||
"@typescript-eslint/utils": "8.59.0",
|
||||
"@vitest/eslint-plugin": "1.6.16",
|
||||
"eslint-config-next": "16.2.4",
|
||||
"eslint-config-prettier": "10.1.8",
|
||||
"eslint-plugin-import-x": "4.16.2",
|
||||
"eslint-plugin-jest": "29.15.0",
|
||||
"eslint-plugin-jest": "29.15.2",
|
||||
"eslint-plugin-jsx-a11y": "6.10.2",
|
||||
"eslint-plugin-playwright": "2.10.1",
|
||||
"eslint-plugin-playwright": "2.10.2",
|
||||
"eslint-plugin-prettier": "5.5.5",
|
||||
"eslint-plugin-react": "7.37.5",
|
||||
"eslint-plugin-react-hooks": "7.0.1",
|
||||
"eslint-plugin-testing-library": "7.16.1",
|
||||
"prettier": "3.8.1"
|
||||
"eslint-plugin-react-hooks": "7.1.1",
|
||||
"eslint-plugin-testing-library": "7.16.2",
|
||||
"prettier": "3.8.3"
|
||||
},
|
||||
"packageManager": "yarn@1.22.22"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "packages-i18n",
|
||||
"version": "4.8.6",
|
||||
"version": "5.0.0",
|
||||
"repository": "https://github.com/suitenumerique/docs",
|
||||
"author": "DINUM",
|
||||
"license": "MIT",
|
||||
@@ -21,7 +21,7 @@
|
||||
"eslint-plugin-import": "2.32.0",
|
||||
"i18next-parser": "9.4.0",
|
||||
"jest": "30.3.0",
|
||||
"ts-jest": "29.4.6",
|
||||
"ts-jest": "29.4.9",
|
||||
"typescript": "*",
|
||||
"yargs": "18.0.0"
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"target": "es2020",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "server-y-provider",
|
||||
"version": "4.8.6",
|
||||
"version": "5.0.0",
|
||||
"description": "Y.js provider for docs",
|
||||
"repository": "https://github.com/suitenumerique/docs",
|
||||
"license": "MIT",
|
||||
@@ -16,12 +16,12 @@
|
||||
"node": ">=22"
|
||||
},
|
||||
"dependencies": {
|
||||
"@blocknote/server-util": "0.47.3",
|
||||
"@blocknote/server-util": "0.49.0",
|
||||
"@hocuspocus/server": "3.4.4",
|
||||
"@sentry/node": "10.45.0",
|
||||
"@sentry/profiling-node": "10.45.0",
|
||||
"@sentry/node": "10.49.0",
|
||||
"@sentry/profiling-node": "10.49.0",
|
||||
"@tiptap/extensions": "*",
|
||||
"axios": "1.15.0",
|
||||
"axios": "1.15.2",
|
||||
"cors": "2.8.6",
|
||||
"express": "5.2.1",
|
||||
"express-ws": "5.0.2",
|
||||
@@ -30,7 +30,7 @@
|
||||
"yjs": "*"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@blocknote/core": "0.47.3",
|
||||
"@blocknote/core": "0.49.0",
|
||||
"@hocuspocus/provider": "3.4.4",
|
||||
"@types/cors": "2.8.19",
|
||||
"@types/express": "5.0.6",
|
||||
@@ -45,8 +45,8 @@
|
||||
"ts-node": "10.9.2",
|
||||
"tsc-alias": "1.8.16",
|
||||
"typescript": "*",
|
||||
"vitest": "4.1.0",
|
||||
"vitest-mock-extended": "3.1.0",
|
||||
"vitest": "4.1.4",
|
||||
"vitest-mock-extended": "4.0.0",
|
||||
"ws": "8.20.0"
|
||||
},
|
||||
"packageManager": "yarn@1.22.22"
|
||||
|
||||
@@ -62,7 +62,7 @@ const readers: InputReader[] = [
|
||||
const ydoc = new Y.Doc();
|
||||
try {
|
||||
Y.applyUpdate(ydoc, data);
|
||||
return editor.yDocToBlocks(ydoc, 'document-store') as PartialBlock[];
|
||||
return editor.yDocToBlocks(ydoc, 'document-store');
|
||||
} finally {
|
||||
ydoc.destroy();
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"target": "es2020",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,10 +1,10 @@
|
||||
environments:
|
||||
dev:
|
||||
values:
|
||||
- version: 4.8.6
|
||||
- version: 5.0.0
|
||||
feature:
|
||||
values:
|
||||
- version: 4.8.6
|
||||
- version: 5.0.0
|
||||
feature: ci
|
||||
domain: example.com
|
||||
imageTag: demo
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
apiVersion: v2
|
||||
type: application
|
||||
name: docs
|
||||
version: 4.8.6
|
||||
version: 5.0.0
|
||||
appVersion: latest
|
||||
|
||||
@@ -6,4 +6,4 @@ DOCS_DIR_MAILS="${DOCS_DIR_MAILS:-../backend/core/templates/mail}/html/"
|
||||
if [ ! -d "${DOCS_DIR_MAILS}" ]; then
|
||||
mkdir -p "${DOCS_DIR_MAILS}";
|
||||
fi
|
||||
mjml mjml/*.mjml -o "${DOCS_DIR_MAILS}";
|
||||
mjml mjml/*.mjml -o "${DOCS_DIR_MAILS}" --config.allowIncludes true;
|
||||
|
||||
@@ -1,20 +1,16 @@
|
||||
<mj-head>
|
||||
<mj-title>{{ title }}</mj-title>
|
||||
<mj-preview>
|
||||
<!--
|
||||
We load django tags here, in this way there are put within the body in html output
|
||||
so the html-to-text command includes it within its output
|
||||
-->
|
||||
{% load i18n static extra_tags %}
|
||||
{{ title }}
|
||||
</mj-preview>
|
||||
<mj-preview>{{ title }}</mj-preview>
|
||||
<mj-font name="Inter" href="https://fonts.bunny.net/css?family=inter:300,400,500,700" />
|
||||
<mj-attributes>
|
||||
<mj-all
|
||||
font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Cantarell, 'Helvetica Neue', sans-serif"
|
||||
font-family="Inter, sans-serif"
|
||||
font-size="16px"
|
||||
line-height="normal"
|
||||
color="#3A3A3A"
|
||||
/>
|
||||
<mj-text font-family="Inter, sans-serif" />
|
||||
<mj-button font-family="Inter, sans-serif" />
|
||||
</mj-attributes>
|
||||
<mj-style>
|
||||
/* Reset */
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
<mj-include path="./partial/header.mjml" />
|
||||
|
||||
<mj-body mj-class="bg--blue-100">
|
||||
<!--
|
||||
We load django tags here so they appear in the body of the HTML output.
|
||||
This ensures html-to-text also includes them in the plain text template.
|
||||
-->
|
||||
<mj-raw>{% load i18n static extra_tags %}</mj-raw>
|
||||
<mj-wrapper css-class="wrapper" padding="5px 25px 0px 25px">
|
||||
<mj-section css-class="wrapper-logo">
|
||||
<mj-column>
|
||||
@@ -16,11 +21,11 @@
|
||||
</mj-section>
|
||||
<mj-section mj-class="bg--white-100" padding="0px 20px 60px 20px">
|
||||
<mj-column>
|
||||
<mj-text align="center">
|
||||
<mj-text align="center" font-family="Inter, sans-serif">
|
||||
<h1>{{title|capfirst}}</h1>
|
||||
</mj-text>
|
||||
<!-- Main Message -->
|
||||
<mj-text>
|
||||
<mj-text font-family="Inter, sans-serif">
|
||||
{{message|capfirst}}
|
||||
<a href="{{link}}">{{link_label}}</a>
|
||||
</mj-text>
|
||||
@@ -29,6 +34,7 @@
|
||||
background-color="#000091"
|
||||
color="white"
|
||||
padding-bottom="30px"
|
||||
font-family="Inter, sans-serif"
|
||||
>
|
||||
{{button_label}}
|
||||
</mj-button>
|
||||
@@ -39,13 +45,13 @@
|
||||
width="30%"
|
||||
align="center"
|
||||
/>
|
||||
<mj-text>
|
||||
<mj-text font-family="Inter, sans-serif">
|
||||
{% blocktrans %}
|
||||
Docs, your new essential tool for organizing, sharing and collaborating on your documents as a team.
|
||||
{% endblocktrans %}
|
||||
</mj-text>
|
||||
<!-- Signature -->
|
||||
<mj-text>
|
||||
<mj-text font-family="Inter, sans-serif">
|
||||
<p>
|
||||
{% blocktrans %}
|
||||
Brought to you by {{brandname}}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "mail_mjml",
|
||||
"version": "4.8.6",
|
||||
"version": "5.0.0",
|
||||
"description": "An util to generate html and text django's templates from mjml templates",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@html-to/text-cli": "0.5.4",
|
||||
"mjml": "4.18.0"
|
||||
"mjml": "5.0.1"
|
||||
},
|
||||
"resolutions": {
|
||||
"minimatch": "^10.0.0"
|
||||
|
||||
1279
src/mail/yarn.lock
1279
src/mail/yarn.lock
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user