Compare commits

...

32 Commits

Author SHA1 Message Date
Ephraim Atta-Duncan
47e59734be chore: check it build will pass 2024-11-04 16:40:45 +00:00
David Nguyen
04b1ce1aab fix: missing not found page for deleted documents (#1424) 2024-11-04 22:09:52 +09:00
David Nguyen
885349ad94 fix: missing signing order when using templates (#1425) 2024-11-03 20:17:41 +09:00
David Nguyen
28514ba2e7 fix: duplicate templates (#1434) 2024-11-01 21:29:38 +11:00
Lucas Smith
8aa6d8e602 chore: add translations (#1433) 2024-11-01 13:22:51 +09:00
David Nguyen
378e515843 chore: extract translations 2024-11-01 12:56:07 +09:00
David Nguyen
f42e600e3f chore: update workflow 2024-11-01 12:37:54 +09:00
David Nguyen
88eaec91c9 chore: extract translations 2024-11-01 11:27:09 +09:00
David Nguyen
f199183c78 feat: improve translation coverage (#1427)
Improves translation coverage across the app.
2024-11-01 10:57:32 +11:00
Mythie
0cee07aed3 v1.7.2-rc.3 2024-10-31 15:33:03 +11:00
Mythie
f76f87ff1c fix: use key for expansion on embeds 2024-10-31 15:31:40 +11:00
Mythie
6020336792 v1.7.2-rc.2 2024-10-30 14:37:50 +11:00
Mythie
634b30aa54 fix: signature flickering during embed 2024-10-30 14:36:35 +11:00
David Nguyen
7fc497a642 fix: translation upload token (#1423) 2024-10-29 19:55:49 +09:00
Andre G
e30ceeb038 style: update common.po (#1402)
Update translations
2024-10-28 11:26:12 +09:00
Andre G
872762661a style: Update web.po (#1403)
Update translations
2024-10-28 11:23:08 +09:00
David Nguyen
5fcd8610c9 fix: translate extract command (#1394)
Change how the translate extract command is run on build
2024-10-28 11:21:49 +09:00
Mythie
b8310237e4 v1.7.2-rc.1 2024-10-23 13:28:54 +11:00
Ephraim Duncan
4a6238dc52 chore: show signing order when creating a document from template (#1410)
### Templates without signing order
![CleanShot 2024-10-18 at 01 27
24@2x](https://github.com/user-attachments/assets/222181e4-25a8-409b-aa8b-8452ddd32f6b)


### Template with signing order
![CleanShot 2024-10-18 at 01 26
12@2x](https://github.com/user-attachments/assets/bcee6213-20b5-44d8-90ed-881825f49756)
2024-10-23 10:20:27 +11:00
Ephraim Duncan
6fa5f63b69 fix: trigger webhook when a direct link signer signs a document (#1409) 2024-10-23 09:50:23 +11:00
Lucas Smith
c7564ba8f7 chore: enable spanish (#1417)
Enables the spanish translation of the application:


![image](https://github.com/user-attachments/assets/eacf4800-272e-4458-abcc-4d6c6f3071cf)
2024-10-23 09:01:14 +11:00
Lucas Smith
eafd7c551b feat: add team user management endpoints to api (#1416)
## Description

Adds user management capabilities to our current API. Allows for adding,
removing, listing and updating members of a given team using a valid API
token.

## Related Issue

N/A

## Changes Made

- Added an endpoint for inviting a team member
- Added an endpoint for removing a team member
- Added an endpoint for updating a team member
- Added an endpoint for listing team members

## Testing Performed

Tests were written for this feature request
2024-10-22 22:53:31 +11:00
Lucas Smith
514edf01d3 chore: add translations (#1406) 2024-10-22 14:02:51 +11:00
Ephraim Duncan
1a73c68d07 fix: close direct link dialog when you click on save (#1412) 2024-10-21 15:33:21 +11:00
Catalin Pit
1a9dcadba5 feat: add typed signature (#1357)
Add the ability to insert typed signatures.

Once the signature field is placed on the document, a checkbox appears
in the document editor where the document owner can allow signers to add
typed signatures. Typed signatures are disabled by default.

![CleanShot 2024-09-30 at 14 57
54](https://github.com/user-attachments/assets/c388abb5-bcb1-49d0-aad8-9148c3020420)
2024-10-18 14:25:19 +11:00
Ephraim Duncan
e0c948c2ac feat: add custom font sizes to fields (#1376)
Adds custom font sizes to fields

https://github.com/user-attachments/assets/1473a4d7-8dc6-4ead-acf5-dd78be7782a0
2024-10-16 16:05:41 +11:00
Catalin Pit
0bd2760792 feat: start the work on the API reference (#1392)
`later`

## Description

<!--- Describe the changes introduced by this pull request. -->
<!--- Explain what problem it solves or what feature/fix it adds. -->

## Related Issue

<!--- If this pull request is related to a specific issue, reference it
here using #issue_number. -->
<!--- For example, "Fixes #123" or "Addresses #456". -->

## Changes Made

<!--- Provide a summary of the changes made in this pull request. -->
<!--- Include any relevant technical details or architecture changes.
-->

- Change 1
- Change 2
- ...

## Testing Performed

<!--- Describe the testing that you have performed to validate these
changes. -->
<!--- Include information about test cases, testing environments, and
results. -->

- Tested feature X in scenario Y.
- Ran unit tests for component Z.
- Tested on browsers A, B, and C.
- ...

## Checklist

<!--- Please check the boxes that apply to this pull request. -->
<!--- You can add or remove items as needed. -->

- [ ] I have tested these changes locally and they work as expected.
- [ ] I have added/updated tests that prove the effectiveness of these
changes.
- [ ] I have updated the documentation to reflect these changes, if
applicable.
- [ ] I have followed the project's coding style guidelines.
- [ ] I have addressed the code review feedback from the previous
submission, if applicable.

## Additional Notes

<!--- Provide any additional context or notes for the reviewers. -->
<!--- This might include details about design decisions, potential
concerns, or anything else relevant. -->


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
	- Introduced comprehensive documentation for the Documenso public API.
	- Added detailed guides for the following API endpoints:
		- Uploading documents
		- Generating documents from templates
		- Adding fields to documents
- Included example payloads and response structures for better
understanding.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-10-15 14:05:39 +03:00
Timur Ercan
abc559d923 chore: cal.com customer story article (#1396)
We got cal.com 🚀

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **New Features**
- Introduced a new blog post detailing Cal.com's use of Documenso for
enhancing DPA and BAA processes.
- The blog outlines the challenges and solutions related to compliance
document management.
- Features images and captions to illustrate key points and improve
engagement.

- **Documentation**
- Added insights into Cal.com's journey as an open-source scheduling
solution and their commitment to transparency.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-10-11 16:01:57 +02:00
David Nguyen
9ffdbe9c81 fix: improve lingui configuration (#1388)
## Description

Currently merge conflicts arise due to the compiled JS and PO
translation files.

This PR is a rework on how we handle extracting and compiling
translations to streamline PRs and merging branches.

## Changes Made

- Remove compiled translation files from being committed
- Extract and compile translations only on build
- Extract will still occur when commits land on main to sync and pull
new translations with Crowdin
2024-10-09 14:13:52 +11:00
Ephraim Duncan
2c1a18bafc fix: stacked avatar colors (#1361) 2024-10-09 12:25:56 +11:00
Mythie
a2db5e9642 chore: update changelog 2024-10-09 12:23:38 +11:00
Lucas Smith
4ec9dc78c1 chore: add translations (#1359) 2024-10-09 10:55:21 +11:00
135 changed files with 10520 additions and 1573 deletions

View File

@@ -1,38 +0,0 @@
# Extract and compile translations for all PRs.
name: 'Extract and compile translations'
on:
workflow_call:
pull_request:
branches: ['main']
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
extract_translations:
name: Extract and compile translations
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.ref }}
- uses: ./.github/actions/node-install
- name: Extract and compile translations
run: |
npm run translate:extract
npm run translate:compile
- name: Check and commit any files created
run: |
git config --global user.name 'github-actions'
git config --global user.email 'github-actions@documenso.com'
git add packages/lib/translations
git diff --staged --quiet --exit-code || (git commit -m "chore: extract translations" && git push)

View File

@@ -21,14 +21,12 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.ref }}
token: ${{ secrets.GH_PAT }}
- uses: ./.github/actions/node-install
- name: Extract and compile translations
run: |
npm run translate:extract
npm run translate:compile
- name: Extract translations
run: npm run translate:extract
- name: Check and commit any files created
run: |

View File

@@ -13,9 +13,4 @@ node "$MONOREPO_ROOT/scripts/copy-wellknown.cjs"
git add "$MONOREPO_ROOT/apps/web/public/"
git add "$MONOREPO_ROOT/apps/marketing/public/"
echo "Extract and compile translations"
npm run translate:extract
npm run translate:compile
git add "$MONOREPO_ROOT/packages/lib/translations/"
npx lint-staged

View File

@@ -0,0 +1,507 @@
---
title: API Reference
description: Reference documentation for the Documenso public API.
---
import { Callout, Steps } from 'nextra/components';
# API Reference
The Swagger UI for the API is available at [/api/v1/openapi](https://app.documenso.com/api/v1/openapi). This page provides detailed information about the API endpoints, request and response formats, and authentication requirements.
## Upload a Document
Uploading a document to your Documenso account requires a two-step process.
<Steps>
### Create Document
First, you need to make a `POST` request to the `/api/v1/documents` endpoint, which takes a JSON payload with the following fields:
```json
{
"title": "string",
"externalId": "string",
"recipients": [
{
"name": "string",
"email": "user@example.com",
"role": "SIGNER",
"signingOrder": 0
}
],
"meta": {
"subject": "string",
"message": "string",
"timezone": "Etc/UTC",
"dateFormat": "yyyy-MM-dd hh:mm a",
"redirectUrl": "string",
"signingOrder": "PARALLEL"
},
"authOptions": {
"globalAccessAuth": "ACCOUNT",
"globalActionAuth": "ACCOUNT"
},
"formValues": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
}
}
```
- `title` _(required)_ - This represents the document's title.
- `externalId` - This is an optional field that you can use to store an external identifier for the document. This can be useful for tracking the document in your system.
- `recipients` _(required)_ - This is an array of recipient objects. Each recipient object has the following fields:
- `name` - The name of the recipient.
- `email` - The email address of the recipient.
- `role` - The role of the recipient. See the [available roles](/users/signing-documents#roles).
- `signingOrder` - The order in which the recipient should sign the document. This is an integer value starting from 0.
- `meta` - This object contains additional metadata for the document. It has the following fields:
- `subject` - The subject of the email that will be sent to the recipients.
- `message` - The message of the email that will be sent to the recipients.
- `timezone` - The timezone in which the document should be signed.
- `dateFormat` - The date format that should be used in the document.
- `redirectUrl` - The URL to which the user should be redirected after signing the document.
- `signingOrder` - The signing order for the document. This can be either `SEQUENTIAL` or `PARALLEL`.
- `authOptions` - This object contains authentication options for the document. It has the following fields:
- `globalAccessAuth` - The authentication level required to access the document. This can be either `ACCOUNT` or `null`.
- If the document is set to `ACCOUNT`, all recipients must authenticate with their Documenso account to access it.
- The document can be accessed without a Documenso account if it's set to `null`.
- `globalActionAuth` - The authentication level required to perform actions on the document. This can be `ACCOUNT`, `PASSKEY`, `TWO_FACTOR_AUTH`, or `null`.
- If the document is set to `ACCOUNT`, all recipients must authenticate with their Documenso account to perform actions on the document.
- If it's set to `PASSKEY`, all recipients must have the passkey active to perform actions on the document.
- If it's set to `TWO_FACTOR_AUTH`, all recipients must have the two-factor authentication active to perform actions on the document.
- If it's set to `null`, all the recipients can perform actions on the document without any authentication.
- `formValues` - This object contains additional form values for the document. This property only works with native PDF fields and accepts three types: number, text and boolean.
<Callout type="info">
The `globalActionAuth` property is only available for Enterprise accounts.
</Callout>
Here's an example of the JSON payload for uploading a document:
```json
{
"title": "my-document.pdf",
"externalId": "12345",
"recipients": [
{
"name": "Alex Blake",
"email": "alexblake@email.com",
"role": "SIGNER",
"signingOrder": 1
},
{
"name": "Ash Drew",
"email": "ashdrew@email.com",
"role": "SIGNER",
"signingOrder": 0
}
],
"meta": {
"subject": "Sign the document",
"message": "Hey there, please sign this document.",
"timezone": "Europe/London",
"dateFormat": "Day, Month Year",
"redirectUrl": "https://mysite.com/welcome",
"signingOrder": "SEQUENTIAL"
},
"authOptions": {
"globalAccessAuth": "ACCOUNT",
"globalActionAuth": "PASSKEY"
}
}
```
### Upload to S3
A successful API call to the `/api/v1/documents` endpoint returns a JSON response containing the upload URL, document ID, and recipient information.
The upload URL is a pre-signed S3 URL that you can use to upload the document to the Documenso (or your) S3 bucket. You need to make a `PUT` request to this URL to upload the document.
```json
{
"uploadUrl": "https://<url>/<bucket-name>/<id>/my-document.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=<credentials>&X-Amz-Date=<date>&X-Amz-Expires=3600&X-Amz-Signature=<signature>&X-Amz-SignedHeaders=host&x-id=PutObject",
"documentId": 51,
"recipients": [
{
"recipientId": 11,
"name": "Alex Blake",
"email": "alexblake@email.com",
"token": "<unique-signer-token>",
"role": "SIGNER",
"signingOrder": 1,
"signingUrl": "https://app.documenso.com/sign/<unique-signer-token>"
},
{
"recipientId": 12,
"name": "Ash Drew",
"email": "ashdrew@email.com",
"token": "<unique-signer-token>",
"role": "SIGNER",
"signingOrder": 0,
"signingUrl": "https://app.documenso.com/sign/<unique-signer-token>"
}
]
}
```
When you make the `PUT` request to the pre-signed URL, you need to include the document file you want to upload. The image below shows how to upload a document to the S3 bucket via Postman.
![Upload document to S3](/api-reference/upload-document-to-s3.webp)
Here's an example of how to upload a document using cURL:
```bash
curl --location --request PUT 'https://<url>/<bucket-name>/<id>/my-document.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=<credentials>&X-Amz-Date=<date>&X-Amz-Expires=3600&X-Amz-Signature=<signature>&X-Amz-SignedHeaders=host&x-id=PutObject' \
--form '=@"/Users/my-user/Documents/documenso.pdf"'
```
Once the document is successfully uploaded, you can access it in your Documenso account dashboard. The screenshot below shows the document that was uploaded via the API.
![Uploaded Document](/api-reference/document-uploaded-to-documenso-via-api.webp)
</Steps>
## Generate Document From Template
Documenso allows you to generate documents from templates. This is useful when you have a standard document format you want to reuse.
The API endpoint for generating a document from a template is `/api/v1/templates/{templateId}/generate-document`, and it takes a JSON payload with the following fields:
```json
{
"title": "string",
"externalId": "string",
"recipients": [
{
"id": 0,
"name": "string",
"email": "user@example.com",
"signingOrder": 0
}
],
"meta": {
"subject": "string",
"message": "string",
"timezone": "string",
"dateFormat": "string",
"redirectUrl": "string",
"signingOrder": "PARALLEL"
},
"authOptions": {
"globalAccessAuth": "ACCOUNT",
"globalActionAuth": "ACCOUNT"
},
"formValues": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
}
}
```
The JSON payload is identical to the payload for uploading a document, so you can read more about the fields in the [Create Document](/developers/public-api/reference#create-document) step. For this API endpoint, the `recipients` property is required.
<Steps>
### Grab the Template ID
The first step is to retrieve the template ID from the Documenso dashboard. You can find the template ID in the URL by navigating to the template details page.
![Template ID](/api-reference/documenso-template-id.webp)
In this case, the template ID is "99999".
### Retrieve the Recipient(s) ID(s)
Once you have the template ID, the next step involves retrieving the ID(s) of the recipient(s) from the template. You can do this by making a GET request to `/api/v1/templates/{template-id}`.
A successful response looks as follows:
```json
{
"id": 0,
"externalId": "string",
"type": "PUBLIC",
"title": "string",
"userId": 0,
"teamId": 0,
"templateDocumentDataId": "string",
"createdAt": "2024-10-11T08:46:58.247Z",
"updatedAt": "2024-10-11T08:46:58.247Z",
"templateMeta": {
"id": "string",
"subject": "string",
"message": "string",
"timezone": "string",
"dateFormat": "string",
"templateId": 0,
"redirectUrl": "string",
"signingOrder": "PARALLEL"
},
"directLink": {
"token": "string",
"enabled": true
},
"templateDocumentData": {
"id": "string",
"type": "S3_PATH",
"data": "string"
},
"Field": [
{
"id": 0,
"recipientId": 0,
"type": "SIGNATURE",
"page": 0,
"positionX": "string",
"positionY": "string",
"width": "string",
"height": "string"
}
],
"Recipient": [
{
"id": 0,
"email": "user@example.com",
"name": "string",
"signingOrder": 0,
"authOptions": "string",
"role": "CC"
}
]
}
```
You'll need the recipient(s) ID(s) for the next step.
### Generate the Document
To generate a document from the template, you need to make a POST request to the `/api/v1/templates/{template-id}/generate-document` endpoint.
At the minimum, you must provide the `recipients` array in the JSON payload. Here's an example of the JSON payload:
```json
{
"recipients": [
{
"id": 0,
"name": "Ash Drew",
"email": "ashdrew@email.com",
"signingOrder": 0
}
]
}
```
Filling the `recipients` array with the corresponding recipient for each template placeholder recipient is recommended. For example, if the template has two placeholders, you should provide at least two recipients in the `recipients` array. Otherwise, the document will be sent to inexistent recipients such as `<recipient.1@documenso.com>`. However, the recipients can always be edited via the API or the web app.
A successful response will contain the document ID and recipient(s) information.
```json
{
"documentId": 999,
"recipients": [
{
"recipientId": 0,
"name": "Ash Drew",
"email": "ashdrew@email.com",
"token": "<signing-token>",
"role": "SIGNER",
"signingOrder": null,
"signingUrl": "https://app.documenso.com/sign/<signing-token>"
}
]
}
```
You can now access the document in your Documenso account dashboard. The screenshot below shows the document that was generated from the template.
![Generated Document](/api-reference/document-generated-from-template.webp)
</Steps>
## Add Fields to Document
The API allows you to add fields to a document via the `/api/v1/documents/{documentId}/fields` endpoint. This is useful when you want to add fields to a document before sending it to recipients.
To add fields to a document, you need to make a `POST` request with a JSON payload containing the field(s) information.
```json
{
"recipientId": 0,
"type": "SIGNATURE",
"pageNumber": 0,
"pageX": 0,
"pageY": 0,
"pageWidth": 0,
"pageHeight": 0,
"fieldMeta": {
"label": "string",
"placeholder": "string",
"required": true,
"readOnly": true,
"type": "text",
"text": "string",
"characterLimit": 0
}
}
// or
[
{
"recipientId": 0,
"type": "SIGNATURE",
"pageNumber": 0,
"pageX": 0,
"pageY": 0,
"pageWidth": 0,
"pageHeight": 0
},
{
"recipientId": 0,
"type": "TEXT",
"pageNumber": 0,
"pageX": 0,
"pageY": 0,
"pageWidth": 0,
"pageHeight": 0,
"fieldMeta": {
"label": "string",
"placeholder": "string",
"required": true,
"readOnly": true,
"type": "text",
"text": "string",
"characterLimit": 0
}
}
]
```
<Callout type="info">This endpoint accepts either one field or an array of fields.</Callout>
Before adding fields to a document, you need each recipient's ID. If the document already has recipients, you can query the document to retrieve the recipient's details. If the document has no recipients, you need to add a recipient via the UI or API before adding a field.
<Steps>
### Retrieve the Recipient(s) ID(s)
Perform a `GET` request to the `/api/v1/documents/{id}` to retrieve the details of a specific document, including the recipient's information.
An example response would look like this:
```json
{
"id": 137,
"externalId": null,
"userId": 3,
"teamId": null,
"title": "documenso.pdf",
"status": "DRAFT",
"documentDataId": "<document-data-id>",
"createdAt": "2024-10-11T12:29:12.725Z",
"updatedAt": "2024-10-11T12:29:12.725Z",
"completedAt": null,
"recipients": [
{
"id": 55,
"documentId": 137,
"email": "ashdrew@email.com",
"name": "Ash Drew",
"role": "SIGNER",
"signingOrder": null,
"token": "<signing-token>",
"signedAt": null,
"readStatus": "NOT_OPENED",
"signingStatus": "NOT_SIGNED",
"sendStatus": "NOT_SENT",
"signingUrl": "https://app.documenso.com/sign/<signing-token>"
}
]
}
```
From this response, you'll only need the recipient ID, which is `55` in this case.
### (OR) Add a Recipient
If the document doesn't already have recipient(s), you can add recipient(s) via the API. Make a `POST` request to the `/api/v1/documents/{documentId}/recipients` endpoint with the recipient information. This endpoint takes the following JSON payload:
```json
{
"name": "string",
"email": "user@example.com",
"role": "SIGNER",
"signingOrder": 0,
"authOptions": {
"actionAuth": "ACCOUNT"
}
}
```
<Callout type="info">The `authOptions` property is only available for Enterprise accounts.</Callout>
Here's an example of the JSON payload for adding a recipient:
```json
{
"name": "Ash Drew",
"email": "ashdrew@email.com",
"role": "SIGNER",
"signingOrder": 0
}
```
A successful request will return a JSON response with the newly added recipient. You can now use the recipient ID to add fields to the document.
### Add Field(s)
Now you can make a `POST` request to the `/api/v1/documents/{documentId}/fields` endpoint with the field(s) information. Here's an example:
```json
[
{
"recipientId": 55,
"type": "SIGNATURE",
"pageNumber": 1,
"pageX": 50,
"pageY": 20,
"pageWidth": 25,
"pageHeight": 5
},
{
"recipientId": 55,
"type": "TEXT",
"pageNumber": 1,
"pageX": 20,
"pageY": 50,
"pageWidth": 30,
"pageHeight": 7.5,
"fieldMeta": {
"label": "Address",
"placeholder": "32 New York Street, 41241",
"required": true,
"readOnly": false,
"type": "text",
"text": "32 New York Street, 41241",
"characterLimit": 40
}
}
]
```
<Callout type="info">
The `text` field represents the default value of the field. If the user doesn't provide any other
value, this is the value that will be used to sign the field.
</Callout>
A successful request will return a JSON response with the newly added fields. The image below illustrates the fields added to the document via the API.
![A screenshot of the document in the Documenso editor](/api-reference/fields-added-via-api.webp)
</Steps>

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

View File

@@ -0,0 +1,82 @@
---
title: Cal.com Chooses Documenso for DPA and BAA Scalability and Compliance
description: Learn how Cal.com scales their Data Processing Agreement (DPA) and Business Associate Agreement (BAA) processes with Documensos open source platform as they grow.
authorName: 'Timur Ercan'
authorImage: '/blog/blog-author-timur.jpeg'
authorRole: 'Co-Founder'
date: 2024-10-11
tags:
- Customer Story
- Open Startup
- Open Source
---
<figure>
<MdxNextImage
src="/blog/cal2.png"
width="1260"
height="630"
alt="Scheduling Infrastructure for Everyone"
/>
<figcaption className="text-center">
Scheduling Infrastructure for Everyone.
</figcaption>
</figure>
TL;DR: Cal.com uses Documensos template direct links to facilitate low-friction compliance paperwork, enhancing scalability and user experience.
## Cal.com The Most Public Private Company
[Cal.com](Cal.com) is an open source company that needs no introduction. Founded in 2021 by Bailey Pumfleet and Peer Richelsen, it quickly evolved from an open source alternative to the widespread but limited scheduling platform Calendly into the internets most beloved scheduling solution. Starting with just two founders, Cal.com has grown into a team of 22, facilitating millions of bookings per year for its ever-growing user and customer base.
Their commitment to transparency is evident as they follow the [open startup movement](https://cal.com/open), opening up not only their source code but also providing insights into their business operations. Their Commercial Open Source Software (COSS) model, combining a company and an open source project, has inspired a whole cohort of startups joining the space—not least of which is Documenso.
## The Need
At this point, Cal.com serves customers of all sizes, from single users to large enterprises. To provide the best product for their customers, they are certified for SOC 2, HIPAA, GDPR, and many other compliance regulations. One challenge that comes with this is the increasing number of waivers that need to be signed when onboarding customers. Business Associate Agreements (BAAs) and Data Processing Agreements (DPAs) are two of the more commonly known examples. To get these signed with minimal effort for both sides, they were looking for a solution to handle these at scale.
> We love open source.
— Peer Richelsen, Co-Founder, Cal.com
Being an open source company, they also prefer open source in their vendors—for both the shared philosophy and the higher level of trust. The goal was to integrate signing into the checkout process as seamlessly as possible.
## The Solution
<figure>
<MdxNextImage
src="/blog/cal.png"
width="1260"
height="630"
alt="Cal.com direct link template to sign a DPA"
/>
<figcaption className="text-center">
Sign a DPA with Cal by clicking a link anytime.
</figcaption>
</figure>
Documenso offers exactly this solution through direct link templates, enabling Cal.com to:
- Provide Immediate Access: Customers can access and sign necessary compliance documents through direct links at any time.
- Enhance User Experience: Users are immediately forwarded to onboarding after signing.
- Ensure Easy Access: The documents are stored within the companys team account, allowing easy access for anyone who needs them.
Direct Link templates can also easily be embedded, using the [Documenso widget](https://documen.so/embedded). Embedding anywhere, pre-Filling the templates and notfiying the compliance team at certain point of the flow are a few of the many option the team now has in continously enhanceing their onboard and compliance UX.
Read more about our direct link templates here: [Direct Link Signing](https://docs.documenso.com/users/direct-links).
## The Journey
Initially, Cal.coms team approached the new solution with skepticism. As Bailey reflected:
> We were intrigued but skeptical at first, as we put a lot of thought into compliance and doing things right. Documensos documentation and support showcased how their direct link templates could meet our needs while being highly compliant.
This experience highlights Documensos trust philosophy. We strive to be transparent in everything we do and let people judge for themselves. It also shows that we neither want nor get trust by default. Doing things right is a conversation worth having, especially in a space as opaque as digital signatures. It goes without saying that the whole team is hyped to have Cal.com on board and yet another open source company joining the open signing movement 🚀
If you have any questions or comments, please reach out on [Twitter / X](https://twitter.com/eltimuro) (DM open) or [Discord](https://documen.so/discord).
Thinking about switching to a modern signing platform? Reach out anytime: [https://documen.so/sales](https://documen.so/sales)
Best from Hamburg\
Timur

View File

@@ -8,6 +8,61 @@ Check out what's new in the latest version and read our thoughts on it. For more
---
# Documenso v1.7.1: Signing order and document visibility
We're excited to introduce Documenso v1.7.1, bringing you improved control over your document signing process. Here are the key updates:
## 🌟 Key New Features
### 1. Signing Order
Specify the sequence in which recipients sign your documents. This ensures a structured signing process, particularly useful for complex agreements or hierarchical approvals.
<video
src="/changelog/signing-order-demo.mp4"
className="aspect-video w-full"
autoPlay
loop
controls
/>
### 2. Document Visibility
Manage who can view your documents and when. This feature offers greater privacy and flexibility in your document sharing workflows.
<video
src="/changelog/document-visibility-demo.mp4"
className="aspect-video w-full"
autoPlay
loop
controls
/>
## 🔧 Other Improvements
- Added language switcher for easier language selection
- Support for smaller field bounds in documents
- Improved select field UX
- Enhanced template functionality for advanced fields
- Added authOptions to the API
- Various UI refinements and bug fixes
## 💡 Recent Features
Don't forget about these powerful features from our recent v1.7.0 release:
- Embedded Signing Experience
- Copy and Paste Fields
- Customizable Signature Colors
## 👏 Thank You
As always, we're grateful for our community's contributions and feedback. Your input continues to shape Documenso into the leading open-source document signing solution.
We're eager to see how these new features enhance your document workflows. Enjoy exploring Documenso v1.7.1!
---
# Documenso v1.7.0: Embedded Signing, Copy and Paste, and More
We're thrilled to announce the release of Documenso v1.7.0, packed with exciting new features and improvements that enhance document signing flexibility, user experience, and global accessibility.

View File

@@ -1,11 +1,11 @@
{
"name": "@documenso/marketing",
"version": "1.7.2-rc.0",
"version": "1.7.2-rc.3",
"private": true,
"license": "AGPL-3.0",
"scripts": {
"dev": "next dev -p 3001",
"build": "next build",
"build": "npm run translate:extract --prefix ../../ && turbo run translate:compile && next build",
"start": "next start -p 3001",
"lint": "next lint",
"lint:fix": "next lint --fix",

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

View File

@@ -76,9 +76,9 @@ export type EarlyAdoptersType = z.infer<typeof ZEarlyAdoptersResponse>;
const fetchGithubStats = async () => {
return await fetch('https://api.github.com/repos/documenso/documenso', {
headers: {
...GITHUB_HEADERS,
},
// headers: {
// ...GITHUB_HEADERS,
// },
})
.then(async (res) => res.json())
.then((res) => ZGithubStatsResponse.parse(res));

View File

@@ -1,11 +1,11 @@
{
"name": "@documenso/web",
"version": "1.7.2-rc.0",
"version": "1.7.2-rc.3",
"private": true,
"license": "AGPL-3.0",
"scripts": {
"dev": "next dev -p 3000",
"build": "next build",
"build": "npm run translate:extract --prefix ../../ && turbo run translate:compile && next build",
"start": "next start",
"lint": "next lint",
"e2e:prepare": "next build && next start",

View File

@@ -112,6 +112,24 @@ export const EditDocumentForm = ({
},
});
const { mutateAsync: updateTypedSignature } =
trpc.document.updateTypedSignatureSettings.useMutation({
...DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
onSuccess: (newData) => {
utils.document.getDocumentWithDetailsById.setData(
{
id: initialDocument.id,
teamId: team?.id,
},
(oldData) => ({
...(oldData || initialDocument),
...newData,
id: Number(newData.id),
}),
);
},
});
const { mutateAsync: addSigners } = trpc.recipient.addSigners.useMutation({
...DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
onSuccess: (newRecipients) => {
@@ -258,6 +276,11 @@ export const EditDocumentForm = ({
fields: data.fields,
});
await updateTypedSignature({
documentId: document.id,
typedSignatureEnabled: data.typedSignatureEnabled,
});
// Clear all field data from localStorage
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
@@ -387,6 +410,7 @@ export const EditDocumentForm = ({
fields={fields}
onSubmit={onAddFieldsFormSubmit}
isDocumentPdfLoaded={isDocumentPdfLoaded}
typedSignatureEnabled={document.documentMeta?.typedSignatureEnabled}
teamId={team?.id}
/>

View File

@@ -87,7 +87,7 @@ export const DeleteDocumentDialog = ({
const onInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setInputValue(event.target.value);
setIsDeleteEnabled(event.target.value === 'delete');
setIsDeleteEnabled(event.target.value === _(msg`delete`));
};
return (

View File

@@ -117,10 +117,10 @@ export const MoveDocumentDialog = ({ documentId, open, onOpenChange }: MoveDocum
<DialogFooter>
<Button variant="secondary" onClick={() => onOpenChange(false)}>
Cancel
<Trans>Cancel</Trans>
</Button>
<Button onClick={onMove} loading={isLoading} disabled={!selectedTeamId || isLoading}>
{isLoading ? 'Moving...' : 'Move'}
{isLoading ? <Trans>Moving...</Trans> : <Trans>Move</Trans>}
</Button>
</DialogFooter>
</DialogContent>

View File

@@ -144,6 +144,7 @@ export const TemplatesDataTable = ({
<div className="flex items-center gap-x-4">
<UseTemplateDialog
templateId={row.original.id}
templateSigningOrder={row.original.templateMeta?.signingOrder}
recipients={row.original.Recipient}
documentRootPath={documentRootPath}
/>

View File

@@ -434,12 +434,14 @@ export const TemplateDirectLinkDialog = ({
<Button
type="button"
loading={isTogglingTemplateAccess}
onClick={async () =>
toggleTemplateDirectLink({
onClick={async () => {
await toggleTemplateDirectLink({
templateId: template.id,
enabled: isEnabled,
})
}
}).catch((e) => null);
onOpenChange(false);
}}
>
<Trans>Save</Trans>
</Button>

View File

@@ -15,7 +15,9 @@ import {
} from '@documenso/lib/constants/template';
import { AppError } from '@documenso/lib/errors/app-error';
import type { Recipient } from '@documenso/prisma/client';
import { DocumentSigningOrder } from '@documenso/prisma/client';
import { trpc } from '@documenso/trpc/react';
import { cn } from '@documenso/ui/lib/utils';
import { Button } from '@documenso/ui/primitives/button';
import { Checkbox } from '@documenso/ui/primitives/checkbox';
import {
@@ -51,6 +53,7 @@ const ZAddRecipientsForNewDocumentSchema = z
id: z.number(),
email: z.string().email(),
name: z.string(),
signingOrder: z.number().optional(),
}),
),
})
@@ -86,6 +89,7 @@ type TAddRecipientsForNewDocumentSchema = z.infer<typeof ZAddRecipientsForNewDoc
export type UseTemplateDialogProps = {
templateId: number;
templateSigningOrder?: DocumentSigningOrder | null;
recipients: Recipient[];
documentRootPath: string;
};
@@ -94,6 +98,7 @@ export function UseTemplateDialog({
recipients,
documentRootPath,
templateId,
templateSigningOrder,
}: UseTemplateDialogProps) {
const router = useRouter();
@@ -108,21 +113,24 @@ export function UseTemplateDialog({
resolver: zodResolver(ZAddRecipientsForNewDocumentSchema),
defaultValues: {
sendDocument: false,
recipients: recipients.map((recipient) => {
const isRecipientEmailPlaceholder = recipient.email.match(
TEMPLATE_RECIPIENT_EMAIL_PLACEHOLDER_REGEX,
);
recipients: recipients
.sort((a, b) => (a.signingOrder || 0) - (b.signingOrder || 0))
.map((recipient) => {
const isRecipientEmailPlaceholder = recipient.email.match(
TEMPLATE_RECIPIENT_EMAIL_PLACEHOLDER_REGEX,
);
const isRecipientNamePlaceholder = recipient.name.match(
TEMPLATE_RECIPIENT_NAME_PLACEHOLDER_REGEX,
);
const isRecipientNamePlaceholder = recipient.name.match(
TEMPLATE_RECIPIENT_NAME_PLACEHOLDER_REGEX,
);
return {
id: recipient.id,
name: !isRecipientNamePlaceholder ? recipient.name : '',
email: !isRecipientEmailPlaceholder ? recipient.email : '',
};
}),
return {
id: recipient.id,
name: !isRecipientNamePlaceholder ? recipient.name : '',
email: !isRecipientEmailPlaceholder ? recipient.email : '',
signingOrder: recipient.signingOrder ?? undefined,
};
}),
},
});
@@ -203,6 +211,33 @@ export function UseTemplateDialog({
<div className="custom-scrollbar -m-1 max-h-[60vh] space-y-4 overflow-y-auto p-1">
{formRecipients.map((recipient, index) => (
<div className="flex w-full flex-row space-x-4" key={recipient.id}>
{templateSigningOrder === DocumentSigningOrder.SEQUENTIAL && (
<FormField
control={form.control}
name={`recipients.${index}.signingOrder`}
render={({ field }) => (
<FormItem
className={cn('w-20', {
'mt-8': index === 0,
})}
>
<FormControl>
<Input
{...field}
disabled
className="items-center justify-center"
value={
field.value?.toString() ||
recipients[index]?.signingOrder?.toString()
}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
)}
<FormField
control={form.control}
name={`recipients.${index}.email`}

View File

@@ -1,7 +1,7 @@
'use client';
import { zodResolver } from '@hookform/resolvers/zod';
import { Trans } from '@lingui/macro';
import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { useSession } from 'next-auth/react';
import { useForm } from 'react-hook-form';
@@ -77,7 +77,7 @@ export const ConfigureDirectTemplateFormPartial = ({
if (template.Recipient.map((recipient) => recipient.email).includes(items.email)) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: 'Email cannot already exist in the template',
message: _(msg`Email cannot already exist in the template`),
path: ['email'],
});
}

View File

@@ -222,7 +222,7 @@ export default async function CompletedSigningPage({
)}
{isLoggedIn && (
<Link href="/documents" className="text-documenso-700 hover:text-documenso-600">
<Link href="/documents" className="text-documenso-700 hover:text-documenso-600 mt-2">
<Trans>Go Back Home</Trans>
</Link>
)}

View File

@@ -9,9 +9,10 @@ import { useSession } from 'next-auth/react';
import { useForm } from 'react-hook-form';
import { useAnalytics } from '@documenso/lib/client-only/hooks/use-analytics';
import type { DocumentAndSender } from '@documenso/lib/server-only/document/get-document-by-token';
import type { TRecipientActionAuth } from '@documenso/lib/types/document-auth';
import { sortFieldsByPosition, validateFieldsInserted } from '@documenso/lib/utils/fields';
import { type Document, type Field, type Recipient, RecipientRole } from '@documenso/prisma/client';
import { type Field, type Recipient, RecipientRole } from '@documenso/prisma/client';
import { trpc } from '@documenso/trpc/react';
import { FieldToolTip } from '@documenso/ui/components/field/field-tooltip';
import { cn } from '@documenso/ui/lib/utils';
@@ -25,7 +26,7 @@ import { useRequiredSigningContext } from './provider';
import { SignDialog } from './sign-dialog';
export type SigningFormProps = {
document: Document;
document: DocumentAndSender;
recipient: Recipient;
fields: Field[];
redirectUrl?: string | null;
@@ -123,9 +124,9 @@ export const SigningForm = ({
>
<div className={cn('flex flex-1 flex-col')}>
<h3 className="text-foreground text-2xl font-semibold">
{recipient.role === RecipientRole.VIEWER && 'View Document'}
{recipient.role === RecipientRole.SIGNER && 'Sign Document'}
{recipient.role === RecipientRole.APPROVER && 'Approve Document'}
{recipient.role === RecipientRole.VIEWER && <Trans>View Document</Trans>}
{recipient.role === RecipientRole.SIGNER && <Trans>Sign Document</Trans>}
{recipient.role === RecipientRole.APPROVER && <Trans>Approve Document</Trans>}
</h3>
{recipient.role === RecipientRole.VIEWER ? (
@@ -165,7 +166,7 @@ export const SigningForm = ({
) : (
<>
<p className="text-muted-foreground mt-2 text-sm">
Please review the document before signing.
<Trans>Please review the document before signing.</Trans>
</p>
<hr className="border-border mb-8 mt-4" />
@@ -173,7 +174,9 @@ export const SigningForm = ({
<div className="-mx-2 flex flex-1 flex-col gap-4 overflow-y-auto px-2">
<div className="flex flex-1 flex-col gap-y-4">
<div>
<Label htmlFor="full-name">Full Name</Label>
<Label htmlFor="full-name">
<Trans>Full Name</Trans>
</Label>
<Input
type="text"
@@ -185,7 +188,9 @@ export const SigningForm = ({
</div>
<div>
<Label htmlFor="Signature">Signature</Label>
<Label htmlFor="Signature">
<Trans>Signature</Trans>
</Label>
<Card className="mt-2" gradient degrees={-120}>
<CardContent className="p-0">
@@ -196,6 +201,7 @@ export const SigningForm = ({
onChange={(value) => {
setSignature(value);
}}
allowTypedSignature={document.documentMeta?.typedSignatureEnabled}
/>
</CardContent>
</Card>
@@ -211,7 +217,7 @@ export const SigningForm = ({
disabled={typeof window !== 'undefined' && window.history.length <= 1}
onClick={() => router.back()}
>
Cancel
<Trans>Cancel</Trans>
</Button>
<SignDialog

View File

@@ -4,6 +4,8 @@ import { useTransition } from 'react';
import { useRouter } from 'next/navigation';
import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Loader } from 'lucide-react';
import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION } from '@documenso/lib/constants/trpc';
@@ -37,6 +39,7 @@ export const InitialsField = ({
}: InitialsFieldProps) => {
const router = useRouter();
const { toast } = useToast();
const { _ } = useLingui();
const { fullName } = useRequiredSigningContext();
const initials = extractInitials(fullName);
@@ -83,8 +86,8 @@ export const InitialsField = ({
console.error(err);
toast({
title: 'Error',
description: 'An error occurred while signing the document.',
title: _(msg`Error`),
description: _(msg`An error occurred while signing the document.`),
variant: 'destructive',
});
}
@@ -109,8 +112,8 @@ export const InitialsField = ({
console.error(err);
toast({
title: 'Error',
description: 'An error occurred while removing the signature.',
title: _(msg`Error`),
description: _(msg`An error occurred while removing the field.`),
variant: 'destructive',
});
}
@@ -126,7 +129,7 @@ export const InitialsField = ({
{!field.inserted && (
<p className="group-hover:text-primary text-muted-foreground duration-200 group-hover:text-yellow-300">
Initials
<Trans>Initials</Trans>
</p>
)}

View File

@@ -43,12 +43,6 @@ export default async function SigningPage({ params: { token } }: SigningPageProp
const requestMetadata = extractNextHeaderRequestMetadata(requestHeaders);
const isRecipientsTurn = await getIsRecipientsTurnToSign({ token });
if (!isRecipientsTurn) {
return redirect(`/sign/${token}/waiting`);
}
const [document, fields, recipient, completedFields] = await Promise.all([
getDocumentAndSenderByToken({
token,
@@ -69,6 +63,12 @@ export default async function SigningPage({ params: { token } }: SigningPageProp
return notFound();
}
const isRecipientsTurn = await getIsRecipientsTurnToSign({ token });
if (!isRecipientsTurn) {
return redirect(`/sign/${token}/waiting`);
}
const { derivedRecipientAccessAuth } = extractDocumentAuthMethods({
documentAuth: document.authOptions,
recipientAuth: recipient.authOptions,

View File

@@ -31,12 +31,12 @@ import { useRequiredSigningContext } from './provider';
import { SigningFieldContainer } from './signing-field-container';
type SignatureFieldState = 'empty' | 'signed-image' | 'signed-text';
export type SignatureFieldProps = {
field: FieldWithSignature;
recipient: Recipient;
onSignField?: (value: TSignFieldWithTokenMutationSchema) => Promise<void> | void;
onUnsignField?: (value: TRemovedSignedFieldWithTokenMutationSchema) => Promise<void> | void;
typedSignatureEnabled?: boolean;
};
export const SignatureField = ({
@@ -44,6 +44,7 @@ export const SignatureField = ({
recipient,
onSignField,
onUnsignField,
typedSignatureEnabled,
}: SignatureFieldProps) => {
const router = useRouter();
@@ -92,14 +93,12 @@ export const SignatureField = ({
return true;
};
/**
* When the user clicks the sign button in the dialog where they enter their signature.
*/
const onDialogSignClick = () => {
setShowSignatureModal(false);
setProvidedSignature(localSignature);
if (!localSignature) {
return;
}
@@ -109,7 +108,6 @@ export const SignatureField = ({
actionTarget: field.type,
});
};
const onSign = async (authOptions?: TRecipientActionAuth, signature?: string) => {
try {
const value = signature || providedSignature;
@@ -231,11 +229,11 @@ export const SignatureField = ({
id="signature"
className="border-border mt-2 h-44 w-full rounded-md border"
onChange={(value) => setLocalSignature(value)}
allowTypedSignature={typedSignatureEnabled}
/>
</div>
<SigningDisclosure />
<DialogFooter>
<div className="flex w-full flex-1 flex-nowrap gap-4">
<Button
@@ -249,7 +247,6 @@ export const SignatureField = ({
>
<Trans>Cancel</Trans>
</Button>
<Button
type="button"
className="flex-1"

View File

@@ -128,7 +128,7 @@ export const SigningFieldContainer = ({
};
return (
<div className={cn('[container-type:size]', type === 'Checkbox' ? 'group' : '')}>
<div className={cn('[container-type:size]', { group: type === 'Checkbox' })}>
<FieldRootContainer field={field}>
{!field.inserted && !loading && !readOnlyField && (
<button

View File

@@ -112,7 +112,12 @@ export const SigningPageView = ({
{fields.map((field) =>
match(field.type)
.with(FieldType.SIGNATURE, () => (
<SignatureField key={field.id} field={field} recipient={recipient} />
<SignatureField
key={field.id}
field={field}
recipient={recipient}
typedSignatureEnabled={documentMeta?.typedSignatureEnabled}
/>
))
.with(FieldType.INITIALS, () => (
<InitialsField key={field.id} field={field} recipient={recipient} />

View File

@@ -97,17 +97,11 @@ export default async function ApiTokensPage({ params }: ApiTokensPageProps) {
<h5 className="text-base">{token.name}</h5>
<p className="text-muted-foreground mt-2 text-xs">
<Trans>
Created on
{i18n.date(token.createdAt, DateTime.DATETIME_FULL)}
</Trans>
<Trans>Created on {i18n.date(token.createdAt, DateTime.DATETIME_FULL)}</Trans>
</p>
{token.expires ? (
<p className="text-muted-foreground mt-1 text-xs">
<Trans>
Expires on
{i18n.date(token.expires, DateTime.DATETIME_FULL)}
</Trans>
<Trans>Expires on {i18n.date(token.expires, DateTime.DATETIME_FULL)}</Trans>
</p>
) : (
<p className="text-muted-foreground mt-1 text-xs">

View File

@@ -5,101 +5,156 @@ import { Trans } from '@lingui/macro';
import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server';
import { Button } from '@documenso/ui/primitives/button';
const SUPPORT_EMAIL = 'support@documenso.com';
export default function SignatureDisclosure() {
setupI18nSSR();
return (
<div>
<article className="prose dark:prose-invert">
<h1>Electronic Signature Disclosure</h1>
<h1>
<Trans>Electronic Signature Disclosure</Trans>
</h1>
<h2>Welcome</h2>
<h2>
<Trans>Welcome</Trans>
</h2>
<p>
Thank you for using Documenso to perform your electronic document signing. The purpose of
this disclosure is to inform you about the process, legality, and your rights regarding
the use of electronic signatures on our platform. By opting to use an electronic
signature, you are agreeing to the terms and conditions outlined below.
<Trans>
Thank you for using Documenso to perform your electronic document signing. The purpose
of this disclosure is to inform you about the process, legality, and your rights
regarding the use of electronic signatures on our platform. By opting to use an
electronic signature, you are agreeing to the terms and conditions outlined below.
</Trans>
</p>
<h2>Acceptance and Consent</h2>
<h2>
<Trans>Acceptance and Consent</Trans>
</h2>
<p>
When you use our platform to affix your electronic signature to documents, you are
consenting to do so under the Electronic Signatures in Global and National Commerce Act
(E-Sign Act) and other applicable laws. This action indicates your agreement to use
electronic means to sign documents and receive notifications.
<Trans>
When you use our platform to affix your electronic signature to documents, you are
consenting to do so under the Electronic Signatures in Global and National Commerce Act
(E-Sign Act) and other applicable laws. This action indicates your agreement to use
electronic means to sign documents and receive notifications.
</Trans>
</p>
<h2>Legality of Electronic Signatures</h2>
<h2>
<Trans>Legality of Electronic Signatures</Trans>
</h2>
<p>
An electronic signature provided by you on our platform, achieved through clicking through
to a document and entering your name, or any other electronic signing method we provide,
is legally binding. It carries the same weight and enforceability as a manual signature
written with ink on paper.
<Trans>
An electronic signature provided by you on our platform, achieved through clicking
through to a document and entering your name, or any other electronic signing method we
provide, is legally binding. It carries the same weight and enforceability as a manual
signature written with ink on paper.
</Trans>
</p>
<h2>System Requirements</h2>
<p>To use our electronic signature service, you must have access to:</p>
<h2>
<Trans>System Requirements</Trans>
</h2>
<p>
<Trans>To use our electronic signature service, you must have access to:</Trans>
</p>
<ul>
<li>A stable internet connection</li>
<li>An email account</li>
<li>A device capable of accessing, opening, and reading documents</li>
<li>A means to print or download documents for your records</li>
<li>
<Trans>A stable internet connection</Trans>
</li>
<li>
<Trans>An email account</Trans>
</li>
<li>
<Trans>A device capable of accessing, opening, and reading documents</Trans>
</li>
<li>
<Trans>A means to print or download documents for your records</Trans>
</li>
</ul>
<h2>Electronic Delivery of Documents</h2>
<h2>
<Trans>Electronic Delivery of Documents</Trans>
</h2>
<p>
All documents related to the electronic signing process will be provided to you
electronically through our platform or via email. It is your responsibility to ensure that
your email address is current and that you can receive and open our emails.
<Trans>
All documents related to the electronic signing process will be provided to you
electronically through our platform or via email. It is your responsibility to ensure
that your email address is current and that you can receive and open our emails.
</Trans>
</p>
<h2>Consent to Electronic Transactions</h2>
<h2>
<Trans>Consent to Electronic Transactions</Trans>
</h2>
<p>
By using the electronic signature feature, you are consenting to conduct transactions and
receive disclosures electronically. You acknowledge that your electronic signature on
documents is binding and that you accept the terms outlined in the documents you are
signing.
<Trans>
By using the electronic signature feature, you are consenting to conduct transactions
and receive disclosures electronically. You acknowledge that your electronic signature
on documents is binding and that you accept the terms outlined in the documents you are
signing.
</Trans>
</p>
<h2>Withdrawing Consent</h2>
<h2>
<Trans>Withdrawing Consent</Trans>
</h2>
<p>
You have the right to withdraw your consent to use electronic signatures at any time
before completing the signing process. To withdraw your consent, please contact the sender
of the document. In failing to contact the sender you may reach out to{' '}
<a href="mailto:support@documenso.com">support@documenso.com</a> for assistance. Be aware
that withdrawing consent may delay or halt the completion of the related transaction or
service.
<Trans>
You have the right to withdraw your consent to use electronic signatures at any time
before completing the signing process. To withdraw your consent, please contact the
sender of the document. In failing to contact the sender you may reach out to{' '}
<a href={`mailto:${SUPPORT_EMAIL}`}>{SUPPORT_EMAIL}</a> for assistance. Be aware that
withdrawing consent may delay or halt the completion of the related transaction or
service.
</Trans>
</p>
<h2>Updating Your Information</h2>
<h2>
<Trans>Updating Your Information</Trans>
</h2>
<p>
It is crucial to keep your contact information, especially your email address, up to date
with us. Please notify us immediately of any changes to ensure that you continue to
receive all necessary communications.
<Trans>
It is crucial to keep your contact information, especially your email address, up to
date with us. Please notify us immediately of any changes to ensure that you continue to
receive all necessary communications.
</Trans>
</p>
<h2>Retention of Documents</h2>
<h2>
<Trans>Retention of Documents</Trans>
</h2>
<p>
After signing a document electronically, you will be provided the opportunity to view,
download, and print the document for your records. It is highly recommended that you
retain a copy of all electronically signed documents for your personal records. We will
also retain a copy of the signed document for our records however we may not be able to
provide you with a copy of the signed document after a certain period of time.
<Trans>
After signing a document electronically, you will be provided the opportunity to view,
download, and print the document for your records. It is highly recommended that you
retain a copy of all electronically signed documents for your personal records. We will
also retain a copy of the signed document for our records however we may not be able to
provide you with a copy of the signed document after a certain period of time.
</Trans>
</p>
<h2>Acknowledgment</h2>
<h2>
<Trans>Acknowledgment</Trans>
</h2>
<p>
By proceeding to use the electronic signature service provided by Documenso, you affirm
that you have read and understood this disclosure. You agree to all terms and conditions
related to the use of electronic signatures and electronic transactions as outlined
herein.
<Trans>
By proceeding to use the electronic signature service provided by Documenso, you affirm
that you have read and understood this disclosure. You agree to all terms and conditions
related to the use of electronic signatures and electronic transactions as outlined
herein.
</Trans>
</p>
<h2>Contact Information</h2>
<h2>
<Trans>Contact Information</Trans>
</h2>
<p>
For any questions regarding this disclosure, electronic signatures, or any related
process, please contact us at:{' '}
<a href="mailto:support@documenso.com">support@documenso.com</a>
<Trans>
For any questions regarding this disclosure, electronic signatures, or any related
process, please contact us at: <a href={`mailto:${SUPPORT_EMAIL}`}>{SUPPORT_EMAIL}</a>
</Trans>
</p>
</article>

View File

@@ -318,6 +318,7 @@ export const EmbedDirectTemplateClientPage = ({
{/* Widget */}
<div
key={isExpanded ? 'expanded' : 'collapsed'}
className="group/document-widget fixed bottom-8 left-0 z-50 h-fit w-full flex-shrink-0 px-6 md:sticky md:top-4 md:z-auto md:w-[350px] md:px-0"
data-expanded={isExpanded || undefined}
>
@@ -367,7 +368,7 @@ export const EmbedDirectTemplateClientPage = ({
className="bg-background mt-2"
disabled={isNameLocked}
value={fullName}
onChange={(e) => !isNameLocked && setFullName(e.target.value.trim())}
onChange={(e) => !isNameLocked && setFullName(e.target.value)}
/>
</div>
@@ -394,13 +395,17 @@ export const EmbedDirectTemplateClientPage = ({
<Card className="mt-2" gradient degrees={-120}>
<CardContent className="p-0">
<SignaturePad
key={signature}
className="h-44 w-full"
disabled={isThrottled || isSubmitting}
defaultValue={signature ?? undefined}
onChange={(value) => {
setSignature(value);
}}
allowTypedSignature={Boolean(
metadata &&
'typedSignatureEnabled' in metadata &&
metadata.typedSignatureEnabled,
)}
/>
</CardContent>
</Card>

View File

@@ -198,6 +198,7 @@ export const EmbedSignDocumentClientPage = ({
{/* Widget */}
<div
key={isExpanded ? 'expanded' : 'collapsed'}
className="group/document-widget fixed bottom-8 left-0 z-50 h-fit w-full flex-shrink-0 px-6 md:sticky md:top-4 md:z-auto md:w-[350px] md:px-0"
data-expanded={isExpanded || undefined}
>
@@ -247,7 +248,7 @@ export const EmbedSignDocumentClientPage = ({
className="bg-background mt-2"
disabled={isNameLocked}
value={fullName}
onChange={(e) => !isNameLocked && setFullName(e.target.value.trim())}
onChange={(e) => !isNameLocked && setFullName(e.target.value)}
/>
</div>
@@ -273,13 +274,17 @@ export const EmbedSignDocumentClientPage = ({
<Card className="mt-2" gradient degrees={-120}>
<CardContent className="p-0">
<SignaturePad
key={signature}
className="h-44 w-full"
disabled={isThrottled || isSubmitting}
defaultValue={signature ?? undefined}
onChange={(value) => {
setSignature(value);
}}
allowTypedSignature={Boolean(
metadata &&
'typedSignatureEnabled' in metadata &&
metadata.typedSignatureEnabled,
)}
/>
</CardContent>
</Card>

View File

@@ -1,9 +1,11 @@
'use client';
import { useMemo } from 'react';
import { Trans } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { getRecipientType } from '@documenso/lib/client-only/recipient-type';
import { RecipientStatusType, getRecipientType } from '@documenso/lib/client-only/recipient-type';
import { RECIPIENT_ROLES_DESCRIPTION } from '@documenso/lib/constants/recipient-roles';
import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter';
import type { DocumentStatus, Recipient } from '@documenso/prisma/client';
@@ -29,24 +31,26 @@ export const StackAvatarsWithTooltip = ({
const { _ } = useLingui();
const waitingRecipients = recipients.filter(
(recipient) => getRecipientType(recipient) === 'waiting',
(recipient) => getRecipientType(recipient) === RecipientStatusType.WAITING,
);
const openedRecipients = recipients.filter(
(recipient) => getRecipientType(recipient) === 'opened',
(recipient) => getRecipientType(recipient) === RecipientStatusType.OPENED,
);
const completedRecipients = recipients.filter(
(recipient) => getRecipientType(recipient) === 'completed',
(recipient) => getRecipientType(recipient) === RecipientStatusType.COMPLETED,
);
const uncompletedRecipients = recipients.filter(
(recipient) => getRecipientType(recipient) === 'unsigned',
(recipient) => getRecipientType(recipient) === RecipientStatusType.UNSIGNED,
);
const sortedRecipients = useMemo(() => recipients.sort((a, b) => a.id - b.id), [recipients]);
return (
<PopoverHover
trigger={children || <StackAvatars recipients={recipients} />}
trigger={children || <StackAvatars recipients={sortedRecipients} />}
contentProps={{
className: 'flex flex-col gap-y-5 py-2',
side: position,
@@ -65,7 +69,7 @@ export const StackAvatarsWithTooltip = ({
type={getRecipientType(recipient)}
fallbackText={recipientAbbreviation(recipient)}
/>
<div className="">
<div>
<p className="text-muted-foreground text-sm">{recipient.email}</p>
<p className="text-muted-foreground/70 text-xs">
{_(RECIPIENT_ROLES_DESCRIPTION[recipient.role].roleName)}

View File

@@ -1,6 +1,9 @@
import React from 'react';
import { getRecipientType } from '@documenso/lib/client-only/recipient-type';
import {
getExtraRecipientsType,
getRecipientType,
} from '@documenso/lib/client-only/recipient-type';
import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter';
import type { Recipient } from '@documenso/prisma/client';
@@ -13,20 +16,27 @@ export function StackAvatars({ recipients }: { recipients: Recipient[] }) {
const remainingItems = recipients.length - itemsToRender.length;
return itemsToRender.map((recipient: Recipient, index: number) => {
const first = index === 0 ? true : false;
const first = index === 0;
const lastItemText =
index === itemsToRender.length - 1 && remainingItems > 0
? `+${remainingItems + 1}`
: undefined;
if (index === 4 && remainingItems > 0) {
return (
<StackAvatar
key="extra-recipient"
first={first}
zIndex={String(zIndex - index * 10)}
type={getExtraRecipientsType(recipients.slice(4))}
fallbackText={`+${remainingItems + 1}`}
/>
);
}
return (
<StackAvatar
key={recipient.id}
first={first}
zIndex={String(zIndex - index * 10)}
type={lastItemText && index === 4 ? 'unsigned' : getRecipientType(recipient)}
fallbackText={lastItemText ? lastItemText : recipientAbbreviation(recipient)}
type={getRecipientType(recipient)}
fallbackText={recipientAbbreviation(recipient)}
/>
);
});

View File

@@ -4,12 +4,18 @@ import { useCallback, useEffect, useState } from 'react';
import { useRouter, useSearchParams } from 'next/navigation';
import { msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { useDebouncedValue } from '@documenso/lib/client-only/hooks/use-debounced-value';
import { Input } from '@documenso/ui/primitives/input';
export const DocumentSearch = ({ initialValue = '' }: { initialValue?: string }) => {
const { _ } = useLingui();
const router = useRouter();
const searchParams = useSearchParams();
const [searchTerm, setSearchTerm] = useState(initialValue);
const debouncedSearchTerm = useDebouncedValue(searchTerm, 500);
@@ -33,7 +39,7 @@ export const DocumentSearch = ({ initialValue = '' }: { initialValue?: string })
return (
<Input
type="search"
placeholder="Search documents..."
placeholder={_(msg`Search documents...`)}
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>

View File

@@ -1,7 +1,9 @@
import { msg } from '@lingui/macro';
export const EXPIRATION_DATES = {
ONE_WEEK: '7 days',
ONE_MONTH: '1 month',
THREE_MONTHS: '3 months',
SIX_MONTHS: '6 months',
ONE_YEAR: '12 months',
ONE_WEEK: msg`7 days`,
ONE_MONTH: msg`1 month`,
THREE_MONTHS: msg`3 months`,
SIX_MONTHS: msg`6 months`,
ONE_YEAR: msg`12 months`,
} as const;

View File

@@ -53,7 +53,7 @@ export default function DeleteTokenDialog({
const [isOpen, setIsOpen] = useState(false);
const deleteMessage = `delete ${token.name}`;
const deleteMessage = _(msg`delete ${token.name}`);
const ZDeleteTokenDialogSchema = z.object({
tokenName: z.literal(deleteMessage, {

View File

@@ -51,7 +51,7 @@ export const DeleteWebhookDialog = ({ webhook, children }: DeleteWebhookDialogPr
const [open, setOpen] = useState(false);
const deleteMessage = `delete ${webhook.webhookUrl}`;
const deleteMessage = _(msg`delete ${webhook.webhookUrl}`);
const ZDeleteWebhookFormSchema = z.object({
webhookUrl: z.literal(deleteMessage, {

View File

@@ -47,7 +47,7 @@ export const DeleteTeamDialog = ({ trigger, teamId, teamName }: DeleteTeamDialog
const { _ } = useLingui();
const { toast } = useToast();
const deleteMessage = `delete ${teamName}`;
const deleteMessage = _(msg`delete ${teamName}`);
const ZDeleteTeamFormSchema = z.object({
teamName: z.literal(deleteMessage, {

View File

@@ -73,7 +73,7 @@ export const TransferTeamDialog = ({
teamId,
});
const confirmTransferMessage = `transfer ${teamName}`;
const confirmTransferMessage = _(msg`transfer ${teamName}`);
const ZTransferTeamFormSchema = z.object({
teamName: z.literal(confirmTransferMessage, {

View File

@@ -83,7 +83,7 @@ export const CurrentUserTeamsDataTable = () => {
accessorKey: 'role',
cell: ({ row }) =>
row.original.ownerUserId === row.original.currentTeamMember.userId
? 'Owner'
? _(msg`Owner`)
: _(TEAM_MEMBER_ROLE_MAP[row.original.currentTeamMember.role]),
},
{

View File

@@ -106,7 +106,7 @@ export const TeamMembersDataTable = ({
accessorKey: 'role',
cell: ({ row }) =>
teamOwnerUserId === row.original.userId
? 'Owner'
? _(msg`Owner`)
: _(TEAM_MEMBER_ROLE_MAP[row.original.role]),
},
{

View File

@@ -2,6 +2,7 @@
import { useState } from 'react';
import { useLingui } from '@lingui/react';
import { EyeOffIcon } from 'lucide-react';
import { P, match } from 'ts-pattern';
@@ -12,6 +13,7 @@ import {
import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer';
import { DEFAULT_DOCUMENT_TIME_ZONE } from '@documenso/lib/constants/time-zones';
import type { DocumentField } from '@documenso/lib/server-only/field/get-fields-for-document';
import { parseMessageDescriptor } from '@documenso/lib/utils/i18n';
import { extractInitials } from '@documenso/lib/utils/recipient-formatter';
import type { DocumentMeta } from '@documenso/prisma/client';
import { FieldType, SigningStatus } from '@documenso/prisma/client';
@@ -28,6 +30,8 @@ export type DocumentReadOnlyFieldsProps = {
};
export const DocumentReadOnlyFields = ({ documentMeta, fields }: DocumentReadOnlyFieldsProps) => {
const { _ } = useLingui();
const [hiddenFieldIds, setHiddenFieldIds] = useState<Record<string, boolean>>({});
const handleHideField = (fieldId: string) => {
@@ -59,7 +63,7 @@ export const DocumentReadOnlyFields = ({ documentMeta, fields }: DocumentReadOnl
>
<p className="font-semibold">
{field.Recipient.signingStatus === SigningStatus.SIGNED ? 'Signed' : 'Pending'}{' '}
{FRIENDLY_FIELD_TYPE[field.type].toLowerCase()} field
{parseMessageDescriptor(_, FRIENDLY_FIELD_TYPE[field.type]).toLowerCase()} field
</p>
<p className="text-muted-foreground text-xs">
@@ -127,7 +131,7 @@ export const DocumentReadOnlyFields = ({ documentMeta, fields }: DocumentReadOnl
field.type === FieldType.FREE_SIGNATURE,
})}
>
{FRIENDLY_FIELD_TYPE[field.type]}
{parseMessageDescriptor(_, FRIENDLY_FIELD_TYPE[field.type])}
</p>
)}
</div>

View File

@@ -202,7 +202,7 @@ export const ApiTokenForm = ({ className, teamId, tokens }: ApiTokenFormProps) =
<SelectContent>
{Object.entries(EXPIRATION_DATES).map(([key, date]) => (
<SelectItem key={key} value={key}>
{date}
{_(date)}
</SelectItem>
))}
</SelectContent>

View File

@@ -2,6 +2,8 @@ import type { HTMLAttributes } from 'react';
import Link from 'next/link';
import { Trans } from '@lingui/macro';
import { cn } from '@documenso/ui/lib/utils';
export type SigningDisclosureProps = HTMLAttributes<HTMLParagraphElement>;
@@ -9,20 +11,24 @@ export type SigningDisclosureProps = HTMLAttributes<HTMLParagraphElement>;
export const SigningDisclosure = ({ className, ...props }: SigningDisclosureProps) => {
return (
<p className={cn('text-muted-foreground text-xs', className)} {...props}>
By proceeding with your electronic signature, you acknowledge and consent that it will be used
to sign the given document and holds the same legal validity as a handwritten signature. By
completing the electronic signing process, you affirm your understanding and acceptance of
these conditions.
<Trans>
By proceeding with your electronic signature, you acknowledge and consent that it will be
used to sign the given document and holds the same legal validity as a handwritten
signature. By completing the electronic signing process, you affirm your understanding and
acceptance of these conditions.
</Trans>
<span className="mt-2 block">
Read the full{' '}
<Link
className="text-documenso-700 underline"
href="/articles/signature-disclosure"
target="_blank"
>
signature disclosure
</Link>
.
<Trans>
Read the full{' '}
<Link
className="text-documenso-700 underline"
href="/articles/signature-disclosure"
target="_blank"
>
signature disclosure
</Link>
.
</Trans>
</span>
</p>
);

View File

@@ -58,6 +58,8 @@ COPY .gitignore .gitignore
COPY --from=builder /app/out/json/ .
COPY --from=builder /app/out/package-lock.json ./package-lock.json
COPY --from=builder /app/lingui.config.ts ./lingui.config.ts
RUN npm ci
# Then copy all the source code (as it changes more often)

8
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "@documenso/root",
"version": "1.7.2-rc.0",
"version": "1.7.2-rc.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@documenso/root",
"version": "1.7.2-rc.0",
"version": "1.7.2-rc.3",
"workspaces": [
"apps/*",
"packages/*"
@@ -80,7 +80,7 @@
},
"apps/marketing": {
"name": "@documenso/marketing",
"version": "1.7.2-rc.0",
"version": "1.7.2-rc.3",
"license": "AGPL-3.0",
"dependencies": {
"@documenso/assets": "*",
@@ -441,7 +441,7 @@
},
"apps/web": {
"name": "@documenso/web",
"version": "1.7.2-rc.0",
"version": "1.7.2-rc.3",
"license": "AGPL-3.0",
"dependencies": {
"@documenso/api": "*",

View File

@@ -1,6 +1,6 @@
{
"private": true,
"version": "1.7.2-rc.0",
"version": "1.7.2-rc.3",
"scripts": {
"build": "turbo run build",
"build:web": "turbo run build --filter=@documenso/web",

View File

@@ -12,10 +12,12 @@ import {
ZDeleteFieldMutationSchema,
ZDeleteRecipientMutationSchema,
ZDownloadDocumentSuccessfulSchema,
ZFindTeamMembersResponseSchema,
ZGenerateDocumentFromTemplateMutationResponseSchema,
ZGenerateDocumentFromTemplateMutationSchema,
ZGetDocumentsQuerySchema,
ZGetTemplatesQuerySchema,
ZInviteTeamMemberMutationSchema,
ZNoBodyMutationSchema,
ZResendDocumentForSigningMutationSchema,
ZSendDocumentForSigningMutationSchema,
@@ -26,13 +28,17 @@ import {
ZSuccessfulGetDocumentResponseSchema,
ZSuccessfulGetTemplateResponseSchema,
ZSuccessfulGetTemplatesResponseSchema,
ZSuccessfulInviteTeamMemberResponseSchema,
ZSuccessfulRecipientResponseSchema,
ZSuccessfulRemoveTeamMemberResponseSchema,
ZSuccessfulResendDocumentResponseSchema,
ZSuccessfulResponseSchema,
ZSuccessfulSigningResponseSchema,
ZSuccessfulUpdateTeamMemberResponseSchema,
ZUnsuccessfulResponseSchema,
ZUpdateFieldMutationSchema,
ZUpdateRecipientMutationSchema,
ZUpdateTeamMemberMutationSchema,
} from './schema';
const c = initContract();
@@ -273,6 +279,61 @@ export const ApiContractV1 = c.router(
},
summary: 'Delete a field from a document',
},
findTeamMembers: {
method: 'GET',
path: '/api/v1/team/:id/members',
responses: {
200: ZFindTeamMembersResponseSchema,
400: ZUnsuccessfulResponseSchema,
401: ZUnsuccessfulResponseSchema,
404: ZUnsuccessfulResponseSchema,
500: ZUnsuccessfulResponseSchema,
},
summary: 'List team members',
},
inviteTeamMember: {
method: 'POST',
path: '/api/v1/team/:id/members/invite',
body: ZInviteTeamMemberMutationSchema,
responses: {
200: ZSuccessfulInviteTeamMemberResponseSchema,
400: ZUnsuccessfulResponseSchema,
401: ZUnsuccessfulResponseSchema,
404: ZUnsuccessfulResponseSchema,
500: ZUnsuccessfulResponseSchema,
},
summary: 'Invite a member to a team',
},
updateTeamMember: {
method: 'PUT',
path: '/api/v1/team/:id/members/:memberId',
body: ZUpdateTeamMemberMutationSchema,
responses: {
200: ZSuccessfulUpdateTeamMemberResponseSchema,
400: ZUnsuccessfulResponseSchema,
401: ZUnsuccessfulResponseSchema,
404: ZUnsuccessfulResponseSchema,
500: ZUnsuccessfulResponseSchema,
},
summary: 'Update a team member',
},
removeTeamMember: {
method: 'DELETE',
path: '/api/v1/team/:id/members/:memberId',
body: null,
responses: {
200: ZSuccessfulRemoveTeamMemberResponseSchema,
400: ZUnsuccessfulResponseSchema,
401: ZUnsuccessfulResponseSchema,
404: ZUnsuccessfulResponseSchema,
500: ZUnsuccessfulResponseSchema,
},
summary: 'Remove a member from a team',
},
},
{
baseHeaders: ZAuthorizationHeadersSchema,

View File

@@ -26,6 +26,8 @@ import { getRecipientById } from '@documenso/lib/server-only/recipient/get-recip
import { getRecipientsForDocument } from '@documenso/lib/server-only/recipient/get-recipients-for-document';
import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document';
import { updateRecipient } from '@documenso/lib/server-only/recipient/update-recipient';
import { createTeamMemberInvites } from '@documenso/lib/server-only/team/create-team-member-invites';
import { deleteTeamMembers } from '@documenso/lib/server-only/team/delete-team-members';
import type { CreateDocumentFromTemplateResponse } from '@documenso/lib/server-only/template/create-document-from-template';
import { createDocumentFromTemplate } from '@documenso/lib/server-only/template/create-document-from-template';
import { createDocumentFromTemplateLegacy } from '@documenso/lib/server-only/template/create-document-from-template-legacy';
@@ -49,7 +51,12 @@ import {
} from '@documenso/lib/universal/upload/server-actions';
import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs';
import { prisma } from '@documenso/prisma';
import { DocumentDataType, DocumentStatus, SigningStatus } from '@documenso/prisma/client';
import {
DocumentDataType,
DocumentStatus,
SigningStatus,
TeamMemberRole,
} from '@documenso/prisma/client';
import { ApiContractV1 } from './contract';
import { authenticatedMiddleware } from './middleware/authenticated';
@@ -1279,4 +1286,270 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
},
};
}),
findTeamMembers: authenticatedMiddleware(async (args, user, team) => {
const { id: teamId } = args.params;
if (team?.id !== Number(teamId)) {
return {
status: 403,
body: {
message: 'You are not authorized to perform actions against this team.',
},
};
}
const self = await prisma.teamMember.findFirst({
where: {
userId: user.id,
teamId: team.id,
},
});
if (self?.role !== TeamMemberRole.ADMIN) {
return {
status: 403,
body: {
message: 'You are not authorized to perform actions against this team.',
},
};
}
const members = await prisma.teamMember.findMany({
where: {
teamId: team.id,
},
include: {
user: true,
},
});
return {
status: 200,
body: {
members: members.map((member) => ({
id: member.id,
email: member.user.email,
role: member.role,
})),
},
};
}),
inviteTeamMember: authenticatedMiddleware(async (args, user, team) => {
const { id: teamId } = args.params;
const { email, role } = args.body;
if (team?.id !== Number(teamId)) {
return {
status: 403,
body: {
message: 'You are not authorized to perform actions against this team.',
},
};
}
const self = await prisma.teamMember.findFirst({
where: {
userId: user.id,
teamId: team.id,
},
});
if (self?.role !== TeamMemberRole.ADMIN) {
return {
status: 403,
body: {
message: 'You are not authorized to perform actions against this team.',
},
};
}
const hasAlreadyBeenInvited = await prisma.teamMember.findFirst({
where: {
teamId: team.id,
user: {
email,
},
},
});
if (hasAlreadyBeenInvited) {
return {
status: 400,
body: {
message: 'This user has already been invited to the team',
},
};
}
await createTeamMemberInvites({
userId: user.id,
userName: user.name ?? '',
teamId: team.id,
invitations: [
{
email,
role,
},
],
});
return {
status: 200,
body: {
message: 'An invite has been sent to the member',
},
};
}),
updateTeamMember: authenticatedMiddleware(async (args, user, team) => {
const { id: teamId, memberId } = args.params;
const { role } = args.body;
if (team?.id !== Number(teamId)) {
return {
status: 403,
body: {
message: 'You are not authorized to perform actions against this team.',
},
};
}
const self = await prisma.teamMember.findFirst({
where: {
userId: user.id,
teamId: team.id,
},
});
if (self?.role !== TeamMemberRole.ADMIN) {
return {
status: 403,
body: {
message: 'You are not authorized to perform actions against this team.',
},
};
}
const member = await prisma.teamMember.findFirst({
where: {
id: Number(memberId),
teamId: team.id,
},
});
if (!member) {
return {
status: 404,
body: {
message: 'The provided member id does not exist.',
},
};
}
const updatedMember = await prisma.teamMember.update({
where: {
id: member.id,
},
data: {
role,
},
include: {
user: true,
},
});
return {
status: 200,
body: {
id: updatedMember.id,
email: updatedMember.user.email,
role: updatedMember.role,
},
};
}),
removeTeamMember: authenticatedMiddleware(async (args, user, team) => {
const { id: teamId, memberId } = args.params;
if (team?.id !== Number(teamId)) {
return {
status: 403,
body: {
message: 'You are not authorized to perform actions against this team.',
},
};
}
const self = await prisma.teamMember.findFirst({
where: {
userId: user.id,
teamId: team.id,
},
});
if (self?.role !== TeamMemberRole.ADMIN) {
return {
status: 403,
body: {
message: 'You are not authorized to perform actions against this team.',
},
};
}
const member = await prisma.teamMember.findFirst({
where: {
id: Number(memberId),
teamId: Number(teamId),
},
include: {
user: true,
},
});
if (!member) {
return {
status: 404,
body: {
message: 'Member not found',
},
};
}
if (team.ownerUserId === member.userId) {
return {
status: 403,
body: {
message: 'You cannot remove the owner of the team',
},
};
}
if (member.userId === user.id) {
return {
status: 403,
body: {
message: 'You cannot remove yourself from the team',
},
};
}
await deleteTeamMembers({
userId: user.id,
teamId: team.id,
teamMemberIds: [member.id],
});
return {
status: 200,
body: {
id: member.id,
email: member.user.email,
role: member.role,
},
};
}),
});

View File

@@ -19,6 +19,7 @@ import {
RecipientRole,
SendStatus,
SigningStatus,
TeamMemberRole,
TemplateType,
} from '@documenso/prisma/client';
@@ -532,3 +533,41 @@ export const ZGetTemplatesQuerySchema = z.object({
page: z.coerce.number().min(1).optional().default(1),
perPage: z.coerce.number().min(1).optional().default(1),
});
export const ZFindTeamMembersResponseSchema = z.object({
members: z.array(
z.object({
id: z.number(),
email: z.string().email(),
role: z.nativeEnum(TeamMemberRole),
}),
),
});
export const ZInviteTeamMemberMutationSchema = z.object({
email: z
.string()
.email()
.transform((email) => email.toLowerCase()),
role: z.nativeEnum(TeamMemberRole).optional().default(TeamMemberRole.MEMBER),
});
export const ZSuccessfulInviteTeamMemberResponseSchema = z.object({
message: z.string(),
});
export const ZUpdateTeamMemberMutationSchema = z.object({
role: z.nativeEnum(TeamMemberRole),
});
export const ZSuccessfulUpdateTeamMemberResponseSchema = z.object({
id: z.number(),
email: z.string().email(),
role: z.nativeEnum(TeamMemberRole),
});
export const ZSuccessfulRemoveTeamMemberResponseSchema = z.object({
id: z.number(),
email: z.string().email(),
role: z.nativeEnum(TeamMemberRole),
});

View File

@@ -0,0 +1,278 @@
import { expect, test } from '@playwright/test';
import {
ZFindTeamMembersResponseSchema,
ZSuccessfulInviteTeamMemberResponseSchema,
ZSuccessfulRemoveTeamMemberResponseSchema,
ZSuccessfulUpdateTeamMemberResponseSchema,
ZUnsuccessfulResponseSchema,
} from '@documenso/api/v1/schema';
import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app';
import { createApiToken } from '@documenso/lib/server-only/public-api/create-api-token';
import { prisma } from '@documenso/prisma';
import { TeamMemberRole } from '@documenso/prisma/client';
import { seedTeam } from '@documenso/prisma/seed/teams';
import { seedUser } from '@documenso/prisma/seed/users';
test.describe('Team API', () => {
test('findTeamMembers: should list team members', async ({ request }) => {
const team = await seedTeam({
createTeamMembers: 3,
});
const ownerMember = team.members.find((member) => member.userId === team.owner.id)!;
// Should not be undefined
expect(ownerMember).toBeTruthy();
const { token } = await createApiToken({
userId: team.owner.id,
teamId: team.id,
tokenName: 'test',
expiresIn: null,
});
const response = await request.get(`${WEBAPP_BASE_URL}/api/v1/team/${team.id}/members`, {
headers: {
Authorization: `Bearer ${token}`,
},
});
expect(response.ok()).toBeTruthy();
expect(response.status()).toBe(200);
const data = await response.json();
const parsed = ZFindTeamMembersResponseSchema.safeParse(data);
const safeData = parsed.success ? parsed.data : null;
expect(parsed.success).toBeTruthy();
expect(safeData!.members).toHaveLength(4); // Owner + 3 members
expect(safeData!.members[0]).toHaveProperty('id');
expect(safeData!.members[0]).toHaveProperty('email');
expect(safeData!.members[0]).toHaveProperty('role');
expect(safeData!.members).toContainEqual({
id: ownerMember.id,
email: ownerMember.user.email,
role: ownerMember.role,
});
});
test('inviteTeamMember: should invite a new team member', async ({ request }) => {
const team = await seedTeam();
const { token } = await createApiToken({
userId: team.owner.id,
teamId: team.id,
tokenName: 'test',
expiresIn: null,
});
const newUser = await seedUser();
const response = await request.post(
`${WEBAPP_BASE_URL}/api/v1/team/${team.id}/members/invite`,
{
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
data: {
email: newUser.email,
role: TeamMemberRole.MEMBER,
},
},
);
expect(response.ok()).toBeTruthy();
const data = await response.json();
const parsed = ZSuccessfulInviteTeamMemberResponseSchema.safeParse(data);
const safeData = parsed.success ? parsed.data : null;
expect(parsed.success).toBeTruthy();
expect(safeData!.message).toBe('An invite has been sent to the member');
const invite = await prisma.teamMemberInvite.findFirst({
where: {
email: newUser.email,
teamId: team.id,
},
});
expect(invite).toBeTruthy();
});
test('updateTeamMember: should update a team member role', async ({ request }) => {
const team = await seedTeam({
createTeamMembers: 3,
});
const { token } = await createApiToken({
userId: team.owner.id,
teamId: team.id,
tokenName: 'test',
expiresIn: null,
});
const member = team.members.find((member) => member.role === TeamMemberRole.MEMBER)!;
// Should not be undefined
expect(member).toBeTruthy();
const response = await request.put(
`${WEBAPP_BASE_URL}/api/v1/team/${team.id}/members/${member.id}`,
{
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
data: {
role: TeamMemberRole.ADMIN,
},
},
);
expect(response.ok()).toBeTruthy();
const data = await response.json();
const parsed = ZSuccessfulUpdateTeamMemberResponseSchema.safeParse(data);
const safeData = parsed.success ? parsed.data : null;
expect(parsed.success).toBeTruthy();
expect(safeData!.id).toBe(member.id);
expect(safeData!.email).toBe(member.user.email);
expect(safeData!.role).toBe(TeamMemberRole.ADMIN);
});
test('removeTeamMember: should remove a team member', async ({ request }) => {
const team = await seedTeam({
createTeamMembers: 3,
});
const { token } = await createApiToken({
userId: team.owner.id,
teamId: team.id,
tokenName: 'test',
expiresIn: null,
});
const member = team.members.find((member) => member.role === TeamMemberRole.MEMBER)!;
// Should not be undefined
expect(member).toBeTruthy();
const response = await request.delete(
`${WEBAPP_BASE_URL}/api/v1/team/${team.id}/members/${member.id}`,
{
headers: {
Authorization: `Bearer ${token}`,
},
},
);
expect(response.status()).toBe(200);
const data = await response.json();
const parsed = ZSuccessfulRemoveTeamMemberResponseSchema.safeParse(data);
const safeData = parsed.success ? parsed.data : null;
expect(parsed.success).toBeTruthy();
expect(safeData!.id).toBe(member.id);
expect(safeData!.email).toBe(member.user.email);
expect(safeData!.role).toBe(member.role);
const removedMemberCount = await prisma.teamMember.count({
where: {
id: member.id,
teamId: team.id,
},
});
expect(removedMemberCount).toBe(0);
});
test('removeTeamMember: should not remove team owner', async ({ request }) => {
const team = await seedTeam({
createTeamMembers: 3,
});
const { token } = await createApiToken({
userId: team.owner.id,
teamId: team.id,
tokenName: 'test',
expiresIn: null,
});
const ownerMember = team.members.find((member) => member.userId === team.owner.id)!;
// Should not be undefined
expect(ownerMember).toBeTruthy();
const response = await request.delete(
`${WEBAPP_BASE_URL}/api/v1/team/${team.id}/members/${ownerMember.id}`,
{
headers: {
Authorization: `Bearer ${token}`,
},
},
);
expect(response.status()).toBe(403);
const parsed = ZUnsuccessfulResponseSchema.safeParse(await response.json());
expect(parsed.success).toBeTruthy();
});
test('removeTeamMember: should not remove self', async ({ request }) => {
const team = await seedTeam({
createTeamMembers: 3,
});
const member = team.members.find((member) => member.role === TeamMemberRole.MEMBER)!;
// Make our non-owner member an admin
await prisma.teamMember.update({
where: {
id: member.id,
},
data: {
role: TeamMemberRole.ADMIN,
},
});
const { token } = await createApiToken({
userId: member.userId,
teamId: team.id,
tokenName: 'test',
expiresIn: null,
});
const response = await request.delete(
`${WEBAPP_BASE_URL}/api/v1/team/${team.id}/members/${member.id}`,
{
headers: {
Authorization: `Bearer ${token}`,
},
},
);
expect(response.status()).toBe(403);
const parsed = ZUnsuccessfulResponseSchema.safeParse(await response.json());
expect(parsed.success).toBeTruthy();
});
});

View File

@@ -112,7 +112,6 @@ test('[DIRECT_TEMPLATES]: toggle direct template link', async ({ page }) => {
await page.getByRole('switch').click();
await page.getByRole('button', { name: 'Save' }).click();
await expect(page.getByText('Direct link signing has been').first()).toBeVisible();
await page.getByLabel('Direct Link Signing', { exact: true }).press('Escape');
// Check that the direct template link is no longer accessible.
await page.goto(formatDirectTemplatePath(template.directLink?.token || ''));

View File

@@ -5,9 +5,9 @@
"description": "",
"main": "index.js",
"scripts": {
"test:dev": "playwright test",
"test-ui:dev": "playwright test --ui",
"test:e2e": "start-server-and-test \"npm run start -w @documenso/web\" http://localhost:3000 \"playwright test\""
"test:dev": "NODE_OPTIONS=--experimental-require-module playwright test",
"test-ui:dev": "NODE_OPTIONS=--experimental-require-module playwright test --ui",
"test:e2e": "NODE_OPTIONS=--experimental-require-module start-server-and-test \"npm run start -w @documenso/web\" http://localhost:3000 \"playwright test\""
},
"keywords": [],
"author": "",

View File

@@ -1,15 +1,10 @@
import { checkboxValidationSigns } from '@documenso/ui/primitives/document-flow/field-items-advanced-settings/constants';
interface CheckboxFieldMeta {
readOnly?: boolean;
required?: boolean;
validationRule?: string;
validationLength?: number;
}
import type { TCheckboxFieldMeta } from '../types/field-meta';
export const validateCheckboxField = (
values: string[],
fieldMeta: CheckboxFieldMeta,
fieldMeta: TCheckboxFieldMeta,
isSigningPage: boolean = false,
): string[] => {
const errors = [];

View File

@@ -1,14 +1,10 @@
interface DropdownFieldMeta {
readOnly?: boolean;
required?: boolean;
values?: { value: string }[];
defaultValue?: string;
}
import type { TDropdownFieldMeta as DropdownFieldMeta } from '../types/field-meta';
export const validateDropdownField = (
value: string | undefined,
fieldMeta: DropdownFieldMeta,
isSigningPage: boolean = false,
fontSize?: number,
): string[] => {
const errors = [];
@@ -50,5 +46,9 @@ export const validateDropdownField = (
errors.push('Duplicate values are not allowed');
}
if (fontSize && (fontSize < 8 || fontSize > 96)) {
errors.push('Font size must be between 8 and 96.');
}
return errors;
};

View File

@@ -0,0 +1,19 @@
import type {
TDateFieldMeta as DateFieldMeta,
TEmailFieldMeta as EmailFieldMeta,
TInitialsFieldMeta as InitialsFieldMeta,
TNameFieldMeta as NameFieldMeta,
} from '../types/field-meta';
export const validateFields = (
fieldMeta: DateFieldMeta | EmailFieldMeta | InitialsFieldMeta | NameFieldMeta,
): string[] => {
const errors = [];
const { fontSize } = fieldMeta;
if (fontSize && (fontSize < 8 || fontSize > 96)) {
errors.push('Font size must be between 8 and 96.');
}
return errors;
};

View File

@@ -1,12 +1,5 @@
// import { numberFormatValues } from '@documenso/ui/primitives/document-flow/field-items-advanced-settings/constants';
interface NumberFieldMeta {
minValue?: number;
maxValue?: number;
readOnly?: boolean;
required?: boolean;
numberFormat?: string;
}
import type { TNumberFieldMeta as NumberFieldMeta } from '../types/field-meta';
export const validateNumberField = (
value: string,
@@ -15,7 +8,7 @@ export const validateNumberField = (
): string[] => {
const errors = [];
const { minValue, maxValue, readOnly, required, numberFormat } = fieldMeta || {};
const { minValue, maxValue, readOnly, required, numberFormat, fontSize } = fieldMeta || {};
const formatRegex: { [key: string]: RegExp } = {
'123,456,789.00': /^(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d{1,2})?$/,
@@ -63,5 +56,9 @@ export const validateNumberField = (
errors.push('A field cannot be both read-only and required');
}
if (fontSize && (fontSize < 8 || fontSize > 96)) {
errors.push('Font size must be between 8 and 96.');
}
return errors;
};

View File

@@ -1,8 +1,4 @@
interface RadioFieldMeta {
readOnly?: boolean;
required?: boolean;
values?: { checked: boolean; value: string }[];
}
import type { TRadioFieldMeta as RadioFieldMeta } from '../types/field-meta';
export const validateRadioField = (
value: string | undefined,

View File

@@ -1,8 +1,4 @@
interface TextFieldMeta {
characterLimit?: number;
readOnly?: boolean;
required?: boolean;
}
import type { TTextFieldMeta as TextFieldMeta } from '../types/field-meta';
export const validateTextField = (
value: string,
@@ -11,7 +7,7 @@ export const validateTextField = (
): string[] => {
const errors = [];
const { characterLimit, readOnly, required } = fieldMeta;
const { characterLimit, readOnly, required, fontSize } = fieldMeta;
if (required && !value && isSigningPage) {
errors.push('Value is required');
@@ -29,5 +25,9 @@ export const validateTextField = (
errors.push('A field cannot be both read-only and required');
}
if (fontSize && (fontSize < 8 || fontSize > 96)) {
errors.push('Font size must be between 8 and 96.');
}
return errors;
};

View File

@@ -15,9 +15,20 @@ type SupportedLanguages = (typeof SUPPORTED_LANGUAGE_CODES)[number];
async function loadCatalog(lang: SupportedLanguages): Promise<{
[k: string]: Messages;
}> {
const { messages } = await import(
`../../translations/${lang}/${IS_APP_WEB ? 'web' : 'marketing'}.js`
);
const extension = process.env.NODE_ENV === 'development' ? 'po' : 'js';
const context = IS_APP_WEB ? 'web' : 'marketing';
let { messages } = await import(`../../translations/${lang}/${context}.${extension}`);
// Dirty way to load common messages for development since it's not compiled.
if (process.env.NODE_ENV === 'development') {
const commonMessages = await import(`../../translations/${lang}/common.${extension}`);
messages = {
...messages,
...commonMessages.messages,
};
}
return {
[lang]: messages,

View File

@@ -1,12 +1,19 @@
import type { Recipient } from '@documenso/prisma/client';
import { ReadStatus, RecipientRole, SendStatus, SigningStatus } from '@documenso/prisma/client';
export enum RecipientStatusType {
COMPLETED = 'completed',
OPENED = 'opened',
WAITING = 'waiting',
UNSIGNED = 'unsigned',
}
export const getRecipientType = (recipient: Recipient) => {
if (
recipient.role === RecipientRole.CC ||
(recipient.sendStatus === SendStatus.SENT && recipient.signingStatus === SigningStatus.SIGNED)
) {
return 'completed';
return RecipientStatusType.COMPLETED;
}
if (
@@ -14,12 +21,33 @@ export const getRecipientType = (recipient: Recipient) => {
recipient.readStatus === ReadStatus.OPENED &&
recipient.signingStatus === SigningStatus.NOT_SIGNED
) {
return 'opened';
return RecipientStatusType.OPENED;
}
if (recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED') {
return 'waiting';
if (
recipient.sendStatus === SendStatus.SENT &&
recipient.signingStatus === SigningStatus.NOT_SIGNED
) {
return RecipientStatusType.WAITING;
}
return 'unsigned';
return RecipientStatusType.UNSIGNED;
};
export const getExtraRecipientsType = (extraRecipients: Recipient[]) => {
const types = extraRecipients.map((r) => getRecipientType(r));
if (types.includes(RecipientStatusType.UNSIGNED)) {
return RecipientStatusType.UNSIGNED;
}
if (types.includes(RecipientStatusType.OPENED)) {
return RecipientStatusType.OPENED;
}
if (types.includes(RecipientStatusType.WAITING)) {
return RecipientStatusType.WAITING;
}
return RecipientStatusType.COMPLETED;
};

View File

@@ -1,6 +1,6 @@
import { z } from 'zod';
export const SUPPORTED_LANGUAGE_CODES = ['de', 'en', 'fr'] as const;
export const SUPPORTED_LANGUAGE_CODES = ['de', 'en', 'fr', 'es'] as const;
export const ZSupportedLanguageCodeSchema = z.enum(SUPPORTED_LANGUAGE_CODES).catch('en');
@@ -42,4 +42,8 @@ export const SUPPORTED_LANGUAGES: Record<string, SupportedLanguage> = {
full: 'French',
short: 'fr',
},
es: {
full: 'Spanish',
short: 'es',
},
} satisfies Record<SupportedLanguageCodes, SupportedLanguage>;

View File

@@ -41,24 +41,28 @@ export const RECIPIENT_ROLES_DESCRIPTION_ENG = {
actioned: `Approved`,
progressiveVerb: `Approving`,
roleName: `Approver`,
roleNamePlural: msg`Approvers`,
},
[RecipientRole.CC]: {
actionVerb: `CC`,
actioned: `CC'd`,
progressiveVerb: `CC`,
roleName: `Cc`,
roleNamePlural: msg`Ccers`,
},
[RecipientRole.SIGNER]: {
actionVerb: `Sign`,
actioned: `Signed`,
progressiveVerb: `Signing`,
roleName: `Signer`,
roleNamePlural: msg`Signers`,
},
[RecipientRole.VIEWER]: {
actionVerb: `View`,
actioned: `Viewed`,
progressiveVerb: `Viewing`,
roleName: `Viewer`,
roleNamePlural: msg`Viewers`,
},
} satisfies Record<keyof typeof RecipientRole, unknown>;

View File

@@ -18,6 +18,7 @@ export type CreateDocumentMetaOptions = {
dateFormat?: string;
redirectUrl?: string;
signingOrder?: DocumentSigningOrder;
typedSignatureEnabled?: boolean;
userId: number;
requestMetadata: RequestMetadata;
};
@@ -32,6 +33,7 @@ export const upsertDocumentMeta = async ({
userId,
redirectUrl,
signingOrder,
typedSignatureEnabled,
requestMetadata,
}: CreateDocumentMetaOptions) => {
const user = await prisma.user.findFirstOrThrow({
@@ -82,6 +84,7 @@ export const upsertDocumentMeta = async ({
documentId,
redirectUrl,
signingOrder,
typedSignatureEnabled,
},
update: {
subject,
@@ -91,6 +94,7 @@ export const upsertDocumentMeta = async ({
timezone,
redirectUrl,
signingOrder,
typedSignatureEnabled,
},
});

View File

@@ -1,6 +1,7 @@
// https://github.com/Hopding/pdf-lib/issues/20#issuecomment-412852821
import fontkit from '@pdf-lib/fontkit';
import { PDFDocument, RotationTypes, degrees, radiansToDegrees } from 'pdf-lib';
import type { PDFDocument } from 'pdf-lib';
import { RotationTypes, degrees, radiansToDegrees } from 'pdf-lib';
import { P, match } from 'ts-pattern';
import {
@@ -13,7 +14,16 @@ import { FieldType } from '@documenso/prisma/client';
import { isSignatureFieldType } from '@documenso/prisma/guards/is-signature-field';
import type { FieldWithSignature } from '@documenso/prisma/types/field-with-signature';
import { ZCheckboxFieldMeta, ZRadioFieldMeta } from '../../types/field-meta';
import {
ZCheckboxFieldMeta,
ZDateFieldMeta,
ZEmailFieldMeta,
ZInitialsFieldMeta,
ZNameFieldMeta,
ZNumberFieldMeta,
ZRadioFieldMeta,
ZTextFieldMeta,
} from '../../types/field-meta';
export const insertFieldInPDF = async (pdf: PDFDocument, field: FieldWithSignature) => {
const fontCaveat = await fetch(process.env.FONT_CAVEAT_URI).then(async (res) =>
@@ -32,7 +42,6 @@ export const insertFieldInPDF = async (pdf: PDFDocument, field: FieldWithSignatu
const minFontSize = isSignatureField ? MIN_HANDWRITING_FONT_SIZE : MIN_STANDARD_FONT_SIZE;
const maxFontSize = isSignatureField ? DEFAULT_HANDWRITING_FONT_SIZE : DEFAULT_STANDARD_FONT_SIZE;
let fontSize = maxFontSize;
const page = pages.at(field.page - 1);
@@ -207,16 +216,33 @@ export const insertFieldInPDF = async (pdf: PDFDocument, field: FieldWithSignatu
}
})
.otherwise((field) => {
const fieldMetaParsers = {
[FieldType.TEXT]: ZTextFieldMeta,
[FieldType.NUMBER]: ZNumberFieldMeta,
[FieldType.DATE]: ZDateFieldMeta,
[FieldType.EMAIL]: ZEmailFieldMeta,
[FieldType.NAME]: ZNameFieldMeta,
[FieldType.INITIALS]: ZInitialsFieldMeta,
} as const;
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
const Parser = fieldMetaParsers[field.type as keyof typeof fieldMetaParsers];
const meta = Parser ? Parser.safeParse(field.fieldMeta) : null;
const customFontSize = meta?.success && meta.data.fontSize ? meta.data.fontSize : null;
const longestLineInTextForWidth = field.customText
.split('\n')
.sort((a, b) => b.length - a.length)[0];
let fontSize = customFontSize || maxFontSize;
let textWidth = font.widthOfTextAtSize(longestLineInTextForWidth, fontSize);
const textHeight = font.heightAtSize(fontSize);
const scalingFactor = Math.min(fieldWidth / textWidth, fieldHeight / textHeight, 1);
if (!customFontSize) {
const scalingFactor = Math.min(fieldWidth / textWidth, fieldHeight / textHeight, 1);
fontSize = Math.max(Math.min(fontSize * scalingFactor, maxFontSize), minFontSize);
}
fontSize = Math.max(Math.min(fontSize * scalingFactor, maxFontSize), minFontSize);
textWidth = font.widthOfTextAtSize(longestLineInTextForWidth, fontSize);
let textX = fieldX + (fieldWidth - textWidth) / 2;
@@ -250,17 +276,6 @@ export const insertFieldInPDF = async (pdf: PDFDocument, field: FieldWithSignatu
return pdf;
};
export const insertFieldInPDFBytes = async (
pdf: ArrayBuffer | Uint8Array | string,
field: FieldWithSignature,
) => {
const pdfDoc = await PDFDocument.load(pdf);
await insertFieldInPDF(pdfDoc, field);
return await pdfDoc.save();
};
const adjustPositionForRotation = (
pageWidth: number,
pageHeight: number,

View File

@@ -10,6 +10,7 @@ export async function insertTextInPDF(
positionY: number,
page = 0,
useHandwritingFont = true,
customFontSize?: number,
): Promise<string> {
// Fetch the font file from the public URL.
const fontResponse = await fetch(CAVEAT_FONT_PATH());
@@ -24,7 +25,7 @@ export async function insertTextInPDF(
const pages = pdfDoc.getPages();
const pdfPage = pages[page];
const textSize = useHandwritingFont ? 50 : 15;
const textSize = customFontSize || (useHandwritingFont ? 50 : 15);
const textWidth = font.widthOfTextAtSize(text, textSize);
const textHeight = font.heightAtSize(textSize);
const fieldSize = { width: 250, height: 64 };

View File

@@ -51,7 +51,7 @@ export const createApiToken = async ({
name: tokenName,
token: hashedToken,
expires: expiresIn ? DateTime.now().plus(timeConstantsRecords[expiresIn]).toJSDate() : null,
userId: teamId ? null : userId,
userId,
teamId,
},
});

View File

@@ -25,8 +25,7 @@ export const deleteTokenById = async ({ id, userId, teamId }: DeleteTokenByIdOpt
return await prisma.apiToken.delete({
where: {
id,
userId: teamId ? null : userId,
teamId,
teamId: teamId ?? null,
},
});
};

View File

@@ -8,6 +8,7 @@ export const getUserTokens = async ({ userId }: GetUserTokensOptions) => {
return await prisma.apiToken.findMany({
where: {
userId,
teamId: null,
},
select: {
id: true,

View File

@@ -23,7 +23,8 @@ export const getApiTokenByToken = async ({ token }: { token: string }) => {
throw new Error('Expired token');
}
if (apiToken.team) {
// Handle a silly choice from many moons ago
if (apiToken.team && !apiToken.user) {
apiToken.user = await prisma.user.findFirst({
where: {
id: apiToken.team.ownerUserId,
@@ -33,9 +34,13 @@ export const getApiTokenByToken = async ({ token }: { token: string }) => {
const { user } = apiToken;
// This will never happen but we need to narrow types
if (!user) {
throw new Error('Invalid token');
}
return { ...apiToken, user };
return {
...apiToken,
user,
};
};

View File

@@ -10,6 +10,7 @@ import { nanoid } from '@documenso/lib/universal/id';
import { prisma } from '@documenso/prisma';
import type { Field, Signature } from '@documenso/prisma/client';
import {
DocumentSigningOrder,
DocumentSource,
DocumentStatus,
FieldType,
@@ -17,6 +18,7 @@ import {
RecipientRole,
SendStatus,
SigningStatus,
WebhookTriggerEvents,
} from '@documenso/prisma/client';
import type { TSignFieldWithTokenMutationSchema } from '@documenso/trpc/server/field-router/schema';
@@ -39,6 +41,7 @@ import {
import { formatDocumentsPath } from '../../utils/teams';
import { sendDocument } from '../document/send-document';
import { validateFieldAuth } from '../document/validate-field-auth';
import { triggerWebhook } from '../webhooks/trigger/trigger-webhook';
export type CreateDocumentFromDirectTemplateOptions = {
directRecipientName?: string;
@@ -140,6 +143,7 @@ export const createDocumentFromDirectTemplate = async ({
const metaDateFormat = template.templateMeta?.dateFormat || DEFAULT_DOCUMENT_DATE_FORMAT;
const metaEmailMessage = template.templateMeta?.message || '';
const metaEmailSubject = template.templateMeta?.subject || '';
const metaSigningOrder = template.templateMeta?.signingOrder || DocumentSigningOrder.PARALLEL;
// Associate, validate and map to a query every direct template recipient field with the provided fields.
const createDirectRecipientFieldArgs = await Promise.all(
@@ -254,6 +258,7 @@ export const createDocumentFromDirectTemplate = async ({
recipient.role === RecipientRole.CC
? SigningStatus.SIGNED
: SigningStatus.NOT_SIGNED,
signingOrder: recipient.signingOrder,
token: nanoid(),
};
}),
@@ -265,6 +270,7 @@ export const createDocumentFromDirectTemplate = async ({
dateFormat: metaDateFormat,
message: metaEmailMessage,
subject: metaEmailSubject,
signingOrder: metaSigningOrder,
},
},
},
@@ -328,6 +334,7 @@ export const createDocumentFromDirectTemplate = async ({
signingStatus: SigningStatus.SIGNED,
sendStatus: SendStatus.SENT,
signedAt: initialRequestTime,
signingOrder: directTemplateRecipient.signingOrder,
Field: {
createMany: {
data: directTemplateNonSignatureFields.map(({ templateField, customText }) => ({
@@ -553,6 +560,23 @@ export const createDocumentFromDirectTemplate = async ({
teamId: template.teamId || undefined,
requestMetadata,
});
const updatedDocument = await prisma.document.findFirstOrThrow({
where: {
id: documentId,
},
include: {
documentData: true,
Recipient: true,
},
});
await triggerWebhook({
event: WebhookTriggerEvents.DOCUMENT_SIGNED,
data: updatedDocument,
userId: updatedDocument.userId,
teamId: updatedDocument.teamId ?? undefined,
});
} catch (err) {
console.error('[CREATE_DOCUMENT_FROM_DIRECT_TEMPLATE]:', err);

View File

@@ -24,7 +24,10 @@ import {
} from '../../utils/document-auth';
import { triggerWebhook } from '../webhooks/trigger/trigger-webhook';
type FinalRecipient = Pick<Recipient, 'name' | 'email' | 'role' | 'authOptions'> & {
type FinalRecipient = Pick<
Recipient,
'name' | 'email' | 'role' | 'authOptions' | 'signingOrder'
> & {
templateRecipientId: number;
fields: Field[];
};
@@ -197,6 +200,7 @@ export const createDocumentFromTemplate = async ({
recipient.role === RecipientRole.CC
? SigningStatus.SIGNED
: SigningStatus.NOT_SIGNED,
signingOrder: recipient.signingOrder,
token: nanoid(),
};
}),

View File

@@ -1,3 +1,5 @@
import { omit } from 'remeda';
import { nanoid } from '@documenso/lib/universal/id';
import { prisma } from '@documenso/prisma';
import type { Prisma } from '@documenso/prisma/client';
@@ -38,6 +40,7 @@ export const duplicateTemplate = async ({
Recipient: true,
Field: true,
templateDocumentData: true,
templateMeta: true,
},
});
@@ -53,6 +56,14 @@ export const duplicateTemplate = async ({
},
});
let templateMeta: Prisma.TemplateCreateArgs['data']['templateMeta'] | undefined = undefined;
if (template.templateMeta) {
templateMeta = {
create: omit(template.templateMeta, ['id', 'templateId']),
};
}
const duplicatedTemplate = await prisma.template.create({
data: {
userId,
@@ -66,8 +77,8 @@ export const duplicateTemplate = async ({
token: nanoid(),
})),
},
templateMeta,
},
include: {
Recipient: true,
},

View File

@@ -51,6 +51,11 @@ export const findTemplates = async ({
},
Field: true,
Recipient: true,
templateMeta: {
select: {
signingOrder: true,
},
},
directLink: {
select: {
token: true,

4
packages/lib/translations/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# Compiled translations.
*.js

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: de\n"
"Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-09-16 16:03\n"
"PO-Revision-Date: 2024-11-01 04:00\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -73,11 +73,11 @@ msgstr "Fügen Sie dem Dokument eine externe ID hinzu. Diese kann verwendet werd
msgid "Add an external ID to the template. This can be used to identify in external systems."
msgstr "Fügen Sie der Vorlage eine externe ID hinzu. Diese kann zur Identifizierung in externen Systemen verwendet werden."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:177
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:187
msgid "Add another option"
msgstr "Weitere Option hinzufügen"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:230
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:232
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:167
msgid "Add another value"
msgstr "Weiteren Wert hinzufügen"
@@ -98,11 +98,11 @@ msgstr "Platzhalterempfänger hinzufügen"
msgid "Add Signer"
msgstr "Unterzeichner hinzufügen"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:70
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:73
msgid "Add text"
msgstr "Text hinzufügen"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:75
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:78
msgid "Add text to the field"
msgstr "Text zum Feld hinzufügen"
@@ -115,8 +115,8 @@ msgstr "Admin"
msgid "Advanced Options"
msgstr "Erweiterte Optionen"
#: packages/ui/primitives/document-flow/add-fields.tsx:565
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
#: packages/ui/primitives/document-flow/add-fields.tsx:573
#: packages/ui/primitives/template-flow/add-template-fields.tsx:406
msgid "Advanced settings"
msgstr "Erweiterte Einstellungen"
@@ -124,6 +124,10 @@ msgstr "Erweiterte Einstellungen"
msgid "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email."
msgstr "Nach der Übermittlung wird ein Dokument automatisch generiert und zu Ihrer Dokumentenseite hinzugefügt. Sie erhalten außerdem eine Benachrichtigung per E-Mail."
#: packages/ui/primitives/pdf-viewer.tsx:167
msgid "An error occurred while loading the document."
msgstr "Ein Fehler ist beim Laden des Dokuments aufgetreten."
#: packages/lib/constants/recipient-roles.ts:8
msgid "Approve"
msgstr "Genehmigen"
@@ -136,19 +140,23 @@ msgstr "Genehmigt"
msgid "Approver"
msgstr "Genehmiger"
#: packages/lib/constants/recipient-roles.ts:44
msgid "Approvers"
msgstr "Genehmigende"
#: packages/lib/constants/recipient-roles.ts:10
msgid "Approving"
msgstr "Genehmigung"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:276
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
msgid "Black"
msgstr "Schwarz"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:290
#: packages/ui/primitives/signature-pad/signature-pad.tsx:391
msgid "Blue"
msgstr "Blau"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:287
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58
msgid "Cancel"
msgstr "Abbrechen"
@@ -157,10 +165,6 @@ msgstr "Abbrechen"
msgid "Cannot remove signer"
msgstr "Unterzeichner kann nicht entfernt werden"
#: packages/ui/primitives/document-flow/add-signers.tsx:221
#~ msgid "Cannot update signer because they have already signed a field"
#~ msgstr ""
#: packages/lib/constants/recipient-roles.ts:17
msgid "Cc"
msgstr "Cc"
@@ -174,16 +178,15 @@ msgstr "CC"
msgid "CC'd"
msgstr "CC'd"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:83
#: packages/lib/constants/recipient-roles.ts:51
msgid "Ccers"
msgstr "Ccers"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:86
msgid "Character Limit"
msgstr "Zeichenbeschränkung"
#: packages/ui/primitives/document-flow/add-fields.tsx:993
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
msgid "Checkbox"
msgstr "Checkbox"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:195
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:197
msgid "Checkbox values"
msgstr "Checkbox-Werte"
@@ -191,7 +194,7 @@ msgstr "Checkbox-Werte"
msgid "Clear filters"
msgstr "Filter löschen"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:310
#: packages/ui/primitives/signature-pad/signature-pad.tsx:411
msgid "Clear Signature"
msgstr "Unterschrift löschen"
@@ -207,8 +210,8 @@ msgstr "Schließen"
msgid "Configure Direct Recipient"
msgstr "Direkten Empfänger konfigurieren"
#: packages/ui/primitives/document-flow/add-fields.tsx:566
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
#: packages/ui/primitives/document-flow/add-fields.tsx:574
#: packages/ui/primitives/template-flow/add-template-fields.tsx:407
msgid "Configure the {0} field"
msgstr "Konfigurieren Sie das Feld {0}"
@@ -220,12 +223,17 @@ msgstr "Fortsetzen"
msgid "Copied to clipboard"
msgstr "In die Zwischenablage kopiert"
#: packages/ui/components/document/document-share-button.tsx:194
msgid "Copy Link"
msgstr "Link kopieren"
#: packages/ui/primitives/document-flow/add-signature.tsx:360
msgid "Custom Text"
msgstr "Benutzerdefinierter Text"
#: packages/ui/primitives/document-flow/add-fields.tsx:889
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
#: packages/ui/primitives/document-flow/add-fields.tsx:927
#: packages/ui/primitives/document-flow/types.ts:53
#: packages/ui/primitives/template-flow/add-template-fields.tsx:690
msgid "Date"
msgstr "Datum"
@@ -256,31 +264,37 @@ msgstr "Herunterladen"
msgid "Drag & drop your PDF here."
msgstr "Ziehen Sie Ihr PDF hierher."
#: packages/ui/primitives/document-flow/add-fields.tsx:1019
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
#: packages/ui/primitives/document-flow/add-fields.tsx:1058
#: packages/ui/primitives/template-flow/add-template-fields.tsx:820
msgid "Dropdown"
msgstr "Dropdown"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:148
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:158
msgid "Dropdown options"
msgstr "Dropdown-Optionen"
#: packages/ui/primitives/document-flow/add-fields.tsx:837
#: packages/ui/primitives/document-flow/add-fields.tsx:875
#: packages/ui/primitives/document-flow/add-signature.tsx:272
#: packages/ui/primitives/document-flow/add-signers.tsx:500
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
#: packages/ui/primitives/document-flow/add-signers.tsx:507
#: packages/ui/primitives/document-flow/types.ts:54
#: packages/ui/primitives/template-flow/add-template-fields.tsx:638
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:463
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:470
msgid "Email"
msgstr "E-Mail"
#: packages/ui/primitives/document-flow/add-signature.types.ts:7
msgid "Email is required"
msgstr "E-Mail ist erforderlich"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:184
msgid "Email Options"
msgstr "E-Mail-Optionen"
#: packages/ui/primitives/document-flow/add-fields.tsx:1082
#: packages/ui/primitives/document-flow/add-fields.tsx:1123
msgid "Empty field"
msgstr ""
msgstr "Leeres Feld"
#: packages/lib/constants/template.ts:8
msgid "Enable Direct Link Signing"
@@ -291,11 +305,16 @@ msgstr "Direktlink-Signierung aktivieren"
msgid "Enable signing order"
msgstr "Aktiviere die Signaturreihenfolge"
#: packages/ui/primitives/document-flow/add-fields.tsx:795
msgid "Enable Typed Signatures"
msgstr "Aktivieren Sie getippte Unterschriften"
#: packages/ui/primitives/document-password-dialog.tsx:84
msgid "Enter password"
msgstr "Passwort eingeben"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:216
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:257
#: packages/ui/primitives/pdf-viewer.tsx:166
msgid "Error"
msgstr "Fehler"
@@ -304,26 +323,48 @@ msgstr "Fehler"
msgid "External ID"
msgstr "Externe ID"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:217
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:258
msgid "Failed to save settings."
msgstr "Einstellungen konnten nicht gespeichert werden."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:90
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93
msgid "Field character limit"
msgstr "Zeichenbeschränkung des Feldes"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:107
#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:62
#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:44
#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:44
#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:44
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107
msgid "Field font size"
msgstr "Feldschriftgröße"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:110
msgid "Field format"
msgstr "Feldformat"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:50
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:53
msgid "Field label"
msgstr "Feldbeschriftung"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:62
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:65
msgid "Field placeholder"
msgstr "Feldplatzhalter"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:56
#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:38
#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:38
#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:38
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101
msgid "Font Size"
msgstr "Schriftgröße"
#: packages/ui/primitives/document-flow/types.ts:50
msgid "Free Signature"
msgstr "Freie Unterschrift"
#: packages/ui/components/document/document-global-auth-action-select.tsx:64
msgid "Global recipient action authentication"
msgstr "Globale Empfängerauthentifizierung"
@@ -332,46 +373,59 @@ msgstr "Globale Empfängerauthentifizierung"
msgid "Go Back"
msgstr "Zurück"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:297
#: packages/ui/primitives/signature-pad/signature-pad.tsx:398
msgid "Green"
msgstr "Grün"
#: packages/lib/constants/recipient-roles.ts:72
#: packages/lib/constants/recipient-roles.ts:76
msgid "I am a signer of this document"
msgstr "Ich bin ein Unterzeichner dieses Dokuments"
#: packages/lib/constants/recipient-roles.ts:75
#: packages/lib/constants/recipient-roles.ts:79
msgid "I am a viewer of this document"
msgstr "Ich bin ein Betrachter dieses Dokuments"
#: packages/lib/constants/recipient-roles.ts:73
#: packages/lib/constants/recipient-roles.ts:77
msgid "I am an approver of this document"
msgstr "Ich bin ein Genehmiger dieses Dokuments"
#: packages/lib/constants/recipient-roles.ts:74
#: packages/lib/constants/recipient-roles.ts:78
msgid "I am required to receive a copy of this document"
msgstr "Ich bin verpflichtet, eine Kopie dieses Dokuments zu erhalten"
#: packages/lib/constants/recipient-roles.ts:74
#~ msgid "I am required to recieve a copy of this document"
#~ msgstr "I am required to recieve a copy of this document"
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:29
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:87
msgid "Inherit authentication method"
msgstr "Authentifizierungsmethode erben"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:64
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:69
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:45
#: packages/ui/primitives/document-flow/types.ts:51
msgid "Initials"
msgstr "Initialen"
#: packages/ui/primitives/document-flow/add-signers.types.ts:17
msgid "Invalid email"
msgstr "Ungültige E-Mail"
#: packages/ui/primitives/document-flow/add-signature.types.ts:8
msgid "Invalid email address"
msgstr "Ungültige E-Mail-Adresse"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48
msgid "Label"
msgstr "Beschriftung"
#: packages/ui/primitives/lazy-pdf-viewer.tsx:15
#: packages/ui/primitives/pdf-viewer.tsx:44
msgid "Loading document..."
msgstr "Lade Dokument..."
#: packages/lib/constants/teams.ts:11
msgid "Manager"
msgstr "Manager"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:168
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188
msgid "Max"
msgstr "Max"
@@ -384,15 +438,16 @@ msgstr "Mitglied"
msgid "Message <0>(Optional)</0>"
msgstr "Nachricht <0>(Optional)</0>"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:156
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:176
msgid "Min"
msgstr "Min"
#: packages/ui/primitives/document-flow/add-fields.tsx:863
#: packages/ui/primitives/document-flow/add-fields.tsx:901
#: packages/ui/primitives/document-flow/add-signature.tsx:298
#: packages/ui/primitives/document-flow/add-signers.tsx:535
#: packages/ui/primitives/document-flow/add-signers.tsx:541
#: packages/ui/primitives/template-flow/add-template-fields.tsx:658
#: packages/ui/primitives/document-flow/types.ts:55
#: packages/ui/primitives/template-flow/add-template-fields.tsx:664
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:498
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:504
msgid "Name"
@@ -410,13 +465,13 @@ msgstr "Muss unterzeichnen"
msgid "Needs to view"
msgstr "Muss sehen"
#: packages/ui/primitives/document-flow/add-fields.tsx:674
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
#: packages/ui/primitives/document-flow/add-fields.tsx:686
#: packages/ui/primitives/template-flow/add-template-fields.tsx:504
msgid "No recipient matching this description was found."
msgstr "Kein passender Empfänger mit dieser Beschreibung gefunden."
#: packages/ui/primitives/document-flow/add-fields.tsx:690
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
#: packages/ui/primitives/document-flow/add-fields.tsx:701
#: packages/ui/primitives/template-flow/add-template-fields.tsx:519
msgid "No recipients with this role"
msgstr "Keine Empfänger mit dieser Rolle"
@@ -440,12 +495,13 @@ msgstr "Kein Unterschriftsfeld gefunden"
msgid "No value found."
msgstr "Kein Wert gefunden."
#: packages/ui/primitives/document-flow/add-fields.tsx:941
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
#: packages/ui/primitives/document-flow/add-fields.tsx:979
#: packages/ui/primitives/document-flow/types.ts:56
#: packages/ui/primitives/template-flow/add-template-fields.tsx:742
msgid "Number"
msgstr "Nummer"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:100
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:103
msgid "Number format"
msgstr "Zahlenformat"
@@ -461,22 +517,30 @@ msgstr "Sobald Ihre Vorlage eingerichtet ist, teilen Sie den Link überall, wo S
msgid "Page {0} of {1}"
msgstr "Seite {0} von {1}"
#: packages/ui/primitives/pdf-viewer.tsx:259
msgid "Page {0} of {numPages}"
msgstr "Seite {0} von {numPages}"
#: packages/ui/primitives/document-password-dialog.tsx:62
msgid "Password Required"
msgstr "Passwort erforderlich"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:154
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156
msgid "Pick a number"
msgstr "Wählen Sie eine Zahl"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:76
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:81
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:57
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:79
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:84
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60
msgid "Placeholder"
msgstr "Platzhalter"
#: packages/ui/primitives/document-flow/add-fields.tsx:967
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
#: packages/ui/primitives/pdf-viewer.tsx:223
#: packages/ui/primitives/pdf-viewer.tsx:238
msgid "Please try again or contact our support."
msgstr "Bitte versuchen Sie es erneut oder kontaktieren Sie unseren Support."
#: packages/ui/primitives/template-flow/add-template-fields.tsx:768
msgid "Radio"
msgstr "Radio"
@@ -484,11 +548,11 @@ msgstr "Radio"
msgid "Radio values"
msgstr "Radio-Werte"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:184
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:136
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:186
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:147
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:156
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:122
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:114
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:133
msgid "Read only"
msgstr "Nur lesen"
@@ -502,7 +566,7 @@ msgstr "Erhält Kopie"
msgid "Recipient action authentication"
msgstr "Empfängeraktion Authentifizierung"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:283
#: packages/ui/primitives/signature-pad/signature-pad.tsx:384
msgid "Red"
msgstr "Rot"
@@ -511,27 +575,31 @@ msgstr "Rot"
msgid "Redirect URL"
msgstr "Weiterleitungs-URL"
#: packages/ui/primitives/document-flow/add-fields.tsx:1069
#: packages/ui/primitives/document-flow/add-fields.tsx:1110
msgid "Remove"
msgstr "Entfernen"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:174
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:127
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:126
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:176
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:146
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:112
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:104
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:123
msgid "Required field"
msgstr "Pflichtfeld"
#: packages/ui/components/document/document-share-button.tsx:147
msgid "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!"
msgstr "Seien Sie versichert, Ihr Dokument ist streng vertraulich und wird niemals geteilt. Nur Ihre Unterzeichnungserfahrung wird hervorgehoben. Teilen Sie Ihre personalisierte Unterschriftkarte, um Ihre Unterschrift zu präsentieren!"
#: packages/ui/primitives/data-table-pagination.tsx:55
msgid "Rows per page"
msgstr "Zeilen pro Seite"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:286
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:355
msgid "Save"
msgstr "Speichern"
#: packages/ui/primitives/template-flow/add-template-fields.tsx:848
#: packages/ui/primitives/template-flow/add-template-fields.tsx:854
msgid "Save Template"
msgstr "Vorlage speichern"
@@ -539,7 +607,7 @@ msgstr "Vorlage speichern"
msgid "Search languages..."
msgstr "Sprachen suchen..."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:105
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:115
msgid "Select"
msgstr "Auswählen"
@@ -547,11 +615,11 @@ msgstr "Auswählen"
msgid "Select an option"
msgstr "Option auswählen"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:137
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:139
msgid "Select at least"
msgstr "Wählen Sie mindestens"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:95
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:105
msgid "Select default option"
msgstr "Standardoption auswählen"
@@ -573,6 +641,10 @@ msgstr "Unterschriftenkarte teilen"
msgid "Share the Link"
msgstr "Link teilen"
#: packages/ui/components/document/document-share-button.tsx:143
msgid "Share your signing experience!"
msgstr "Teilen Sie Ihre Unterzeichnungserfahrung!"
#: packages/ui/primitives/document-flow/add-signers.tsx:680
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:655
msgid "Show advanced settings"
@@ -582,10 +654,11 @@ msgstr "Erweiterte Einstellungen anzeigen"
msgid "Sign"
msgstr "Unterschreiben"
#: packages/ui/primitives/document-flow/add-fields.tsx:785
#: packages/ui/primitives/document-flow/add-fields.tsx:823
#: packages/ui/primitives/document-flow/add-signature.tsx:323
#: packages/ui/primitives/document-flow/field-icon.tsx:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
#: packages/ui/primitives/document-flow/types.ts:49
#: packages/ui/primitives/template-flow/add-template-fields.tsx:586
msgid "Signature"
msgstr "Unterschrift"
@@ -597,6 +670,14 @@ msgstr "Unterzeichnet"
msgid "Signer"
msgstr "Unterzeichner"
#: packages/lib/constants/recipient-roles.ts:58
msgid "Signers"
msgstr "Unterzeichner"
#: packages/ui/primitives/document-flow/add-signers.types.ts:36
msgid "Signers must have unique emails"
msgstr "Unterzeichner müssen eindeutige E-Mails haben"
#: packages/lib/constants/recipient-roles.ts:22
msgid "Signing"
msgstr "Unterzeichnung"
@@ -609,6 +690,11 @@ msgstr "Einige Unterzeichner haben noch kein Unterschriftsfeld zugewiesen bekomm
msgid "Something went wrong"
msgstr "Etwas ist schief gelaufen"
#: packages/ui/primitives/pdf-viewer.tsx:220
#: packages/ui/primitives/pdf-viewer.tsx:235
msgid "Something went wrong while loading the document."
msgstr "Beim Laden des Dokuments ist ein Fehler aufgetreten."
#: packages/ui/primitives/data-table.tsx:136
msgid "Something went wrong."
msgstr "Etwas ist schief gelaufen."
@@ -630,8 +716,9 @@ msgstr "Einreichen"
msgid "Template title"
msgstr "Vorlagentitel"
#: packages/ui/primitives/document-flow/add-fields.tsx:915
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
#: packages/ui/primitives/document-flow/add-fields.tsx:953
#: packages/ui/primitives/document-flow/types.ts:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:716
msgid "Text"
msgstr "Text"
@@ -691,7 +778,7 @@ msgstr "Der Name des Unterzeichners"
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
msgstr "Dies kann überschrieben werden, indem die Authentifizierungsanforderungen im nächsten Schritt direkt für jeden Empfänger festgelegt werden."
#: packages/ui/primitives/document-flow/add-fields.tsx:746
#: packages/ui/primitives/document-flow/add-fields.tsx:757
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
msgstr "Dieses Dokument wurde bereits an diesen Empfänger gesendet. Sie können diesen Empfänger nicht mehr bearbeiten."
@@ -703,17 +790,13 @@ msgstr "Dieses Dokument ist durch ein Passwort geschützt. Bitte geben Sie das P
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
msgstr "Dieses Feld kann nicht geändert oder gelöscht werden. Wenn Sie den direkten Link dieser Vorlage teilen oder zu Ihrem öffentlichen Profil hinzufügen, kann jeder, der darauf zugreift, seinen Namen und seine E-Mail-Adresse eingeben und die ihm zugewiesenen Felder ausfüllen."
#: packages/ui/primitives/document-flow/add-fields.tsx:1050
#: packages/ui/primitives/document-flow/add-fields.tsx:1090
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
msgstr ""
#: packages/ui/primitives/document-flow/add-signers.tsx:195
#~ msgid "This signer has already received the document."
#~ msgstr "Dieser Unterzeichner hat das Dokument bereits erhalten."
msgstr "Dieser Empfänger kann nicht mehr bearbeitet werden, da er ein Feld unterschrieben oder das Dokument abgeschlossen hat."
#: packages/ui/primitives/document-flow/add-signers.tsx:194
msgid "This signer has already signed the document."
msgstr ""
msgstr "Dieser Unterzeichner hat das Dokument bereits unterschrieben."
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:48
msgid "This will override any global settings."
@@ -728,8 +811,8 @@ msgstr "Zeitzone"
msgid "Title"
msgstr "Titel"
#: packages/ui/primitives/document-flow/add-fields.tsx:1033
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
#: packages/ui/primitives/document-flow/add-fields.tsx:1073
#: packages/ui/primitives/template-flow/add-template-fields.tsx:834
msgid "To proceed further, please set at least one value for the {0} field."
msgstr "Um fortzufahren, legen Sie bitte mindestens einen Wert für das Feld {0} fest."
@@ -749,35 +832,35 @@ msgstr "Upgrade"
msgid "Upload Template Document"
msgstr "Vorlagendokument hochladen"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:130
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:147
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:132
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167
msgid "Validation"
msgstr "Validierung"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:88
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:93
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:91
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:96
msgid "Value"
msgstr "Wert"
#: packages/lib/constants/recipient-roles.ts:26
msgid "View"
msgstr "View"
msgstr "Betrachten"
#: packages/lib/constants/recipient-roles.ts:27
msgid "Viewed"
msgstr "Viewed"
msgstr "Betrachtet"
#: packages/lib/constants/recipient-roles.ts:29
msgid "Viewer"
msgstr "Viewer"
msgstr "Betrachter"
#: packages/lib/constants/recipient-roles.ts:65
msgid "Viewers"
msgstr "Betrachter"
#: packages/lib/constants/recipient-roles.ts:28
msgid "Viewing"
msgstr "Viewing"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:280
#~ msgid "White"
#~ msgstr "White"
msgstr "Betrachten"
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:44
msgid "You are about to send this document to the recipients. Are you sure you want to continue?"
@@ -794,3 +877,4 @@ msgstr "Sie können derzeit keine Dokumente hochladen."
#: packages/ui/primitives/document-dropzone.tsx:69
msgid "You have reached your document limit."
msgstr "Sie haben Ihr Dokumentenlimit erreicht."

File diff suppressed because one or more lines are too long

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: de\n"
"Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-09-16 14:04\n"
"PO-Revision-Date: 2024-11-01 02:29\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -160,10 +160,6 @@ msgstr "Dokumentation"
msgid "Easily embed Documenso into your product. Simply copy and paste our react widget into your application."
msgstr "Betten Sie Documenso ganz einfach in Ihr Produkt ein. Kopieren und fügen Sie einfach unser React-Widget in Ihre Anwendung ein."
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:42
#~ msgid "Easy Sharing (Soon)."
#~ msgstr "Easy Sharing (Soon)."
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:46
msgid "Easy Sharing."
msgstr "Einfaches Teilen."
@@ -377,18 +373,10 @@ msgstr "Unsere benutzerdefinierten Vorlagen verfügen über intelligente Regeln,
msgid "Our Enterprise License is great for large organizations looking to switch to Documenso for all their signing needs. It's available for our cloud offering as well as self-hosted setups and offers a wide range of compliance and Adminstration Features."
msgstr "Unsere Enterprise-Lizenz ist ideal für große Organisationen, die auf Documenso für all ihre Signaturanforderungen umsteigen möchten. Sie ist sowohl für unser Cloud-Angebot als auch für selbstgehostete Setups verfügbar und bietet eine breite Palette an Compliance- und Verwaltungsfunktionen."
#: apps/marketing/src/components/(marketing)/enterprise.tsx:20
#~ msgid "Our Enterprise License is great large organizations looking to switch to Documenso for all their signing needs. It's availible for our cloud offering as well as self-hosted setups and offer a wide range of compliance and Adminstration Features."
#~ msgstr "Our Enterprise License is great large organizations looking to switch to Documenso for all their signing needs. It's availible for our cloud offering as well as self-hosted setups and offer a wide range of compliance and Adminstration Features."
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:65
msgid "Our self-hosted option is great for small teams and individuals who need a simple solution. You can use our docker based setup to get started in minutes. Take control with full customizability and data ownership."
msgstr "Unsere selbstgehostete Option ist ideal für kleine Teams und Einzelpersonen, die eine einfache Lösung benötigen. Sie können unser docker-basiertes Setup verwenden, um in wenigen Minuten loszulegen. Übernehmen Sie die Kontrolle mit vollständiger Anpassbarkeit und Datenhoheit."
#: apps/marketing/src/app/(marketing)/open/data.ts:25
#~ msgid "Part-Time"
#~ msgstr "Teilzeit"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:151
msgid "Premium Profile Name"
msgstr "Premium Profilname"
@@ -430,10 +418,6 @@ msgstr "Gehalt"
msgid "Save $60 or $120"
msgstr "Sparen Sie $60 oder $120"
#: apps/marketing/src/components/(marketing)/i18n-switcher.tsx:47
#~ msgid "Search languages..."
#~ msgstr "Search languages..."
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:109
msgid "Securely. Our data centers are located in Frankfurt (Germany), giving us the best local privacy laws. We are very aware of the sensitive nature of our data and follow best practices to ensure the security and integrity of the data entrusted to us."
msgstr "Sicher. Unsere Rechenzentren befinden sich in Frankfurt (Deutschland) und bieten uns die besten lokalen Datenschutzgesetze. Uns ist die sensible Natur unserer Daten sehr bewusst und wir folgen bewährten Praktiken, um die Sicherheit und Integrität der uns anvertrauten Daten zu gewährleisten."
@@ -618,3 +602,4 @@ msgstr "Sie können Documenso kostenlos selbst hosten oder unsere sofort einsatz
#: apps/marketing/src/components/(marketing)/carousel.tsx:272
msgid "Your browser does not support the video tag."
msgstr "Ihr Browser unterstützt das Video-Tag nicht."

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -68,11 +68,11 @@ msgstr "Add an external ID to the document. This can be used to identify the doc
msgid "Add an external ID to the template. This can be used to identify in external systems."
msgstr "Add an external ID to the template. This can be used to identify in external systems."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:177
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:187
msgid "Add another option"
msgstr "Add another option"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:230
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:232
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:167
msgid "Add another value"
msgstr "Add another value"
@@ -93,11 +93,11 @@ msgstr "Add Placeholder Recipient"
msgid "Add Signer"
msgstr "Add Signer"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:70
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:73
msgid "Add text"
msgstr "Add text"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:75
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:78
msgid "Add text to the field"
msgstr "Add text to the field"
@@ -110,8 +110,8 @@ msgstr "Admin"
msgid "Advanced Options"
msgstr "Advanced Options"
#: packages/ui/primitives/document-flow/add-fields.tsx:565
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
#: packages/ui/primitives/document-flow/add-fields.tsx:573
#: packages/ui/primitives/template-flow/add-template-fields.tsx:406
msgid "Advanced settings"
msgstr "Advanced settings"
@@ -119,6 +119,10 @@ msgstr "Advanced settings"
msgid "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email."
msgstr "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email."
#: packages/ui/primitives/pdf-viewer.tsx:167
msgid "An error occurred while loading the document."
msgstr "An error occurred while loading the document."
#: packages/lib/constants/recipient-roles.ts:8
msgid "Approve"
msgstr "Approve"
@@ -131,19 +135,23 @@ msgstr "Approved"
msgid "Approver"
msgstr "Approver"
#: packages/lib/constants/recipient-roles.ts:44
msgid "Approvers"
msgstr "Approvers"
#: packages/lib/constants/recipient-roles.ts:10
msgid "Approving"
msgstr "Approving"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:276
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
msgid "Black"
msgstr "Black"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:290
#: packages/ui/primitives/signature-pad/signature-pad.tsx:391
msgid "Blue"
msgstr "Blue"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:287
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58
msgid "Cancel"
msgstr "Cancel"
@@ -152,10 +160,6 @@ msgstr "Cancel"
msgid "Cannot remove signer"
msgstr "Cannot remove signer"
#: packages/ui/primitives/document-flow/add-signers.tsx:221
#~ msgid "Cannot update signer because they have already signed a field"
#~ msgstr "Cannot update signer because they have already signed a field"
#: packages/lib/constants/recipient-roles.ts:17
msgid "Cc"
msgstr "Cc"
@@ -169,16 +173,15 @@ msgstr "CC"
msgid "CC'd"
msgstr "CC'd"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:83
#: packages/lib/constants/recipient-roles.ts:51
msgid "Ccers"
msgstr "Ccers"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:86
msgid "Character Limit"
msgstr "Character Limit"
#: packages/ui/primitives/document-flow/add-fields.tsx:993
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
msgid "Checkbox"
msgstr "Checkbox"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:195
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:197
msgid "Checkbox values"
msgstr "Checkbox values"
@@ -186,7 +189,7 @@ msgstr "Checkbox values"
msgid "Clear filters"
msgstr "Clear filters"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:310
#: packages/ui/primitives/signature-pad/signature-pad.tsx:411
msgid "Clear Signature"
msgstr "Clear Signature"
@@ -202,8 +205,8 @@ msgstr "Close"
msgid "Configure Direct Recipient"
msgstr "Configure Direct Recipient"
#: packages/ui/primitives/document-flow/add-fields.tsx:566
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
#: packages/ui/primitives/document-flow/add-fields.tsx:574
#: packages/ui/primitives/template-flow/add-template-fields.tsx:407
msgid "Configure the {0} field"
msgstr "Configure the {0} field"
@@ -215,12 +218,17 @@ msgstr "Continue"
msgid "Copied to clipboard"
msgstr "Copied to clipboard"
#: packages/ui/components/document/document-share-button.tsx:194
msgid "Copy Link"
msgstr "Copy Link"
#: packages/ui/primitives/document-flow/add-signature.tsx:360
msgid "Custom Text"
msgstr "Custom Text"
#: packages/ui/primitives/document-flow/add-fields.tsx:889
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
#: packages/ui/primitives/document-flow/add-fields.tsx:927
#: packages/ui/primitives/document-flow/types.ts:53
#: packages/ui/primitives/template-flow/add-template-fields.tsx:690
msgid "Date"
msgstr "Date"
@@ -251,29 +259,35 @@ msgstr "Download"
msgid "Drag & drop your PDF here."
msgstr "Drag & drop your PDF here."
#: packages/ui/primitives/document-flow/add-fields.tsx:1019
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
#: packages/ui/primitives/document-flow/add-fields.tsx:1058
#: packages/ui/primitives/template-flow/add-template-fields.tsx:820
msgid "Dropdown"
msgstr "Dropdown"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:148
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:158
msgid "Dropdown options"
msgstr "Dropdown options"
#: packages/ui/primitives/document-flow/add-fields.tsx:837
#: packages/ui/primitives/document-flow/add-fields.tsx:875
#: packages/ui/primitives/document-flow/add-signature.tsx:272
#: packages/ui/primitives/document-flow/add-signers.tsx:500
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
#: packages/ui/primitives/document-flow/add-signers.tsx:507
#: packages/ui/primitives/document-flow/types.ts:54
#: packages/ui/primitives/template-flow/add-template-fields.tsx:638
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:463
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:470
msgid "Email"
msgstr "Email"
#: packages/ui/primitives/document-flow/add-signature.types.ts:7
msgid "Email is required"
msgstr "Email is required"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:184
msgid "Email Options"
msgstr "Email Options"
#: packages/ui/primitives/document-flow/add-fields.tsx:1082
#: packages/ui/primitives/document-flow/add-fields.tsx:1123
msgid "Empty field"
msgstr "Empty field"
@@ -286,11 +300,16 @@ msgstr "Enable Direct Link Signing"
msgid "Enable signing order"
msgstr "Enable signing order"
#: packages/ui/primitives/document-flow/add-fields.tsx:795
msgid "Enable Typed Signatures"
msgstr "Enable Typed Signatures"
#: packages/ui/primitives/document-password-dialog.tsx:84
msgid "Enter password"
msgstr "Enter password"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:216
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:257
#: packages/ui/primitives/pdf-viewer.tsx:166
msgid "Error"
msgstr "Error"
@@ -299,26 +318,48 @@ msgstr "Error"
msgid "External ID"
msgstr "External ID"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:217
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:258
msgid "Failed to save settings."
msgstr "Failed to save settings."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:90
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93
msgid "Field character limit"
msgstr "Field character limit"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:107
#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:62
#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:44
#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:44
#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:44
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107
msgid "Field font size"
msgstr "Field font size"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:110
msgid "Field format"
msgstr "Field format"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:50
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:53
msgid "Field label"
msgstr "Field label"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:62
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:65
msgid "Field placeholder"
msgstr "Field placeholder"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:56
#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:38
#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:38
#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:38
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101
msgid "Font Size"
msgstr "Font Size"
#: packages/ui/primitives/document-flow/types.ts:50
msgid "Free Signature"
msgstr "Free Signature"
#: packages/ui/components/document/document-global-auth-action-select.tsx:64
msgid "Global recipient action authentication"
msgstr "Global recipient action authentication"
@@ -327,46 +368,59 @@ msgstr "Global recipient action authentication"
msgid "Go Back"
msgstr "Go Back"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:297
#: packages/ui/primitives/signature-pad/signature-pad.tsx:398
msgid "Green"
msgstr "Green"
#: packages/lib/constants/recipient-roles.ts:72
#: packages/lib/constants/recipient-roles.ts:76
msgid "I am a signer of this document"
msgstr "I am a signer of this document"
#: packages/lib/constants/recipient-roles.ts:75
#: packages/lib/constants/recipient-roles.ts:79
msgid "I am a viewer of this document"
msgstr "I am a viewer of this document"
#: packages/lib/constants/recipient-roles.ts:73
#: packages/lib/constants/recipient-roles.ts:77
msgid "I am an approver of this document"
msgstr "I am an approver of this document"
#: packages/lib/constants/recipient-roles.ts:74
#: packages/lib/constants/recipient-roles.ts:78
msgid "I am required to receive a copy of this document"
msgstr "I am required to receive a copy of this document"
#: packages/lib/constants/recipient-roles.ts:74
#~ msgid "I am required to recieve a copy of this document"
#~ msgstr "I am required to recieve a copy of this document"
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:29
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:87
msgid "Inherit authentication method"
msgstr "Inherit authentication method"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:64
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:69
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:45
#: packages/ui/primitives/document-flow/types.ts:51
msgid "Initials"
msgstr "Initials"
#: packages/ui/primitives/document-flow/add-signers.types.ts:17
msgid "Invalid email"
msgstr "Invalid email"
#: packages/ui/primitives/document-flow/add-signature.types.ts:8
msgid "Invalid email address"
msgstr "Invalid email address"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48
msgid "Label"
msgstr "Label"
#: packages/ui/primitives/lazy-pdf-viewer.tsx:15
#: packages/ui/primitives/pdf-viewer.tsx:44
msgid "Loading document..."
msgstr "Loading document..."
#: packages/lib/constants/teams.ts:11
msgid "Manager"
msgstr "Manager"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:168
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188
msgid "Max"
msgstr "Max"
@@ -379,15 +433,16 @@ msgstr "Member"
msgid "Message <0>(Optional)</0>"
msgstr "Message <0>(Optional)</0>"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:156
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:176
msgid "Min"
msgstr "Min"
#: packages/ui/primitives/document-flow/add-fields.tsx:863
#: packages/ui/primitives/document-flow/add-fields.tsx:901
#: packages/ui/primitives/document-flow/add-signature.tsx:298
#: packages/ui/primitives/document-flow/add-signers.tsx:535
#: packages/ui/primitives/document-flow/add-signers.tsx:541
#: packages/ui/primitives/template-flow/add-template-fields.tsx:658
#: packages/ui/primitives/document-flow/types.ts:55
#: packages/ui/primitives/template-flow/add-template-fields.tsx:664
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:498
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:504
msgid "Name"
@@ -405,13 +460,13 @@ msgstr "Needs to sign"
msgid "Needs to view"
msgstr "Needs to view"
#: packages/ui/primitives/document-flow/add-fields.tsx:674
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
#: packages/ui/primitives/document-flow/add-fields.tsx:686
#: packages/ui/primitives/template-flow/add-template-fields.tsx:504
msgid "No recipient matching this description was found."
msgstr "No recipient matching this description was found."
#: packages/ui/primitives/document-flow/add-fields.tsx:690
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
#: packages/ui/primitives/document-flow/add-fields.tsx:701
#: packages/ui/primitives/template-flow/add-template-fields.tsx:519
msgid "No recipients with this role"
msgstr "No recipients with this role"
@@ -435,12 +490,13 @@ msgstr "No signature field found"
msgid "No value found."
msgstr "No value found."
#: packages/ui/primitives/document-flow/add-fields.tsx:941
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
#: packages/ui/primitives/document-flow/add-fields.tsx:979
#: packages/ui/primitives/document-flow/types.ts:56
#: packages/ui/primitives/template-flow/add-template-fields.tsx:742
msgid "Number"
msgstr "Number"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:100
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:103
msgid "Number format"
msgstr "Number format"
@@ -456,22 +512,30 @@ msgstr "Once your template is set up, share the link anywhere you want. The pers
msgid "Page {0} of {1}"
msgstr "Page {0} of {1}"
#: packages/ui/primitives/pdf-viewer.tsx:259
msgid "Page {0} of {numPages}"
msgstr "Page {0} of {numPages}"
#: packages/ui/primitives/document-password-dialog.tsx:62
msgid "Password Required"
msgstr "Password Required"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:154
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156
msgid "Pick a number"
msgstr "Pick a number"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:76
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:81
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:57
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:79
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:84
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60
msgid "Placeholder"
msgstr "Placeholder"
#: packages/ui/primitives/document-flow/add-fields.tsx:967
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
#: packages/ui/primitives/pdf-viewer.tsx:223
#: packages/ui/primitives/pdf-viewer.tsx:238
msgid "Please try again or contact our support."
msgstr "Please try again or contact our support."
#: packages/ui/primitives/template-flow/add-template-fields.tsx:768
msgid "Radio"
msgstr "Radio"
@@ -479,11 +543,11 @@ msgstr "Radio"
msgid "Radio values"
msgstr "Radio values"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:184
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:136
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:186
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:147
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:156
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:122
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:114
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:133
msgid "Read only"
msgstr "Read only"
@@ -497,7 +561,7 @@ msgstr "Receives copy"
msgid "Recipient action authentication"
msgstr "Recipient action authentication"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:283
#: packages/ui/primitives/signature-pad/signature-pad.tsx:384
msgid "Red"
msgstr "Red"
@@ -506,27 +570,31 @@ msgstr "Red"
msgid "Redirect URL"
msgstr "Redirect URL"
#: packages/ui/primitives/document-flow/add-fields.tsx:1069
#: packages/ui/primitives/document-flow/add-fields.tsx:1110
msgid "Remove"
msgstr "Remove"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:174
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:127
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:126
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:176
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:146
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:112
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:104
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:123
msgid "Required field"
msgstr "Required field"
#: packages/ui/components/document/document-share-button.tsx:147
msgid "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!"
msgstr "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!"
#: packages/ui/primitives/data-table-pagination.tsx:55
msgid "Rows per page"
msgstr "Rows per page"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:286
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:355
msgid "Save"
msgstr "Save"
#: packages/ui/primitives/template-flow/add-template-fields.tsx:848
#: packages/ui/primitives/template-flow/add-template-fields.tsx:854
msgid "Save Template"
msgstr "Save Template"
@@ -534,7 +602,7 @@ msgstr "Save Template"
msgid "Search languages..."
msgstr "Search languages..."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:105
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:115
msgid "Select"
msgstr "Select"
@@ -542,11 +610,11 @@ msgstr "Select"
msgid "Select an option"
msgstr "Select an option"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:137
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:139
msgid "Select at least"
msgstr "Select at least"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:95
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:105
msgid "Select default option"
msgstr "Select default option"
@@ -568,6 +636,10 @@ msgstr "Share Signature Card"
msgid "Share the Link"
msgstr "Share the Link"
#: packages/ui/components/document/document-share-button.tsx:143
msgid "Share your signing experience!"
msgstr "Share your signing experience!"
#: packages/ui/primitives/document-flow/add-signers.tsx:680
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:655
msgid "Show advanced settings"
@@ -577,10 +649,11 @@ msgstr "Show advanced settings"
msgid "Sign"
msgstr "Sign"
#: packages/ui/primitives/document-flow/add-fields.tsx:785
#: packages/ui/primitives/document-flow/add-fields.tsx:823
#: packages/ui/primitives/document-flow/add-signature.tsx:323
#: packages/ui/primitives/document-flow/field-icon.tsx:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
#: packages/ui/primitives/document-flow/types.ts:49
#: packages/ui/primitives/template-flow/add-template-fields.tsx:586
msgid "Signature"
msgstr "Signature"
@@ -592,6 +665,14 @@ msgstr "Signed"
msgid "Signer"
msgstr "Signer"
#: packages/lib/constants/recipient-roles.ts:58
msgid "Signers"
msgstr "Signers"
#: packages/ui/primitives/document-flow/add-signers.types.ts:36
msgid "Signers must have unique emails"
msgstr "Signers must have unique emails"
#: packages/lib/constants/recipient-roles.ts:22
msgid "Signing"
msgstr "Signing"
@@ -604,6 +685,11 @@ msgstr "Some signers have not been assigned a signature field. Please assign at
msgid "Something went wrong"
msgstr "Something went wrong"
#: packages/ui/primitives/pdf-viewer.tsx:220
#: packages/ui/primitives/pdf-viewer.tsx:235
msgid "Something went wrong while loading the document."
msgstr "Something went wrong while loading the document."
#: packages/ui/primitives/data-table.tsx:136
msgid "Something went wrong."
msgstr "Something went wrong."
@@ -625,8 +711,9 @@ msgstr "Submit"
msgid "Template title"
msgstr "Template title"
#: packages/ui/primitives/document-flow/add-fields.tsx:915
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
#: packages/ui/primitives/document-flow/add-fields.tsx:953
#: packages/ui/primitives/document-flow/types.ts:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:716
msgid "Text"
msgstr "Text"
@@ -686,7 +773,7 @@ msgstr "The signer's name"
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
msgstr "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
#: packages/ui/primitives/document-flow/add-fields.tsx:746
#: packages/ui/primitives/document-flow/add-fields.tsx:757
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
msgstr "This document has already been sent to this recipient. You can no longer edit this recipient."
@@ -698,14 +785,10 @@ msgstr "This document is password protected. Please enter the password to view t
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
msgstr "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
#: packages/ui/primitives/document-flow/add-fields.tsx:1050
#: packages/ui/primitives/document-flow/add-fields.tsx:1090
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
msgstr "This recipient can no longer be modified as they have signed a field, or completed the document."
#: packages/ui/primitives/document-flow/add-signers.tsx:165
#~ msgid "This signer has already received the document."
#~ msgstr "This signer has already received the document."
#: packages/ui/primitives/document-flow/add-signers.tsx:194
msgid "This signer has already signed the document."
msgstr "This signer has already signed the document."
@@ -723,8 +806,8 @@ msgstr "Time Zone"
msgid "Title"
msgstr "Title"
#: packages/ui/primitives/document-flow/add-fields.tsx:1033
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
#: packages/ui/primitives/document-flow/add-fields.tsx:1073
#: packages/ui/primitives/template-flow/add-template-fields.tsx:834
msgid "To proceed further, please set at least one value for the {0} field."
msgstr "To proceed further, please set at least one value for the {0} field."
@@ -744,13 +827,13 @@ msgstr "Upgrade"
msgid "Upload Template Document"
msgstr "Upload Template Document"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:130
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:147
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:132
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167
msgid "Validation"
msgstr "Validation"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:88
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:93
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:91
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:96
msgid "Value"
msgstr "Value"
@@ -766,14 +849,14 @@ msgstr "Viewed"
msgid "Viewer"
msgstr "Viewer"
#: packages/lib/constants/recipient-roles.ts:65
msgid "Viewers"
msgstr "Viewers"
#: packages/lib/constants/recipient-roles.ts:28
msgid "Viewing"
msgstr "Viewing"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:280
#~ msgid "White"
#~ msgstr "White"
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:44
msgid "You are about to send this document to the recipients. Are you sure you want to continue?"
msgstr "You are about to send this document to the recipients. Are you sure you want to continue?"

File diff suppressed because one or more lines are too long

View File

@@ -155,10 +155,6 @@ msgstr "Documentation"
msgid "Easily embed Documenso into your product. Simply copy and paste our react widget into your application."
msgstr "Easily embed Documenso into your product. Simply copy and paste our react widget into your application."
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:42
#~ msgid "Easy Sharing (Soon)."
#~ msgstr "Easy Sharing (Soon)."
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:46
msgid "Easy Sharing."
msgstr "Easy Sharing."
@@ -372,18 +368,10 @@ msgstr "Our custom templates come with smart rules that can help you save time a
msgid "Our Enterprise License is great for large organizations looking to switch to Documenso for all their signing needs. It's available for our cloud offering as well as self-hosted setups and offers a wide range of compliance and Adminstration Features."
msgstr "Our Enterprise License is great for large organizations looking to switch to Documenso for all their signing needs. It's available for our cloud offering as well as self-hosted setups and offers a wide range of compliance and Adminstration Features."
#: apps/marketing/src/components/(marketing)/enterprise.tsx:20
#~ msgid "Our Enterprise License is great large organizations looking to switch to Documenso for all their signing needs. It's availible for our cloud offering as well as self-hosted setups and offer a wide range of compliance and Adminstration Features."
#~ msgstr "Our Enterprise License is great large organizations looking to switch to Documenso for all their signing needs. It's availible for our cloud offering as well as self-hosted setups and offer a wide range of compliance and Adminstration Features."
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:65
msgid "Our self-hosted option is great for small teams and individuals who need a simple solution. You can use our docker based setup to get started in minutes. Take control with full customizability and data ownership."
msgstr "Our self-hosted option is great for small teams and individuals who need a simple solution. You can use our docker based setup to get started in minutes. Take control with full customizability and data ownership."
#: apps/marketing/src/app/(marketing)/open/data.ts:25
#~ msgid "Part-Time"
#~ msgstr "Part-Time"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:151
msgid "Premium Profile Name"
msgstr "Premium Profile Name"
@@ -425,10 +413,6 @@ msgstr "Salary"
msgid "Save $60 or $120"
msgstr "Save $60 or $120"
#: apps/marketing/src/components/(marketing)/i18n-switcher.tsx:47
#~ msgid "Search languages..."
#~ msgstr "Search languages..."
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:109
msgid "Securely. Our data centers are located in Frankfurt (Germany), giving us the best local privacy laws. We are very aware of the sensitive nature of our data and follow best practices to ensure the security and integrity of the data entrusted to us."
msgstr "Securely. Our data centers are located in Frankfurt (Germany), giving us the best local privacy laws. We are very aware of the sensitive nature of our data and follow best practices to ensure the security and integrity of the data entrusted to us."

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,880 @@
msgid ""
msgstr ""
"POT-Creation-Date: 2024-07-24 13:01+1000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: @lingui/cli\n"
"Language: es\n"
"Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-01 04:00\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: documenso-app\n"
"X-Crowdin-Project-ID: 694691\n"
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: common.po\n"
"X-Crowdin-File-ID: 4\n"
#: packages/ui/primitives/data-table-pagination.tsx:30
msgid "{0} of {1} row(s) selected."
msgstr "{0} de {1} fila(s) seleccionada."
#: packages/ui/primitives/data-table-pagination.tsx:41
msgid "{visibleRows, plural, one {Showing # result.} other {Showing # results.}}"
msgstr "{visibleRows, plural, one {Mostrando # resultado.} other {Mostrando # resultados.}}"
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:53
msgid "<0>Inherit authentication method</0> - Use the global action signing authentication method configured in the \"General Settings\" step"
msgstr "<0>Heredar método de autenticación</0> - Use el método de autenticación de firma de acción global configurado en el paso \"Configuración General\""
#: packages/ui/components/document/document-global-auth-action-select.tsx:95
msgid "<0>No restrictions</0> - No authentication required"
msgstr "<0>Sin restricciones</0> - No se requiere autenticación"
#: packages/ui/components/document/document-global-auth-access-select.tsx:77
msgid "<0>No restrictions</0> - The document can be accessed directly by the URL sent to the recipient"
msgstr "<0>Sin restricciones</0> - El documento se puede acceder directamente a través de la URL enviada al destinatario"
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:75
msgid "<0>None</0> - No authentication required"
msgstr "<0>Ninguno</0> - No se requiere autenticación"
#: packages/ui/components/document/document-global-auth-action-select.tsx:89
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:69
msgid "<0>Require 2FA</0> - The recipient must have an account and 2FA enabled via their settings"
msgstr "<0>Requerir 2FA</0> - El destinatario debe tener una cuenta y 2FA habilitado a través de sus configuraciones"
#: packages/ui/components/document/document-global-auth-access-select.tsx:72
msgid "<0>Require account</0> - The recipient must be signed in to view the document"
msgstr "<0>Requerir cuenta</0> - El destinatario debe haber iniciado sesión para ver el documento"
#: packages/ui/components/document/document-global-auth-action-select.tsx:83
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:63
msgid "<0>Require passkey</0> - The recipient must have an account and passkey configured via their settings"
msgstr "<0>Requerir clave de acceso</0> - El destinatario debe tener una cuenta y clave de acceso configurada a través de sus configuraciones"
#: packages/ui/primitives/document-dropzone.tsx:69
msgid "Add a document"
msgstr "Agregar un documento"
#: packages/ui/primitives/document-flow/add-settings.tsx:336
#: packages/ui/primitives/template-flow/add-template-settings.tsx:339
msgid "Add a URL to redirect the user to once the document is signed"
msgstr "Agregue una URL para redirigir al usuario una vez que se firme el documento"
#: packages/ui/primitives/document-flow/add-settings.tsx:248
msgid "Add an external ID to the document. This can be used to identify the document in external systems."
msgstr "Agregue un ID externo al documento. Esto se puede usar para identificar el documento en sistemas externos."
#: packages/ui/primitives/template-flow/add-template-settings.tsx:256
msgid "Add an external ID to the template. This can be used to identify in external systems."
msgstr "Agregue un ID externo a la plantilla. Esto se puede usar para identificar en sistemas externos."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:187
msgid "Add another option"
msgstr "Agregar otra opción"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:232
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:167
msgid "Add another value"
msgstr "Agregar otro valor"
#: packages/ui/primitives/document-flow/add-signers.tsx:662
msgid "Add myself"
msgstr "Agregame"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:637
msgid "Add Myself"
msgstr "Agregame"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:623
msgid "Add Placeholder Recipient"
msgstr "Agregar destinatario de marcador de posición"
#: packages/ui/primitives/document-flow/add-signers.tsx:651
msgid "Add Signer"
msgstr "Agregar firmante"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:73
msgid "Add text"
msgstr "Agregar texto"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:78
msgid "Add text to the field"
msgstr "Agregar texto al campo"
#: packages/lib/constants/teams.ts:10
msgid "Admin"
msgstr "Admin"
#: packages/ui/primitives/document-flow/add-settings.tsx:230
#: packages/ui/primitives/template-flow/add-template-settings.tsx:238
msgid "Advanced Options"
msgstr "Opciones avanzadas"
#: packages/ui/primitives/document-flow/add-fields.tsx:573
#: packages/ui/primitives/template-flow/add-template-fields.tsx:406
msgid "Advanced settings"
msgstr "Configuraciones avanzadas"
#: packages/lib/constants/template.ts:21
msgid "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email."
msgstr "Después de la presentación, se generará automáticamente un documento y se agregará a su página de documentos. También recibirá una notificación por correo electrónico."
#: packages/ui/primitives/pdf-viewer.tsx:167
msgid "An error occurred while loading the document."
msgstr "Se produjo un error al cargar el documento."
#: packages/lib/constants/recipient-roles.ts:8
msgid "Approve"
msgstr "Aprobar"
#: packages/lib/constants/recipient-roles.ts:9
msgid "Approved"
msgstr "Aprobado"
#: packages/lib/constants/recipient-roles.ts:11
msgid "Approver"
msgstr "Aprobador"
#: packages/lib/constants/recipient-roles.ts:44
msgid "Approvers"
msgstr "Aprobadores"
#: packages/lib/constants/recipient-roles.ts:10
msgid "Approving"
msgstr "Aprobando"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
msgid "Black"
msgstr "Negro"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:391
msgid "Blue"
msgstr "Azul"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58
msgid "Cancel"
msgstr "Cancelar"
#: packages/ui/primitives/document-flow/add-signers.tsx:193
msgid "Cannot remove signer"
msgstr "No se puede eliminar el firmante"
#: packages/lib/constants/recipient-roles.ts:17
msgid "Cc"
msgstr "Cc"
#: packages/lib/constants/recipient-roles.ts:14
#: packages/lib/constants/recipient-roles.ts:16
msgid "CC"
msgstr "CC"
#: packages/lib/constants/recipient-roles.ts:15
msgid "CC'd"
msgstr "CC'd"
#: packages/lib/constants/recipient-roles.ts:51
msgid "Ccers"
msgstr "Ccers"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:86
msgid "Character Limit"
msgstr "Límite de caracteres"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:197
msgid "Checkbox values"
msgstr "Valores de Checkbox"
#: packages/ui/primitives/data-table.tsx:156
msgid "Clear filters"
msgstr "Limpiar filtros"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:411
msgid "Clear Signature"
msgstr "Limpiar firma"
#: packages/ui/primitives/document-flow/add-signature.tsx:394
msgid "Click to insert field"
msgstr "Haga clic para insertar campo"
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:44
msgid "Close"
msgstr "Cerrar"
#: packages/lib/constants/template.ts:12
msgid "Configure Direct Recipient"
msgstr "Configurar destinatario directo"
#: packages/ui/primitives/document-flow/add-fields.tsx:574
#: packages/ui/primitives/template-flow/add-template-fields.tsx:407
msgid "Configure the {0} field"
msgstr "Configurar el campo {0}"
#: packages/ui/primitives/document-flow/document-flow-root.tsx:141
msgid "Continue"
msgstr "Continuar"
#: packages/ui/components/document/document-share-button.tsx:46
msgid "Copied to clipboard"
msgstr "Copiado al portapapeles"
#: packages/ui/components/document/document-share-button.tsx:194
msgid "Copy Link"
msgstr "Copiar enlace"
#: packages/ui/primitives/document-flow/add-signature.tsx:360
msgid "Custom Text"
msgstr "Texto personalizado"
#: packages/ui/primitives/document-flow/add-fields.tsx:927
#: packages/ui/primitives/document-flow/types.ts:53
#: packages/ui/primitives/template-flow/add-template-fields.tsx:690
msgid "Date"
msgstr "Fecha"
#: packages/ui/primitives/document-flow/add-settings.tsx:271
#: packages/ui/primitives/template-flow/add-template-settings.tsx:279
msgid "Date Format"
msgstr "Formato de fecha"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570
msgid "Direct link receiver"
msgstr "Receptor de enlace directo"
#: packages/ui/components/document/document-global-auth-access-select.tsx:62
#: packages/ui/primitives/document-flow/add-settings.tsx:174
#: packages/ui/primitives/template-flow/add-template-settings.tsx:151
msgid "Document access"
msgstr "Acceso al documento"
#: packages/lib/constants/template.ts:20
msgid "Document Creation"
msgstr "Creación de documento"
#: packages/ui/components/document/document-download-button.tsx:68
msgid "Download"
msgstr "Descargar"
#: packages/ui/primitives/document-dropzone.tsx:162
msgid "Drag & drop your PDF here."
msgstr "Arrastre y suelte su PDF aquí."
#: packages/ui/primitives/document-flow/add-fields.tsx:1058
#: packages/ui/primitives/template-flow/add-template-fields.tsx:820
msgid "Dropdown"
msgstr "Menú desplegable"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:158
msgid "Dropdown options"
msgstr "Opciones de menú desplegable"
#: packages/ui/primitives/document-flow/add-fields.tsx:875
#: packages/ui/primitives/document-flow/add-signature.tsx:272
#: packages/ui/primitives/document-flow/add-signers.tsx:500
#: packages/ui/primitives/document-flow/add-signers.tsx:507
#: packages/ui/primitives/document-flow/types.ts:54
#: packages/ui/primitives/template-flow/add-template-fields.tsx:638
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:463
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:470
msgid "Email"
msgstr "Correo electrónico"
#: packages/ui/primitives/document-flow/add-signature.types.ts:7
msgid "Email is required"
msgstr "Se requiere email"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:184
msgid "Email Options"
msgstr "Opciones de correo electrónico"
#: packages/ui/primitives/document-flow/add-fields.tsx:1123
msgid "Empty field"
msgstr "Campo vacío"
#: packages/lib/constants/template.ts:8
msgid "Enable Direct Link Signing"
msgstr "Habilitar firma de enlace directo"
#: packages/ui/primitives/document-flow/add-signers.tsx:401
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:362
msgid "Enable signing order"
msgstr "Habilitar orden de firma"
#: packages/ui/primitives/document-flow/add-fields.tsx:795
msgid "Enable Typed Signatures"
msgstr "Habilitar firmas escritas"
#: packages/ui/primitives/document-password-dialog.tsx:84
msgid "Enter password"
msgstr "Ingrese la contraseña"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:257
#: packages/ui/primitives/pdf-viewer.tsx:166
msgid "Error"
msgstr "Error"
#: packages/ui/primitives/document-flow/add-settings.tsx:241
#: packages/ui/primitives/template-flow/add-template-settings.tsx:249
msgid "External ID"
msgstr "ID externo"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:258
msgid "Failed to save settings."
msgstr "Fallo al guardar configuraciones."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93
msgid "Field character limit"
msgstr "Límite de caracteres del campo"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:62
#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:44
#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:44
#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:44
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107
msgid "Field font size"
msgstr "Tamaño de fuente del campo"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:110
msgid "Field format"
msgstr "Formato de campo"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:53
msgid "Field label"
msgstr "Etiqueta de campo"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:65
msgid "Field placeholder"
msgstr "Marcador de posición de campo"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:56
#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:38
#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:38
#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:38
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101
msgid "Font Size"
msgstr "Tamaño de fuente"
#: packages/ui/primitives/document-flow/types.ts:50
msgid "Free Signature"
msgstr "Firma gratuita"
#: packages/ui/components/document/document-global-auth-action-select.tsx:64
msgid "Global recipient action authentication"
msgstr "Autenticación de acción de destinatario global"
#: packages/ui/primitives/document-flow/document-flow-root.tsx:142
msgid "Go Back"
msgstr "Regresar"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:398
msgid "Green"
msgstr "Verde"
#: packages/lib/constants/recipient-roles.ts:76
msgid "I am a signer of this document"
msgstr "Soy un firmante de este documento"
#: packages/lib/constants/recipient-roles.ts:79
msgid "I am a viewer of this document"
msgstr "Soy un visualizador de este documento"
#: packages/lib/constants/recipient-roles.ts:77
msgid "I am an approver of this document"
msgstr "Soy un aprobador de este documento"
#: packages/lib/constants/recipient-roles.ts:78
msgid "I am required to receive a copy of this document"
msgstr "Se me requiere recibir una copia de este documento"
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:29
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:87
msgid "Inherit authentication method"
msgstr "Heredar método de autenticación"
#: packages/ui/primitives/document-flow/types.ts:51
msgid "Initials"
msgstr "Iniciales"
#: packages/ui/primitives/document-flow/add-signers.types.ts:17
msgid "Invalid email"
msgstr "Email inválido"
#: packages/ui/primitives/document-flow/add-signature.types.ts:8
msgid "Invalid email address"
msgstr "Dirección de email inválida"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48
msgid "Label"
msgstr "Etiqueta"
#: packages/ui/primitives/lazy-pdf-viewer.tsx:15
#: packages/ui/primitives/pdf-viewer.tsx:44
msgid "Loading document..."
msgstr "Cargando documento..."
#: packages/lib/constants/teams.ts:11
msgid "Manager"
msgstr "Gerente"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188
msgid "Max"
msgstr "Máx"
#: packages/lib/constants/teams.ts:12
msgid "Member"
msgstr "Miembro"
#: packages/ui/primitives/document-flow/add-subject.tsx:95
#: packages/ui/primitives/template-flow/add-template-settings.tsx:215
msgid "Message <0>(Optional)</0>"
msgstr "Mensaje <0>(Opcional)</0>"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:176
msgid "Min"
msgstr "Mín"
#: packages/ui/primitives/document-flow/add-fields.tsx:901
#: packages/ui/primitives/document-flow/add-signature.tsx:298
#: packages/ui/primitives/document-flow/add-signers.tsx:535
#: packages/ui/primitives/document-flow/add-signers.tsx:541
#: packages/ui/primitives/document-flow/types.ts:55
#: packages/ui/primitives/template-flow/add-template-fields.tsx:664
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:498
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:504
msgid "Name"
msgstr "Nombre"
#: packages/ui/components/recipient/recipient-role-select.tsx:52
msgid "Needs to approve"
msgstr "Necesita aprobar"
#: packages/ui/components/recipient/recipient-role-select.tsx:31
msgid "Needs to sign"
msgstr "Necesita firmar"
#: packages/ui/components/recipient/recipient-role-select.tsx:73
msgid "Needs to view"
msgstr "Necesita ver"
#: packages/ui/primitives/document-flow/add-fields.tsx:686
#: packages/ui/primitives/template-flow/add-template-fields.tsx:504
msgid "No recipient matching this description was found."
msgstr "No se encontró ningún destinatario que coincidiera con esta descripción."
#: packages/ui/primitives/document-flow/add-fields.tsx:701
#: packages/ui/primitives/template-flow/add-template-fields.tsx:519
msgid "No recipients with this role"
msgstr "No hay destinatarios con este rol"
#: packages/ui/components/document/document-global-auth-access-select.tsx:30
#: packages/ui/components/document/document-global-auth-access-select.tsx:43
#: packages/ui/components/document/document-global-auth-action-select.tsx:31
#: packages/ui/components/document/document-global-auth-action-select.tsx:46
msgid "No restrictions"
msgstr "Sin restricciones"
#: packages/ui/primitives/data-table.tsx:148
msgid "No results found"
msgstr "No se encontraron resultados"
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:30
msgid "No signature field found"
msgstr "No se encontró campo de firma"
#: packages/ui/primitives/combobox.tsx:60
#: packages/ui/primitives/multi-select-combobox.tsx:153
msgid "No value found."
msgstr "No se encontró valor."
#: packages/ui/primitives/document-flow/add-fields.tsx:979
#: packages/ui/primitives/document-flow/types.ts:56
#: packages/ui/primitives/template-flow/add-template-fields.tsx:742
msgid "Number"
msgstr "Número"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:103
msgid "Number format"
msgstr "Formato de número"
#: packages/lib/constants/template.ts:9
msgid "Once enabled, you can select any active recipient to be a direct link signing recipient, or create a new one. This recipient type cannot be edited or deleted."
msgstr "Una vez habilitado, puede seleccionar cualquier destinatario activo para que sea un destinatario de firma por enlace directo, o crear uno nuevo. Este tipo de destinatario no puede ser editado ni eliminado."
#: packages/lib/constants/template.ts:17
msgid "Once your template is set up, share the link anywhere you want. The person who opens the link will be able to enter their information in the direct link recipient field and complete any other fields assigned to them."
msgstr "Una vez que su plantilla esté configurada, comparta el enlace donde desee. La persona que abra el enlace podrá ingresar su información en el campo de destinatario de enlace directo y completar cualquier otro campo que se le haya asignado."
#: packages/ui/primitives/data-table-pagination.tsx:77
msgid "Page {0} of {1}"
msgstr "Página {0} de {1}"
#: packages/ui/primitives/pdf-viewer.tsx:259
msgid "Page {0} of {numPages}"
msgstr "Página {0} de {numPages}"
#: packages/ui/primitives/document-password-dialog.tsx:62
msgid "Password Required"
msgstr "Se requiere contraseña"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156
msgid "Pick a number"
msgstr "Seleccione un número"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:79
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:84
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60
msgid "Placeholder"
msgstr "Marcador de posición"
#: packages/ui/primitives/pdf-viewer.tsx:223
#: packages/ui/primitives/pdf-viewer.tsx:238
msgid "Please try again or contact our support."
msgstr "Por favor, inténtalo de nuevo o contacta a nuestro soporte."
#: packages/ui/primitives/template-flow/add-template-fields.tsx:768
msgid "Radio"
msgstr "Radio"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:133
msgid "Radio values"
msgstr "Valores de radio"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:186
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:147
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:156
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:122
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:133
msgid "Read only"
msgstr "Solo lectura"
#: packages/ui/components/recipient/recipient-role-select.tsx:95
msgid "Receives copy"
msgstr "Recibe copia"
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:39
#: packages/ui/primitives/document-flow/add-settings.tsx:215
#: packages/ui/primitives/template-flow/add-template-settings.tsx:169
msgid "Recipient action authentication"
msgstr "Autenticación de acción de destinatario"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:384
msgid "Red"
msgstr "Rojo"
#: packages/ui/primitives/document-flow/add-settings.tsx:329
#: packages/ui/primitives/template-flow/add-template-settings.tsx:332
msgid "Redirect URL"
msgstr "URL de redirección"
#: packages/ui/primitives/document-flow/add-fields.tsx:1110
msgid "Remove"
msgstr "Eliminar"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:176
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:146
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:112
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:123
msgid "Required field"
msgstr "Campo obligatorio"
#: packages/ui/components/document/document-share-button.tsx:147
msgid "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!"
msgstr "Ten la seguridad de que tu documento es estrictamente confidencial y nunca será compartido. Solo se destacará tu experiencia de firma. ¡Comparte tu tarjeta de firma personalizada para mostrar tu firma!"
#: packages/ui/primitives/data-table-pagination.tsx:55
msgid "Rows per page"
msgstr "Filas por página"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:355
msgid "Save"
msgstr "Guardar"
#: packages/ui/primitives/template-flow/add-template-fields.tsx:854
msgid "Save Template"
msgstr "Guardar plantilla"
#: packages/ui/components/common/language-switcher-dialog.tsx:34
msgid "Search languages..."
msgstr "Buscar idiomas..."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:115
msgid "Select"
msgstr "Seleccionar"
#: packages/ui/primitives/combobox.tsx:38
msgid "Select an option"
msgstr "Seleccionar una opción"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:139
msgid "Select at least"
msgstr "Seleccionar al menos"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:105
msgid "Select default option"
msgstr "Seleccionar opción predeterminada"
#: packages/ui/primitives/document-flow/add-subject.tsx:124
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:34
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:64
msgid "Send"
msgstr "Enviar"
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:41
msgid "Send Document"
msgstr "Enviar documento"
#: packages/ui/components/document/document-share-button.tsx:135
msgid "Share Signature Card"
msgstr "Compartir tarjeta de firma"
#: packages/lib/constants/template.ts:16
msgid "Share the Link"
msgstr "Compartir el enlace"
#: packages/ui/components/document/document-share-button.tsx:143
msgid "Share your signing experience!"
msgstr "¡Comparte tu experiencia de firma!"
#: packages/ui/primitives/document-flow/add-signers.tsx:680
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:655
msgid "Show advanced settings"
msgstr "Mostrar configuraciones avanzadas"
#: packages/lib/constants/recipient-roles.ts:20
msgid "Sign"
msgstr "Firmar"
#: packages/ui/primitives/document-flow/add-fields.tsx:823
#: packages/ui/primitives/document-flow/add-signature.tsx:323
#: packages/ui/primitives/document-flow/field-icon.tsx:52
#: packages/ui/primitives/document-flow/types.ts:49
#: packages/ui/primitives/template-flow/add-template-fields.tsx:586
msgid "Signature"
msgstr "Firma"
#: packages/lib/constants/recipient-roles.ts:21
msgid "Signed"
msgstr "Firmado"
#: packages/lib/constants/recipient-roles.ts:23
msgid "Signer"
msgstr "Firmante"
#: packages/lib/constants/recipient-roles.ts:58
msgid "Signers"
msgstr "Firmantes"
#: packages/ui/primitives/document-flow/add-signers.types.ts:36
msgid "Signers must have unique emails"
msgstr "Los firmantes deben tener correos electrónicos únicos"
#: packages/lib/constants/recipient-roles.ts:22
msgid "Signing"
msgstr "Firmando"
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:34
msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
msgstr "Algunos firmantes no han sido asignados a un campo de firma. Asigne al menos 1 campo de firma a cada firmante antes de continuar."
#: packages/ui/components/document/document-share-button.tsx:51
msgid "Something went wrong"
msgstr "Algo salió mal"
#: packages/ui/primitives/pdf-viewer.tsx:220
#: packages/ui/primitives/pdf-viewer.tsx:235
msgid "Something went wrong while loading the document."
msgstr "Algo salió mal al cargar el documento."
#: packages/ui/primitives/data-table.tsx:136
msgid "Something went wrong."
msgstr "Algo salió mal."
#: packages/ui/primitives/document-flow/document-flow-root.tsx:107
msgid "Step <0>{step} of {maxStep}</0>"
msgstr "Paso <0>{step} de {maxStep}</0>"
#: packages/ui/primitives/document-flow/add-subject.tsx:78
#: packages/ui/primitives/template-flow/add-template-settings.tsx:195
msgid "Subject <0>(Optional)</0>"
msgstr "Asunto <0>(Opcional)</0>"
#: packages/ui/primitives/document-password-dialog.tsx:97
msgid "Submit"
msgstr "Enviar"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:134
msgid "Template title"
msgstr "Título de plantilla"
#: packages/ui/primitives/document-flow/add-fields.tsx:953
#: packages/ui/primitives/document-flow/types.ts:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:716
msgid "Text"
msgstr "Texto"
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:44
msgid "The authentication required for recipients to sign fields"
msgstr "La autenticación requerida para que los destinatarios firmen campos"
#: packages/ui/components/document/document-global-auth-action-select.tsx:68
msgid "The authentication required for recipients to sign the signature field."
msgstr "La autenticación requerida para que los destinatarios firmen el campo de firma."
#: packages/ui/components/document/document-global-auth-access-select.tsx:67
msgid "The authentication required for recipients to view the document."
msgstr "La autenticación requerida para que los destinatarios vean el documento."
#: packages/ui/components/document/document-send-email-message-helper.tsx:31
msgid "The document's name"
msgstr "El nombre del documento"
#: packages/ui/primitives/document-password-dialog.tsx:52
msgid "The password you have entered is incorrect. Please try again."
msgstr "La contraseña que ha ingresado es incorrecta. Por favor, inténtelo de nuevo."
#: packages/ui/components/recipient/recipient-role-select.tsx:103
msgid "The recipient is not required to take any action and receives a copy of the document after it is completed."
msgstr "El destinatario no está obligado a tomar ninguna acción y recibe una copia del documento una vez completado."
#: packages/ui/components/recipient/recipient-role-select.tsx:60
msgid "The recipient is required to approve the document for it to be completed."
msgstr "El destinatario debe aprobar el documento para que se complete."
#: packages/ui/components/recipient/recipient-role-select.tsx:39
msgid "The recipient is required to sign the document for it to be completed."
msgstr "El destinatario debe firmar el documento para que se complete."
#: packages/ui/components/recipient/recipient-role-select.tsx:81
msgid "The recipient is required to view the document for it to be completed."
msgstr "El destinatario debe ver el documento para que se complete."
#: packages/ui/components/document/document-share-button.tsx:52
msgid "The sharing link could not be created at this time. Please try again."
msgstr "El enlace de compartición no se pudo crear en este momento. Por favor, inténtelo de nuevo."
#: packages/ui/components/document/document-share-button.tsx:47
msgid "The sharing link has been copied to your clipboard."
msgstr "El enlace de compartición ha sido copiado a su portapapeles."
#: packages/ui/components/document/document-send-email-message-helper.tsx:25
msgid "The signer's email"
msgstr "El correo electrónico del firmante"
#: packages/ui/components/document/document-send-email-message-helper.tsx:19
msgid "The signer's name"
msgstr "El nombre del firmante"
#: packages/ui/components/document/document-global-auth-action-select.tsx:72
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
msgstr "Esto se puede anular configurando los requisitos de autenticación directamente en cada destinatario en el siguiente paso."
#: packages/ui/primitives/document-flow/add-fields.tsx:757
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
msgstr "Este documento ya ha sido enviado a este destinatario. Ya no puede editar a este destinatario."
#: packages/ui/primitives/document-password-dialog.tsx:66
msgid "This document is password protected. Please enter the password to view the document."
msgstr "Este documento está protegido por contraseña. Por favor ingrese la contraseña para ver el documento."
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:573
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
msgstr "Este campo no se puede modificar ni eliminar. Cuando comparta el enlace directo de esta plantilla o lo agregue a su perfil público, cualquiera que acceda podrá ingresar su nombre y correo electrónico, y completar los campos que se le hayan asignado."
#: packages/ui/primitives/document-flow/add-fields.tsx:1090
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
msgstr "Este destinatario ya no puede ser modificado ya que ha firmado un campo o completado el documento."
#: packages/ui/primitives/document-flow/add-signers.tsx:194
msgid "This signer has already signed the document."
msgstr "Este firmante ya ha firmado el documento."
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:48
msgid "This will override any global settings."
msgstr "Esto anulará cualquier configuración global."
#: packages/ui/primitives/document-flow/add-settings.tsx:305
#: packages/ui/primitives/template-flow/add-template-settings.tsx:309
msgid "Time Zone"
msgstr "Zona horaria"
#: packages/ui/primitives/document-flow/add-settings.tsx:153
msgid "Title"
msgstr "Título"
#: packages/ui/primitives/document-flow/add-fields.tsx:1073
#: packages/ui/primitives/template-flow/add-template-fields.tsx:834
msgid "To proceed further, please set at least one value for the {0} field."
msgstr "Para continuar, por favor establezca al menos un valor para el campo {0}."
#: packages/ui/primitives/document-flow/add-subject.tsx:124
msgid "Update"
msgstr "Actualizar"
#: packages/lib/constants/template.ts:13
msgid "Update the role and add fields as required for the direct recipient. The individual who uses the direct link will sign the document as the direct recipient."
msgstr "Actualizar el rol y agregar campos según sea necesario para el destinatario directo. La persona que utilice el enlace directo firmará el documento como destinatario directo."
#: packages/ui/primitives/document-dropzone.tsx:168
msgid "Upgrade"
msgstr "Actualizar"
#: packages/ui/primitives/document-dropzone.tsx:70
msgid "Upload Template Document"
msgstr "Cargar Documento Plantilla"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:132
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167
msgid "Validation"
msgstr "Validación"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:91
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:96
msgid "Value"
msgstr "Valor"
#: packages/lib/constants/recipient-roles.ts:26
msgid "View"
msgstr "Ver"
#: packages/lib/constants/recipient-roles.ts:27
msgid "Viewed"
msgstr "Visto"
#: packages/lib/constants/recipient-roles.ts:29
msgid "Viewer"
msgstr "Visor"
#: packages/lib/constants/recipient-roles.ts:65
msgid "Viewers"
msgstr "Espectadores"
#: packages/lib/constants/recipient-roles.ts:28
msgid "Viewing"
msgstr "Viendo"
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:44
msgid "You are about to send this document to the recipients. Are you sure you want to continue?"
msgstr "Está a punto de enviar este documento a los destinatarios. ¿Está seguro de que desea continuar?"
#: packages/ui/components/document/document-send-email-message-helper.tsx:11
msgid "You can use the following variables in your message:"
msgstr "Puede usar las siguientes variables en su mensaje:"
#: packages/ui/primitives/document-dropzone.tsx:43
msgid "You cannot upload documents at this time."
msgstr "No puede cargar documentos en este momento."
#: packages/ui/primitives/document-dropzone.tsx:69
msgid "You have reached your document limit."
msgstr "Ha alcanzado su límite de documentos."

View File

@@ -0,0 +1,605 @@
msgid ""
msgstr ""
"POT-Creation-Date: 2024-07-24 13:01+1000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: @lingui/cli\n"
"Language: es\n"
"Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-01 02:29\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: documenso-app\n"
"X-Crowdin-Project-ID: 694691\n"
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: marketing.po\n"
"X-Crowdin-File-ID: 6\n"
#: apps/marketing/src/app/(marketing)/blog/page.tsx:45
msgid "{0}"
msgstr "{0}"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:100
msgid "5 standard documents per month"
msgstr "5 documentos estándar por mes"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:198
msgid "5 Users Included"
msgstr "5 Usuarios incluidos"
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:34
msgid "A 10x better signing experience."
msgstr "Una experiencia de firma 10 veces mejor."
#: apps/marketing/src/app/(marketing)/singleplayer/client.tsx:51
msgid "Add document"
msgstr "Agregar documento"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:201
msgid "Add More Users for {0}"
msgstr "Agregar más usuarios por {0}"
#: apps/marketing/src/app/(marketing)/open/page.tsx:165
msgid "All our metrics, finances, and learnings are public. We believe in transparency and want to share our journey with you. You can read more about why here: <0>Announcing Open Metrics</0>"
msgstr "Todos nuestros métricas, finanzas y aprendizajes son públicos. Creemos en la transparencia y queremos compartir nuestro viaje contigo. Puedes leer más sobre por qué aquí: <0>Anunciando Métricas Abiertas</0>"
#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:58
#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:65
msgid "Amount Raised"
msgstr "Monto recaudado"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:145
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:189
msgid "API Access"
msgstr "Acceso a API"
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:67
msgid "Beautiful."
msgstr "Hermoso."
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:69
msgid "Because signing should be celebrated. Thats why we care about the smallest detail in our product."
msgstr "Porque la firma debe ser celebrada. Por eso nos importa el más mínimo detalle en nuestro producto."
#: apps/marketing/src/components/(marketing)/footer.tsx:35
#: apps/marketing/src/components/(marketing)/header.tsx:57
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:36
msgid "Blog"
msgstr "Blog"
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:64
msgid "Build on top."
msgstr "Construir sobre."
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:163
msgid "Can I use Documenso commercially?"
msgstr "¿Puedo usar Documenso comercialmente?"
#: apps/marketing/src/components/(marketing)/footer.tsx:42
msgid "Careers"
msgstr "Carreras"
#: apps/marketing/src/components/(marketing)/footer.tsx:36
msgid "Changelog"
msgstr "Registro de cambios"
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:85
msgid "Choose a template from the community app store. Or submit your own template for others to use."
msgstr "Elige una plantilla de la tienda de aplicaciones de la comunidad. O envía tu propia plantilla para que otros la usen."
#: apps/marketing/src/app/(marketing)/open/page.tsx:219
msgid "Community"
msgstr "Comunidad"
#: apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx:55
msgid "Completed Documents"
msgstr "Documentos Completados"
#: apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx:33
msgid "Completed Documents per Month"
msgstr "Documentos Completados por Mes"
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:65
msgid "Connections"
msgstr "Conexiones"
#: apps/marketing/src/components/(marketing)/enterprise.tsx:35
msgid "Contact Us"
msgstr "Contáctanos"
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:67
msgid "Create connections and automations with Zapier and more to integrate with your favorite tools."
msgstr "Crea conexiones y automatizaciones con Zapier y más para integrarte con tus herramientas favoritas."
#: apps/marketing/src/components/(marketing)/call-to-action.tsx:23
msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
msgstr "Crea tu cuenta y comienza a usar la firma de documentos de última generación. La firma abierta y hermosa está a tu alcance."
#: apps/marketing/src/app/(marketing)/open/tooltip.tsx:35
msgid "Customers with an Active Subscriptions."
msgstr "Clientes con suscripciones activas."
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:33
msgid "Customise and expand."
msgstr "Personaliza y expande."
#: apps/marketing/src/components/(marketing)/footer.tsx:38
msgid "Design"
msgstr "Diseño"
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:44
msgid "Designed for every stage of your journey."
msgstr "Diseñado para cada etapa de tu viaje."
#: apps/marketing/src/components/(marketing)/carousel.tsx:40
msgid "Direct Link"
msgstr "Enlace Directo"
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:181
msgid "Documenso is a community effort to create an open and vibrant ecosystem around a tool, everybody is free to use and adapt. By being truly open we want to create trusted infrastructure for the future of the internet."
msgstr "Documenso es un esfuerzo comunitario para crear un ecosistema abierto y vibrante alrededor de una herramienta que todos son libres de usar y adaptar. Al ser verdaderamente abierto, queremos crear una infraestructura confiable para el futuro de internet."
#: apps/marketing/src/app/(marketing)/open/typefully.tsx:28
msgid "Documenso on X"
msgstr "Documenso en X"
#: apps/marketing/src/components/(marketing)/hero.tsx:104
msgid "Document signing,<0/>finally open source."
msgstr "Firma de documentos,<0/>finalmente código abierto."
#: apps/marketing/src/components/(marketing)/footer.tsx:33
#: apps/marketing/src/components/(marketing)/header.tsx:50
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:28
msgid "Documentation"
msgstr "Documentación"
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:110
msgid "Easily embed Documenso into your product. Simply copy and paste our react widget into your application."
msgstr "Incrusta fácilmente Documenso en tu producto. Simplemente copia y pega nuestro widget de react en tu aplicación."
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:46
msgid "Easy Sharing."
msgstr "Compartición fácil."
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:148
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:192
msgid "Email and Discord Support"
msgstr "Soporte por correo electrónico y Discord"
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:43
msgid "Engagement"
msgstr "Compromiso"
#: apps/marketing/src/app/(marketing)/singleplayer/client.tsx:64
msgid "Enter your details."
msgstr "Ingresa tus detalles."
#: apps/marketing/src/components/(marketing)/enterprise.tsx:16
msgid "Enterprise Compliance, License or Technical Needs?"
msgstr "¿Cumplimiento, licencia o necesidades técnicas de la empresa?"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:128
msgid "Everything you need for a great signing experience."
msgstr "Todo lo que necesitas para una gran experiencia de firma."
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:45
msgid "Fast."
msgstr "Rápido."
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:36
msgid "Faster, smarter and more beautiful."
msgstr "Más rápido, más inteligente y más hermoso."
#: apps/marketing/src/app/(marketing)/open/page.tsx:210
msgid "Finances"
msgstr "Finanzas"
#: apps/marketing/src/app/(marketing)/open/typefully.tsx:38
msgid "Follow us on X"
msgstr "Síguenos en X"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:172
msgid "For companies looking to scale across multiple teams."
msgstr "Para empresas que buscan escalar en múltiples equipos."
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:85
msgid "For small teams and individuals with basic needs."
msgstr "Para pequeños equipos e individuos con necesidades básicas."
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:80
msgid "Free"
msgstr "Gratis"
#: apps/marketing/src/app/(marketing)/blog/page.tsx:26
msgid "From the blog"
msgstr "Del blog"
#: apps/marketing/src/app/(marketing)/open/data.ts:9
#: apps/marketing/src/app/(marketing)/open/data.ts:17
#: apps/marketing/src/app/(marketing)/open/data.ts:25
#: apps/marketing/src/app/(marketing)/open/data.ts:33
#: apps/marketing/src/app/(marketing)/open/data.ts:41
#: apps/marketing/src/app/(marketing)/open/data.ts:49
msgid "Full-Time"
msgstr "A tiempo completo"
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:87
msgid "Get paid (Soon)."
msgstr "Recibe pago (Pronto)."
#: apps/marketing/src/components/(marketing)/call-to-action.tsx:31
msgid "Get started"
msgstr "Empezar"
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:75
msgid "Get Started"
msgstr "Comienza"
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:47
msgid "Get started today."
msgstr "Comienza hoy."
#: apps/marketing/src/app/(marketing)/blog/page.tsx:30
msgid "Get the latest news from Documenso, including product updates, team announcements and more!"
msgstr "¡Obtén las últimas noticias de Documenso, incluidas actualizaciones de productos, anuncios del equipo y más!"
#: apps/marketing/src/app/(marketing)/open/page.tsx:233
msgid "GitHub: Total Merged PRs"
msgstr "GitHub: Total de PRs fusionados"
#: apps/marketing/src/app/(marketing)/open/page.tsx:251
msgid "GitHub: Total Open Issues"
msgstr "GitHub: Total de problemas abiertos"
#: apps/marketing/src/app/(marketing)/open/page.tsx:225
msgid "GitHub: Total Stars"
msgstr "GitHub: Total de estrellas"
#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:23
msgid "Global Salary Bands"
msgstr "Bandas salariales globales"
#: apps/marketing/src/app/(marketing)/open/page.tsx:261
msgid "Growth"
msgstr "Crecimiento"
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:134
msgid "How can I contribute?"
msgstr "¿Cómo puedo contribuir?"
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:105
msgid "How do you handle my data?"
msgstr "¿Cómo manejan mis datos?"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:118
msgid "Individual"
msgstr "Individual"
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:89
msgid "Integrated payments with Stripe so you dont have to worry about getting paid."
msgstr "Pagos integrados con Stripe para que no tengas que preocuparte por cobrar."
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:35
msgid "Integrates with all your favourite tools."
msgstr "Se integra con todas tus herramientas favoritas."
#: apps/marketing/src/app/(marketing)/open/page.tsx:289
msgid "Is there more?"
msgstr "¿Hay más?"
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:44
msgid "Its up to you. Either clone our repository or rely on our easy to use hosting solution."
msgstr "Depende de ti. O bien clona nuestro repositorio o confía en nuestra solución de hosting fácil de usar."
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:49
msgid "Join Date"
msgstr "Fecha de ingreso"
#: apps/marketing/src/components/(marketing)/call-to-action.tsx:19
msgid "Join the Open Signing Movement"
msgstr "Únete al Movimiento de Firma Abierta"
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:46
msgid "Location"
msgstr "Ubicación"
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:66
msgid "Make it your own through advanced customization and adjustability."
msgstr "Hazlo tuyo a través de personalización y ajustabilidad avanzadas."
#: apps/marketing/src/app/(marketing)/open/page.tsx:199
msgid "Merged PR's"
msgstr "PRs fusionados"
#: apps/marketing/src/app/(marketing)/open/page.tsx:234
msgid "Merged PRs"
msgstr "PRs fusionados"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:40
msgid "Monthly"
msgstr "Mensual"
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:34
msgid "Name"
msgstr "Nombre"
#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:30
#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:43
#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:52
msgid "New Users"
msgstr "Nuevos Usuarios"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:106
msgid "No credit card required"
msgstr "No se requiere tarjeta de crédito"
#: apps/marketing/src/components/(marketing)/callout.tsx:29
#: apps/marketing/src/components/(marketing)/hero.tsx:125
msgid "No Credit Card required"
msgstr "No se requiere tarjeta de crédito"
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:61
msgid "None of these work for you? Try self-hosting!"
msgstr "¿Ninguna de estas opciones funciona para ti? ¡Prueba el autoalojamiento!"
#: apps/marketing/src/app/(marketing)/open/page.tsx:194
#: apps/marketing/src/app/(marketing)/open/page.tsx:252
msgid "Open Issues"
msgstr "Problemas Abiertos"
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:42
msgid "Open Source or Hosted."
msgstr "Código Abierto o Alojado."
#: apps/marketing/src/app/(marketing)/open/page.tsx:161
#: apps/marketing/src/components/(marketing)/footer.tsx:37
#: apps/marketing/src/components/(marketing)/header.tsx:64
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:40
msgid "Open Startup"
msgstr "Startup Abierta"
#: apps/marketing/src/components/(marketing)/footer.tsx:41
msgid "OSS Friends"
msgstr "Amigos OSS"
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:91
msgid "Our custom templates come with smart rules that can help you save time and energy."
msgstr "Nuestras plantillas personalizadas vienen con reglas inteligentes que pueden ayudarte a ahorrar tiempo y energía."
#: apps/marketing/src/components/(marketing)/enterprise.tsx:20
msgid "Our Enterprise License is great for large organizations looking to switch to Documenso for all their signing needs. It's available for our cloud offering as well as self-hosted setups and offers a wide range of compliance and Adminstration Features."
msgstr "Nuestra Licencia Empresarial es excelente para grandes organizaciones que buscan cambiar a Documenso para todas sus necesidades de firma. Está disponible para nuestra oferta en la nube, así como para configuraciones autoalojadas y ofrece una amplia gama de funciones de cumplimiento y administración."
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:65
msgid "Our self-hosted option is great for small teams and individuals who need a simple solution. You can use our docker based setup to get started in minutes. Take control with full customizability and data ownership."
msgstr "Nuestra opción de autoalojamiento es excelente para pequeños equipos e individuos que necesitan una solución simple. Puedes usar nuestra configuración basada en docker para empezar en minutos. Toma el control con total personalización y propiedad de los datos."
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:151
msgid "Premium Profile Name"
msgstr "Nombre de Perfil Premium"
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:40
#: apps/marketing/src/components/(marketing)/footer.tsx:31
#: apps/marketing/src/components/(marketing)/header.tsx:42
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:24
msgid "Pricing"
msgstr "Precios"
#: apps/marketing/src/components/(marketing)/footer.tsx:43
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:53
msgid "Privacy"
msgstr "Privacidad"
#: apps/marketing/src/components/(marketing)/carousel.tsx:58
msgid "Profile"
msgstr "Perfil"
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:108
msgid "React Widget (Soon)."
msgstr "Widget de React (Pronto)."
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:48
msgid "Receive your personal link to share with everyone you care about."
msgstr "Recibe tu enlace personal para compartirlo con todos los que te importan."
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:37
msgid "Role"
msgstr "Rol"
#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:37
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:40
msgid "Salary"
msgstr "Salario"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:62
msgid "Save $60 or $120"
msgstr "Ahorra $60 o $120"
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:109
msgid "Securely. Our data centers are located in Frankfurt (Germany), giving us the best local privacy laws. We are very aware of the sensitive nature of our data and follow best practices to ensure the security and integrity of the data entrusted to us."
msgstr "De manera segura. Nuestros centros de datos están ubicados en Frankfurt (Alemania), dándonos las mejores leyes de privacidad locales. Somos muy conscientes de la naturaleza sensible de nuestros datos y seguimos las mejores prácticas para garantizar la seguridad y la integridad de los datos que se nos confían."
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:37
msgid "Send, connect, receive and embed everywhere."
msgstr "Enviar, conectar, recibir e incrustar en todas partes."
#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:34
msgid "Seniority"
msgstr "Antigüedad"
#: apps/marketing/src/components/(marketing)/footer.tsx:39
msgid "Shop"
msgstr "Tienda"
#: apps/marketing/src/app/(marketing)/singleplayer/client.tsx:63
msgid "Sign"
msgstr "Firmar"
#: apps/marketing/src/components/(marketing)/header.tsx:72
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:61
msgid "Sign in"
msgstr "Iniciar sesión"
#: apps/marketing/src/components/(marketing)/header.tsx:77
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:57
msgid "Sign up"
msgstr "Registrarse"
#: apps/marketing/src/components/(marketing)/carousel.tsx:22
msgid "Signing Process"
msgstr "Proceso de firma"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:94
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:136
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:180
msgid "Signup Now"
msgstr "Regístrate ahora"
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:89
msgid "Smart."
msgstr "Inteligente."
#: apps/marketing/src/components/(marketing)/hero.tsx:132
msgid "Star on GitHub"
msgstr "Estrella en GitHub"
#: apps/marketing/src/app/(marketing)/open/page.tsx:226
msgid "Stars"
msgstr "Estrellas"
#: apps/marketing/src/components/(marketing)/footer.tsx:40
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:44
msgid "Status"
msgstr "Estado"
#: apps/marketing/src/components/(marketing)/footer.tsx:34
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:48
msgid "Support"
msgstr "Soporte"
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:26
msgid "Team"
msgstr "Equipo"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:195
msgid "Team Inbox"
msgstr "Bandeja de entrada del equipo"
#: apps/marketing/src/components/(marketing)/carousel.tsx:28
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:162
msgid "Teams"
msgstr "Equipos"
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:83
msgid "Template Store (Soon)."
msgstr "Tienda de Plantillas (Pronto)."
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:138
msgid "That's awesome. You can take a look at the current <0>Issues</0> and join our <1>Discord Community</1> to keep up to date, on what the current priorities are. In any case, we are an open community and welcome all input, technical and non-technical ❤️"
msgstr "Eso es increíble. Puedes echar un vistazo a los <0>Problemas</0> actuales y unirte a nuestra <1>Comunidad de Discord</1> para mantenerte al día sobre cuáles son las prioridades actuales. En cualquier caso, somos una comunidad abierta y agradecemos todas las aportaciones, técnicas y no técnicas ❤️"
#: apps/marketing/src/app/(marketing)/open/page.tsx:293
msgid "This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share."
msgstr "Esta página está evolucionando a medida que aprendemos lo que hace una gran empresa de firmas. La actualizaremos cuando tengamos más para compartir."
#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:31
msgid "Title"
msgstr "Título"
#: apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx:30
#: apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx:55
msgid "Total Completed Documents"
msgstr "Total de Documentos Completados"
#: apps/marketing/src/app/(marketing)/open/page.tsx:267
#: apps/marketing/src/app/(marketing)/open/page.tsx:268
msgid "Total Customers"
msgstr "Total de Clientes"
#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:29
msgid "Total Funding Raised"
msgstr "Total de Fondos Recaudados"
#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:30
#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:43
#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:52
msgid "Total Users"
msgstr "Total de Usuarios"
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:31
msgid "Truly your own."
msgstr "Realmente tuyo."
#: apps/marketing/src/components/(marketing)/callout.tsx:27
#: apps/marketing/src/components/(marketing)/hero.tsx:123
msgid "Try our Free Plan"
msgstr "Prueba nuestro Plan Gratuito"
#: apps/marketing/src/app/(marketing)/open/typefully.tsx:20
msgid "Twitter Stats"
msgstr "Estadísticas de Twitter"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:142
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:186
msgid "Unlimited Documents per Month"
msgstr "Documentos ilimitados por mes"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:103
msgid "Up to 10 recipients per document"
msgstr "Hasta 10 destinatarios por documento"
#: apps/marketing/src/app/(marketing)/singleplayer/client.tsx:52
msgid "Upload a document and add fields."
msgstr "Sube un documento y agrega campos."
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:123
msgid "Using our hosted version is the easiest way to get started, you can simply subscribe and start signing your documents. We take care of the infrastructure, so you can focus on your business. Additionally, when using our hosted version you benefit from our trusted signing certificates which helps you to build trust with your customers."
msgstr "Usar nuestra versión alojada es la forma más fácil de comenzar, simplemente puedes suscribirte y comenzar a firmar tus documentos. Nos ocupamos de la infraestructura, para que puedas concentrarte en tu negocio. Además, al utilizar nuestra versión alojada, te beneficias de nuestros certificados de firma confiables, lo que te ayuda a generar confianza con tus clientes."
#: apps/marketing/src/app/(marketing)/open/typefully.tsx:33
msgid "View all stats"
msgstr "Ver todas las estadísticas"
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:195
msgid "We are happy to assist you at <0>support@documenso.com</0> or <1>in our Discord-Support-Channel</1> please message either Lucas or Timur to get added to the channel if you are not already a member."
msgstr "Estamos felices de ayudarte en <0>support@documenso.com</0> o <1>en nuestro canal de soporte de Discord</1>. Mensaje a Lucas o Timur para que te agreguen al canal si aún no eres miembro."
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:89
msgid "What is the difference between the plans?"
msgstr "¿Cuál es la diferencia entre los planes?"
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:47
msgid "When it comes to sending or receiving a contract, you can count on lightning-fast speeds."
msgstr "Cuando se trata de enviar o recibir un contrato, puedes contar con velocidades ultrarrápidas."
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:191
msgid "Where can I get support?"
msgstr "¿Dónde puedo obtener soporte?"
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:177
msgid "Why should I prefer Documenso over DocuSign or some other signing tool?"
msgstr "¿Por qué debería preferir Documenso sobre DocuSign u otra herramienta de firma?"
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:119
msgid "Why should I use your hosting service?"
msgstr "¿Por qué debería usar su servicio de alojamiento?"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:60
msgid "Yearly"
msgstr "Anual"
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:167
msgid "Yes! Documenso is offered under the GNU AGPL V3 open source license. This means you can use it for free and even modify it to fit your needs, as long as you publish your changes under the same license."
msgstr "¡Sí! Documenso se ofrece bajo la licencia de código abierto GNU AGPL V3. Esto significa que puedes usarlo de forma gratuita e incluso modificarlo para adaptarlo a tus necesidades, siempre que publiques tus cambios bajo la misma licencia."
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:93
msgid "You can self-host Documenso for free or use our ready-to-use hosted version. The hosted version comes with additional support, painless scalability and more. Early adopters will get access to all features we build this year, for no additional cost! Forever! Yes, that includes multiple users per account later. If you want Documenso for your enterprise, we are happy to talk about your needs."
msgstr "Puedes autoalojar Documenso de forma gratuita o usar nuestra versión alojada lista para usar. La versión alojada viene con soporte adicional, escalabilidad sin problemas y más. Los primeros adoptantes tendrán acceso a todas las funciones que construimos este año, sin costo adicional. ¡Para siempre! Sí, eso incluye múltiples usuarios por cuenta más adelante. Si quieres Documenso para tu empresa, estaremos encantados de hablar sobre tus necesidades."
#: apps/marketing/src/components/(marketing)/carousel.tsx:272
msgid "Your browser does not support the video tag."
msgstr "Tu navegador no soporta la etiqueta de video."

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: fr\n"
"Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-09-19 09:18\n"
"PO-Revision-Date: 2024-11-01 04:00\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
@@ -73,11 +73,11 @@ msgstr "Ajouter un ID externe au document. Cela peut être utilisé pour identif
msgid "Add an external ID to the template. This can be used to identify in external systems."
msgstr "Ajouter un ID externe au modèle. Cela peut être utilisé pour identifier dans des systèmes externes."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:177
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:187
msgid "Add another option"
msgstr "Ajouter une autre option"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:230
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:232
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:167
msgid "Add another value"
msgstr "Ajouter une autre valeur"
@@ -98,11 +98,11 @@ msgstr "Ajouter un destinataire de substitution"
msgid "Add Signer"
msgstr "Ajouter un signataire"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:70
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:73
msgid "Add text"
msgstr "Ajouter du texte"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:75
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:78
msgid "Add text to the field"
msgstr "Ajouter du texte au champ"
@@ -115,8 +115,8 @@ msgstr "Administrateur"
msgid "Advanced Options"
msgstr "Options avancées"
#: packages/ui/primitives/document-flow/add-fields.tsx:565
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
#: packages/ui/primitives/document-flow/add-fields.tsx:573
#: packages/ui/primitives/template-flow/add-template-fields.tsx:406
msgid "Advanced settings"
msgstr "Paramètres avancés"
@@ -124,6 +124,10 @@ msgstr "Paramètres avancés"
msgid "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email."
msgstr "Après soumission, un document sera automatiquement généré et ajouté à votre page de documents. Vous recevrez également une notification par email."
#: packages/ui/primitives/pdf-viewer.tsx:167
msgid "An error occurred while loading the document."
msgstr "Une erreur s'est produite lors du chargement du document."
#: packages/lib/constants/recipient-roles.ts:8
msgid "Approve"
msgstr "Approuver"
@@ -136,19 +140,23 @@ msgstr "Approuvé"
msgid "Approver"
msgstr "Approuveur"
#: packages/lib/constants/recipient-roles.ts:44
msgid "Approvers"
msgstr "Approbateurs"
#: packages/lib/constants/recipient-roles.ts:10
msgid "Approving"
msgstr "En attente d'approbation"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:276
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
msgid "Black"
msgstr "Noir"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:290
#: packages/ui/primitives/signature-pad/signature-pad.tsx:391
msgid "Blue"
msgstr "Bleu"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:287
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58
msgid "Cancel"
msgstr "Annuler"
@@ -170,16 +178,15 @@ msgstr "CC"
msgid "CC'd"
msgstr "CC'd"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:83
#: packages/lib/constants/recipient-roles.ts:51
msgid "Ccers"
msgstr "Ccers"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:86
msgid "Character Limit"
msgstr "Limite de caractères"
#: packages/ui/primitives/document-flow/add-fields.tsx:993
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
msgid "Checkbox"
msgstr "Case à cocher"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:195
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:197
msgid "Checkbox values"
msgstr "Valeurs de case à cocher"
@@ -187,7 +194,7 @@ msgstr "Valeurs de case à cocher"
msgid "Clear filters"
msgstr "Effacer les filtres"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:310
#: packages/ui/primitives/signature-pad/signature-pad.tsx:411
msgid "Clear Signature"
msgstr "Effacer la signature"
@@ -203,8 +210,8 @@ msgstr "Fermer"
msgid "Configure Direct Recipient"
msgstr "Configurer le destinataire direct"
#: packages/ui/primitives/document-flow/add-fields.tsx:566
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
#: packages/ui/primitives/document-flow/add-fields.tsx:574
#: packages/ui/primitives/template-flow/add-template-fields.tsx:407
msgid "Configure the {0} field"
msgstr "Configurer le champ {0}"
@@ -216,12 +223,17 @@ msgstr "Continuer"
msgid "Copied to clipboard"
msgstr "Copié dans le presse-papiers"
#: packages/ui/components/document/document-share-button.tsx:194
msgid "Copy Link"
msgstr "Copier le lien"
#: packages/ui/primitives/document-flow/add-signature.tsx:360
msgid "Custom Text"
msgstr "Texte personnalisé"
#: packages/ui/primitives/document-flow/add-fields.tsx:889
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
#: packages/ui/primitives/document-flow/add-fields.tsx:927
#: packages/ui/primitives/document-flow/types.ts:53
#: packages/ui/primitives/template-flow/add-template-fields.tsx:690
msgid "Date"
msgstr "Date"
@@ -252,31 +264,37 @@ msgstr "Télécharger"
msgid "Drag & drop your PDF here."
msgstr "Faites glisser et déposez votre PDF ici."
#: packages/ui/primitives/document-flow/add-fields.tsx:1019
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
#: packages/ui/primitives/document-flow/add-fields.tsx:1058
#: packages/ui/primitives/template-flow/add-template-fields.tsx:820
msgid "Dropdown"
msgstr "Liste déroulante"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:148
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:158
msgid "Dropdown options"
msgstr "Options de liste déroulante"
#: packages/ui/primitives/document-flow/add-fields.tsx:837
#: packages/ui/primitives/document-flow/add-fields.tsx:875
#: packages/ui/primitives/document-flow/add-signature.tsx:272
#: packages/ui/primitives/document-flow/add-signers.tsx:500
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
#: packages/ui/primitives/document-flow/add-signers.tsx:507
#: packages/ui/primitives/document-flow/types.ts:54
#: packages/ui/primitives/template-flow/add-template-fields.tsx:638
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:463
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:470
msgid "Email"
msgstr "Email"
#: packages/ui/primitives/document-flow/add-signature.types.ts:7
msgid "Email is required"
msgstr "L'email est requis"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:184
msgid "Email Options"
msgstr "Options d'email"
#: packages/ui/primitives/document-flow/add-fields.tsx:1082
#: packages/ui/primitives/document-flow/add-fields.tsx:1123
msgid "Empty field"
msgstr ""
msgstr "Champ vide"
#: packages/lib/constants/template.ts:8
msgid "Enable Direct Link Signing"
@@ -287,11 +305,16 @@ msgstr "Activer la signature de lien direct"
msgid "Enable signing order"
msgstr "Activer l'ordre de signature"
#: packages/ui/primitives/document-flow/add-fields.tsx:795
msgid "Enable Typed Signatures"
msgstr "Activer les signatures tapées"
#: packages/ui/primitives/document-password-dialog.tsx:84
msgid "Enter password"
msgstr "Entrez le mot de passe"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:216
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:257
#: packages/ui/primitives/pdf-viewer.tsx:166
msgid "Error"
msgstr "Erreur"
@@ -300,26 +323,48 @@ msgstr "Erreur"
msgid "External ID"
msgstr "ID externe"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:217
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:258
msgid "Failed to save settings."
msgstr "Échec de l'enregistrement des paramètres."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:90
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93
msgid "Field character limit"
msgstr "Limite de caractères du champ"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:107
#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:62
#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:44
#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:44
#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:44
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107
msgid "Field font size"
msgstr "Taille de police du champ"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:110
msgid "Field format"
msgstr "Format du champ"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:50
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:53
msgid "Field label"
msgstr "Étiquette du champ"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:62
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:65
msgid "Field placeholder"
msgstr "Espace réservé du champ"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:56
#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:38
#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:38
#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:38
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101
msgid "Font Size"
msgstr "Taille de Police"
#: packages/ui/primitives/document-flow/types.ts:50
msgid "Free Signature"
msgstr "Signature gratuite"
#: packages/ui/components/document/document-global-auth-action-select.tsx:64
msgid "Global recipient action authentication"
msgstr "Authentification d'action de destinataire globale"
@@ -328,46 +373,59 @@ msgstr "Authentification d'action de destinataire globale"
msgid "Go Back"
msgstr "Retourner"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:297
#: packages/ui/primitives/signature-pad/signature-pad.tsx:398
msgid "Green"
msgstr "Vert"
#: packages/lib/constants/recipient-roles.ts:72
#: packages/lib/constants/recipient-roles.ts:76
msgid "I am a signer of this document"
msgstr "Je suis un signataire de ce document"
#: packages/lib/constants/recipient-roles.ts:75
#: packages/lib/constants/recipient-roles.ts:79
msgid "I am a viewer of this document"
msgstr "Je suis un visualiseur de ce document"
#: packages/lib/constants/recipient-roles.ts:73
#: packages/lib/constants/recipient-roles.ts:77
msgid "I am an approver of this document"
msgstr "Je suis un approuveur de ce document"
#: packages/lib/constants/recipient-roles.ts:74
#: packages/lib/constants/recipient-roles.ts:78
msgid "I am required to receive a copy of this document"
msgstr "Je dois recevoir une copie de ce document"
#: packages/lib/constants/recipient-roles.ts:74
#~ msgid "I am required to recieve a copy of this document"
#~ msgstr "I am required to recieve a copy of this document"
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:29
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:87
msgid "Inherit authentication method"
msgstr "Hériter de la méthode d'authentification"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:64
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:69
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:45
#: packages/ui/primitives/document-flow/types.ts:51
msgid "Initials"
msgstr "Initiales"
#: packages/ui/primitives/document-flow/add-signers.types.ts:17
msgid "Invalid email"
msgstr "Email invalide"
#: packages/ui/primitives/document-flow/add-signature.types.ts:8
msgid "Invalid email address"
msgstr "Adresse email invalide"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48
msgid "Label"
msgstr "Étiquette"
#: packages/ui/primitives/lazy-pdf-viewer.tsx:15
#: packages/ui/primitives/pdf-viewer.tsx:44
msgid "Loading document..."
msgstr "Chargement du document..."
#: packages/lib/constants/teams.ts:11
msgid "Manager"
msgstr "Gestionnaire"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:168
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188
msgid "Max"
msgstr "Max"
@@ -380,15 +438,16 @@ msgstr "Membre"
msgid "Message <0>(Optional)</0>"
msgstr "Message <0>(Optionnel)</0>"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:156
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:176
msgid "Min"
msgstr "Min"
#: packages/ui/primitives/document-flow/add-fields.tsx:863
#: packages/ui/primitives/document-flow/add-fields.tsx:901
#: packages/ui/primitives/document-flow/add-signature.tsx:298
#: packages/ui/primitives/document-flow/add-signers.tsx:535
#: packages/ui/primitives/document-flow/add-signers.tsx:541
#: packages/ui/primitives/template-flow/add-template-fields.tsx:658
#: packages/ui/primitives/document-flow/types.ts:55
#: packages/ui/primitives/template-flow/add-template-fields.tsx:664
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:498
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:504
msgid "Name"
@@ -406,13 +465,13 @@ msgstr "Nécessite une signature"
msgid "Needs to view"
msgstr "Nécessite une visualisation"
#: packages/ui/primitives/document-flow/add-fields.tsx:674
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
#: packages/ui/primitives/document-flow/add-fields.tsx:686
#: packages/ui/primitives/template-flow/add-template-fields.tsx:504
msgid "No recipient matching this description was found."
msgstr "Aucun destinataire correspondant à cette description n'a été trouvé."
#: packages/ui/primitives/document-flow/add-fields.tsx:690
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
#: packages/ui/primitives/document-flow/add-fields.tsx:701
#: packages/ui/primitives/template-flow/add-template-fields.tsx:519
msgid "No recipients with this role"
msgstr "Aucun destinataire avec ce rôle"
@@ -436,12 +495,13 @@ msgstr "Aucun champ de signature trouvé"
msgid "No value found."
msgstr "Aucune valeur trouvée."
#: packages/ui/primitives/document-flow/add-fields.tsx:941
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
#: packages/ui/primitives/document-flow/add-fields.tsx:979
#: packages/ui/primitives/document-flow/types.ts:56
#: packages/ui/primitives/template-flow/add-template-fields.tsx:742
msgid "Number"
msgstr "Numéro"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:100
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:103
msgid "Number format"
msgstr "Format de numéro"
@@ -457,22 +517,30 @@ msgstr "Une fois votre modèle configuré, partagez le lien où vous le souhaite
msgid "Page {0} of {1}"
msgstr "Page {0} sur {1}"
#: packages/ui/primitives/pdf-viewer.tsx:259
msgid "Page {0} of {numPages}"
msgstr "Page {0} sur {numPages}"
#: packages/ui/primitives/document-password-dialog.tsx:62
msgid "Password Required"
msgstr "Mot de passe requis"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:154
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156
msgid "Pick a number"
msgstr "Choisissez un numéro"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:76
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:81
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:57
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:79
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:84
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60
msgid "Placeholder"
msgstr "Espace réservé"
#: packages/ui/primitives/document-flow/add-fields.tsx:967
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
#: packages/ui/primitives/pdf-viewer.tsx:223
#: packages/ui/primitives/pdf-viewer.tsx:238
msgid "Please try again or contact our support."
msgstr "Veuillez réessayer ou contacter notre support."
#: packages/ui/primitives/template-flow/add-template-fields.tsx:768
msgid "Radio"
msgstr "Radio"
@@ -480,11 +548,11 @@ msgstr "Radio"
msgid "Radio values"
msgstr "Valeurs radio"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:184
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:136
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:186
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:147
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:156
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:122
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:114
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:133
msgid "Read only"
msgstr "Lecture seule"
@@ -498,7 +566,7 @@ msgstr "Recevoir une copie"
msgid "Recipient action authentication"
msgstr "Authentification d'action de destinataire"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:283
#: packages/ui/primitives/signature-pad/signature-pad.tsx:384
msgid "Red"
msgstr "Rouge"
@@ -507,27 +575,31 @@ msgstr "Rouge"
msgid "Redirect URL"
msgstr "URL de redirection"
#: packages/ui/primitives/document-flow/add-fields.tsx:1069
#: packages/ui/primitives/document-flow/add-fields.tsx:1110
msgid "Remove"
msgstr "Retirer"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:174
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:127
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:126
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:176
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:146
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:112
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:104
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:123
msgid "Required field"
msgstr "Champ requis"
#: packages/ui/components/document/document-share-button.tsx:147
msgid "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!"
msgstr "Soyez assuré, votre document eststrictement confidentiel et ne sera jamais partagé. Seule votre expérience de signature sera mise en avant. Partagez votre carte de signature personnalisée pour mettre en valeur votre signature !"
#: packages/ui/primitives/data-table-pagination.tsx:55
msgid "Rows per page"
msgstr "Lignes par page"
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:286
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:355
msgid "Save"
msgstr "Sauvegarder"
#: packages/ui/primitives/template-flow/add-template-fields.tsx:848
#: packages/ui/primitives/template-flow/add-template-fields.tsx:854
msgid "Save Template"
msgstr "Sauvegarder le modèle"
@@ -535,7 +607,7 @@ msgstr "Sauvegarder le modèle"
msgid "Search languages..."
msgstr "Rechercher des langues..."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:105
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:115
msgid "Select"
msgstr "Sélectionner"
@@ -543,11 +615,11 @@ msgstr "Sélectionner"
msgid "Select an option"
msgstr "Sélectionner une option"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:137
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:139
msgid "Select at least"
msgstr "Sélectionnez au moins"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:95
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:105
msgid "Select default option"
msgstr "Sélectionner l'option par défaut"
@@ -569,6 +641,10 @@ msgstr "Partager la carte de signature"
msgid "Share the Link"
msgstr "Partager le lien"
#: packages/ui/components/document/document-share-button.tsx:143
msgid "Share your signing experience!"
msgstr "Partagez votre expérience de signature !"
#: packages/ui/primitives/document-flow/add-signers.tsx:680
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:655
msgid "Show advanced settings"
@@ -578,10 +654,11 @@ msgstr "Afficher les paramètres avancés"
msgid "Sign"
msgstr "Signer"
#: packages/ui/primitives/document-flow/add-fields.tsx:785
#: packages/ui/primitives/document-flow/add-fields.tsx:823
#: packages/ui/primitives/document-flow/add-signature.tsx:323
#: packages/ui/primitives/document-flow/field-icon.tsx:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
#: packages/ui/primitives/document-flow/types.ts:49
#: packages/ui/primitives/template-flow/add-template-fields.tsx:586
msgid "Signature"
msgstr "Signature"
@@ -593,6 +670,14 @@ msgstr "Signé"
msgid "Signer"
msgstr "Signataire"
#: packages/lib/constants/recipient-roles.ts:58
msgid "Signers"
msgstr "Signataires"
#: packages/ui/primitives/document-flow/add-signers.types.ts:36
msgid "Signers must have unique emails"
msgstr "Les signataires doivent avoir des e-mails uniques"
#: packages/lib/constants/recipient-roles.ts:22
msgid "Signing"
msgstr "Signature en cours"
@@ -605,6 +690,11 @@ msgstr "Certains signataires n'ont pas été assignés à un champ de signature.
msgid "Something went wrong"
msgstr "Quelque chose a mal tourné"
#: packages/ui/primitives/pdf-viewer.tsx:220
#: packages/ui/primitives/pdf-viewer.tsx:235
msgid "Something went wrong while loading the document."
msgstr "Une erreur s'est produite lors du chargement du document."
#: packages/ui/primitives/data-table.tsx:136
msgid "Something went wrong."
msgstr "Quelque chose a mal tourné."
@@ -626,8 +716,9 @@ msgstr "Soumettre"
msgid "Template title"
msgstr "Titre du modèle"
#: packages/ui/primitives/document-flow/add-fields.tsx:915
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
#: packages/ui/primitives/document-flow/add-fields.tsx:953
#: packages/ui/primitives/document-flow/types.ts:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:716
msgid "Text"
msgstr "Texte"
@@ -687,7 +778,7 @@ msgstr "Le nom du signataire"
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
msgstr "Cela peut être remplacé par le paramétrage direct des exigences d'authentification pour chaque destinataire à l'étape suivante."
#: packages/ui/primitives/document-flow/add-fields.tsx:746
#: packages/ui/primitives/document-flow/add-fields.tsx:757
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
msgstr "Ce document a déjà été envoyé à ce destinataire. Vous ne pouvez plus modifier ce destinataire."
@@ -699,17 +790,13 @@ msgstr "Ce document est protégé par mot de passe. Veuillez entrer le mot de pa
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
msgstr "Ce champ ne peut pas être modifié ou supprimé. Lorsque vous partagez le lien direct de ce modèle ou l'ajoutez à votre profil public, toute personne qui y accède peut saisir son nom et son email, et remplir les champs qui lui sont attribués."
#: packages/ui/primitives/document-flow/add-fields.tsx:1050
#: packages/ui/primitives/document-flow/add-fields.tsx:1090
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
msgstr ""
#: packages/ui/primitives/document-flow/add-signers.tsx:195
#~ msgid "This signer has already received the document."
#~ msgstr "Ce signataire a déjà reçu le document."
msgstr "Ce destinataire ne peut plus être modifié car il a signé un champ ou complété le document."
#: packages/ui/primitives/document-flow/add-signers.tsx:194
msgid "This signer has already signed the document."
msgstr ""
msgstr "Ce signataire a déjà signé le document."
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:48
msgid "This will override any global settings."
@@ -724,8 +811,8 @@ msgstr "Fuseau horaire"
msgid "Title"
msgstr "Titre"
#: packages/ui/primitives/document-flow/add-fields.tsx:1033
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
#: packages/ui/primitives/document-flow/add-fields.tsx:1073
#: packages/ui/primitives/template-flow/add-template-fields.tsx:834
msgid "To proceed further, please set at least one value for the {0} field."
msgstr "Pour continuer, veuillez définir au moins une valeur pour le champ {0}."
@@ -745,13 +832,13 @@ msgstr "Améliorer"
msgid "Upload Template Document"
msgstr "Télécharger le document modèle"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:130
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:147
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:132
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167
msgid "Validation"
msgstr "Validation"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:88
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:93
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:91
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:96
msgid "Value"
msgstr "Valeur"
@@ -767,14 +854,14 @@ msgstr "Vu"
msgid "Viewer"
msgstr "Visiteur"
#: packages/lib/constants/recipient-roles.ts:65
msgid "Viewers"
msgstr "Spectateurs"
#: packages/lib/constants/recipient-roles.ts:28
msgid "Viewing"
msgstr "Visionnage"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:280
#~ msgid "White"
#~ msgstr "White"
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:44
msgid "You are about to send this document to the recipients. Are you sure you want to continue?"
msgstr "Vous êtes sur le point d'envoyer ce document aux destinataires. Êtes-vous sûr de vouloir continuer ?"
@@ -790,3 +877,4 @@ msgstr "Vous ne pouvez pas télécharger de documents pour le moment."
#: packages/ui/primitives/document-dropzone.tsx:69
msgid "You have reached your document limit."
msgstr "Vous avez atteint votre limite de documents."

File diff suppressed because one or more lines are too long

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: fr\n"
"Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-09-19 09:18\n"
"PO-Revision-Date: 2024-11-01 02:29\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
@@ -160,10 +160,6 @@ msgstr "Documentation"
msgid "Easily embed Documenso into your product. Simply copy and paste our react widget into your application."
msgstr "Intégrez facilement Documenso dans votre produit. Il vous suffit de copier et coller notre widget React dans votre application."
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:42
#~ msgid "Easy Sharing (Soon)."
#~ msgstr "Easy Sharing (Soon)."
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:46
msgid "Easy Sharing."
msgstr "Partage facile."
@@ -377,18 +373,10 @@ msgstr "Nos modèles personnalisés sont dotés de règles intelligentes qui peu
msgid "Our Enterprise License is great for large organizations looking to switch to Documenso for all their signing needs. It's available for our cloud offering as well as self-hosted setups and offers a wide range of compliance and Adminstration Features."
msgstr "Notre licence entreprise est idéale pour les grandes organisations cherchant à passer à Documenso pour tous leurs besoins de signature. Elle est disponible pour notre offre cloud ainsi que pour des configurations auto-hébergées et propose un large éventail de fonctionnalités de conformité et d'administration."
#: apps/marketing/src/components/(marketing)/enterprise.tsx:20
#~ msgid "Our Enterprise License is great large organizations looking to switch to Documenso for all their signing needs. It's availible for our cloud offering as well as self-hosted setups and offer a wide range of compliance and Adminstration Features."
#~ msgstr "Our Enterprise License is great large organizations looking to switch to Documenso for all their signing needs. It's availible for our cloud offering as well as self-hosted setups and offer a wide range of compliance and Adminstration Features."
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:65
msgid "Our self-hosted option is great for small teams and individuals who need a simple solution. You can use our docker based setup to get started in minutes. Take control with full customizability and data ownership."
msgstr "Notre option auto-hébergée est idéale pour les petites équipes et les individus qui ont besoin d'une solution simple. Vous pouvez utiliser notre configuration basée sur Docker pour commencer en quelques minutes. Prenez le contrôle avec une personnalisation complète et une propriété des données."
#: apps/marketing/src/app/(marketing)/open/data.ts:25
#~ msgid "Part-Time"
#~ msgstr "Temps partiel"
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:151
msgid "Premium Profile Name"
msgstr "Nom de profil premium"
@@ -430,10 +418,6 @@ msgstr "Salaire"
msgid "Save $60 or $120"
msgstr "Économisez 60 $ ou 120 $"
#: apps/marketing/src/components/(marketing)/i18n-switcher.tsx:47
#~ msgid "Search languages..."
#~ msgstr "Search languages..."
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:109
msgid "Securely. Our data centers are located in Frankfurt (Germany), giving us the best local privacy laws. We are very aware of the sensitive nature of our data and follow best practices to ensure the security and integrity of the data entrusted to us."
msgstr "De manière sécurisée. Nos centres de données sont situés à Francfort (Allemagne), ce qui nous permet de bénéficier des meilleures lois locales sur la confidentialité. Nous sommes très conscients de la nature sensible de nos données et suivons les meilleures pratiques pour garantir la sécurité et l'intégrité des données qui nous sont confiées."
@@ -618,3 +602,4 @@ msgstr "Vous pouvez auto-héberger Documenso gratuitement ou utiliser notre vers
#: apps/marketing/src/components/(marketing)/carousel.tsx:272
msgid "Your browser does not support the video tag."
msgstr "Votre navigateur ne prend pas en charge la balise vidéo."

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
/*eslint-disable*/module.exports={messages:JSON.parse("{}")};

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