Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4eb8c23fd3 | |||
| b317a2a596 | |||
| 39ef6d10ff | |||
| 961ae3c39e | |||
| 726b50d6b5 | |||
| 814eb1f1a1 | |||
| 648528499c | |||
| 474e5ac0c0 | |||
| a799d77643 | |||
| 2e04b63d2d | |||
| eec419bdba | |||
| baa5630344 | |||
| e7b551caa4 | |||
| 4dfc1584bd | |||
| 09eddfc339 | |||
| 75f2e547e0 | |||
| d1cbdfd819 | |||
| 0b64417058 | |||
| 57a505a80c | |||
| 21ee38c218 | |||
| 09de014a43 | |||
| 8d42149304 | |||
| 2451a6a322 | |||
| d5c9eaca5a | |||
| 1491012969 | |||
| 9dcf478dd3 | |||
| 586825aafa | |||
| 247550fc13 | |||
| 781c85b66b | |||
| 64f967cd29 | |||
| 1eee24dc19 | |||
| ff9e13ca03 | |||
| 7758e64f40 | |||
| 4ab9edcd57 |
@@ -23,9 +23,10 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
# Backend i18n
|
||||
- name: Install Python
|
||||
uses: actions/setup-python@v3
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.13.3"
|
||||
cache: "pip"
|
||||
- name: Upgrade pip and setuptools
|
||||
run: pip install --upgrade pip setuptools
|
||||
- name: Install development dependencies
|
||||
|
||||
@@ -101,7 +101,7 @@ jobs:
|
||||
test-e2e-other-browser:
|
||||
runs-on: ubuntu-latest
|
||||
needs: test-e2e-chromium
|
||||
timeout-minutes: 20
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
@@ -136,3 +136,54 @@ jobs:
|
||||
name: playwright-other-report
|
||||
path: src/frontend/apps/e2e/report/
|
||||
retention-days: 7
|
||||
|
||||
bundle-size-check:
|
||||
runs-on: ubuntu-latest
|
||||
needs: install-dependencies
|
||||
if: github.event_name == 'pull_request'
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
issues: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Detect relevant changes
|
||||
id: changes
|
||||
uses: dorny/paths-filter@v2
|
||||
with:
|
||||
filters: |
|
||||
lock:
|
||||
- 'src/frontend/**/yarn.lock'
|
||||
app:
|
||||
- 'src/frontend/apps/impress/**'
|
||||
|
||||
- name: Restore the frontend cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: "src/frontend/**/node_modules"
|
||||
key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }}
|
||||
fail-on-cache-miss: true
|
||||
|
||||
- name: Setup Node.js
|
||||
if: steps.changes.outputs.lock == 'true' || steps.changes.outputs.app == 'true'
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
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@v2
|
||||
with:
|
||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
build-script: "app:build"
|
||||
pattern: "apps/impress/out/**/*.{css,js,html}"
|
||||
exclude: "{**/*.map,**/node_modules/**}"
|
||||
minimum-change-threshold: 500
|
||||
compression: "gzip"
|
||||
cwd: "./src/frontend"
|
||||
show-total: true
|
||||
strip-hash: "[-_.][a-f0-9]{8,}(?=\\.(?:js|css|html)$)"
|
||||
omit-unchanged: true
|
||||
install-script: "yarn install --frozen-lockfile"
|
||||
|
||||
@@ -25,14 +25,18 @@ jobs:
|
||||
- name: show
|
||||
run: git log
|
||||
- name: Enforce absence of print statements in code
|
||||
if: always()
|
||||
run: |
|
||||
! git diff origin/${{ github.event.pull_request.base.ref }}..HEAD -- . ':(exclude)**/impress.yml' | grep "print("
|
||||
- name: Check absence of fixup commits
|
||||
if: always()
|
||||
run: |
|
||||
! git log | grep 'fixup!'
|
||||
- name: Install gitlint
|
||||
if: always()
|
||||
run: pip install --user requests gitlint
|
||||
- name: Lint commit messages added to main
|
||||
if: always()
|
||||
run: ~/.local/bin/gitlint --commits origin/${{ github.event.pull_request.base.ref }}..HEAD
|
||||
|
||||
check-changelog:
|
||||
@@ -89,9 +93,10 @@ jobs:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Python
|
||||
uses: actions/setup-python@v3
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.13.3"
|
||||
cache: "pip"
|
||||
- name: Upgrade pip and setuptools
|
||||
run: pip install --upgrade pip setuptools
|
||||
- name: Install development dependencies
|
||||
@@ -184,9 +189,10 @@ jobs:
|
||||
mc version enable impress/impress-media-storage"
|
||||
|
||||
- name: Install Python
|
||||
uses: actions/setup-python@v3
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.13.3"
|
||||
cache: "pip"
|
||||
|
||||
- name: Install development dependencies
|
||||
run: pip install --user .[dev]
|
||||
|
||||
+29
-12
@@ -8,22 +8,38 @@ and this project adheres to
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [3.6.0] - 2025-09-04
|
||||
|
||||
### Added
|
||||
|
||||
- 👷(CI) add bundle size check job #1268
|
||||
- ✨(frontend) use title first emoji as doc icon in tree #1289
|
||||
|
||||
### Changed
|
||||
|
||||
- ⚡️(frontend) improve accessibility:
|
||||
- #1248
|
||||
- #1235
|
||||
- #1275
|
||||
- #1255
|
||||
- #1262
|
||||
- #1244
|
||||
- #1270
|
||||
- #1282
|
||||
- ♻️(docs-app) Switch from Jest tests to Vitest #1269
|
||||
- ♿(frontend) improve accessibility:
|
||||
- 🌐(frontend) set html lang attribute dynamically #1248
|
||||
- ♿(frontend) inject language attribute to pdf export #1235
|
||||
- ♿(frontend) improve accessibility of search modal #1275
|
||||
- ♿(frontend) add correct attributes to icons #1255
|
||||
- 🎨(frontend) improve nav structure #1262
|
||||
- ♿️(frontend) keyboard interaction with menu #1244
|
||||
- ♿(frontend) improve header accessibility #1270
|
||||
- ♿(frontend) improve accessibility for decorative images in editor #1282
|
||||
- ♻️(backend) fallback to email identifier when no name #1298
|
||||
- 🐛(backend) allow ASCII characters in user sub field #1295
|
||||
- ⚡️(frontend) improve fallback width calculation #1333
|
||||
|
||||
### Fixed
|
||||
|
||||
- 🐛(makefile) Windows compatibility fix for Docker volume mounting #1264
|
||||
- 🐛(minio) fix user permission error with Minio and Windows #1264
|
||||
- 🐛(makefile) Windows compatibility fix for Docker volume mounting #1263
|
||||
- 🐛(minio) fix user permission error with Minio and Windows #1263
|
||||
- 🐛(frontend) fix export when quote block and inline code #1319
|
||||
- 🐛(frontend) fix base64 font #1324
|
||||
- 🐛(backend) allow creator to delete subpages #1297
|
||||
- 🐛(frontend) fix dnd conflict with tree and Blocknote #1328
|
||||
- 🐛(frontend) fix display bug on homepage #1332
|
||||
|
||||
## [3.5.0] - 2025-07-31
|
||||
|
||||
@@ -695,7 +711,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/v3.5.0...main
|
||||
[unreleased]: https://github.com/suitenumerique/docs/compare/v3.6.0...main
|
||||
[v3.6.0]: https://github.com/suitenumerique/docs/releases/v3.6.0
|
||||
[v3.5.0]: https://github.com/suitenumerique/docs/releases/v3.5.0
|
||||
[v3.4.2]: https://github.com/suitenumerique/docs/releases/v3.4.2
|
||||
[v3.4.1]: https://github.com/suitenumerique/docs/releases/v3.4.1
|
||||
|
||||
@@ -93,13 +93,77 @@ post-bootstrap: \
|
||||
mails-build
|
||||
.PHONY: post-bootstrap
|
||||
|
||||
pre-beautiful-bootstrap: ## Display a welcome message before bootstrap
|
||||
ifeq ($(OS),Windows_NT)
|
||||
@echo ""
|
||||
@echo "================================================================================"
|
||||
@echo ""
|
||||
@echo " Welcome to Docs - Collaborative Text Editing from La Suite!"
|
||||
@echo ""
|
||||
@echo " This will set up your development environment with:"
|
||||
@echo " - Docker containers for all services"
|
||||
@echo " - Database migrations and static files"
|
||||
@echo " - Frontend dependencies and build"
|
||||
@echo " - Environment configuration files"
|
||||
@echo ""
|
||||
@echo " Services will be available at:"
|
||||
@echo " - Frontend: http://localhost:3000"
|
||||
@echo " - API: http://localhost:8071"
|
||||
@echo " - Admin: http://localhost:8071/admin"
|
||||
@echo ""
|
||||
@echo "================================================================================"
|
||||
@echo ""
|
||||
@echo "Starting bootstrap process..."
|
||||
else
|
||||
@echo "$(BOLD)"
|
||||
@echo "╔══════════════════════════════════════════════════════════════════════════════╗"
|
||||
@echo "║ ║"
|
||||
@echo "║ 🚀 Welcome to Docs - Collaborative Text Editing from La Suite ! 🚀 ║"
|
||||
@echo "║ ║"
|
||||
@echo "║ This will set up your development environment with : ║"
|
||||
@echo "║ • Docker containers for all services ║"
|
||||
@echo "║ • Database migrations and static files ║"
|
||||
@echo "║ • Frontend dependencies and build ║"
|
||||
@echo "║ • Environment configuration files ║"
|
||||
@echo "║ ║"
|
||||
@echo "║ Services will be available at: ║"
|
||||
@echo "║ • Frontend: http://localhost:3000 ║"
|
||||
@echo "║ • API: http://localhost:8071 ║"
|
||||
@echo "║ • Admin: http://localhost:8071/admin ║"
|
||||
@echo "║ ║"
|
||||
@echo "╚══════════════════════════════════════════════════════════════════════════════╝"
|
||||
@echo "$(RESET)"
|
||||
@echo "$(GREEN)Starting bootstrap process...$(RESET)"
|
||||
endif
|
||||
@echo ""
|
||||
.PHONY: pre-beautiful-bootstrap
|
||||
|
||||
bootstrap: ## Prepare Docker developmentimages for the project
|
||||
post-beautiful-bootstrap: ## Display a success message after bootstrap
|
||||
@echo ""
|
||||
ifeq ($(OS),Windows_NT)
|
||||
@echo "Bootstrap completed successfully!"
|
||||
@echo ""
|
||||
@echo "Next steps:"
|
||||
@echo " - Visit http://localhost:3000 to access the application"
|
||||
@echo " - Run 'make help' to see all available commands"
|
||||
else
|
||||
@echo "$(GREEN)🎉 Bootstrap completed successfully!$(RESET)"
|
||||
@echo ""
|
||||
@echo "$(BOLD)Next steps:$(RESET)"
|
||||
@echo " • Visit http://localhost:3000 to access the application"
|
||||
@echo " • Run 'make help' to see all available commands"
|
||||
endif
|
||||
@echo ""
|
||||
.PHONY: post-beautiful-bootstrap
|
||||
|
||||
bootstrap: ## Prepare the project for local development
|
||||
bootstrap: \
|
||||
pre-beautiful-bootstrap \
|
||||
pre-bootstrap \
|
||||
build \
|
||||
post-bootstrap \
|
||||
run
|
||||
run \
|
||||
post-beautiful-bootstrap
|
||||
.PHONY: bootstrap
|
||||
|
||||
bootstrap-e2e: ## Prepare Docker production images to be used for e2e tests
|
||||
@@ -342,6 +406,10 @@ run-frontend-development: ## Run the frontend in development mode
|
||||
cd $(PATH_FRONT_IMPRESS) && yarn dev
|
||||
.PHONY: run-frontend-development
|
||||
|
||||
frontend-test: ## Run the frontend tests
|
||||
cd $(PATH_FRONT_IMPRESS) && yarn test
|
||||
.PHONY: frontend-test
|
||||
|
||||
frontend-i18n-extract: ## Extract the frontend translation inside a json to be used for crowdin
|
||||
cd $(PATH_FRONT) && yarn i18n:extract
|
||||
.PHONY: frontend-i18n-extract
|
||||
|
||||
@@ -49,13 +49,24 @@ Docs is a collaborative text editor designed to address common challenges in kno
|
||||
* 📚 Turn your team's collaborative work into organized knowledge with Subpages.
|
||||
|
||||
### Self-host
|
||||
🚀 Docs is easy to install on your own servers
|
||||
|
||||
Available methods: Helm chart, Nix package
|
||||
#### 🚀 Docs is easy to install on your own servers
|
||||
We use Kubernetes for our [production instance](https://docs.numerique.gouv.fr/) but also support Docker Compose. The community contributed a couple other methods (Nix, YunoHost etc.) check out the [docs](/docs/installation/README.md) to get detailed instructions and examples.
|
||||
|
||||
In the works: Docker Compose, YunoHost
|
||||
#### 🌍 Known instances
|
||||
We hope to see many more, here is an incomplete list of public Docs instances (urls listed in alphabetical order). Feel free to make a PR to add ones that are not listed below🙏
|
||||
|
||||
| | | |
|
||||
| --- | --- | ------- |
|
||||
| Url | Org | Public |
|
||||
| docs.numerique.gouv.fr | DINUM | French public agents working for the central administration and the extended public sphere. ProConnect is required to login in or sign up|
|
||||
| docs.suite.anct.gouv.fr | ANCT | French public agents working for the territorial administration and the extended public sphere. ProConnect is required to login in or sign up|
|
||||
| notes.demo.opendesk.eu | ZenDiS | Demo instance of OpenDesk. Request access to get credentials |
|
||||
| notes.liiib.re | lasuite.coop | Free and open demo to all. Content and accounts are reset after one month |
|
||||
| docs.federated.nexus | federated.nexus | Public instance, but you have to [sign up for a Federated Nexus account](https://federated.nexus/register/). |
|
||||
|
||||
⚠️ For some advanced features (ex: Export as PDF) Docs relies on XL packages from BlockNote. These are licenced under AGPL-3.0 and are not MIT compatible. You can perfectly use Docs without these packages by setting the environment variable `PUBLISH_AS_MIT` to true. That way you'll build an image of the application without the features that are not MIT compatible. Read the [environment variables documentation](/docs/env.md) for more information.
|
||||
#### ⚠️ Advanced features
|
||||
For some advanced features (ex: Export as PDF) Docs relies on XL packages from BlockNote. These are licenced under GPL and are not MIT compatible. You can perfectly use Docs without these packages by setting the environment variable `PUBLISH_AS_MIT` to true. That way you'll build an image of the application without the features that are not MIT compatible. Read the [environment variables documentation](/docs/env.md) for more information.
|
||||
|
||||
## Getting started 🔧
|
||||
|
||||
@@ -130,6 +141,12 @@ To start all the services, except the frontend container, you can use the follow
|
||||
$ make run-backend
|
||||
```
|
||||
|
||||
To execute frontend tests & linting only
|
||||
```shellscript
|
||||
$ make frontend-test
|
||||
$ make frontend-lint
|
||||
```
|
||||
|
||||
**Adding content**
|
||||
|
||||
You can create a basic demo site by running this command:
|
||||
|
||||
+3
-3
@@ -135,9 +135,9 @@ NODE_ENV=production NEXT_PUBLIC_PUBLISH_AS_MIT=false yarn build
|
||||
| PUBLISH_AS_MIT | Removes packages whose licences are incompatible with the MIT licence (see below) | true |
|
||||
|
||||
Packages with licences incompatible with the MIT licence:
|
||||
* `xl-docx-exporter`: [AGPL-3.0](https://github.com/TypeCellOS/BlockNote/blob/main/packages/xl-docx-exporter/LICENSE),
|
||||
* `xl-pdf-exporter`: [AGPL-3.0](https://github.com/TypeCellOS/BlockNote/blob/main/packages/xl-pdf-exporter/LICENSE),
|
||||
* `xl-multi-column`: [AGPL-3.0](https://github.com/TypeCellOS/BlockNote/blob/main/packages/xl-multi-column/LICENSE).
|
||||
* `xl-docx-exporter`: [GPL](https://github.com/TypeCellOS/BlockNote/blob/main/packages/xl-docx-exporter/LICENSE),
|
||||
* `xl-pdf-exporter`: [GPL](https://github.com/TypeCellOS/BlockNote/blob/main/packages/xl-pdf-exporter/LICENSE),
|
||||
* `xl-multi-column`: [GPL](https://github.com/TypeCellOS/BlockNote/blob/main/packages/xl-multi-column/LICENSE).
|
||||
|
||||
In `.env.development`, `PUBLISH_AS_MIT` is set to `false`, allowing developers to test Docs with all its features.
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ backend:
|
||||
OIDC_OP_AUTHORIZATION_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/impress/protocol/openid-connect/auth
|
||||
OIDC_OP_TOKEN_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/impress/protocol/openid-connect/token
|
||||
OIDC_OP_USER_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/impress/protocol/openid-connect/userinfo
|
||||
OIDC_OP_LOGOUT_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/impress/protocol/openid-connect/session/end
|
||||
OIDC_OP_LOGOUT_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/impress/protocol/openid-connect/logout
|
||||
OIDC_RP_CLIENT_ID: impress
|
||||
OIDC_RP_CLIENT_SECRET: ThisIsAnExampleKeyForDevPurposeOnly
|
||||
OIDC_RP_SIGN_ALGO: RS256
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
# Installation
|
||||
If you want to install Docs you've come to the right place.
|
||||
Here are a bunch of resources to help you install the project.
|
||||
|
||||
## Kubernetes
|
||||
We (Docs maintainers) are only using the Kubernetes deployment method in production. We can only provide advanced support for this method.
|
||||
Please follow the instructions laid out [here](/docs/installation/kubernetes.md).
|
||||
|
||||
## Docker Compose
|
||||
We are aware that not everyone has Kubernetes Cluster laying around 😆.
|
||||
We also provide [Docker images](https://hub.docker.com/u/lasuite?page=1&search=impress) that you can deploy using Compose.
|
||||
Please follow the instructions [here](/docs/installation/compose.md).
|
||||
⚠️ Please keep in mind that we do not use it ourselves in production. Let us know in the issues if you run into troubles, we'll try to help.
|
||||
|
||||
## Other ways to install Docs
|
||||
Community members have contributed several other ways to install Docs. While we owe them a big thanks 🙏, please keep in mind we (Docs maintainers) can't provide support on these installation methods as we don't use them ourselves and there are two many options out there for us to keep track of. Of course you can contact the contributors and the broader community for assistance.
|
||||
|
||||
Here is the list of other methods in alphabetical order:
|
||||
- Coop-Cloud: [code](https://git.coopcloud.tech/coop-cloud/lasuite-docs)
|
||||
- Nix: [Packages](https://search.nixos.org/packages?channel=unstable&query=lasuite-docs), ⚠️ unstable
|
||||
- Podman: [code][https://codeberg.org/philo/lasuite-docs-podman], ⚠️ experimental
|
||||
- YunoHost: [code](https://github.com/YunoHost-Apps/lasuite-docs_ynh), [app store](https://apps.yunohost.org/app/lasuite-docs)
|
||||
|
||||
Feel free to make a PR to add ones that are not listed above 🙏
|
||||
|
||||
## Cloud providers
|
||||
Some cloud providers are making it easy to deploy Docs on their infrastructure.
|
||||
|
||||
Here is the list in alphabetical order:
|
||||
- Clever Cloud 🇫🇷 : [market place][https://www.clever-cloud.com/product/docs/], [technical doc](https://www.clever.cloud/developers/guides/docs/#deploy-docs)
|
||||
|
||||
Feel free to make a PR to add ones that are not listed above 🙏
|
||||
@@ -124,7 +124,7 @@ OIDC_OP_JWKS_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/impress/protocol
|
||||
OIDC_OP_AUTHORIZATION_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/impress/protocol/openid-connect/auth
|
||||
OIDC_OP_TOKEN_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/impress/protocol/openid-connect/token
|
||||
OIDC_OP_USER_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/impress/protocol/openid-connect/userinfo
|
||||
OIDC_OP_LOGOUT_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/impress/protocol/openid-connect/session/end
|
||||
OIDC_OP_LOGOUT_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/impress/protocol/openid-connect/logout
|
||||
OIDC_RP_CLIENT_ID: impress
|
||||
OIDC_RP_CLIENT_SECRET: ThisIsAnExampleKeyForDevPurposeOnly
|
||||
OIDC_RP_SIGN_ALGO: RS256
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
"extends": ["github>numerique-gouv/renovate-configuration"],
|
||||
"dependencyDashboard": true,
|
||||
"labels": ["dependencies", "noChangeLog", "automated"],
|
||||
"schedule": ["before 7am on monday"],
|
||||
"prCreation": "not-pending",
|
||||
"rebaseWhen": "conflicted",
|
||||
"updateNotScheduled": false,
|
||||
"packageRules": [
|
||||
{
|
||||
"enabled": false,
|
||||
|
||||
@@ -7,12 +7,13 @@ from base64 import b64decode
|
||||
from django.conf import settings
|
||||
from django.db.models import Q
|
||||
from django.utils.functional import lazy
|
||||
from django.utils.text import slugify
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
import magic
|
||||
from rest_framework import serializers
|
||||
|
||||
from core import choices, enums, models, utils
|
||||
from core import choices, enums, models, utils, validators
|
||||
from core.services.ai_services import AI_ACTIONS
|
||||
from core.services.converter_services import (
|
||||
ConversionError,
|
||||
@@ -32,11 +33,30 @@ class UserSerializer(serializers.ModelSerializer):
|
||||
class UserLightSerializer(UserSerializer):
|
||||
"""Serialize users with limited fields."""
|
||||
|
||||
full_name = serializers.SerializerMethodField(read_only=True)
|
||||
short_name = serializers.SerializerMethodField(read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = models.User
|
||||
fields = ["full_name", "short_name"]
|
||||
read_only_fields = ["full_name", "short_name"]
|
||||
|
||||
def get_full_name(self, instance):
|
||||
"""Return the full name of the user."""
|
||||
if not instance.full_name:
|
||||
email = instance.email.split("@")[0]
|
||||
return slugify(email)
|
||||
|
||||
return instance.full_name
|
||||
|
||||
def get_short_name(self, instance):
|
||||
"""Return the short name of the user."""
|
||||
if not instance.short_name:
|
||||
email = instance.email.split("@")[0]
|
||||
return slugify(email)
|
||||
|
||||
return instance.short_name
|
||||
|
||||
|
||||
class TemplateAccessSerializer(serializers.ModelSerializer):
|
||||
"""Serialize template accesses."""
|
||||
@@ -402,7 +422,7 @@ class ServerCreateDocumentSerializer(serializers.Serializer):
|
||||
content = serializers.CharField(required=True)
|
||||
# User
|
||||
sub = serializers.CharField(
|
||||
required=True, validators=[models.User.sub_validator], max_length=255
|
||||
required=True, validators=[validators.sub_validator], max_length=255
|
||||
)
|
||||
email = serializers.EmailField(required=True)
|
||||
language = serializers.ChoiceField(
|
||||
|
||||
@@ -13,6 +13,7 @@ from django.contrib.postgres.search import TrigramSimilarity
|
||||
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 models as db
|
||||
from django.db.models.expressions import RawSQL
|
||||
@@ -359,7 +360,7 @@ class DocumentViewSet(
|
||||
permission_classes = [
|
||||
permissions.DocumentPermission,
|
||||
]
|
||||
queryset = models.Document.objects.all()
|
||||
queryset = models.Document.objects.select_related("creator").all()
|
||||
serializer_class = serializers.DocumentSerializer
|
||||
ai_translate_serializer_class = serializers.AITranslateSerializer
|
||||
children_serializer_class = serializers.ListDocumentSerializer
|
||||
@@ -786,7 +787,11 @@ class DocumentViewSet(
|
||||
)
|
||||
|
||||
# GET: List children
|
||||
queryset = document.get_children().filter(ancestors_deleted_at__isnull=True)
|
||||
queryset = (
|
||||
document.get_children()
|
||||
.select_related("creator")
|
||||
.filter(ancestors_deleted_at__isnull=True)
|
||||
)
|
||||
queryset = self.filter_queryset(queryset)
|
||||
|
||||
filterset = DocumentFilter(request.GET, queryset=queryset)
|
||||
@@ -840,19 +845,27 @@ class DocumentViewSet(
|
||||
user = self.request.user
|
||||
|
||||
try:
|
||||
current_document = self.queryset.only("depth", "path").get(pk=pk)
|
||||
current_document = (
|
||||
self.queryset.select_related(None).only("depth", "path").get(pk=pk)
|
||||
)
|
||||
except models.Document.DoesNotExist as excpt:
|
||||
raise drf.exceptions.NotFound() from excpt
|
||||
|
||||
ancestors = (
|
||||
(current_document.get_ancestors() | self.queryset.filter(pk=pk))
|
||||
(
|
||||
current_document.get_ancestors()
|
||||
| self.queryset.select_related(None).filter(pk=pk)
|
||||
)
|
||||
.filter(ancestors_deleted_at__isnull=True)
|
||||
.order_by("path")
|
||||
)
|
||||
|
||||
# Get the highest readable ancestor
|
||||
highest_readable = (
|
||||
ancestors.readable_per_se(request.user).only("depth", "path").first()
|
||||
ancestors.select_related(None)
|
||||
.readable_per_se(request.user)
|
||||
.only("depth", "path")
|
||||
.first()
|
||||
)
|
||||
if highest_readable is None:
|
||||
raise (
|
||||
@@ -880,7 +893,12 @@ class DocumentViewSet(
|
||||
|
||||
children = self.queryset.filter(children_clause, deleted_at__isnull=True)
|
||||
|
||||
queryset = ancestors.filter(depth__gte=highest_readable.depth) | children
|
||||
queryset = (
|
||||
ancestors.select_related("creator").filter(
|
||||
depth__gte=highest_readable.depth
|
||||
)
|
||||
| children
|
||||
)
|
||||
queryset = queryset.order_by("path")
|
||||
queryset = queryset.annotate_user_roles(user)
|
||||
queryset = queryset.annotate_is_favorite(user)
|
||||
@@ -1282,7 +1300,8 @@ class DocumentViewSet(
|
||||
)
|
||||
|
||||
attachments_documents = (
|
||||
self.queryset.filter(attachments__contains=[key])
|
||||
self.queryset.select_related(None)
|
||||
.filter(attachments__contains=[key])
|
||||
.only("path")
|
||||
.order_by("path")
|
||||
)
|
||||
@@ -1441,6 +1460,15 @@ class DocumentViewSet(
|
||||
|
||||
url = unquote(url)
|
||||
|
||||
url_validator = URLValidator(schemes=["http", "https"])
|
||||
try:
|
||||
url_validator(url)
|
||||
except drf.exceptions.ValidationError as e:
|
||||
return drf.response.Response(
|
||||
{"detail": str(e)},
|
||||
status=drf.status.HTTP_400_BAD_REQUEST,
|
||||
)
|
||||
|
||||
try:
|
||||
response = requests.get(
|
||||
url,
|
||||
@@ -1471,10 +1499,10 @@ class DocumentViewSet(
|
||||
return proxy_response
|
||||
|
||||
except requests.RequestException as e:
|
||||
logger.error("Proxy request failed: %s", str(e))
|
||||
return drf_response.Response(
|
||||
{"error": f"Failed to fetch resource: {e!s}"},
|
||||
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
logger.exception(e)
|
||||
return drf.response.Response(
|
||||
{"error": f"Failed to fetch resource from {url}"},
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
import core.validators
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
@@ -33,4 +35,17 @@ class Migration(migrations.Migration):
|
||||
verbose_name="language",
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="user",
|
||||
name="sub",
|
||||
field=models.CharField(
|
||||
blank=True,
|
||||
help_text="Required. 255 characters or fewer. ASCII characters only.",
|
||||
max_length=255,
|
||||
null=True,
|
||||
unique=True,
|
||||
validators=[core.validators.sub_validator],
|
||||
verbose_name="sub",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
+12
-15
@@ -14,7 +14,7 @@ from django.contrib.auth import models as auth_models
|
||||
from django.contrib.auth.base_user import AbstractBaseUser
|
||||
from django.contrib.postgres.fields import ArrayField
|
||||
from django.contrib.sites.models import Site
|
||||
from django.core import mail, validators
|
||||
from django.core import mail
|
||||
from django.core.cache import cache
|
||||
from django.core.files.base import ContentFile
|
||||
from django.core.files.storage import default_storage
|
||||
@@ -39,6 +39,7 @@ from .choices import (
|
||||
RoleChoices,
|
||||
get_equivalent_link_definition,
|
||||
)
|
||||
from .validators import sub_validator
|
||||
|
||||
logger = getLogger(__name__)
|
||||
|
||||
@@ -136,22 +137,12 @@ class UserManager(auth_models.UserManager):
|
||||
class User(AbstractBaseUser, BaseModel, auth_models.PermissionsMixin):
|
||||
"""User model to work with OIDC only authentication."""
|
||||
|
||||
sub_validator = validators.RegexValidator(
|
||||
regex=r"^[\w.@+-:]+\Z",
|
||||
message=_(
|
||||
"Enter a valid sub. This value may contain only letters, "
|
||||
"numbers, and @/./+/-/_/: characters."
|
||||
),
|
||||
)
|
||||
|
||||
sub = models.CharField(
|
||||
_("sub"),
|
||||
help_text=_(
|
||||
"Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only."
|
||||
),
|
||||
help_text=_("Required. 255 characters or fewer. ASCII characters only."),
|
||||
max_length=255,
|
||||
unique=True,
|
||||
validators=[sub_validator],
|
||||
unique=True,
|
||||
blank=True,
|
||||
null=True,
|
||||
)
|
||||
@@ -762,6 +753,12 @@ class Document(MP_Node, BaseModel):
|
||||
can_update = (
|
||||
is_owner_or_admin or role == RoleChoices.EDITOR
|
||||
) and not is_deleted
|
||||
can_create_children = can_update and user.is_authenticated
|
||||
can_destroy = (
|
||||
is_owner
|
||||
if self.is_root()
|
||||
else (is_owner_or_admin or (user.is_authenticated and self.creator == user))
|
||||
)
|
||||
|
||||
ai_allow_reach_from = settings.AI_ALLOW_REACH_FROM
|
||||
ai_access = any(
|
||||
@@ -784,11 +781,11 @@ class Document(MP_Node, BaseModel):
|
||||
"media_check": can_get,
|
||||
"can_edit": can_update,
|
||||
"children_list": can_get,
|
||||
"children_create": can_update and user.is_authenticated,
|
||||
"children_create": can_create_children,
|
||||
"collaboration_auth": can_get,
|
||||
"cors_proxy": can_get,
|
||||
"descendants": can_get,
|
||||
"destroy": is_owner,
|
||||
"destroy": can_destroy,
|
||||
"duplicate": can_get and user.is_authenticated,
|
||||
"favorite": can_get and user.is_authenticated,
|
||||
"link_configuration": is_owner_or_admin,
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import pytest
|
||||
import responses
|
||||
from requests.exceptions import RequestException
|
||||
from rest_framework.test import APIClient
|
||||
|
||||
from core import factories
|
||||
@@ -149,3 +150,41 @@ def test_api_docs_cors_proxy_unsupported_media_type():
|
||||
f"/api/v1.0/documents/{document.id!s}/cors-proxy/?url={url_to_fetch}"
|
||||
)
|
||||
assert response.status_code == 415
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"url_to_fetch",
|
||||
[
|
||||
"ftp://external-url.com/assets/index.html",
|
||||
"ftps://external-url.com/assets/index.html",
|
||||
"invalid-url.com",
|
||||
"ssh://external-url.com/assets/index.html",
|
||||
],
|
||||
)
|
||||
def test_api_docs_cors_proxy_invalid_url(url_to_fetch):
|
||||
"""Test the CORS proxy API for documents with an invalid URL."""
|
||||
document = factories.DocumentFactory(link_reach="public")
|
||||
|
||||
client = APIClient()
|
||||
response = client.get(
|
||||
f"/api/v1.0/documents/{document.id!s}/cors-proxy/?url={url_to_fetch}"
|
||||
)
|
||||
assert response.status_code == 400
|
||||
assert response.json() == ["Enter a valid URL."]
|
||||
|
||||
|
||||
@responses.activate
|
||||
def test_api_docs_cors_proxy_request_failed():
|
||||
"""Test the CORS proxy API for documents with a request failed."""
|
||||
document = factories.DocumentFactory(link_reach="public")
|
||||
|
||||
client = APIClient()
|
||||
url_to_fetch = "https://external-url.com/assets/index.html"
|
||||
responses.get(url_to_fetch, body=RequestException("Connection refused"))
|
||||
response = client.get(
|
||||
f"/api/v1.0/documents/{document.id!s}/cors-proxy/?url={url_to_fetch}"
|
||||
)
|
||||
assert response.status_code == 400
|
||||
assert response.json() == {
|
||||
"error": "Failed to fetch resource from https://external-url.com/assets/index.html"
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ def test_api_documents_create_for_owner_invalid_sub():
|
||||
data = {
|
||||
"title": "My Document",
|
||||
"content": "Document content",
|
||||
"sub": "123!!",
|
||||
"sub": "invalid süb",
|
||||
"email": "john.doe@example.com",
|
||||
}
|
||||
|
||||
@@ -163,10 +163,7 @@ def test_api_documents_create_for_owner_invalid_sub():
|
||||
assert not Document.objects.exists()
|
||||
|
||||
assert response.json() == {
|
||||
"sub": [
|
||||
"Enter a valid sub. This value may contain only letters, "
|
||||
"numbers, and @/./+/-/_/: characters."
|
||||
]
|
||||
"sub": ["Enter a valid sub. This value should be ASCII only."]
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -494,7 +494,7 @@ def test_api_documents_retrieve_authenticated_related_parent():
|
||||
"collaboration_auth": True,
|
||||
"descendants": True,
|
||||
"cors_proxy": True,
|
||||
"destroy": access.role == "owner",
|
||||
"destroy": access.role in ["administrator", "owner"],
|
||||
"duplicate": True,
|
||||
"favorite": True,
|
||||
"invite_owner": access.role == "owner",
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
"""Test user light serializer."""
|
||||
|
||||
import pytest
|
||||
|
||||
from core import factories
|
||||
from core.api.serializers import UserLightSerializer
|
||||
|
||||
pytestmark = pytest.mark.django_db
|
||||
|
||||
|
||||
def test_user_light_serializer():
|
||||
"""Test user light serializer."""
|
||||
user = factories.UserFactory(
|
||||
email="test@test.com",
|
||||
full_name="John Doe",
|
||||
short_name="John",
|
||||
)
|
||||
serializer = UserLightSerializer(user)
|
||||
assert serializer.data["full_name"] == "John Doe"
|
||||
assert serializer.data["short_name"] == "John"
|
||||
|
||||
|
||||
def test_user_light_serializer_no_full_name():
|
||||
"""Test user light serializer without full name."""
|
||||
user = factories.UserFactory(
|
||||
email="test_foo@test.com",
|
||||
full_name=None,
|
||||
short_name="John",
|
||||
)
|
||||
serializer = UserLightSerializer(user)
|
||||
assert serializer.data["full_name"] == "test_foo"
|
||||
assert serializer.data["short_name"] == "John"
|
||||
|
||||
|
||||
def test_user_light_serializer_no_short_name():
|
||||
"""Test user light serializer without short name."""
|
||||
user = factories.UserFactory(
|
||||
email="test_foo@test.com",
|
||||
full_name=None,
|
||||
short_name=None,
|
||||
)
|
||||
serializer = UserLightSerializer(user)
|
||||
assert serializer.data["full_name"] == "test_foo"
|
||||
assert serializer.data["short_name"] == "test_foo"
|
||||
@@ -593,6 +593,86 @@ def test_models_documents_get_abilities_preset_role(django_assert_num_queries):
|
||||
}
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"is_authenticated, is_creator,role,link_reach,link_role,can_destroy",
|
||||
[
|
||||
(True, False, "owner", "restricted", "editor", True),
|
||||
(True, True, "owner", "restricted", "editor", True),
|
||||
(True, False, "owner", "restricted", "reader", True),
|
||||
(True, True, "owner", "restricted", "reader", True),
|
||||
(True, False, "owner", "authenticated", "editor", True),
|
||||
(True, True, "owner", "authenticated", "editor", True),
|
||||
(True, False, "owner", "authenticated", "reader", True),
|
||||
(True, True, "owner", "authenticated", "reader", True),
|
||||
(True, False, "owner", "public", "editor", True),
|
||||
(True, True, "owner", "public", "editor", True),
|
||||
(True, False, "owner", "public", "reader", True),
|
||||
(True, True, "owner", "public", "reader", True),
|
||||
(True, False, "administrator", "restricted", "editor", True),
|
||||
(True, True, "administrator", "restricted", "editor", True),
|
||||
(True, False, "administrator", "restricted", "reader", True),
|
||||
(True, True, "administrator", "restricted", "reader", True),
|
||||
(True, False, "administrator", "authenticated", "editor", True),
|
||||
(True, True, "administrator", "authenticated", "editor", True),
|
||||
(True, False, "administrator", "authenticated", "reader", True),
|
||||
(True, True, "administrator", "authenticated", "reader", True),
|
||||
(True, False, "administrator", "public", "editor", True),
|
||||
(True, True, "administrator", "public", "editor", True),
|
||||
(True, False, "administrator", "public", "reader", True),
|
||||
(True, True, "administrator", "public", "reader", True),
|
||||
(True, False, "editor", "restricted", "editor", False),
|
||||
(True, True, "editor", "restricted", "editor", True),
|
||||
(True, False, "editor", "restricted", "reader", False),
|
||||
(True, True, "editor", "restricted", "reader", True),
|
||||
(True, False, "editor", "authenticated", "editor", False),
|
||||
(True, True, "editor", "authenticated", "editor", True),
|
||||
(True, False, "editor", "authenticated", "reader", False),
|
||||
(True, True, "editor", "authenticated", "reader", True),
|
||||
(True, False, "editor", "public", "editor", False),
|
||||
(True, True, "editor", "public", "editor", True),
|
||||
(True, False, "editor", "public", "reader", False),
|
||||
(True, True, "editor", "public", "reader", True),
|
||||
(True, False, "reader", "restricted", "editor", False),
|
||||
(True, False, "reader", "restricted", "reader", False),
|
||||
(True, False, "reader", "authenticated", "editor", False),
|
||||
(True, True, "reader", "authenticated", "editor", True),
|
||||
(True, False, "reader", "authenticated", "reader", False),
|
||||
(True, False, "reader", "public", "editor", False),
|
||||
(True, True, "reader", "public", "editor", True),
|
||||
(True, False, "reader", "public", "reader", False),
|
||||
(False, False, None, "restricted", "editor", False),
|
||||
(False, False, None, "restricted", "reader", False),
|
||||
(False, False, None, "authenticated", "editor", False),
|
||||
(False, False, None, "authenticated", "reader", False),
|
||||
(False, False, None, "public", "editor", False),
|
||||
(False, False, None, "public", "reader", False),
|
||||
],
|
||||
)
|
||||
# pylint: disable=too-many-arguments, too-many-positional-arguments
|
||||
def test_models_documents_get_abilities_children_destroy( # noqa: PLR0913
|
||||
is_authenticated,
|
||||
is_creator,
|
||||
role,
|
||||
link_reach,
|
||||
link_role,
|
||||
can_destroy,
|
||||
):
|
||||
"""For a sub document, if a user can create children, he can destroy it."""
|
||||
user = factories.UserFactory() if is_authenticated else AnonymousUser()
|
||||
parent = factories.DocumentFactory(link_reach=link_reach, link_role=link_role)
|
||||
document = factories.DocumentFactory(
|
||||
link_reach=link_reach,
|
||||
link_role=link_role,
|
||||
parent=parent,
|
||||
creator=user if is_creator else None,
|
||||
)
|
||||
if is_authenticated:
|
||||
factories.UserDocumentAccessFactory(document=parent, user=user, role=role)
|
||||
|
||||
abilities = document.get_abilities(user)
|
||||
assert abilities["destroy"] is can_destroy
|
||||
|
||||
|
||||
@override_settings(AI_ALLOW_REACH_FROM="public")
|
||||
@pytest.mark.parametrize(
|
||||
"is_authenticated,reach",
|
||||
|
||||
@@ -44,3 +44,25 @@ def test_models_users_send_mail_main_missing():
|
||||
user.email_user("my subject", "my message")
|
||||
|
||||
assert str(excinfo.value) == "User has no email address."
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"sub,is_valid",
|
||||
[
|
||||
("valid_sub.@+-:=/", True),
|
||||
("invalid süb", False),
|
||||
(12345, True),
|
||||
],
|
||||
)
|
||||
def test_models_users_sub_validator(sub, is_valid):
|
||||
"""The "sub" field should be validated."""
|
||||
user = factories.UserFactory()
|
||||
user.sub = sub
|
||||
if is_valid:
|
||||
user.full_clean()
|
||||
else:
|
||||
with pytest.raises(
|
||||
ValidationError,
|
||||
match=("Enter a valid sub. This value should be ASCII only."),
|
||||
):
|
||||
user.full_clean()
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
"""Custom validators for the core app."""
|
||||
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
|
||||
def sub_validator(value):
|
||||
"""Validate that the sub is ASCII only."""
|
||||
if not value.isascii():
|
||||
raise ValidationError("Enter a valid sub. This value should be ASCII only.")
|
||||
@@ -9,7 +9,7 @@
|
||||
},
|
||||
"externalLinks": [
|
||||
{
|
||||
"label": "Github",
|
||||
"label": "GitHub",
|
||||
"href": "https://github.com/suitenumerique/docs/"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-07-24 20:42+0000\n"
|
||||
"PO-Revision-Date: 2025-07-31 12:38\n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 10:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Breton\n"
|
||||
"Language: br_FR\n"
|
||||
@@ -44,33 +44,33 @@ msgstr "Me eo an aozer"
|
||||
|
||||
#: build/lib/core/api/filters.py:64 core/api/filters.py:64
|
||||
msgid "Masked"
|
||||
msgstr ""
|
||||
msgstr "Kuzhet"
|
||||
|
||||
#: build/lib/core/api/filters.py:67 core/api/filters.py:67
|
||||
msgid "Favorite"
|
||||
msgstr "Sinedoù"
|
||||
|
||||
#: build/lib/core/api/serializers.py:467 core/api/serializers.py:467
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
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:471 core/api/serializers.py:471
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
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:608 core/api/serializers.py:608
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr "Korf"
|
||||
|
||||
#: build/lib/core/api/serializers.py:611 core/api/serializers.py:611
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr "Doare korf"
|
||||
|
||||
#: build/lib/core/api/serializers.py:617 core/api/serializers.py:617
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr "Stumm"
|
||||
|
||||
#: build/lib/core/api/viewsets.py:942 core/api/viewsets.py:942
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "eilenn {title}"
|
||||
@@ -129,272 +129,268 @@ msgstr "Kleiz"
|
||||
msgid "Right"
|
||||
msgstr "Dehoù"
|
||||
|
||||
#: build/lib/core/models.py:79 core/models.py:79
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr "id"
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr "alc'hwez kentañ evit an enrollañ evel UIID"
|
||||
|
||||
#: build/lib/core/models.py:86 core/models.py:86
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr "krouet d'ar/al"
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr "deiziad hag eurvezh krouidigezh an enrolladenn"
|
||||
|
||||
#: build/lib/core/models.py:92 core/models.py:92
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr "hizivaet d'ar/al"
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr "deiziad hag eurvezh m'eo bet hizivaet an enrolladenn"
|
||||
|
||||
#: build/lib/core/models.py:129 core/models.py:129
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr "N'hon eus kavet implijer ebet gant an isstrollad-mañ met ar postel a zo liammet ouzh un implijer enrollet."
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters."
|
||||
msgstr "Ebarzhit un isstrollad mat. An talvoud-mañ a c'hall enderc'hel lizhiri, sifroù hag arouezioù @/./+/-/_/: hepken."
|
||||
|
||||
#: build/lib/core/models.py:148 core/models.py:148
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr "isstrollad"
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only."
|
||||
msgstr "Rekis. 255 arouezenn pe nebeutoc'h. Lizhiri, sifroù hag arouezioù @/./+/-/_/: hepken."
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:159 core/models.py:159
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr "anv klok"
|
||||
|
||||
#: build/lib/core/models.py:160 core/models.py:160
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr "anv berr"
|
||||
|
||||
#: build/lib/core/models.py:162 core/models.py:162
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr "postel identelezh"
|
||||
|
||||
#: build/lib/core/models.py:167 core/models.py:167
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr "postel ar merour"
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr "yezh"
|
||||
|
||||
#: build/lib/core/models.py:175 core/models.py:175
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr "Ar yezh en deus c'hoant da welet an implijer an etrefas enni."
|
||||
msgstr "Ar yezh a vo implijet evit etrefas an implijer."
|
||||
|
||||
#: build/lib/core/models.py:183 core/models.py:183
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr "Ar gwerzhid-eur en deus c'hoant da welet an implijer an eur drezañ."
|
||||
msgstr "Ar gwerzhid-eur a vo implijet evit etrefas an implijer."
|
||||
|
||||
#: build/lib/core/models.py:186 core/models.py:186
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr "trevnad"
|
||||
|
||||
#: build/lib/core/models.py:188 core/models.py:188
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr "Pe vefe an implijer un aparailh pe un implijer gwirion."
|
||||
|
||||
#: build/lib/core/models.py:191 core/models.py:191
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr "statud ar skipailh"
|
||||
|
||||
#: build/lib/core/models.py:193 core/models.py:193
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr "Ma c'hall an implijer kevreañ ouzh al lec'hienn verañ-mañ."
|
||||
|
||||
#: build/lib/core/models.py:196 core/models.py:196
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr "oberiant"
|
||||
|
||||
#: build/lib/core/models.py:199 core/models.py:199
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr "Ma rank bezañ tretet an implijer-mañ evel oberiant. Diziuzit an dra-mañ e-plas dilemel kontoù."
|
||||
|
||||
#: build/lib/core/models.py:211 core/models.py:211
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr "implijer"
|
||||
|
||||
#: build/lib/core/models.py:212 core/models.py:212
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr "implijerien"
|
||||
|
||||
#: build/lib/core/models.py:368 build/lib/core/models.py:1283
|
||||
#: core/models.py:368 core/models.py:1283
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr "titl"
|
||||
|
||||
#: build/lib/core/models.py:369 core/models.py:369
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr "bomm"
|
||||
|
||||
#: build/lib/core/models.py:418 core/models.py:418
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr "Restr"
|
||||
|
||||
#: build/lib/core/models.py:419 core/models.py:419
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr "Restroù"
|
||||
|
||||
#: build/lib/core/models.py:431 build/lib/core/models.py:821 core/models.py:431
|
||||
#: core/models.py:821
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr "Restr hep titl"
|
||||
|
||||
#: build/lib/core/models.py:856 core/models.py:856
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} en deus rannet ur restr ganeoc'h!"
|
||||
|
||||
#: build/lib/core/models.py:860 core/models.py:860
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, 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:866 core/models.py:866
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, 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:966 core/models.py:966
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Roud liamm ar restr/an implijer"
|
||||
|
||||
#: build/lib/core/models.py:967 core/models.py:967
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Roudoù liamm ar restr/an implijer"
|
||||
|
||||
#: build/lib/core/models.py:973 core/models.py:973
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
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:996 core/models.py:996
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr "Restr muiañ-karet"
|
||||
|
||||
#: build/lib/core/models.py:997 core/models.py:997
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr "Restroù muiañ-karet"
|
||||
|
||||
#: build/lib/core/models.py:1003 core/models.py:1003
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
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:1025 core/models.py:1025
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr "Liamm restr/implijer"
|
||||
|
||||
#: build/lib/core/models.py:1026 core/models.py:1026
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr "Liammoù restr/implijer"
|
||||
|
||||
#: build/lib/core/models.py:1032 core/models.py:1032
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr "An implijer-mañ a zo dija er restr-mañ."
|
||||
|
||||
#: build/lib/core/models.py:1038 core/models.py:1038
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Ar skipailh-mañ a zo dija en restr-mañ."
|
||||
|
||||
#: build/lib/core/models.py:1044 build/lib/core/models.py:1369
|
||||
#: core/models.py:1044 core/models.py:1369
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
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:1190 core/models.py:1190
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr "Goulenn tizhout ar restr"
|
||||
|
||||
#: build/lib/core/models.py:1191 core/models.py:1191
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr "Goulennoù tizhout ar restr"
|
||||
|
||||
#: build/lib/core/models.py:1197 core/models.py:1197
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
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:1262 core/models.py:1262
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, 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:1266 core/models.py:1266
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, 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:1272 core/models.py:1272
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, 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:1284 core/models.py:1284
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr "deskrivadur"
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr "kod"
|
||||
|
||||
#: build/lib/core/models.py:1286 core/models.py:1286
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr "css"
|
||||
|
||||
#: build/lib/core/models.py:1288 core/models.py:1288
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr "publik"
|
||||
|
||||
#: build/lib/core/models.py:1290 core/models.py:1290
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr "M'eo foran ar patrom-mañ hag implijus gant n'eus forzh piv."
|
||||
|
||||
#: build/lib/core/models.py:1296 core/models.py:1296
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr "Patrom"
|
||||
|
||||
#: build/lib/core/models.py:1297 core/models.py:1297
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr "Patromoù"
|
||||
|
||||
#: build/lib/core/models.py:1350 core/models.py:1350
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr "Liamm patrom/implijer"
|
||||
|
||||
#: build/lib/core/models.py:1351 core/models.py:1351
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr "Liammoù patrom/implijer"
|
||||
|
||||
#: build/lib/core/models.py:1357 core/models.py:1357
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr "An implijer-mañ a zo dija er patrom-mañ."
|
||||
|
||||
#: build/lib/core/models.py:1363 core/models.py:1363
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr "Ar skipailh-mañ a zo dija er patrom-mañ."
|
||||
|
||||
#: build/lib/core/models.py:1440 core/models.py:1440
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr "postel"
|
||||
|
||||
#: build/lib/core/models.py:1459 core/models.py:1459
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr "Pedadenn d'ur restr"
|
||||
|
||||
#: build/lib/core/models.py:1460 core/models.py:1460
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr "Pedadennoù d'ur restr"
|
||||
|
||||
#: build/lib/core/models.py:1480 core/models.py:1480
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Ar postel-mañ a zo liammet ouzh un implijer enskrivet."
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-07-24 20:42+0000\n"
|
||||
"PO-Revision-Date: 2025-07-31 12:38\n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 10:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: German\n"
|
||||
"Language: de_DE\n"
|
||||
@@ -50,27 +50,27 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr "Favorit"
|
||||
|
||||
#: build/lib/core/api/serializers.py:467 core/api/serializers.py:467
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Ein neues Dokument wurde in Ihrem Namen erstellt!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:471 core/api/serializers.py:471
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "Sie sind Besitzer eines neuen Dokuments:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:608 core/api/serializers.py:608
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr "Inhalt"
|
||||
|
||||
#: build/lib/core/api/serializers.py:611 core/api/serializers.py:611
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr "Typ"
|
||||
|
||||
#: build/lib/core/api/serializers.py:617 core/api/serializers.py:617
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr "Format"
|
||||
|
||||
#: build/lib/core/api/viewsets.py:942 core/api/viewsets.py:942
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "Kopie von {title}"
|
||||
@@ -129,272 +129,268 @@ msgstr "Links"
|
||||
msgid "Right"
|
||||
msgstr "Rechts"
|
||||
|
||||
#: build/lib/core/models.py:79 core/models.py:79
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr "id"
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
#: 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"
|
||||
|
||||
#: build/lib/core/models.py:86 core/models.py:86
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr "Erstellt"
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr "Datum und Uhrzeit, an dem ein Datensatz erstellt wurde"
|
||||
|
||||
#: build/lib/core/models.py:92 core/models.py:92
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr "Aktualisiert"
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr "Datum und Uhrzeit, an dem zuletzt aktualisiert wurde"
|
||||
|
||||
#: build/lib/core/models.py:129 core/models.py:129
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr "Wir konnten keinen Benutzer mit diesem Abo finden, aber die E-Mail-Adresse ist bereits einem registrierten Benutzer zugeordnet."
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters."
|
||||
msgstr "Geben Sie eine gültige Unterseite ein. Dieser Wert darf nur Buchstaben, Zahlen und die @/./+/-/_/: Zeichen enthalten."
|
||||
|
||||
#: build/lib/core/models.py:148 core/models.py:148
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr "unter"
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only."
|
||||
msgstr "Erforderlich. 255 Zeichen oder weniger. Buchstaben, Zahlen und die Zeichen @/./+/-/_/:"
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:159 core/models.py:159
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr "Name"
|
||||
|
||||
#: build/lib/core/models.py:160 core/models.py:160
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr "Kurzbezeichnung"
|
||||
|
||||
#: build/lib/core/models.py:162 core/models.py:162
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr "Identitäts-E-Mail-Adresse"
|
||||
|
||||
#: build/lib/core/models.py:167 core/models.py:167
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr "Admin E-Mail-Adresse"
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr "Sprache"
|
||||
|
||||
#: build/lib/core/models.py:175 core/models.py:175
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr "Die Sprache, in der der Benutzer die Benutzeroberfläche sehen möchte."
|
||||
|
||||
#: build/lib/core/models.py:183 core/models.py:183
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr "Die Zeitzone, in der der Nutzer Zeiten sehen möchte."
|
||||
|
||||
#: build/lib/core/models.py:186 core/models.py:186
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr "Gerät"
|
||||
|
||||
#: build/lib/core/models.py:188 core/models.py:188
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr "Ob der Benutzer ein Gerät oder ein echter Benutzer ist."
|
||||
|
||||
#: build/lib/core/models.py:191 core/models.py:191
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr "Status des Teammitgliedes"
|
||||
|
||||
#: build/lib/core/models.py:193 core/models.py:193
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr "Gibt an, ob der Benutzer sich in diese Admin-Seite einloggen kann."
|
||||
|
||||
#: build/lib/core/models.py:196 core/models.py:196
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr "aktiviert"
|
||||
|
||||
#: build/lib/core/models.py:199 core/models.py:199
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr "Ob dieser Benutzer als aktiviert behandelt werden soll. Deaktivieren Sie diese Option, anstatt Konten zu löschen."
|
||||
|
||||
#: build/lib/core/models.py:211 core/models.py:211
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr "Benutzer"
|
||||
|
||||
#: build/lib/core/models.py:212 core/models.py:212
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr "Benutzer"
|
||||
|
||||
#: build/lib/core/models.py:368 build/lib/core/models.py:1283
|
||||
#: core/models.py:368 core/models.py:1283
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr "Titel"
|
||||
|
||||
#: build/lib/core/models.py:369 core/models.py:369
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr "Auszug"
|
||||
|
||||
#: build/lib/core/models.py:418 core/models.py:418
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr "Dokument"
|
||||
|
||||
#: build/lib/core/models.py:419 core/models.py:419
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr "Dokumente"
|
||||
|
||||
#: build/lib/core/models.py:431 build/lib/core/models.py:821 core/models.py:431
|
||||
#: core/models.py:821
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr "Unbenanntes Dokument"
|
||||
|
||||
#: build/lib/core/models.py:856 core/models.py:856
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} hat ein Dokument mit Ihnen geteilt!"
|
||||
|
||||
#: build/lib/core/models.py:860 core/models.py:860
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, 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:866 core/models.py:866
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, 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:966 core/models.py:966
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Dokument/Benutzer Linkverfolgung"
|
||||
|
||||
#: build/lib/core/models.py:967 core/models.py:967
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Dokument/Benutzer Linkverfolgung"
|
||||
|
||||
#: build/lib/core/models.py:973 core/models.py:973
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
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:996 core/models.py:996
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr "Dokumentenfavorit"
|
||||
|
||||
#: build/lib/core/models.py:997 core/models.py:997
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr "Dokumentfavoriten"
|
||||
|
||||
#: build/lib/core/models.py:1003 core/models.py:1003
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
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:1025 core/models.py:1025
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr "Dokument/Benutzerbeziehung"
|
||||
|
||||
#: build/lib/core/models.py:1026 core/models.py:1026
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr "Dokument/Benutzerbeziehungen"
|
||||
|
||||
#: build/lib/core/models.py:1032 core/models.py:1032
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Dieser Benutzer befindet sich bereits in diesem Dokument."
|
||||
|
||||
#: build/lib/core/models.py:1038 core/models.py:1038
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Dieses Team befindet sich bereits in diesem Dokument."
|
||||
|
||||
#: build/lib/core/models.py:1044 build/lib/core/models.py:1369
|
||||
#: core/models.py:1044 core/models.py:1369
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
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:1190 core/models.py:1190
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1191 core/models.py:1191
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1197 core/models.py:1197
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1262 core/models.py:1262
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1266 core/models.py:1266
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1272 core/models.py:1272
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1284 core/models.py:1284
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr "Beschreibung"
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr "Code"
|
||||
|
||||
#: build/lib/core/models.py:1286 core/models.py:1286
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr "CSS"
|
||||
|
||||
#: build/lib/core/models.py:1288 core/models.py:1288
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr "öffentlich"
|
||||
|
||||
#: build/lib/core/models.py:1290 core/models.py:1290
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr "Ob diese Vorlage für jedermann öffentlich ist."
|
||||
|
||||
#: build/lib/core/models.py:1296 core/models.py:1296
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr "Vorlage"
|
||||
|
||||
#: build/lib/core/models.py:1297 core/models.py:1297
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr "Vorlagen"
|
||||
|
||||
#: build/lib/core/models.py:1350 core/models.py:1350
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr "Vorlage/Benutzer-Beziehung"
|
||||
|
||||
#: build/lib/core/models.py:1351 core/models.py:1351
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr "Vorlage/Benutzerbeziehungen"
|
||||
|
||||
#: build/lib/core/models.py:1357 core/models.py:1357
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr "Dieser Benutzer ist bereits in dieser Vorlage."
|
||||
|
||||
#: build/lib/core/models.py:1363 core/models.py:1363
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr "Dieses Team ist bereits in diesem Template."
|
||||
|
||||
#: build/lib/core/models.py:1440 core/models.py:1440
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr "E-Mail-Adresse"
|
||||
|
||||
#: build/lib/core/models.py:1459 core/models.py:1459
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr "Einladung zum Dokument"
|
||||
|
||||
#: build/lib/core/models.py:1460 core/models.py:1460
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr "Dokumenteinladungen"
|
||||
|
||||
#: build/lib/core/models.py:1480 core/models.py:1480
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Diese E-Mail ist bereits einem registrierten Benutzer zugeordnet."
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-07-24 20:42+0000\n"
|
||||
"PO-Revision-Date: 2025-07-31 12:38\n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 10:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: English\n"
|
||||
"Language: en_US\n"
|
||||
@@ -50,27 +50,27 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:467 core/api/serializers.py:467
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:471 core/api/serializers.py:471
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:608 core/api/serializers.py:608
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:611 core/api/serializers.py:611
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:617 core/api/serializers.py:617
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/viewsets.py:942 core/api/viewsets.py:942
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr ""
|
||||
@@ -129,272 +129,268 @@ msgstr ""
|
||||
msgid "Right"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:79 core/models.py:79
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:86 core/models.py:86
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:92 core/models.py:92
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:129 core/models.py:129
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:148 core/models.py:148
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only."
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:159 core/models.py:159
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:160 core/models.py:160
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:162 core/models.py:162
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:167 core/models.py:167
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:175 core/models.py:175
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:183 core/models.py:183
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:186 core/models.py:186
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:188 core/models.py:188
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:191 core/models.py:191
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:193 core/models.py:193
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:196 core/models.py:196
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:199 core/models.py:199
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:211 core/models.py:211
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:212 core/models.py:212
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:368 build/lib/core/models.py:1283
|
||||
#: core/models.py:368 core/models.py:1283
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:369 core/models.py:369
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:418 core/models.py:418
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:419 core/models.py:419
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:431 build/lib/core/models.py:821 core/models.py:431
|
||||
#: core/models.py:821
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:856 core/models.py:856
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:860 core/models.py:860
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:866 core/models.py:866
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:966 core/models.py:966
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:967 core/models.py:967
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:973 core/models.py:973
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:996 core/models.py:996
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:997 core/models.py:997
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1003 core/models.py:1003
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1025 core/models.py:1025
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1026 core/models.py:1026
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1032 core/models.py:1032
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1038 core/models.py:1038
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1044 build/lib/core/models.py:1369
|
||||
#: core/models.py:1044 core/models.py:1369
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1190 core/models.py:1190
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1191 core/models.py:1191
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1197 core/models.py:1197
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1262 core/models.py:1262
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1266 core/models.py:1266
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1272 core/models.py:1272
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1284 core/models.py:1284
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1286 core/models.py:1286
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1288 core/models.py:1288
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1290 core/models.py:1290
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1296 core/models.py:1296
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1297 core/models.py:1297
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1350 core/models.py:1350
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1351 core/models.py:1351
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1357 core/models.py:1357
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1363 core/models.py:1363
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1440 core/models.py:1440
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1459 core/models.py:1459
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1460 core/models.py:1460
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1480 core/models.py:1480
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-07-24 20:42+0000\n"
|
||||
"PO-Revision-Date: 2025-07-31 12:38\n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 10:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Spanish\n"
|
||||
"Language: es_ES\n"
|
||||
@@ -50,27 +50,27 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr "Favorito"
|
||||
|
||||
#: build/lib/core/api/serializers.py:467 core/api/serializers.py:467
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "¡Un nuevo documento se ha creado por ti!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:471 core/api/serializers.py:471
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
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:608 core/api/serializers.py:608
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr "Cuerpo"
|
||||
|
||||
#: build/lib/core/api/serializers.py:611 core/api/serializers.py:611
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr "Tipo de Cuerpo"
|
||||
|
||||
#: build/lib/core/api/serializers.py:617 core/api/serializers.py:617
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr "Formato"
|
||||
|
||||
#: build/lib/core/api/viewsets.py:942 core/api/viewsets.py:942
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "copia de {title}"
|
||||
@@ -129,272 +129,268 @@ msgstr "Izquierda"
|
||||
msgid "Right"
|
||||
msgstr "Derecha"
|
||||
|
||||
#: build/lib/core/models.py:79 core/models.py:79
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr "id"
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr "clave primaria para el registro como UUID"
|
||||
|
||||
#: build/lib/core/models.py:86 core/models.py:86
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr "creado el"
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr "fecha y hora en la que se creó un registro"
|
||||
|
||||
#: build/lib/core/models.py:92 core/models.py:92
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr "actualizado el"
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr "fecha y hora en la que un registro fue actualizado por última vez"
|
||||
|
||||
#: build/lib/core/models.py:129 core/models.py:129
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr "No se ha podido encontrar un usuario con este sub (UUID), pero el correo electrónico ya está asociado con un usuario."
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters."
|
||||
msgstr "Introduzca un sub (UUID) válido. Este valor solo puede contener letras, números y los siguientes caracteres @/./+/-/_/:"
|
||||
|
||||
#: build/lib/core/models.py:148 core/models.py:148
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr "sub (UUID)"
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only."
|
||||
msgstr "Requerido. 255 caracteres o menos. Letras, números y los siguientes caracteres @/./+/-/_/: solamente."
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:159 core/models.py:159
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr "nombre completo"
|
||||
|
||||
#: build/lib/core/models.py:160 core/models.py:160
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr "nombre abreviado"
|
||||
|
||||
#: build/lib/core/models.py:162 core/models.py:162
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr "correo electrónico de identidad"
|
||||
|
||||
#: build/lib/core/models.py:167 core/models.py:167
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr "correo electrónico del administrador"
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr "idioma"
|
||||
|
||||
#: build/lib/core/models.py:175 core/models.py:175
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr "El idioma en el que el usuario desea ver la interfaz."
|
||||
|
||||
#: build/lib/core/models.py:183 core/models.py:183
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr "La zona horaria en la que el usuario quiere ver los tiempos."
|
||||
|
||||
#: build/lib/core/models.py:186 core/models.py:186
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr "dispositivo"
|
||||
|
||||
#: build/lib/core/models.py:188 core/models.py:188
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr "Si el usuario es un dispositivo o un usuario real."
|
||||
|
||||
#: build/lib/core/models.py:191 core/models.py:191
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr "rol en el equipo"
|
||||
|
||||
#: build/lib/core/models.py:193 core/models.py:193
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr "Si el usuario puede iniciar sesión en esta página web de administración."
|
||||
|
||||
#: build/lib/core/models.py:196 core/models.py:196
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr "activo"
|
||||
|
||||
#: build/lib/core/models.py:199 core/models.py:199
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr "Si este usuario debe ser considerado como activo. Deseleccionar en lugar de eliminar cuentas."
|
||||
|
||||
#: build/lib/core/models.py:211 core/models.py:211
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr "usuario"
|
||||
|
||||
#: build/lib/core/models.py:212 core/models.py:212
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr "usuarios"
|
||||
|
||||
#: build/lib/core/models.py:368 build/lib/core/models.py:1283
|
||||
#: core/models.py:368 core/models.py:1283
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr "título"
|
||||
|
||||
#: build/lib/core/models.py:369 core/models.py:369
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr "resumen"
|
||||
|
||||
#: build/lib/core/models.py:418 core/models.py:418
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr "Documento"
|
||||
|
||||
#: build/lib/core/models.py:419 core/models.py:419
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr "Documentos"
|
||||
|
||||
#: build/lib/core/models.py:431 build/lib/core/models.py:821 core/models.py:431
|
||||
#: core/models.py:821
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr "Documento sin título"
|
||||
|
||||
#: build/lib/core/models.py:856 core/models.py:856
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "¡{name} ha compartido un documento contigo!"
|
||||
|
||||
#: build/lib/core/models.py:860 core/models.py:860
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, 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:866 core/models.py:866
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} ha compartido un documento contigo: {title}"
|
||||
|
||||
#: build/lib/core/models.py:966 core/models.py:966
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Traza del enlace de documento/usuario"
|
||||
|
||||
#: build/lib/core/models.py:967 core/models.py:967
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Trazas del enlace de documento/usuario"
|
||||
|
||||
#: build/lib/core/models.py:973 core/models.py:973
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
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:996 core/models.py:996
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr "Documento favorito"
|
||||
|
||||
#: build/lib/core/models.py:997 core/models.py:997
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr "Documentos favoritos"
|
||||
|
||||
#: build/lib/core/models.py:1003 core/models.py:1003
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
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:1025 core/models.py:1025
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr "Relación documento/usuario"
|
||||
|
||||
#: build/lib/core/models.py:1026 core/models.py:1026
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr "Relaciones documento/usuario"
|
||||
|
||||
#: build/lib/core/models.py:1032 core/models.py:1032
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Este usuario ya forma parte del documento."
|
||||
|
||||
#: build/lib/core/models.py:1038 core/models.py:1038
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Este equipo ya forma parte del documento."
|
||||
|
||||
#: build/lib/core/models.py:1044 build/lib/core/models.py:1369
|
||||
#: core/models.py:1044 core/models.py:1369
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
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:1190 core/models.py:1190
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1191 core/models.py:1191
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1197 core/models.py:1197
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
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:1262 core/models.py:1262
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr "¡{name} desea acceder a un documento!"
|
||||
|
||||
#: build/lib/core/models.py:1266 core/models.py:1266
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1272 core/models.py:1272
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1284 core/models.py:1284
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr "descripción"
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr "código"
|
||||
|
||||
#: build/lib/core/models.py:1286 core/models.py:1286
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr "css"
|
||||
|
||||
#: build/lib/core/models.py:1288 core/models.py:1288
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr "público"
|
||||
|
||||
#: build/lib/core/models.py:1290 core/models.py:1290
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr "Si esta plantilla es pública para que cualquiera la utilice."
|
||||
|
||||
#: build/lib/core/models.py:1296 core/models.py:1296
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr "Plantilla"
|
||||
|
||||
#: build/lib/core/models.py:1297 core/models.py:1297
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr "Plantillas"
|
||||
|
||||
#: build/lib/core/models.py:1350 core/models.py:1350
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr "Relación plantilla/usuario"
|
||||
|
||||
#: build/lib/core/models.py:1351 core/models.py:1351
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr "Relaciones plantilla/usuario"
|
||||
|
||||
#: build/lib/core/models.py:1357 core/models.py:1357
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr "Este usuario ya forma parte de la plantilla."
|
||||
|
||||
#: build/lib/core/models.py:1363 core/models.py:1363
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr "Este equipo ya se encuentra en esta plantilla."
|
||||
|
||||
#: build/lib/core/models.py:1440 core/models.py:1440
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr "dirección de correo electrónico"
|
||||
|
||||
#: build/lib/core/models.py:1459 core/models.py:1459
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr "Invitación al documento"
|
||||
|
||||
#: build/lib/core/models.py:1460 core/models.py:1460
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr "Invitaciones a documentos"
|
||||
|
||||
#: build/lib/core/models.py:1480 core/models.py:1480
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Este correo electrónico está asociado a un usuario registrado."
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-07-24 20:42+0000\n"
|
||||
"PO-Revision-Date: 2025-07-31 12:38\n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 11:45\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: French\n"
|
||||
"Language: fr_FR\n"
|
||||
@@ -44,33 +44,33 @@ msgstr "Je suis l'auteur"
|
||||
|
||||
#: build/lib/core/api/filters.py:64 core/api/filters.py:64
|
||||
msgid "Masked"
|
||||
msgstr ""
|
||||
msgstr "Masqué"
|
||||
|
||||
#: build/lib/core/api/filters.py:67 core/api/filters.py:67
|
||||
msgid "Favorite"
|
||||
msgstr "Favoris"
|
||||
|
||||
#: build/lib/core/api/serializers.py:467 core/api/serializers.py:467
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Un nouveau document a été créé pour vous !"
|
||||
|
||||
#: build/lib/core/api/serializers.py:471 core/api/serializers.py:471
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
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:608 core/api/serializers.py:608
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr "Corps"
|
||||
|
||||
#: build/lib/core/api/serializers.py:611 core/api/serializers.py:611
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr "Type de corps"
|
||||
|
||||
#: build/lib/core/api/serializers.py:617 core/api/serializers.py:617
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr "Format"
|
||||
|
||||
#: build/lib/core/api/viewsets.py:942 core/api/viewsets.py:942
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "copie de {title}"
|
||||
@@ -129,272 +129,268 @@ msgstr "Gauche"
|
||||
msgid "Right"
|
||||
msgstr "Droite"
|
||||
|
||||
#: build/lib/core/models.py:79 core/models.py:79
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr "identifiant/id"
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr "clé primaire pour l'enregistrement en tant que UUID"
|
||||
|
||||
#: build/lib/core/models.py:86 core/models.py:86
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr "créé le"
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr "date et heure de création de l'enregistrement"
|
||||
|
||||
#: build/lib/core/models.py:92 core/models.py:92
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr "mis à jour le"
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr "date et heure de la dernière mise à jour de l'enregistrement"
|
||||
|
||||
#: build/lib/core/models.py:129 core/models.py:129
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr "Nous n'avons pas pu trouver un utilisateur avec ce sous-groupe mais l'e-mail est déjà associé à un utilisateur enregistré."
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters."
|
||||
msgstr "Saisissez un sous-groupe valide. Cette valeur ne peut contenir que des lettres, des chiffres et les caractères @/./+/-/_/: uniquement."
|
||||
|
||||
#: build/lib/core/models.py:148 core/models.py:148
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr "sous-groupe"
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only."
|
||||
msgstr "Obligatoire. 255 caractères ou moins. Lettres, chiffres et caractères @/./+/-/_/: uniquement."
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr "Obligatoire. 255 caractères ou moins. Caractères ASCII uniquement."
|
||||
|
||||
#: build/lib/core/models.py:159 core/models.py:159
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr "nom complet"
|
||||
|
||||
#: build/lib/core/models.py:160 core/models.py:160
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr "nom court"
|
||||
|
||||
#: build/lib/core/models.py:162 core/models.py:162
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr "adresse e-mail d'identité"
|
||||
|
||||
#: build/lib/core/models.py:167 core/models.py:167
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr "adresse e-mail de l'administrateur"
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr "langue"
|
||||
|
||||
#: build/lib/core/models.py:175 core/models.py:175
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr "La langue dans laquelle l'utilisateur veut voir l'interface."
|
||||
|
||||
#: build/lib/core/models.py:183 core/models.py:183
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr "Le fuseau horaire dans lequel l'utilisateur souhaite voir les heures."
|
||||
|
||||
#: build/lib/core/models.py:186 core/models.py:186
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr "appareil"
|
||||
|
||||
#: build/lib/core/models.py:188 core/models.py:188
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr "Si l'utilisateur est un appareil ou un utilisateur réel."
|
||||
|
||||
#: build/lib/core/models.py:191 core/models.py:191
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr "statut d'équipe"
|
||||
|
||||
#: build/lib/core/models.py:193 core/models.py:193
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr "Si l'utilisateur peut se connecter à ce site d'administration."
|
||||
|
||||
#: build/lib/core/models.py:196 core/models.py:196
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr "actif"
|
||||
|
||||
#: build/lib/core/models.py:199 core/models.py:199
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr "Si cet utilisateur doit être traité comme actif. Désélectionnez ceci au lieu de supprimer des comptes."
|
||||
|
||||
#: build/lib/core/models.py:211 core/models.py:211
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr "utilisateur"
|
||||
|
||||
#: build/lib/core/models.py:212 core/models.py:212
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr "utilisateurs"
|
||||
|
||||
#: build/lib/core/models.py:368 build/lib/core/models.py:1283
|
||||
#: core/models.py:368 core/models.py:1283
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr "titre"
|
||||
|
||||
#: build/lib/core/models.py:369 core/models.py:369
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr "extrait"
|
||||
|
||||
#: build/lib/core/models.py:418 core/models.py:418
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr "Document"
|
||||
|
||||
#: build/lib/core/models.py:419 core/models.py:419
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr "Documents"
|
||||
|
||||
#: build/lib/core/models.py:431 build/lib/core/models.py:821 core/models.py:431
|
||||
#: core/models.py:821
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr "Document sans titre"
|
||||
|
||||
#: build/lib/core/models.py:856 core/models.py:856
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} a partagé un document avec vous!"
|
||||
|
||||
#: build/lib/core/models.py:860 core/models.py:860
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, 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:866 core/models.py:866
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, 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:966 core/models.py:966
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Trace du lien document/utilisateur"
|
||||
|
||||
#: build/lib/core/models.py:967 core/models.py:967
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Traces du lien document/utilisateur"
|
||||
|
||||
#: build/lib/core/models.py:973 core/models.py:973
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
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:996 core/models.py:996
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr "Document favori"
|
||||
|
||||
#: build/lib/core/models.py:997 core/models.py:997
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr "Documents favoris"
|
||||
|
||||
#: build/lib/core/models.py:1003 core/models.py:1003
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
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:1025 core/models.py:1025
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr "Relation document/utilisateur"
|
||||
|
||||
#: build/lib/core/models.py:1026 core/models.py:1026
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr "Relations document/utilisateur"
|
||||
|
||||
#: build/lib/core/models.py:1032 core/models.py:1032
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Cet utilisateur est déjà dans ce document."
|
||||
|
||||
#: build/lib/core/models.py:1038 core/models.py:1038
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Cette équipe est déjà dans ce document."
|
||||
|
||||
#: build/lib/core/models.py:1044 build/lib/core/models.py:1369
|
||||
#: core/models.py:1044 core/models.py:1369
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
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:1190 core/models.py:1190
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr "Demande d'accès au document"
|
||||
|
||||
#: build/lib/core/models.py:1191 core/models.py:1191
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr "Demande d'accès au document"
|
||||
|
||||
#: build/lib/core/models.py:1197 core/models.py:1197
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
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:1262 core/models.py:1262
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr "{name} souhaiterait accéder au document suivant !"
|
||||
|
||||
#: build/lib/core/models.py:1266 core/models.py:1266
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, 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:1272 core/models.py:1272
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, 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:1284 core/models.py:1284
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr "description"
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr "code"
|
||||
|
||||
#: build/lib/core/models.py:1286 core/models.py:1286
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr "CSS"
|
||||
|
||||
#: build/lib/core/models.py:1288 core/models.py:1288
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr "public"
|
||||
|
||||
#: build/lib/core/models.py:1290 core/models.py:1290
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr "Si ce modèle est public, utilisable par n'importe qui."
|
||||
|
||||
#: build/lib/core/models.py:1296 core/models.py:1296
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr "Modèle"
|
||||
|
||||
#: build/lib/core/models.py:1297 core/models.py:1297
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr "Modèles"
|
||||
|
||||
#: build/lib/core/models.py:1350 core/models.py:1350
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr "Relation modèle/utilisateur"
|
||||
|
||||
#: build/lib/core/models.py:1351 core/models.py:1351
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr "Relations modèle/utilisateur"
|
||||
|
||||
#: build/lib/core/models.py:1357 core/models.py:1357
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr "Cet utilisateur est déjà dans ce modèle."
|
||||
|
||||
#: build/lib/core/models.py:1363 core/models.py:1363
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr "Cette équipe est déjà modèle."
|
||||
|
||||
#: build/lib/core/models.py:1440 core/models.py:1440
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr "adresse e-mail"
|
||||
|
||||
#: build/lib/core/models.py:1459 core/models.py:1459
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr "Invitation à un document"
|
||||
|
||||
#: build/lib/core/models.py:1460 core/models.py:1460
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr "Invitations à un document"
|
||||
|
||||
#: build/lib/core/models.py:1480 core/models.py:1480
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Cette adresse email est déjà associée à un utilisateur inscrit."
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-07-24 20:42+0000\n"
|
||||
"PO-Revision-Date: 2025-07-31 12:38\n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 10:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Italian\n"
|
||||
"Language: it_IT\n"
|
||||
@@ -50,27 +50,27 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr "Preferiti"
|
||||
|
||||
#: build/lib/core/api/serializers.py:467 core/api/serializers.py:467
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Un nuovo documento è stato creato a tuo nome!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:471 core/api/serializers.py:471
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "Sei ora proprietario di un nuovo documento:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:608 core/api/serializers.py:608
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr "Corpo"
|
||||
|
||||
#: build/lib/core/api/serializers.py:611 core/api/serializers.py:611
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:617 core/api/serializers.py:617
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr "Formato"
|
||||
|
||||
#: build/lib/core/api/viewsets.py:942 core/api/viewsets.py:942
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "copia di {title}"
|
||||
@@ -129,272 +129,268 @@ msgstr "Sinistra"
|
||||
msgid "Right"
|
||||
msgstr "Destra"
|
||||
|
||||
#: build/lib/core/models.py:79 core/models.py:79
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr "Id"
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr "chiave primaria per il record come UUID"
|
||||
|
||||
#: build/lib/core/models.py:86 core/models.py:86
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr "creato il"
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr "data e ora in cui è stato creato un record"
|
||||
|
||||
#: build/lib/core/models.py:92 core/models.py:92
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr "aggiornato il"
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr "data e ora in cui l’ultimo record è stato aggiornato"
|
||||
|
||||
#: build/lib/core/models.py:129 core/models.py:129
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:148 core/models.py:148
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only."
|
||||
msgstr "Richiesto. 255 caratteri o meno. Solo lettere, numeri e @/./+/-/_/: caratteri."
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:159 core/models.py:159
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr "nome completo"
|
||||
|
||||
#: build/lib/core/models.py:160 core/models.py:160
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr "nome"
|
||||
|
||||
#: build/lib/core/models.py:162 core/models.py:162
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr "indirizzo email di identità"
|
||||
|
||||
#: build/lib/core/models.py:167 core/models.py:167
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr "Indirizzo email dell'amministratore"
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr "lingua"
|
||||
|
||||
#: build/lib/core/models.py:175 core/models.py:175
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr "La lingua in cui l'utente vuole vedere l'interfaccia."
|
||||
|
||||
#: build/lib/core/models.py:183 core/models.py:183
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr "Il fuso orario in cui l'utente vuole vedere gli orari."
|
||||
|
||||
#: build/lib/core/models.py:186 core/models.py:186
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr "dispositivo"
|
||||
|
||||
#: build/lib/core/models.py:188 core/models.py:188
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr "Se l'utente è un dispositivo o un utente reale."
|
||||
|
||||
#: build/lib/core/models.py:191 core/models.py:191
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr "stato del personale"
|
||||
|
||||
#: build/lib/core/models.py:193 core/models.py:193
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr "Indica se l'utente può accedere a questo sito amministratore."
|
||||
|
||||
#: build/lib/core/models.py:196 core/models.py:196
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr "attivo"
|
||||
|
||||
#: build/lib/core/models.py:199 core/models.py:199
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr "Indica se questo utente deve essere trattato come attivo. Deseleziona invece di eliminare gli account."
|
||||
|
||||
#: build/lib/core/models.py:211 core/models.py:211
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr "utente"
|
||||
|
||||
#: build/lib/core/models.py:212 core/models.py:212
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr "utenti"
|
||||
|
||||
#: build/lib/core/models.py:368 build/lib/core/models.py:1283
|
||||
#: core/models.py:368 core/models.py:1283
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr "titolo"
|
||||
|
||||
#: build/lib/core/models.py:369 core/models.py:369
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:418 core/models.py:418
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr "Documento"
|
||||
|
||||
#: build/lib/core/models.py:419 core/models.py:419
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr "Documenti"
|
||||
|
||||
#: build/lib/core/models.py:431 build/lib/core/models.py:821 core/models.py:431
|
||||
#: core/models.py:821
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr "Documento senza titolo"
|
||||
|
||||
#: build/lib/core/models.py:856 core/models.py:856
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} ha condiviso un documento con te!"
|
||||
|
||||
#: build/lib/core/models.py:860 core/models.py:860
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, 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:866 core/models.py:866
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, 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:966 core/models.py:966
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:967 core/models.py:967
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:973 core/models.py:973
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:996 core/models.py:996
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr "Documento preferito"
|
||||
|
||||
#: build/lib/core/models.py:997 core/models.py:997
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr "Documenti preferiti"
|
||||
|
||||
#: build/lib/core/models.py:1003 core/models.py:1003
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1025 core/models.py:1025
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1026 core/models.py:1026
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1032 core/models.py:1032
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Questo utente è già presente in questo documento."
|
||||
|
||||
#: build/lib/core/models.py:1038 core/models.py:1038
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Questo team è già presente in questo documento."
|
||||
|
||||
#: build/lib/core/models.py:1044 build/lib/core/models.py:1369
|
||||
#: core/models.py:1044 core/models.py:1369
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1190 core/models.py:1190
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1191 core/models.py:1191
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1197 core/models.py:1197
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1262 core/models.py:1262
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1266 core/models.py:1266
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1272 core/models.py:1272
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1284 core/models.py:1284
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr "descrizione"
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr "code"
|
||||
|
||||
#: build/lib/core/models.py:1286 core/models.py:1286
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr "css"
|
||||
|
||||
#: build/lib/core/models.py:1288 core/models.py:1288
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr "pubblico"
|
||||
|
||||
#: build/lib/core/models.py:1290 core/models.py:1290
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr "Indica se questo modello è pubblico per chiunque."
|
||||
|
||||
#: build/lib/core/models.py:1296 core/models.py:1296
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr "Modello"
|
||||
|
||||
#: build/lib/core/models.py:1297 core/models.py:1297
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr "Modelli"
|
||||
|
||||
#: build/lib/core/models.py:1350 core/models.py:1350
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1351 core/models.py:1351
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1357 core/models.py:1357
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr "Questo utente è già in questo modello."
|
||||
|
||||
#: build/lib/core/models.py:1363 core/models.py:1363
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr "Questo team è già in questo modello."
|
||||
|
||||
#: build/lib/core/models.py:1440 core/models.py:1440
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr "indirizzo e-mail"
|
||||
|
||||
#: build/lib/core/models.py:1459 core/models.py:1459
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr "Invito al documento"
|
||||
|
||||
#: build/lib/core/models.py:1460 core/models.py:1460
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr "Inviti al documento"
|
||||
|
||||
#: build/lib/core/models.py:1480 core/models.py:1480
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Questa email è già associata a un utente registrato."
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-07-24 20:42+0000\n"
|
||||
"PO-Revision-Date: 2025-07-31 12:38\n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 10:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Dutch\n"
|
||||
"Language: nl_NL\n"
|
||||
@@ -50,27 +50,27 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr "Favoriete"
|
||||
|
||||
#: build/lib/core/api/serializers.py:467 core/api/serializers.py:467
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Een nieuw document was gecreëerd voor u!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:471 core/api/serializers.py:471
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "U heeft eigenaarschap van een nieuw document:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:608 core/api/serializers.py:608
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr "Text"
|
||||
|
||||
#: build/lib/core/api/serializers.py:611 core/api/serializers.py:611
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr "Text type"
|
||||
|
||||
#: build/lib/core/api/serializers.py:617 core/api/serializers.py:617
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr "Formaat"
|
||||
|
||||
#: build/lib/core/api/viewsets.py:942 core/api/viewsets.py:942
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "kopie van {title}"
|
||||
@@ -129,272 +129,268 @@ msgstr "Links"
|
||||
msgid "Right"
|
||||
msgstr "Rechts"
|
||||
|
||||
#: build/lib/core/models.py:79 core/models.py:79
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr "id"
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr "primaire sleutel voor dossier als UUID"
|
||||
|
||||
#: build/lib/core/models.py:86 core/models.py:86
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr "gemaakt op"
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr "datum en tijd wanneer dossier was gecreëerd"
|
||||
|
||||
#: build/lib/core/models.py:92 core/models.py:92
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr "Laatst gewijzigd op"
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr "datum en tijd waarop dossier laatst was gewijzigd"
|
||||
|
||||
#: build/lib/core/models.py:129 core/models.py:129
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr "Wij konden geen gebruiker vinden met deze id, maar de email is al geassocieerd met een geregistreerde gebruiker."
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters."
|
||||
msgstr ".Geef een valide id. De waarde mag alleen letters, nummers en @/./.+/-/_: karakters bevatten."
|
||||
|
||||
#: build/lib/core/models.py:148 core/models.py:148
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr "id"
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only."
|
||||
msgstr "Verplicht. 255 karakters of minder. Alleen letters, nummers en @/./+/-/_/: karakters zijn toegestaan."
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:159 core/models.py:159
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr "volledige naam"
|
||||
|
||||
#: build/lib/core/models.py:160 core/models.py:160
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr "gebruikersnaam"
|
||||
|
||||
#: build/lib/core/models.py:162 core/models.py:162
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr "identiteit email adres"
|
||||
|
||||
#: build/lib/core/models.py:167 core/models.py:167
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr "admin email adres"
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr "taal"
|
||||
|
||||
#: build/lib/core/models.py:175 core/models.py:175
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr "De taal waarin de gebruiker de interface wilt zien."
|
||||
|
||||
#: build/lib/core/models.py:183 core/models.py:183
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr "De tijdzone waarin de gebruiker de tijden wilt zien."
|
||||
|
||||
#: build/lib/core/models.py:186 core/models.py:186
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr "apparaat"
|
||||
|
||||
#: build/lib/core/models.py:188 core/models.py:188
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr "Of de gebruiker een apparaat is of een echte gebruiker."
|
||||
|
||||
#: build/lib/core/models.py:191 core/models.py:191
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr "beheerder status"
|
||||
|
||||
#: build/lib/core/models.py:193 core/models.py:193
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr "Of de gebruiker kan inloggen in het admin gedeelte."
|
||||
|
||||
#: build/lib/core/models.py:196 core/models.py:196
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr "actief"
|
||||
|
||||
#: build/lib/core/models.py:199 core/models.py:199
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr "Of een gebruiker als actief moet worden beschouwd. Deselecteer dit in plaats van het account te deleten."
|
||||
|
||||
#: build/lib/core/models.py:211 core/models.py:211
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr "gebruiker"
|
||||
|
||||
#: build/lib/core/models.py:212 core/models.py:212
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr "gebruikers"
|
||||
|
||||
#: build/lib/core/models.py:368 build/lib/core/models.py:1283
|
||||
#: core/models.py:368 core/models.py:1283
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr "titel"
|
||||
|
||||
#: build/lib/core/models.py:369 core/models.py:369
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr "uittreksel"
|
||||
|
||||
#: build/lib/core/models.py:418 core/models.py:418
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr "Document"
|
||||
|
||||
#: build/lib/core/models.py:419 core/models.py:419
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr "Documenten"
|
||||
|
||||
#: build/lib/core/models.py:431 build/lib/core/models.py:821 core/models.py:431
|
||||
#: core/models.py:821
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr "Naamloos Document"
|
||||
|
||||
#: build/lib/core/models.py:856 core/models.py:856
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} heeft een document met gedeeld!"
|
||||
|
||||
#: build/lib/core/models.py:860 core/models.py:860
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, 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:866 core/models.py:866
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, 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:966 core/models.py:966
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Document/gebruiker url"
|
||||
|
||||
#: build/lib/core/models.py:967 core/models.py:967
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Document/gebruiker url"
|
||||
|
||||
#: build/lib/core/models.py:973 core/models.py:973
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "Een url bestaat al voor dit document/deze gebruiker."
|
||||
|
||||
#: build/lib/core/models.py:996 core/models.py:996
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr "Document favoriet"
|
||||
|
||||
#: build/lib/core/models.py:997 core/models.py:997
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr "Document favorieten"
|
||||
|
||||
#: build/lib/core/models.py:1003 core/models.py:1003
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "Dit document is al in gebruik als favoriete door dezelfde gebruiker."
|
||||
|
||||
#: build/lib/core/models.py:1025 core/models.py:1025
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr "Document/gebruiker relatie"
|
||||
|
||||
#: build/lib/core/models.py:1026 core/models.py:1026
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr "Document/gebruiker relaties"
|
||||
|
||||
#: build/lib/core/models.py:1032 core/models.py:1032
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr "De gebruiker is al in dit document."
|
||||
|
||||
#: build/lib/core/models.py:1038 core/models.py:1038
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Het team is al in dit document."
|
||||
|
||||
#: build/lib/core/models.py:1044 build/lib/core/models.py:1369
|
||||
#: core/models.py:1044 core/models.py:1369
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
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:1190 core/models.py:1190
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1191 core/models.py:1191
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1197 core/models.py:1197
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1262 core/models.py:1262
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1266 core/models.py:1266
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1272 core/models.py:1272
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1284 core/models.py:1284
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr "omschrijving"
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr "code"
|
||||
|
||||
#: build/lib/core/models.py:1286 core/models.py:1286
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr "css"
|
||||
|
||||
#: build/lib/core/models.py:1288 core/models.py:1288
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr "publiek"
|
||||
|
||||
#: build/lib/core/models.py:1290 core/models.py:1290
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr "Of dit template als publiek is en door iedereen te gebruiken is."
|
||||
|
||||
#: build/lib/core/models.py:1296 core/models.py:1296
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr "Template"
|
||||
|
||||
#: build/lib/core/models.py:1297 core/models.py:1297
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr "Templates"
|
||||
|
||||
#: build/lib/core/models.py:1350 core/models.py:1350
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr "Template/gebruiker relatie"
|
||||
|
||||
#: build/lib/core/models.py:1351 core/models.py:1351
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr "Template/gebruiker relaties"
|
||||
|
||||
#: build/lib/core/models.py:1357 core/models.py:1357
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr "De gebruiker bestaat al in dit template."
|
||||
|
||||
#: build/lib/core/models.py:1363 core/models.py:1363
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr "Het team bestaat al in dit template."
|
||||
|
||||
#: build/lib/core/models.py:1440 core/models.py:1440
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr "email adres"
|
||||
|
||||
#: build/lib/core/models.py:1459 core/models.py:1459
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr "Document uitnodiging"
|
||||
|
||||
#: build/lib/core/models.py:1460 core/models.py:1460
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr "Document uitnodigingen"
|
||||
|
||||
#: build/lib/core/models.py:1480 core/models.py:1480
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Deze email is al geassocieerd met een geregistreerde gebruiker."
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-07-24 20:42+0000\n"
|
||||
"PO-Revision-Date: 2025-07-31 12:38\n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 10:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Portuguese\n"
|
||||
"Language: pt_PT\n"
|
||||
@@ -50,27 +50,27 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr "Favorito"
|
||||
|
||||
#: build/lib/core/api/serializers.py:467 core/api/serializers.py:467
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Um novo documento foi criado em seu nome!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:471 core/api/serializers.py:471
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
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:608 core/api/serializers.py:608
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr "Corpo"
|
||||
|
||||
#: build/lib/core/api/serializers.py:611 core/api/serializers.py:611
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr "Tipo de corpo"
|
||||
|
||||
#: build/lib/core/api/serializers.py:617 core/api/serializers.py:617
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr "Formato"
|
||||
|
||||
#: build/lib/core/api/viewsets.py:942 core/api/viewsets.py:942
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "cópia de {title}"
|
||||
@@ -129,272 +129,268 @@ msgstr ""
|
||||
msgid "Right"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:79 core/models.py:79
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:86 core/models.py:86
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:92 core/models.py:92
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:129 core/models.py:129
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:148 core/models.py:148
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only."
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:159 core/models.py:159
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:160 core/models.py:160
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:162 core/models.py:162
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:167 core/models.py:167
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:175 core/models.py:175
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:183 core/models.py:183
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:186 core/models.py:186
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:188 core/models.py:188
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:191 core/models.py:191
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:193 core/models.py:193
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:196 core/models.py:196
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:199 core/models.py:199
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:211 core/models.py:211
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:212 core/models.py:212
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:368 build/lib/core/models.py:1283
|
||||
#: core/models.py:368 core/models.py:1283
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:369 core/models.py:369
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:418 core/models.py:418
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:419 core/models.py:419
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:431 build/lib/core/models.py:821 core/models.py:431
|
||||
#: core/models.py:821
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:856 core/models.py:856
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:860 core/models.py:860
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:866 core/models.py:866
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:966 core/models.py:966
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:967 core/models.py:967
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:973 core/models.py:973
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:996 core/models.py:996
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:997 core/models.py:997
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1003 core/models.py:1003
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1025 core/models.py:1025
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1026 core/models.py:1026
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1032 core/models.py:1032
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1038 core/models.py:1038
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1044 build/lib/core/models.py:1369
|
||||
#: core/models.py:1044 core/models.py:1369
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1190 core/models.py:1190
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1191 core/models.py:1191
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1197 core/models.py:1197
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1262 core/models.py:1262
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1266 core/models.py:1266
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1272 core/models.py:1272
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1284 core/models.py:1284
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1286 core/models.py:1286
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1288 core/models.py:1288
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1290 core/models.py:1290
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1296 core/models.py:1296
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1297 core/models.py:1297
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1350 core/models.py:1350
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1351 core/models.py:1351
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1357 core/models.py:1357
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1363 core/models.py:1363
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1440 core/models.py:1440
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1459 core/models.py:1459
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1460 core/models.py:1460
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1480 core/models.py:1480
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -0,0 +1,417 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 10:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Russian\n"
|
||||
"Language: ru_RU\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
|
||||
"X-Crowdin-Project: lasuite-docs\n"
|
||||
"X-Crowdin-Project-ID: 754523\n"
|
||||
"X-Crowdin-Language: ru\n"
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:37 core/admin.py:37
|
||||
msgid "Personal info"
|
||||
msgstr "Личная информация"
|
||||
|
||||
#: build/lib/core/admin.py:50 build/lib/core/admin.py:138 core/admin.py:50
|
||||
#: core/admin.py:138
|
||||
msgid "Permissions"
|
||||
msgstr "Разрешения"
|
||||
|
||||
#: build/lib/core/admin.py:62 core/admin.py:62
|
||||
msgid "Important dates"
|
||||
msgstr "Важные даты"
|
||||
|
||||
#: build/lib/core/admin.py:148 core/admin.py:148
|
||||
msgid "Tree structure"
|
||||
msgstr "Древовидная структура"
|
||||
|
||||
#: build/lib/core/api/filters.py:47 core/api/filters.py:47
|
||||
msgid "Title"
|
||||
msgstr "Заголовок"
|
||||
|
||||
#: build/lib/core/api/filters.py:61 core/api/filters.py:61
|
||||
msgid "Creator is me"
|
||||
msgstr "Создатель - я"
|
||||
|
||||
#: build/lib/core/api/filters.py:64 core/api/filters.py:64
|
||||
msgid "Masked"
|
||||
msgstr "Скрытый"
|
||||
|
||||
#: build/lib/core/api/filters.py:67 core/api/filters.py:67
|
||||
msgid "Favorite"
|
||||
msgstr "Избранное"
|
||||
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Новый документ был создан от вашего имени!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "Вы назначены владельцем для нового документа:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr "Текст сообщения"
|
||||
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr "Тип сообщения"
|
||||
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr "Формат"
|
||||
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "копия {title}"
|
||||
|
||||
#: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
|
||||
#: core/choices.py:42
|
||||
msgid "Reader"
|
||||
msgstr "Читатель"
|
||||
|
||||
#: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
|
||||
#: core/choices.py:43
|
||||
msgid "Editor"
|
||||
msgstr "Редактор"
|
||||
|
||||
#: build/lib/core/choices.py:44 core/choices.py:44
|
||||
msgid "Administrator"
|
||||
msgstr "Администратор"
|
||||
|
||||
#: build/lib/core/choices.py:45 core/choices.py:45
|
||||
msgid "Owner"
|
||||
msgstr "Владелец"
|
||||
|
||||
#: build/lib/core/choices.py:56 core/choices.py:56
|
||||
msgid "Restricted"
|
||||
msgstr "Доступ ограничен"
|
||||
|
||||
#: build/lib/core/choices.py:60 core/choices.py:60
|
||||
msgid "Authenticated"
|
||||
msgstr "Аутентификация выполнена"
|
||||
|
||||
#: build/lib/core/choices.py:62 core/choices.py:62
|
||||
msgid "Public"
|
||||
msgstr "Доступно всем"
|
||||
|
||||
#: build/lib/core/enums.py:36 core/enums.py:36
|
||||
msgid "First child"
|
||||
msgstr "Первый потомок"
|
||||
|
||||
#: build/lib/core/enums.py:37 core/enums.py:37
|
||||
msgid "Last child"
|
||||
msgstr "Последний потомок"
|
||||
|
||||
#: build/lib/core/enums.py:38 core/enums.py:38
|
||||
msgid "First sibling"
|
||||
msgstr "Первый предок"
|
||||
|
||||
#: build/lib/core/enums.py:39 core/enums.py:39
|
||||
msgid "Last sibling"
|
||||
msgstr "Последний предок"
|
||||
|
||||
#: build/lib/core/enums.py:40 core/enums.py:40
|
||||
msgid "Left"
|
||||
msgstr "Слева"
|
||||
|
||||
#: build/lib/core/enums.py:41 core/enums.py:41
|
||||
msgid "Right"
|
||||
msgstr "Справа"
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr "id"
|
||||
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr "первичный ключ для записи как UUID"
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr "создано"
|
||||
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr "дата и время создания записи"
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr "обновлено"
|
||||
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr "дата и время последнего обновления записи"
|
||||
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr "Мы не смогли найти пользователя с этими данными, но этот адрес уже связан с зарегистрированным пользователем."
|
||||
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr "вложение"
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr "Обязательно. 255 символов или меньше. Только ASCII символы."
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr "полное имя"
|
||||
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr "короткое имя"
|
||||
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr "личный адрес электронной почты"
|
||||
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr "e-mail администратора"
|
||||
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr "язык"
|
||||
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr "Язык, на котором пользователь хочет видеть интерфейс."
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr "Часовой пояс, в котором пользователь хочет видеть время."
|
||||
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr "устройство"
|
||||
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr "Пользователь является устройством или человеком."
|
||||
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr "статус сотрудника"
|
||||
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr "Может ли пользователь войти на этот административный сайт."
|
||||
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr "активный"
|
||||
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr "Должен ли пользователь рассматриваться как активный. Альтернатива удалению учётных записей."
|
||||
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr "пользователь"
|
||||
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr "пользователи"
|
||||
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr "заголовок"
|
||||
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr "отрывок"
|
||||
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr "Документ"
|
||||
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr "Документы"
|
||||
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr "Безымянный документ"
|
||||
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} делится с вами документом!"
|
||||
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "{name} приглашает вас присоединиться к следующему документу с ролью \"{role}\":"
|
||||
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} делится с вами документом: {title}"
|
||||
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Трассировка связи документ/пользователь"
|
||||
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Трассировка связей документ/пользователь"
|
||||
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "Для этого документа/пользователя уже существует трассировка ссылки."
|
||||
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr "Избранный документ"
|
||||
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr "Избранные документы"
|
||||
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "Этот документ уже помечен как избранный для этого пользователя."
|
||||
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr "Отношение документ/пользователь"
|
||||
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr "Отношения документ/пользователь"
|
||||
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Этот пользователь уже имеет доступ к этому документу."
|
||||
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Эта команда уже имеет доступ к этому документу."
|
||||
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr "Может быть выбран либо пользователь, либо команда, но не оба варианта сразу."
|
||||
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr "Документ запрашивает доступ"
|
||||
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr "Документ запрашивает доступы"
|
||||
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr "Этот пользователь уже запросил доступ к этому документу."
|
||||
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr "{name} хочет получить доступ к документу!"
|
||||
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr "{name} хочет получить доступ к следующему документу:"
|
||||
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr "{name} запрашивает доступ к документу: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr "описание"
|
||||
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr "код"
|
||||
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr "css"
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr "доступно всем"
|
||||
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr "Этот шаблон доступен всем пользователям."
|
||||
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr "Шаблон"
|
||||
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr "Шаблоны"
|
||||
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr "Отношение шаблон/пользователь"
|
||||
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr "Отношения шаблон/пользователь"
|
||||
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr "Этот пользователь уже указан в этом шаблоне."
|
||||
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr "Эта команда уже указана в этом шаблоне."
|
||||
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr "адрес электронной почты"
|
||||
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr "Приглашение для документа"
|
||||
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr "Приглашения для документов"
|
||||
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Этот адрес уже связан с зарегистрированным пользователем."
|
||||
|
||||
#: core/templates/mail/html/template.html:162
|
||||
#: core/templates/mail/text/template.txt:3
|
||||
msgid "Logo email"
|
||||
msgstr "Логотип email"
|
||||
|
||||
#: core/templates/mail/html/template.html:209
|
||||
#: core/templates/mail/text/template.txt:10
|
||||
msgid "Open"
|
||||
msgstr "Открыть"
|
||||
|
||||
#: core/templates/mail/html/template.html:226
|
||||
#: core/templates/mail/text/template.txt:14
|
||||
msgid " Docs, your new essential tool for organizing, sharing and collaborating on your documents as a team. "
|
||||
msgstr " Docs, ваш новый инструмент для организации и совместного использования документов в вашей команде. "
|
||||
|
||||
#: core/templates/mail/html/template.html:233
|
||||
#: core/templates/mail/text/template.txt:16
|
||||
#, python-format
|
||||
msgid " Brought to you by %(brandname)s "
|
||||
msgstr " Доступ получен от %(brandname)s "
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-07-24 20:42+0000\n"
|
||||
"PO-Revision-Date: 2025-07-31 12:38\n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 10:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Slovenian\n"
|
||||
"Language: sl_SI\n"
|
||||
@@ -50,27 +50,27 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr "Priljubljena"
|
||||
|
||||
#: build/lib/core/api/serializers.py:467 core/api/serializers.py:467
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
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:471 core/api/serializers.py:471
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
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:608 core/api/serializers.py:608
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr "Telo"
|
||||
|
||||
#: build/lib/core/api/serializers.py:611 core/api/serializers.py:611
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr "Vrsta telesa"
|
||||
|
||||
#: build/lib/core/api/serializers.py:617 core/api/serializers.py:617
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr "Oblika"
|
||||
|
||||
#: build/lib/core/api/viewsets.py:942 core/api/viewsets.py:942
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr ""
|
||||
@@ -129,272 +129,268 @@ msgstr "Levo"
|
||||
msgid "Right"
|
||||
msgstr "Desno"
|
||||
|
||||
#: build/lib/core/models.py:79 core/models.py:79
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr "primarni ključ za zapis kot UUID"
|
||||
|
||||
#: build/lib/core/models.py:86 core/models.py:86
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr "ustvarjen na"
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr "datum in čas, ko je bil zapis ustvarjen"
|
||||
|
||||
#: build/lib/core/models.py:92 core/models.py:92
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr "posodobljeno dne"
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr "datum in čas, ko je bil zapis nazadnje posodobljen"
|
||||
|
||||
#: build/lib/core/models.py:129 core/models.py:129
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr "Nismo mogli najti uporabnika s tem sub, vendar je e-poštni naslov že povezan z registriranim uporabnikom."
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters."
|
||||
msgstr "Vnesite veljavno sub. Ta vrednost lahko vsebuje samo črke, številke in znake @/./+/-/_/:."
|
||||
|
||||
#: build/lib/core/models.py:148 core/models.py:148
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only."
|
||||
msgstr "Obvezno. 255 znakov ali manj. Samo črke, številke in znaki @/./+/-/_/: ."
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:159 core/models.py:159
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr "polno ime"
|
||||
|
||||
#: build/lib/core/models.py:160 core/models.py:160
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr "kratko ime"
|
||||
|
||||
#: build/lib/core/models.py:162 core/models.py:162
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr "elektronski naslov identitete"
|
||||
|
||||
#: build/lib/core/models.py:167 core/models.py:167
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr "elektronski naslov skrbnika"
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr "jezik"
|
||||
|
||||
#: build/lib/core/models.py:175 core/models.py:175
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr "Jezik, v katerem uporabnik želi videti vmesnik."
|
||||
|
||||
#: build/lib/core/models.py:183 core/models.py:183
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr "Časovni pas, v katerem želi uporabnik videti uro."
|
||||
|
||||
#: build/lib/core/models.py:186 core/models.py:186
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr "naprava"
|
||||
|
||||
#: build/lib/core/models.py:188 core/models.py:188
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr "Ali je uporabnik naprava ali pravi uporabnik."
|
||||
|
||||
#: build/lib/core/models.py:191 core/models.py:191
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr "kadrovski status"
|
||||
|
||||
#: build/lib/core/models.py:193 core/models.py:193
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr "Ali se uporabnik lahko prijavi na to skrbniško mesto."
|
||||
|
||||
#: build/lib/core/models.py:196 core/models.py:196
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr "aktivni"
|
||||
|
||||
#: build/lib/core/models.py:199 core/models.py:199
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr "Ali je treba tega uporabnika obravnavati kot aktivnega. Namesto brisanja računov počistite to izbiro."
|
||||
|
||||
#: build/lib/core/models.py:211 core/models.py:211
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr "uporabnik"
|
||||
|
||||
#: build/lib/core/models.py:212 core/models.py:212
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr "uporabniki"
|
||||
|
||||
#: build/lib/core/models.py:368 build/lib/core/models.py:1283
|
||||
#: core/models.py:368 core/models.py:1283
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr "naslov"
|
||||
|
||||
#: build/lib/core/models.py:369 core/models.py:369
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr "odlomek"
|
||||
|
||||
#: build/lib/core/models.py:418 core/models.py:418
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr "Dokument"
|
||||
|
||||
#: build/lib/core/models.py:419 core/models.py:419
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr "Dokumenti"
|
||||
|
||||
#: build/lib/core/models.py:431 build/lib/core/models.py:821 core/models.py:431
|
||||
#: core/models.py:821
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr "Dokument brez naslova"
|
||||
|
||||
#: build/lib/core/models.py:856 core/models.py:856
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} je delil dokument z vami!"
|
||||
|
||||
#: build/lib/core/models.py:860 core/models.py:860
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, 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:866 core/models.py:866
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} je delil dokument z vami: {title}"
|
||||
|
||||
#: build/lib/core/models.py:966 core/models.py:966
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Dokument/sled povezave uporabnika"
|
||||
|
||||
#: build/lib/core/models.py:967 core/models.py:967
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Sledi povezav dokumenta/uporabnika"
|
||||
|
||||
#: build/lib/core/models.py:973 core/models.py:973
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "Za ta dokument/uporabnika že obstaja sled povezave."
|
||||
|
||||
#: build/lib/core/models.py:996 core/models.py:996
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr "Priljubljeni dokument"
|
||||
|
||||
#: build/lib/core/models.py:997 core/models.py:997
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr "Priljubljeni dokumenti"
|
||||
|
||||
#: build/lib/core/models.py:1003 core/models.py:1003
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
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:1025 core/models.py:1025
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr "Odnos dokument/uporabnik"
|
||||
|
||||
#: build/lib/core/models.py:1026 core/models.py:1026
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr "Odnosi dokument/uporabnik"
|
||||
|
||||
#: build/lib/core/models.py:1032 core/models.py:1032
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Ta uporabnik je že v tem dokumentu."
|
||||
|
||||
#: build/lib/core/models.py:1038 core/models.py:1038
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Ta ekipa je že v tem dokumentu."
|
||||
|
||||
#: build/lib/core/models.py:1044 build/lib/core/models.py:1369
|
||||
#: core/models.py:1044 core/models.py:1369
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
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:1190 core/models.py:1190
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1191 core/models.py:1191
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1197 core/models.py:1197
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1262 core/models.py:1262
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1266 core/models.py:1266
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1272 core/models.py:1272
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1284 core/models.py:1284
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr "opis"
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr "koda"
|
||||
|
||||
#: build/lib/core/models.py:1286 core/models.py:1286
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr "css"
|
||||
|
||||
#: build/lib/core/models.py:1288 core/models.py:1288
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr "javno"
|
||||
|
||||
#: build/lib/core/models.py:1290 core/models.py:1290
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr "Ali je ta predloga javna za uporabo."
|
||||
|
||||
#: build/lib/core/models.py:1296 core/models.py:1296
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr "Predloga"
|
||||
|
||||
#: build/lib/core/models.py:1297 core/models.py:1297
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr "Predloge"
|
||||
|
||||
#: build/lib/core/models.py:1350 core/models.py:1350
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr "Odnos predloga/uporabnik"
|
||||
|
||||
#: build/lib/core/models.py:1351 core/models.py:1351
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr "Odnosi med predlogo in uporabnikom"
|
||||
|
||||
#: build/lib/core/models.py:1357 core/models.py:1357
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr "Ta uporabnik je že v tej predlogi."
|
||||
|
||||
#: build/lib/core/models.py:1363 core/models.py:1363
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr "Ta ekipa je že v tej predlogi."
|
||||
|
||||
#: build/lib/core/models.py:1440 core/models.py:1440
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr "elektronski naslov"
|
||||
|
||||
#: build/lib/core/models.py:1459 core/models.py:1459
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr "Vabilo na dokument"
|
||||
|
||||
#: build/lib/core/models.py:1460 core/models.py:1460
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr "Vabila na dokument"
|
||||
|
||||
#: build/lib/core/models.py:1480 core/models.py:1480
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Ta e-poštni naslov je že povezan z registriranim uporabnikom."
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-07-24 20:42+0000\n"
|
||||
"PO-Revision-Date: 2025-07-31 12:38\n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 10:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Swedish\n"
|
||||
"Language: sv_SE\n"
|
||||
@@ -50,27 +50,27 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr "Favoriter"
|
||||
|
||||
#: build/lib/core/api/serializers.py:467 core/api/serializers.py:467
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Ett nytt dokument skapades åt dig!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:471 core/api/serializers.py:471
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
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:608 core/api/serializers.py:608
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:611 core/api/serializers.py:611
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:617 core/api/serializers.py:617
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr "Format"
|
||||
|
||||
#: build/lib/core/api/viewsets.py:942 core/api/viewsets.py:942
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr ""
|
||||
@@ -129,272 +129,268 @@ msgstr ""
|
||||
msgid "Right"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:79 core/models.py:79
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:86 core/models.py:86
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:92 core/models.py:92
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:129 core/models.py:129
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:148 core/models.py:148
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only."
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:159 core/models.py:159
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:160 core/models.py:160
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:162 core/models.py:162
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:167 core/models.py:167
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:175 core/models.py:175
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:183 core/models.py:183
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:186 core/models.py:186
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:188 core/models.py:188
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:191 core/models.py:191
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:193 core/models.py:193
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:196 core/models.py:196
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr "aktiv"
|
||||
|
||||
#: build/lib/core/models.py:199 core/models.py:199
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:211 core/models.py:211
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:212 core/models.py:212
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:368 build/lib/core/models.py:1283
|
||||
#: core/models.py:368 core/models.py:1283
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:369 core/models.py:369
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:418 core/models.py:418
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:419 core/models.py:419
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:431 build/lib/core/models.py:821 core/models.py:431
|
||||
#: core/models.py:821
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:856 core/models.py:856
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:860 core/models.py:860
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:866 core/models.py:866
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:966 core/models.py:966
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:967 core/models.py:967
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:973 core/models.py:973
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:996 core/models.py:996
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:997 core/models.py:997
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1003 core/models.py:1003
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1025 core/models.py:1025
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1026 core/models.py:1026
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1032 core/models.py:1032
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1038 core/models.py:1038
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1044 build/lib/core/models.py:1369
|
||||
#: core/models.py:1044 core/models.py:1369
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1190 core/models.py:1190
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1191 core/models.py:1191
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1197 core/models.py:1197
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1262 core/models.py:1262
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1266 core/models.py:1266
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1272 core/models.py:1272
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1284 core/models.py:1284
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1286 core/models.py:1286
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1288 core/models.py:1288
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1290 core/models.py:1290
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1296 core/models.py:1296
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1297 core/models.py:1297
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1350 core/models.py:1350
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1351 core/models.py:1351
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1357 core/models.py:1357
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1363 core/models.py:1363
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1440 core/models.py:1440
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr "e-postadress"
|
||||
|
||||
#: build/lib/core/models.py:1459 core/models.py:1459
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr "Bjud in dokument"
|
||||
|
||||
#: build/lib/core/models.py:1460 core/models.py:1460
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr "Inbjudningar dokument"
|
||||
|
||||
#: build/lib/core/models.py:1480 core/models.py:1480
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Denna e-postadress är redan associerad med en registrerad användare."
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-07-24 20:42+0000\n"
|
||||
"PO-Revision-Date: 2025-07-31 12:38\n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 10:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Turkish\n"
|
||||
"Language: tr_TR\n"
|
||||
@@ -50,27 +50,27 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:467 core/api/serializers.py:467
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:471 core/api/serializers.py:471
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:608 core/api/serializers.py:608
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:611 core/api/serializers.py:611
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/serializers.py:617 core/api/serializers.py:617
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/api/viewsets.py:942 core/api/viewsets.py:942
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr ""
|
||||
@@ -129,272 +129,268 @@ msgstr ""
|
||||
msgid "Right"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:79 core/models.py:79
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:86 core/models.py:86
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:92 core/models.py:92
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:129 core/models.py:129
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:148 core/models.py:148
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only."
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:159 core/models.py:159
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:160 core/models.py:160
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:162 core/models.py:162
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:167 core/models.py:167
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:175 core/models.py:175
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:183 core/models.py:183
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:186 core/models.py:186
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:188 core/models.py:188
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:191 core/models.py:191
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:193 core/models.py:193
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:196 core/models.py:196
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:199 core/models.py:199
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:211 core/models.py:211
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:212 core/models.py:212
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:368 build/lib/core/models.py:1283
|
||||
#: core/models.py:368 core/models.py:1283
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:369 core/models.py:369
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:418 core/models.py:418
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:419 core/models.py:419
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:431 build/lib/core/models.py:821 core/models.py:431
|
||||
#: core/models.py:821
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:856 core/models.py:856
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:860 core/models.py:860
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:866 core/models.py:866
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:966 core/models.py:966
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:967 core/models.py:967
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:973 core/models.py:973
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:996 core/models.py:996
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:997 core/models.py:997
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1003 core/models.py:1003
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1025 core/models.py:1025
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1026 core/models.py:1026
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1032 core/models.py:1032
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1038 core/models.py:1038
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1044 build/lib/core/models.py:1369
|
||||
#: core/models.py:1044 core/models.py:1369
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1190 core/models.py:1190
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1191 core/models.py:1191
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1197 core/models.py:1197
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1262 core/models.py:1262
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1266 core/models.py:1266
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1272 core/models.py:1272
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1284 core/models.py:1284
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1286 core/models.py:1286
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1288 core/models.py:1288
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1290 core/models.py:1290
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1296 core/models.py:1296
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1297 core/models.py:1297
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1350 core/models.py:1350
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1351 core/models.py:1351
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1357 core/models.py:1357
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1363 core/models.py:1363
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1440 core/models.py:1440
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1459 core/models.py:1459
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1460 core/models.py:1460
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1480 core/models.py:1480
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -0,0 +1,417 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 10:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Ukrainian\n"
|
||||
"Language: uk_UA\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
|
||||
"X-Crowdin-Project: lasuite-docs\n"
|
||||
"X-Crowdin-Project-ID: 754523\n"
|
||||
"X-Crowdin-Language: uk\n"
|
||||
"X-Crowdin-File: backend-impress.pot\n"
|
||||
"X-Crowdin-File-ID: 18\n"
|
||||
|
||||
#: build/lib/core/admin.py:37 core/admin.py:37
|
||||
msgid "Personal info"
|
||||
msgstr "Особисті дані"
|
||||
|
||||
#: build/lib/core/admin.py:50 build/lib/core/admin.py:138 core/admin.py:50
|
||||
#: core/admin.py:138
|
||||
msgid "Permissions"
|
||||
msgstr "Дозволи"
|
||||
|
||||
#: build/lib/core/admin.py:62 core/admin.py:62
|
||||
msgid "Important dates"
|
||||
msgstr "Важливі дати"
|
||||
|
||||
#: build/lib/core/admin.py:148 core/admin.py:148
|
||||
msgid "Tree structure"
|
||||
msgstr "Ієрархічна структура"
|
||||
|
||||
#: build/lib/core/api/filters.py:47 core/api/filters.py:47
|
||||
msgid "Title"
|
||||
msgstr "Заголовок"
|
||||
|
||||
#: build/lib/core/api/filters.py:61 core/api/filters.py:61
|
||||
msgid "Creator is me"
|
||||
msgstr "Творець — я"
|
||||
|
||||
#: build/lib/core/api/filters.py:64 core/api/filters.py:64
|
||||
msgid "Masked"
|
||||
msgstr "Приховано"
|
||||
|
||||
#: build/lib/core/api/filters.py:67 core/api/filters.py:67
|
||||
msgid "Favorite"
|
||||
msgstr "Обране"
|
||||
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "Новий документ був створений від вашого імені!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "Ви тепер є власником нового документа:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr "Вміст"
|
||||
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr "Тип вмісту"
|
||||
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr "Формат"
|
||||
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "копія {title}"
|
||||
|
||||
#: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
|
||||
#: core/choices.py:42
|
||||
msgid "Reader"
|
||||
msgstr "Читач"
|
||||
|
||||
#: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
|
||||
#: core/choices.py:43
|
||||
msgid "Editor"
|
||||
msgstr "Редактор"
|
||||
|
||||
#: build/lib/core/choices.py:44 core/choices.py:44
|
||||
msgid "Administrator"
|
||||
msgstr "Адміністратор"
|
||||
|
||||
#: build/lib/core/choices.py:45 core/choices.py:45
|
||||
msgid "Owner"
|
||||
msgstr "Власник"
|
||||
|
||||
#: build/lib/core/choices.py:56 core/choices.py:56
|
||||
msgid "Restricted"
|
||||
msgstr "Обмежено"
|
||||
|
||||
#: build/lib/core/choices.py:60 core/choices.py:60
|
||||
msgid "Authenticated"
|
||||
msgstr "Підтверджено"
|
||||
|
||||
#: build/lib/core/choices.py:62 core/choices.py:62
|
||||
msgid "Public"
|
||||
msgstr "Публічне"
|
||||
|
||||
#: build/lib/core/enums.py:36 core/enums.py:36
|
||||
msgid "First child"
|
||||
msgstr "Перший нащадок"
|
||||
|
||||
#: build/lib/core/enums.py:37 core/enums.py:37
|
||||
msgid "Last child"
|
||||
msgstr "Останній нащадок"
|
||||
|
||||
#: build/lib/core/enums.py:38 core/enums.py:38
|
||||
msgid "First sibling"
|
||||
msgstr "Перший пращур"
|
||||
|
||||
#: build/lib/core/enums.py:39 core/enums.py:39
|
||||
msgid "Last sibling"
|
||||
msgstr "Останній пращур"
|
||||
|
||||
#: build/lib/core/enums.py:40 core/enums.py:40
|
||||
msgid "Left"
|
||||
msgstr "Ліворуч"
|
||||
|
||||
#: build/lib/core/enums.py:41 core/enums.py:41
|
||||
msgid "Right"
|
||||
msgstr "Праворуч"
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr "id"
|
||||
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr "первинний ключ для запису як UUID"
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr "створено"
|
||||
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr "дата і час, коли запис було створено"
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr "оновлено"
|
||||
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr "дата і час, коли запис був востаннє оновлений"
|
||||
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr "Ми не змогли знайти користувача з цими даними, але адреса вже пов'язана з зареєстрованим користувачем."
|
||||
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr "вкладений документ"
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr "Обов'язкове. 255 символів або менше. Тільки символи ASCII."
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr "повне ім'я"
|
||||
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr "коротке ім'я"
|
||||
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr "адреса електронної пошти особи"
|
||||
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr "електронна адреса адміністратора"
|
||||
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr "мова"
|
||||
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr "Мова, якою користувач хоче бачити інтерфейс."
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr "Часовий пояс, в якому користувач хоче бачити час."
|
||||
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr "пристрій"
|
||||
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr "Чи є користувач пристроєм чи реальним користувачем."
|
||||
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr "статус співробітника"
|
||||
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr "Чи може користувач увійти на цей сайт адміністратора."
|
||||
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr "активний"
|
||||
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr "Чи слід ставитися до цього користувача як до активного. Зніміть вибір замість видалення облікового запису."
|
||||
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr "користувач"
|
||||
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr "користувачі"
|
||||
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr "заголовок"
|
||||
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr "уривок"
|
||||
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr "Документ"
|
||||
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr "Документи"
|
||||
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr "Документ без назви"
|
||||
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} ділиться з вами документом!"
|
||||
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "{name} запрошує вас для роботи з документом із роллю \"{role}\":"
|
||||
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} ділиться з вами документом: {title}"
|
||||
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr "Трасування посилання Документ/користувач"
|
||||
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr "Трасування посилань Документ/користувач"
|
||||
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "Відстеження вже існуючих посилань для цього документа/користувача."
|
||||
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr "Обраний документ"
|
||||
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr "Обрані документи"
|
||||
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "Цей документ вже вказаний як обраний для одного користувача."
|
||||
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr "Відносини документ/користувач"
|
||||
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr "Відносини документ/користувач"
|
||||
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr "Цей користувач вже має доступ до цього документу."
|
||||
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr "Ця команда вже має доступ до цього документа."
|
||||
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr "Вкажіть користувача або команду, а не обох."
|
||||
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr "Запит доступу до документа"
|
||||
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr "Запит доступу для документа"
|
||||
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr "Цей користувач вже попросив доступ до цього документа."
|
||||
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr "{name} хоче отримати доступ до документа!"
|
||||
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr "{name} бажає отримати доступ до наступного документа:"
|
||||
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr "{name} запитує доступ до документа: {title}"
|
||||
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr "опис"
|
||||
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr "код"
|
||||
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr "css"
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr "публічне"
|
||||
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr "Чи є цей шаблон публічним для будь-кого користувача."
|
||||
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr "Шаблон"
|
||||
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr "Шаблони"
|
||||
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr "Відношення шаблон/користувач"
|
||||
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr "Відношення шаблон/користувач"
|
||||
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr "Цей користувач вже має доступ до цього шаблону."
|
||||
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr "Ця команда вже має доступ до цього шаблону."
|
||||
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr "електронна адреса"
|
||||
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr "Запрошення до редагування документа"
|
||||
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr "Запрошення до редагування документів"
|
||||
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "Ця електронна пошта вже пов'язана з зареєстрованим користувачем."
|
||||
|
||||
#: core/templates/mail/html/template.html:162
|
||||
#: core/templates/mail/text/template.txt:3
|
||||
msgid "Logo email"
|
||||
msgstr "Логотип пошти"
|
||||
|
||||
#: core/templates/mail/html/template.html:209
|
||||
#: core/templates/mail/text/template.txt:10
|
||||
msgid "Open"
|
||||
msgstr "Відкрити"
|
||||
|
||||
#: core/templates/mail/html/template.html:226
|
||||
#: core/templates/mail/text/template.txt:14
|
||||
msgid " Docs, your new essential tool for organizing, sharing and collaborating on your documents as a team. "
|
||||
msgstr " Docs, ваш новий важливий інструмент для організації, обміну та командної співпраці над вашими документами. "
|
||||
|
||||
#: core/templates/mail/html/template.html:233
|
||||
#: core/templates/mail/text/template.txt:16
|
||||
#, python-format
|
||||
msgid " Brought to you by %(brandname)s "
|
||||
msgstr " Запрошення отримане від %(brandname)s "
|
||||
|
||||
@@ -2,8 +2,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lasuite-docs\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-07-24 20:42+0000\n"
|
||||
"PO-Revision-Date: 2025-07-31 12:38\n"
|
||||
"POT-Creation-Date: 2025-09-01 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-09-04 10:03\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Chinese Simplified\n"
|
||||
"Language: zh_CN\n"
|
||||
@@ -50,27 +50,27 @@ msgstr ""
|
||||
msgid "Favorite"
|
||||
msgstr "收藏"
|
||||
|
||||
#: build/lib/core/api/serializers.py:467 core/api/serializers.py:467
|
||||
#: build/lib/core/api/serializers.py:487 core/api/serializers.py:487
|
||||
msgid "A new document was created on your behalf!"
|
||||
msgstr "已为您创建了一份新文档!"
|
||||
|
||||
#: build/lib/core/api/serializers.py:471 core/api/serializers.py:471
|
||||
#: build/lib/core/api/serializers.py:491 core/api/serializers.py:491
|
||||
msgid "You have been granted ownership of a new document:"
|
||||
msgstr "您已被授予新文档的所有权:"
|
||||
|
||||
#: build/lib/core/api/serializers.py:608 core/api/serializers.py:608
|
||||
#: build/lib/core/api/serializers.py:628 core/api/serializers.py:628
|
||||
msgid "Body"
|
||||
msgstr "正文"
|
||||
|
||||
#: build/lib/core/api/serializers.py:611 core/api/serializers.py:611
|
||||
#: build/lib/core/api/serializers.py:631 core/api/serializers.py:631
|
||||
msgid "Body type"
|
||||
msgstr "正文类型"
|
||||
|
||||
#: build/lib/core/api/serializers.py:617 core/api/serializers.py:617
|
||||
#: build/lib/core/api/serializers.py:637 core/api/serializers.py:637
|
||||
msgid "Format"
|
||||
msgstr "格式"
|
||||
|
||||
#: build/lib/core/api/viewsets.py:942 core/api/viewsets.py:942
|
||||
#: build/lib/core/api/viewsets.py:960 core/api/viewsets.py:960
|
||||
#, python-brace-format
|
||||
msgid "copy of {title}"
|
||||
msgstr "{title} 的副本"
|
||||
@@ -129,272 +129,268 @@ msgstr "左"
|
||||
msgid "Right"
|
||||
msgstr "右"
|
||||
|
||||
#: build/lib/core/models.py:79 core/models.py:79
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
msgid "id"
|
||||
msgstr "id"
|
||||
|
||||
#: build/lib/core/models.py:80 core/models.py:80
|
||||
#: build/lib/core/models.py:81 core/models.py:81
|
||||
msgid "primary key for the record as UUID"
|
||||
msgstr "记录的主密钥为 UUID"
|
||||
|
||||
#: build/lib/core/models.py:86 core/models.py:86
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
msgid "created on"
|
||||
msgstr "创建时间"
|
||||
|
||||
#: build/lib/core/models.py:87 core/models.py:87
|
||||
#: build/lib/core/models.py:88 core/models.py:88
|
||||
msgid "date and time at which a record was created"
|
||||
msgstr "记录的创建日期和时间"
|
||||
|
||||
#: build/lib/core/models.py:92 core/models.py:92
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
msgid "updated on"
|
||||
msgstr "更新时间"
|
||||
|
||||
#: build/lib/core/models.py:93 core/models.py:93
|
||||
#: build/lib/core/models.py:94 core/models.py:94
|
||||
msgid "date and time at which a record was last updated"
|
||||
msgstr "记录的最后更新时间"
|
||||
|
||||
#: build/lib/core/models.py:129 core/models.py:129
|
||||
#: build/lib/core/models.py:130 core/models.py:130
|
||||
msgid "We couldn't find a user with this sub but the email is already associated with a registered user."
|
||||
msgstr "未找到具有该 sub 的用户,但该邮箱已关联到一个注册用户。"
|
||||
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_/: characters."
|
||||
msgstr "请输入有效的 sub。该值只能包含字母、数字及 @/./+/-/_/: 字符。"
|
||||
|
||||
#: build/lib/core/models.py:148 core/models.py:148
|
||||
#: build/lib/core/models.py:141 core/models.py:141
|
||||
msgid "sub"
|
||||
msgstr "sub"
|
||||
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_/: characters only."
|
||||
msgstr "必填。最多 255 个字符,仅允许字母、数字及 @/./+/-/_/: 字符。"
|
||||
#: build/lib/core/models.py:142 core/models.py:142
|
||||
msgid "Required. 255 characters or fewer. ASCII characters only."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:159 core/models.py:159
|
||||
#: build/lib/core/models.py:150 core/models.py:150
|
||||
msgid "full name"
|
||||
msgstr "全名"
|
||||
|
||||
#: build/lib/core/models.py:160 core/models.py:160
|
||||
#: build/lib/core/models.py:151 core/models.py:151
|
||||
msgid "short name"
|
||||
msgstr "简称"
|
||||
|
||||
#: build/lib/core/models.py:162 core/models.py:162
|
||||
#: build/lib/core/models.py:153 core/models.py:153
|
||||
msgid "identity email address"
|
||||
msgstr "身份电子邮件地址"
|
||||
|
||||
#: build/lib/core/models.py:167 core/models.py:167
|
||||
#: build/lib/core/models.py:158 core/models.py:158
|
||||
msgid "admin email address"
|
||||
msgstr "管理员电子邮件地址"
|
||||
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
#: build/lib/core/models.py:165 core/models.py:165
|
||||
msgid "language"
|
||||
msgstr "语言"
|
||||
|
||||
#: build/lib/core/models.py:175 core/models.py:175
|
||||
#: build/lib/core/models.py:166 core/models.py:166
|
||||
msgid "The language in which the user wants to see the interface."
|
||||
msgstr "用户希望看到的界面语言。"
|
||||
|
||||
#: build/lib/core/models.py:183 core/models.py:183
|
||||
#: build/lib/core/models.py:174 core/models.py:174
|
||||
msgid "The timezone in which the user wants to see times."
|
||||
msgstr "用户查看时间希望的时区。"
|
||||
|
||||
#: build/lib/core/models.py:186 core/models.py:186
|
||||
#: build/lib/core/models.py:177 core/models.py:177
|
||||
msgid "device"
|
||||
msgstr "设备"
|
||||
|
||||
#: build/lib/core/models.py:188 core/models.py:188
|
||||
#: build/lib/core/models.py:179 core/models.py:179
|
||||
msgid "Whether the user is a device or a real user."
|
||||
msgstr "用户是设备还是真实用户。"
|
||||
|
||||
#: build/lib/core/models.py:191 core/models.py:191
|
||||
#: build/lib/core/models.py:182 core/models.py:182
|
||||
msgid "staff status"
|
||||
msgstr "员工状态"
|
||||
|
||||
#: build/lib/core/models.py:193 core/models.py:193
|
||||
#: build/lib/core/models.py:184 core/models.py:184
|
||||
msgid "Whether the user can log into this admin site."
|
||||
msgstr "用户是否可以登录该管理员站点。"
|
||||
|
||||
#: build/lib/core/models.py:196 core/models.py:196
|
||||
#: build/lib/core/models.py:187 core/models.py:187
|
||||
msgid "active"
|
||||
msgstr "激活"
|
||||
|
||||
#: build/lib/core/models.py:199 core/models.py:199
|
||||
#: build/lib/core/models.py:190 core/models.py:190
|
||||
msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts."
|
||||
msgstr "是否应将此用户视为活跃用户。取消选择此选项而不是删除账户。"
|
||||
|
||||
#: build/lib/core/models.py:211 core/models.py:211
|
||||
#: build/lib/core/models.py:202 core/models.py:202
|
||||
msgid "user"
|
||||
msgstr "用户"
|
||||
|
||||
#: build/lib/core/models.py:212 core/models.py:212
|
||||
#: build/lib/core/models.py:203 core/models.py:203
|
||||
msgid "users"
|
||||
msgstr "个用户"
|
||||
|
||||
#: build/lib/core/models.py:368 build/lib/core/models.py:1283
|
||||
#: core/models.py:368 core/models.py:1283
|
||||
#: build/lib/core/models.py:359 build/lib/core/models.py:1280
|
||||
#: core/models.py:359 core/models.py:1280
|
||||
msgid "title"
|
||||
msgstr "标题"
|
||||
|
||||
#: build/lib/core/models.py:369 core/models.py:369
|
||||
#: build/lib/core/models.py:360 core/models.py:360
|
||||
msgid "excerpt"
|
||||
msgstr "摘要"
|
||||
|
||||
#: build/lib/core/models.py:418 core/models.py:418
|
||||
#: build/lib/core/models.py:409 core/models.py:409
|
||||
msgid "Document"
|
||||
msgstr "文档"
|
||||
|
||||
#: build/lib/core/models.py:419 core/models.py:419
|
||||
#: build/lib/core/models.py:410 core/models.py:410
|
||||
msgid "Documents"
|
||||
msgstr "个文档"
|
||||
|
||||
#: build/lib/core/models.py:431 build/lib/core/models.py:821 core/models.py:431
|
||||
#: core/models.py:821
|
||||
#: build/lib/core/models.py:422 build/lib/core/models.py:818 core/models.py:422
|
||||
#: core/models.py:818
|
||||
msgid "Untitled Document"
|
||||
msgstr "未命名文档"
|
||||
|
||||
#: build/lib/core/models.py:856 core/models.py:856
|
||||
#: build/lib/core/models.py:853 core/models.py:853
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you!"
|
||||
msgstr "{name} 与您共享了一个文档!"
|
||||
|
||||
#: build/lib/core/models.py:860 core/models.py:860
|
||||
#: build/lib/core/models.py:857 core/models.py:857
|
||||
#, python-brace-format
|
||||
msgid "{name} invited you with the role \"{role}\" on the following document:"
|
||||
msgstr "{name} 邀请您以“{role}”角色访问以下文档:"
|
||||
|
||||
#: build/lib/core/models.py:866 core/models.py:866
|
||||
#: build/lib/core/models.py:863 core/models.py:863
|
||||
#, python-brace-format
|
||||
msgid "{name} shared a document with you: {title}"
|
||||
msgstr "{name} 与您共享了一个文档:{title}"
|
||||
|
||||
#: build/lib/core/models.py:966 core/models.py:966
|
||||
#: build/lib/core/models.py:963 core/models.py:963
|
||||
msgid "Document/user link trace"
|
||||
msgstr "文档/用户链接跟踪"
|
||||
|
||||
#: build/lib/core/models.py:967 core/models.py:967
|
||||
#: build/lib/core/models.py:964 core/models.py:964
|
||||
msgid "Document/user link traces"
|
||||
msgstr "个文档/用户链接跟踪"
|
||||
|
||||
#: build/lib/core/models.py:973 core/models.py:973
|
||||
#: build/lib/core/models.py:970 core/models.py:970
|
||||
msgid "A link trace already exists for this document/user."
|
||||
msgstr "此文档/用户的链接跟踪已存在。"
|
||||
|
||||
#: build/lib/core/models.py:996 core/models.py:996
|
||||
#: build/lib/core/models.py:993 core/models.py:993
|
||||
msgid "Document favorite"
|
||||
msgstr "文档收藏"
|
||||
|
||||
#: build/lib/core/models.py:997 core/models.py:997
|
||||
#: build/lib/core/models.py:994 core/models.py:994
|
||||
msgid "Document favorites"
|
||||
msgstr "文档收藏夹"
|
||||
|
||||
#: build/lib/core/models.py:1003 core/models.py:1003
|
||||
#: build/lib/core/models.py:1000 core/models.py:1000
|
||||
msgid "This document is already targeted by a favorite relation instance for the same user."
|
||||
msgstr "该文档已被同一用户的收藏关系实例关联。"
|
||||
|
||||
#: build/lib/core/models.py:1025 core/models.py:1025
|
||||
#: build/lib/core/models.py:1022 core/models.py:1022
|
||||
msgid "Document/user relation"
|
||||
msgstr "文档/用户关系"
|
||||
|
||||
#: build/lib/core/models.py:1026 core/models.py:1026
|
||||
#: build/lib/core/models.py:1023 core/models.py:1023
|
||||
msgid "Document/user relations"
|
||||
msgstr "文档/用户关系集"
|
||||
|
||||
#: build/lib/core/models.py:1032 core/models.py:1032
|
||||
#: build/lib/core/models.py:1029 core/models.py:1029
|
||||
msgid "This user is already in this document."
|
||||
msgstr "该用户已在此文档中。"
|
||||
|
||||
#: build/lib/core/models.py:1038 core/models.py:1038
|
||||
#: build/lib/core/models.py:1035 core/models.py:1035
|
||||
msgid "This team is already in this document."
|
||||
msgstr "该团队已在此文档中。"
|
||||
|
||||
#: build/lib/core/models.py:1044 build/lib/core/models.py:1369
|
||||
#: core/models.py:1044 core/models.py:1369
|
||||
#: build/lib/core/models.py:1041 build/lib/core/models.py:1366
|
||||
#: core/models.py:1041 core/models.py:1366
|
||||
msgid "Either user or team must be set, not both."
|
||||
msgstr "必须设置用户或团队之一,不能同时设置两者。"
|
||||
|
||||
#: build/lib/core/models.py:1190 core/models.py:1190
|
||||
#: build/lib/core/models.py:1187 core/models.py:1187
|
||||
msgid "Document ask for access"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1191 core/models.py:1191
|
||||
#: build/lib/core/models.py:1188 core/models.py:1188
|
||||
msgid "Document ask for accesses"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1197 core/models.py:1197
|
||||
#: build/lib/core/models.py:1194 core/models.py:1194
|
||||
msgid "This user has already asked for access to this document."
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1262 core/models.py:1262
|
||||
#: build/lib/core/models.py:1259 core/models.py:1259
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to a document!"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1266 core/models.py:1266
|
||||
#: build/lib/core/models.py:1263 core/models.py:1263
|
||||
#, python-brace-format
|
||||
msgid "{name} would like access to the following document:"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1272 core/models.py:1272
|
||||
#: build/lib/core/models.py:1269 core/models.py:1269
|
||||
#, python-brace-format
|
||||
msgid "{name} is asking for access to the document: {title}"
|
||||
msgstr ""
|
||||
|
||||
#: build/lib/core/models.py:1284 core/models.py:1284
|
||||
#: build/lib/core/models.py:1281 core/models.py:1281
|
||||
msgid "description"
|
||||
msgstr "说明"
|
||||
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
#: build/lib/core/models.py:1282 core/models.py:1282
|
||||
msgid "code"
|
||||
msgstr "代码"
|
||||
|
||||
#: build/lib/core/models.py:1286 core/models.py:1286
|
||||
#: build/lib/core/models.py:1283 core/models.py:1283
|
||||
msgid "css"
|
||||
msgstr "css"
|
||||
|
||||
#: build/lib/core/models.py:1288 core/models.py:1288
|
||||
#: build/lib/core/models.py:1285 core/models.py:1285
|
||||
msgid "public"
|
||||
msgstr "公开"
|
||||
|
||||
#: build/lib/core/models.py:1290 core/models.py:1290
|
||||
#: build/lib/core/models.py:1287 core/models.py:1287
|
||||
msgid "Whether this template is public for anyone to use."
|
||||
msgstr "该模板是否公开供任何人使用。"
|
||||
|
||||
#: build/lib/core/models.py:1296 core/models.py:1296
|
||||
#: build/lib/core/models.py:1293 core/models.py:1293
|
||||
msgid "Template"
|
||||
msgstr "模板"
|
||||
|
||||
#: build/lib/core/models.py:1297 core/models.py:1297
|
||||
#: build/lib/core/models.py:1294 core/models.py:1294
|
||||
msgid "Templates"
|
||||
msgstr "模板"
|
||||
|
||||
#: build/lib/core/models.py:1350 core/models.py:1350
|
||||
#: build/lib/core/models.py:1347 core/models.py:1347
|
||||
msgid "Template/user relation"
|
||||
msgstr "模板/用户关系"
|
||||
|
||||
#: build/lib/core/models.py:1351 core/models.py:1351
|
||||
#: build/lib/core/models.py:1348 core/models.py:1348
|
||||
msgid "Template/user relations"
|
||||
msgstr "模板/用户关系集"
|
||||
|
||||
#: build/lib/core/models.py:1357 core/models.py:1357
|
||||
#: build/lib/core/models.py:1354 core/models.py:1354
|
||||
msgid "This user is already in this template."
|
||||
msgstr "该用户已在此模板中。"
|
||||
|
||||
#: build/lib/core/models.py:1363 core/models.py:1363
|
||||
#: build/lib/core/models.py:1360 core/models.py:1360
|
||||
msgid "This team is already in this template."
|
||||
msgstr "该团队已在此模板中。"
|
||||
|
||||
#: build/lib/core/models.py:1440 core/models.py:1440
|
||||
#: build/lib/core/models.py:1437 core/models.py:1437
|
||||
msgid "email address"
|
||||
msgstr "电子邮件地址"
|
||||
|
||||
#: build/lib/core/models.py:1459 core/models.py:1459
|
||||
#: build/lib/core/models.py:1456 core/models.py:1456
|
||||
msgid "Document invitation"
|
||||
msgstr "文档邀请"
|
||||
|
||||
#: build/lib/core/models.py:1460 core/models.py:1460
|
||||
#: build/lib/core/models.py:1457 core/models.py:1457
|
||||
msgid "Document invitations"
|
||||
msgstr "文档邀请"
|
||||
|
||||
#: build/lib/core/models.py:1480 core/models.py:1480
|
||||
#: build/lib/core/models.py:1477 core/models.py:1477
|
||||
msgid "This email is already associated to a registered user."
|
||||
msgstr "此电子邮件已经与现有注册用户关联。"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "impress"
|
||||
version = "3.5.0"
|
||||
version = "3.6.0"
|
||||
authors = [{ "name" = "DINUM", "email" = "dev@mail.numerique.gouv.fr" }]
|
||||
classifiers = [
|
||||
"Development Status :: 5 - Production/Stable",
|
||||
|
||||
@@ -25,7 +25,7 @@ test.describe('Doc Export', () => {
|
||||
await createDoc(page, 'doc-editor', browserName, 1);
|
||||
await page
|
||||
.getByRole('button', {
|
||||
name: 'download',
|
||||
name: 'Export the document',
|
||||
})
|
||||
.click();
|
||||
|
||||
@@ -78,8 +78,7 @@ test.describe('Doc Export', () => {
|
||||
|
||||
await page
|
||||
.getByRole('button', {
|
||||
name: 'download',
|
||||
exact: true,
|
||||
name: 'Export the document',
|
||||
})
|
||||
.click();
|
||||
|
||||
@@ -130,8 +129,7 @@ test.describe('Doc Export', () => {
|
||||
|
||||
await page
|
||||
.getByRole('button', {
|
||||
name: 'download',
|
||||
exact: true,
|
||||
name: 'Export the document',
|
||||
})
|
||||
.click();
|
||||
|
||||
@@ -200,7 +198,7 @@ test.describe('Doc Export', () => {
|
||||
|
||||
await page
|
||||
.getByRole('button', {
|
||||
name: 'download',
|
||||
name: 'Export the document',
|
||||
})
|
||||
.click();
|
||||
|
||||
@@ -277,7 +275,7 @@ test.describe('Doc Export', () => {
|
||||
|
||||
await page
|
||||
.getByRole('button', {
|
||||
name: 'download',
|
||||
name: 'Export the document',
|
||||
})
|
||||
.click();
|
||||
|
||||
@@ -327,8 +325,7 @@ test.describe('Doc Export', () => {
|
||||
|
||||
await page
|
||||
.getByRole('button', {
|
||||
name: 'download',
|
||||
exact: true,
|
||||
name: 'Export the document',
|
||||
})
|
||||
.click();
|
||||
|
||||
@@ -390,8 +387,7 @@ test.describe('Doc Export', () => {
|
||||
|
||||
await page
|
||||
.getByRole('button', {
|
||||
name: 'download',
|
||||
exact: true,
|
||||
name: 'Export the document',
|
||||
})
|
||||
.click();
|
||||
|
||||
@@ -465,8 +461,7 @@ test.describe('Doc Export', () => {
|
||||
|
||||
await page
|
||||
.getByRole('button', {
|
||||
name: 'download',
|
||||
exact: true,
|
||||
name: 'Export the document',
|
||||
})
|
||||
.click();
|
||||
|
||||
@@ -537,8 +532,7 @@ test.describe('Doc Export', () => {
|
||||
|
||||
await page
|
||||
.getByRole('button', {
|
||||
name: 'download',
|
||||
exact: true,
|
||||
name: 'Export the document',
|
||||
})
|
||||
.click();
|
||||
|
||||
|
||||
@@ -44,7 +44,9 @@ test.describe('Doc Header', () => {
|
||||
|
||||
await expect(card.getByText('Owner ·')).toBeVisible();
|
||||
await expect(page.getByRole('button', { name: 'Share' })).toBeVisible();
|
||||
await expect(page.getByRole('button', { name: 'download' })).toBeVisible();
|
||||
await expect(
|
||||
page.getByRole('button', { name: 'Export the document' }),
|
||||
).toBeVisible();
|
||||
await expect(
|
||||
page.getByRole('button', { name: 'Open the document options' }),
|
||||
).toBeVisible();
|
||||
@@ -59,6 +61,31 @@ test.describe('Doc Header', () => {
|
||||
await verifyDocName(page, 'Hello World');
|
||||
});
|
||||
|
||||
test('it updates the title doc adding a leading emoji', async ({
|
||||
page,
|
||||
browserName,
|
||||
}) => {
|
||||
await createDoc(page, 'doc-update', browserName, 1);
|
||||
const docTitle = page.getByRole('textbox', { name: 'doc title input' });
|
||||
await expect(docTitle).toBeVisible();
|
||||
await docTitle.fill('👍 Hello Emoji World');
|
||||
await docTitle.blur();
|
||||
await verifyDocName(page, '👍 Hello Emoji World');
|
||||
|
||||
// Check the tree
|
||||
const docTree = page.getByTestId('doc-tree');
|
||||
await expect(docTree.getByText('Hello Emoji World')).toBeVisible();
|
||||
await expect(docTree.getByLabel('Document emoji icon')).toBeVisible();
|
||||
await expect(docTree.getByLabel('Simple document icon')).toBeHidden();
|
||||
|
||||
await page.getByTestId('home-button').click();
|
||||
|
||||
// Check the documents grid
|
||||
const gridRow = await getGridRow(page, 'Hello Emoji World');
|
||||
await expect(gridRow.getByLabel('Document emoji icon')).toBeVisible();
|
||||
await expect(gridRow.getByLabel('Simple document icon')).toBeHidden();
|
||||
});
|
||||
|
||||
test('it deletes the doc', async ({ page, browserName }) => {
|
||||
const [randomDoc] = await createDoc(page, 'doc-delete', browserName, 1);
|
||||
|
||||
@@ -115,7 +142,9 @@ test.describe('Doc Header', () => {
|
||||
|
||||
await goToGridDoc(page);
|
||||
|
||||
await expect(page.getByRole('button', { name: 'download' })).toBeVisible();
|
||||
await expect(
|
||||
page.getByRole('button', { name: 'Export the document' }),
|
||||
).toBeVisible();
|
||||
|
||||
await page.getByLabel('Open the document options').click();
|
||||
|
||||
@@ -185,7 +214,9 @@ test.describe('Doc Header', () => {
|
||||
|
||||
await goToGridDoc(page);
|
||||
|
||||
await expect(page.getByRole('button', { name: 'download' })).toBeVisible();
|
||||
await expect(
|
||||
page.getByRole('button', { name: 'Export the document' }),
|
||||
).toBeVisible();
|
||||
await page.getByLabel('Open the document options').click();
|
||||
|
||||
await expect(page.getByLabel('Delete document')).toBeDisabled();
|
||||
@@ -245,7 +276,9 @@ test.describe('Doc Header', () => {
|
||||
|
||||
await goToGridDoc(page);
|
||||
|
||||
await expect(page.getByRole('button', { name: 'download' })).toBeVisible();
|
||||
await expect(
|
||||
page.getByRole('button', { name: 'Export the document' }),
|
||||
).toBeVisible();
|
||||
await page.getByLabel('Open the document options').click();
|
||||
|
||||
await expect(page.getByLabel('Delete document')).toBeDisabled();
|
||||
|
||||
@@ -21,7 +21,7 @@ test.describe('Footer', () => {
|
||||
await expect(footer.getByAltText('Docs Logo')).toBeVisible();
|
||||
await expect(footer.getByRole('heading', { name: 'Docs' })).toBeVisible();
|
||||
|
||||
await expect(footer.getByRole('link', { name: 'Github' })).toBeVisible();
|
||||
await expect(footer.getByRole('link', { name: 'GitHub' })).toBeVisible();
|
||||
await expect(footer.getByRole('link', { name: 'DINUM' })).toBeVisible();
|
||||
await expect(footer.getByRole('link', { name: 'ZenDiS' })).toBeVisible();
|
||||
|
||||
|
||||
@@ -136,9 +136,11 @@ export const getGridRow = async (page: Page, title: string) => {
|
||||
|
||||
const rows = docsGrid.getByRole('row');
|
||||
|
||||
const row = rows.filter({
|
||||
hasText: title,
|
||||
});
|
||||
const row = rows
|
||||
.filter({
|
||||
hasText: title,
|
||||
})
|
||||
.first();
|
||||
|
||||
await expect(row).toBeVisible();
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "app-e2e",
|
||||
"version": "3.5.0",
|
||||
"version": "3.6.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"lint": "eslint . --ext .ts",
|
||||
@@ -12,7 +12,7 @@
|
||||
"test:ui::chromium": "yarn test:ui --project=chromium"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "1.54.2",
|
||||
"@playwright/test": "1.55.0",
|
||||
"@types/node": "*",
|
||||
"@types/pdf-parse": "1.1.5",
|
||||
"eslint-config-impress": "*",
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
NEXT_PUBLIC_API_ORIGIN=http://test.jest
|
||||
NEXT_PUBLIC_PUBLISH_AS_MIT=false
|
||||
|
||||
@@ -50,6 +50,13 @@ tokens.themes.default.theme = {
|
||||
...tokens.themes.default.theme.colors,
|
||||
...customColors,
|
||||
},
|
||||
font: {
|
||||
...tokens.themes.default.theme.font,
|
||||
families: {
|
||||
base: 'sans-serif',
|
||||
accent: 'sans-serif',
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -89,6 +96,12 @@ const dsfrTheme = {
|
||||
widthFooter: '220px',
|
||||
alt: 'Gouvernement Logo',
|
||||
},
|
||||
font: {
|
||||
families: {
|
||||
base: 'Marianne',
|
||||
accent: 'Marianne',
|
||||
},
|
||||
},
|
||||
},
|
||||
components: {
|
||||
'la-gaufre': true,
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
import type { Config } from 'jest';
|
||||
import nextJest from 'next/jest.js';
|
||||
|
||||
const createJestConfig = nextJest({
|
||||
dir: './',
|
||||
});
|
||||
|
||||
// Add any custom config to be passed to Jest
|
||||
const config: Config = {
|
||||
coverageProvider: 'v8',
|
||||
moduleNameMapper: {
|
||||
'^@/docs/(.*)$': '<rootDir>/src/features/docs/$1',
|
||||
'^@/(.*)$': '<rootDir>/src/$1',
|
||||
},
|
||||
setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
|
||||
testEnvironment: 'jsdom',
|
||||
};
|
||||
|
||||
const jestConfig = async () => {
|
||||
const nextJestConfig = await createJestConfig(config)();
|
||||
return {
|
||||
...nextJestConfig,
|
||||
moduleNameMapper: {
|
||||
'\\.svg$': '<rootDir>/jest/mocks/svg.js',
|
||||
'^.+\\.svg\\?url$': `<rootDir>/jest/mocks/fileMock.js`,
|
||||
BlockNoteEditor: `<rootDir>/jest/mocks/ComponentMock.js`,
|
||||
'custom-blocks': `<rootDir>/jest/mocks/ComponentMock.js`,
|
||||
...nextJestConfig.moduleNameMapper,
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default jestConfig;
|
||||
@@ -1,4 +0,0 @@
|
||||
import '@testing-library/jest-dom';
|
||||
import * as dotenv from 'dotenv';
|
||||
|
||||
dotenv.config({ path: './.env.test' });
|
||||
@@ -1,5 +0,0 @@
|
||||
import React from 'react';
|
||||
|
||||
export const ComponentMock = () => {
|
||||
return <div>My component mocked</div>;
|
||||
};
|
||||
@@ -1,16 +0,0 @@
|
||||
module.exports = {
|
||||
src: '/img.jpg',
|
||||
height: 40,
|
||||
width: 40,
|
||||
blurDataURL: 'data:image/png;base64,imagedata',
|
||||
};
|
||||
|
||||
if (
|
||||
(typeof exports.default === 'function' ||
|
||||
(typeof exports.default === 'object' && exports.default !== null)) &&
|
||||
typeof exports.default.__esModule === 'undefined'
|
||||
) {
|
||||
Object.defineProperty(exports.default, '__esModule', { value: true });
|
||||
Object.assign(exports.default, exports);
|
||||
module.exports = exports.default;
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
const nameMock = 'svg';
|
||||
export default nameMock;
|
||||
export const ReactComponent = 'svg';
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "app-impress",
|
||||
"version": "3.5.0",
|
||||
"version": "3.6.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
@@ -11,81 +11,83 @@
|
||||
"lint": "tsc --noEmit && next lint",
|
||||
"prettier": "prettier --write .",
|
||||
"stylelint": "stylelint \"**/*.css\"",
|
||||
"test": "jest",
|
||||
"test:watch": "jest --watch"
|
||||
"test": "vitest",
|
||||
"test:watch": "vitest --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ag-media/react-pdf-table": "2.0.3",
|
||||
"@blocknote/code-block": "0.35.0",
|
||||
"@blocknote/core": "0.35.0",
|
||||
"@blocknote/mantine": "0.35.0",
|
||||
"@blocknote/react": "0.35.0",
|
||||
"@blocknote/xl-docx-exporter": "0.35.0",
|
||||
"@blocknote/xl-multi-column": "0.35.0",
|
||||
"@blocknote/xl-pdf-exporter": "0.35.0",
|
||||
"@blocknote/code-block": "0.37.0",
|
||||
"@blocknote/core": "0.37.0",
|
||||
"@blocknote/mantine": "0.37.0",
|
||||
"@blocknote/react": "0.37.0",
|
||||
"@blocknote/xl-docx-exporter": "0.37.0",
|
||||
"@blocknote/xl-multi-column": "0.37.0",
|
||||
"@blocknote/xl-pdf-exporter": "0.37.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/material-icons": "5.2.5",
|
||||
"@gouvfr-lasuite/integration": "1.0.3",
|
||||
"@gouvfr-lasuite/ui-kit": "0.11.0",
|
||||
"@gouvfr-lasuite/ui-kit": "0.16.1",
|
||||
"@hocuspocus/provider": "2.15.2",
|
||||
"@openfun/cunningham-react": "3.2.1",
|
||||
"@openfun/cunningham-react": "3.2.3",
|
||||
"@react-pdf/renderer": "4.3.0",
|
||||
"@sentry/nextjs": "10.2.0",
|
||||
"@tanstack/react-query": "5.84.1",
|
||||
"@sentry/nextjs": "10.8.0",
|
||||
"@tanstack/react-query": "5.85.6",
|
||||
"canvg": "4.0.3",
|
||||
"clsx": "2.1.1",
|
||||
"cmdk": "1.1.1",
|
||||
"crisp-sdk-web": "1.0.25",
|
||||
"docx": "9.5.0",
|
||||
"emoji-mart": "5.6.0",
|
||||
"i18next": "25.3.2",
|
||||
"emoji-regex": "10.4.0",
|
||||
"i18next": "25.4.2",
|
||||
"i18next-browser-languagedetector": "8.2.0",
|
||||
"idb": "8.0.3",
|
||||
"lodash": "4.17.21",
|
||||
"luxon": "3.7.1",
|
||||
"next": "15.4.6",
|
||||
"posthog-js": "1.258.6",
|
||||
"next": "15.4.7",
|
||||
"posthog-js": "1.261.0",
|
||||
"react": "*",
|
||||
"react-aria-components": "1.11.0",
|
||||
"react-aria-components": "1.12.1",
|
||||
"react-dom": "*",
|
||||
"react-i18next": "15.6.1",
|
||||
"react-i18next": "15.7.3",
|
||||
"react-intersection-observer": "9.16.0",
|
||||
"react-select": "5.10.2",
|
||||
"styled-components": "6.1.19",
|
||||
"use-debounce": "10.0.5",
|
||||
"y-protocols": "1.0.6",
|
||||
"yjs": "*",
|
||||
"zustand": "5.0.7"
|
||||
"zustand": "5.0.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@svgr/webpack": "8.1.0",
|
||||
"@tanstack/react-query-devtools": "5.84.1",
|
||||
"@tanstack/react-query-devtools": "5.85.6",
|
||||
"@testing-library/dom": "10.4.1",
|
||||
"@testing-library/jest-dom": "6.6.4",
|
||||
"@testing-library/jest-dom": "6.8.0",
|
||||
"@testing-library/react": "16.3.0",
|
||||
"@testing-library/user-event": "14.6.1",
|
||||
"@types/jest": "30.0.0",
|
||||
"@types/lodash": "4.17.20",
|
||||
"@types/luxon": "3.7.1",
|
||||
"@types/node": "*",
|
||||
"@types/react": "*",
|
||||
"@types/react-dom": "*",
|
||||
"@vitejs/plugin-react": "5.0.2",
|
||||
"cross-env": "10.0.0",
|
||||
"dotenv": "17.2.1",
|
||||
"eslint-config-impress": "*",
|
||||
"fetch-mock": "9.11.0",
|
||||
"jest": "30.0.5",
|
||||
"jest-environment-jsdom": "30.0.5",
|
||||
"jsdom": "26.1.0",
|
||||
"node-fetch": "2.7.0",
|
||||
"prettier": "3.6.2",
|
||||
"stylelint": "16.23.0",
|
||||
"stylelint": "16.23.1",
|
||||
"stylelint-config-standard": "39.0.0",
|
||||
"stylelint-prettier": "5.0.3",
|
||||
"typescript": "*",
|
||||
"webpack": "5.101.0",
|
||||
"vite-tsconfig-paths": "5.1.4",
|
||||
"vitest": "3.2.4",
|
||||
"webpack": "5.101.3",
|
||||
"workbox-webpack-plugin": "7.1.0"
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,101 @@
|
||||
@font-face {
|
||||
font-family: Marianne;
|
||||
src:
|
||||
url('Marianne-Thin.woff2') format('woff2'),
|
||||
url('Marianne-Thin.woff') format('woff');
|
||||
font-weight: 100;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Marianne;
|
||||
src:
|
||||
url('Marianne-Thin_Italic.woff2') format('woff2'),
|
||||
url('Marianne-Thin_Italic.woff') format('woff');
|
||||
font-weight: 100;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Marianne;
|
||||
src:
|
||||
url('Marianne-Light.woff2') format('woff2'),
|
||||
url('Marianne-Light.woff') format('woff');
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Marianne;
|
||||
src:
|
||||
url('Marianne-Light_Italic.woff2') format('woff2'),
|
||||
url('Marianne-Light_Italic.woff') format('woff');
|
||||
font-weight: 300;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Marianne;
|
||||
src:
|
||||
url('Marianne-Regular.woff2') format('woff2'),
|
||||
url('Marianne-Regular.woff') format('woff');
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Marianne;
|
||||
src:
|
||||
url('Marianne-Regular_Italic.woff2') format('woff2'),
|
||||
url('Marianne-Regular_Italic.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Marianne;
|
||||
src:
|
||||
url('Marianne-Medium.woff2') format('woff2'),
|
||||
url('Marianne-Medium.woff') format('woff');
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Marianne;
|
||||
src:
|
||||
url('Marianne-Medium_Italic.woff2') format('woff2'),
|
||||
url('Marianne-Medium_Italic.woff') format('woff');
|
||||
font-weight: 500;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Marianne;
|
||||
src:
|
||||
url('Marianne-Bold.woff2') format('woff2'),
|
||||
url('Marianne-Bold.woff') format('woff');
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Marianne;
|
||||
src:
|
||||
url('Marianne-Bold_Italic.woff2') format('woff2'),
|
||||
url('Marianne-Bold_Italic.woff') format('woff');
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Marianne;
|
||||
src:
|
||||
url('Marianne-ExtraBold.woff2') format('woff2'),
|
||||
url('Marianne-ExtraBold.woff') format('woff');
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Marianne;
|
||||
src:
|
||||
url('Marianne-ExtraBold_Italic.woff2') format('woff2'),
|
||||
url('Marianne-ExtraBold_Italic.woff') format('woff');
|
||||
font-weight: 800;
|
||||
font-style: italic;
|
||||
}
|
||||
@@ -1,3 +1,5 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import { APIError, isAPIError } from '@/api';
|
||||
|
||||
describe('APIError', () => {
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import { baseApiUrl } from '@/api';
|
||||
|
||||
describe('config', () => {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import fetchMock from 'fetch-mock';
|
||||
import { beforeEach, describe, expect, it } from 'vitest';
|
||||
|
||||
import { fetchAPI } from '@/api';
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
||||
import { renderHook, waitFor } from '@testing-library/react';
|
||||
import { describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import { useAPIInfiniteQuery } from '@/api';
|
||||
|
||||
@@ -21,8 +22,8 @@ const createWrapper = () => {
|
||||
|
||||
describe('helpers', () => {
|
||||
it('fetches and paginates correctly', async () => {
|
||||
const mockAPI = jest
|
||||
.fn<Promise<DummyResponse>, [{ page: number; query: string }]>()
|
||||
const mockAPI = vi
|
||||
.fn<(params: { page: number; query: string }) => Promise<DummyResponse>>()
|
||||
.mockResolvedValueOnce({
|
||||
results: [{ id: 1 }],
|
||||
next: 'url?page=2',
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import { errorCauses, getCSRFToken } from '@/api';
|
||||
|
||||
describe('utils', () => {
|
||||
|
||||
@@ -51,7 +51,7 @@ export const Box = styled('div')<BoxProps>`
|
||||
${({ $cursor }) => $cursor && `cursor: ${$cursor};`}
|
||||
${({ $direction }) => `flex-direction: ${$direction || 'column'};`}
|
||||
${({ $display, as }) =>
|
||||
`display: ${$display || as?.match('span|input') ? 'inline-flex' : 'flex'};`}
|
||||
`display: ${$display || (as?.match('span|input') ? 'inline-flex' : 'flex')};`}
|
||||
${({ $flex }) => $flex && `flex: ${$flex};`}
|
||||
${({ $gap }) => $gap && `gap: ${$gap};`}
|
||||
${({ $height }) => $height && `height: ${$height};`}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import '@testing-library/jest-dom';
|
||||
import { render, screen } from '@testing-library/react';
|
||||
|
||||
import { Box } from '../Box';
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
@import url('@gouvfr-lasuite/ui-kit/style');
|
||||
@import url('./cunningham-tokens.css');
|
||||
@import url('/assets/fonts/Marianne/Marianne-font.css');
|
||||
|
||||
:root {
|
||||
/**
|
||||
@@ -37,6 +38,13 @@
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Modal
|
||||
*/
|
||||
.c__modal__backdrop {
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tooltip
|
||||
*/
|
||||
|
||||
@@ -143,8 +143,8 @@
|
||||
--c--theme--font--weights--bold: 600;
|
||||
--c--theme--font--weights--extrabold: 800;
|
||||
--c--theme--font--weights--black: 900;
|
||||
--c--theme--font--families--base: marianne;
|
||||
--c--theme--font--families--accent: marianne;
|
||||
--c--theme--font--families--base: sans-serif;
|
||||
--c--theme--font--families--accent: sans-serif;
|
||||
--c--theme--font--letterspacings--h1: normal;
|
||||
--c--theme--font--letterspacings--h2: normal;
|
||||
--c--theme--font--letterspacings--h3: normal;
|
||||
@@ -298,6 +298,9 @@
|
||||
--c--components--button--tertiary-text--color: var(
|
||||
--c--theme--colors--primary-600
|
||||
);
|
||||
--c--components--button--tertiary-text--disabled: var(
|
||||
--c--theme--colors--primary-300
|
||||
);
|
||||
--c--components--button--danger--color-hover: white;
|
||||
--c--components--button--danger--background--color: var(
|
||||
--c--theme--colors--danger-600
|
||||
@@ -553,6 +556,8 @@
|
||||
--c--theme--logo--widthHeader: 110px;
|
||||
--c--theme--logo--widthFooter: 220px;
|
||||
--c--theme--logo--alt: gouvernement logo;
|
||||
--c--theme--font--families--base: marianne;
|
||||
--c--theme--font--families--accent: marianne;
|
||||
--c--components--la-gaufre: true;
|
||||
--c--components--home-proconnect: true;
|
||||
--c--components--favicon--ico: /assets/favicon-dsfr.ico;
|
||||
|
||||
@@ -153,7 +153,7 @@ export const tokens = {
|
||||
extrabold: 800,
|
||||
black: 900,
|
||||
},
|
||||
families: { base: 'Marianne', accent: 'Marianne' },
|
||||
families: { base: 'sans-serif', accent: 'sans-serif' },
|
||||
letterSpacings: {
|
||||
h1: 'normal',
|
||||
h2: 'normal',
|
||||
@@ -266,6 +266,7 @@ export const tokens = {
|
||||
'background--color-hover': '#eee',
|
||||
'color-hover': '#000091',
|
||||
color: '#313178',
|
||||
disabled: '#CACAFB',
|
||||
},
|
||||
danger: {
|
||||
'color-hover': 'white',
|
||||
@@ -435,6 +436,7 @@ export const tokens = {
|
||||
widthFooter: '220px',
|
||||
alt: 'Gouvernement Logo',
|
||||
},
|
||||
font: { families: { base: 'Marianne', accent: 'Marianne' } },
|
||||
},
|
||||
components: {
|
||||
'la-gaufre': true,
|
||||
|
||||
@@ -1,42 +1,28 @@
|
||||
import { Crisp } from 'crisp-sdk-web';
|
||||
import fetchMock from 'fetch-mock';
|
||||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import { gotoLogout } from '../utils';
|
||||
|
||||
jest.mock('crisp-sdk-web', () => ({
|
||||
...jest.requireActual('crisp-sdk-web'),
|
||||
Crisp: {
|
||||
isCrispInjected: jest.fn().mockReturnValue(true),
|
||||
setTokenId: jest.fn(),
|
||||
user: {
|
||||
setEmail: jest.fn(),
|
||||
},
|
||||
session: {
|
||||
reset: jest.fn(),
|
||||
},
|
||||
},
|
||||
// Mock the Crisp service
|
||||
vi.mock('@/services/Crisp', () => ({
|
||||
terminateCrispSession: vi.fn(),
|
||||
}));
|
||||
|
||||
describe('utils', () => {
|
||||
afterEach(() => {
|
||||
jest.clearAllMocks();
|
||||
vi.clearAllMocks();
|
||||
fetchMock.restore();
|
||||
});
|
||||
|
||||
it('checks support session is terminated when logout', () => {
|
||||
jest.spyOn(console, 'error').mockImplementation(() => {});
|
||||
it('checks support session is terminated when logout', async () => {
|
||||
const { terminateCrispSession } = await import('@/services/Crisp');
|
||||
|
||||
window.$crisp = true;
|
||||
const propertyDescriptors = Object.getOwnPropertyDescriptors(window);
|
||||
for (const key in propertyDescriptors) {
|
||||
propertyDescriptors[key].configurable = true;
|
||||
}
|
||||
const clonedWindow = Object.defineProperties({}, propertyDescriptors);
|
||||
|
||||
Object.defineProperty(clonedWindow, 'location', {
|
||||
// Mock window.location.replace
|
||||
const mockReplace = vi.fn();
|
||||
Object.defineProperty(window, 'location', {
|
||||
value: {
|
||||
...window.location,
|
||||
replace: jest.fn(),
|
||||
replace: mockReplace,
|
||||
},
|
||||
writable: true,
|
||||
configurable: true,
|
||||
@@ -44,6 +30,9 @@ describe('utils', () => {
|
||||
|
||||
gotoLogout();
|
||||
|
||||
expect(Crisp.session.reset).toHaveBeenCalled();
|
||||
expect(terminateCrispSession).toHaveBeenCalled();
|
||||
expect(mockReplace).toHaveBeenCalledWith(
|
||||
'http://test.jest/api/v1.0/logout/',
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
import { renderHook, waitFor } from '@testing-library/react';
|
||||
import fetchMock from 'fetch-mock';
|
||||
import { Fragment } from 'react';
|
||||
import { beforeEach, describe, expect, vi } from 'vitest';
|
||||
|
||||
import { AbstractAnalytic } from '@/libs';
|
||||
import { AppWrapper } from '@/tests/utils';
|
||||
|
||||
import { useAuth } from '../useAuth';
|
||||
|
||||
const trackEventMock = jest.fn();
|
||||
const trackEventMock = vi.fn();
|
||||
const flag = true;
|
||||
class TestAnalytic extends AbstractAnalytic {
|
||||
public constructor() {
|
||||
@@ -31,11 +32,11 @@ class TestAnalytic extends AbstractAnalytic {
|
||||
}
|
||||
}
|
||||
|
||||
jest.mock('next/router', () => ({
|
||||
...jest.requireActual('next/router'),
|
||||
vi.mock('next/router', async () => ({
|
||||
...(await vi.importActual('next/router')),
|
||||
useRouter: () => ({
|
||||
pathname: '/dashboard',
|
||||
replace: jest.fn(),
|
||||
replace: vi.fn(),
|
||||
}),
|
||||
}));
|
||||
|
||||
@@ -43,7 +44,7 @@ const dummyUser = { id: '123', email: 'test@example.com' };
|
||||
|
||||
describe('useAuth hook - trackEvent effect', () => {
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks();
|
||||
vi.clearAllMocks();
|
||||
fetchMock.restore();
|
||||
});
|
||||
|
||||
|
||||
+35
-36
@@ -1,36 +1,38 @@
|
||||
import { act, renderHook, waitFor } from '@testing-library/react';
|
||||
import fetchMock from 'fetch-mock';
|
||||
import { useRouter } from 'next/router';
|
||||
import { Mock, beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
import * as Y from 'yjs';
|
||||
|
||||
import { AppWrapper } from '@/tests/utils';
|
||||
|
||||
import { useSaveDoc } from '../useSaveDoc';
|
||||
|
||||
jest.mock('next/router', () => ({
|
||||
useRouter: jest.fn(),
|
||||
vi.mock('next/router', () => ({
|
||||
useRouter: vi.fn(),
|
||||
}));
|
||||
|
||||
jest.mock('@/docs/doc-versioning', () => ({
|
||||
vi.mock('@/docs/doc-versioning', () => ({
|
||||
KEY_LIST_DOC_VERSIONS: 'test-key-list-doc-versions',
|
||||
}));
|
||||
|
||||
jest.mock('@/docs/doc-management', () => ({
|
||||
useUpdateDoc: jest.requireActual('@/docs/doc-management/api/useUpdateDoc')
|
||||
.useUpdateDoc,
|
||||
vi.mock('@/docs/doc-management', async () => ({
|
||||
useUpdateDoc: (
|
||||
await vi.importActual('@/docs/doc-management/api/useUpdateDoc')
|
||||
).useUpdateDoc,
|
||||
}));
|
||||
|
||||
describe('useSaveDoc', () => {
|
||||
const mockRouterEvents = {
|
||||
on: jest.fn(),
|
||||
off: jest.fn(),
|
||||
on: vi.fn(),
|
||||
off: vi.fn(),
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks();
|
||||
vi.clearAllMocks();
|
||||
fetchMock.restore();
|
||||
|
||||
(useRouter as jest.Mock).mockReturnValue({
|
||||
(useRouter as Mock).mockReturnValue({
|
||||
events: mockRouterEvents,
|
||||
});
|
||||
});
|
||||
@@ -39,7 +41,7 @@ describe('useSaveDoc', () => {
|
||||
const yDoc = new Y.Doc();
|
||||
const docId = 'test-doc-id';
|
||||
|
||||
const addEventListenerSpy = jest.spyOn(window, 'addEventListener');
|
||||
const addEventListenerSpy = vi.spyOn(window, 'addEventListener');
|
||||
|
||||
renderHook(() => useSaveDoc(docId, yDoc, true, true), {
|
||||
wrapper: AppWrapper,
|
||||
@@ -60,8 +62,8 @@ describe('useSaveDoc', () => {
|
||||
addEventListenerSpy.mockRestore();
|
||||
});
|
||||
|
||||
it('should not save when canSave is false', async () => {
|
||||
jest.useFakeTimers();
|
||||
it('should not save when canSave is false', () => {
|
||||
vi.useFakeTimers();
|
||||
const yDoc = new Y.Doc();
|
||||
const docId = 'test-doc-id';
|
||||
|
||||
@@ -80,22 +82,19 @@ describe('useSaveDoc', () => {
|
||||
act(() => {
|
||||
// Trigger a local update
|
||||
yDoc.getMap('test').set('key', 'value');
|
||||
|
||||
// Advance timers to trigger the save interval
|
||||
vi.advanceTimersByTime(61000);
|
||||
});
|
||||
|
||||
act(() => {
|
||||
// Now advance timers after state has updated
|
||||
jest.advanceTimersByTime(61000);
|
||||
});
|
||||
// Since canSave is false, no API call should be made
|
||||
expect(fetchMock.calls().length).toBe(0);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(fetchMock.calls().length).toBe(0);
|
||||
});
|
||||
|
||||
jest.useRealTimers();
|
||||
vi.useRealTimers();
|
||||
});
|
||||
|
||||
it('should save when there are local changes', async () => {
|
||||
jest.useFakeTimers();
|
||||
vi.useFakeTimers();
|
||||
const yDoc = new Y.Doc();
|
||||
const docId = 'test-doc-id';
|
||||
|
||||
@@ -117,21 +116,22 @@ describe('useSaveDoc', () => {
|
||||
});
|
||||
|
||||
act(() => {
|
||||
// Now advance timers after state has updated
|
||||
jest.advanceTimersByTime(61000);
|
||||
// Advance timers to trigger the save interval
|
||||
vi.advanceTimersByTime(61000);
|
||||
});
|
||||
|
||||
// Switch to real timers to allow the mutation promise to resolve
|
||||
vi.useRealTimers();
|
||||
|
||||
await waitFor(() => {
|
||||
expect(fetchMock.lastCall()?.[0]).toBe(
|
||||
'http://test.jest/api/v1.0/documents/test-doc-id/',
|
||||
);
|
||||
});
|
||||
|
||||
jest.useRealTimers();
|
||||
});
|
||||
|
||||
it('should not save when there are no local changes', async () => {
|
||||
jest.useFakeTimers();
|
||||
it('should not save when there are no local changes', () => {
|
||||
vi.useFakeTimers();
|
||||
const yDoc = new Y.Doc();
|
||||
const docId = 'test-doc-id';
|
||||
|
||||
@@ -148,21 +148,20 @@ describe('useSaveDoc', () => {
|
||||
});
|
||||
|
||||
act(() => {
|
||||
// Now advance timers after state has updated
|
||||
jest.advanceTimersByTime(61000);
|
||||
// Advance timers without triggering any local updates
|
||||
vi.advanceTimersByTime(61000);
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(fetchMock.calls().length).toBe(0);
|
||||
});
|
||||
// Since there are no local changes, no API call should be made
|
||||
expect(fetchMock.calls().length).toBe(0);
|
||||
|
||||
jest.useRealTimers();
|
||||
vi.useRealTimers();
|
||||
});
|
||||
|
||||
it('should cleanup event listeners on unmount', () => {
|
||||
const yDoc = new Y.Doc();
|
||||
const docId = 'test-doc-id';
|
||||
const removeEventListenerSpy = jest.spyOn(window, 'removeEventListener');
|
||||
const removeEventListenerSpy = vi.spyOn(window, 'removeEventListener');
|
||||
|
||||
const { unmount } = renderHook(() => useSaveDoc(docId, yDoc, true, true), {
|
||||
wrapper: AppWrapper,
|
||||
|
||||
+4
-10
@@ -1,20 +1,14 @@
|
||||
import { afterAll, afterEach, describe, expect, it, vi } from 'vitest';
|
||||
const originalEnv = process.env.NEXT_PUBLIC_PUBLISH_AS_MIT;
|
||||
|
||||
jest.mock('@/features/docs/doc-export/utils', () => ({
|
||||
anything: true,
|
||||
}));
|
||||
jest.mock('@/features/docs/doc-export/components/ModalExport', () => ({
|
||||
ModalExport: () => <span>ModalExport</span>,
|
||||
}));
|
||||
|
||||
describe('useModuleExport', () => {
|
||||
afterAll(() => {
|
||||
process.env.NEXT_PUBLIC_PUBLISH_AS_MIT = originalEnv;
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
jest.clearAllMocks();
|
||||
jest.resetModules();
|
||||
vi.clearAllMocks();
|
||||
vi.resetModules();
|
||||
});
|
||||
|
||||
it('should return undefined when NEXT_PUBLIC_PUBLISH_AS_MIT is true', async () => {
|
||||
@@ -22,7 +16,7 @@ describe('useModuleExport', () => {
|
||||
const Export = await import('@/features/docs/doc-export/');
|
||||
|
||||
expect(Export.default).toBeUndefined();
|
||||
});
|
||||
}, 10000);
|
||||
|
||||
it('should load modules when NEXT_PUBLIC_PUBLISH_AS_MIT is false', async () => {
|
||||
process.env.NEXT_PUBLIC_PUBLISH_AS_MIT = 'false';
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import { utilTable } from '../blocks-mapping/tablePDF';
|
||||
|
||||
/**
|
||||
* Tests for utilTable utility.
|
||||
* Scenarios covered:
|
||||
* - All widths specified and below full width
|
||||
* - Mix of known / unknown widths (fallback distribution)
|
||||
* - All widths unknown
|
||||
* - Widths exceeding full table width (clamping & scale=100)
|
||||
* - Sum exceeding full width without unknowns (no division by zero side-effects)
|
||||
*/
|
||||
|
||||
describe('utilTable', () => {
|
||||
it('returns unchanged widths and correct scale when all widths are known and below full width', () => {
|
||||
const input = [165, 200];
|
||||
const { columnWidths, tableScale } = utilTable(730, input);
|
||||
expect(columnWidths).toEqual(input); // unchanged
|
||||
expect(tableScale).toBe(50);
|
||||
});
|
||||
|
||||
it('distributes fallback width equally among unknown columns', () => {
|
||||
const input: (number | undefined)[] = [100, undefined, 200, undefined];
|
||||
const { columnWidths, tableScale } = utilTable(730, input);
|
||||
expect(columnWidths).toEqual([100, 215, 200, 215]);
|
||||
expect(tableScale).toBe(100); // fills full width exactly
|
||||
});
|
||||
|
||||
it('handles all columns unknown', () => {
|
||||
const input: (number | undefined)[] = [undefined, undefined];
|
||||
const { columnWidths, tableScale } = utilTable(730, input);
|
||||
expect(columnWidths).toEqual([365, 365]);
|
||||
expect(tableScale).toBe(100);
|
||||
});
|
||||
|
||||
it('clamps total width to full width when sum exceeds it (single large column)', () => {
|
||||
const input = [800];
|
||||
const { columnWidths, tableScale } = utilTable(730, input);
|
||||
expect(columnWidths).toEqual([800]);
|
||||
expect(tableScale).toBe(100);
|
||||
});
|
||||
|
||||
it('clamps total width to full width when multiple columns exceed it', () => {
|
||||
const input = [500, 300]; // sum = 800 > 730
|
||||
const { columnWidths, tableScale } = utilTable(730, input);
|
||||
expect(columnWidths).toEqual([500, 300]);
|
||||
expect(tableScale).toBe(100);
|
||||
});
|
||||
|
||||
it('does not assign fallback when there are no unknown widths (avoid division by zero impact)', () => {
|
||||
const input = [400, 400];
|
||||
const { columnWidths, tableScale } = utilTable(730, input);
|
||||
expect(columnWidths).toEqual([400, 400]);
|
||||
expect(tableScale).toBe(100);
|
||||
});
|
||||
|
||||
it('computes proportional scale with custom fullWidth', () => {
|
||||
const input = [100, 200]; // total 300
|
||||
const { columnWidths, tableScale } = utilTable(1000, input);
|
||||
expect(columnWidths).toEqual([100, 200]);
|
||||
expect(tableScale).toBe(30);
|
||||
});
|
||||
});
|
||||
@@ -13,6 +13,7 @@ import { StyleSheet, Text } from '@react-pdf/renderer';
|
||||
|
||||
import { DocsExporterPDF } from '../types';
|
||||
const PIXELS_PER_POINT = 0.75;
|
||||
const FULL_WIDTH = 730;
|
||||
const styles = StyleSheet.create({
|
||||
tableContainer: {
|
||||
border: '1px solid #ddd',
|
||||
@@ -47,16 +48,10 @@ export const blockMappingTablePDF: DocsExporterPDF['mappings']['blockMapping']['
|
||||
true,
|
||||
) as boolean[];
|
||||
|
||||
/**
|
||||
* Calculate the table scale based on the column widths.
|
||||
*/
|
||||
const columnWidths = blockContent.columnWidths.map((w) => w || 120);
|
||||
const fullWidth = 730;
|
||||
const totalWidth = Math.min(
|
||||
columnWidths.reduce((sum, w) => sum + w, 0),
|
||||
fullWidth,
|
||||
const { columnWidths, tableScale } = utilTable(
|
||||
FULL_WIDTH,
|
||||
blockContent.columnWidths,
|
||||
);
|
||||
const tableScale = (totalWidth * 100) / fullWidth;
|
||||
|
||||
return (
|
||||
<Table style={[styles.tableContainer, { width: `${tableScale}%` }]}>
|
||||
@@ -124,3 +119,34 @@ export const blockMappingTablePDF: DocsExporterPDF['mappings']['blockMapping']['
|
||||
</Table>
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* Utility function to calculate the table column widths and scale.
|
||||
* @param columnWidths - Array of column widths.
|
||||
* @returns An object containing the resized column widths and the table scale.
|
||||
*/
|
||||
export const utilTable = (
|
||||
fullWidth: number,
|
||||
columnWidths: (number | undefined)[],
|
||||
) => {
|
||||
const totalColumnWidthKnown = columnWidths.reduce(
|
||||
(sum: number, w) => sum + (w ?? 0),
|
||||
0,
|
||||
);
|
||||
const nbColumnWidthUnknown = columnWidths.filter((w) => !w).length;
|
||||
|
||||
const fallbackWidth =
|
||||
(fullWidth - totalColumnWidthKnown) / nbColumnWidthUnknown;
|
||||
|
||||
const columnWidthsResized = columnWidths.map((w) => w || fallbackWidth);
|
||||
const totalWidth = Math.min(
|
||||
columnWidthsResized.reduce((sum: number, w) => sum + w, 0),
|
||||
fullWidth,
|
||||
);
|
||||
const tableScale = Math.round(((totalWidth * 100) / fullWidth) * 1000) / 1000;
|
||||
|
||||
return {
|
||||
columnWidths: columnWidthsResized,
|
||||
tableScale,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -24,4 +24,16 @@ export const docxDocsSchemaMappings: DocsExporterDocx['mappings'] = {
|
||||
interlinkingSearchInline: () => new Paragraph(''),
|
||||
interlinkingLinkInline: inlineContentMappingInterlinkingLinkDocx,
|
||||
},
|
||||
styleMapping: {
|
||||
...docxDefaultSchemaMappings.styleMapping,
|
||||
// Switch to core PDF "Courier" font to avoid relying on GeistMono
|
||||
// that is not available in italics
|
||||
code: (enabled?: boolean) =>
|
||||
enabled
|
||||
? {
|
||||
font: 'Courier New',
|
||||
shading: { fill: 'DCDCDC' },
|
||||
}
|
||||
: {},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -29,4 +29,11 @@ export const pdfDocsSchemaMappings: DocsExporterPDF['mappings'] = {
|
||||
interlinkingSearchInline: () => <></>,
|
||||
interlinkingLinkInline: inlineContentMappingInterlinkingLinkPDF,
|
||||
},
|
||||
styleMapping: {
|
||||
...pdfDefaultSchemaMappings.styleMapping,
|
||||
// Switch to core PDF "Courier" font to avoid relying on GeistMono
|
||||
// that is not available in italics
|
||||
code: (enabled?: boolean) =>
|
||||
enabled ? { fontFamily: 'Courier', backgroundColor: '#dcdcdc' } : {},
|
||||
},
|
||||
};
|
||||
|
||||
+4
-7
@@ -1,6 +1,7 @@
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import userEvent from '@testing-library/user-event';
|
||||
import React, { Fragment } from 'react';
|
||||
import { beforeEach, describe, expect, vi } from 'vitest';
|
||||
|
||||
import { AbstractAnalytic, Analytics } from '@/libs';
|
||||
import { AppWrapper } from '@/tests/utils';
|
||||
@@ -28,14 +29,10 @@ class TestAnalytic extends AbstractAnalytic {
|
||||
}
|
||||
}
|
||||
|
||||
jest.mock('@/features/docs/doc-export/', () => ({
|
||||
ModalExport: () => <span>ModalExport</span>,
|
||||
}));
|
||||
|
||||
jest.mock('next/router', () => ({
|
||||
...jest.requireActual('next/router'),
|
||||
vi.mock('next/router', async () => ({
|
||||
...(await vi.importActual('next/router')),
|
||||
useRouter: () => ({
|
||||
push: jest.fn(),
|
||||
push: vi.fn(),
|
||||
}),
|
||||
}));
|
||||
|
||||
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import userEvent from '@testing-library/user-event';
|
||||
import React from 'react';
|
||||
import { afterAll, beforeEach, describe, expect, vi } from 'vitest';
|
||||
|
||||
import { AppWrapper } from '@/tests/utils';
|
||||
|
||||
const originalEnv = process.env.NEXT_PUBLIC_PUBLISH_AS_MIT;
|
||||
|
||||
vi.mock('next/router', async () => ({
|
||||
...(await vi.importActual('next/router')),
|
||||
useRouter: () => ({
|
||||
push: vi.fn(),
|
||||
}),
|
||||
}));
|
||||
|
||||
const doc = {
|
||||
nb_accesses: 1,
|
||||
abilities: {
|
||||
versions_list: true,
|
||||
destroy: true,
|
||||
},
|
||||
};
|
||||
|
||||
describe('DocToolBox - Licence', () => {
|
||||
afterAll(() => {
|
||||
process.env.NEXT_PUBLIC_PUBLISH_AS_MIT = originalEnv;
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
vi.resetModules();
|
||||
});
|
||||
|
||||
test('The export button is rendered when MIT version is deactivated', async () => {
|
||||
process.env.NEXT_PUBLIC_PUBLISH_AS_MIT = 'false';
|
||||
|
||||
const { DocToolBox } = await import('../components/DocToolBox');
|
||||
|
||||
render(<DocToolBox doc={doc as any} />, {
|
||||
wrapper: AppWrapper,
|
||||
});
|
||||
const optionsButton = await screen.findByLabelText('Export the document');
|
||||
await userEvent.click(optionsButton);
|
||||
expect(
|
||||
await screen.findByText(
|
||||
'Download your document in a .docx or .pdf format.',
|
||||
),
|
||||
).toBeInTheDocument();
|
||||
}, 10000);
|
||||
|
||||
test('The export button is not rendered when MIT version is activated', async () => {
|
||||
process.env.NEXT_PUBLIC_PUBLISH_AS_MIT = 'true';
|
||||
|
||||
const { DocToolBox } = await import('../components/DocToolBox');
|
||||
|
||||
render(<DocToolBox doc={doc as any} />, {
|
||||
wrapper: AppWrapper,
|
||||
});
|
||||
|
||||
expect(
|
||||
screen.getByLabelText('Open the document options'),
|
||||
).toBeInTheDocument();
|
||||
|
||||
expect(
|
||||
screen.queryByLabelText('Export the document'),
|
||||
).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
@@ -241,6 +241,7 @@ export const DocToolBox = ({ doc }: DocToolBoxProps) => {
|
||||
setIsModalExportOpen(true);
|
||||
}}
|
||||
size={isSmallMobile ? 'small' : 'medium'}
|
||||
aria-label={t('Export the document')}
|
||||
/>
|
||||
)}
|
||||
<DropdownMenu options={options}>
|
||||
|
||||
@@ -0,0 +1,264 @@
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
import * as Y from 'yjs';
|
||||
|
||||
import { LinkReach, LinkRole, Role } from '../types';
|
||||
import {
|
||||
base64ToBlocknoteXmlFragment,
|
||||
base64ToYDoc,
|
||||
currentDocRole,
|
||||
getDocLinkReach,
|
||||
getDocLinkRole,
|
||||
getEmojiAndTitle,
|
||||
} from '../utils';
|
||||
|
||||
// Mock Y.js
|
||||
vi.mock('yjs', () => ({
|
||||
Doc: vi.fn().mockImplementation(() => ({
|
||||
getXmlFragment: vi.fn().mockReturnValue('mocked-xml-fragment'),
|
||||
})),
|
||||
applyUpdate: vi.fn(),
|
||||
}));
|
||||
|
||||
describe('doc-management utils', () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
describe('currentDocRole', () => {
|
||||
it('should return OWNER when destroy ability is true', () => {
|
||||
const abilities = {
|
||||
destroy: true,
|
||||
accesses_manage: false,
|
||||
partial_update: false,
|
||||
} as any;
|
||||
|
||||
const result = currentDocRole(abilities);
|
||||
|
||||
expect(result).toBe(Role.OWNER);
|
||||
});
|
||||
|
||||
it('should return ADMIN when accesses_manage ability is true and destroy is false', () => {
|
||||
const abilities = {
|
||||
destroy: false,
|
||||
accesses_manage: true,
|
||||
partial_update: false,
|
||||
} as any;
|
||||
|
||||
const result = currentDocRole(abilities);
|
||||
|
||||
expect(result).toBe(Role.ADMIN);
|
||||
});
|
||||
|
||||
it('should return EDITOR when partial_update ability is true and higher abilities are false', () => {
|
||||
const abilities = {
|
||||
destroy: false,
|
||||
accesses_manage: false,
|
||||
partial_update: true,
|
||||
} as any;
|
||||
|
||||
const result = currentDocRole(abilities);
|
||||
|
||||
expect(result).toBe(Role.EDITOR);
|
||||
});
|
||||
|
||||
it('should return READER when no higher abilities are true', () => {
|
||||
const abilities = {
|
||||
destroy: false,
|
||||
accesses_manage: false,
|
||||
partial_update: false,
|
||||
} as any;
|
||||
|
||||
const result = currentDocRole(abilities);
|
||||
|
||||
expect(result).toBe(Role.READER);
|
||||
});
|
||||
});
|
||||
|
||||
describe('base64ToYDoc', () => {
|
||||
it('should convert base64 string to Y.Doc', () => {
|
||||
const base64String = 'dGVzdA=='; // "test" in base64
|
||||
const mockYDoc = { getXmlFragment: vi.fn() };
|
||||
|
||||
(Y.Doc as any).mockReturnValue(mockYDoc);
|
||||
|
||||
const result = base64ToYDoc(base64String);
|
||||
|
||||
expect(Y.Doc).toHaveBeenCalled();
|
||||
expect(Y.applyUpdate).toHaveBeenCalledWith(mockYDoc, expect.any(Buffer));
|
||||
expect(result).toBe(mockYDoc);
|
||||
});
|
||||
|
||||
it('should handle empty base64 string', () => {
|
||||
const base64String = '';
|
||||
const mockYDoc = { getXmlFragment: vi.fn() };
|
||||
|
||||
(Y.Doc as any).mockReturnValue(mockYDoc);
|
||||
|
||||
const result = base64ToYDoc(base64String);
|
||||
|
||||
expect(Y.Doc).toHaveBeenCalled();
|
||||
expect(Y.applyUpdate).toHaveBeenCalledWith(mockYDoc, expect.any(Buffer));
|
||||
expect(result).toBe(mockYDoc);
|
||||
});
|
||||
});
|
||||
|
||||
describe('base64ToBlocknoteXmlFragment', () => {
|
||||
it('should convert base64 to Blocknote XML fragment', () => {
|
||||
const base64String = 'dGVzdA==';
|
||||
const mockYDoc = {
|
||||
getXmlFragment: vi.fn().mockReturnValue('mocked-xml-fragment'),
|
||||
};
|
||||
|
||||
(Y.Doc as any).mockReturnValue(mockYDoc);
|
||||
|
||||
const result = base64ToBlocknoteXmlFragment(base64String);
|
||||
|
||||
expect(Y.Doc).toHaveBeenCalled();
|
||||
expect(Y.applyUpdate).toHaveBeenCalledWith(mockYDoc, expect.any(Buffer));
|
||||
expect(mockYDoc.getXmlFragment).toHaveBeenCalledWith('document-store');
|
||||
expect(result).toBe('mocked-xml-fragment');
|
||||
});
|
||||
});
|
||||
|
||||
describe('getDocLinkReach', () => {
|
||||
it('should return computed_link_reach when available', () => {
|
||||
const doc = {
|
||||
computed_link_reach: LinkReach.PUBLIC,
|
||||
link_reach: LinkReach.RESTRICTED,
|
||||
} as any;
|
||||
|
||||
const result = getDocLinkReach(doc);
|
||||
|
||||
expect(result).toBe(LinkReach.PUBLIC);
|
||||
});
|
||||
|
||||
it('should fallback to link_reach when computed_link_reach is not available', () => {
|
||||
const doc = {
|
||||
link_reach: LinkReach.AUTHENTICATED,
|
||||
} as any;
|
||||
|
||||
const result = getDocLinkReach(doc);
|
||||
|
||||
expect(result).toBe(LinkReach.AUTHENTICATED);
|
||||
});
|
||||
|
||||
it('should handle undefined computed_link_reach', () => {
|
||||
const doc = {
|
||||
computed_link_reach: undefined,
|
||||
link_reach: LinkReach.RESTRICTED,
|
||||
} as any;
|
||||
|
||||
const result = getDocLinkReach(doc);
|
||||
|
||||
expect(result).toBe(LinkReach.RESTRICTED);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getDocLinkRole', () => {
|
||||
it('should return computed_link_role when available', () => {
|
||||
const doc = {
|
||||
computed_link_role: LinkRole.EDITOR,
|
||||
link_role: LinkRole.READER,
|
||||
} as any;
|
||||
|
||||
const result = getDocLinkRole(doc);
|
||||
|
||||
expect(result).toBe(LinkRole.EDITOR);
|
||||
});
|
||||
|
||||
it('should fallback to link_role when computed_link_role is not available', () => {
|
||||
const doc = {
|
||||
link_role: LinkRole.READER,
|
||||
} as any;
|
||||
|
||||
const result = getDocLinkRole(doc);
|
||||
|
||||
expect(result).toBe(LinkRole.READER);
|
||||
});
|
||||
|
||||
it('should handle undefined computed_link_role', () => {
|
||||
const doc = {
|
||||
computed_link_role: undefined,
|
||||
link_role: LinkRole.EDITOR,
|
||||
} as any;
|
||||
|
||||
const result = getDocLinkRole(doc);
|
||||
|
||||
expect(result).toBe(LinkRole.EDITOR);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getEmojiAndTitle', () => {
|
||||
it('should extract emoji and title when emoji is present at the beginning', () => {
|
||||
const title = '🚀 My Awesome Document';
|
||||
|
||||
const result = getEmojiAndTitle(title);
|
||||
|
||||
expect(result.emoji).toBe('🚀');
|
||||
expect(result.titleWithoutEmoji).toBe('My Awesome Document');
|
||||
});
|
||||
|
||||
it('should handle complex emojis with modifiers', () => {
|
||||
const title = '👨💻 Developer Notes';
|
||||
|
||||
const result = getEmojiAndTitle(title);
|
||||
|
||||
expect(result.emoji).toBe('👨💻');
|
||||
expect(result.titleWithoutEmoji).toBe('Developer Notes');
|
||||
});
|
||||
|
||||
it('should handle emojis with skin tone modifiers', () => {
|
||||
const title = '👍 Great Work!';
|
||||
|
||||
const result = getEmojiAndTitle(title);
|
||||
|
||||
expect(result.emoji).toBe('👍');
|
||||
expect(result.titleWithoutEmoji).toBe('Great Work!');
|
||||
});
|
||||
|
||||
it('should return null emoji and full title when no emoji is present', () => {
|
||||
const title = 'Document Without Emoji';
|
||||
|
||||
const result = getEmojiAndTitle(title);
|
||||
|
||||
expect(result.emoji).toBeNull();
|
||||
expect(result.titleWithoutEmoji).toBe('Document Without Emoji');
|
||||
});
|
||||
|
||||
it('should handle empty title', () => {
|
||||
const title = '';
|
||||
|
||||
const result = getEmojiAndTitle(title);
|
||||
|
||||
expect(result.emoji).toBeNull();
|
||||
expect(result.titleWithoutEmoji).toBe('');
|
||||
});
|
||||
|
||||
it('should handle title with only emoji', () => {
|
||||
const title = '📝';
|
||||
|
||||
const result = getEmojiAndTitle(title);
|
||||
|
||||
expect(result.emoji).toBe('📝');
|
||||
expect(result.titleWithoutEmoji).toBe('');
|
||||
});
|
||||
|
||||
it('should handle title with emoji in the middle (should not extract)', () => {
|
||||
const title = 'My 📝 Document';
|
||||
|
||||
const result = getEmojiAndTitle(title);
|
||||
|
||||
expect(result.emoji).toBeNull();
|
||||
expect(result.titleWithoutEmoji).toBe('My 📝 Document');
|
||||
});
|
||||
|
||||
it('should handle title with multiple emojis at the beginning', () => {
|
||||
const title = '🚀📚 Project Documentation';
|
||||
|
||||
const result = getEmojiAndTitle(title);
|
||||
|
||||
expect(result.emoji).toBe('🚀');
|
||||
expect(result.titleWithoutEmoji).toBe('📚 Project Documentation');
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,36 @@
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import { Text, TextType } from '@/components';
|
||||
|
||||
type DocIconProps = TextType & {
|
||||
emoji?: string | null;
|
||||
defaultIcon: React.ReactNode;
|
||||
};
|
||||
|
||||
export const DocIcon = ({
|
||||
emoji,
|
||||
defaultIcon,
|
||||
$size = 'sm',
|
||||
$variation = '1000',
|
||||
$weight = '400',
|
||||
...textProps
|
||||
}: DocIconProps) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
if (!emoji) {
|
||||
return <>{defaultIcon}</>;
|
||||
}
|
||||
|
||||
return (
|
||||
<Text
|
||||
{...textProps}
|
||||
$size={$size}
|
||||
$variation={$variation}
|
||||
$weight={$weight}
|
||||
aria-hidden="true"
|
||||
aria-label={t('Document emoji icon')}
|
||||
>
|
||||
{emoji}
|
||||
</Text>
|
||||
);
|
||||
};
|
||||
+19
-7
@@ -4,12 +4,14 @@ import { css } from 'styled-components';
|
||||
|
||||
import { Box, Text } from '@/components';
|
||||
import { useCunninghamTheme } from '@/cunningham';
|
||||
import { Doc, useTrans } from '@/docs/doc-management';
|
||||
import { Doc, getEmojiAndTitle, useTrans } from '@/docs/doc-management';
|
||||
import { useResponsiveStore } from '@/stores';
|
||||
|
||||
import PinnedDocumentIcon from '../assets/pinned-document.svg';
|
||||
import SimpleFileIcon from '../assets/simple-document.svg';
|
||||
|
||||
import { DocIcon } from './DocIcon';
|
||||
|
||||
const ItemTextCss = css`
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
@@ -36,6 +38,10 @@ export const SimpleDocItem = ({
|
||||
const { isDesktop } = useResponsiveStore();
|
||||
const { untitledDocument } = useTrans();
|
||||
|
||||
const { emoji, titleWithoutEmoji: displayTitle } = getEmojiAndTitle(
|
||||
doc.title || untitledDocument,
|
||||
);
|
||||
|
||||
return (
|
||||
<Box
|
||||
$direction="row"
|
||||
@@ -61,23 +67,29 @@ export const SimpleDocItem = ({
|
||||
color={colorsTokens['primary-500']}
|
||||
/>
|
||||
) : (
|
||||
<SimpleFileIcon
|
||||
aria-hidden="true"
|
||||
aria-label={t('Simple document icon')}
|
||||
color={colorsTokens['primary-500']}
|
||||
<DocIcon
|
||||
emoji={emoji}
|
||||
defaultIcon={
|
||||
<SimpleFileIcon
|
||||
aria-hidden="true"
|
||||
aria-label={t('Simple document icon')}
|
||||
color={colorsTokens['primary-500']}
|
||||
/>
|
||||
}
|
||||
$size="25px"
|
||||
/>
|
||||
)}
|
||||
</Box>
|
||||
<Box $justify="center" $overflow="auto">
|
||||
<Text
|
||||
aria-describedby="doc-title"
|
||||
aria-label={doc.title}
|
||||
aria-label={displayTitle}
|
||||
$size="sm"
|
||||
$variation="1000"
|
||||
$weight="500"
|
||||
$css={ItemTextCss}
|
||||
>
|
||||
{doc.title || untitledDocument}
|
||||
{displayTitle}
|
||||
</Text>
|
||||
{(!isDesktop || showAccesses) && (
|
||||
<Box
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import emojiRegex from 'emoji-regex';
|
||||
import * as Y from 'yjs';
|
||||
|
||||
import { Doc, LinkReach, LinkRole, Role } from './types';
|
||||
@@ -30,3 +31,19 @@ export const getDocLinkReach = (doc: Doc): LinkReach => {
|
||||
export const getDocLinkRole = (doc: Doc): LinkRole => {
|
||||
return doc.computed_link_role ?? doc.link_role;
|
||||
};
|
||||
|
||||
export const getEmojiAndTitle = (title: string) => {
|
||||
// Use emoji-regex library for comprehensive emoji detection compatible with ES5
|
||||
const regex = emojiRegex();
|
||||
|
||||
// Check if the title starts with an emoji
|
||||
const match = title.match(regex);
|
||||
|
||||
if (match && title.startsWith(match[0])) {
|
||||
const emoji = match[0];
|
||||
const titleWithoutEmoji = title.substring(emoji.length).trim();
|
||||
return { emoji, titleWithoutEmoji };
|
||||
}
|
||||
|
||||
return { emoji: null, titleWithoutEmoji: title };
|
||||
};
|
||||
|
||||
@@ -9,7 +9,12 @@ import { css } from 'styled-components';
|
||||
|
||||
import { Box, Icon, Text } from '@/components';
|
||||
import { useCunninghamTheme } from '@/cunningham';
|
||||
import { Doc, useTrans } from '@/features/docs/doc-management';
|
||||
import {
|
||||
Doc,
|
||||
getEmojiAndTitle,
|
||||
useTrans,
|
||||
} from '@/features/docs/doc-management';
|
||||
import { DocIcon } from '@/features/docs/doc-management/components/DocIcon';
|
||||
import { useLeftPanelStore } from '@/features/left-panel';
|
||||
import { useResponsiveStore } from '@/stores';
|
||||
|
||||
@@ -38,6 +43,9 @@ export const DocSubPageItem = (props: TreeViewNodeProps<Doc>) => {
|
||||
const router = useRouter();
|
||||
const { togglePanel } = useLeftPanelStore();
|
||||
|
||||
const { emoji, titleWithoutEmoji } = getEmojiAndTitle(doc.title || '');
|
||||
const displayTitle = titleWithoutEmoji || untitledDocument;
|
||||
|
||||
const afterCreate = (createdDoc: Doc) => {
|
||||
const actualChildren = node.data.children ?? [];
|
||||
|
||||
@@ -102,6 +110,10 @@ export const DocSubPageItem = (props: TreeViewNodeProps<Doc>) => {
|
||||
background: var(--c--theme--colors--greyscale-100);
|
||||
}
|
||||
}
|
||||
|
||||
.row.preview & {
|
||||
background-color: inherit;
|
||||
}
|
||||
`}
|
||||
>
|
||||
<TreeViewItem
|
||||
@@ -122,7 +134,7 @@ export const DocSubPageItem = (props: TreeViewNodeProps<Doc>) => {
|
||||
$minHeight="24px"
|
||||
>
|
||||
<Box $width="16px" $height="16px">
|
||||
<SubPageIcon />
|
||||
<DocIcon emoji={emoji} defaultIcon={<SubPageIcon />} $size="sm" />
|
||||
</Box>
|
||||
|
||||
<Box
|
||||
@@ -137,7 +149,7 @@ export const DocSubPageItem = (props: TreeViewNodeProps<Doc>) => {
|
||||
`}
|
||||
>
|
||||
<Text $css={ItemTextCss} $size="sm" $variation="1000">
|
||||
{doc.title || untitledDocument}
|
||||
{displayTitle}
|
||||
</Text>
|
||||
{doc.nb_accesses_direct >= 1 && (
|
||||
<Icon
|
||||
|
||||
@@ -30,6 +30,7 @@ export const DocTree = ({ currentDoc }: DocTreeProps) => {
|
||||
const treeContext = useTreeContext<Doc | null>();
|
||||
const router = useRouter();
|
||||
const { isDesktop } = useResponsive();
|
||||
const [treeRoot, setTreeRoot] = useState<HTMLElement | null>(null);
|
||||
|
||||
const [initialOpenState, setInitialOpenState] = useState<OpenMap | undefined>(
|
||||
undefined,
|
||||
@@ -148,6 +149,7 @@ export const DocTree = ({ currentDoc }: DocTreeProps) => {
|
||||
|
||||
return (
|
||||
<Box
|
||||
ref={setTreeRoot}
|
||||
data-testid="doc-tree"
|
||||
$height="100%"
|
||||
$css={css`
|
||||
@@ -232,30 +234,33 @@ export const DocTree = ({ currentDoc }: DocTreeProps) => {
|
||||
</Box>
|
||||
</Box>
|
||||
|
||||
{initialOpenState && treeContext.treeData.nodes.length > 0 && (
|
||||
<TreeView
|
||||
initialOpenState={initialOpenState}
|
||||
afterMove={handleMove}
|
||||
selectedNodeId={
|
||||
treeContext.treeData.selectedNode?.id ??
|
||||
treeContext.initialTargetId ??
|
||||
undefined
|
||||
}
|
||||
canDrop={({ parentNode }) => {
|
||||
const parentDoc = parentNode?.data.value as Doc;
|
||||
if (!parentDoc) {
|
||||
return currentDoc.abilities.move && isDesktop;
|
||||
{initialOpenState &&
|
||||
treeContext.treeData.nodes.length > 0 &&
|
||||
treeRoot && (
|
||||
<TreeView
|
||||
dndRootElement={treeRoot}
|
||||
initialOpenState={initialOpenState}
|
||||
afterMove={handleMove}
|
||||
selectedNodeId={
|
||||
treeContext.treeData.selectedNode?.id ??
|
||||
treeContext.initialTargetId ??
|
||||
undefined
|
||||
}
|
||||
return parentDoc.abilities.move && isDesktop;
|
||||
}}
|
||||
canDrag={(node) => {
|
||||
const doc = node.value as Doc;
|
||||
return doc.abilities.move && isDesktop;
|
||||
}}
|
||||
rootNodeId={treeContext.root.id}
|
||||
renderNode={DocSubPageItem}
|
||||
/>
|
||||
)}
|
||||
canDrop={({ parentNode }) => {
|
||||
const parentDoc = parentNode?.data.value as Doc;
|
||||
if (!parentDoc) {
|
||||
return currentDoc.abilities.move && isDesktop;
|
||||
}
|
||||
return parentDoc.abilities.move && isDesktop;
|
||||
}}
|
||||
canDrag={(node) => {
|
||||
const doc = node.value as Doc;
|
||||
return doc.abilities.move && isDesktop;
|
||||
}}
|
||||
rootNodeId={treeContext.root.id}
|
||||
renderNode={DocSubPageItem}
|
||||
/>
|
||||
)}
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -167,7 +167,7 @@ export function HomeContent() {
|
||||
href="https://github.com/suitenumerique/docs"
|
||||
target="_blank"
|
||||
>
|
||||
Github
|
||||
GitHub
|
||||
</Button>
|
||||
</Box>
|
||||
</Box>
|
||||
|
||||
@@ -126,6 +126,7 @@ export const HomeSection = ({
|
||||
{title}
|
||||
</Text>
|
||||
<Text
|
||||
as="div"
|
||||
$variation="700"
|
||||
$weight="400"
|
||||
$size={isSmallMobile ? 'ml' : 'md'}
|
||||
|
||||
@@ -49,6 +49,7 @@ export const LeftPanelFavorites = () => {
|
||||
hasMore={docs.hasNextPage}
|
||||
isLoading={docs.isFetchingNextPage}
|
||||
next={() => void docs.fetchNextPage()}
|
||||
$padding="none"
|
||||
>
|
||||
{favoriteDocs.map((doc) => (
|
||||
<LeftPanelFavoriteItem key={doc.id} doc={doc} />
|
||||
|
||||
+24
-28
@@ -1,34 +1,30 @@
|
||||
/**
|
||||
* @jest-environment node
|
||||
*/
|
||||
|
||||
import '@testing-library/jest-dom';
|
||||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import { RequestSerializer } from '../RequestSerializer';
|
||||
import { ApiPlugin } from '../plugins/ApiPlugin';
|
||||
|
||||
const mockedGet = jest.fn().mockResolvedValue({});
|
||||
const mockedGetAllKeys = jest.fn().mockResolvedValue([]);
|
||||
const mockedPut = jest.fn().mockResolvedValue({});
|
||||
const mockedDelete = jest.fn().mockResolvedValue({});
|
||||
const mockedClose = jest.fn().mockResolvedValue({});
|
||||
const mockedOpendDB = jest.fn().mockResolvedValue({
|
||||
const mockedGet = vi.fn().mockResolvedValue({});
|
||||
const mockedGetAllKeys = vi.fn().mockResolvedValue([]);
|
||||
const mockedPut = vi.fn().mockResolvedValue({});
|
||||
const mockedDelete = vi.fn().mockResolvedValue({});
|
||||
const mockedClose = vi.fn().mockResolvedValue({});
|
||||
const mockedOpendDB = vi.fn().mockResolvedValue({
|
||||
get: mockedGet,
|
||||
getAllKeys: mockedGetAllKeys,
|
||||
getAll: jest.fn().mockResolvedValue([]),
|
||||
getAll: vi.fn().mockResolvedValue([]),
|
||||
put: mockedPut,
|
||||
delete: mockedDelete,
|
||||
clear: jest.fn().mockResolvedValue({}),
|
||||
clear: vi.fn().mockResolvedValue({}),
|
||||
close: mockedClose,
|
||||
});
|
||||
|
||||
jest.mock('idb', () => ({
|
||||
...jest.requireActual('idb'),
|
||||
vi.mock('idb', async () => ({
|
||||
...(await vi.importActual('idb')),
|
||||
openDB: () => mockedOpendDB(),
|
||||
}));
|
||||
|
||||
describe('ApiPlugin', () => {
|
||||
afterEach(() => jest.clearAllMocks());
|
||||
afterEach(() => vi.clearAllMocks());
|
||||
|
||||
[
|
||||
{ type: 'item', table: 'doc-item' },
|
||||
@@ -36,7 +32,7 @@ describe('ApiPlugin', () => {
|
||||
{ type: 'update', table: 'doc-item' },
|
||||
].forEach(({ type, table }) => {
|
||||
it(`calls fetchDidSucceed with type ${type} and status 200`, async () => {
|
||||
const mockedSync = jest.fn().mockResolvedValue({});
|
||||
const mockedSync = vi.fn().mockResolvedValue({});
|
||||
const apiPlugin = new ApiPlugin({
|
||||
tableName: table as any,
|
||||
type: type as any,
|
||||
@@ -55,7 +51,7 @@ describe('ApiPlugin', () => {
|
||||
json: () => body,
|
||||
} as unknown as Request,
|
||||
} as any;
|
||||
const mockedClone = jest.fn().mockReturnValue(requestInit.request);
|
||||
const mockedClone = vi.fn().mockReturnValue(requestInit.request);
|
||||
await apiPlugin.requestWillFetch?.(requestInit);
|
||||
|
||||
const response = await apiPlugin.fetchDidSucceed?.({
|
||||
@@ -81,7 +77,7 @@ describe('ApiPlugin', () => {
|
||||
const apiPlugin = new ApiPlugin({
|
||||
tableName: table as any,
|
||||
type: type as any,
|
||||
syncManager: jest.fn() as any,
|
||||
syncManager: vi.fn() as any,
|
||||
});
|
||||
|
||||
const body = { lastName: 'Doe' };
|
||||
@@ -114,7 +110,7 @@ describe('ApiPlugin', () => {
|
||||
{ type: 'item', withClone: false },
|
||||
].forEach(({ type, withClone }) => {
|
||||
it(`calls requestWillFetch with type ${type}`, async () => {
|
||||
const mockedSync = jest.fn().mockResolvedValue({});
|
||||
const mockedSync = vi.fn().mockResolvedValue({});
|
||||
|
||||
const apiPlugin = new ApiPlugin({
|
||||
type: 'update',
|
||||
@@ -123,7 +119,7 @@ describe('ApiPlugin', () => {
|
||||
} as any,
|
||||
});
|
||||
|
||||
const mockedClone = jest.fn().mockResolvedValue({});
|
||||
const mockedClone = vi.fn().mockResolvedValue({});
|
||||
const requestInit = {
|
||||
request: {
|
||||
url: 'test-url',
|
||||
@@ -189,9 +185,9 @@ describe('ApiPlugin', () => {
|
||||
} as unknown as Request,
|
||||
} as any;
|
||||
|
||||
const mockedClone = jest.fn().mockReturnValue(requestInit.request);
|
||||
const mockedClone = vi.fn().mockReturnValue(requestInit.request);
|
||||
|
||||
const mockedSync = jest.fn().mockResolvedValue({});
|
||||
const mockedSync = vi.fn().mockResolvedValue({});
|
||||
const apiPlugin = new ApiPlugin({
|
||||
type: 'update',
|
||||
syncManager: {
|
||||
@@ -265,9 +261,9 @@ describe('ApiPlugin', () => {
|
||||
} as unknown as Request,
|
||||
} as any;
|
||||
|
||||
const mockedClone = jest.fn().mockReturnValue(requestInit.request);
|
||||
const mockedClone = vi.fn().mockReturnValue(requestInit.request);
|
||||
|
||||
const mockedSync = jest.fn().mockResolvedValue({});
|
||||
const mockedSync = vi.fn().mockResolvedValue({});
|
||||
const apiPlugin = new ApiPlugin({
|
||||
type: 'delete',
|
||||
syncManager: {
|
||||
@@ -334,7 +330,7 @@ describe('ApiPlugin', () => {
|
||||
Object.defineProperty(global, 'self', {
|
||||
value: {
|
||||
crypto: {
|
||||
randomUUID: jest.fn().mockReturnValue('444555'),
|
||||
randomUUID: vi.fn().mockReturnValue('444555'),
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -351,9 +347,9 @@ describe('ApiPlugin', () => {
|
||||
} as unknown as Request,
|
||||
} as any;
|
||||
|
||||
const mockedClone = jest.fn().mockReturnValue(requestInit.request);
|
||||
const mockedClone = vi.fn().mockReturnValue(requestInit.request);
|
||||
|
||||
const mockedSync = jest.fn().mockResolvedValue({});
|
||||
const mockedSync = vi.fn().mockResolvedValue({});
|
||||
const apiPlugin = new ApiPlugin({
|
||||
type: 'create',
|
||||
syncManager: {
|
||||
|
||||
+8
-12
@@ -1,15 +1,14 @@
|
||||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||
/**
|
||||
* @jest-environment node
|
||||
* @vitest-environment node
|
||||
*/
|
||||
|
||||
import '@testing-library/jest-dom';
|
||||
|
||||
import { MESSAGE_TYPE } from '../conf';
|
||||
import { OfflinePlugin } from '../plugins/OfflinePlugin';
|
||||
|
||||
const mockServiceWorkerScope = {
|
||||
clients: {
|
||||
matchAll: jest.fn().mockResolvedValue([]),
|
||||
matchAll: vi.fn().mockResolvedValue([]),
|
||||
},
|
||||
} as unknown as ServiceWorkerGlobalScope;
|
||||
|
||||
@@ -19,11 +18,11 @@ const mockServiceWorkerScope = {
|
||||
} as unknown as ServiceWorkerGlobalScope;
|
||||
|
||||
describe('OfflinePlugin', () => {
|
||||
afterEach(() => jest.clearAllMocks());
|
||||
afterEach(() => vi.clearAllMocks());
|
||||
|
||||
it(`calls fetchDidSucceed`, async () => {
|
||||
const apiPlugin = new OfflinePlugin();
|
||||
const postMessageSpy = jest.spyOn(apiPlugin, 'postMessage');
|
||||
const postMessageSpy = vi.spyOn(apiPlugin, 'postMessage');
|
||||
|
||||
await apiPlugin.fetchDidSucceed?.({
|
||||
response: new Response(),
|
||||
@@ -34,7 +33,7 @@ describe('OfflinePlugin', () => {
|
||||
|
||||
it(`calls fetchDidFail`, async () => {
|
||||
const apiPlugin = new OfflinePlugin();
|
||||
const postMessageSpy = jest.spyOn(apiPlugin, 'postMessage');
|
||||
const postMessageSpy = vi.spyOn(apiPlugin, 'postMessage');
|
||||
|
||||
await apiPlugin.fetchDidFail?.({} as any);
|
||||
|
||||
@@ -43,12 +42,9 @@ describe('OfflinePlugin', () => {
|
||||
|
||||
it(`calls postMessage`, async () => {
|
||||
const apiPlugin = new OfflinePlugin();
|
||||
const mockClients = [
|
||||
{ postMessage: jest.fn() },
|
||||
{ postMessage: jest.fn() },
|
||||
];
|
||||
const mockClients = [{ postMessage: vi.fn() }, { postMessage: vi.fn() }];
|
||||
|
||||
mockServiceWorkerScope.clients.matchAll = jest
|
||||
mockServiceWorkerScope.clients.matchAll = vi
|
||||
.fn()
|
||||
.mockResolvedValue(mockClients);
|
||||
|
||||
|
||||
+14
-15
@@ -1,24 +1,23 @@
|
||||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||
/**
|
||||
* @jest-environment node
|
||||
*/
|
||||
|
||||
import '@testing-library/jest-dom';
|
||||
|
||||
import { SyncManager } from '../SyncManager';
|
||||
|
||||
const mockedSleep = jest.fn();
|
||||
jest.mock('@/utils/system', () => ({
|
||||
sleep: jest.fn().mockImplementation((ms) => mockedSleep(ms)),
|
||||
const mockedSleep = vi.fn();
|
||||
vi.mock('@/utils/system', () => ({
|
||||
sleep: vi.fn().mockImplementation((ms) => mockedSleep(ms)),
|
||||
}));
|
||||
|
||||
const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
||||
|
||||
describe('SyncManager', () => {
|
||||
afterEach(() => jest.clearAllMocks());
|
||||
afterEach(() => vi.clearAllMocks());
|
||||
|
||||
it('checks SyncManager no sync to do', async () => {
|
||||
const toSync = jest.fn();
|
||||
const hasSyncToDo = jest.fn().mockResolvedValue(false);
|
||||
const toSync = vi.fn();
|
||||
const hasSyncToDo = vi.fn().mockResolvedValue(false);
|
||||
new SyncManager(toSync, hasSyncToDo);
|
||||
|
||||
await delay(100);
|
||||
@@ -28,8 +27,8 @@ describe('SyncManager', () => {
|
||||
});
|
||||
|
||||
it('checks SyncManager sync to do', async () => {
|
||||
const toSync = jest.fn();
|
||||
const hasSyncToDo = jest.fn().mockResolvedValue(true);
|
||||
const toSync = vi.fn();
|
||||
const hasSyncToDo = vi.fn().mockResolvedValue(true);
|
||||
new SyncManager(toSync, hasSyncToDo);
|
||||
|
||||
await delay(100);
|
||||
@@ -39,10 +38,10 @@ describe('SyncManager', () => {
|
||||
});
|
||||
|
||||
it('checks SyncManager sync to do trigger error', async () => {
|
||||
jest.spyOn(console, 'error').mockImplementation(() => {});
|
||||
vi.spyOn(console, 'error').mockImplementation(() => {});
|
||||
|
||||
const toSync = jest.fn().mockRejectedValue(new Error('error'));
|
||||
const hasSyncToDo = jest.fn().mockResolvedValue(true);
|
||||
const toSync = vi.fn().mockRejectedValue(new Error('error'));
|
||||
const hasSyncToDo = vi.fn().mockResolvedValue(true);
|
||||
new SyncManager(toSync, hasSyncToDo);
|
||||
|
||||
await delay(100);
|
||||
@@ -56,8 +55,8 @@ describe('SyncManager', () => {
|
||||
});
|
||||
|
||||
it('checks SyncManager multiple sync to do', async () => {
|
||||
const toSync = jest.fn().mockReturnValue(delay(200));
|
||||
const hasSyncToDo = jest.fn().mockResolvedValue(true);
|
||||
const toSync = vi.fn().mockReturnValue(delay(200));
|
||||
const hasSyncToDo = vi.fn().mockResolvedValue(true);
|
||||
const syncManager = new SyncManager(toSync, hasSyncToDo);
|
||||
|
||||
await syncManager.sync();
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import '@testing-library/jest-dom';
|
||||
import { act, renderHook } from '@testing-library/react';
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import { MESSAGE_TYPE } from '../conf';
|
||||
import { useIsOffline, useOffline } from '../hooks/useOffline';
|
||||
|
||||
const mockAddEventListener = jest.fn();
|
||||
const mockRemoveEventListener = jest.fn();
|
||||
const mockAddEventListener = vi.fn();
|
||||
const mockRemoveEventListener = vi.fn();
|
||||
Object.defineProperty(navigator, 'serviceWorker', {
|
||||
value: {
|
||||
addEventListener: mockAddEventListener,
|
||||
@@ -16,7 +16,7 @@ Object.defineProperty(navigator, 'serviceWorker', {
|
||||
|
||||
describe('useOffline', () => {
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks();
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
it('should set isOffline to true when receiving an offline message', () => {
|
||||
|
||||
+9
-7
@@ -1,5 +1,5 @@
|
||||
import '@testing-library/jest-dom';
|
||||
import { render } from '@testing-library/react';
|
||||
import { describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import { useSWRegister } from '../hooks/useSWRegister';
|
||||
|
||||
@@ -12,9 +12,9 @@ const TestComponent = () => {
|
||||
describe('useSWRegister', () => {
|
||||
it('checks service-worker is register', () => {
|
||||
process.env.NEXT_PUBLIC_BUILD_ID = '123456';
|
||||
jest.spyOn(console, 'error').mockImplementation(() => {});
|
||||
vi.spyOn(console, 'error').mockImplementation(() => {});
|
||||
|
||||
const registerSpy = jest.fn();
|
||||
const registerSpy = vi.fn();
|
||||
registerSpy.mockImplementation(
|
||||
() =>
|
||||
new Promise((reject) => {
|
||||
@@ -22,11 +22,13 @@ describe('useSWRegister', () => {
|
||||
}),
|
||||
);
|
||||
|
||||
const addEventListenerSpy = vi.fn();
|
||||
|
||||
Object.defineProperty(navigator, 'serviceWorker', {
|
||||
value: {
|
||||
register: registerSpy,
|
||||
addEventListener: jest.fn(),
|
||||
removeEventListener: jest.fn(),
|
||||
addEventListener: addEventListenerSpy,
|
||||
removeEventListener: vi.fn(),
|
||||
},
|
||||
writable: true,
|
||||
});
|
||||
@@ -34,7 +36,7 @@ describe('useSWRegister', () => {
|
||||
render(<TestComponent />);
|
||||
|
||||
expect(registerSpy).toHaveBeenCalledWith('/service-worker.js?v=123456');
|
||||
expect(navigator.serviceWorker.addEventListener).toHaveBeenCalledWith(
|
||||
expect(addEventListenerSpy).toHaveBeenCalledWith(
|
||||
'controllerchange',
|
||||
expect.any(Function),
|
||||
);
|
||||
@@ -44,7 +46,7 @@ describe('useSWRegister', () => {
|
||||
process.env.NEXT_PUBLIC_SW_DEACTIVATED = 'true';
|
||||
process.env.NEXT_PUBLIC_BUILD_ID = '123456';
|
||||
|
||||
const registerSpy = jest.fn();
|
||||
const registerSpy = vi.fn();
|
||||
registerSpy.mockImplementation(
|
||||
() =>
|
||||
new Promise((reject) => {
|
||||
|
||||
@@ -2,48 +2,73 @@
|
||||
"br": {
|
||||
"translation": {
|
||||
"\"{{email}}\" is already invited to the document.": "\"{{email}}\" a zo pedet endeo d'ar restr-mañ.",
|
||||
"\"{{email}}\" is already member of the document.": "\"{{email}}\" zo ezel eus an teul endeo.",
|
||||
"A new way to organize knowledge.": "Un doare nevez da urzhiañ ar ouiziegezh.",
|
||||
"AI Actions": "Obererezh AI",
|
||||
"AI seems busy! Please try again.": "IA a seblant bezañ ac'hubet. Klaskit adarre, mar plij.",
|
||||
"Access Denied - Error 403": "Moned nac'het - Fazi 403",
|
||||
"Access Requests": "Goulennoù moned",
|
||||
"Access request sent successfully.": "Kaset eo bet ar goulenn mont e-barzh gant berzh.",
|
||||
"Accessible to anyone": "Aes da gaout evit an holl",
|
||||
"Accessible to authenticated users": "Hegerz evit an implijerien anaoueet",
|
||||
"Add": "Ouzhpennañ",
|
||||
"Add a callout block": "Ouzhpennañ ur bloc'had kemenn-son",
|
||||
"Add a horizontal line": "Ouzhpennañ ul linenn a-blaen",
|
||||
"Administrator": "Merour",
|
||||
"All docs": "An holl restroù",
|
||||
"An uncompromising writing experience.": "Un doare skrivañ hep treuzvarc'had.",
|
||||
"Analyzing file...": "Oc'h analizañ ar restr...",
|
||||
"Anonymous": "Dianav",
|
||||
"Anyone with the link can edit the document": "An holl gant al liamm a c'hall aozañ ar restr",
|
||||
"Anyone with the link can edit the document if they are logged in": "An holl o deus al liamm a c'hall aozañ ar restr m'emaint kevreet",
|
||||
"Anyone with the link can see the document": "An holl gant al liamm a c'hall gwelet ar restr",
|
||||
"Anyone with the link can view the document if they are logged in": "An holl o deus al liamm a c'hall gwelet ar restr m'emaint kevreet",
|
||||
"Approve": "Aprouiñ",
|
||||
"As this is a sub-document, please request access to the parent document to enable these features.": "Dre m'eo un is-teuliad, goulennit an haez ouzh ar restr kar evit enaouiñ ar fonksionoù-mañ.",
|
||||
"Available soon": "Hegerz a-benn nebeut",
|
||||
"Back to homepage": "Distreiñ d'ar bajenn degemer",
|
||||
"Banner image": "Skeudenn ar banniel",
|
||||
"Beautify": "Bravaat",
|
||||
"By moving this document to <strong>{{targetDocumentTitle}}</strong>, it will lose its current access rights and inherit the permissions of that document. <strong>This access change cannot be undone.</strong>": "En ur fiñval ar restr-mañ da <strong>{{targetDocumentTitle}}</strong>, e vo kollet ganti he gwirioù moned hag e vo roet dezhi gwirioù ar restr-se.<strong>Ar cheñchamant moned na c'hall ket bezañ disc'hraet.</strong>",
|
||||
"Callout": "Kemenn-son",
|
||||
"Can't load this page, please check your internet connection.": "N'haller ket kargañ ar bajenn-mañ, gwiriit ho kevreadenn internet mar plij.",
|
||||
"Cancel": "Nullañ",
|
||||
"Close the modal": "Serriñ ar modal",
|
||||
"Collaborate": "Kenlabourat",
|
||||
"Collaborate and write in real time, without layout constraints.": "Kenlabourit ha skrivit en amzer wirion hep kudenn pajennaozañ ebet.",
|
||||
"Collaborative writing, Simplified.": "Ar skrivañ a-stroll simplaet.",
|
||||
"Confirm": "Kadarnaat",
|
||||
"Confirm deletion": "Kadarnaat an dilamadenn",
|
||||
"Confirmation button": "Bouton kadarnaat",
|
||||
"Connected": "Kevreet",
|
||||
"Content modal to delete document": "Endalc'had modal da zilemel ar restr",
|
||||
"Content modal to explain why the user cannot edit": "Modal endalc'had evit displegañ perak ne c'hall ket an implijer aozañ",
|
||||
"Content modal to export the document": "Endalc'had modal evit ezporzhiañ ar restr",
|
||||
"Convert Markdown": "Amdreiñ ar Markdown",
|
||||
"Copied to clipboard": "Eilet er golver",
|
||||
"Copy as {{format}}": "Eilañ evel {{format}}",
|
||||
"Copy link": "Eilañ al liamm",
|
||||
"Correct": "Reizhañ",
|
||||
"Create a new sub-doc": "Krouiñ un is-restr nevez",
|
||||
"Current doc": "Teul red",
|
||||
"Delete": "Dilemel",
|
||||
"Delete a doc": "Dilemel un doc",
|
||||
"Delete document": "Dilemel ar restr",
|
||||
"Divider": "Skejer",
|
||||
"Doc visibility card": "Kartenn gweled ar restr",
|
||||
"Docs": "Docs",
|
||||
"Docs Logo": "Logo Docs",
|
||||
"Docs is already available, log in to use it now.": "Docs a zo hegerz dija, kevreit evit ober gantañ.",
|
||||
"Docs makes real-time collaboration simple. Invite collaborators - public officials or external partners - with one click to see their changes live, while maintaining precise access control for data security.": "Docs a aesa ar c'henlabour en amzer wirion. Pedit kenlabourerien - ajantoù publik pe kevelerien diavaez - dindan ur c'hlik gwelit o cheñchamantoù war-eeun, en ur virout ur c'hontrol resis war ar monedoù evit surentez ar roadennoù.",
|
||||
"Docs offers an intuitive writing experience. Its minimalist interface favors content over layout, while offering the essentials: media import, offline mode and keyboard shortcuts for greater efficiency.": "Docs a ginnig ur skiant-prenet skrivañ hag a sant diouzh an nen. E etrefas minimel a brivilaj an endalc'had war ar bajennaozañ, en ur ginnig ar pep retañ: emporzhiañ médiaoù, mod ezlinenn ha berradennoù klavier evit bezañ efedusoc'h.",
|
||||
"Docs transforms your documents into knowledge bases thanks to subpages, powerful search and the ability to pin your important documents.": "Docs a dreuzfurm ho restroù e diazezoù gouiziegezh gant sikour an ispajennoù, enklaskoù galloudus hag an tu da spilhenniñ ho restroù a-bouez.",
|
||||
"Docs: Your new companion to collaborate on documents efficiently, intuitively, and securely.": "Docs: Ho kompagnun nevez evit kenlabourat war restroù en un doare efedus, dre santout diouzh an nen hag e surentez penn-da-benn.",
|
||||
"Document access mode": "Doare moned ar restr",
|
||||
"Document accessible to any connected person": "Restr a c'hall bezañ tizhet gant ne vern piv a vefe kevreet",
|
||||
"Document duplicated successfully!": "Restr eilet gant berzh!",
|
||||
"Document owner": "Perc'henn ar restr",
|
||||
"Document sections": "Rannoù an teul",
|
||||
"Document sections": "Kevrennoù ar restr",
|
||||
"Document visibility": "Gwelusted ar restr",
|
||||
"Docx": "Docx",
|
||||
"Download": "Pellgargañ",
|
||||
"Download anyway": "Pellgargañ memestra",
|
||||
@@ -51,41 +76,65 @@
|
||||
"Duplicate": "Eilañ",
|
||||
"Editing": "Oc'h aozañ",
|
||||
"Editor": "Embanner",
|
||||
"Editor unavailable": "Aozer dihegerz",
|
||||
"Emojify": "Emojifiañ",
|
||||
"Empty template": "Patrom ebet",
|
||||
"Error during delete invitation": "Fazi en ur zilemel ar bedadenn",
|
||||
"Error during update invitation": "Fazi e-pad hizivadur ar bedadenn",
|
||||
"Error while deleting invitation": "Fazi e-pad ma oa o tilemel ur bedadenn",
|
||||
"Error while removing the request.": "Fazi en ur zilemel ar goulenn.",
|
||||
"Error while updating the member role.": "Fazi e-pad ma oa oc'h hizivaat roll an ezel.",
|
||||
"Export": "Ezporzhiañ",
|
||||
"Failed to add the member in the document.": "C'hwiet ez eus bet war ouzhpennañ an ezel er restr.",
|
||||
"Failed to copy link": "Eilañ al liamm c'hwitet",
|
||||
"Failed to copy to clipboard": "C'hwitadenn an eilañ er golver",
|
||||
"Failed to create the invitation for {{email}}.": "C'hwitet ez eus bet war ar bedadenn evit {{email}}.",
|
||||
"Failed to duplicate the document...": "C'hwitet ez eus bet war eiladenn ar restr...",
|
||||
"Flexible export.": "Ezporzhiañ gwevn.",
|
||||
"Format": "Stumm",
|
||||
"Govs ❤️ Open Source.": "Gouarnamantoù ❤️ ar c'hod mammenn digor.",
|
||||
"History": "Roll-istor",
|
||||
"Home": "Degemer",
|
||||
"I understand": "Kompren a ran",
|
||||
"If a member is editing, his works can be lost.": "M'emañ oc'h aozañ un ezel e c'hallo bezañ kollet e labour.",
|
||||
"If you wish to be able to co-edit in real-time, contact your Information Systems Security Manager about allowing WebSockets.": "Mar fell deoc'h bezañ gouest da gen-aozañ en amzer wirion, kit e darempred gant ho merour surentez sistemoù kelaouiñ evit aotren ar WebSockets.",
|
||||
"Illustration": "Skeudenn",
|
||||
"Image 401": "Skeudenn 401",
|
||||
"Image 403": "Skeudenn 403",
|
||||
"Insufficient access rights to view the document.": "Gwirioù moned skort evit gellout gwelet ar restr.",
|
||||
"Invite": "Pediñ",
|
||||
"It is the card information about the document.": "Ar gartenn ditouriñ eo diwar-benn ar restr.",
|
||||
"It is the document title": "Titl ar restr eo",
|
||||
"It seems that the page you are looking for does not exist or cannot be displayed correctly.": "War a seblant n'eus ket eus ar bajenn emaoc'h o klask pe n'hall ket bezañ diskouezet en un doare dereat.",
|
||||
"Language": "Yezh",
|
||||
"Last update: {{update}}": "Hizivadur diwezhañ: {{update}}",
|
||||
"Learn more": "Gouzout hiroc'h",
|
||||
"Link Copied !": "Liamm eilet!",
|
||||
"Link a doc": "Liammañ ur restr",
|
||||
"Link settings": "Arventennoù al liamm",
|
||||
"Link this doc to another doc": "Liammañ ar restr-mañ ouzh ur restr all",
|
||||
"Links": "Liammoù",
|
||||
"List invitation card": "Kartenn al listenn pedadennoù",
|
||||
"List members card": "Listennad kartennoù an izili",
|
||||
"List request access card": "Kartenn al listennad goulennoù moned",
|
||||
"List search user result card": "Listenn disoc'hoù ar c'hlask implijer",
|
||||
"Load more": "Kargañ muioc'h",
|
||||
"Log in to access the document.": "Kevreañ evit tizhout an teul.",
|
||||
"Login": "Kevreañ",
|
||||
"Logo": "Logo",
|
||||
"Logout": "Digevreañ",
|
||||
"Modal confirmation to download the attachment": "Modal kadarnaat evit pellgargañ ar pezh-stag",
|
||||
"Modal confirmation to restore the version": "Modal kadarnaat evit assevel ar stumm",
|
||||
"More docs": "Restroù ouzhpenn",
|
||||
"More options": "Muioc'h a zibaboù",
|
||||
"Move": "Fiñval",
|
||||
"Move document": "Fiñval an teul",
|
||||
"Move to my docs": "Fiñval davet ma zeulioù",
|
||||
"My docs": "Ma restroù",
|
||||
"Name": "Anv",
|
||||
"New doc": "Restr nevez",
|
||||
"New sub-doc": "Is-restr nevez",
|
||||
"No active search": "Enklask oberiant ebet",
|
||||
"No document found": "Restr ebet kavet",
|
||||
"No documents found": "Teul ebet kavet",
|
||||
"No text selected": "Testenn ebet diuzet",
|
||||
@@ -96,15 +145,19 @@
|
||||
"Open Source": "Kod mammenn digor",
|
||||
"Open the document options": "Digeriñ dibarzhioù ar restr",
|
||||
"Open the header menu": "Digeriñ lañser an talbennoù",
|
||||
"Open the menu of actions for the document: {{title}}": "Digeriñ lañser oberezhioù evit ar restr: {{title}}",
|
||||
"Organize": "Aozañ",
|
||||
"Others are editing this document. Unfortunately your network blocks WebSockets, the technology enabling real-time co-editing.": "Tud all a zo oc'h aozañ ar restr-mañ. Siwazh e stank ho kenrouedad ar WebSockets, an deknologiezh a ro an tu da skrivañ a-stroll war an dro.",
|
||||
"Others are editing. Your network prevent changes.": "Lod all a zo oc'h aozañ. Ho rouedad a vir ouzh ar c'hemmoù.",
|
||||
"Owner": "Perc'henn",
|
||||
"PDF": "PDF",
|
||||
"Page Not Found - Error 404": "N'eo ket bet kavet ar bajenn - Fazi 404",
|
||||
"Pending invitations": "Pedadennoù o c'hortoz",
|
||||
"People with access via the parent document": "An dud a c'hall tizhout dre ar restr kar",
|
||||
"Pin": "Spilhennañ",
|
||||
"Pin document icon": "Ikon spilhennañ un teuliad",
|
||||
"Pinned documents": "Restroù spilhennet",
|
||||
"Please download it only if it comes from a trusted source.": "Pellgargañ anezhañ ma teu eus ur vammenn fizius hepken, mar plij.",
|
||||
"Private": "Prevez",
|
||||
"Proconnect Login": "Kevreañ Proconnect",
|
||||
"Public": "Publik",
|
||||
@@ -113,13 +166,21 @@
|
||||
"Reader": "Lenner",
|
||||
"Reading": "Lenn hepken",
|
||||
"Remove": "Dilemel",
|
||||
"Remove access": "Dilemel ar moned",
|
||||
"Rename": "Adenvel",
|
||||
"Rephrase": "Adformulenniñ",
|
||||
"Request access": "Goulenn mont e-barzh",
|
||||
"Reset": "Adderaouiñ",
|
||||
"Restore": "Assevel",
|
||||
"Search": "Klask",
|
||||
"Search by title": "Klask dre ditloù",
|
||||
"Search docs": "Klask restroù",
|
||||
"Search modal": "Modal rannañ",
|
||||
"Search user result": "Disoc'h klask an implijer",
|
||||
"Select a doc": "Diuzañ ur restr",
|
||||
"Select a document": "Diuzañ ur restr",
|
||||
"Select a version on the right to restore": "Dibabit ur stumm a-zehoù da assevel",
|
||||
"Select language": "Dibab ur yezh",
|
||||
"Share": "Rannañ",
|
||||
"Share modal": "Modal rannañ",
|
||||
"Share the document": "Rannañ an teul",
|
||||
@@ -131,32 +192,49 @@
|
||||
"Shared with {{count}} users_one": "Rannet gant {{count}} implijer",
|
||||
"Shared with {{count}} users_other": "Rannet gant {{count}} implijer",
|
||||
"Show more": "Diskouez muioc'h",
|
||||
"Simple and secure collaboration.": "Kenlabour simpl ha sur.",
|
||||
"Simple document icon": "Ikon teuliad eeun",
|
||||
"Something bad happens, please retry.": "Un dra bennak a zo c'hoarvezet, klaskit en-dro.",
|
||||
"Start Writing": "Stagañ da skrivañ",
|
||||
"Summarize": "Diverrañ",
|
||||
"Summary": "Taolenn",
|
||||
"Template": "Patrom",
|
||||
"The antivirus has detected an anomaly in your file.": "An enepvirus en deus detektet un direizhder en ho restr.",
|
||||
"The document has been deleted.": "Dilamet eo bet ar restr.",
|
||||
"The document visibility has been updated.": "Hizivaet eo bet gweled ar restr.",
|
||||
"The export failed": "Ezporzhiañ c'hwitet",
|
||||
"The link sharing rules differ from the parent document": "Disheñvel eo reolennoù ar rannañ liammoù diouzh ar restr bennañ",
|
||||
"This document and <strong>any sub-documents</strong> will be permanently deleted. This action is irreversible.": "An teul-mañ hag <strong>hollad e isteulioù</strong> a vo dilamet da virviken. N'heller ket distreiñ war an ober-mañ.",
|
||||
"This file is flagged as unsafe.": "Merket eo ar restr-mañ evel amsur.",
|
||||
"This means you can't edit until others leave.": "Kement-se a dalvez ne c'hallit ket aozañ ken na vo aet kuit tud all.",
|
||||
"This user has access inherited from a parent page.": "An implijer-mañ en deus ur moned diwar ur bajenn gerent.",
|
||||
"To facilitate the circulation of documents, Docs allows you to export your content to the most common formats: PDF, Word or OpenDocument.": "Evit aesaat tremen-distremen ar restroù, Docs a ro an tu da ezporzhiañ hoc'h endalc'hadoù war-zu ar stummoù implijetañ: PDF, Word pe OpenDocument.",
|
||||
"Too many requests. Please wait 60 seconds.": "Re a c'houlennoù. Gortozit 60 eilenn mar plij.",
|
||||
"Type a name or email": "Skrivit hoc'h anv pe ur postel",
|
||||
"Type the name of a document": "Skrivit anv ur restr",
|
||||
"Unnamed document": "Teul hep titl",
|
||||
"Unpin": "Dispilhennañ",
|
||||
"Untitled document": "Restr hep titl",
|
||||
"Updated": "Hizivaet",
|
||||
"Updated at": "Hizivaet d'ar/al",
|
||||
"Use as prompt": "Implijout evel ur prompt",
|
||||
"Version history": "Roll-istor ar stummoù",
|
||||
"Version restored successfully": "Stumm assavet gant berzh",
|
||||
"Visibility": "Gwelusted",
|
||||
"Visibility mode": "Mod gwelusted",
|
||||
"Document visibility": "Gwelusted an teul",
|
||||
"Document access mode": "Mod aotreet an teul",
|
||||
"Warning": "Diwallit",
|
||||
"Why you can't edit the document?": "Perak ne c'hellit ket aozañ ar restr?",
|
||||
"Write": "Skrivañ"
|
||||
"Write": "Skrivañ",
|
||||
"You are the sole owner of this group, make another member the group owner before you can change your own role or be removed from your document.": "C'hwi 'zo perc'henn nemetañ ar strollad-mañ, lakait un ezel all da vezañ perc'henn war ar strollad a-raok gellout cheñch ho roll pe evit bezañ dilamet diwar ar restr.",
|
||||
"You can view this document but need additional access to see its members or modify settings.": "C'hwi a c'hell gwelet ar restr-mañ met bez ho peus da gaout monedoù ouzhpenn evit gwelet an izili pe evit kemmañ an arventennoù.",
|
||||
"You cannot restrict access to a subpage relative to its parent page.": "N'hellit ket strishaat moned d'un ispajenn e-keñver he fajenn gar.",
|
||||
"You must be at least the editor of the target document": "Bez ho peus da vezañ da vihanañ aozer ar restr sibl",
|
||||
"You must be the owner to move the document": "Bez ho peus da vezañ ar perc'henn evit fiñval ar restr",
|
||||
"You're currently viewing a sub-document. To gain access, please request permission from the main document.": "O sellet ouzh un is-restr emaoc'h. Evit kaout ar moned, goulennit eta kaout aotre evit tizhout ar restr kerent.",
|
||||
"Your access request for this document is pending.": "Ho koulenn moned evit ar restr-mañ a zo war c'hortoz.",
|
||||
"Your current document will revert to this version.": "Ho restr red a zistroio d'ar stumm-mañ.",
|
||||
"Your {{format}} was downloaded succesfully": "Pellgarget eo bet ho {{format}} gant berzh",
|
||||
"home-content-open-source-part1": "Docs a zo savet gant <2>Django Rest Framework</2> ha <6>Next.js</6>. Implijet e vez <9>Yjs</9> ivez ha <13>BlockNote.js</13>, daou raktres omp fier droch da sponsorizañ.",
|
||||
"home-content-open-source-part2": "Posupl eo deoc'h herberc'hiañ Docs (kit da sellet ouzh hon <2>teuliadur</2> staliañ).<br/>Docs a ra gant ul <7>lisañs</7> (MIT) azasaet ouzh an nevezadenn koulz ouzh an embregerezhioù.<br/>Ar c'hendaoladoù a zo ouzhpenn degemeret mat (kit da lenn hon follenn-stur <13>amañ</13>).",
|
||||
"home-content-open-source-part3": "Docs zo frouezh ur striv a-gevret kaset gant ar gouarnamantoù gall 🇫🇷🥖 <1>(DINUM)</1> hag alaman 🇩🇪🥨 <5>(ZenDiS)</5>."
|
||||
}
|
||||
},
|
||||
"de": {
|
||||
@@ -210,7 +288,6 @@
|
||||
"Doc visibility card": "Dokumenten-Sichtbarkeitskarte",
|
||||
"Docs": "Docs",
|
||||
"Docs Logo": "Docs-Logo",
|
||||
"Back to homepage": "Zurück zur Startseite",
|
||||
"Docs is already available, log in to use it now.": "Docs ist bereits verfügbar. Melden Sie sich an, um es jetzt zu nutzen.",
|
||||
"Docs makes real-time collaboration simple. Invite collaborators - public officials or external partners - with one click to see their changes live, while maintaining precise access control for data security.": "Docs macht die Zusammenarbeit in Echtzeit einfach. Laden Sie Mitarbeiter — Beamte oder externe Partner — mit einem Klick ein, um ihre Änderungen live zu sehen und dabei die genaue Zugangskontrolle zwecks Datensicherheit beizubehalten.",
|
||||
"Docs offers an intuitive writing experience. Its minimalist interface favors content over layout, while offering the essentials: media import, offline mode and keyboard shortcuts for greater efficiency.": "Docs bietet ein intuitives Schreiberlebnis. Seine minimalistische Oberfläche bevorzugt Inhalte über Layout, bietet aber das Wesentliche: Medien-Import, Offline-Modus und Tastaturkürzel für mehr Effizienz.",
|
||||
@@ -219,7 +296,6 @@
|
||||
"Document accessible to any connected person": "Dokument für jeden angemeldeten Benutzer zugänglich",
|
||||
"Document duplicated successfully!": "Dokument erfolgreich dupliziert!",
|
||||
"Document owner": "Besitzer des Dokuments",
|
||||
"Document sections": "Dokumentabschnitte",
|
||||
"Docx": "Docx",
|
||||
"Download": "Herunterladen",
|
||||
"Download anyway": "Trotzdem herunterladen",
|
||||
@@ -268,7 +344,6 @@
|
||||
"Modal confirmation to download the attachment": "Modale Bestätigung zum Herunterladen des Anhangs",
|
||||
"Modal confirmation to restore the version": "Modale Bestätigung um die Version wiederherzustellen",
|
||||
"More docs": "Weitere Dokumente",
|
||||
"More options": "Weitere Optionen",
|
||||
"Move": "Verschieben",
|
||||
"Move document": "Dokument verschieben",
|
||||
"Move to my docs": "In \"Meine Dokumente\" verschieben",
|
||||
@@ -312,7 +387,6 @@
|
||||
"Reset": "Zurücksetzen",
|
||||
"Restore": "Wiederherstellen",
|
||||
"Search": "Suchen",
|
||||
"Search docs": "Dokumente durchsuchen",
|
||||
"Search modal": "Suche Modal",
|
||||
"Search user result": "Suchergebnis",
|
||||
"Select a document": "Dokument auswählen",
|
||||
@@ -349,15 +423,10 @@
|
||||
"Unnamed document": "Unbenanntes Dokument",
|
||||
"Unpin": "Lösen",
|
||||
"Untitled document": "Unbenanntes Dokument",
|
||||
"Updated": "Aktualisiert",
|
||||
"Updated at": "Aktualisiert am",
|
||||
"Use as prompt": "Als Prompt verwenden",
|
||||
"Version history": "Versionsverlauf",
|
||||
"Version restored successfully": "Version erfolgreich wiederhergestellt",
|
||||
"Visibility": "Sichtbarkeit",
|
||||
"Visibility mode": "Sichtbarkeitseinstellungen",
|
||||
"Document visibility": "Dokumentensichtbarkeit",
|
||||
"Document access mode": "Dokumentenzugriffsmodus",
|
||||
"Warning": "Warnung",
|
||||
"Why you can't edit the document?": "Warum können Sie dieses Dokument nicht bearbeiten?",
|
||||
"Write": "Schreiben",
|
||||
@@ -367,7 +436,6 @@
|
||||
"Your access request for this document is pending.": "Ihre Zugriffsanfrage für dieses Dokument steht noch aus.",
|
||||
"Your current document will revert to this version.": "Ihr aktuelles Dokument wird auf diese Version zurückgesetzt.",
|
||||
"Your {{format}} was downloaded succesfully": "Ihr {{format}} wurde erfolgreich heruntergeladen",
|
||||
"Open the menu of actions for the document: {{title}}": "Öffnen Sie das Aktionsmenü für das Dokument: {{title}}",
|
||||
"home-content-open-source-part1": "Doms ist auf <2>Django Rest Framework</2> und <6>Next.js</6> aufgebaut. Wir verwenden auch <9>Yjs</9> und <13>BlockNote.js</13>, zwei Projekte, die wir mit Stolz sponsern.",
|
||||
"home-content-open-source-part2": "Sie können Docs ganz einfach selbst hosten (lesen Sie unsere <2>Installationsdokumentation</2>).<br/>Docs verwendet eine <7>Lizenz</7> (MIT), die auf Innovation und Unternehmen zugeschnitten ist.<br/>Beiträge sind willkommen (lesen Sie unsere Roadmap <13>hier</13>).\n",
|
||||
"home-content-open-source-part3": "Docs ist das Ergebnis einer gemeinsamen Anstrengung, die von der französischen Regierung 🇫🇷🥖 <1>(DINUM)</1> und der deutschen Regierung 🇩🇪🥨 <5>(ZenDiS)</5> geleitet wurde. “, „home-content-open-source-part3“: „Docs ist das Ergebnis einer gemeinsamen Anstrengung, die von der französischen Regierung 🇫🇷🥖 <1>(DINUM)</1> und der deutschen Regierung 🇩🇪🥨 <5>(ZenDiS)</5> geleitet wird."
|
||||
@@ -375,17 +443,10 @@
|
||||
},
|
||||
"en": {
|
||||
"translation": {
|
||||
"Back to homepage": "Back to Docs homepage",
|
||||
"Search docs": "Search docs",
|
||||
"More options": "More options",
|
||||
"Pinned documents": "Pinned documents",
|
||||
"Open actions menu for document: {{title}}": "Open actions menu for document: {{title}}",
|
||||
"Open the menu of actions for the document: {{title}}": "Open the menu of actions for the document: {{title}}",
|
||||
"Share with {{count}} users_one": "Share with {{count}} user",
|
||||
"Shared with {{count}} users_many": "Shared with {{count}} users",
|
||||
"Shared with {{count}} users_one": "Shared with {{count}} user",
|
||||
"Shared with {{count}} users_other": "Shared with {{count}} users",
|
||||
"Updated": "Updated"
|
||||
"Shared with {{count}} users_other": "Shared with {{count}} users"
|
||||
}
|
||||
},
|
||||
"es": {
|
||||
@@ -436,7 +497,6 @@
|
||||
"Doc visibility card": "Accesos al documento",
|
||||
"Docs": "Docs",
|
||||
"Docs Logo": "Logo de Docs",
|
||||
"Back to homepage": "Volver a la página de inicio",
|
||||
"Docs is already available, log in to use it now.": "Docs ya está disponible, inicia sesión para empezar a usarlo.",
|
||||
"Docs makes real-time collaboration simple. Invite collaborators - public officials or external partners - with one click to see their changes live, while maintaining precise access control for data security.": "Docs simplifica la colaboración en tiempo real. Invitar colaboradores - funcionarios públicos o socios externos - con un solo clic para ver sus cambios en vivo, manteniendo un control de acceso preciso para la seguridad de los datos.",
|
||||
"Docs offers an intuitive writing experience. Its minimalist interface favors content over layout, while offering the essentials: media import, offline mode and keyboard shortcuts for greater efficiency.": "Docs ofrece una experiencia de escritura intuitiva. Su interfaz minimalista favorece el contenido sobre el diseño, mientras ofrece lo esencial: importación de medios, modo sin conexión y atajos de teclado para una mayor eficiencia.",
|
||||
@@ -444,7 +504,6 @@
|
||||
"Docs: Your new companion to collaborate on documents efficiently, intuitively, and securely.": "Docs: su nuevo compañero para colaborar en documentos de forma eficiente, intuitiva y segura.",
|
||||
"Document accessible to any connected person": "Documento accesible a cualquier persona conectada",
|
||||
"Document owner": "Propietario del documento",
|
||||
"Document sections": "Secciones del documento",
|
||||
"Docx": "Docx",
|
||||
"Download": "Descargar",
|
||||
"Download anyway": "Descargar de todos modos",
|
||||
@@ -486,7 +545,6 @@
|
||||
"Modal confirmation to download the attachment": "Modal de confirmación para descargar el archivo adjunto",
|
||||
"Modal confirmation to restore the version": "Modal de confirmación para restaurar la versión",
|
||||
"More docs": "Más documentos",
|
||||
"More options": "Más opciones",
|
||||
"My docs": "Mis documentos",
|
||||
"Name": "Nombre",
|
||||
"New doc": "Nuevo documento",
|
||||
@@ -499,8 +557,6 @@
|
||||
"Offline ?!": "¿¡Sin conexión!?",
|
||||
"Only invited people can access": "Solo las personas invitadas pueden acceder",
|
||||
"Open Source": "Código abierto",
|
||||
"Open actions menu for document: {{title}}": "Abrir menú de acciones para el documento: {{title}}",
|
||||
"Open the menu of actions for the document: {{title}}": "Abrir el menú de acciones para el documento: {{title}}",
|
||||
"Open the document options": "Abrir las opciones del documento",
|
||||
"Open the header menu": "Abrir el menú de encabezado",
|
||||
"Organize": "Organiza",
|
||||
@@ -525,7 +581,6 @@
|
||||
"Request access": "Solicitar acceso",
|
||||
"Restore": "Recuperar",
|
||||
"Search": "Buscar",
|
||||
"Search docs": "Buscar documentos",
|
||||
"Search modal": "Modal de búsqueda",
|
||||
"Search user result": "Resultado de la búsqueda de usuarios",
|
||||
"Select a document": "Selecciona un documento",
|
||||
@@ -558,15 +613,10 @@
|
||||
"Type the name of a document": "Escribe el nombre de un documento",
|
||||
"Unpin": "Desanclar",
|
||||
"Untitled document": "Documento sin título",
|
||||
"Updated": "Actualizado",
|
||||
"Updated at": "Actualizado a las",
|
||||
"Use as prompt": "Usar como prompt",
|
||||
"Version history": "Historial de versiones",
|
||||
"Version restored successfully": "Versión restaurada con éxito",
|
||||
"Visibility": "Visibilidad",
|
||||
"Visibility mode": "Modo de visibilidad",
|
||||
"Document visibility": "Visibilidad del documento",
|
||||
"Document access mode": "Modo de acceso al documento",
|
||||
"Warning": "Aviso",
|
||||
"Write": "Escribe",
|
||||
"You are the sole owner of this group, make another member the group owner before you can change your own role or be removed from your document.": "Eres el único propietario de este grupo, haz que otro miembro sea el propietario del grupo para poder cambiar tu propio rol o ser eliminado del documento.",
|
||||
@@ -604,6 +654,7 @@
|
||||
"Approve": "Approuver",
|
||||
"As this is a sub-document, please request access to the parent document to enable these features.": "Comme il s'agit d'un sous-document, veuillez demander l'accès au document parent pour activer ces fonctionnalités.",
|
||||
"Available soon": "Disponible prochainement",
|
||||
"Back to homepage": "Retour à la page d'accueil",
|
||||
"Banner image": "Image de la bannière",
|
||||
"Beautify": "Embellir",
|
||||
"By moving this document to <strong>{{targetDocumentTitle}}</strong>, it will lose its current access rights and inherit the permissions of that document. <strong>This access change cannot be undone.</strong>": "En déplaçant ce document vers <strong>{{targetDocumentTitle}}</strong>, il perdra ses droits d'accès actuels et héritera les permissions de ce document. <strong>Ce changement d'accès ne peut pas être annulé.</strong>",
|
||||
@@ -635,16 +686,18 @@
|
||||
"Doc visibility card": "Carte de visibilité du doc",
|
||||
"Docs": "Docs",
|
||||
"Docs Logo": "Logo Docs",
|
||||
"Back to homepage": "Retour à la page d'accueil de Docs",
|
||||
"Docs is already available, log in to use it now.": "Docs est déjà disponible, connectez-vous pour l’utiliser dès maintenant.",
|
||||
"Docs makes real-time collaboration simple. Invite collaborators - public officials or external partners - with one click to see their changes live, while maintaining precise access control for data security.": "Docs simplifie la collaboration en temps réel. Invitez des collaborateurs - agents publics ou partenaires externes - d'un clic pour voir leurs modifications en direct, tout en gardant un contrôle précis des accès pour la sécurité des données.",
|
||||
"Docs offers an intuitive writing experience. Its minimalist interface favors content over layout, while offering the essentials: media import, offline mode and keyboard shortcuts for greater efficiency.": "Docs propose une expérience d'écriture intuitive. Son interface minimaliste privilégie le contenu sur la mise en page, tout en offrant l'essentiel : import de médias, mode hors-ligne et raccourcis clavier pour plus d'efficacité.",
|
||||
"Docs transforms your documents into knowledge bases thanks to subpages, powerful search and the ability to pin your important documents.": "Docs transforme vos documents en bases de connaissances grâce aux sous-pages, une recherche performante et la possibilité d'épingler vos documents importants.",
|
||||
"Docs: Your new companion to collaborate on documents efficiently, intuitively, and securely.": "Docs : Votre nouveau compagnon pour collaborer sur des documents efficacement, intuitivement et en toute sécurité.",
|
||||
"Document access mode": "Mode d'accès au document",
|
||||
"Document accessible to any connected person": "Document accessible à toute personne connectée",
|
||||
"Document duplicated successfully!": "Document dupliqué avec succès !",
|
||||
"Document emoji icon": "Émoticônes du document",
|
||||
"Document owner": "Propriétaire du document",
|
||||
"Document sections": "Sections des documents",
|
||||
"Document sections": "Sections du document",
|
||||
"Document visibility": "Visibilité du document",
|
||||
"Docx": "Docx",
|
||||
"Download": "Télécharger",
|
||||
"Download anyway": "Télécharger malgré tout",
|
||||
@@ -661,6 +714,7 @@
|
||||
"Error while removing the request.": "Erreur lors de la suppression de la demande.",
|
||||
"Error while updating the member role.": "Erreur lors de la mise à jour du rôle du membre.",
|
||||
"Export": "Exporter",
|
||||
"Export the document": "Exporter le document",
|
||||
"Failed to add the member in the document.": "Impossible d'ajouter le membre dans le document.",
|
||||
"Failed to copy link": "Échec de la copie du lien",
|
||||
"Failed to copy to clipboard": "Échec de la copie dans le presse-papier",
|
||||
@@ -679,8 +733,6 @@
|
||||
"Image 403": "Image 403",
|
||||
"Insufficient access rights to view the document.": "Droits d'accès insuffisants pour voir le document.",
|
||||
"Invite": "Inviter",
|
||||
"Open actions menu for document: {{title}}": "Ouvrir le menu d'actions pour le document : {{title}}",
|
||||
"Open the menu of actions for the document: {{title}}": "Ouvrir le menu d'actions du document",
|
||||
"It is the card information about the document.": "Il s'agit de la carte d'information du document.",
|
||||
"It is the document title": "Il s'agit du titre du document",
|
||||
"It seems that the page you are looking for does not exist or cannot be displayed correctly.": "Il semble que la page que vous cherchez n'existe pas ou ne puisse pas être affichée correctement.",
|
||||
@@ -723,6 +775,7 @@
|
||||
"Open Source": "Open Source",
|
||||
"Open the document options": "Ouvrir les options du document",
|
||||
"Open the header menu": "Ouvrir le menu d'en-tête",
|
||||
"Open the menu of actions for the document: {{title}}": "Ouvrir le menu des actions du document : {{title}}",
|
||||
"Organize": "Organiser",
|
||||
"Others are editing this document. Unfortunately your network blocks WebSockets, the technology enabling real-time co-editing.": "D'autres sont en train de modifier ce document. Malheureusement, votre réseau bloque les web sockets, la technologie permettant la coédition en temps réel.",
|
||||
"Others are editing. Your network prevent changes.": "D'autres sont en cours d'édition. Votre réseau empêche les changements.",
|
||||
@@ -751,12 +804,13 @@
|
||||
"Restore": "Restaurer",
|
||||
"Search": "Rechercher",
|
||||
"Search by title": "Recherchez par titre",
|
||||
"Search docs": "Rechercher un document",
|
||||
"Search docs": "Rechercher des docs",
|
||||
"Search modal": "Modale de partage",
|
||||
"Search user result": "Résultat de la recherche utilisateur",
|
||||
"Select a doc": "Sélectionnez un doc",
|
||||
"Select a document": "Sélectionnez un document",
|
||||
"Select a version on the right to restore": "Sélectionnez une version à droite à restaurer",
|
||||
"Select language": "Sélectionner la langue",
|
||||
"Share": "Partager",
|
||||
"Share modal": "Modale de partage",
|
||||
"Share the document": "Partager le document",
|
||||
@@ -789,17 +843,13 @@
|
||||
"Type a name or email": "Tapez un nom ou un email",
|
||||
"Type the name of a document": "Tapez le nom d'un document",
|
||||
"Unnamed document": "Document sans titre",
|
||||
"Updated": "Mise à jour",
|
||||
"Unpin": "Désépingler",
|
||||
"Untitled document": "Document sans titre",
|
||||
"Updated": "Mise à jour",
|
||||
"Updated at": "Mise à jour le",
|
||||
"Use as prompt": "Utiliser comme un prompt",
|
||||
"Version history": "Historique des versions",
|
||||
"Version restored successfully": "Version restaurée avec succès",
|
||||
"Visibility": "Visibilité",
|
||||
"Visibility mode": "Mode de visibilité",
|
||||
"Document visibility": "Visibilité du document",
|
||||
"Document access mode": "Mode d'accès au document",
|
||||
"Warning": "Attention",
|
||||
"Why you can't edit the document?": "Pourquoi vous ne pouvez pas modifier le document ?",
|
||||
"Write": "Écrire",
|
||||
@@ -957,10 +1007,6 @@
|
||||
"Use as prompt": "Usa come prompt",
|
||||
"Version history": "Cronologia delle versioni",
|
||||
"Version restored successfully": "Revisione ripristinata correttamente",
|
||||
"Visibility": "Visibilità",
|
||||
"Visibility mode": "Modalità visibilità",
|
||||
"Document visibility": "Visibilità del documento",
|
||||
"Document access mode": "Modalità di accesso al documento",
|
||||
"Warning": "Attenzione",
|
||||
"Write": "Scrivi",
|
||||
"You are the sole owner of this group, make another member the group owner before you can change your own role or be removed from your document.": "Sei l'unico proprietario di questo gruppo, devi nominare proprietario un altro membro del gruppo prima di poter cambiare il proprio ruolo o di essere rimosso dal documento.",
|
||||
@@ -1012,7 +1058,6 @@
|
||||
"Doc visibility card": "Docs zichtbaarheid kaart",
|
||||
"Docs": "Docs",
|
||||
"Docs Logo": "Docs logo",
|
||||
"Back to homepage": "Terug naar Docs homepage",
|
||||
"Docs is already available, log in to use it now.": "Docs is beschikbaar, log in om het te gebruiken.",
|
||||
"Docs makes real-time collaboration simple. Invite collaborators - public officials or external partners - with one click to see their changes live, while maintaining precise access control for data security.": "Docs maakt real-time samenwerking eenvoudig. Nodig medewerkers - ambtenaren of externe partners - uit met één klik om hun veranderingen live te zien, terwijl de toegangscontrole voor de gegevensbeveiliging wordt gehandhaafd.",
|
||||
"Docs offers an intuitive writing experience. Its minimalist interface favors content over layout, while offering the essentials: media import, offline mode and keyboard shortcuts for greater efficiency.": "Docs biedt een intuïtieve schrijfervaring. De minimalistische interface geeft voorrang aan de inhoud boven de lay-out, terwijl essentiële zaken worden aangeboden: importeren van media, offline-modus en sneltoetsen voor grotere efficiëntie.",
|
||||
@@ -1020,7 +1065,6 @@
|
||||
"Docs: Your new companion to collaborate on documents efficiently, intuitively, and securely.": "Docs: Je nieuwe metgezel om efficiënt, intuïtief en veilig samen te werken aan documenten.",
|
||||
"Document accessible to any connected person": "Document is toegankelijk voor ieder verbonden persoon",
|
||||
"Document owner": "Document eigenaar",
|
||||
"Document sections": "Document secties",
|
||||
"Docx": "Docx",
|
||||
"Download": "Download",
|
||||
"Download anyway": "Download alsnog",
|
||||
@@ -1061,7 +1105,6 @@
|
||||
"Modal confirmation to download the attachment": "Venster bevestiging om bijlage te downloaden",
|
||||
"Modal confirmation to restore the version": "Bevestiging modal om de versie te herstellen",
|
||||
"More docs": "Meer documenten",
|
||||
"More options": "Meer opties",
|
||||
"My docs": "Mijn documenten",
|
||||
"Name": "Naam",
|
||||
"New doc": "Nieuw document",
|
||||
@@ -1074,8 +1117,6 @@
|
||||
"Offline ?!": "Offline ?!",
|
||||
"Only invited people can access": "Alleen uitgenodigde gebruikers hebben toegang",
|
||||
"Open Source": "Open Source",
|
||||
"Open actions menu for document: {{title}}": "Open actiemenu voor document: {{title}}",
|
||||
"Open the menu of actions for the document: {{title}}": "Open het menu van acties voor het document: {{title}}",
|
||||
"Open the document options": "Open document opties",
|
||||
"Open the header menu": "Open het hoofdmenu",
|
||||
"Organize": "Organiseer",
|
||||
@@ -1098,7 +1139,6 @@
|
||||
"Rephrase": "Herschrijf",
|
||||
"Restore": "Herstel",
|
||||
"Search": "Zoeken",
|
||||
"Search docs": "Documenten zoeken",
|
||||
"Search modal": "Zoek modal",
|
||||
"Search user result": "Zoek resultaat",
|
||||
"Select a document": "Selecteer een document",
|
||||
@@ -1131,15 +1171,10 @@
|
||||
"Type the name of a document": "Vul de naam van een document in",
|
||||
"Unpin": "Losmaken",
|
||||
"Untitled document": "Naamloos document",
|
||||
"Updated": "Bijgewerkt",
|
||||
"Updated at": "Geüpdate op",
|
||||
"Use as prompt": "Gebruik als prompt",
|
||||
"Version history": "Versie historie",
|
||||
"Version restored successfully": "Versie teruggezet",
|
||||
"Visibility": "Zichtbaarheid",
|
||||
"Visibility mode": "Zichtbaarheid modus",
|
||||
"Document visibility": "Document zichtbaarheid",
|
||||
"Document access mode": "Document toegangsmodus",
|
||||
"Warning": "Waarschuwing",
|
||||
"Write": "Schrijf",
|
||||
"You are the sole owner of this group, make another member the group owner before you can change your own role or be removed from your document.": "U bent de enige eigenaar van deze groep, maak een ander lid de groepseigenaar voordat u uw eigen rol kunt wijzigen of kan worden verwijderd van het document.",
|
||||
@@ -1151,6 +1186,246 @@
|
||||
}
|
||||
},
|
||||
"pt": { "translation": {} },
|
||||
"ru": {
|
||||
"translation": {
|
||||
"\"{{email}}\" is already invited to the document.": "\"{{email}}\" уже имеет приглашение для этого документа.",
|
||||
"\"{{email}}\" is already member of the document.": "\"{{email}}\" уже имеет доступ к документу.",
|
||||
"A new way to organize knowledge.": "Новый способ организации знаний.",
|
||||
"AI Actions": "Действия ИИ",
|
||||
"AI seems busy! Please try again.": "ИИ, кажется, занят! Пожалуйста, попробуйте ещё раз.",
|
||||
"Access Denied - Error 403": "Доступ запрещён - ошибка 403",
|
||||
"Access Requests": "Запросы доступа",
|
||||
"Access request sent successfully.": "Запрос доступа успешно отправлен.",
|
||||
"Accessible to anyone": "Доступно всем",
|
||||
"Accessible to authenticated users": "Доступно для авторизованных пользователей",
|
||||
"Add": "Добавить",
|
||||
"Add a callout block": "Добавить блок выноски",
|
||||
"Add a horizontal line": "Добавить горизонтальную линию",
|
||||
"Administrator": "Администратор",
|
||||
"All docs": "Все документы",
|
||||
"An uncompromising writing experience.": "Бескомпромиссный опыт написания.",
|
||||
"Analyzing file...": "Анализ файла...",
|
||||
"Anonymous": "Аноним",
|
||||
"Anyone with the link can edit the document": "Любой, у кого есть ссылка, может редактировать документ",
|
||||
"Anyone with the link can edit the document if they are logged in": "Любой, у кого есть ссылка, может редактировать документ, если он авторизован",
|
||||
"Anyone with the link can see the document": "Любой, у кого есть ссылка, может просмотреть документ",
|
||||
"Anyone with the link can view the document if they are logged in": "Любой, у кого есть ссылка, может просмотреть документ, если он авторизовался",
|
||||
"Approve": "Одобрить",
|
||||
"As this is a sub-document, please request access to the parent document to enable these features.": "Так как это вложенный документ, пожалуйста, запросите доступ к родительскому документу, чтобы включить эти функции.",
|
||||
"Available soon": "Скоро будет доступно",
|
||||
"Back to homepage": "Вернуться на главную",
|
||||
"Banner image": "Изображение в шапке",
|
||||
"Beautify": "Улучшить",
|
||||
"By moving this document to <strong>{{targetDocumentTitle}}</strong>, it will lose its current access rights and inherit the permissions of that document. <strong>This access change cannot be undone.</strong>": "При перемещении документа в <strong>{{targetDocumentTitle}}</strong>, он потеряет свои текущие права доступа и наследует права доступа к этому документу. <strong>Это изменение не может быть отменено.</strong>",
|
||||
"Callout": "Выноска",
|
||||
"Can't load this page, please check your internet connection.": "Не удаётся загрузить эту страницу. Пожалуйста, проверьте подключение к Интернету.",
|
||||
"Cancel": "Отмена",
|
||||
"Close the modal": "Закрыть это окно",
|
||||
"Collaborate": "Совместный доступ",
|
||||
"Collaborate and write in real time, without layout constraints.": "Совместная работа и сохранение в реальном времени, без ограничений.",
|
||||
"Collaborative writing, Simplified.": "Простой совместный доступ к документам.",
|
||||
"Confirm": "Подтвердить",
|
||||
"Confirm deletion": "Подтвердите удаление",
|
||||
"Confirmation button": "Кнопка подтверждения",
|
||||
"Connected": "Подключено",
|
||||
"Content modal to delete document": "Подтверждение удаления документа",
|
||||
"Content modal to explain why the user cannot edit": "Пояснение, почему пользователь не может редактировать документ",
|
||||
"Content modal to export the document": "Подтверждение экспорта документа",
|
||||
"Convert Markdown": "Преобразовать разметку",
|
||||
"Copied to clipboard": "Скопировано в буфер обмена",
|
||||
"Copy as {{format}}": "Копировать как {{format}}",
|
||||
"Copy link": "Копировать ссылку",
|
||||
"Correct": "Правильно",
|
||||
"Create a new sub-doc": "Создать новый вложенный документ",
|
||||
"Current doc": "Текущий документ",
|
||||
"Delete": "Удалить",
|
||||
"Delete a doc": "Удалить документ",
|
||||
"Delete document": "Удалить документ",
|
||||
"Divider": "Разделитель",
|
||||
"Doc visibility card": "Карта видимости документа",
|
||||
"Docs": "Docs",
|
||||
"Docs Logo": "Логотип Docs",
|
||||
"Docs is already available, log in to use it now.": "Docs уже доступен, просто войдите в свою учётную запись.",
|
||||
"Docs makes real-time collaboration simple. Invite collaborators - public officials or external partners - with one click to see their changes live, while maintaining precise access control for data security.": "Docs упрощает совместную работу в режиме реального времени. Пригласите соавторов — государственных служащих или внешних партнёров — одним щелчком мыши, чтобы они могли видеть свои изменения в режиме реального времени, при этом сохраняя чёткий контроль доступа для обеспечения безопасности данных.",
|
||||
"Docs offers an intuitive writing experience. Its minimalist interface favors content over layout, while offering the essentials: media import, offline mode and keyboard shortcuts for greater efficiency.": "Docs предлагает интуитивно понятную работу с документом. Благодаря минималистскому интерфейсу вы сможете найти всё необходимое для большей эффективности: импорт медиа, автономный режим и горячие клавиши.",
|
||||
"Docs transforms your documents into knowledge bases thanks to subpages, powerful search and the ability to pin your important documents.": "Docs преобразует ваши документы в базы знаний благодаря вложенным страницам, мощному поиску и возможности закреплять важные документы.",
|
||||
"Docs: Your new companion to collaborate on documents efficiently, intuitively, and securely.": "Docs: Ваш новый помощник для эффективной, интуитивной и безопасной совместной работы над документами.",
|
||||
"Document access mode": "Режим доступа к документу",
|
||||
"Document accessible to any connected person": "Документ доступен всем, кто присоединится",
|
||||
"Document duplicated successfully!": "Документ успешно дублирован!",
|
||||
"Document emoji icon": "Значок эмодзи документа",
|
||||
"Document owner": "Владелец документа",
|
||||
"Document sections": "Разделы документа",
|
||||
"Document visibility": "Видимость документа",
|
||||
"Docx": "Docx",
|
||||
"Download": "Загрузить",
|
||||
"Download anyway": "Всё равно загрузить",
|
||||
"Download your document in a .docx or .pdf format.": "Загрузите свой документ в формате .docx или .pdf.",
|
||||
"Duplicate": "Дублировать",
|
||||
"Editing": "Редактирование",
|
||||
"Editor": "Редактор",
|
||||
"Editor unavailable": "Редактор недоступен",
|
||||
"Emojify": "Сделать эмодзи",
|
||||
"Empty template": "Пустой шаблон",
|
||||
"Error during delete invitation": "Ошибка при удалении приглашения",
|
||||
"Error during update invitation": "Ошибка при обновлении приглашения",
|
||||
"Error while deleting invitation": "Ошибка в процессе удаления приглашения",
|
||||
"Error while removing the request.": "Ошибка при удалении запроса.",
|
||||
"Error while updating the member role.": "Ошибка при обновлении роли участника.",
|
||||
"Export": "Экспорт",
|
||||
"Export the document": "Экспорт документа",
|
||||
"Failed to add the member in the document.": "Не удалось добавить участника для этого документа.",
|
||||
"Failed to copy link": "Не удалось скопировать ссылку",
|
||||
"Failed to copy to clipboard": "Не удалось скопировать в буфер обмена",
|
||||
"Failed to create the invitation for {{email}}.": "Не удалось создать приглашение для {{email}}.",
|
||||
"Failed to duplicate the document...": "Не удалось дублировать документ...",
|
||||
"Flexible export.": "Полезные форматы экспорта.",
|
||||
"Format": "Формат",
|
||||
"Govs ❤️ Open Source.": "Govs ❤️ Open Source.",
|
||||
"History": "История изменений",
|
||||
"Home": "Главная",
|
||||
"I understand": "Я понимаю",
|
||||
"If a member is editing, his works can be lost.": "Если участник сейчас правит документ, его изменения могут быть утеряны.",
|
||||
"If you wish to be able to co-edit in real-time, contact your Information Systems Security Manager about allowing WebSockets.": "Если вы хотите совместно с кем-то редактировать документы в реальном времени, обратитесь к администратору вашей сети по вопросу разрешения использования WebSockets.",
|
||||
"Illustration": "Иллюстрация",
|
||||
"Image 401": "Изображение 401",
|
||||
"Image 403": "Изображение 403",
|
||||
"Insufficient access rights to view the document.": "Недостаточно прав доступа для просмотра документа.",
|
||||
"Invite": "Приглашение",
|
||||
"It is the card information about the document.": "Это информационная карта документа.",
|
||||
"It is the document title": "Это заголовок документа",
|
||||
"It seems that the page you are looking for does not exist or cannot be displayed correctly.": "Похоже, страница, которую вы ищете, не существует или не может быть правильно отображена.",
|
||||
"Language": "Язык",
|
||||
"Last update: {{update}}": "Последнее обновление: {{update}}",
|
||||
"Learn more": "Подробнее",
|
||||
"Link Copied !": "Ссылка скопирована!",
|
||||
"Link a doc": "Ссылка на документ",
|
||||
"Link settings": "Настройки ссылки",
|
||||
"Link this doc to another doc": "Этот документ ссылается на другой",
|
||||
"Links": "Ссылки",
|
||||
"List invitation card": "Карта списка приглашений",
|
||||
"List members card": "Карта списка участников",
|
||||
"List request access card": "Карта списка запроса доступа",
|
||||
"List search user result card": "Карта списка результатов поиска пользователей",
|
||||
"Load more": "Загрузить ещё",
|
||||
"Log in to access the document.": "Войдите, чтобы получить доступ к документу.",
|
||||
"Login": "Войти",
|
||||
"Logo": "Логотип",
|
||||
"Logout": "Выйти",
|
||||
"Modal confirmation to download the attachment": "Подтверждение загрузки вложения",
|
||||
"Modal confirmation to restore the version": "Подтверждение восстановления версии",
|
||||
"More docs": "Больше документов",
|
||||
"More options": "Больше параметров",
|
||||
"Move": "Переместить",
|
||||
"Move document": "Переместить документ",
|
||||
"Move to my docs": "Переместить в мои документы",
|
||||
"My docs": "Мои документы",
|
||||
"Name": "Имя",
|
||||
"New doc": "Новый документ",
|
||||
"New sub-doc": "Новый вложенный документ",
|
||||
"No active search": "Нет активного поиска",
|
||||
"No document found": "Документы не найдены",
|
||||
"No documents found": "Документы не найдены",
|
||||
"No text selected": "Текст не выбран",
|
||||
"No versions": "Нет версий",
|
||||
"OK": "ОК",
|
||||
"Offline ?!": "Не в сети?!",
|
||||
"Only invited people can access": "Имеют доступ только приглашенные люди",
|
||||
"Open Source": "Open Source",
|
||||
"Open the document options": "Открыть параметры документа",
|
||||
"Open the header menu": "Открыть меню заголовка",
|
||||
"Open the menu of actions for the document: {{title}}": "Открыть меню действий для документа: {{title}}",
|
||||
"Organize": "Организация данных",
|
||||
"Others are editing this document. Unfortunately your network blocks WebSockets, the technology enabling real-time co-editing.": "Другие пользователи редактируют этот документ. К сожалению, ваша сеть блокирует WebSockets, технологию, позволяющую совместное редактирование в реальном времени.",
|
||||
"Others are editing. Your network prevent changes.": "Другие участники редактируют этот документ. Ваша сеть не позволяет вам присоединиться.",
|
||||
"Owner": "Владелец",
|
||||
"PDF": "PDF",
|
||||
"Page Not Found - Error 404": "Страница не найдена - ошибка 404",
|
||||
"Pending invitations": "Ожидающие приглашения",
|
||||
"People with access via the parent document": "Люди, имеющие доступ через родительский документ",
|
||||
"Pin": "Прикрепить",
|
||||
"Pin document icon": "Прикрепить значок",
|
||||
"Pinned documents": "Закреплённые документы",
|
||||
"Please download it only if it comes from a trusted source.": "Пожалуйста, загружайте вложения только если они взяты из надёжного источника.",
|
||||
"Private": "Личное",
|
||||
"Proconnect Login": "Войти через Proconnect",
|
||||
"Public": "Публичное",
|
||||
"Public document": "Общедоступный документ",
|
||||
"Quick search input": "Быстрый поиск",
|
||||
"Reader": "Читатель",
|
||||
"Reading": "Чтение",
|
||||
"Remove": "Удалить",
|
||||
"Remove access": "Отменить доступ",
|
||||
"Rename": "Переименовать",
|
||||
"Rephrase": "Переформулировать",
|
||||
"Request access": "Запрос доступа",
|
||||
"Reset": "Сброс",
|
||||
"Restore": "Восстановить",
|
||||
"Search": "Поиск",
|
||||
"Search by title": "Поиск по названию",
|
||||
"Search docs": "Поиск документов",
|
||||
"Search modal": "Поиск",
|
||||
"Search user result": "Результат поиска пользователя",
|
||||
"Select a doc": "Выберите документ",
|
||||
"Select a document": "Выберите документ",
|
||||
"Select a version on the right to restore": "Выберите версию для восстановления справа",
|
||||
"Select language": "Выберите язык",
|
||||
"Share": "Поделиться",
|
||||
"Share modal": "Поделиться документом",
|
||||
"Share the document": "Поделиться документом",
|
||||
"Share with {{count}} users_many": "Поделились с {{count}} пользователями",
|
||||
"Share with {{count}} users_one": "Поделились с пользователями: {{count}}",
|
||||
"Share with {{count}} users_other": "Поделились с {{count}} пользователями",
|
||||
"Shared with me": "Доступные мне",
|
||||
"Shared with {{count}} users_many": "Поделились с пользователями: {{count}}",
|
||||
"Shared with {{count}} users_one": "Поделились с пользователями: {{count}}",
|
||||
"Shared with {{count}} users_other": "Поделились с пользователями: {{count}}",
|
||||
"Show more": "Показать ещё",
|
||||
"Simple and secure collaboration.": "Простое и безопасное сотрудничество.",
|
||||
"Simple document icon": "Простой значок документа",
|
||||
"Something bad happens, please retry.": "Что-то пошло не так, повторите попытку.",
|
||||
"Start Writing": "Начать творить",
|
||||
"Summarize": "Обобщить",
|
||||
"Summary": "Сводка",
|
||||
"Template": "Шаблон",
|
||||
"The antivirus has detected an anomaly in your file.": "Антивирус обнаружил что-то странное в вашем файле.",
|
||||
"The document has been deleted.": "Документ удалён.",
|
||||
"The document visibility has been updated.": "Видимость документа обновлена.",
|
||||
"The export failed": "Ошибка при экспорте",
|
||||
"The link sharing rules differ from the parent document": "Правила обмена ссылками отличаются от правил родительского документа",
|
||||
"This document and <strong>any sub-documents</strong> will be permanently deleted. This action is irreversible.": "Этот документ и <strong>все вложенные в него документы</strong> будут окончательно удалены. Это действие необратимо.",
|
||||
"This file is flagged as unsafe.": "Этот файл помечен как небезопасный.",
|
||||
"This means you can't edit until others leave.": "Это означает, что вы не можете редактировать, пока другие не закончит работу с документом.",
|
||||
"This user has access inherited from a parent page.": "У этого пользователя есть доступ, унаследованный от родительской страницы.",
|
||||
"To facilitate the circulation of documents, Docs allows you to export your content to the most common formats: PDF, Word or OpenDocument.": "Для облегчения документооборота Docs позволяет экспортировать ваши документы в наиболее распространенные форматы: PDF, Word или OpenDocument.",
|
||||
"Too many requests. Please wait 60 seconds.": "Слишком много запросов. Пожалуйста, подождите 60 секунд.",
|
||||
"Type a name or email": "Введите имя или e-mail",
|
||||
"Type the name of a document": "Введите название документа",
|
||||
"Unnamed document": "Безымянный документ",
|
||||
"Unpin": "Открепить",
|
||||
"Untitled document": "Безымянный документ",
|
||||
"Updated": "Обновлено",
|
||||
"Updated at": "Обновлено",
|
||||
"Use as prompt": "Использовать как запрос",
|
||||
"Version history": "История версий",
|
||||
"Version restored successfully": "Версия успешно восстановлена",
|
||||
"Warning": "Внимание",
|
||||
"Why you can't edit the document?": "Почему вы не можете редактировать документ?",
|
||||
"Write": "Пишите",
|
||||
"You are the sole owner of this group, make another member the group owner before you can change your own role or be removed from your document.": "Вы единственный владелец этой группы. Прежде чем вы измените свою собственную роль или потеряете доступ к документу, назначьте другого владельца группы.",
|
||||
"You can view this document but need additional access to see its members or modify settings.": "Вы можете просмотреть этот документ, но для получения списка участников или изменения настроек требуются дополнительные разрешения.",
|
||||
"You cannot restrict access to a subpage relative to its parent page.": "Нельзя ограничить доступ ко вложенной странице относительно родительской страницы.",
|
||||
"You must be at least the editor of the target document": "Вы должны иметь хотя бы роль редактора этого документа",
|
||||
"You must be the owner to move the document": "Для перемещения документа вы должны быть его владельцем",
|
||||
"You're currently viewing a sub-document. To gain access, please request permission from the main document.": "Сейчас вы просматриваете вложенный документ. Чтобы получить доступ, запросите разрешение для основного документа.",
|
||||
"Your access request for this document is pending.": "Ваш запрос доступа к этому документу ожидает одобрения владельцем.",
|
||||
"Your current document will revert to this version.": "Ваш текущий документ вернётся к этой версии.",
|
||||
"Your {{format}} was downloaded succesfully": "Ваш {{format}} успешно загружен",
|
||||
"home-content-open-source-part1": "home-content-open-source-part1",
|
||||
"home-content-open-source-part2": "home-content-open-source-part2",
|
||||
"home-content-open-source-part3": "home-content-open-source-part3"
|
||||
}
|
||||
},
|
||||
"sl": {
|
||||
"translation": {
|
||||
"Load more": "Naloži več",
|
||||
@@ -1262,6 +1537,246 @@
|
||||
"Your {{format}} was downloaded succesfully": "{{format}} indirildi"
|
||||
}
|
||||
},
|
||||
"uk": {
|
||||
"translation": {
|
||||
"\"{{email}}\" is already invited to the document.": "\"{{email}}\" вже запрошено до документа.",
|
||||
"\"{{email}}\" is already member of the document.": "\"{{email}}\" вже є учасником для цього документа.",
|
||||
"A new way to organize knowledge.": "Новий спосіб організації знань.",
|
||||
"AI Actions": "Дії ШІ",
|
||||
"AI seems busy! Please try again.": "ШІ здається зайнятим! Спробуйте ще раз.",
|
||||
"Access Denied - Error 403": "Доступ заборонений - Помилка 403",
|
||||
"Access Requests": "Запити на доступ",
|
||||
"Access request sent successfully.": "Запит на доступ успішно відправлений.",
|
||||
"Accessible to anyone": "Доступний будь-кому",
|
||||
"Accessible to authenticated users": "Доступно для тих, хто увійшов до системи",
|
||||
"Add": "Додати",
|
||||
"Add a callout block": "Додати блок винесення",
|
||||
"Add a horizontal line": "Додати горизонтальну лінію",
|
||||
"Administrator": "Адміністратор",
|
||||
"All docs": "Всі документи",
|
||||
"An uncompromising writing experience.": "Безкомпромісне задоволення від процесу письма.",
|
||||
"Analyzing file...": "Аналіз файлу...",
|
||||
"Anonymous": "Анонім",
|
||||
"Anyone with the link can edit the document": "Будь-хто з посиланням може редагувати документ",
|
||||
"Anyone with the link can edit the document if they are logged in": "Будь-хто з посиланням може редагувати документ, якщо він увійшов в систему",
|
||||
"Anyone with the link can see the document": "Будь-хто з посиланням може переглянути документ",
|
||||
"Anyone with the link can view the document if they are logged in": "Кожен, хто має посилання, може переглядати документ якщо він увійшов в систему",
|
||||
"Approve": "Затвердити",
|
||||
"As this is a sub-document, please request access to the parent document to enable these features.": "Оскільки це вкладений документ, будь ласка, запитайте доступ до батьківського документа, щоб увімкнути ці функції.",
|
||||
"Available soon": "Незабаром буде доступно",
|
||||
"Back to homepage": "Повернутися на головну",
|
||||
"Banner image": "Зображення банеру",
|
||||
"Beautify": "Прикрасити",
|
||||
"By moving this document to <strong>{{targetDocumentTitle}}</strong>, it will lose its current access rights and inherit the permissions of that document. <strong>This access change cannot be undone.</strong>": "Якщо перенести цей документ до <strong>{{targetDocumentTitle}}</strong>, він втратить свої поточні права доступу та успадкує дозволи цього документу. <strong>Цю зміну неможливо скасувати.</strong>",
|
||||
"Callout": "Винесення",
|
||||
"Can't load this page, please check your internet connection.": "Не вдалося завантажити цю сторінку, будь ласка, перевірте підключення до Інтернету.",
|
||||
"Cancel": "Скасувати",
|
||||
"Close the modal": "Закрити це вікно",
|
||||
"Collaborate": "Спільна робота",
|
||||
"Collaborate and write in real time, without layout constraints.": "Сумісна робота і збереження результатів у реальному часі, без обмеження макета.",
|
||||
"Collaborative writing, Simplified.": "Простий спільний доступ до документів.",
|
||||
"Confirm": "Підтвердити",
|
||||
"Confirm deletion": "Підтвердження видалення",
|
||||
"Confirmation button": "Кнопка підтвердження",
|
||||
"Connected": "Під'єднано",
|
||||
"Content modal to delete document": "Підтвердження видалення документа",
|
||||
"Content modal to explain why the user cannot edit": "Пояснення, чому користувач не може редагувати",
|
||||
"Content modal to export the document": "Підтвердження експорту документа",
|
||||
"Convert Markdown": "Перетворити розмітку",
|
||||
"Copied to clipboard": "Скопійовано до буфера обміну",
|
||||
"Copy as {{format}}": "Скопіювати як {{format}}",
|
||||
"Copy link": "Скопіювати посилання",
|
||||
"Correct": "Правильно",
|
||||
"Create a new sub-doc": "Створити новий вкладений документ",
|
||||
"Current doc": "Поточний документ",
|
||||
"Delete": "Видалити",
|
||||
"Delete a doc": "Видалити документ",
|
||||
"Delete document": "Видалити документ",
|
||||
"Divider": "Роздільник",
|
||||
"Doc visibility card": "Картка видимості документу",
|
||||
"Docs": "Docs",
|
||||
"Docs Logo": "Логотип Docs",
|
||||
"Docs is already available, log in to use it now.": "Docs вже доступний, увійдіть до нього зараз.",
|
||||
"Docs makes real-time collaboration simple. Invite collaborators - public officials or external partners - with one click to see their changes live, while maintaining precise access control for data security.": "Docs спрощує співпрацю в реальному часі. Запросіть співавторів - державних службовців або зовнішніх партнерів - одним натисканням, щоб побачити зміни у документі, що вони роблять, зберігаючи точний контроль доступу для безпеки даних.",
|
||||
"Docs offers an intuitive writing experience. Its minimalist interface favors content over layout, while offering the essentials: media import, offline mode and keyboard shortcuts for greater efficiency.": "Docs пропонує інтуїтивно зрозумілий процес написання текстів. Його мінімалістичний інтерфейс надає перевагу вмісту над оформленням, пропонуючи при цьому найнеобхідніші функції: імпорт медіафайлів, офлайн-режим та комбінації клавіш для більшої ефективності.",
|
||||
"Docs transforms your documents into knowledge bases thanks to subpages, powerful search and the ability to pin your important documents.": "Docs перетворює ваші документи у бази знань завдяки підсторінкам, потужному пошуку та можливості закріпити ваші важливі документи.",
|
||||
"Docs: Your new companion to collaborate on documents efficiently, intuitively, and securely.": "Docs: ваш новий супутник для ефективної співпраці з документами, інтуїтивно та надійно.",
|
||||
"Document access mode": "Режим доступу до документа",
|
||||
"Document accessible to any connected person": "Документ, доступний для будь-якої особи, що приєдналася",
|
||||
"Document duplicated successfully!": "Документ успішно продубльовано!",
|
||||
"Document emoji icon": "Піктограма emoji документа",
|
||||
"Document owner": "Власник документа",
|
||||
"Document sections": "Розділи документу",
|
||||
"Document visibility": "Видимість документа",
|
||||
"Docx": "Docx",
|
||||
"Download": "Завантажити",
|
||||
"Download anyway": "Все одно завантажити",
|
||||
"Download your document in a .docx or .pdf format.": "Завантажте ваш документ у форматі .docx або .pdf.",
|
||||
"Duplicate": "Дублювати",
|
||||
"Editing": "Редагування",
|
||||
"Editor": "Редактор",
|
||||
"Editor unavailable": "Редактор недоступний",
|
||||
"Emojify": "Зробити емодзі",
|
||||
"Empty template": "Порожній шаблон",
|
||||
"Error during delete invitation": "Під час видалення запрошення сталася помилка",
|
||||
"Error during update invitation": "Помилка при оновленні запрошення",
|
||||
"Error while deleting invitation": "Помилка при видаленні запрошення",
|
||||
"Error while removing the request.": "Помилка при видаленні запиту.",
|
||||
"Error while updating the member role.": "Помилка при оновленні ролі учасника.",
|
||||
"Export": "Експортувати",
|
||||
"Export the document": "Експортувати документ",
|
||||
"Failed to add the member in the document.": "Не вдалося додати учасника до документа.",
|
||||
"Failed to copy link": "Не вдалося скопіювати посилання",
|
||||
"Failed to copy to clipboard": "Не вдалося скопіювати до буфера обміну",
|
||||
"Failed to create the invitation for {{email}}.": "Не вдалося створити запрошення для {{email}}.",
|
||||
"Failed to duplicate the document...": "Не вдалося дублювати документ...",
|
||||
"Flexible export.": "Гнучкий експорт.",
|
||||
"Format": "Формат",
|
||||
"Govs ❤️ Open Source.": "Govs ❤️ Open Source.",
|
||||
"History": "Історія",
|
||||
"Home": "Головна",
|
||||
"I understand": "Я розумію",
|
||||
"If a member is editing, his works can be lost.": "Якщо інший учасник редагує цей документ, зроблені ним зміни можуть бути втрачені.",
|
||||
"If you wish to be able to co-edit in real-time, contact your Information Systems Security Manager about allowing WebSockets.": "Якщо ви хочете редагувати документи в режимі реального часу, зверніться до вашого інформаційного менеджера безпеки щодо використання WebSockets.",
|
||||
"Illustration": "Ілюстрація",
|
||||
"Image 401": "Зображення 401",
|
||||
"Image 403": "Зображення 403",
|
||||
"Insufficient access rights to view the document.": "Недостатньо прав для перегляду документа.",
|
||||
"Invite": "Запрошення",
|
||||
"It is the card information about the document.": "Це інформаційна картка документу.",
|
||||
"It is the document title": "Це заголовок документа",
|
||||
"It seems that the page you are looking for does not exist or cannot be displayed correctly.": "Схоже, що сторінка, яку ви шукаєте, не існує або не може бути показаною правильно.",
|
||||
"Language": "Мова",
|
||||
"Last update: {{update}}": "Останнє оновлення: {{update}}",
|
||||
"Learn more": "Докладніше",
|
||||
"Link Copied !": "Посилання скопійовано!",
|
||||
"Link a doc": "Посилання на документ",
|
||||
"Link settings": "Параметри посилань",
|
||||
"Link this doc to another doc": "Цей документ має посилання на інший",
|
||||
"Links": "Посилання",
|
||||
"List invitation card": "Карта списку запрошень",
|
||||
"List members card": "Карта списку учасників",
|
||||
"List request access card": "Картка списку запитів доступу",
|
||||
"List search user result card": "Картка списку результатів пошуку користувача",
|
||||
"Load more": "Завантажити ще",
|
||||
"Log in to access the document.": "Увійдіть, щоб отримати доступ до документа.",
|
||||
"Login": "Увійти",
|
||||
"Logo": "Логотип",
|
||||
"Logout": "Вийти",
|
||||
"Modal confirmation to download the attachment": "Підтвердження завантаження вкладень",
|
||||
"Modal confirmation to restore the version": "Підтвердження щодо відновлення версії",
|
||||
"More docs": "Більше документів",
|
||||
"More options": "Більше параметрів",
|
||||
"Move": "Переміщення",
|
||||
"Move document": "Переміщення документа",
|
||||
"Move to my docs": "Перемістити до моїх документів",
|
||||
"My docs": "Мої документи",
|
||||
"Name": "Ім’я",
|
||||
"New doc": "Новий документ",
|
||||
"New sub-doc": "Новий вкладений документ",
|
||||
"No active search": "Нічого не знайдено",
|
||||
"No document found": "Документи не знайдені",
|
||||
"No documents found": "Документів не знайдено",
|
||||
"No text selected": "Текст не вибрано",
|
||||
"No versions": "Немає версій",
|
||||
"OK": "OK",
|
||||
"Offline ?!": "Не в мережі?!",
|
||||
"Only invited people can access": "Лише запрошені люди можуть мати доступ",
|
||||
"Open Source": "Open Source",
|
||||
"Open the document options": "Відкрити параметри документа",
|
||||
"Open the header menu": "Відкрити меню заголовка",
|
||||
"Open the menu of actions for the document: {{title}}": "Відкрити меню дій для документа: {{title}}",
|
||||
"Organize": "Організуйте",
|
||||
"Others are editing this document. Unfortunately your network blocks WebSockets, the technology enabling real-time co-editing.": "Інші учасники редагують цей документ. На жаль, ваша мережа блокує WebSockets, технологію, що дозволяє редагувати в реальному часі.",
|
||||
"Others are editing. Your network prevent changes.": "Інші учасники редагують документ. Ваша мережа не дозволяє вам вносити зміни.",
|
||||
"Owner": "Власник",
|
||||
"PDF": "PDF",
|
||||
"Page Not Found - Error 404": "Сторінку не знайдено - Помилка 404",
|
||||
"Pending invitations": "Запрошення в очікуванні",
|
||||
"People with access via the parent document": "Люди з доступом через батьківський документ",
|
||||
"Pin": "Прикріпити",
|
||||
"Pin document icon": "Приєднати піктограму документа",
|
||||
"Pinned documents": "Закріплені документи",
|
||||
"Please download it only if it comes from a trusted source.": "Будь ласка, завантажте його, якщо він із надійного джерела.",
|
||||
"Private": "Приватно",
|
||||
"Proconnect Login": "Увійти через Proconnect",
|
||||
"Public": "Публічне",
|
||||
"Public document": "Публічний документ",
|
||||
"Quick search input": "Швидкий пошук",
|
||||
"Reader": "Читач",
|
||||
"Reading": "Читання",
|
||||
"Remove": "Видалити",
|
||||
"Remove access": "Вилучити доступ",
|
||||
"Rename": "Перейменувати",
|
||||
"Rephrase": "Перефразувати",
|
||||
"Request access": "Запит доступу",
|
||||
"Reset": "Скинути",
|
||||
"Restore": "Відновити",
|
||||
"Search": "Пошук",
|
||||
"Search by title": "Пошук за назвою",
|
||||
"Search docs": "Пошук документів",
|
||||
"Search modal": "Підтвердження пошуку",
|
||||
"Search user result": "Результат пошуку користувача",
|
||||
"Select a doc": "Оберіть документ",
|
||||
"Select a document": "Оберіть документ",
|
||||
"Select a version on the right to restore": "Виберіть версію для відновлення праворуч",
|
||||
"Select language": "Оберіть мову",
|
||||
"Share": "Поділитися",
|
||||
"Share modal": "Підтвердження",
|
||||
"Share the document": "Поділитися документом",
|
||||
"Share with {{count}} users_many": "Поділилися з користувачами: {{count}}",
|
||||
"Share with {{count}} users_one": "Поділилися з користувачами: {{count}}",
|
||||
"Share with {{count}} users_other": "Поділилися з користувачами: {{count}}",
|
||||
"Shared with me": "Відкриті для мене",
|
||||
"Shared with {{count}} users_many": "Поділилися з користувачами: {{count}}",
|
||||
"Shared with {{count}} users_one": "Поділилися з користувачами: {{count}}",
|
||||
"Shared with {{count}} users_other": "Поділилися з користувачами: {{count}}",
|
||||
"Show more": "Показати більше",
|
||||
"Simple and secure collaboration.": "Проста та безпечна співпраця.",
|
||||
"Simple document icon": "Значок простого документа",
|
||||
"Something bad happens, please retry.": "Сталася помилка, спробуйте ще раз.",
|
||||
"Start Writing": "Почати творити",
|
||||
"Summarize": "Підсумувати",
|
||||
"Summary": "Зведення",
|
||||
"Template": "Шаблон",
|
||||
"The antivirus has detected an anomaly in your file.": "Антивірус виявив аномалію у вашому файлі.",
|
||||
"The document has been deleted.": "Документ був видалений.",
|
||||
"The document visibility has been updated.": "Видимість документа оновлено.",
|
||||
"The export failed": "Не вдалося виконати експорт",
|
||||
"The link sharing rules differ from the parent document": "Правила обміну посиланнями відрізняються від батьківського документа",
|
||||
"This document and <strong>any sub-documents</strong> will be permanently deleted. This action is irreversible.": "Цей документ та <strong>будь-які вкладені документи</strong> будуть остаточно видалені. Ця дія є незворотною.",
|
||||
"This file is flagged as unsafe.": "Цей файл позначено як небезпечний.",
|
||||
"This means you can't edit until others leave.": "Це означає, що ви не можете редагувати документ, поки інші його не залишать.",
|
||||
"This user has access inherited from a parent page.": "Цей користувач успадкував доступ на батьківській сторінці.",
|
||||
"To facilitate the circulation of documents, Docs allows you to export your content to the most common formats: PDF, Word or OpenDocument.": "Для полегшення обміну документами Docs дозволяє експортувати вміст документів у найпоширеніші формати: PDF, Word або OpenDocument.",
|
||||
"Too many requests. Please wait 60 seconds.": "Занадто багато запитів. Будь ласка, зачекайте 60 секунд.",
|
||||
"Type a name or email": "Введіть ім'я або електронну адресу",
|
||||
"Type the name of a document": "Введіть назву документа",
|
||||
"Unnamed document": "Документ без назви",
|
||||
"Unpin": "Відкріпити",
|
||||
"Untitled document": "Документ без назви",
|
||||
"Updated": "Оновлено",
|
||||
"Updated at": "Оновлено",
|
||||
"Use as prompt": "Використати як запит",
|
||||
"Version history": "Історія версій",
|
||||
"Version restored successfully": "Версія успішно відновлена",
|
||||
"Warning": "Попередження",
|
||||
"Why you can't edit the document?": "Чому ви не можете редагувати документ?",
|
||||
"Write": "Написання",
|
||||
"You are the sole owner of this group, make another member the group owner before you can change your own role or be removed from your document.": "Ви єдиний власник цієї групи, призначте іншого учасника її власником. Інакше ви не зможете змінити власну роль або вийти з команди редакторів документу.",
|
||||
"You can view this document but need additional access to see its members or modify settings.": "Ви можете переглянути цей документ, але для перегляду його учасників або зміни налаштувань потрібні додаткові дозволи.",
|
||||
"You cannot restrict access to a subpage relative to its parent page.": "Не можна обмежити доступ до підсторінки відносно її батьківської сторінки.",
|
||||
"You must be at least the editor of the target document": "Ви повинні бути принаймні редактором цільового документа",
|
||||
"You must be the owner to move the document": "Для переміщення документа ви повинні бути його власником",
|
||||
"You're currently viewing a sub-document. To gain access, please request permission from the main document.": "Зараз ви переглядаєте вкладений документ. Щоб отримати доступ, будь ласка, запитайте дозвіл від головного документа.",
|
||||
"Your access request for this document is pending.": "Ваш запит на доступ до цього документа знаходиться в стані очікування.",
|
||||
"Your current document will revert to this version.": "Поточний документ повернеться до цієї версії.",
|
||||
"Your {{format}} was downloaded succesfully": "Ваш {{format}} успішно завантажено",
|
||||
"home-content-open-source-part1": "home-content-open-source-part1",
|
||||
"home-content-open-source-part2": "home-content-open-source-part2",
|
||||
"home-content-open-source-part3": "home-content-open-source-part3"
|
||||
}
|
||||
},
|
||||
"zh": {
|
||||
"translation": {
|
||||
"\"{{email}}\" is already invited to the document.": "{{email}}已经被邀请过。",
|
||||
@@ -1425,10 +1940,6 @@
|
||||
"Use as prompt": "用作提示",
|
||||
"Version history": "历史版本",
|
||||
"Version restored successfully": "已成功还原版本",
|
||||
"Visibility": "可见性",
|
||||
"Visibility mode": "可见模式",
|
||||
"Document visibility": "文档可见性",
|
||||
"Document access mode": "文档访问模式",
|
||||
"Warning": "警告",
|
||||
"Write": "写入",
|
||||
"You are the sole owner of this group, make another member the group owner before you can change your own role or be removed from your document.": "您是当前群组唯一所有者,需先指定另一管理员,才能更改自身角色或退出文档。",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user