Compare commits

...

18 Commits

Author SHA1 Message Date
2b1b042097 chore: code changes based of review 2024-11-21 21:21:42 +00:00
31dc403500 Merge branch 'main' into expiry-links 2024-11-21 18:14:35 +00:00
11e483f1c4 chore: update changelog 2024-11-21 13:10:31 +11:00
2e2bc8382f v1.8.1-rc.0 2024-11-20 23:02:32 +11:00
1f3a9b578b chore: add translations (#1485)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

## Release Notes

- **New Features**
- Enhanced German, Spanish, French, and Polish translations for various
document management and marketing phrases.

- **Improvements**
- Updated translations for clarity and accuracy across multiple
languages, including user notifications and document actions.
- Added new translation entries to improve user experience and
localization in the Documenso application.

- **Chores**
- Updated revision dates in translation files to reflect recent changes.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2024-11-20 23:00:59 +11:00
83e7a3c222 fix: improve field sizing (#1486)
## Description

Allows for smaller field sizing in addition to improving our styling
when displaying labels on smaller fields.

This is the minimum currently supported field size until we perform a
more extensive refactor of our current drag and drop system.

## Related Issue

Reported via support channels

## Changes Made

- Updated our minimum size constraints
- Attempted to add a general autosizing component for text and failed
- Updated styling in a bunch of places to use the css `clamp()` method
for dynamic sizing.
2024-11-20 22:49:30 +11:00
9ef8b1f0c3 feat: automatically sign fields in large documents (#1484)
## Description

Adds a dialog that will display when a certain field threshold is
reached asking the user if they would like to sign non-critical fields
such as name, date, initials, and email with information that is already
available.

This has not been added to direct templates since we would often not
have all the pre-requisite knowledge since users are mostly anonymous.
Additionally, this has not been added to the embedding view since it may
detract from the experience for some.

Will not prompt the user if there is action authentication on the
document.

See the below demo:


https://github.com/user-attachments/assets/71739b5c-1323-4da9-89fd-a1145c9714d5

## Related Issue

#1281 (Older PR relating to the feature)

## Changes Made

- Added a new auto-sign dialog that will automatically trigger once
certain criteria is met.

## Testing Performed

- Tested that the dialog displays when the threshold is met
- Tested that the dialog is hidden when the threshold is not met
- Tested that the messaging during errors is correct
- Tested that the dialog does not display when 2FA or Passkeys are
required
2024-11-20 10:59:09 +11:00
cfb57c8c27 Merge branch 'main' into expiry-links 2024-11-19 11:09:46 +00:00
2d7988f484 feat: update recipient expiry handling 2024-11-17 22:57:40 +00:00
ba627e22c5 feat: show recipient as expired on document page view 2024-11-17 17:52:28 +00:00
6e9d17f8ea feat: audit logS 2024-11-17 16:56:15 +00:00
8491c69e8c feat: period select for expiry 2024-11-17 16:06:10 +00:00
c422317566 feat: recipient expired on dashboard 2024-11-17 12:55:37 +00:00
316dbee446 feat: prevent signing when expired 2024-11-17 12:12:27 +00:00
79d0cd7de5 feat: use existing expiry date if available 2024-11-17 11:11:45 +00:00
e31a10a943 feat: expiry endpoint 2024-11-17 11:02:52 +00:00
ca2b6bea95 feat: expiry dialog 2024-11-17 09:46:41 +00:00
63830fb257 chore: add expired signing status 2024-11-16 09:34:59 +00:00
71 changed files with 2145 additions and 519 deletions

View File

@ -8,6 +8,59 @@ Check out what's new in the latest version and read our thoughts on it. For more
---
# Documenso v1.8.0: Team Preferences, Signature Rejection, and Document Distribution
We're excited to announce the release of Documenso v1.8.0! This update brings powerful new features to enhance your document signing process. Here's what's new:
## 🌟 Key New Features
### 1. Team Preferences
Introducing **Team Preferences**, allowing administrators to configure settings and preferences that apply to documents across the entire team. This feature ensures consistency and simplifies management by letting you set default options, permissions, and preferences that automatically apply to all team members.
![Team Preferences](/changelog/v1_8_0/team-global-settings.jpeg)
### 2. Signature Rejection
Recipients now have the option to **reject signatures**. This feature enhances communication by allowing recipients to decline signing, providing feedback or requesting changes before the document is finalized.
<video
src="/changelog/v1_8_0/reject-document.mp4"
className="aspect-video w-full"
autoPlay
loop
controls
/>
### 3. Document Distribution Settings
With the new **Document Distribution Settings**, you have greater control over how your documents are shared. Distribute communications via our automated emails and templates or take full control using our API and your own notifications infrastructure.
## 🔧 Other Improvements
- **Support for Gmail SMTP Service**: Adds support for using Gmail as your SMTP service provider.
- **Certificate and Email Translations**: Added support for multiple languages in document certificates and emails, enhancing the experience for international users.
- **Field Movement Fixes**: Resolved issues related to moving fields within documents, improving the document preparation experience.
- **Docker Environment Update**: Improved Docker setup for smoother deployments and better environment consistency.
- **Billing Access Improvements**: Users now have uninterrupted access to billing information, simplifying account management.
- **Support Time Windows for 2FA Tokens**: Enhanced two-factor authentication by supporting time windows in 2FA tokens, improving flexibility.
## 💡 Recent Features
Don't forget to take advantage of these powerful features from our recent releases:
- **Signing Order**: Define the sequence in which recipients sign your documents for a structured signing process.
- **Document Visibility Controls**: Manage who can view your documents and at what stages, offering greater privacy and control.
- **Embedded Signing Experience**: Integrate the signing process directly into your own applications for a seamless user experience.
**👏 Thank You**
As always, we're grateful for the community's contributions and feedback. Your support helps us improve Documenso and deliver a top-notch open-source document signing solution.
We hope you enjoy the new features in Documenso v1.8.0. Happy signing!
---
# 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:

View File

@ -1,6 +1,6 @@
{
"name": "@documenso/marketing",
"version": "1.8.0-rc.4",
"version": "1.8.1-rc.0",
"private": true,
"license": "AGPL-3.0",
"scripts": {

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

View File

@ -1,6 +1,6 @@
{
"name": "@documenso/web",
"version": "1.8.0-rc.4",
"version": "1.8.1-rc.0",
"private": true,
"license": "AGPL-3.0",
"scripts": {

View File

@ -12,13 +12,14 @@ import {
MailOpenIcon,
PenIcon,
PlusIcon,
Timer,
} from 'lucide-react';
import { match } from 'ts-pattern';
import { RECIPIENT_ROLES_DESCRIPTION } from '@documenso/lib/constants/recipient-roles';
import { formatSigningLink } from '@documenso/lib/utils/recipients';
import { DocumentStatus, RecipientRole, SigningStatus } from '@documenso/prisma/client';
import type { Document, Recipient } from '@documenso/prisma/client';
import { DocumentStatus, RecipientRole, SigningStatus } from '@documenso/prisma/client';
import { CopyTextButton } from '@documenso/ui/components/common/copy-text-button';
import { SignatureIcon } from '@documenso/ui/icons/signature';
import { AvatarWithText } from '@documenso/ui/primitives/avatar';
@ -132,6 +133,14 @@ export const DocumentPageViewRecipients = ({
</Badge>
)}
{document.status !== DocumentStatus.DRAFT &&
recipient.signingStatus === SigningStatus.EXPIRED && (
<Badge variant="destructive">
<Timer className="mr-1 h-3 w-3" />
<Trans>Expired</Trans>
</Badge>
)}
{document.status !== DocumentStatus.DRAFT &&
recipient.signingStatus === SigningStatus.REJECTED && (
<PopoverHover

View File

@ -15,9 +15,8 @@ import { getRecipientsForDocument } from '@documenso/lib/server-only/recipient/g
import { DocumentVisibility } from '@documenso/lib/types/document-visibility';
import { symmetricDecrypt } from '@documenso/lib/universal/crypto';
import { formatDocumentsPath } from '@documenso/lib/utils/teams';
import { DocumentStatus } from '@documenso/prisma/client';
import type { Team, TeamEmail } from '@documenso/prisma/client';
import { TeamMemberRole } from '@documenso/prisma/client';
import { DocumentStatus, SigningStatus, TeamMemberRole } from '@documenso/prisma/client';
import { Badge } from '@documenso/ui/primitives/badge';
import { Button } from '@documenso/ui/primitives/button';
import { Card, CardContent } from '@documenso/ui/primitives/card';
@ -218,7 +217,7 @@ export const DocumentPageView = async ({ params, team }: DocumentPageViewProps)
<DocumentPageViewDropdown document={documentWithRecipients} team={team} />
</div>
<p className="text-muted-foreground mt-2 px-4 text-sm ">
<p className="text-muted-foreground mt-2 px-4 text-sm">
{match(document.status)
.with(DocumentStatus.COMPLETED, () => (
<Trans>This document has been signed by all recipients</Trans>
@ -228,8 +227,52 @@ export const DocumentPageView = async ({ params, team }: DocumentPageViewProps)
))
.with(DocumentStatus.PENDING, () => {
const pendingRecipients = recipients.filter(
(recipient) => recipient.signingStatus === 'NOT_SIGNED',
(recipient) => recipient.signingStatus === SigningStatus.NOT_SIGNED,
);
const rejectedCount = recipients.filter(
(recipient) => recipient.signingStatus === SigningStatus.REJECTED,
).length;
const expiredCount = recipients.filter(
(recipient) => recipient.signingStatus === SigningStatus.EXPIRED,
).length;
if (rejectedCount > 0 && expiredCount > 0) {
return (
<>
<Plural
value={rejectedCount}
one="1 recipient has rejected the document"
other="# recipients have rejected the document"
/>
{' and '}
<Plural
value={expiredCount}
one="1 recipient's signing link has expired"
other="# recipients' signing links have expired"
/>
</>
);
}
if (rejectedCount > 0) {
return (
<Plural
value={rejectedCount}
one="1 recipient has rejected the document"
other="# recipients have rejected the document"
/>
);
}
if (expiredCount > 0) {
return (
<Plural
value={expiredCount}
one="1 recipient's signing link has expired"
other="# recipients' signing links have expired"
/>
);
}
return (
<Plural

View File

@ -419,6 +419,8 @@ export const EditDocumentForm = ({
isDocumentEnterprise={isDocumentEnterprise}
onSubmit={onAddSignersFormSubmit}
isDocumentPdfLoaded={isDocumentPdfLoaded}
documentId={document.id}
// teamId={team?.id}
/>
<AddFieldsFormPartial

View File

@ -100,7 +100,7 @@ export const ResendDocumentActionItem = ({
});
setIsOpen(false);
} catch (err) {
} catch {
toast({
title: _(msg`Something went wrong`),
description: _(msg`This document could not be re-sent at this time. Please try again.`),
@ -177,12 +177,7 @@ export const ResendDocumentActionItem = ({
<DialogFooter>
<div className="flex w-full flex-1 flex-nowrap gap-4">
<DialogClose asChild>
<Button
type="button"
className="dark:bg-muted dark:hover:bg-muted/80 flex-1 bg-black/5 hover:bg-black/10"
variant="secondary"
disabled={isSubmitting}
>
<Button type="button" className="flex-1" variant="secondary" disabled={isSubmitting}>
<Trans>Cancel</Trans>
</Button>
</DialogClose>

View File

@ -0,0 +1,237 @@
'use client';
import { useState, useTransition } from 'react';
import { useRouter } from 'next/navigation';
import { Plural, Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { useForm } from 'react-hook-form';
import { P, match } from 'ts-pattern';
import { unsafe_useEffectOnce } from '@documenso/lib/client-only/hooks/use-effect-once';
import { DocumentAuth } from '@documenso/lib/types/document-auth';
import { extractInitials } from '@documenso/lib/utils/recipient-formatter';
import type { Field, Recipient } from '@documenso/prisma/client';
import { FieldType } from '@documenso/prisma/client';
import { trpc } from '@documenso/trpc/react';
import { Button } from '@documenso/ui/primitives/button';
import {
Dialog,
DialogContent,
DialogFooter,
DialogHeader,
DialogTitle,
} from '@documenso/ui/primitives/dialog';
import { FRIENDLY_FIELD_TYPE } from '@documenso/ui/primitives/document-flow/types';
import { Form } from '@documenso/ui/primitives/form/form';
import { useToast } from '@documenso/ui/primitives/use-toast';
import { SigningDisclosure } from '~/components/general/signing-disclosure';
import { useRequiredDocumentAuthContext } from './document-auth-provider';
import { useRequiredSigningContext } from './provider';
const AUTO_SIGNABLE_FIELD_TYPES: string[] = [
FieldType.NAME,
FieldType.INITIALS,
FieldType.EMAIL,
FieldType.DATE,
];
// The action auth types that are not allowed to be auto signed
//
// Reasoning: If the action auth is a passkey or 2FA, it's likely that the owner of the document
// intends on having the user manually sign due to the additional security measures employed for
// other field types.
const NON_AUTO_SIGNABLE_ACTION_AUTH_TYPES: string[] = [
DocumentAuth.PASSKEY,
DocumentAuth.TWO_FACTOR_AUTH,
];
// The threshold for the number of fields that could be autosigned before displaying the dialog
//
// Reasoning: If there aren't that many fields, it's likely going to be easier to manually sign each one
// while for larger documents with many fields it will be beneficial to sign away the boilerplate fields.
const AUTO_SIGN_THRESHOLD = 5;
export type AutoSignProps = {
recipient: Pick<Recipient, 'id' | 'token'>;
fields: Field[];
};
export const AutoSign = ({ recipient, fields }: AutoSignProps) => {
const { _ } = useLingui();
const { toast } = useToast();
const router = useRouter();
const { email, fullName } = useRequiredSigningContext();
const { derivedRecipientActionAuth } = useRequiredDocumentAuthContext();
const [open, setOpen] = useState(false);
const [isPending, startTransition] = useTransition();
const form = useForm();
const { mutateAsync: signFieldWithToken } = trpc.field.signFieldWithToken.useMutation();
const autoSignableFields = fields.filter((field) => {
if (field.inserted) {
return false;
}
if (!AUTO_SIGNABLE_FIELD_TYPES.includes(field.type)) {
return false;
}
if (field.type === FieldType.NAME && !fullName) {
return false;
}
if (field.type === FieldType.INITIALS && !fullName) {
return false;
}
if (field.type === FieldType.EMAIL && !email) {
return false;
}
return true;
});
const actionAuthAllowsAutoSign = !NON_AUTO_SIGNABLE_ACTION_AUTH_TYPES.includes(
derivedRecipientActionAuth ?? '',
);
const onSubmit = async () => {
const results = await Promise.allSettled(
autoSignableFields.map(async (field) => {
const value = match(field.type)
.with(FieldType.NAME, () => fullName)
.with(FieldType.INITIALS, () => extractInitials(fullName))
.with(FieldType.EMAIL, () => email)
.with(FieldType.DATE, () => new Date().toISOString())
.otherwise(() => '');
const authOptions = match(derivedRecipientActionAuth)
.with(DocumentAuth.ACCOUNT, () => ({
type: DocumentAuth.ACCOUNT,
}))
.with(DocumentAuth.EXPLICIT_NONE, () => ({
type: DocumentAuth.EXPLICIT_NONE,
}))
.with(null, () => undefined)
.with(
P.union(DocumentAuth.PASSKEY, DocumentAuth.TWO_FACTOR_AUTH),
// This is a bit dirty, but the sentinel value used here is incredibly short-lived.
() => 'NOT_SUPPORTED' as const,
)
.exhaustive();
if (authOptions === 'NOT_SUPPORTED') {
throw new Error('Action auth is not supported for auto signing');
}
if (!value) {
throw new Error('No value to sign');
}
return await signFieldWithToken({
token: recipient.token,
fieldId: field.id,
value,
isBase64: false,
authOptions,
});
}),
);
if (results.some((result) => result.status === 'rejected')) {
toast({
title: _(msg`Error`),
description: _(
msg`An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields.`,
),
duration: 5000,
variant: 'destructive',
});
}
startTransition(() => {
router.refresh();
setOpen(false);
});
};
unsafe_useEffectOnce(() => {
if (actionAuthAllowsAutoSign && autoSignableFields.length > AUTO_SIGN_THRESHOLD) {
setOpen(true);
}
});
return (
<Dialog open={open} onOpenChange={setOpen}>
<DialogContent>
<DialogHeader>
<DialogTitle>Automatically sign fields</DialogTitle>
</DialogHeader>
<div className="text-muted-foreground max-w-[50ch]">
<p>
<Trans>
When you sign a document, we can automatically fill in and sign the following fields
using information that has already been provided. You can also manually sign or remove
any automatically signed fields afterwards if you desire.
</Trans>
</p>
<ul className="mt-4 flex list-inside list-disc flex-col gap-y-0.5">
{AUTO_SIGNABLE_FIELD_TYPES.map((fieldType) => (
<li key={fieldType}>
<Trans>{_(FRIENDLY_FIELD_TYPE[fieldType as FieldType])}</Trans>
<span className="pl-2 text-sm">
(
<Plural
value={autoSignableFields.filter((f) => f.type === fieldType).length}
one="1 matching field"
other="# matching fields"
/>
)
</span>
</li>
))}
</ul>
</div>
<SigningDisclosure className="mt-4" />
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)}>
<DialogFooter className="flex w-full flex-1 flex-nowrap gap-2">
<Button
type="button"
variant="secondary"
onClick={() => {
setOpen(false);
}}
>
<Trans>Cancel</Trans>
</Button>
<Button
type="submit"
className="min-w-[6rem]"
loading={form.formState.isSubmitting || isPending}
disabled={!autoSignableFields.length}
>
<Trans>Sign</Trans>
</Button>
</DialogFooter>
</form>
</Form>
</DialogContent>
</Dialog>
);
};

View File

@ -144,13 +144,13 @@ export const DateField = ({
)}
{!field.inserted && (
<p className="group-hover:text-primary text-muted-foreground duration-200 group-hover:text-yellow-300">
<p className="group-hover:text-primary text-muted-foreground text-[clamp(0.425rem,25cqw,0.825rem)] duration-200 group-hover:text-yellow-300">
<Trans>Date</Trans>
</p>
)}
{field.inserted && (
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.625rem,1cqw,0.825rem)] duration-200">
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.425rem,25cqw,0.825rem)] duration-200">
{localDateString}
</p>
)}

View File

@ -178,7 +178,7 @@ export const DropdownField = ({
)}
{!field.inserted && (
<p className="group-hover:text-primary text-muted-foreground flex flex-col items-center justify-center duration-200">
<p className="group-hover:text-primary text-muted-foreground flex flex-col items-center justify-center duration-200 ">
<Select value={localChoice} onValueChange={handleSelectItem}>
<SelectTrigger
className={cn(
@ -190,7 +190,7 @@ export const DropdownField = ({
)}
>
<SelectValue
className="text-[clamp(0.625rem,1cqw,0.825rem)]"
className="text-[clamp(0.425rem,25cqw,0.825rem)]"
placeholder={`${_(msg`Select`)}`}
/>
</SelectTrigger>
@ -206,7 +206,7 @@ export const DropdownField = ({
)}
{field.inserted && (
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.625rem,1cqw,0.825rem)] duration-200">
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.425rem,25cqw,0.825rem)] duration-200">
{field.customText}
</p>
)}

View File

@ -122,13 +122,13 @@ export const EmailField = ({ field, recipient, onSignField, onUnsignField }: Ema
)}
{!field.inserted && (
<p className="group-hover:text-primary text-muted-foreground duration-200 group-hover:text-yellow-300">
<p className="group-hover:text-primary text-muted-foreground text-[clamp(0.425rem,25cqw,0.825rem)] duration-200 group-hover:text-yellow-300">
<Trans>Email</Trans>
</p>
)}
{field.inserted && (
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.625rem,1cqw,0.825rem)] duration-200">
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.425rem,25cqw,0.825rem)] duration-200">
{field.customText}
</p>
)}

View File

@ -0,0 +1,99 @@
import Link from 'next/link';
import { notFound } from 'next/navigation';
import { Trans } from '@lingui/macro';
import { Timer } from 'lucide-react';
import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server';
import { getServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session';
import { getDocumentAndSenderByToken } from '@documenso/lib/server-only/document/get-document-by-token';
import { isRecipientAuthorized } from '@documenso/lib/server-only/document/is-recipient-authorized';
import { getRecipientByToken } from '@documenso/lib/server-only/recipient/get-recipient-by-token';
import { Badge } from '@documenso/ui/primitives/badge';
import { Button } from '@documenso/ui/primitives/button';
import { truncateTitle } from '~/helpers/truncate-title';
import { SigningAuthPageView } from '../signing-auth-page';
export type ExpiredSigningPageProps = {
params: {
token?: string;
};
};
export default async function ExpiredSigningPage({ params: { token } }: ExpiredSigningPageProps) {
await setupI18nSSR();
if (!token) {
return notFound();
}
const { user } = await getServerComponentSession();
const document = await getDocumentAndSenderByToken({
token,
requireAccessAuth: false,
}).catch(() => null);
if (!document) {
return notFound();
}
const truncatedTitle = truncateTitle(document.title);
const recipient = await getRecipientByToken({ token }).catch(() => null);
if (!recipient) {
return notFound();
}
const isDocumentAccessValid = await isRecipientAuthorized({
type: 'ACCESS',
documentAuthOptions: document.authOptions,
recipient,
userId: user?.id,
});
if (!isDocumentAccessValid) {
return <SigningAuthPageView email={recipient.email} />;
}
return (
<div className="flex flex-col items-center pt-24 lg:pt-36 xl:pt-44">
<Badge variant="neutral" size="default" className="mb-6 rounded-xl border bg-transparent">
{truncatedTitle}
</Badge>
<div className="flex flex-col items-center">
<div className="flex items-center gap-x-4">
<Timer className="text-destructive h-10 w-10" />
<h2 className="max-w-[35ch] text-center text-2xl font-semibold leading-normal md:text-3xl lg:text-4xl">
<Trans>Document Expired</Trans>
</h2>
</div>
<div className="text-destructive mt-4 flex items-center text-center text-sm">
<Trans>This document has expired and is no longer available to sign</Trans>
</div>
<p className="text-muted-foreground mt-6 max-w-[60ch] text-center text-sm">
<Trans>
{/* TODO: send email to owner when a user tried to sign an expired document??? */}
The document owner has been notified. They may send you a new signing link if required.
</Trans>
</p>
<p className="text-muted-foreground mt-2 max-w-[60ch] text-center text-sm">
<Trans>No further action is required from you at this time.</Trans>
</p>
{user && (
<Button className="mt-6" asChild>
<Link href={`/`}>Return Home</Link>
</Button>
)}
</div>
</div>
);
}

View File

@ -128,13 +128,13 @@ export const InitialsField = ({
)}
{!field.inserted && (
<p className="group-hover:text-primary text-muted-foreground duration-200 group-hover:text-yellow-300">
<p className="group-hover:text-primary text-muted-foreground text-[clamp(0.425rem,25cqw,0.825rem)] duration-200 group-hover:text-yellow-300">
<Trans>Initials</Trans>
</p>
)}
{field.inserted && (
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.625rem,1cqw,0.825rem)] duration-200">
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.425rem,25cqw,0.825rem)] duration-200">
{field.customText}
</p>
)}

View File

@ -172,7 +172,7 @@ export const NameField = ({ field, recipient, onSignField, onUnsignField }: Name
)}
{field.inserted && (
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.625rem,1cqw,0.825rem)] duration-200">
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.425rem,25cqw,0.825rem)] duration-200">
{field.customText}
</p>
)}

View File

@ -252,14 +252,15 @@ export const NumberField = ({ field, recipient, onSignField, onUnsignField }: Nu
},
)}
>
<span className="flex items-center justify-center gap-x-1 text-sm">
<Hash className="h-4 w-4" /> {fieldDisplayName}
<span className="flex items-center justify-center gap-x-1">
<Hash className="h-[clamp(0.625rem,20cqw,0.925rem)] w-[clamp(0.625rem,20cqw,0.925rem)]" />{' '}
<span className="text-[clamp(0.425rem,25cqw,0.825rem)]">{fieldDisplayName}</span>
</span>
</p>
)}
{field.inserted && (
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.625rem,1cqw,0.825rem)] duration-200">
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.425rem,25cqw,0.825rem)] duration-200">
{field.customText}
</p>
)}

View File

@ -12,6 +12,7 @@ import { getFieldsForToken } from '@documenso/lib/server-only/field/get-fields-f
import { getIsRecipientsTurnToSign } from '@documenso/lib/server-only/recipient/get-is-recipient-turn';
import { getRecipientByToken } from '@documenso/lib/server-only/recipient/get-recipient-by-token';
import { getRecipientSignatures } from '@documenso/lib/server-only/recipient/get-recipient-signatures';
import { isRecipientExpired } from '@documenso/lib/server-only/recipient/is-recipient-expired';
import { getUserByEmail } from '@documenso/lib/server-only/user/get-user-by-email';
import { symmetricDecrypt } from '@documenso/lib/universal/crypto';
import { extractNextHeaderRequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
@ -43,6 +44,16 @@ export default async function SigningPage({ params: { token } }: SigningPageProp
const requestMetadata = extractNextHeaderRequestMetadata(requestHeaders);
const isExpired = await isRecipientExpired({ token });
if (isExpired) {
return redirect(`/sign/${token}/expired`);
}
const isRecipientsTurn = await getIsRecipientsTurnToSign({ token });
if (!isRecipientsTurn) {
return redirect(`/sign/${token}/waiting`);
}
const [document, fields, recipient, completedFields] = await Promise.all([
getDocumentAndSenderByToken({
token,
@ -63,12 +74,6 @@ 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

@ -8,9 +8,7 @@ import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server';
import { getServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session';
import { getDocumentAndSenderByToken } from '@documenso/lib/server-only/document/get-document-by-token';
import { isRecipientAuthorized } from '@documenso/lib/server-only/document/is-recipient-authorized';
import { getFieldsForToken } from '@documenso/lib/server-only/field/get-fields-for-token';
import { getRecipientByToken } from '@documenso/lib/server-only/recipient/get-recipient-by-token';
import { FieldType } from '@documenso/prisma/client';
import { Badge } from '@documenso/ui/primitives/badge';
import { Button } from '@documenso/ui/primitives/button';
@ -44,10 +42,7 @@ export default async function RejectedSigningPage({ params: { token } }: Rejecte
const truncatedTitle = truncateTitle(document.title);
const [fields, recipient] = await Promise.all([
getFieldsForToken({ token }),
getRecipientByToken({ token }).catch(() => null),
]);
const recipient = await getRecipientByToken({ token }).catch(() => null);
if (!recipient) {
return notFound();
@ -64,11 +59,6 @@ export default async function RejectedSigningPage({ params: { token } }: Rejecte
return <SigningAuthPageView email={recipient.email} />;
}
const recipientName =
recipient.name ||
fields.find((field) => field.type === FieldType.NAME)?.customText ||
recipient.email;
return (
<div className="flex flex-col items-center pt-24 lg:pt-36 xl:pt-44">
<Badge variant="neutral" size="default" className="mb-6 rounded-xl border bg-transparent">

View File

@ -191,7 +191,7 @@ export const SignatureField = ({
)}
{state === 'empty' && (
<p className="group-hover:text-primary font-signature text-muted-foreground text-xl duration-200 group-hover:text-yellow-300">
<p className="group-hover:text-primary font-signature text-muted-foreground text-[clamp(0.575rem,25cqw,1.2rem)] text-xl duration-200 group-hover:text-yellow-300">
<Trans>Signature</Trans>
</p>
)}

View File

@ -22,6 +22,7 @@ import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer';
import { DocumentReadOnlyFields } from '~/components/document/document-read-only-fields';
import { AutoSign } from './auto-sign';
import { CheckboxField } from './checkbox-field';
import { DateField } from './date-field';
import { DropdownField } from './dropdown-field';
@ -113,6 +114,8 @@ export const SigningPageView = ({
<DocumentReadOnlyFields fields={completedFields} />
<AutoSign recipient={recipient} fields={fields} />
<ElementVisible target={PDF_VIEWER_PAGE_SELECTOR}>
{fields.map((field) =>
match(field.type)

View File

@ -252,14 +252,16 @@ export const TextField = ({ field, recipient, onSignField, onUnsignField }: Text
)}
>
<span className="flex items-center justify-center gap-x-1">
<Type />
{fieldDisplayName || <Trans>Text</Trans>}
<Type className="h-[clamp(0.625rem,20cqw,0.925rem)] w-[clamp(0.625rem,20cqw,0.925rem)]" />
<span className="text-[clamp(0.425rem,25cqw,0.825rem)]">
{fieldDisplayName || <Trans>Text</Trans>}
</span>
</span>
</p>
)}
{field.inserted && (
<p className="text-muted-foreground dark:text-background/80 flex items-center justify-center gap-x-1 duration-200">
<p className="text-muted-foreground dark:text-background/80 flex items-center justify-center gap-x-1 text-[clamp(0.425rem,25cqw,0.825rem)] duration-200">
{field.customText.length < 20
? field.customText
: field.customText.substring(0, 15) + '...'}

View File

@ -25,8 +25,6 @@ export const StackAvatar = ({ first, zIndex, fallbackText = '', type }: StackAva
zIndexClass = ZIndexes[zIndex] ?? '';
}
console.log({ type, fallbackText });
switch (type) {
case RecipientStatusType.UNSIGNED:
classes = 'bg-dawn-200 text-dawn-900';
@ -41,8 +39,10 @@ export const StackAvatar = ({ first, zIndex, fallbackText = '', type }: StackAva
classes = 'bg-documenso-200 text-documenso-800';
break;
case RecipientStatusType.REJECTED:
case RecipientStatusType.EXPIRED:
classes = 'bg-red-200 text-red-800';
break;
default:
break;
}

View File

@ -50,6 +50,10 @@ export const StackAvatarsWithTooltip = ({
(recipient) => getRecipientType(recipient) === RecipientStatusType.REJECTED,
);
const expiredRecipients = recipients.filter(
(recipient) => getRecipientType(recipient) === RecipientStatusType.EXPIRED,
);
const sortedRecipients = useMemo(() => {
const otherRecipients = recipients.filter(
(recipient) => getRecipientType(recipient) !== RecipientStatusType.REJECTED,
@ -119,6 +123,30 @@ export const StackAvatarsWithTooltip = ({
</div>
)}
{expiredRecipients.length > 0 && (
<div>
<h1 className="text-base font-medium">
<Trans>Expired</Trans>
</h1>
{expiredRecipients.map((recipient: Recipient) => (
<div key={recipient.id} className="my-1 flex items-center gap-2">
<StackAvatar
first={true}
key={recipient.id}
type={getRecipientType(recipient)}
fallbackText={recipientAbbreviation(recipient)}
/>
<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)}
</p>
</div>
</div>
))}
</div>
)}
{waitingRecipients.length > 0 && (
<div>
<h1 className="text-base font-medium">

View File

@ -0,0 +1,71 @@
'use client';
import { useState } from 'react';
import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Input } from '@documenso/ui/primitives/input';
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@documenso/ui/primitives/select';
type DocumentExpirySettingsProps = {
onChange: (value: number | undefined, unit: 'day' | 'week' | 'month' | undefined) => void;
};
export const DocumentExpirySettings = ({ onChange }: DocumentExpirySettingsProps) => {
const [expiryValue, setExpiryValue] = useState<number | undefined>(undefined);
const [expiryUnit, setExpiryUnit] = useState<'day' | 'week' | 'month'>();
const { _ } = useLingui();
const handleExpiryValueChange = (value: string) => {
const parsedValue = parseInt(value, 10);
if (Number.isNaN(parsedValue) || parsedValue <= 0) {
setExpiryValue(undefined);
return;
} else {
setExpiryValue(parsedValue);
onChange(parsedValue, expiryUnit);
}
};
const handleExpiryUnitChange = (value: 'day' | 'week' | 'month') => {
setExpiryUnit(value);
onChange(expiryValue, value);
};
return (
<div className="mt-2 flex flex-row gap-4">
<Input
type="number"
placeholder={_(msg`Enter a number`)}
className="w-16"
value={expiryValue}
onChange={(e) => handleExpiryValueChange(e.target.value)}
min={1}
/>
<Select value={expiryUnit} onValueChange={handleExpiryUnitChange}>
<SelectTrigger className="text-muted-foreground">
<SelectValue placeholder={_(msg`Select...`)} />
</SelectTrigger>
<SelectContent>
<SelectItem value="day">
<Trans>Day</Trans>
</SelectItem>
<SelectItem value="week">
<Trans>Week</Trans>
</SelectItem>
<SelectItem value="month">
<Trans>Month</Trans>
</SelectItem>
</SelectContent>
</Select>
</div>
);
};

View File

@ -4,7 +4,7 @@ import { useState } from 'react';
import { Trans } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Clock, EyeOffIcon } from 'lucide-react';
import { AlertTriangle, Clock, EyeOffIcon, Timer } from 'lucide-react';
import { P, match } from 'ts-pattern';
import {
@ -75,6 +75,9 @@ export const DocumentReadOnlyFields = ({
variant={
field.Recipient.signingStatus === SigningStatus.SIGNED
? 'default'
: field.Recipient.signingStatus === SigningStatus.REJECTED ||
field.Recipient.signingStatus === SigningStatus.EXPIRED
? 'destructive'
: 'secondary'
}
>
@ -83,6 +86,16 @@ export const DocumentReadOnlyFields = ({
<SignatureIcon className="mr-1 h-3 w-3" />
<Trans>Signed</Trans>
</>
) : field.Recipient.signingStatus === SigningStatus.REJECTED ? (
<>
<AlertTriangle className="mr-1 h-3 w-3" />
<Trans>Rejected</Trans>
</>
) : field.Recipient.signingStatus === SigningStatus.EXPIRED ? (
<>
<Timer className="mr-1 h-3 w-3" />
<Trans>Expired</Trans>
</>
) : (
<>
<Clock className="mr-1 h-3 w-3" />

31
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "@documenso/root",
"version": "1.8.0-rc.4",
"version": "1.8.1-rc.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@documenso/root",
"version": "1.8.0-rc.4",
"version": "1.8.1-rc.0",
"workspaces": [
"apps/*",
"packages/*"
@ -80,7 +80,7 @@
},
"apps/marketing": {
"name": "@documenso/marketing",
"version": "1.8.0-rc.4",
"version": "1.8.1-rc.0",
"license": "AGPL-3.0",
"dependencies": {
"@documenso/assets": "*",
@ -441,7 +441,7 @@
},
"apps/web": {
"name": "@documenso/web",
"version": "1.8.0-rc.4",
"version": "1.8.1-rc.0",
"license": "AGPL-3.0",
"dependencies": {
"@documenso/api": "*",
@ -10044,11 +10044,19 @@
"node": ">=10"
}
},
"node_modules/@tailwindcss/container-queries": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz",
"integrity": "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==",
"license": "MIT",
"peerDependencies": {
"tailwindcss": ">=3.2.0"
}
},
"node_modules/@tailwindcss/typography": {
"version": "0.5.10",
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz",
"integrity": "sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==",
"dev": true,
"dependencies": {
"lodash.castarray": "^4.4.0",
"lodash.isplainobject": "^4.0.6",
@ -21883,8 +21891,7 @@
"node_modules/lodash.castarray": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
"integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
"dev": true
"integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q=="
},
"node_modules/lodash.clonedeep": {
"version": "4.5.0",
@ -21929,8 +21936,7 @@
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
"dev": true
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
},
"node_modules/lodash.kebabcase": {
"version": "4.1.1",
@ -27014,7 +27020,6 @@
"version": "6.0.10",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
"integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
"dev": true,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@ -36916,14 +36921,14 @@
"version": "0.0.0",
"license": "MIT",
"dependencies": {
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/typography": "^0.5.9",
"autoprefixer": "^10.4.13",
"postcss": "^8.4.32",
"tailwindcss": "3.3.2",
"tailwindcss-animate": "^1.0.5"
},
"devDependencies": {
"@tailwindcss/typography": "^0.5.9"
}
"devDependencies": {}
},
"packages/tailwind-config/node_modules/postcss": {
"version": "8.4.32",

View File

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

View File

@ -7,6 +7,7 @@ export enum RecipientStatusType {
WAITING = 'waiting',
UNSIGNED = 'unsigned',
REJECTED = 'rejected',
EXPIRED = 'expired',
}
export const getRecipientType = (recipient: Recipient) => {
@ -36,6 +37,10 @@ export const getRecipientType = (recipient: Recipient) => {
return RecipientStatusType.WAITING;
}
if (recipient.signingStatus === SigningStatus.EXPIRED) {
return RecipientStatusType.EXPIRED;
}
return RecipientStatusType.UNSIGNED;
};
@ -54,5 +59,9 @@ export const getExtraRecipientsType = (extraRecipients: Recipient[]) => {
return RecipientStatusType.WAITING;
}
if (types.includes(RecipientStatusType.EXPIRED)) {
return RecipientStatusType.EXPIRED;
}
return RecipientStatusType.COMPLETED;
};

View File

@ -8,14 +8,15 @@ import {
RecipientRole,
SendStatus,
SigningStatus,
WebhookTriggerEvents,
} from '@documenso/prisma/client';
import { WebhookTriggerEvents } from '@documenso/prisma/client';
import { jobs } from '../../jobs/client';
import type { TRecipientActionAuth } from '../../types/document-auth';
import { getIsRecipientsTurnToSign } from '../recipient/get-is-recipient-turn';
import { triggerWebhook } from '../webhooks/trigger/trigger-webhook';
import { sendPendingEmail } from './send-pending-email';
import { updateExpiredRecipients } from './update-expired-recipients';
export type CompleteDocumentWithTokenOptions = {
token: string;
@ -61,12 +62,22 @@ export const completeDocumentWithToken = async ({
throw new Error(`Document ${document.id} has no recipient with token ${token}`);
}
await updateExpiredRecipients(documentId);
const [recipient] = document.Recipient;
if (recipient.expired && recipient.expired < new Date()) {
throw new Error(`Recipient ${recipient.id} signature period has expired`);
}
if (recipient.signingStatus === SigningStatus.SIGNED) {
throw new Error(`Recipient ${recipient.id} has already signed`);
}
if (recipient.signingStatus === SigningStatus.EXPIRED) {
throw new Error(`Recipient ${recipient.id} signature period has expired`);
}
if (document.documentMeta?.signingOrder === DocumentSigningOrder.SEQUENTIAL) {
const isRecipientsTurn = await getIsRecipientsTurnToSign({ token: recipient.token });

View File

@ -14,8 +14,8 @@ import type { RequestMetadata } from '@documenso/lib/universal/extract-request-m
import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs';
import { renderCustomEmailTemplate } from '@documenso/lib/utils/render-custom-email-template';
import { prisma } from '@documenso/prisma';
import { DocumentStatus, RecipientRole, SigningStatus } from '@documenso/prisma/client';
import type { Prisma } from '@documenso/prisma/client';
import { DocumentStatus, RecipientRole, SigningStatus } from '@documenso/prisma/client';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app';
@ -166,6 +166,22 @@ export const resendDocument = async ({
await prisma.$transaction(
async (tx) => {
if (recipient.expired) {
const durationInMs = recipient.expired.getTime() - document.updatedAt.getTime();
const newExpiryDate = new Date(Date.now() + durationInMs);
await tx.recipient.update({
where: { id: recipient.id },
data: {
expired: newExpiryDate,
signingStatus:
recipient.signingStatus === SigningStatus.EXPIRED
? SigningStatus.NOT_SIGNED
: recipient.signingStatus,
},
});
}
const [html, text] = await Promise.all([
renderEmailWithI18N(template, {
lang: document.documentMeta?.language,

View File

@ -0,0 +1,55 @@
import { prisma } from '@documenso/prisma';
import { SigningStatus } from '@documenso/prisma/client';
import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs';
import { createDocumentAuditLogData } from '../../utils/document-audit-logs';
export const updateExpiredRecipients = async (documentId: number) => {
const now = new Date();
const expiredRecipients = await prisma.recipient.findMany({
where: {
documentId,
expired: {
lt: now,
},
signingStatus: {
not: SigningStatus.EXPIRED,
},
},
});
if (expiredRecipients.length > 0) {
await prisma.recipient.updateMany({
where: {
id: {
in: expiredRecipients.map((recipient) => recipient.id),
},
},
data: {
signingStatus: SigningStatus.EXPIRED,
},
});
await prisma.documentAuditLog.createMany({
data: expiredRecipients.map((recipient) =>
createDocumentAuditLogData({
type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_RECIPIENT_EXPIRED,
documentId,
user: {
name: recipient.name,
email: recipient.email,
},
data: {
recipientName: recipient.name,
recipientRole: recipient.role,
recipientId: recipient.id,
recipientEmail: recipient.email,
},
}),
),
});
}
return expiredRecipients;
};

View File

@ -0,0 +1,36 @@
import { DateTime } from 'luxon';
import { prisma } from '@documenso/prisma';
import { SigningStatus } from '@documenso/prisma/client';
export type IsRecipientExpiredOptions = {
token: string;
};
export const isRecipientExpired = async ({ token }: IsRecipientExpiredOptions) => {
const recipient = await prisma.recipient.findFirst({
where: {
token,
},
});
if (!recipient) {
throw new Error('Recipient not found');
}
const now = DateTime.now();
const hasExpired = recipient.expired && DateTime.fromJSDate(recipient.expired) <= now;
if (hasExpired && recipient.signingStatus !== SigningStatus.EXPIRED) {
await prisma.recipient.update({
where: {
id: recipient.id,
},
data: {
signingStatus: SigningStatus.EXPIRED,
},
});
}
return hasExpired;
};

View File

@ -0,0 +1,112 @@
import { prisma } from '@documenso/prisma';
import type { Team } from '@documenso/prisma/client';
import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs';
import type { RequestMetadata } from '../../universal/extract-request-metadata';
import { createDocumentAuditLogData, diffRecipientChanges } from '../../utils/document-audit-logs';
export type SetRecipientExpiryOptions = {
documentId: number;
recipientId: number;
expiry: Date;
userId: number;
teamId?: number;
requestMetadata?: RequestMetadata;
};
export const setRecipientExpiry = async ({
documentId,
recipientId,
expiry,
userId,
teamId,
requestMetadata,
}: SetRecipientExpiryOptions) => {
const recipient = await prisma.recipient.findFirst({
where: {
id: recipientId,
Document: {
id: documentId,
...(teamId
? {
team: {
id: teamId,
members: {
some: {
userId,
},
},
},
}
: {
userId,
teamId: null,
}),
},
},
});
if (!recipient) {
throw new Error('Recipient not found');
}
const user = await prisma.user.findFirstOrThrow({
where: {
id: userId,
},
});
let team: Team | null = null;
if (teamId) {
team = await prisma.team.findFirst({
where: {
id: teamId,
members: {
some: {
userId,
},
},
},
});
}
const updatedRecipient = await prisma.$transaction(async (tx) => {
const persisted = await tx.recipient.update({
where: {
id: recipient.id,
},
data: {
expired: new Date(expiry),
},
});
const changes = diffRecipientChanges(recipient, persisted);
if (changes.length > 0) {
await tx.documentAuditLog.create({
data: createDocumentAuditLogData({
type: DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_UPDATED,
documentId: documentId,
user: {
id: team?.id ?? user.id,
name: team?.name ?? user.name,
email: team ? '' : user.email,
},
requestMetadata,
data: {
changes,
recipientId,
recipientEmail: persisted.email,
recipientName: persisted.name,
recipientRole: persisted.role,
},
}),
});
}
return persisted;
});
return updatedRecipient;
};

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-11-14 12:05\n"
"PO-Revision-Date: 2024-11-20 11:56\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@ -414,11 +414,11 @@ msgstr "Weiteren Wert hinzufügen"
msgid "Add myself"
msgstr "Mich selbst hinzufügen"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:637
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:645
msgid "Add Myself"
msgstr "Mich hinzufügen"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:623
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:631
msgid "Add Placeholder Recipient"
msgstr "Platzhalterempfänger hinzufügen"
@ -443,8 +443,8 @@ msgstr "Admin"
msgid "Advanced Options"
msgstr "Erweiterte Optionen"
#: packages/ui/primitives/document-flow/add-fields.tsx:573
#: packages/ui/primitives/template-flow/add-template-fields.tsx:406
#: packages/ui/primitives/document-flow/add-fields.tsx:576
#: packages/ui/primitives/template-flow/add-template-fields.tsx:409
msgid "Advanced settings"
msgstr "Erweiterte Einstellungen"
@ -550,6 +550,10 @@ msgstr "Ccers"
msgid "Character Limit"
msgstr "Zeichenbeschränkung"
#: packages/ui/primitives/document-flow/types.ts:58
msgid "Checkbox"
msgstr "Checkbox"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:197
msgid "Checkbox values"
msgstr "Checkbox-Werte"
@ -585,8 +589,8 @@ msgstr "Abgeschlossenes Dokument"
msgid "Configure Direct Recipient"
msgstr "Direkten Empfänger konfigurieren"
#: packages/ui/primitives/document-flow/add-fields.tsx:574
#: packages/ui/primitives/template-flow/add-template-fields.tsx:407
#: packages/ui/primitives/document-flow/add-fields.tsx:577
#: packages/ui/primitives/template-flow/add-template-fields.tsx:410
msgid "Configure the {0} field"
msgstr "Konfigurieren Sie das Feld {0}"
@ -647,9 +651,9 @@ msgstr "Konto erstellen"
msgid "Custom Text"
msgstr "Benutzerdefinierter Text"
#: packages/ui/primitives/document-flow/add-fields.tsx:927
#: packages/ui/primitives/document-flow/add-fields.tsx:934
#: packages/ui/primitives/document-flow/types.ts:53
#: packages/ui/primitives/template-flow/add-template-fields.tsx:690
#: packages/ui/primitives/template-flow/add-template-fields.tsx:697
msgid "Date"
msgstr "Datum"
@ -666,7 +670,7 @@ msgstr "Ablehnen"
msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us.</0>"
msgstr "Hast du keinen Passwortwechsel angefordert? Wir helfen dir, dein Konto abzusichern, kontaktiere uns einfach <0>hier.</0>"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:578
msgid "Direct link receiver"
msgstr "Empfänger des direkten Links"
@ -788,8 +792,8 @@ msgstr "Entwurf"
msgid "Drag & drop your PDF here."
msgstr "Ziehen Sie Ihr PDF hierher."
#: packages/ui/primitives/document-flow/add-fields.tsx:1058
#: packages/ui/primitives/template-flow/add-template-fields.tsx:820
#: packages/ui/primitives/document-flow/add-fields.tsx:1065
#: packages/ui/primitives/template-flow/add-template-fields.tsx:827
msgid "Dropdown"
msgstr "Dropdown"
@ -798,14 +802,14 @@ msgid "Dropdown options"
msgstr "Dropdown-Optionen"
#: packages/lib/constants/document.ts:28
#: packages/ui/primitives/document-flow/add-fields.tsx:875
#: packages/ui/primitives/document-flow/add-fields.tsx:882
#: packages/ui/primitives/document-flow/add-signature.tsx:272
#: packages/ui/primitives/document-flow/add-signers.tsx:512
#: packages/ui/primitives/document-flow/add-signers.tsx:519
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:645
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:471
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:478
msgid "Email"
msgstr "E-Mail"
@ -825,7 +829,7 @@ msgstr "E-Mail erneut gesendet"
msgid "Email sent"
msgstr "E-Mail gesendet"
#: packages/ui/primitives/document-flow/add-fields.tsx:1123
#: packages/ui/primitives/document-flow/add-fields.tsx:1130
msgid "Empty field"
msgstr "Leeres Feld"
@ -834,11 +838,11 @@ msgid "Enable Direct Link Signing"
msgstr "Direktlink-Signierung aktivieren"
#: packages/ui/primitives/document-flow/add-signers.tsx:401
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:362
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:370
msgid "Enable signing order"
msgstr "Aktiviere die Signaturreihenfolge"
#: packages/ui/primitives/document-flow/add-fields.tsx:795
#: packages/ui/primitives/document-flow/add-fields.tsx:802
msgid "Enable Typed Signatures"
msgstr "Aktivieren Sie getippte Unterschriften"
@ -1016,14 +1020,14 @@ msgstr "Nachricht <0>(Optional)</0>"
msgid "Min"
msgstr "Min"
#: packages/ui/primitives/document-flow/add-fields.tsx:901
#: packages/ui/primitives/document-flow/add-fields.tsx:908
#: packages/ui/primitives/document-flow/add-signature.tsx:298
#: packages/ui/primitives/document-flow/add-signers.tsx:550
#: packages/ui/primitives/document-flow/add-signers.tsx:556
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:671
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:506
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:512
msgid "Name"
msgstr "Name"
@ -1039,8 +1043,8 @@ msgstr "Muss unterzeichnen"
msgid "Needs to view"
msgstr "Muss sehen"
#: packages/ui/primitives/document-flow/add-fields.tsx:686
#: packages/ui/primitives/template-flow/add-template-fields.tsx:504
#: packages/ui/primitives/document-flow/add-fields.tsx:693
#: packages/ui/primitives/template-flow/add-template-fields.tsx:511
msgid "No recipient matching this description was found."
msgstr "Kein passender Empfänger mit dieser Beschreibung gefunden."
@ -1048,8 +1052,8 @@ msgstr "Kein passender Empfänger mit dieser Beschreibung gefunden."
msgid "No recipients"
msgstr "Keine Empfänger"
#: packages/ui/primitives/document-flow/add-fields.tsx:701
#: packages/ui/primitives/template-flow/add-template-fields.tsx:519
#: packages/ui/primitives/document-flow/add-fields.tsx:708
#: packages/ui/primitives/template-flow/add-template-fields.tsx:526
msgid "No recipients with this role"
msgstr "Keine Empfänger mit dieser Rolle"
@ -1077,9 +1081,9 @@ msgstr "Kein Wert gefunden."
msgid "None"
msgstr "Keine"
#: packages/ui/primitives/document-flow/add-fields.tsx:979
#: packages/ui/primitives/document-flow/add-fields.tsx:986
#: packages/ui/primitives/document-flow/types.ts:56
#: packages/ui/primitives/template-flow/add-template-fields.tsx:742
#: packages/ui/primitives/template-flow/add-template-fields.tsx:749
msgid "Number"
msgstr "Nummer"
@ -1170,7 +1174,8 @@ msgstr "Bitte bestätige deine E-Mail-Adresse"
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
#: packages/ui/primitives/document-flow/types.ts:57
#: packages/ui/primitives/template-flow/add-template-fields.tsx:775
msgid "Radio"
msgstr "Radio"
@ -1250,7 +1255,7 @@ msgstr "Erinnerung: Bitte {recipientActionVerb} dieses Dokument"
msgid "Reminder: Please {recipientActionVerb} your document"
msgstr "Erinnerung: Bitte {recipientActionVerb} dein Dokument"
#: packages/ui/primitives/document-flow/add-fields.tsx:1110
#: packages/ui/primitives/document-flow/add-fields.tsx:1117
msgid "Remove"
msgstr "Entfernen"
@ -1282,7 +1287,7 @@ msgstr "Zeilen pro Seite"
msgid "Save"
msgstr "Speichern"
#: packages/ui/primitives/template-flow/add-template-fields.tsx:854
#: packages/ui/primitives/template-flow/add-template-fields.tsx:861
msgid "Save Template"
msgstr "Vorlage speichern"
@ -1291,6 +1296,7 @@ msgid "Search languages..."
msgstr "Sprachen suchen..."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:115
#: packages/ui/primitives/document-flow/types.ts:59
msgid "Select"
msgstr "Auswählen"
@ -1354,7 +1360,7 @@ msgid "Share your signing experience!"
msgstr "Teilen Sie Ihre Unterzeichnungserfahrung!"
#: packages/ui/primitives/document-flow/add-signers.tsx:709
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:655
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:663
msgid "Show advanced settings"
msgstr "Erweiterte Einstellungen anzeigen"
@ -1370,11 +1376,11 @@ msgstr "Dokument signieren"
msgid "Sign In"
msgstr "Anmelden"
#: packages/ui/primitives/document-flow/add-fields.tsx:823
#: packages/ui/primitives/document-flow/add-fields.tsx:830
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:593
msgid "Signature"
msgstr "Unterschrift"
@ -1457,9 +1463,9 @@ msgstr "Team-E-Mail für {teamName} auf Documenso entfernt"
msgid "Template title"
msgstr "Vorlagentitel"
#: packages/ui/primitives/document-flow/add-fields.tsx:953
#: packages/ui/primitives/document-flow/add-fields.tsx:960
#: packages/ui/primitives/document-flow/types.ts:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:716
#: packages/ui/primitives/template-flow/add-template-fields.tsx:723
msgid "Text"
msgstr "Text"
@ -1554,7 +1560,7 @@ msgstr "Dies kann überschrieben werden, indem die Authentifizierungsanforderung
msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support."
msgstr "Dieses Dokument kann nicht wiederhergestellt werden. Wenn du den Grund für zukünftige Dokumente anfechten möchtest, kontaktiere bitte den Support."
#: packages/ui/primitives/document-flow/add-fields.tsx:757
#: packages/ui/primitives/document-flow/add-fields.tsx:764
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."
@ -1585,7 +1591,7 @@ msgstr "Diese E-Mail wird an den Empfänger gesendet und fordert ihn auf, das Do
msgid "This email will be sent to the recipient who has just signed the document, if there are still other recipients who have not signed yet."
msgstr "Diese E-Mail wird an den Empfänger gesendet, der das Dokument gerade unterschrieben hat, wenn es noch andere Empfänger gibt, die noch nicht unterschrieben haben."
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:573
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:581
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."
@ -1593,7 +1599,7 @@ msgstr "Dieses Feld kann nicht geändert oder gelöscht werden. Wenn Sie den dir
msgid "This is how the document will reach the recipients once the document is ready for signing."
msgstr "So wird das Dokument die Empfänger erreichen, sobald es zum Unterschreiben bereit ist."
#: packages/ui/primitives/document-flow/add-fields.tsx:1090
#: packages/ui/primitives/document-flow/add-fields.tsx:1097
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
msgstr "Dieser Empfänger kann nicht mehr bearbeitet werden, da er ein Feld unterschrieben oder das Dokument abgeschlossen hat."
@ -1622,8 +1628,8 @@ msgstr "Zeitzone"
msgid "Title"
msgstr "Titel"
#: packages/ui/primitives/document-flow/add-fields.tsx:1073
#: packages/ui/primitives/template-flow/add-template-fields.tsx:834
#: packages/ui/primitives/document-flow/add-fields.tsx:1080
#: packages/ui/primitives/template-flow/add-template-fields.tsx:841
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."

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-11-14 12:05\n"
"PO-Revision-Date: 2024-11-20 11:56\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

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-11-14 12:05\n"
"PO-Revision-Date: 2024-11-20 11:56\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@ -50,19 +50,19 @@ msgstr "\"{placeholderEmail}\" im Namen von \"{0}\" hat Sie eingeladen, \"Beispi
msgid "\"{teamUrl}\" has invited you to sign \"example document\"."
msgstr "\"{teamUrl}\" hat Sie eingeladen, \"Beispieldokument\" zu unterschreiben."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:79
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:80
msgid "({0}) has invited you to approve this document"
msgstr "({0}) hat dich eingeladen, dieses Dokument zu genehmigen"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:76
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:77
msgid "({0}) has invited you to sign this document"
msgstr "({0}) hat dich eingeladen, dieses Dokument zu unterzeichnen"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:73
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:74
msgid "({0}) has invited you to view this document"
msgstr "({0}) hat dich eingeladen, dieses Dokument zu betrachten"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:311
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313
msgid "{0, plural, one {(1 character over)} other {(# characters over)}}"
msgstr "{0, plural, one {(1 Zeichen über dem Limit)} other {(# Zeichen über dem Limit)}}"
@ -84,6 +84,10 @@ msgstr "{0, plural, one {# Sitz} other {# Sitze}}"
msgid "{0, plural, one {<0>You have <1>1</1> pending team invitation</0>} other {<2>You have <3>#</3> pending team invitations</2>}}"
msgstr "{0, plural, one {<0>Du hast <1>1</1> ausstehende Team-Einladung</0>} other {<2>Du hast <3>#</3> ausstehende Team-Einladungen</2>}}"
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:196
msgid "{0, plural, one {1 matching field} other {# matching fields}}"
msgstr "{0, plural, one {1 passendes Feld} other {# passende Felder}}"
#: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:129
msgid "{0, plural, one {1 Recipient} other {# Recipients}}"
msgstr "{0, plural, one {1 Empfänger} other {# Empfänger}}"
@ -96,6 +100,10 @@ msgstr "{0, plural, one {Warte auf 1 Empfänger} other {Warte auf # Empfänger}}
msgid "{0, plural, zero {Select values} other {# selected...}}"
msgstr "{0, plural, zero {Werte auswählen} other {# ausgewählt...}}"
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:193
msgid "{0}"
msgstr "{0}"
#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249
msgid "{0} direct signing templates"
msgstr "{0} direkte Signaturvorlagen"
@ -116,7 +124,7 @@ msgstr "{0} Empfänger(in)"
#~ msgid "{0} the document to complete the process."
#~ msgstr "{0} the document to complete the process."
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:292
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:294
msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}"
msgstr "{charactersRemaining, plural, one {1 Zeichen verbleibend} other {{charactersRemaining} Zeichen verbleibend}}"
@ -474,6 +482,10 @@ msgstr "Ein Fehler ist aufgetreten, während Unterzeichner hinzugefügt wurden."
msgid "An error occurred while adding the fields."
msgstr "Ein Fehler ist aufgetreten, während die Felder hinzugefügt wurden."
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:154
msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields."
msgstr "Beim automatischen Signieren des Dokuments ist ein Fehler aufgetreten, einige Felder wurden möglicherweise nicht signiert. Bitte überprüfen Sie und signieren Sie alle verbleibenden Felder manuell."
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:176
msgid "An error occurred while creating document from template."
msgstr "Ein Fehler ist aufgetreten, während das Dokument aus der Vorlage erstellt wurde."
@ -748,7 +760,7 @@ msgstr "Banner aktualisiert"
msgid "Basic details"
msgstr "Basisdetails"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:72
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:74
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:61
#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:117
#: apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx:120
@ -810,6 +822,7 @@ msgstr "Durch die Verwendung der elektronischen Unterschriftsfunktion stimmen Si
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:78
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:119
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:472
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:220
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:178
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
@ -817,11 +830,11 @@ msgstr "Durch die Verwendung der elektronischen Unterschriftsfunktion stimmen Si
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:220
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:328
#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:153
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:248
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:335
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:242
@ -1780,7 +1793,7 @@ msgstr "Geben Sie Ihre E-Mail-Adresse ein, um das abgeschlossene Dokument zu erh
msgid "Enter your name"
msgstr "Geben Sie Ihren Namen ein"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:278
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:280
msgid "Enter your text here"
msgstr "Geben Sie hier Ihren Text ein"
@ -1799,6 +1812,7 @@ msgstr "Geben Sie hier Ihren Text ein"
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:175
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:152
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:122
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:212
@ -2230,6 +2244,10 @@ msgstr "Verwalten Sie alle Teams, mit denen Sie derzeit verbunden sind."
msgid "Manage and view template"
msgstr "Vorlage verwalten und anzeigen"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:136
msgid "Manage billing"
msgstr "Rechnungsmanagement"
#: apps/web/src/components/templates/manage-public-template-dialog.tsx:341
msgid "Manage details for this public template"
msgstr "Details für diese öffentliche Vorlage verwalten"
@ -2250,7 +2268,7 @@ msgstr "Passkeys verwalten"
msgid "Manage subscription"
msgstr "Abonnement verwalten"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:66
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:67
msgid "Manage Subscription"
msgstr "Abonnement verwalten"
@ -2463,7 +2481,7 @@ msgstr "Nicht unterstützt"
msgid "Nothing to do"
msgstr "Nichts zu tun"
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:270
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:271
msgid "Number"
msgstr "Nummer"
@ -3026,8 +3044,8 @@ msgid "Roles"
msgstr "Rollen"
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:446
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:336
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:342
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:337
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:344
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:312
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:232
msgid "Save"
@ -3175,6 +3193,7 @@ msgstr "Vorlagen in Ihrem Team-Öffentliches Profil anzeigen, damit Ihre Zielgru
#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:114
#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:139
#: apps/web/src/app/(profile)/p/[url]/page.tsx:192
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:229
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
@ -3331,7 +3350,7 @@ msgstr "Website Einstellungen"
#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:80
#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72
#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:62
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:50
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:51
#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:73
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:93
@ -3646,8 +3665,8 @@ msgstr "Vorlagen"
msgid "Templates allow you to quickly generate documents with pre-filled recipients and fields."
msgstr "Vorlagen erlauben dir das schnelle Erstlelen von Dokumenten mit vorausgefüllten Empfängern und Feldern."
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:256
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:272
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:257
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:274
msgid "Text"
msgstr "Text"
@ -4451,7 +4470,7 @@ msgstr "Möchten Sie auffällige Signatur-Links wie diesen senden? <0>Überprüf
msgid "Want your own public profile?"
msgstr "Möchten Sie Ihr eigenes öffentliches Profil haben?"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:40
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:41
#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:55
#: apps/web/src/components/(teams)/team-billing-portal-button.tsx:31
msgid "We are unable to proceed to the billing portal at this time. Please try again, or contact support."
@ -4715,6 +4734,10 @@ msgstr "Hast du stattdessen versucht, dieses Dokument zu bearbeiten?"
msgid "When you click continue, you will be prompted to add the first available authenticator on your system."
msgstr "Wenn Sie auf Fortfahren klicken, werden Sie aufgefordert, den ersten verfügbaren Authenticator auf Ihrem System hinzuzufügen."
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:183
msgid "When you sign a document, we can automatically fill in and sign the following fields using information that has already been provided. You can also manually sign or remove any automatically signed fields afterwards if you desire."
msgstr "Wenn Sie ein Dokument unterschreiben, können wir die folgenden Felder automatisch ausfüllen und signieren, indem wir bereits bereitgestellte Informationen verwenden. Sie können auch nachträglich manuell unterschreiben oder automatisch signierte Felder entfernen, wenn Sie möchten."
#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:36
msgid "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."
msgstr "Wenn Sie unsere Plattform nutzen, um Ihre elektronische Unterschrift auf Dokumente anzubringen, stimmen Sie zu, dies unter dem Gesetz über elektronische Unterschriften im globalen und nationalen Handel (E-Sign-Gesetz) und anderen anwendbaren Gesetzen zu tun. Diese Handlung zeigt Ihre Zustimmung zur Verwendung elektronischer Mittel zum Unterzeichnen von Dokumenten und zum Empfang von Benachrichtigungen an."
@ -4784,7 +4807,7 @@ msgstr "Sie stehen kurz davor, den folgenden Benutzer aus <0>{teamName}</0> zu e
msgid "You are about to revoke access for team <0>{0}</0> ({1}) to use your email."
msgstr "Sie stehen kurz davor, den Zugriff für das Team <0>{0}</0> ({1}) zu widerrufen."
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:78
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:80
msgid "You are currently on the <0>Free Plan</0>."
msgstr "Sie befinden sich derzeit im <0>kostenlosen Plan</0>."
@ -4836,7 +4859,7 @@ msgstr "Sie können ein Teammitglied, das eine höhere Rolle als Sie hat, nicht
msgid "You cannot upload encrypted PDFs"
msgstr "Sie können keine verschlüsselten PDFs hochladen"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:45
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:46
msgid "You do not currently have a customer record, this should not happen. Please contact support for assistance."
msgstr "Sie haben derzeit keinen Kundenrecord, das sollte nicht passieren. Bitte kontaktieren Sie den Support um Hilfe."
@ -4982,7 +5005,7 @@ msgstr "Ihre Marken-Website-URL"
msgid "Your branding preferences have been updated"
msgstr "Ihre Markenpräferenzen wurden aktualisiert"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:119
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:125
msgid "Your current plan is past due. Please update your payment information."
msgstr "Ihr aktueller Plan ist überfällig. Bitte aktualisieren Sie Ihre Zahlungsinformationen."

View File

@ -409,11 +409,11 @@ msgstr "Add another value"
msgid "Add myself"
msgstr "Add myself"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:637
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:645
msgid "Add Myself"
msgstr "Add Myself"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:623
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:631
msgid "Add Placeholder Recipient"
msgstr "Add Placeholder Recipient"
@ -438,8 +438,8 @@ msgstr "Admin"
msgid "Advanced Options"
msgstr "Advanced Options"
#: packages/ui/primitives/document-flow/add-fields.tsx:573
#: packages/ui/primitives/template-flow/add-template-fields.tsx:406
#: packages/ui/primitives/document-flow/add-fields.tsx:576
#: packages/ui/primitives/template-flow/add-template-fields.tsx:409
msgid "Advanced settings"
msgstr "Advanced settings"
@ -545,6 +545,10 @@ msgstr "Ccers"
msgid "Character Limit"
msgstr "Character Limit"
#: packages/ui/primitives/document-flow/types.ts:58
msgid "Checkbox"
msgstr "Checkbox"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:197
msgid "Checkbox values"
msgstr "Checkbox values"
@ -580,8 +584,8 @@ msgstr "Completed Document"
msgid "Configure Direct Recipient"
msgstr "Configure Direct Recipient"
#: packages/ui/primitives/document-flow/add-fields.tsx:574
#: packages/ui/primitives/template-flow/add-template-fields.tsx:407
#: packages/ui/primitives/document-flow/add-fields.tsx:577
#: packages/ui/primitives/template-flow/add-template-fields.tsx:410
msgid "Configure the {0} field"
msgstr "Configure the {0} field"
@ -642,9 +646,9 @@ msgstr "Create account"
msgid "Custom Text"
msgstr "Custom Text"
#: packages/ui/primitives/document-flow/add-fields.tsx:927
#: packages/ui/primitives/document-flow/add-fields.tsx:934
#: packages/ui/primitives/document-flow/types.ts:53
#: packages/ui/primitives/template-flow/add-template-fields.tsx:690
#: packages/ui/primitives/template-flow/add-template-fields.tsx:697
msgid "Date"
msgstr "Date"
@ -661,7 +665,7 @@ msgstr "Decline"
msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us.</0>"
msgstr "Didn't request a password change? We are here to help you secure your account, just <0>contact us.</0>"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:578
msgid "Direct link receiver"
msgstr "Direct link receiver"
@ -783,8 +787,8 @@ msgstr "Draft"
msgid "Drag & drop your PDF here."
msgstr "Drag & drop your PDF here."
#: packages/ui/primitives/document-flow/add-fields.tsx:1058
#: packages/ui/primitives/template-flow/add-template-fields.tsx:820
#: packages/ui/primitives/document-flow/add-fields.tsx:1065
#: packages/ui/primitives/template-flow/add-template-fields.tsx:827
msgid "Dropdown"
msgstr "Dropdown"
@ -793,14 +797,14 @@ msgid "Dropdown options"
msgstr "Dropdown options"
#: packages/lib/constants/document.ts:28
#: packages/ui/primitives/document-flow/add-fields.tsx:875
#: packages/ui/primitives/document-flow/add-fields.tsx:882
#: packages/ui/primitives/document-flow/add-signature.tsx:272
#: packages/ui/primitives/document-flow/add-signers.tsx:512
#: packages/ui/primitives/document-flow/add-signers.tsx:519
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:645
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:471
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:478
msgid "Email"
msgstr "Email"
@ -820,7 +824,7 @@ msgstr "Email resent"
msgid "Email sent"
msgstr "Email sent"
#: packages/ui/primitives/document-flow/add-fields.tsx:1123
#: packages/ui/primitives/document-flow/add-fields.tsx:1130
msgid "Empty field"
msgstr "Empty field"
@ -829,11 +833,11 @@ msgid "Enable Direct Link Signing"
msgstr "Enable Direct Link Signing"
#: packages/ui/primitives/document-flow/add-signers.tsx:401
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:362
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:370
msgid "Enable signing order"
msgstr "Enable signing order"
#: packages/ui/primitives/document-flow/add-fields.tsx:795
#: packages/ui/primitives/document-flow/add-fields.tsx:802
msgid "Enable Typed Signatures"
msgstr "Enable Typed Signatures"
@ -1011,14 +1015,14 @@ msgstr "Message <0>(Optional)</0>"
msgid "Min"
msgstr "Min"
#: packages/ui/primitives/document-flow/add-fields.tsx:901
#: packages/ui/primitives/document-flow/add-fields.tsx:908
#: packages/ui/primitives/document-flow/add-signature.tsx:298
#: packages/ui/primitives/document-flow/add-signers.tsx:550
#: packages/ui/primitives/document-flow/add-signers.tsx:556
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:671
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:506
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:512
msgid "Name"
msgstr "Name"
@ -1034,8 +1038,8 @@ msgstr "Needs to sign"
msgid "Needs to view"
msgstr "Needs to view"
#: packages/ui/primitives/document-flow/add-fields.tsx:686
#: packages/ui/primitives/template-flow/add-template-fields.tsx:504
#: packages/ui/primitives/document-flow/add-fields.tsx:693
#: packages/ui/primitives/template-flow/add-template-fields.tsx:511
msgid "No recipient matching this description was found."
msgstr "No recipient matching this description was found."
@ -1043,8 +1047,8 @@ msgstr "No recipient matching this description was found."
msgid "No recipients"
msgstr "No recipients"
#: packages/ui/primitives/document-flow/add-fields.tsx:701
#: packages/ui/primitives/template-flow/add-template-fields.tsx:519
#: packages/ui/primitives/document-flow/add-fields.tsx:708
#: packages/ui/primitives/template-flow/add-template-fields.tsx:526
msgid "No recipients with this role"
msgstr "No recipients with this role"
@ -1072,9 +1076,9 @@ msgstr "No value found."
msgid "None"
msgstr "None"
#: packages/ui/primitives/document-flow/add-fields.tsx:979
#: packages/ui/primitives/document-flow/add-fields.tsx:986
#: packages/ui/primitives/document-flow/types.ts:56
#: packages/ui/primitives/template-flow/add-template-fields.tsx:742
#: packages/ui/primitives/template-flow/add-template-fields.tsx:749
msgid "Number"
msgstr "Number"
@ -1165,7 +1169,8 @@ msgstr "Please confirm your email address"
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
#: packages/ui/primitives/document-flow/types.ts:57
#: packages/ui/primitives/template-flow/add-template-fields.tsx:775
msgid "Radio"
msgstr "Radio"
@ -1245,7 +1250,7 @@ msgstr "Reminder: Please {recipientActionVerb} this document"
msgid "Reminder: Please {recipientActionVerb} your document"
msgstr "Reminder: Please {recipientActionVerb} your document"
#: packages/ui/primitives/document-flow/add-fields.tsx:1110
#: packages/ui/primitives/document-flow/add-fields.tsx:1117
msgid "Remove"
msgstr "Remove"
@ -1277,7 +1282,7 @@ msgstr "Rows per page"
msgid "Save"
msgstr "Save"
#: packages/ui/primitives/template-flow/add-template-fields.tsx:854
#: packages/ui/primitives/template-flow/add-template-fields.tsx:861
msgid "Save Template"
msgstr "Save Template"
@ -1286,6 +1291,7 @@ msgid "Search languages..."
msgstr "Search languages..."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:115
#: packages/ui/primitives/document-flow/types.ts:59
msgid "Select"
msgstr "Select"
@ -1349,7 +1355,7 @@ msgid "Share your signing experience!"
msgstr "Share your signing experience!"
#: packages/ui/primitives/document-flow/add-signers.tsx:709
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:655
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:663
msgid "Show advanced settings"
msgstr "Show advanced settings"
@ -1365,11 +1371,11 @@ msgstr "Sign Document"
msgid "Sign In"
msgstr "Sign In"
#: packages/ui/primitives/document-flow/add-fields.tsx:823
#: packages/ui/primitives/document-flow/add-fields.tsx:830
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:593
msgid "Signature"
msgstr "Signature"
@ -1452,9 +1458,9 @@ msgstr "Team email removed for {teamName} on Documenso"
msgid "Template title"
msgstr "Template title"
#: packages/ui/primitives/document-flow/add-fields.tsx:953
#: packages/ui/primitives/document-flow/add-fields.tsx:960
#: packages/ui/primitives/document-flow/types.ts:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:716
#: packages/ui/primitives/template-flow/add-template-fields.tsx:723
msgid "Text"
msgstr "Text"
@ -1549,7 +1555,7 @@ msgstr "This can be overriden by setting the authentication requirements directl
msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support."
msgstr "This document can not be recovered, if you would like to dispute the reason for future documents please contact support."
#: packages/ui/primitives/document-flow/add-fields.tsx:757
#: packages/ui/primitives/document-flow/add-fields.tsx:764
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."
@ -1580,7 +1586,7 @@ msgstr "This email is sent to the recipient requesting them to sign the document
msgid "This email will be sent to the recipient who has just signed the document, if there are still other recipients who have not signed yet."
msgstr "This email will be sent to the recipient who has just signed the document, if there are still other recipients who have not signed yet."
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:573
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:581
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."
@ -1588,7 +1594,7 @@ msgstr "This field cannot be modified or deleted. When you share this template's
msgid "This is how the document will reach the recipients once the document is ready for signing."
msgstr "This is how the document will reach the recipients once the document is ready for signing."
#: packages/ui/primitives/document-flow/add-fields.tsx:1090
#: packages/ui/primitives/document-flow/add-fields.tsx:1097
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."
@ -1617,8 +1623,8 @@ msgstr "Time Zone"
msgid "Title"
msgstr "Title"
#: packages/ui/primitives/document-flow/add-fields.tsx:1073
#: packages/ui/primitives/template-flow/add-template-fields.tsx:834
#: packages/ui/primitives/document-flow/add-fields.tsx:1080
#: packages/ui/primitives/template-flow/add-template-fields.tsx:841
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."

View File

@ -45,19 +45,19 @@ msgstr "\"{placeholderEmail}\" on behalf of \"{0}\" has invited you to sign \"ex
msgid "\"{teamUrl}\" has invited you to sign \"example document\"."
msgstr "\"{teamUrl}\" has invited you to sign \"example document\"."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:79
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:80
msgid "({0}) has invited you to approve this document"
msgstr "({0}) has invited you to approve this document"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:76
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:77
msgid "({0}) has invited you to sign this document"
msgstr "({0}) has invited you to sign this document"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:73
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:74
msgid "({0}) has invited you to view this document"
msgstr "({0}) has invited you to view this document"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:311
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313
msgid "{0, plural, one {(1 character over)} other {(# characters over)}}"
msgstr "{0, plural, one {(1 character over)} other {(# characters over)}}"
@ -79,6 +79,10 @@ msgstr "{0, plural, one {# Seat} other {# Seats}}"
msgid "{0, plural, one {<0>You have <1>1</1> pending team invitation</0>} other {<2>You have <3>#</3> pending team invitations</2>}}"
msgstr "{0, plural, one {<0>You have <1>1</1> pending team invitation</0>} other {<2>You have <3>#</3> pending team invitations</2>}}"
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:196
msgid "{0, plural, one {1 matching field} other {# matching fields}}"
msgstr "{0, plural, one {1 matching field} other {# matching fields}}"
#: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:129
msgid "{0, plural, one {1 Recipient} other {# Recipients}}"
msgstr "{0, plural, one {1 Recipient} other {# Recipients}}"
@ -91,6 +95,10 @@ msgstr "{0, plural, one {Waiting on 1 recipient} other {Waiting on # recipients}
msgid "{0, plural, zero {Select values} other {# selected...}}"
msgstr "{0, plural, zero {Select values} other {# selected...}}"
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:193
msgid "{0}"
msgstr "{0}"
#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249
msgid "{0} direct signing templates"
msgstr "{0} direct signing templates"
@ -111,7 +119,7 @@ msgstr "{0} Recipient(s)"
#~ msgid "{0} the document to complete the process."
#~ msgstr "{0} the document to complete the process."
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:292
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:294
msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}"
msgstr "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}"
@ -469,6 +477,10 @@ msgstr "An error occurred while adding signers."
msgid "An error occurred while adding the fields."
msgstr "An error occurred while adding the fields."
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:154
msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields."
msgstr "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields."
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:176
msgid "An error occurred while creating document from template."
msgstr "An error occurred while creating document from template."
@ -743,7 +755,7 @@ msgstr "Banner Updated"
msgid "Basic details"
msgstr "Basic details"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:72
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:74
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:61
#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:117
#: apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx:120
@ -805,6 +817,7 @@ msgstr "By using the electronic signature feature, you are consenting to conduct
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:78
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:119
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:472
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:220
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:178
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
@ -812,11 +825,11 @@ msgstr "By using the electronic signature feature, you are consenting to conduct
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:220
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:328
#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:153
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:248
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:335
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:242
@ -1775,7 +1788,7 @@ msgstr "Enter your email address to receive the completed document."
msgid "Enter your name"
msgstr "Enter your name"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:278
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:280
msgid "Enter your text here"
msgstr "Enter your text here"
@ -1794,6 +1807,7 @@ msgstr "Enter your text here"
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:175
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:152
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:122
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:212
@ -2225,6 +2239,10 @@ msgstr "Manage all teams you are currently associated with."
msgid "Manage and view template"
msgstr "Manage and view template"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:136
msgid "Manage billing"
msgstr "Manage billing"
#: apps/web/src/components/templates/manage-public-template-dialog.tsx:341
msgid "Manage details for this public template"
msgstr "Manage details for this public template"
@ -2245,7 +2263,7 @@ msgstr "Manage passkeys"
msgid "Manage subscription"
msgstr "Manage subscription"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:66
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:67
msgid "Manage Subscription"
msgstr "Manage Subscription"
@ -2458,7 +2476,7 @@ msgstr "Not supported"
msgid "Nothing to do"
msgstr "Nothing to do"
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:270
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:271
msgid "Number"
msgstr "Number"
@ -3021,8 +3039,8 @@ msgid "Roles"
msgstr "Roles"
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:446
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:336
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:342
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:337
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:344
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:312
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:232
msgid "Save"
@ -3170,6 +3188,7 @@ msgstr "Show templates in your team public profile for your audience to sign and
#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:114
#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:139
#: apps/web/src/app/(profile)/p/[url]/page.tsx:192
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:229
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
@ -3326,7 +3345,7 @@ msgstr "Site Settings"
#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:80
#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72
#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:62
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:50
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:51
#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:73
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:93
@ -3641,8 +3660,8 @@ msgstr "Templates"
msgid "Templates allow you to quickly generate documents with pre-filled recipients and fields."
msgstr "Templates allow you to quickly generate documents with pre-filled recipients and fields."
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:256
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:272
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:257
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:274
msgid "Text"
msgstr "Text"
@ -4446,7 +4465,7 @@ msgstr "Want to send slick signing links like this one? <0>Check out Documenso.<
msgid "Want your own public profile?"
msgstr "Want your own public profile?"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:40
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:41
#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:55
#: apps/web/src/components/(teams)/team-billing-portal-button.tsx:31
msgid "We are unable to proceed to the billing portal at this time. Please try again, or contact support."
@ -4710,6 +4729,10 @@ msgstr "Were you trying to edit this document instead?"
msgid "When you click continue, you will be prompted to add the first available authenticator on your system."
msgstr "When you click continue, you will be prompted to add the first available authenticator on your system."
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:183
msgid "When you sign a document, we can automatically fill in and sign the following fields using information that has already been provided. You can also manually sign or remove any automatically signed fields afterwards if you desire."
msgstr "When you sign a document, we can automatically fill in and sign the following fields using information that has already been provided. You can also manually sign or remove any automatically signed fields afterwards if you desire."
#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:36
msgid "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."
msgstr "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."
@ -4779,7 +4802,7 @@ msgstr "You are about to remove the following user from <0>{teamName}</0>."
msgid "You are about to revoke access for team <0>{0}</0> ({1}) to use your email."
msgstr "You are about to revoke access for team <0>{0}</0> ({1}) to use your email."
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:78
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:80
msgid "You are currently on the <0>Free Plan</0>."
msgstr "You are currently on the <0>Free Plan</0>."
@ -4831,7 +4854,7 @@ msgstr "You cannot modify a team member who has a higher role than you."
msgid "You cannot upload encrypted PDFs"
msgstr "You cannot upload encrypted PDFs"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:45
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:46
msgid "You do not currently have a customer record, this should not happen. Please contact support for assistance."
msgstr "You do not currently have a customer record, this should not happen. Please contact support for assistance."
@ -4977,7 +5000,7 @@ msgstr "Your brand website URL"
msgid "Your branding preferences have been updated"
msgstr "Your branding preferences have been updated"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:119
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:125
msgid "Your current plan is past due. Please update your payment information."
msgstr "Your current plan is past due. Please update your payment information."

View File

@ -8,7 +8,7 @@ msgstr ""
"Language: es\n"
"Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-14 12:05\n"
"PO-Revision-Date: 2024-11-20 11:56\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@ -414,11 +414,11 @@ msgstr "Agregar otro valor"
msgid "Add myself"
msgstr "Agregame"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:637
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:645
msgid "Add Myself"
msgstr "Agregame"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:623
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:631
msgid "Add Placeholder Recipient"
msgstr "Agregar destinatario de marcador de posición"
@ -443,8 +443,8 @@ msgstr "Admin"
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
#: packages/ui/primitives/document-flow/add-fields.tsx:576
#: packages/ui/primitives/template-flow/add-template-fields.tsx:409
msgid "Advanced settings"
msgstr "Configuraciones avanzadas"
@ -550,6 +550,10 @@ msgstr "Ccers"
msgid "Character Limit"
msgstr "Límite de caracteres"
#: packages/ui/primitives/document-flow/types.ts:58
msgid "Checkbox"
msgstr "Checkbox"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:197
msgid "Checkbox values"
msgstr "Valores de Checkbox"
@ -585,8 +589,8 @@ msgstr "Documento completado"
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
#: packages/ui/primitives/document-flow/add-fields.tsx:577
#: packages/ui/primitives/template-flow/add-template-fields.tsx:410
msgid "Configure the {0} field"
msgstr "Configurar el campo {0}"
@ -647,9 +651,9 @@ msgstr "Crear cuenta"
msgid "Custom Text"
msgstr "Texto personalizado"
#: packages/ui/primitives/document-flow/add-fields.tsx:927
#: packages/ui/primitives/document-flow/add-fields.tsx:934
#: packages/ui/primitives/document-flow/types.ts:53
#: packages/ui/primitives/template-flow/add-template-fields.tsx:690
#: packages/ui/primitives/template-flow/add-template-fields.tsx:697
msgid "Date"
msgstr "Fecha"
@ -666,7 +670,7 @@ msgstr "Rechazar"
msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us.</0>"
msgstr "¿No solicitaste un cambio de contraseña? Estamos aquí para ayudarte a asegurar tu cuenta, solo <0>contáctanos.</0>"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:578
msgid "Direct link receiver"
msgstr "Receptor de enlace directo"
@ -788,8 +792,8 @@ msgstr "Borrador"
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
#: packages/ui/primitives/document-flow/add-fields.tsx:1065
#: packages/ui/primitives/template-flow/add-template-fields.tsx:827
msgid "Dropdown"
msgstr "Menú desplegable"
@ -798,14 +802,14 @@ msgid "Dropdown options"
msgstr "Opciones de menú desplegable"
#: packages/lib/constants/document.ts:28
#: packages/ui/primitives/document-flow/add-fields.tsx:875
#: packages/ui/primitives/document-flow/add-fields.tsx:882
#: packages/ui/primitives/document-flow/add-signature.tsx:272
#: packages/ui/primitives/document-flow/add-signers.tsx:512
#: packages/ui/primitives/document-flow/add-signers.tsx:519
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:645
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:471
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:478
msgid "Email"
msgstr "Correo electrónico"
@ -825,7 +829,7 @@ msgstr "Correo electrónico reeenviado"
msgid "Email sent"
msgstr "Correo electrónico enviado"
#: packages/ui/primitives/document-flow/add-fields.tsx:1123
#: packages/ui/primitives/document-flow/add-fields.tsx:1130
msgid "Empty field"
msgstr "Campo vacío"
@ -834,11 +838,11 @@ 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
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:370
msgid "Enable signing order"
msgstr "Habilitar orden de firma"
#: packages/ui/primitives/document-flow/add-fields.tsx:795
#: packages/ui/primitives/document-flow/add-fields.tsx:802
msgid "Enable Typed Signatures"
msgstr "Habilitar firmas escritas"
@ -1016,14 +1020,14 @@ msgstr "Mensaje <0>(Opcional)</0>"
msgid "Min"
msgstr "Mín"
#: packages/ui/primitives/document-flow/add-fields.tsx:901
#: packages/ui/primitives/document-flow/add-fields.tsx:908
#: packages/ui/primitives/document-flow/add-signature.tsx:298
#: packages/ui/primitives/document-flow/add-signers.tsx:550
#: packages/ui/primitives/document-flow/add-signers.tsx:556
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:671
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:506
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:512
msgid "Name"
msgstr "Nombre"
@ -1039,8 +1043,8 @@ msgstr "Necesita firmar"
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
#: packages/ui/primitives/document-flow/add-fields.tsx:693
#: packages/ui/primitives/template-flow/add-template-fields.tsx:511
msgid "No recipient matching this description was found."
msgstr "No se encontró ningún destinatario que coincidiera con esta descripción."
@ -1048,8 +1052,8 @@ msgstr "No se encontró ningún destinatario que coincidiera con esta descripci
msgid "No recipients"
msgstr "Sin destinatarios"
#: packages/ui/primitives/document-flow/add-fields.tsx:701
#: packages/ui/primitives/template-flow/add-template-fields.tsx:519
#: packages/ui/primitives/document-flow/add-fields.tsx:708
#: packages/ui/primitives/template-flow/add-template-fields.tsx:526
msgid "No recipients with this role"
msgstr "No hay destinatarios con este rol"
@ -1077,9 +1081,9 @@ msgstr "No se encontró valor."
msgid "None"
msgstr "Ninguno"
#: packages/ui/primitives/document-flow/add-fields.tsx:979
#: packages/ui/primitives/document-flow/add-fields.tsx:986
#: packages/ui/primitives/document-flow/types.ts:56
#: packages/ui/primitives/template-flow/add-template-fields.tsx:742
#: packages/ui/primitives/template-flow/add-template-fields.tsx:749
msgid "Number"
msgstr "Número"
@ -1170,7 +1174,8 @@ msgstr "Por favor confirma tu dirección de correo electrónico"
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
#: packages/ui/primitives/document-flow/types.ts:57
#: packages/ui/primitives/template-flow/add-template-fields.tsx:775
msgid "Radio"
msgstr "Radio"
@ -1250,7 +1255,7 @@ msgstr "Recordatorio: Por favor {recipientActionVerb} este documento"
msgid "Reminder: Please {recipientActionVerb} your document"
msgstr "Recordatorio: Por favor {recipientActionVerb} tu documento"
#: packages/ui/primitives/document-flow/add-fields.tsx:1110
#: packages/ui/primitives/document-flow/add-fields.tsx:1117
msgid "Remove"
msgstr "Eliminar"
@ -1282,7 +1287,7 @@ msgstr "Filas por página"
msgid "Save"
msgstr "Guardar"
#: packages/ui/primitives/template-flow/add-template-fields.tsx:854
#: packages/ui/primitives/template-flow/add-template-fields.tsx:861
msgid "Save Template"
msgstr "Guardar plantilla"
@ -1291,6 +1296,7 @@ msgid "Search languages..."
msgstr "Buscar idiomas..."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:115
#: packages/ui/primitives/document-flow/types.ts:59
msgid "Select"
msgstr "Seleccionar"
@ -1354,7 +1360,7 @@ msgid "Share your signing experience!"
msgstr "¡Comparte tu experiencia de firma!"
#: packages/ui/primitives/document-flow/add-signers.tsx:709
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:655
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:663
msgid "Show advanced settings"
msgstr "Mostrar configuraciones avanzadas"
@ -1370,11 +1376,11 @@ msgstr "Firmar Documento"
msgid "Sign In"
msgstr "Iniciar sesión"
#: packages/ui/primitives/document-flow/add-fields.tsx:823
#: packages/ui/primitives/document-flow/add-fields.tsx:830
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:593
msgid "Signature"
msgstr "Firma"
@ -1457,9 +1463,9 @@ msgstr "Correo electrónico del equipo eliminado para {teamName} en Documenso"
msgid "Template title"
msgstr "Título de plantilla"
#: packages/ui/primitives/document-flow/add-fields.tsx:953
#: packages/ui/primitives/document-flow/add-fields.tsx:960
#: packages/ui/primitives/document-flow/types.ts:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:716
#: packages/ui/primitives/template-flow/add-template-fields.tsx:723
msgid "Text"
msgstr "Texto"
@ -1554,7 +1560,7 @@ msgstr "Esto se puede anular configurando los requisitos de autenticación direc
msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support."
msgstr "Este documento no se puede recuperar, si deseas impugnar la razón para documentos futuros, por favor contacta con el soporte."
#: packages/ui/primitives/document-flow/add-fields.tsx:757
#: packages/ui/primitives/document-flow/add-fields.tsx:764
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."
@ -1585,7 +1591,7 @@ msgstr "Este correo electrónico se envía al destinatario solicitando que firme
msgid "This email will be sent to the recipient who has just signed the document, if there are still other recipients who have not signed yet."
msgstr "Este correo electrónico se enviará al destinatario que acaba de firmar el documento, si todavía hay otros destinatarios que no han firmado."
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:573
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:581
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."
@ -1593,7 +1599,7 @@ msgstr "Este campo no se puede modificar ni eliminar. Cuando comparta el enlace
msgid "This is how the document will reach the recipients once the document is ready for signing."
msgstr "Así es como el documento llegará a los destinatarios una vez que esté listo para firmarse."
#: packages/ui/primitives/document-flow/add-fields.tsx:1090
#: packages/ui/primitives/document-flow/add-fields.tsx:1097
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."
@ -1622,8 +1628,8 @@ msgstr "Zona horaria"
msgid "Title"
msgstr "Título"
#: packages/ui/primitives/document-flow/add-fields.tsx:1073
#: packages/ui/primitives/template-flow/add-template-fields.tsx:834
#: packages/ui/primitives/document-flow/add-fields.tsx:1080
#: packages/ui/primitives/template-flow/add-template-fields.tsx:841
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}."

View File

@ -8,7 +8,7 @@ msgstr ""
"Language: es\n"
"Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-14 12:05\n"
"PO-Revision-Date: 2024-11-20 11:56\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

View File

@ -8,7 +8,7 @@ msgstr ""
"Language: es\n"
"Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-14 12:05\n"
"PO-Revision-Date: 2024-11-20 11:56\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@ -50,19 +50,19 @@ msgstr "\"{placeholderEmail}\" en nombre de \"{0}\" te ha invitado a firmar \"do
msgid "\"{teamUrl}\" has invited you to sign \"example document\"."
msgstr "\"{teamUrl}\" te ha invitado a firmar \"ejemplo de documento\"."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:79
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:80
msgid "({0}) has invited you to approve this document"
msgstr "({0}) te ha invitado a aprobar este documento"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:76
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:77
msgid "({0}) has invited you to sign this document"
msgstr "({0}) te ha invitado a firmar este documento"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:73
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:74
msgid "({0}) has invited you to view this document"
msgstr "({0}) te ha invitado a ver este documento"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:311
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313
msgid "{0, plural, one {(1 character over)} other {(# characters over)}}"
msgstr "{0, plural, one {(1 carácter excedido)} other {(# caracteres excedidos)}}"
@ -84,6 +84,10 @@ msgstr "{0, plural, one {# Asiento} other {# Asientos}}"
msgid "{0, plural, one {<0>You have <1>1</1> pending team invitation</0>} other {<2>You have <3>#</3> pending team invitations</2>}}"
msgstr "{0, plural, one {<0>Tienes <1>1</1> invitación de equipo pendiente</0>} other {<2>Tienes <3>#</3> invitaciones de equipo pendientes</2>}}"
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:196
msgid "{0, plural, one {1 matching field} other {# matching fields}}"
msgstr "{0, plural, one {1 campo que coincide} other {# campos que coinciden}}"
#: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:129
msgid "{0, plural, one {1 Recipient} other {# Recipients}}"
msgstr "{0, plural, one {1 Destinatario} other {# Destinatarios}}"
@ -96,6 +100,10 @@ msgstr "{0, plural, one {Esperando 1 destinatario} other {Esperando # destinatar
msgid "{0, plural, zero {Select values} other {# selected...}}"
msgstr "{0, plural, zero {Selecciona valores} other {# seleccionados...}}"
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:193
msgid "{0}"
msgstr "{0}"
#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249
msgid "{0} direct signing templates"
msgstr "{0} plantillas de firma directa"
@ -116,7 +124,7 @@ msgstr "{0} Destinatario(s)"
#~ msgid "{0} the document to complete the process."
#~ msgstr "{0} the document to complete the process."
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:292
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:294
msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}"
msgstr "{charactersRemaining, plural, one {1 carácter restante} other {{charactersRemaining} caracteres restantes}}"
@ -474,6 +482,10 @@ msgstr "Ocurrió un error al agregar firmantes."
msgid "An error occurred while adding the fields."
msgstr "Ocurrió un error al agregar los campos."
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:154
msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields."
msgstr "Se produjo un error al firmar automáticamente el documento, es posible que algunos campos no estén firmados. Por favor, revise y firme manualmente cualquier campo restante."
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:176
msgid "An error occurred while creating document from template."
msgstr "Ocurrió un error al crear el documento a partir de la plantilla."
@ -748,7 +760,7 @@ msgstr "Banner actualizado"
msgid "Basic details"
msgstr "Detalles básicos"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:72
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:74
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:61
#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:117
#: apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx:120
@ -810,6 +822,7 @@ msgstr "Al utilizar la función de firma electrónica, usted está consintiendo
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:78
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:119
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:472
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:220
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:178
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
@ -817,11 +830,11 @@ msgstr "Al utilizar la función de firma electrónica, usted está consintiendo
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:220
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:328
#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:153
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:248
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:335
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:242
@ -1780,7 +1793,7 @@ msgstr "Ingresa tu dirección de correo electrónico para recibir el documento c
msgid "Enter your name"
msgstr "Ingresa tu nombre"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:278
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:280
msgid "Enter your text here"
msgstr "Ingresa tu texto aquí"
@ -1799,6 +1812,7 @@ msgstr "Ingresa tu texto aquí"
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:175
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:152
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:122
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:212
@ -2230,6 +2244,10 @@ msgstr "Gestionar todos los equipos con los que estás asociado actualmente."
msgid "Manage and view template"
msgstr "Gestionar y ver plantilla"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:136
msgid "Manage billing"
msgstr "Gestionar la facturación"
#: apps/web/src/components/templates/manage-public-template-dialog.tsx:341
msgid "Manage details for this public template"
msgstr "Gestionar detalles de esta plantilla pública"
@ -2250,7 +2268,7 @@ msgstr "Gestionar claves de acceso"
msgid "Manage subscription"
msgstr "Gestionar suscripción"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:66
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:67
msgid "Manage Subscription"
msgstr "Gestionar Suscripción"
@ -2463,7 +2481,7 @@ msgstr "No soportado"
msgid "Nothing to do"
msgstr "Nada que hacer"
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:270
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:271
msgid "Number"
msgstr "Número"
@ -3026,8 +3044,8 @@ msgid "Roles"
msgstr "Roles"
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:446
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:336
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:342
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:337
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:344
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:312
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:232
msgid "Save"
@ -3175,6 +3193,7 @@ msgstr "Mostrar plantillas en el perfil público de tu equipo para que tu audien
#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:114
#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:139
#: apps/web/src/app/(profile)/p/[url]/page.tsx:192
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:229
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
@ -3331,7 +3350,7 @@ msgstr "Configuraciones del sitio"
#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:80
#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72
#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:62
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:50
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:51
#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:73
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:93
@ -3646,8 +3665,8 @@ msgstr "Plantillas"
msgid "Templates allow you to quickly generate documents with pre-filled recipients and fields."
msgstr "Las plantillas te permiten generar documentos rápidamente con destinatarios y campos prellenados."
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:256
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:272
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:257
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:274
msgid "Text"
msgstr "Texto"
@ -4451,7 +4470,7 @@ msgstr "¿Quieres enviar enlaces de firma elegantes como este? <0>Consulta Docum
msgid "Want your own public profile?"
msgstr "¿Quieres tu propio perfil público?"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:40
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:41
#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:55
#: apps/web/src/components/(teams)/team-billing-portal-button.tsx:31
msgid "We are unable to proceed to the billing portal at this time. Please try again, or contact support."
@ -4715,6 +4734,10 @@ msgstr "¿Estabas intentando editar este documento en su lugar?"
msgid "When you click continue, you will be prompted to add the first available authenticator on your system."
msgstr "Cuando haces clic en continuar, se te pedirá que añadas el primer autenticador disponible en tu sistema."
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:183
msgid "When you sign a document, we can automatically fill in and sign the following fields using information that has already been provided. You can also manually sign or remove any automatically signed fields afterwards if you desire."
msgstr "Cuando firme un documento, podemos completar y firmar automáticamente los siguientes campos usando información que ya se ha proporcionado. También puede firmar manualmente o eliminar cualquier campo firmado automáticamente más tarde si lo desea."
#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:36
msgid "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."
msgstr "Cuando utilice nuestra plataforma para colocar su firma electrónica en documentos, está consintiendo hacerlo bajo la Ley de Firmas Electrónicas en el Comercio Global y Nacional (Ley E-Sign) y otras leyes aplicables. Esta acción indica su aceptación de usar medios electrónicos para firmar documentos y recibir notificaciones."
@ -4784,7 +4807,7 @@ msgstr "Estás a punto de eliminar al siguiente usuario de <0>{teamName}</0>."
msgid "You are about to revoke access for team <0>{0}</0> ({1}) to use your email."
msgstr "Estás a punto de revocar el acceso para el equipo <0>{0}</0> ({1}) para usar tu correo electrónico."
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:78
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:80
msgid "You are currently on the <0>Free Plan</0>."
msgstr "Actualmente estás en el <0>Plan Gratuito</0>."
@ -4836,7 +4859,7 @@ msgstr "No puedes modificar a un miembro del equipo que tenga un rol más alto q
msgid "You cannot upload encrypted PDFs"
msgstr "No puedes subir PDFs encriptados"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:45
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:46
msgid "You do not currently have a customer record, this should not happen. Please contact support for assistance."
msgstr "Actualmente no tienes un registro de cliente, esto no debería suceder. Por favor contacta a soporte para obtener asistencia."
@ -4982,7 +5005,7 @@ msgstr "La URL de tu sitio web de marca"
msgid "Your branding preferences have been updated"
msgstr "Tus preferencias de marca han sido actualizadas"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:119
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:125
msgid "Your current plan is past due. Please update your payment information."
msgstr "Tu plan actual está vencido. Por favor actualiza tu información de pago."

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-11-14 12:05\n"
"PO-Revision-Date: 2024-11-20 11:56\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
@ -414,11 +414,11 @@ msgstr "Ajouter une autre valeur"
msgid "Add myself"
msgstr "Ajoutez-moi"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:637
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:645
msgid "Add Myself"
msgstr "Ajoutez-moi"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:623
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:631
msgid "Add Placeholder Recipient"
msgstr "Ajouter un destinataire de substitution"
@ -443,8 +443,8 @@ msgstr "Administrateur"
msgid "Advanced Options"
msgstr "Options avancées"
#: packages/ui/primitives/document-flow/add-fields.tsx:573
#: packages/ui/primitives/template-flow/add-template-fields.tsx:406
#: packages/ui/primitives/document-flow/add-fields.tsx:576
#: packages/ui/primitives/template-flow/add-template-fields.tsx:409
msgid "Advanced settings"
msgstr "Paramètres avancés"
@ -550,6 +550,10 @@ msgstr "Ccers"
msgid "Character Limit"
msgstr "Limite de caractères"
#: packages/ui/primitives/document-flow/types.ts:58
msgid "Checkbox"
msgstr "Case à cocher"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:197
msgid "Checkbox values"
msgstr "Valeurs de case à cocher"
@ -585,8 +589,8 @@ msgstr "Document Terminé"
msgid "Configure Direct Recipient"
msgstr "Configurer le destinataire direct"
#: packages/ui/primitives/document-flow/add-fields.tsx:574
#: packages/ui/primitives/template-flow/add-template-fields.tsx:407
#: packages/ui/primitives/document-flow/add-fields.tsx:577
#: packages/ui/primitives/template-flow/add-template-fields.tsx:410
msgid "Configure the {0} field"
msgstr "Configurer le champ {0}"
@ -647,9 +651,9 @@ msgstr "Créer un compte"
msgid "Custom Text"
msgstr "Texte personnalisé"
#: packages/ui/primitives/document-flow/add-fields.tsx:927
#: packages/ui/primitives/document-flow/add-fields.tsx:934
#: packages/ui/primitives/document-flow/types.ts:53
#: packages/ui/primitives/template-flow/add-template-fields.tsx:690
#: packages/ui/primitives/template-flow/add-template-fields.tsx:697
msgid "Date"
msgstr "Date"
@ -666,7 +670,7 @@ msgstr "Décliner"
msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us.</0>"
msgstr "Vous n'avez pas demandé de changement de mot de passe ? Nous sommes ici pour vous aider à sécuriser votre compte, il suffit de <0>nous contacter.</0>"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:578
msgid "Direct link receiver"
msgstr "Receveur de lien direct"
@ -788,8 +792,8 @@ msgstr "Brouillon"
msgid "Drag & drop your PDF here."
msgstr "Faites glisser et déposez votre PDF ici."
#: packages/ui/primitives/document-flow/add-fields.tsx:1058
#: packages/ui/primitives/template-flow/add-template-fields.tsx:820
#: packages/ui/primitives/document-flow/add-fields.tsx:1065
#: packages/ui/primitives/template-flow/add-template-fields.tsx:827
msgid "Dropdown"
msgstr "Liste déroulante"
@ -798,14 +802,14 @@ msgid "Dropdown options"
msgstr "Options de liste déroulante"
#: packages/lib/constants/document.ts:28
#: packages/ui/primitives/document-flow/add-fields.tsx:875
#: packages/ui/primitives/document-flow/add-fields.tsx:882
#: packages/ui/primitives/document-flow/add-signature.tsx:272
#: packages/ui/primitives/document-flow/add-signers.tsx:512
#: packages/ui/primitives/document-flow/add-signers.tsx:519
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:645
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:471
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:478
msgid "Email"
msgstr "Email"
@ -825,7 +829,7 @@ msgstr "Email renvoyé"
msgid "Email sent"
msgstr "Email envoyé"
#: packages/ui/primitives/document-flow/add-fields.tsx:1123
#: packages/ui/primitives/document-flow/add-fields.tsx:1130
msgid "Empty field"
msgstr "Champ vide"
@ -834,11 +838,11 @@ msgid "Enable Direct Link Signing"
msgstr "Activer la signature de lien direct"
#: packages/ui/primitives/document-flow/add-signers.tsx:401
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:362
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:370
msgid "Enable signing order"
msgstr "Activer l'ordre de signature"
#: packages/ui/primitives/document-flow/add-fields.tsx:795
#: packages/ui/primitives/document-flow/add-fields.tsx:802
msgid "Enable Typed Signatures"
msgstr "Activer les signatures tapées"
@ -1016,14 +1020,14 @@ msgstr "Message <0>(Optionnel)</0>"
msgid "Min"
msgstr "Min"
#: packages/ui/primitives/document-flow/add-fields.tsx:901
#: packages/ui/primitives/document-flow/add-fields.tsx:908
#: packages/ui/primitives/document-flow/add-signature.tsx:298
#: packages/ui/primitives/document-flow/add-signers.tsx:550
#: packages/ui/primitives/document-flow/add-signers.tsx:556
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:671
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:506
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:512
msgid "Name"
msgstr "Nom"
@ -1039,8 +1043,8 @@ msgstr "Nécessite une signature"
msgid "Needs to view"
msgstr "Nécessite une visualisation"
#: packages/ui/primitives/document-flow/add-fields.tsx:686
#: packages/ui/primitives/template-flow/add-template-fields.tsx:504
#: packages/ui/primitives/document-flow/add-fields.tsx:693
#: packages/ui/primitives/template-flow/add-template-fields.tsx:511
msgid "No recipient matching this description was found."
msgstr "Aucun destinataire correspondant à cette description n'a été trouvé."
@ -1048,8 +1052,8 @@ msgstr "Aucun destinataire correspondant à cette description n'a été trouvé.
msgid "No recipients"
msgstr "Aucun destinataire"
#: packages/ui/primitives/document-flow/add-fields.tsx:701
#: packages/ui/primitives/template-flow/add-template-fields.tsx:519
#: packages/ui/primitives/document-flow/add-fields.tsx:708
#: packages/ui/primitives/template-flow/add-template-fields.tsx:526
msgid "No recipients with this role"
msgstr "Aucun destinataire avec ce rôle"
@ -1077,9 +1081,9 @@ msgstr "Aucune valeur trouvée."
msgid "None"
msgstr "Aucun"
#: packages/ui/primitives/document-flow/add-fields.tsx:979
#: packages/ui/primitives/document-flow/add-fields.tsx:986
#: packages/ui/primitives/document-flow/types.ts:56
#: packages/ui/primitives/template-flow/add-template-fields.tsx:742
#: packages/ui/primitives/template-flow/add-template-fields.tsx:749
msgid "Number"
msgstr "Numéro"
@ -1170,7 +1174,8 @@ msgstr "Veuillez confirmer votre adresse email"
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
#: packages/ui/primitives/document-flow/types.ts:57
#: packages/ui/primitives/template-flow/add-template-fields.tsx:775
msgid "Radio"
msgstr "Radio"
@ -1250,7 +1255,7 @@ msgstr "Rappel : Veuillez {recipientActionVerb} ce document"
msgid "Reminder: Please {recipientActionVerb} your document"
msgstr "Rappel : Veuillez {recipientActionVerb} votre document"
#: packages/ui/primitives/document-flow/add-fields.tsx:1110
#: packages/ui/primitives/document-flow/add-fields.tsx:1117
msgid "Remove"
msgstr "Retirer"
@ -1282,7 +1287,7 @@ msgstr "Lignes par page"
msgid "Save"
msgstr "Sauvegarder"
#: packages/ui/primitives/template-flow/add-template-fields.tsx:854
#: packages/ui/primitives/template-flow/add-template-fields.tsx:861
msgid "Save Template"
msgstr "Sauvegarder le modèle"
@ -1291,6 +1296,7 @@ msgid "Search languages..."
msgstr "Rechercher des langues..."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:115
#: packages/ui/primitives/document-flow/types.ts:59
msgid "Select"
msgstr "Sélectionner"
@ -1354,7 +1360,7 @@ msgid "Share your signing experience!"
msgstr "Partagez votre expérience de signature !"
#: packages/ui/primitives/document-flow/add-signers.tsx:709
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:655
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:663
msgid "Show advanced settings"
msgstr "Afficher les paramètres avancés"
@ -1370,11 +1376,11 @@ msgstr "Signer le document"
msgid "Sign In"
msgstr "Se connecter"
#: packages/ui/primitives/document-flow/add-fields.tsx:823
#: packages/ui/primitives/document-flow/add-fields.tsx:830
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:593
msgid "Signature"
msgstr "Signature"
@ -1457,9 +1463,9 @@ msgstr "Email d'équipe supprimé pour {teamName} sur Documenso"
msgid "Template title"
msgstr "Titre du modèle"
#: packages/ui/primitives/document-flow/add-fields.tsx:953
#: packages/ui/primitives/document-flow/add-fields.tsx:960
#: packages/ui/primitives/document-flow/types.ts:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:716
#: packages/ui/primitives/template-flow/add-template-fields.tsx:723
msgid "Text"
msgstr "Texte"
@ -1554,7 +1560,7 @@ msgstr "Cela peut être remplacé par le paramétrage direct des exigences d'aut
msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support."
msgstr "Ce document ne peut pas être récupéré, si vous souhaitez contester la raison des documents futurs, veuillez contacter le support."
#: packages/ui/primitives/document-flow/add-fields.tsx:757
#: packages/ui/primitives/document-flow/add-fields.tsx:764
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."
@ -1585,7 +1591,7 @@ msgstr "Cet e-mail est envoyé au destinataire lui demandant de signer le docume
msgid "This email will be sent to the recipient who has just signed the document, if there are still other recipients who have not signed yet."
msgstr "Cet e-mail sera envoyé au destinataire qui vient de signer le document, s'il y a encore d'autres destinataires qui n'ont pas signé."
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:573
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:581
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."
@ -1593,7 +1599,7 @@ msgstr "Ce champ ne peut pas être modifié ou supprimé. Lorsque vous partagez
msgid "This is how the document will reach the recipients once the document is ready for signing."
msgstr "Voici comment le document atteindra les destinataires une fois qu'il sera prêt à être signé."
#: packages/ui/primitives/document-flow/add-fields.tsx:1090
#: packages/ui/primitives/document-flow/add-fields.tsx:1097
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
msgstr "Ce destinataire ne peut plus être modifié car il a signé un champ ou complété le document."
@ -1622,8 +1628,8 @@ msgstr "Fuseau horaire"
msgid "Title"
msgstr "Titre"
#: packages/ui/primitives/document-flow/add-fields.tsx:1073
#: packages/ui/primitives/template-flow/add-template-fields.tsx:834
#: packages/ui/primitives/document-flow/add-fields.tsx:1080
#: packages/ui/primitives/template-flow/add-template-fields.tsx:841
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}."

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-11-14 12:05\n"
"PO-Revision-Date: 2024-11-20 11:56\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

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-11-14 12:05\n"
"PO-Revision-Date: 2024-11-20 11:56\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
@ -50,19 +50,19 @@ msgstr "\"{placeholderEmail}\" au nom de \"{0}\" vous a invité à signer \"exem
msgid "\"{teamUrl}\" has invited you to sign \"example document\"."
msgstr "\"{teamUrl}\" vous a invité à signer \"example document\"."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:79
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:80
msgid "({0}) has invited you to approve this document"
msgstr "({0}) vous a invité à approuver ce document"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:76
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:77
msgid "({0}) has invited you to sign this document"
msgstr "({0}) vous a invité à signer ce document"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:73
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:74
msgid "({0}) has invited you to view this document"
msgstr "({0}) vous a invité à consulter ce document"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:311
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313
msgid "{0, plural, one {(1 character over)} other {(# characters over)}}"
msgstr "{0, plural, one {(1 caractère de trop)} other {(# caractères de trop)}}"
@ -84,6 +84,10 @@ msgstr "{0, plural, one {# siège} other {# sièges}}"
msgid "{0, plural, one {<0>You have <1>1</1> pending team invitation</0>} other {<2>You have <3>#</3> pending team invitations</2>}}"
msgstr "{0, plural, one {<0>Vous avez <1>1</1> invitation d'équipe en attente</0>} other {<2>Vous avez <3>#</3> invitations d'équipe en attente</2>}}"
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:196
msgid "{0, plural, one {1 matching field} other {# matching fields}}"
msgstr "{0, plural, one {1 champ correspondant} other {# champs correspondants}}"
#: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:129
msgid "{0, plural, one {1 Recipient} other {# Recipients}}"
msgstr "{0, plural, one {1 Destinataire} other {# Destinataires}}"
@ -96,6 +100,10 @@ msgstr "{0, plural, one {En attente d'1 destinataire} other {En attente de # des
msgid "{0, plural, zero {Select values} other {# selected...}}"
msgstr "{0, plural, zero {Sélectionner des valeurs} other {# sélectionnées...}}"
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:193
msgid "{0}"
msgstr "{0}"
#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249
msgid "{0} direct signing templates"
msgstr "{0} modèles de signature directe"
@ -116,7 +124,7 @@ msgstr "{0} Destinataire(s)"
#~ msgid "{0} the document to complete the process."
#~ msgstr "{0} the document to complete the process."
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:292
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:294
msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}"
msgstr "{charactersRemaining, plural, one {1 caractère restant} other {{charactersRemaining} caractères restants}}"
@ -474,6 +482,10 @@ msgstr "Une erreur est survenue lors de l'ajout de signataires."
msgid "An error occurred while adding the fields."
msgstr "Une erreur est survenue lors de l'ajout des champs."
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:154
msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields."
msgstr "Une erreur est survenue lors de la signature automatique du document, certains champs peuvent ne pas être signés. Veuillez vérifier et signer manuellement tous les champs restants."
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:176
msgid "An error occurred while creating document from template."
msgstr "Une erreur est survenue lors de la création du document à partir d'un modèle."
@ -748,7 +760,7 @@ msgstr "Bannière mise à jour"
msgid "Basic details"
msgstr "Détails de base"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:72
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:74
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:61
#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:117
#: apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx:120
@ -810,6 +822,7 @@ msgstr "En utilisant la fonctionnalité de signature électronique, vous consent
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:78
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:119
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:472
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:220
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:178
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
@ -817,11 +830,11 @@ msgstr "En utilisant la fonctionnalité de signature électronique, vous consent
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:220
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:328
#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:153
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:248
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:335
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:242
@ -1780,7 +1793,7 @@ msgstr "Entrez votre adresse e-mail pour recevoir le document complété."
msgid "Enter your name"
msgstr "Entrez votre nom"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:278
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:280
msgid "Enter your text here"
msgstr "Entrez votre texte ici"
@ -1799,6 +1812,7 @@ msgstr "Entrez votre texte ici"
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:175
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:152
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:122
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:212
@ -2230,6 +2244,10 @@ msgstr "Gérer toutes les équipes avec lesquelles vous êtes actuellement assoc
msgid "Manage and view template"
msgstr "Gérer et afficher le modèle"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:136
msgid "Manage billing"
msgstr "Gérer la facturation"
#: apps/web/src/components/templates/manage-public-template-dialog.tsx:341
msgid "Manage details for this public template"
msgstr "Gérer les détails de ce modèle public"
@ -2250,7 +2268,7 @@ msgstr "Gérer les clés d'accès"
msgid "Manage subscription"
msgstr "Gérer l'abonnement"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:66
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:67
msgid "Manage Subscription"
msgstr "Gérer l'abonnement"
@ -2463,7 +2481,7 @@ msgstr "Non pris en charge"
msgid "Nothing to do"
msgstr "Rien à faire"
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:270
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:271
msgid "Number"
msgstr "Numéro"
@ -3026,8 +3044,8 @@ msgid "Roles"
msgstr "Rôles"
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:446
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:336
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:342
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:337
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:344
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:312
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:232
msgid "Save"
@ -3175,6 +3193,7 @@ msgstr "Afficher des modèles dans le profil public de votre équipe pour que vo
#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:114
#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:139
#: apps/web/src/app/(profile)/p/[url]/page.tsx:192
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:229
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
@ -3331,7 +3350,7 @@ msgstr "Paramètres du site"
#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:80
#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72
#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:62
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:50
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:51
#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:73
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:93
@ -3646,8 +3665,8 @@ msgstr "Modèles"
msgid "Templates allow you to quickly generate documents with pre-filled recipients and fields."
msgstr "Les modèles vous permettent de générer rapidement des documents avec des destinataires et des champs pré-remplis."
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:256
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:272
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:257
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:274
msgid "Text"
msgstr "Texte"
@ -4451,7 +4470,7 @@ msgstr "Vous voulez envoyer des liens de signature élégants comme celui-ci ? <
msgid "Want your own public profile?"
msgstr "Vous voulez votre propre profil public ?"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:40
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:41
#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:55
#: apps/web/src/components/(teams)/team-billing-portal-button.tsx:31
msgid "We are unable to proceed to the billing portal at this time. Please try again, or contact support."
@ -4715,6 +4734,10 @@ msgstr "Essayiez-vous d'éditer ce document à la place ?"
msgid "When you click continue, you will be prompted to add the first available authenticator on your system."
msgstr "Lorsque vous cliquez sur continuer, vous serez invité à ajouter le premier authentificateur disponible sur votre système."
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:183
msgid "When you sign a document, we can automatically fill in and sign the following fields using information that has already been provided. You can also manually sign or remove any automatically signed fields afterwards if you desire."
msgstr "Lorsque vous signez un document, nous pouvons automatiquement remplir et signer les champs suivants à l'aide des informations déjà fournies. Vous pouvez également signer manuellement ou supprimer les champs signés automatiquement par la suite si vous le souhaitez."
#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:36
msgid "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."
msgstr "Lorsque vous utilisez notre plateforme pour apposer votre signature électronique sur des documents, vous consentez à le faire conformément à la loi sur les signatures électroniques dans le commerce mondial et national (E-Sign Act) et aux autres lois applicables. Cette action indique votre accord à utiliser des moyens électroniques pour signer des documents et recevoir des notifications."
@ -4784,7 +4807,7 @@ msgstr "Vous êtes sur le point de supprimer l'utilisateur suivant de <0>{teamNa
msgid "You are about to revoke access for team <0>{0}</0> ({1}) to use your email."
msgstr "Vous êtes sur le point de révoquer l'accès de l'équipe <0>{0}</0> ({1}) à votre e-mail."
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:78
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:80
msgid "You are currently on the <0>Free Plan</0>."
msgstr "Vous êtes actuellement sur le <0>Plan Gratuit</0>."
@ -4836,7 +4859,7 @@ msgstr "Vous ne pouvez pas modifier un membre de l'équipe qui a un rôle plus
msgid "You cannot upload encrypted PDFs"
msgstr "Vous ne pouvez pas télécharger de PDF cryptés"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:45
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:46
msgid "You do not currently have a customer record, this should not happen. Please contact support for assistance."
msgstr "Vous n'avez actuellement pas de dossier client, cela ne devrait pas se produire. Veuillez contacter le support pour obtenir de l'aide."
@ -4982,7 +5005,7 @@ msgstr "L'URL de votre site web de marque"
msgid "Your branding preferences have been updated"
msgstr "Vos préférences de branding ont été mises à jour"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:119
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:125
msgid "Your current plan is past due. Please update your payment information."
msgstr "Votre plan actuel est en retard. Veuillez mettre à jour vos informations de paiement."

View File

@ -8,7 +8,7 @@ msgstr ""
"Language: pl\n"
"Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-14 12:05\n"
"PO-Revision-Date: 2024-11-20 11:56\n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
@ -414,11 +414,11 @@ msgstr "Dodaj kolejną wartość"
msgid "Add myself"
msgstr "Dodaj siebie"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:637
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:645
msgid "Add Myself"
msgstr "Dodaj siebie"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:623
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:631
msgid "Add Placeholder Recipient"
msgstr "Dodaj odbiorcę zastępczego"
@ -443,8 +443,8 @@ msgstr "Administrator"
msgid "Advanced Options"
msgstr "Opcje zaawansowane"
#: packages/ui/primitives/document-flow/add-fields.tsx:573
#: packages/ui/primitives/template-flow/add-template-fields.tsx:406
#: packages/ui/primitives/document-flow/add-fields.tsx:576
#: packages/ui/primitives/template-flow/add-template-fields.tsx:409
msgid "Advanced settings"
msgstr "Ustawienia zaawansowane"
@ -550,6 +550,10 @@ msgstr "Kserokopie"
msgid "Character Limit"
msgstr "Limit znaków"
#: packages/ui/primitives/document-flow/types.ts:58
msgid "Checkbox"
msgstr "Checkbox"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:197
msgid "Checkbox values"
msgstr "Wartości checkboxa"
@ -585,8 +589,8 @@ msgstr "Dokument zakończony"
msgid "Configure Direct Recipient"
msgstr "Skonfiguruj bezpośredniego odbiorcę"
#: packages/ui/primitives/document-flow/add-fields.tsx:574
#: packages/ui/primitives/template-flow/add-template-fields.tsx:407
#: packages/ui/primitives/document-flow/add-fields.tsx:577
#: packages/ui/primitives/template-flow/add-template-fields.tsx:410
msgid "Configure the {0} field"
msgstr "Skonfiguruj pole {0}"
@ -647,9 +651,9 @@ msgstr "Utwórz konto"
msgid "Custom Text"
msgstr "Tekst niestandardowy"
#: packages/ui/primitives/document-flow/add-fields.tsx:927
#: packages/ui/primitives/document-flow/add-fields.tsx:934
#: packages/ui/primitives/document-flow/types.ts:53
#: packages/ui/primitives/template-flow/add-template-fields.tsx:690
#: packages/ui/primitives/template-flow/add-template-fields.tsx:697
msgid "Date"
msgstr "Data"
@ -666,7 +670,7 @@ msgstr "Odmów"
msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us.</0>"
msgstr "Nie prosiłeś o zmianę hasła? Jesteśmy tutaj, aby pomóc Ci zabezpieczyć swoje konto, po prostu <0>skontaktuj się z nami.</0>"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:578
msgid "Direct link receiver"
msgstr "Odbiorca linku bezpośredniego"
@ -788,8 +792,8 @@ msgstr "Robocza wersja"
msgid "Drag & drop your PDF here."
msgstr "Przeciągnij i upuść swój PDF tutaj."
#: packages/ui/primitives/document-flow/add-fields.tsx:1058
#: packages/ui/primitives/template-flow/add-template-fields.tsx:820
#: packages/ui/primitives/document-flow/add-fields.tsx:1065
#: packages/ui/primitives/template-flow/add-template-fields.tsx:827
msgid "Dropdown"
msgstr "Lista rozwijana"
@ -798,14 +802,14 @@ msgid "Dropdown options"
msgstr "Opcje rozwijane"
#: packages/lib/constants/document.ts:28
#: packages/ui/primitives/document-flow/add-fields.tsx:875
#: packages/ui/primitives/document-flow/add-fields.tsx:882
#: packages/ui/primitives/document-flow/add-signature.tsx:272
#: packages/ui/primitives/document-flow/add-signers.tsx:512
#: packages/ui/primitives/document-flow/add-signers.tsx:519
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:645
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:471
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:478
msgid "Email"
msgstr "Email"
@ -825,7 +829,7 @@ msgstr "E-mail wysłany ponownie"
msgid "Email sent"
msgstr "E-mail wysłany"
#: packages/ui/primitives/document-flow/add-fields.tsx:1123
#: packages/ui/primitives/document-flow/add-fields.tsx:1130
msgid "Empty field"
msgstr "Puste pole"
@ -834,11 +838,11 @@ msgid "Enable Direct Link Signing"
msgstr "Włącz podpisywanie linku bezpośredniego"
#: packages/ui/primitives/document-flow/add-signers.tsx:401
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:362
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:370
msgid "Enable signing order"
msgstr "Włącz kolejność podpisów"
#: packages/ui/primitives/document-flow/add-fields.tsx:795
#: packages/ui/primitives/document-flow/add-fields.tsx:802
msgid "Enable Typed Signatures"
msgstr "Włącz podpisy typu pisanego"
@ -1016,14 +1020,14 @@ msgstr "Wiadomość <0>(Opcjonalnie)</0>"
msgid "Min"
msgstr "Min"
#: packages/ui/primitives/document-flow/add-fields.tsx:901
#: packages/ui/primitives/document-flow/add-fields.tsx:908
#: packages/ui/primitives/document-flow/add-signature.tsx:298
#: packages/ui/primitives/document-flow/add-signers.tsx:550
#: packages/ui/primitives/document-flow/add-signers.tsx:556
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:671
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:506
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:512
msgid "Name"
msgstr "Nazwa"
@ -1039,8 +1043,8 @@ msgstr "Wymaga podpisania"
msgid "Needs to view"
msgstr "Wymaga obejrzenia"
#: packages/ui/primitives/document-flow/add-fields.tsx:686
#: packages/ui/primitives/template-flow/add-template-fields.tsx:504
#: packages/ui/primitives/document-flow/add-fields.tsx:693
#: packages/ui/primitives/template-flow/add-template-fields.tsx:511
msgid "No recipient matching this description was found."
msgstr "Nie znaleziono odbiorcy pasującego do tego opisu."
@ -1048,8 +1052,8 @@ msgstr "Nie znaleziono odbiorcy pasującego do tego opisu."
msgid "No recipients"
msgstr "Brak odbiorców"
#: packages/ui/primitives/document-flow/add-fields.tsx:701
#: packages/ui/primitives/template-flow/add-template-fields.tsx:519
#: packages/ui/primitives/document-flow/add-fields.tsx:708
#: packages/ui/primitives/template-flow/add-template-fields.tsx:526
msgid "No recipients with this role"
msgstr "Brak odbiorców z tą rolą"
@ -1077,9 +1081,9 @@ msgstr "Nie znaleziono wartości."
msgid "None"
msgstr "Brak"
#: packages/ui/primitives/document-flow/add-fields.tsx:979
#: packages/ui/primitives/document-flow/add-fields.tsx:986
#: packages/ui/primitives/document-flow/types.ts:56
#: packages/ui/primitives/template-flow/add-template-fields.tsx:742
#: packages/ui/primitives/template-flow/add-template-fields.tsx:749
msgid "Number"
msgstr "Numer"
@ -1170,7 +1174,8 @@ msgstr "Proszę potwierdzić swój adres email"
msgid "Please try again or contact our support."
msgstr "Spróbuj ponownie lub skontaktuj się z naszym wsparciem."
#: packages/ui/primitives/template-flow/add-template-fields.tsx:768
#: packages/ui/primitives/document-flow/types.ts:57
#: packages/ui/primitives/template-flow/add-template-fields.tsx:775
msgid "Radio"
msgstr "Radio"
@ -1250,7 +1255,7 @@ msgstr "Przypomnienie: Proszę {recipientActionVerb} ten dokument"
msgid "Reminder: Please {recipientActionVerb} your document"
msgstr "Przypomnienie: Proszę {recipientActionVerb} Twój dokument"
#: packages/ui/primitives/document-flow/add-fields.tsx:1110
#: packages/ui/primitives/document-flow/add-fields.tsx:1117
msgid "Remove"
msgstr "Usuń"
@ -1282,7 +1287,7 @@ msgstr "Wiersze na stronę"
msgid "Save"
msgstr "Zapisz"
#: packages/ui/primitives/template-flow/add-template-fields.tsx:854
#: packages/ui/primitives/template-flow/add-template-fields.tsx:861
msgid "Save Template"
msgstr "Zapisz szablon"
@ -1291,6 +1296,7 @@ msgid "Search languages..."
msgstr "Szukaj języków..."
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:115
#: packages/ui/primitives/document-flow/types.ts:59
msgid "Select"
msgstr "Wybierz"
@ -1354,7 +1360,7 @@ msgid "Share your signing experience!"
msgstr "Podziel się swoim doświadczeniem podpisywania!"
#: packages/ui/primitives/document-flow/add-signers.tsx:709
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:655
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:663
msgid "Show advanced settings"
msgstr "Pokaż ustawienia zaawansowane"
@ -1370,11 +1376,11 @@ msgstr "Podpisz dokument"
msgid "Sign In"
msgstr "Zaloguj się"
#: packages/ui/primitives/document-flow/add-fields.tsx:823
#: packages/ui/primitives/document-flow/add-fields.tsx:830
#: 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
#: packages/ui/primitives/template-flow/add-template-fields.tsx:593
msgid "Signature"
msgstr "Podpis"
@ -1457,9 +1463,9 @@ msgstr "Email zespołowy usunięty dla {teamName} na Documenso"
msgid "Template title"
msgstr "Tytuł szablonu"
#: packages/ui/primitives/document-flow/add-fields.tsx:953
#: packages/ui/primitives/document-flow/add-fields.tsx:960
#: packages/ui/primitives/document-flow/types.ts:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:716
#: packages/ui/primitives/template-flow/add-template-fields.tsx:723
msgid "Text"
msgstr "Tekst"
@ -1554,7 +1560,7 @@ msgstr "To można nadpisać, ustawiając wymagania dotyczące uwierzytelniania b
msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support."
msgstr "Dokument ten nie może być odzyskany. Jeśli chcesz zakwestionować przyczynę przyszłych dokumentów, skontaktuj się z administracją."
#: packages/ui/primitives/document-flow/add-fields.tsx:757
#: packages/ui/primitives/document-flow/add-fields.tsx:764
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
msgstr "Ten dokument został już wysłany do tego odbiorcy. Nie można już edytować tego odbiorcy."
@ -1585,7 +1591,7 @@ msgstr "Ten e-mail jest wysyłany do odbiorcy, prosząc go o podpisanie dokument
msgid "This email will be sent to the recipient who has just signed the document, if there are still other recipients who have not signed yet."
msgstr "Ten e-mail zostanie wysłany do odbiorcy, który właśnie podpisał dokument, jeśli są jeszcze inni odbiorcy, którzy nie podpisali."
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:573
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:581
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 "To pole nie może być modyfikowane ani usuwane. Po udostępnieniu bezpośredniego linku do tego szablonu lub dodaniu go do swojego publicznego profilu, każdy, kto się w nim dostanie, może wpisać swoje imię i email oraz wypełnić przypisane mu pola."
@ -1593,7 +1599,7 @@ msgstr "To pole nie może być modyfikowane ani usuwane. Po udostępnieniu bezpo
msgid "This is how the document will reach the recipients once the document is ready for signing."
msgstr "W ten sposób dokument dotrze do odbiorców, gdy tylko dokument będzie gotowy do podpisania."
#: packages/ui/primitives/document-flow/add-fields.tsx:1090
#: packages/ui/primitives/document-flow/add-fields.tsx:1097
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
msgstr "Ten odbiorca nie może być już modyfikowany, ponieważ podpisał pole lub ukończył dokument."
@ -1622,8 +1628,8 @@ msgstr "Strefa czasowa"
msgid "Title"
msgstr "Tytuł"
#: packages/ui/primitives/document-flow/add-fields.tsx:1073
#: packages/ui/primitives/template-flow/add-template-fields.tsx:834
#: packages/ui/primitives/document-flow/add-fields.tsx:1080
#: packages/ui/primitives/template-flow/add-template-fields.tsx:841
msgid "To proceed further, please set at least one value for the {0} field."
msgstr "Aby kontynuować, ustaw przynajmniej jedną wartość dla pola {0}."

View File

@ -8,7 +8,7 @@ msgstr ""
"Language: pl\n"
"Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-14 12:05\n"
"PO-Revision-Date: 2024-11-20 11:56\n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"

View File

@ -8,7 +8,7 @@ msgstr ""
"Language: pl\n"
"Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-14 12:05\n"
"PO-Revision-Date: 2024-11-20 11:56\n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
@ -50,19 +50,19 @@ msgstr "\"{placeholderEmail}\" w imieniu \"{0}\" zaprosił Cię do podpisania \"
msgid "\"{teamUrl}\" has invited you to sign \"example document\"."
msgstr "\"{teamUrl}\" zaprosił Cię do podpisania \"przykładowego dokumentu\"."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:79
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:80
msgid "({0}) has invited you to approve this document"
msgstr "({0}) zaprosił Cię do zatwierdzenia tego dokumentu"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:76
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:77
msgid "({0}) has invited you to sign this document"
msgstr "({0}) zaprosił Cię do podpisania tego dokumentu"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:73
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:74
msgid "({0}) has invited you to view this document"
msgstr "({0}) zaprosił Cię do przeglądania tego dokumentu"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:311
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313
msgid "{0, plural, one {(1 character over)} other {(# characters over)}}"
msgstr "{0, plural, one {(1 znak przekroczony)} other {(# znaków przekroczonych)}}"
@ -84,6 +84,10 @@ msgstr "{0, plural, one {# miejsce} other {# miejsc}}"
msgid "{0, plural, one {<0>You have <1>1</1> pending team invitation</0>} other {<2>You have <3>#</3> pending team invitations</2>}}"
msgstr "{0, plural, one {<0>Masz <1>1</1> oczekujące zaproszenie do zespołu</0>} other {<2>Masz <3>#</3> oczekujących zaproszeń do zespołu</2>}}"
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:196
msgid "{0, plural, one {1 matching field} other {# matching fields}}"
msgstr "{0, plural, one {1 pasujące pole} other {# pasujących pól}}"
#: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:129
msgid "{0, plural, one {1 Recipient} other {# Recipients}}"
msgstr "{0, plural, one {1 Odbiorca} other {# Odbiorców}}"
@ -96,6 +100,10 @@ msgstr "{0, plural, one {Czekam na 1 odbiorcę} other {Czekam na # odbiorców}}"
msgid "{0, plural, zero {Select values} other {# selected...}}"
msgstr "{0, plural, zero {Wybierz wartości} other {# wybranych...}}"
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:193
msgid "{0}"
msgstr "{0}"
#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249
msgid "{0} direct signing templates"
msgstr "{0} bezpośrednich szablonów podpisu"
@ -116,7 +124,7 @@ msgstr "{0} Odbiorca (ów)"
#~ msgid "{0} the document to complete the process."
#~ msgstr "{0} the document to complete the process."
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:292
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:294
msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}"
msgstr "{charactersRemaining, plural, one {1 znak pozostały} other {{charactersRemaining} znaki pozostałe}}"
@ -254,7 +262,7 @@ msgstr "Akceptowane zaproszenie do zespołu"
#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:128
msgid "Account Authentication"
msgstr "Autoryzacja konta"
msgstr "Uwierzytelnianie konta"
#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:51
#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:48
@ -263,7 +271,7 @@ msgstr "Konto usunięte"
#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:119
msgid "Account Re-Authentication"
msgstr "Ponowna autoryzacja konta"
msgstr "Ponowna Autoryzacja Konta"
#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:139
msgid "Acknowledgment"
@ -296,7 +304,7 @@ msgstr "Aktywny"
#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:68
msgid "Active Subscriptions"
msgstr "Aktywne subskrypcje"
msgstr "Aktywne Subskrypcje"
#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:189
msgid "Add"
@ -309,7 +317,7 @@ msgstr "Dodaj wszystkie istotne pola dla każdego odbiorcy."
#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:83
msgid "Add all relevant placeholders for each recipient."
msgstr "Dodaj wszystkie istotne znaczniki dla każdego odbiorcy."
msgstr "Dodaj wszystkie odpowiednie symbole zastępcze dla każdego odbiorcy."
#: apps/web/src/app/(dashboard)/settings/security/page.tsx:62
msgid "Add an authenticator to serve as a secondary authentication method for signing documents."
@ -335,7 +343,7 @@ msgstr "Dodaj więcej"
#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:146
#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:154
msgid "Add passkey"
msgstr "Dodaj klucz hasła"
msgstr "Dodaj hasło"
#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:82
msgid "Add Placeholders"
@ -359,7 +367,7 @@ msgstr "Dodaj osoby, które podpiszą dokument."
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:220
msgid "Add the recipients to create the document with"
msgstr "Dodaj odbiorców, aby stworzyć dokument"
msgstr "Dodaj odbiorców, aby utworzyć dokument"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181
#~ msgid "Add the subject and message you wish to send to signers."
@ -474,6 +482,10 @@ msgstr "Wystąpił błąd podczas dodawania sygnatariuszy."
msgid "An error occurred while adding the fields."
msgstr "Wystąpił błąd podczas dodawania pól."
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:154
msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields."
msgstr "Wystąpił błąd podczas automatycznego podpisywania dokumentu, niektóre pola mogą nie być podpisane. Proszę sprawdzić i ręcznie podpisać wszystkie pozostałe pola."
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:176
msgid "An error occurred while creating document from template."
msgstr "Wystąpił błąd podczas tworzenia dokumentu z szablonu."
@ -748,7 +760,7 @@ msgstr "Baner zaktualizowany"
msgid "Basic details"
msgstr "Podstawowe szczegóły"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:72
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:74
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:61
#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:117
#: apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx:120
@ -810,6 +822,7 @@ msgstr "Korzystając z funkcji podpisu elektronicznego, wyrażasz zgodę na prze
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:78
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:119
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:472
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:220
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:178
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
@ -817,11 +830,11 @@ msgstr "Korzystając z funkcji podpisu elektronicznego, wyrażasz zgodę na prze
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:220
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:328
#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:153
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:248
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:335
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:242
@ -1780,7 +1793,7 @@ msgstr "Wprowadź swój adres e-mail, aby otrzymać ukończony dokument."
msgid "Enter your name"
msgstr "Wprowadź swoje imię"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:278
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:280
msgid "Enter your text here"
msgstr "Wprowadź swój tekst tutaj"
@ -1799,6 +1812,7 @@ msgstr "Wprowadź swój tekst tutaj"
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:175
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:152
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:122
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:212
@ -2230,6 +2244,10 @@ msgstr "Zarządzaj wszystkimi zespołami, z którymi jesteś obecnie związany."
msgid "Manage and view template"
msgstr "Zarządzaj i przeglądaj szablon"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:136
msgid "Manage billing"
msgstr "Zarządzaj fakturowaniem"
#: apps/web/src/components/templates/manage-public-template-dialog.tsx:341
msgid "Manage details for this public template"
msgstr "Zarządzaj szczegółami tego publicznego szablonu"
@ -2250,7 +2268,7 @@ msgstr "Zarządzaj kluczami dostępu"
msgid "Manage subscription"
msgstr "Zarządzaj subskrypcją"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:66
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:67
msgid "Manage Subscription"
msgstr "Zarządzaj Subskrypcją"
@ -2463,7 +2481,7 @@ msgstr "Nieobsługiwane"
msgid "Nothing to do"
msgstr "Nic do zrobienia"
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:270
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:271
msgid "Number"
msgstr "Numer"
@ -2570,7 +2588,7 @@ msgstr "Nazwa klucza dostępu"
#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:121
msgid "Passkey Re-Authentication"
msgstr "Ponowna autoryzacja za pomocą klucza"
msgstr "Ponowna Autoryzacja Klucza Dostępu"
#: apps/web/src/app/(dashboard)/settings/security/page.tsx:106
#: apps/web/src/app/(dashboard)/settings/security/passkeys/page.tsx:32
@ -2627,7 +2645,7 @@ msgstr "Oczekujące Dokumenty"
#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:89
msgid "Pending Documents"
msgstr "Oczekujące zaproszenia"
msgstr "Oczekujące dokumenty"
#: apps/web/src/app/(dashboard)/settings/teams/team-invitations.tsx:62
msgid "Pending invitations"
@ -2639,71 +2657,71 @@ msgstr "Oczekujący zespół usunięty."
#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:134
msgid "Personal"
msgstr "Konto osobiste"
msgstr "Osobiste"
#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:77
msgid "Personal Account"
msgstr "Wybierz hasło"
msgstr "Konto osobiste"
#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:152
msgid "Pick a password"
msgstr "Wybierz jedną z poniższych umów i zacznij podpisywać, aby się zarejestrować"
msgstr "Wybierz hasło"
#: apps/web/src/components/ui/user-profile-timur.tsx:53
msgid "Pick any of the following agreements below and start signing to get started"
msgstr "Pick any of the following agreements below and start signing to get started"
msgstr "Wybierz dowolną z poniższych umów i zacznij podpisywanie, aby rozpocząć"
#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:212
msgid "Please check the CSV file and make sure it is according to our format"
msgstr "Proszę wybrać nowe hasło"
msgstr "Proszę sprawdzić plik CSV i upewnić się, że jest zgodny z naszym formatem"
#: apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx:81
msgid "Please check your email for updates."
msgstr "Proszę sprawdź swój e-mail w celu uzyskania aktualizacji."
msgstr "Proszę sprawdzić swój email w celu aktualizacji."
#: apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx:34
msgid "Please choose your new password"
msgstr "Please choose your new password"
msgstr "Proszę wybrać nowe hasło"
#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:174
msgid "Please contact support if you would like to revert this action."
msgstr "Proszę podać znaczącą nazwę dla swojego tokena. To pomoże Ci zidentyfikować go później."
msgstr "Proszę skontaktować się z pomocą techniczną, jeśli chcesz cofnąć tę akcję."
#: apps/web/src/components/forms/token.tsx:175
msgid "Please enter a meaningful name for your token. This will help you identify it later."
msgstr "Please enter a meaningful name for your token. This will help you identify it later."
msgstr "Proszę podać wartościową nazwę dla swojego tokena. Pomoże to później w jego identyfikacji."
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:135
msgid "Please mark as viewed to complete"
msgstr "Please mark as viewed to complete"
msgstr "Proszę zaznaczyć jako obejrzane, aby zakończyć"
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:459
msgid "Please note that proceeding will remove direct linking recipient and turn it into a placeholder."
msgstr "Please note that proceeding will remove direct linking recipient and turn it into a placeholder."
msgstr "Proszę zauważyć, że kontynuowanie usunie bezpośrednio łączącego odbiorcę i zamieni go w symbol zastępczy."
#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:128
msgid "Please note that this action is <0>irreversible</0>."
msgstr "Proszę pamiętać, że ta akcja jest <0>nieodwracalna</0>. Po zatwierdzeniu ten dokument zostanie trwale usunięty."
msgstr "Proszę zauważyć, że ta czynność jest <0>nieodwracalna</0>."
#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:119
msgid "Please note that this action is <0>irreversible</0>. Once confirmed, this document will be permanently deleted."
msgstr "Please note that this action is <0>irreversible</0>. Once confirmed, this document will be permanently deleted."
msgstr "Proszę pamiętać, że ta czynność jest <0>nieodwracalna</0>. Po potwierdzeniu, ten dokument zostanie trwale usunięty."
#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:67
msgid "Please note that this action is irreversible. Once confirmed, your template will be permanently deleted."
msgstr "Proszę pamiętać, że ta akcja jest nieodwracalna. Po zatwierdzeniu Twój token zostanie trwale usunięty."
msgstr "Proszę pamiętać, że ta czynność jest nieodwracalna. Po potwierdzeniu, Twój szablon zostanie trwale usunięty."
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:133
msgid "Please note that this action is irreversible. Once confirmed, your token will be permanently deleted."
msgstr "Proszę pamiętać, że ta akcja jest nieodwracalna. Po zatwierdzeniu Twój webhook zostanie trwale usunięty."
msgstr "Proszę zauważyć, że ta czynność jest nieodwracalna. Po potwierdzeniu, twój token zostanie trwale usunięty."
#: apps/web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx:121
msgid "Please note that this action is irreversible. Once confirmed, your webhook will be permanently deleted."
msgstr "Please note that this action is irreversible. Once confirmed, your webhook will be permanently deleted."
msgstr "Proszę pamiętać, że ta czynność jest nieodwracalna. Po potwierdzeniu, Twój webhook zostanie trwale usunięty."
#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:130
msgid "Please note that you will lose access to all documents associated with this team & all the members will be removed and notified"
msgstr "Please note that you will lose access to all documents associated with this team & all the members will be removed and notified"
msgstr "Proszę pamiętać, że stracisz dostęp do wszystkich dokumentów powiązanych z tym zespołem i wszyscy członkowie zostaną usunięci oraz powiadomieni"
#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:37
msgid "Please provide a reason"
@ -2711,11 +2729,11 @@ msgstr "Proszę podać powód"
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:127
msgid "Please provide a token from the authenticator, or a backup code. If you do not have a backup code available, please contact support."
msgstr "Proszę podać token z swojego autoryzatora lub kod zapasowy."
msgstr "Proszę podać token z aplikacji uwierzytelniającej lub kod zapasowy. Jeśli nie masz dostępnego kodu zapasowego, skontaktuj się z pomocą techniczną."
#: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:120
msgid "Please provide a token from your authenticator, or a backup code."
msgstr "Proszę spróbować ponownie i upewnić się, że wprowadzasz poprawny adres e-mail."
msgstr "Proszę podać token z Twojego uwierzytelniacza lub kod zapasowy."
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:169
msgid "Please review the document before signing."
@ -2723,25 +2741,25 @@ msgstr "Proszę przejrzeć dokument przed podpisaniem."
#: apps/web/src/components/forms/send-confirmation-email.tsx:64
msgid "Please try again and make sure you enter the correct email address."
msgstr "Please try again and make sure you enter the correct email address."
msgstr "Spróbuj ponownie i upewnij się, że wprowadzasz poprawny adres email."
#: apps/web/src/components/forms/signin.tsx:203
msgid "Please try again later or login using your normal details"
msgstr "Please try again later or login using your normal details"
msgstr "Spróbuj ponownie później lub zaloguj się, używając swoich normalnych danych"
#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:80
msgid "Please try again later."
msgstr "Please try again later."
msgstr "Proszę spróbować ponownie później."
#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:134
msgid "Please type <0>{0}</0> to confirm."
msgstr "Please type <0>{0}</0> to confirm."
msgstr "Proszę wpisać <0>{0}</0> aby potwierdzić."
#: apps/web/src/components/(dashboard)/common/command-menu.tsx:214
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:58
#: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:67
msgid "Preferences"
msgstr "Preferences"
msgstr "Preferencje"
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:204
msgid "Preview"
@ -2749,7 +2767,7 @@ msgstr "Podgląd"
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:63
msgid "Preview and configure template."
msgstr "Preview and configure template."
msgstr "Podgląd i konfiguracja szablonu."
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:130
#~ msgid "Preview: {0}"
@ -2758,36 +2776,36 @@ msgstr "Preview and configure template."
#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:105
#: apps/web/src/components/formatter/template-type.tsx:22
msgid "Private"
msgstr "Private"
msgstr "Prywatne"
#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:115
msgid "Private templates can only be modified and viewed by you."
msgstr "Private templates can only be modified and viewed by you."
msgstr "Prywatne szablony mogą być modyfikowane i przeglądane tylko przez Ciebie."
#: apps/web/src/app/(dashboard)/settings/profile/page.tsx:28
#: apps/web/src/components/(dashboard)/common/command-menu.tsx:69
#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:36
#: apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx:39
msgid "Profile"
msgstr "Profile"
msgstr "Profil"
#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:184
msgid "Profile is currently <0>hidden</0>."
msgstr "Profil jest obecnie <0>widoczny</0>."
msgstr "Profil jest obecnie <0>ukryty</0>."
#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:172
msgid "Profile is currently <0>visible</0>."
msgstr "Profile is currently <0>visible</0>."
msgstr "Profil jest obecnie <0>widoczny</0>."
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:72
#: apps/web/src/components/forms/profile.tsx:72
msgid "Profile updated"
msgstr "Publiczny"
msgstr "Profil zaktualizowano"
#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:78
#: apps/web/src/components/formatter/template-type.tsx:27
msgid "Public"
msgstr "Publiczny profil"
msgstr "Publiczny"
#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:42
#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:50
@ -2795,23 +2813,23 @@ msgstr "Publiczny profil"
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:72
#: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:81
msgid "Public Profile"
msgstr "Public Profile"
msgstr "Profil publiczny"
#: apps/web/src/components/forms/public-profile-form.tsx:146
msgid "Public profile URL"
msgstr "Nazwa użytkownika publicznego profilu"
msgstr "URL publicznego profilu"
#: apps/web/src/components/forms/v2/signup.tsx:450
msgid "Public profile username"
msgstr "Public profile username"
msgstr "Nazwa użytkownika profilu publicznego"
#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:82
msgid "Public templates are connected to your public profile. Any modifications to public templates will also appear in your public profile."
msgstr "Public templates are connected to your public profile. Any modifications to public templates will also appear in your public profile."
msgstr "Szablony publiczne są powiązane z Twoim publicznym profilem. Wszelkie modyfikacje szablonów publicznych również pojawią się w Twoim publicznym profilu."
#: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:144
msgid "Read only field"
msgstr "Gotowe"
msgstr "Pole tylko do odczytu"
#: apps/web/src/components/general/signing-disclosure.tsx:21
msgid "Read the full <0>signature disclosure</0>."
@ -2819,7 +2837,7 @@ msgstr "Przeczytaj pełne <0>ujawnienie podpisu</0>."
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:106
msgid "Ready"
msgstr "Wymagana ponowna autoryzacja, aby podpisać to pole"
msgstr "Gotowy"
#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:281
msgid "Reason"
@ -2835,12 +2853,12 @@ msgstr "Powód musi mieć mniej niż 500 znaków"
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-dialog.tsx:62
msgid "Reauthentication is required to sign this field"
msgstr "Ostatnia aktywność"
msgstr "Wymagana jest ponowna autoryzacja, aby podpisać to pole"
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recent-activity.tsx:57
#: apps/web/src/app/(dashboard)/settings/security/page.tsx:130
msgid "Recent activity"
msgstr "Odbiorca"
msgstr "Ostatnia aktywność"
#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:47
msgid "Recent documents"
@ -2898,7 +2916,7 @@ msgstr "Odrzucony"
#: apps/web/src/app/(unauthenticated)/forgot-password/page.tsx:34
msgid "Remembered your password? <0>Sign In</0>"
msgstr "Pamiętasz swoje hasło? <0>Zaloguj się</0>"
msgstr "Zapamiętałeś hasło? <0>Zaloguj się</0>"
#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:193
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:431
@ -2929,11 +2947,11 @@ msgstr "Powtórz hasło"
#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:282
msgid "Request transfer"
msgstr "Poproś o transfer"
msgstr "Zleć przeniesienie"
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:61
msgid "Reseal document"
msgstr "Zamknij dokument"
msgstr "Zapieczętuj ponownie dokument"
#: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:118
#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:154
@ -2992,7 +3010,7 @@ msgstr "Zwróć"
#: apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx:130
msgid "Return to Dashboard"
msgstr "Powrót do pulpitu nawigacyjnego"
msgstr "Powrót do pulpitu"
#: apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx:136
msgid "Return to Home"
@ -3026,8 +3044,8 @@ msgid "Roles"
msgstr "Role"
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:446
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:336
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:342
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:337
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:344
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:312
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:232
msgid "Save"
@ -3175,6 +3193,7 @@ msgstr "Pokaż szablony w profilu publicznym zespołu dla swojej publiczności,
#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:114
#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:139
#: apps/web/src/app/(profile)/p/[url]/page.tsx:192
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:229
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
@ -3331,7 +3350,7 @@ msgstr "Ustawienia strony"
#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:80
#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72
#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:62
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:50
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:51
#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:73
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:93
@ -3646,8 +3665,8 @@ msgstr "Szablony"
msgid "Templates allow you to quickly generate documents with pre-filled recipients and fields."
msgstr "Szablony pozwalają na szybkie generowanie dokumentów z wypełnionymi odbiorcami i polami."
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:256
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:272
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:257
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:274
msgid "Text"
msgstr "Tekst"
@ -4451,7 +4470,7 @@ msgstr "Chcesz wysłać eleganckie linki do podpisywania, takie jak ten? <0>Spra
msgid "Want your own public profile?"
msgstr "Chcesz swój własny profil publiczny?"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:40
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:41
#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:55
#: apps/web/src/components/(teams)/team-billing-portal-button.tsx:31
msgid "We are unable to proceed to the billing portal at this time. Please try again, or contact support."
@ -4715,6 +4734,10 @@ msgstr "Czy próbowałeś raczej edytować ten dokument?"
msgid "When you click continue, you will be prompted to add the first available authenticator on your system."
msgstr "Kiedy klikniesz kontynuuj, zostaniesz poproszony o dodanie pierwszego dostępnego autoryzatora w swoim systemie."
#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:183
msgid "When you sign a document, we can automatically fill in and sign the following fields using information that has already been provided. You can also manually sign or remove any automatically signed fields afterwards if you desire."
msgstr "Podczas podpisywania dokumentu możemy automatycznie wypełnić i podpisać następujące pola, używając informacji, które zostały już podane. Możesz również ręcznie podpisać lub usunąć każde automatycznie podpisane pole później, jeśli chcesz."
#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:36
msgid "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."
msgstr "Kiedy korzystasz z naszej platformy, aby przyczepić swój podpis elektroniczny do dokumentów, wyrażasz zgodę na dokonanie tego zgodnie z Ustawą o podpisach elektronicznych w handlu globalnym i krajowym (Ustawa E-Sign) oraz innymi obowiązującymi przepisami. Ta czynność wskazuje na twoją zgodę na korzystanie z elektronicznych środków do podpisywania dokumentów i otrzymywania powiadomień."
@ -4784,7 +4807,7 @@ msgstr "Zaraz usuniesz następującego użytkownika z <0>{teamName}</0>."
msgid "You are about to revoke access for team <0>{0}</0> ({1}) to use your email."
msgstr "Zaraz cofniesz dostęp dla zespołu <0>{0}</0> ({1}) do korzystania z twojego e-maila."
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:78
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:80
msgid "You are currently on the <0>Free Plan</0>."
msgstr "Obecnie jesteś na <0>Planie darmowym</0>."
@ -4836,7 +4859,7 @@ msgstr "Nie możesz modyfikować członka zespołu, który ma wyższą rolę ni
msgid "You cannot upload encrypted PDFs"
msgstr "Nie możesz przesyłać zaszyfrowanych plików PDF"
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:45
#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:46
msgid "You do not currently have a customer record, this should not happen. Please contact support for assistance."
msgstr "Obecnie nie masz rekordu klienta, nie powinno tak się dziać. Proszę skontaktuj się z pomocą techniczną."
@ -4982,7 +5005,7 @@ msgstr "Adres URL witryny Twojej marki"
msgid "Your branding preferences have been updated"
msgstr "Preferencje dotyczące marki zostały zaktualizowane"
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:119
#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:125
msgid "Your current plan is past due. Please update your payment information."
msgstr "Twój obecny plan jest przeterminowany. Zaktualizuj swoje informacje płatnicze."

View File

@ -34,6 +34,7 @@ export const ZDocumentAuditLogTypeSchema = z.enum([
'DOCUMENT_META_UPDATED', // When the document meta data is updated.
'DOCUMENT_OPENED', // When the document is opened by a recipient.
'DOCUMENT_RECIPIENT_REJECTED', // When a recipient rejects the document.
'DOCUMENT_RECIPIENT_EXPIRED', // When the recipient cannot access the document anymore.
'DOCUMENT_RECIPIENT_COMPLETED', // When a recipient completes all their required tasks for the document.
'DOCUMENT_SENT', // When the document transitions from DRAFT to PENDING.
'DOCUMENT_TITLE_UPDATED', // When the document title is updated.
@ -65,6 +66,7 @@ export const ZRecipientDiffTypeSchema = z.enum([
'EMAIL',
'ACCESS_AUTH',
'ACTION_AUTH',
'EXPIRY',
]);
export const DOCUMENT_AUDIT_LOG_TYPE = ZDocumentAuditLogTypeSchema.Enum;
@ -146,12 +148,17 @@ export const ZRecipientDiffEmailSchema = ZGenericFromToSchema.extend({
type: z.literal(RECIPIENT_DIFF_TYPE.EMAIL),
});
export const ZRecipientDiffExpirySchema = ZGenericFromToSchema.extend({
type: z.literal(RECIPIENT_DIFF_TYPE.EXPIRY),
});
export const ZDocumentAuditLogRecipientDiffSchema = z.discriminatedUnion('type', [
ZRecipientDiffActionAuthSchema,
ZRecipientDiffAccessAuthSchema,
ZRecipientDiffNameSchema,
ZRecipientDiffRoleSchema,
ZRecipientDiffEmailSchema,
ZRecipientDiffExpirySchema,
]);
const ZBaseFieldEventDataSchema = z.object({
@ -365,7 +372,7 @@ export const ZDocumentAuditLogEventDocumentRecipientCompleteSchema = z.object({
});
/**
* Event: Document recipient completed the document (the recipient has fully actioned and completed their required steps for the document).
* Event: Document recipient rejected the document
*/
export const ZDocumentAuditLogEventDocumentRecipientRejectedSchema = z.object({
type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_RECIPIENT_REJECTED),
@ -374,6 +381,14 @@ export const ZDocumentAuditLogEventDocumentRecipientRejectedSchema = z.object({
}),
});
/**
* Event: Recipient expired
*/
export const ZDocumentAuditLogEventDocumentRecipientExpiredSchema = z.object({
type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_RECIPIENT_EXPIRED),
data: ZBaseRecipientDataSchema,
});
/**
* Event: Document sent.
*/
@ -499,6 +514,7 @@ export const ZDocumentAuditLogSchema = ZDocumentAuditLogBaseSchema.and(
ZDocumentAuditLogEventDocumentOpenedSchema,
ZDocumentAuditLogEventDocumentRecipientCompleteSchema,
ZDocumentAuditLogEventDocumentRecipientRejectedSchema,
ZDocumentAuditLogEventDocumentRecipientExpiredSchema,
ZDocumentAuditLogEventDocumentSentSchema,
ZDocumentAuditLogEventDocumentTitleUpdatedSchema,
ZDocumentAuditLogEventDocumentExternalIdUpdatedSchema,

View File

@ -1,5 +1,6 @@
import type { I18n } from '@lingui/core';
import { type I18n, i18n } from '@lingui/core';
import { msg } from '@lingui/macro';
import { DateTime } from 'luxon';
import { match } from 'ts-pattern';
import type { DocumentAuditLog, DocumentMeta, Field, Recipient } from '@documenso/prisma/client';
@ -73,7 +74,7 @@ export const parseDocumentAuditLogData = (auditLog: DocumentAuditLog): TDocument
return data.data;
};
type PartialRecipient = Pick<Recipient, 'email' | 'name' | 'role' | 'authOptions'>;
type PartialRecipient = Pick<Recipient, 'email' | 'name' | 'role' | 'authOptions' | 'expired'>;
export const diffRecipientChanges = (
oldRecipient: PartialRecipient,
@ -131,6 +132,18 @@ export const diffRecipientChanges = (
});
}
if (oldRecipient.expired !== newRecipient.expired) {
diffs.push({
type: RECIPIENT_DIFF_TYPE.EXPIRY,
from: DateTime.fromJSDate(oldRecipient.expired!)
.setLocale(i18n.locales?.[0] || i18n.locale)
.toLocaleString(DateTime.DATETIME_FULL),
to: DateTime.fromJSDate(newRecipient.expired!)
.setLocale(i18n.locales?.[0] || i18n.locale)
.toLocaleString(DateTime.DATETIME_FULL),
});
}
return diffs;
};
@ -349,7 +362,7 @@ export const formatDocumentAuditLogAction = (
identified: result,
};
})
.with({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_RECIPIENT_REJECTED }, ({ data }) => {
.with({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_RECIPIENT_REJECTED }, () => {
const userName = prefix || _(msg`Recipient`);
const result = msg`${userName} rejected the document`;
@ -359,6 +372,16 @@ export const formatDocumentAuditLogAction = (
identified: result,
};
})
.with({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_RECIPIENT_EXPIRED }, () => {
const userName = prefix || _(msg`Recipient`);
const result = msg`${userName}'s signing period has expired`;
return {
anonymous: result,
identified: result,
};
})
.with({ type: DOCUMENT_AUDIT_LOG_TYPE.EMAIL_SENT }, ({ data }) => ({
anonymous: data.isResending ? msg`Email resent` : msg`Email sent`,
identified: data.isResending

View File

@ -0,0 +1,2 @@
-- AlterEnum
ALTER TYPE "SigningStatus" ADD VALUE 'EXPIRED';

View File

@ -394,6 +394,7 @@ enum SigningStatus {
NOT_SIGNED
SIGNED
REJECTED
EXPIRED
}
enum RecipientRole {

View File

@ -139,5 +139,9 @@ module.exports = {
},
},
},
plugins: [require('tailwindcss-animate'), require('@tailwindcss/typography')],
plugins: [
require('tailwindcss-animate'),
require('@tailwindcss/typography'),
require('@tailwindcss/container-queries'),
],
};

View File

@ -7,15 +7,15 @@
"clean": "rimraf node_modules"
},
"dependencies": {
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/typography": "^0.5.9",
"autoprefixer": "^10.4.13",
"postcss": "^8.4.32",
"tailwindcss": "3.3.2",
"tailwindcss-animate": "^1.0.5"
},
"devDependencies": {
"@tailwindcss/typography": "^0.5.9"
},
"devDependencies": {},
"publishConfig": {
"access": "public"
}
}
}

View File

@ -2,6 +2,7 @@ import { TRPCError } from '@trpc/server';
import { completeDocumentWithToken } from '@documenso/lib/server-only/document/complete-document-with-token';
import { rejectDocumentWithToken } from '@documenso/lib/server-only/document/reject-document-with-token';
import { setRecipientExpiry } from '@documenso/lib/server-only/recipient/set-recipient-expiry';
import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document';
import { setRecipientsForTemplate } from '@documenso/lib/server-only/recipient/set-recipients-for-template';
import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
@ -12,6 +13,7 @@ import {
ZAddTemplateSignersMutationSchema,
ZCompleteDocumentWithTokenMutationSchema,
ZRejectDocumentWithTokenMutationSchema,
ZSetSignerExpirySchema,
} from './schema';
export const recipientRouter = router({
@ -45,6 +47,30 @@ export const recipientRouter = router({
}
}),
setSignerExpiry: authenticatedProcedure
.input(ZSetSignerExpirySchema)
.mutation(async ({ input, ctx }) => {
try {
const { documentId, signerId, expiry, teamId } = input;
return await setRecipientExpiry({
documentId,
recipientId: signerId,
expiry,
teamId,
userId: ctx.user.id,
requestMetadata: extractNextApiRequestMetadata(ctx.req),
});
} catch (error) {
console.log(error);
throw new TRPCError({
code: 'BAD_REQUEST',
message: "We're unable to set the expiry for this signer. Please try again later.",
});
}
}),
addTemplateSigners: authenticatedProcedure
.input(ZAddTemplateSignersMutationSchema)
.mutation(async ({ input, ctx }) => {

View File

@ -80,3 +80,12 @@ export const ZRejectDocumentWithTokenMutationSchema = z.object({
export type TRejectDocumentWithTokenMutationSchema = z.infer<
typeof ZRejectDocumentWithTokenMutationSchema
>;
export const ZSetSignerExpirySchema = z.object({
documentId: z.number(),
signerId: z.number(),
expiry: z.date().min(new Date(), { message: 'Expiry date must be in the future' }),
teamId: z.number().optional(),
});
export type TSetSignerExpirySchema = z.infer<typeof ZSetSignerExpirySchema>;

View File

@ -0,0 +1,16 @@
import { differenceInDays, differenceInMonths, differenceInWeeks } from 'date-fns';
export const calculatePeriod = (expiryDate: Date) => {
const now = new Date();
const daysDiff = differenceInDays(expiryDate, now);
const weeksDiff = differenceInWeeks(expiryDate, now);
const monthsDiff = differenceInMonths(expiryDate, now);
if (monthsDiff > 0) {
return { amount: monthsDiff, unit: 'months' as const };
} else if (weeksDiff > 0) {
return { amount: weeksDiff, unit: 'weeks' as const };
} else {
return { amount: daysDiff, unit: 'days' as const };
}
};

View File

@ -0,0 +1,157 @@
'use client';
import { useLayoutEffect, useRef } from 'react';
import { cn } from '../lib/utils';
export type Dimensions = {
height: number;
width: number;
};
export type AutoSizedTextProps = {
children: React.ReactNode;
className?: string;
maxHeight?: number;
useRem?: boolean;
};
const ITERATION_LIMIT = 20;
const MAXIMUM_DIFFERENCE = 1; // px
function getElementDimensions(element: HTMLElement): Dimensions {
const bbox = element.getBoundingClientRect();
return {
width: bbox.width,
height: bbox.height,
};
}
function getBaseFontSize(): number {
try {
const fontSize = getComputedStyle(document.documentElement).fontSize;
const parsed = parseFloat(fontSize);
// Check if we got a valid number
if (!Number.isFinite(parsed)) {
return 16;
}
return parsed;
} catch (error) {
// Fallback to browser default if anything goes wrong
return 16;
}
}
function pxToRem(px: number): number {
return px / getBaseFontSize();
}
export function AutoSizedText({
children,
className,
maxHeight,
useRem = false,
}: AutoSizedTextProps) {
const childRef = useRef<HTMLDivElement>(null);
const fontSize = useRef<number>(0);
const fontSizeLowerBound = useRef<number>(0);
const fontSizeUpperBound = useRef<number>(0);
const adjustFontSize = (childDimensions: Dimensions, parentDimensions: Dimensions) => {
const childElement = childRef.current;
if (!childElement) {
return;
}
let newFontSize: number;
const targetHeight =
maxHeight && maxHeight < parentDimensions.height ? maxHeight : parentDimensions.height;
const isElementTooBig =
childDimensions.width > parentDimensions.width || childDimensions.height > targetHeight;
if (isElementTooBig) {
// Scale down if element is bigger than target
newFontSize = (fontSizeLowerBound.current + fontSize.current) / 2;
fontSizeUpperBound.current = fontSize.current;
} else if (
childDimensions.width < parentDimensions.width ||
childDimensions.height < parentDimensions.height
) {
// Scale up if element is smaller than target
newFontSize = (fontSizeUpperBound.current + fontSize.current) / 2;
fontSizeLowerBound.current = fontSize.current;
}
fontSize.current = newFontSize;
// Convert to rem if useRem is true
const displayFontSize = useRem ? `${pxToRem(newFontSize)}rem` : `${newFontSize}px`;
childElement.style.fontSize = displayFontSize;
};
useLayoutEffect(() => {
const childElement = childRef.current;
const parentElement = childRef.current?.parentElement;
if (!childElement || !parentElement) {
return;
}
const observer = new ResizeObserver((entries) => {
const entry = entries[0];
if (!entry) {
return;
}
const parentDimensions = entry.contentRect;
// Reset iteration parameters
fontSizeLowerBound.current = 0;
fontSizeUpperBound.current = parentDimensions.height;
let iterationCount = 0;
while (iterationCount <= ITERATION_LIMIT) {
const childDimensions = getElementDimensions(childElement);
const targetHeight =
maxHeight && maxHeight < parentDimensions.height ? maxHeight : parentDimensions.height;
const widthDifference = parentDimensions.width - childDimensions.width;
const heightDifference = targetHeight - childDimensions.height;
const childFitsIntoParent = heightDifference >= 0 && widthDifference >= 0;
const isWithinTolerance =
Math.abs(widthDifference) <= MAXIMUM_DIFFERENCE ||
Math.abs(heightDifference) <= MAXIMUM_DIFFERENCE;
if (childFitsIntoParent && isWithinTolerance) {
break;
}
adjustFontSize(childDimensions, parentDimensions);
iterationCount += 1;
}
});
observer.observe(parentElement);
return () => {
observer.disconnect();
};
}, [maxHeight, useRem]);
return (
<div ref={childRef} className={cn('inline-block leading-none', className)}>
{children}
</div>
);
}

View File

@ -29,17 +29,25 @@ function Calendar({ className, classNames, showOutsideDays = true, ...props }: C
nav_button_next: 'absolute right-1',
table: 'w-full border-collapse space-y-1',
head_row: 'flex',
head_cell: 'text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]',
head_cell: 'text-muted-foreground rounded-md w-8 font-normal text-[0.8rem]',
row: 'flex w-full mt-2',
cell: 'text-center text-sm p-0 relative [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20',
cell: cn(
'relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected].day-range-end)]:rounded-r-md',
props.mode === 'range'
? '[&:has(>.day-range-end)]:rounded-r-md [&:has(>.day-range-start)]:rounded-l-md first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md'
: '[&:has([aria-selected])]:rounded-md',
),
day: cn(
buttonVariants({ variant: 'ghost' }),
'h-9 w-9 p-0 font-normal aria-selected:opacity-100',
'h-8 w-8 p-0 font-normal aria-selected:opacity-100',
),
day_range_start: 'day-range-start',
day_range_end: 'day-range-end',
day_selected:
'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground',
day_today: 'bg-accent text-accent-foreground',
day_outside: 'text-muted-foreground opacity-50',
day_outside:
'day-outside text-muted-foreground aria-selected:bg-accent/50 aria-selected:text-muted-foreground',
day_disabled: 'text-muted-foreground opacity-50',
day_range_middle: 'aria-selected:bg-accent aria-selected:text-accent-foreground',
day_hidden: 'invisible',

View File

@ -113,7 +113,7 @@ const DialogTitle = React.forwardRef<
>(({ className, ...props }, ref) => (
<DialogPrimitive.Title
ref={ref}
className={cn('truncate text-lg font-semibold leading-none tracking-tight', className)}
className={cn('truncate text-lg font-semibold tracking-tight', className)}
{...props}
/>
));
@ -135,13 +135,13 @@ DialogDescription.displayName = DialogPrimitive.Description.displayName;
export {
Dialog,
DialogTrigger,
DialogContent,
DialogHeader,
DialogFooter,
DialogOverlay,
DialogTitle,
DialogDescription,
DialogPortal,
DialogClose,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogOverlay,
DialogPortal,
DialogTitle,
DialogTrigger,
};

View File

@ -76,8 +76,11 @@ const fontCaveat = Caveat({
variable: '--font-caveat',
});
const MIN_HEIGHT_PX = 20;
const MIN_WIDTH_PX = 80;
const MIN_HEIGHT_PX = 12;
const MIN_WIDTH_PX = 36;
const DEFAULT_HEIGHT_PX = MIN_HEIGHT_PX * 2.5;
const DEFAULT_WIDTH_PX = MIN_WIDTH_PX * 2.5;
export type FieldFormType = {
nativeId?: number;
@ -480,8 +483,8 @@ export const AddFieldsFormPartial = ({
}
fieldBounds.current = {
height: Math.max(MIN_HEIGHT_PX),
width: Math.max(MIN_WIDTH_PX),
height: Math.max(DEFAULT_HEIGHT_PX),
width: Math.max(DEFAULT_WIDTH_PX),
};
});
@ -594,7 +597,7 @@ export const AddFieldsFormPartial = ({
{selectedField && (
<div
className={cn(
'text-muted-foreground dark:text-muted-background pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center bg-white transition duration-200',
'text-muted-foreground dark:text-muted-background pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center bg-white transition duration-200 [container-type:size]',
selectedSignerStyles.default.base,
{
'-rotate-6 scale-90 opacity-50 dark:bg-black/20': !isFieldWithinBounds,
@ -609,7 +612,9 @@ export const AddFieldsFormPartial = ({
width: fieldBounds.current.width,
}}
>
{parseMessageDescriptor(_, FRIENDLY_FIELD_TYPE[selectedField])}
<span className="text-[clamp(0.425rem,25cqw,0.825rem)]">
{parseMessageDescriptor(_, FRIENDLY_FIELD_TYPE[selectedField])}
</span>
</div>
)}
@ -630,8 +635,10 @@ export const AddFieldsFormPartial = ({
selectedSigner?.email !== field.signerEmail ||
!canRecipientBeModified(selectedSigner, fields)
}
minHeight={fieldBounds.current.height}
minWidth={fieldBounds.current.width}
minHeight={MIN_HEIGHT_PX}
minWidth={MIN_WIDTH_PX}
defaultHeight={DEFAULT_HEIGHT_PX}
defaultWidth={DEFAULT_WIDTH_PX}
passive={isFieldWithinBounds && !!selectedField}
onFocus={() => setLastActiveField(field)}
onBlur={() => setLastActiveField(null)}

View File

@ -8,7 +8,7 @@ import { zodResolver } from '@hookform/resolvers/zod';
import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { motion } from 'framer-motion';
import { GripVerticalIcon, Plus, Trash } from 'lucide-react';
import { GripVerticalIcon, Plus } from 'lucide-react';
import { useSession } from 'next-auth/react';
import { useFieldArray, useForm } from 'react-hook-form';
import { prop, sortBy } from 'remeda';
@ -41,6 +41,7 @@ import {
DocumentFlowFormContainerStep,
} from './document-flow-root';
import { ShowFieldItem } from './show-field-item';
import { SignerActionDropdown } from './signer-action-dropdown';
import type { DocumentFlowStep } from './types';
export type AddSignersFormProps = {
@ -51,6 +52,7 @@ export type AddSignersFormProps = {
isDocumentEnterprise: boolean;
onSubmit: (_data: TAddSignersFormSchema) => void;
isDocumentPdfLoaded: boolean;
documentId: number;
};
export const AddSignersFormPartial = ({
@ -61,6 +63,7 @@ export const AddSignersFormPartial = ({
isDocumentEnterprise,
onSubmit,
isDocumentPdfLoaded,
documentId,
}: AddSignersFormProps) => {
const { _ } = useLingui();
const { toast } = useToast();
@ -81,6 +84,7 @@ export const AddSignersFormPartial = ({
email: '',
role: RecipientRole.SIGNER,
signingOrder: 1,
expiry: undefined,
actionAuth: undefined,
},
];
@ -97,6 +101,7 @@ export const AddSignersFormPartial = ({
name: recipient.name,
email: recipient.email,
role: recipient.role,
expiry: recipient.expired ?? undefined,
signingOrder: recipient.signingOrder ?? index + 1,
actionAuth:
ZRecipientAuthOptionsSchema.parse(recipient.authOptions)?.actionAuth ?? undefined,
@ -181,6 +186,7 @@ export const AddSignersFormPartial = ({
email: '',
role: RecipientRole.SIGNER,
actionAuth: undefined,
expiry: undefined,
signingOrder: signers.length > 0 ? (signers[signers.length - 1]?.signingOrder ?? 0) + 1 : 1,
});
};
@ -215,6 +221,7 @@ export const AddSignersFormPartial = ({
email: user?.email ?? '',
role: RecipientRole.SIGNER,
actionAuth: undefined,
expiry: undefined,
signingOrder: signers.length > 0 ? (signers[signers.length - 1]?.signingOrder ?? 0) + 1 : 1,
});
}
@ -252,6 +259,7 @@ export const AddSignersFormPartial = ({
'email',
'name',
'role',
'expiry',
'signingOrder',
'actionAuth',
];
@ -628,24 +636,20 @@ export const AddSignersFormPartial = ({
)}
/>
<button
type="button"
className={cn(
'mt-auto inline-flex h-10 w-10 items-center justify-center hover:opacity-80 disabled:cursor-not-allowed disabled:opacity-50',
{
'mb-6': form.formState.errors.signers?.[index],
},
)}
disabled={
<SignerActionDropdown
className={cn({
'mb-6': form.formState.errors.signers?.[index],
})}
onDelete={() => onRemoveSigner(index)}
signer={signer}
documentId={documentId}
deleteDisabled={
snapshot.isDragging ||
isSubmitting ||
!canRecipientBeModified(signer.nativeId) ||
signers.length === 1
}
onClick={() => onRemoveSigner(index)}
>
<Trash className="h-4 w-4" />
</button>
/>
</div>
</motion.fieldset>
</div>

View File

@ -6,24 +6,23 @@ import { ZRecipientActionAuthTypesSchema } from '@documenso/lib/types/document-a
import { ZMapNegativeOneToUndefinedSchema } from './add-settings.types';
import { DocumentSigningOrder, RecipientRole } from '.prisma/client';
export const ZAddSignerSchema = z.object({
formId: z.string().min(1),
nativeId: z.number().optional(),
email: z
.string()
.email({ message: msg`Invalid email`.id })
.min(1),
name: z.string(),
role: z.nativeEnum(RecipientRole),
expiry: z.date().min(new Date(), { message: 'Expiry date must be in the future' }).optional(),
signingOrder: z.number().optional(),
actionAuth: ZMapNegativeOneToUndefinedSchema.pipe(ZRecipientActionAuthTypesSchema.optional()),
});
export const ZAddSignersFormSchema = z
.object({
signers: z.array(
z.object({
formId: z.string().min(1),
nativeId: z.number().optional(),
email: z
.string()
.email({ message: msg`Invalid email`.id })
.min(1),
name: z.string(),
role: z.nativeEnum(RecipientRole),
signingOrder: z.number().optional(),
actionAuth: ZMapNegativeOneToUndefinedSchema.pipe(
ZRecipientActionAuthTypesSchema.optional(),
),
}),
),
signers: z.array(ZAddSignerSchema),
signingOrder: z.nativeEnum(DocumentSigningOrder),
})
.refine(
@ -37,3 +36,4 @@ export const ZAddSignersFormSchema = z
);
export type TAddSignersFormSchema = z.infer<typeof ZAddSignersFormSchema>;
export type TAddSignerSchema = z.infer<typeof ZAddSignerSchema>;

View File

@ -0,0 +1,335 @@
'use client';
import { useState } from 'react';
import { useRouter } from 'next/navigation';
import { zodResolver } from '@hookform/resolvers/zod';
import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { addDays, addMonths, addWeeks, format } from 'date-fns';
import { Calendar as CalendarIcon } from 'lucide-react';
import { useForm } from 'react-hook-form';
import * as z from 'zod';
import { trpc } from '@documenso/trpc/react';
import { Button } from '@documenso/ui/primitives/button';
import { Calendar } from '@documenso/ui/primitives/calendar';
import {
Dialog,
DialogClose,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from '@documenso/ui/primitives/dialog';
import {
Form,
FormControl,
FormDescription,
FormField,
FormItem,
FormLabel,
FormMessage,
} from '@documenso/ui/primitives/form/form';
import { Popover, PopoverContent, PopoverTrigger } from '@documenso/ui/primitives/popover';
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@documenso/ui/primitives/select';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@documenso/ui/primitives/tabs';
import { calculatePeriod } from '../../lib/calculate-period';
import { cn } from '../../lib/utils';
import { useToast } from '../use-toast';
import type { TAddSignerSchema as Signer } from './add-signers.types';
const dateFormSchema = z.object({
expiry: z.date({
required_error: 'Please select an expiry date.',
}),
});
const periodFormSchema = z.object({
amount: z.number().min(1, 'Please enter a number greater than 0.'),
unit: z.enum(['days', 'weeks', 'months']),
});
type DocumentExpiryDialogProps = {
open: boolean;
onOpenChange: (_open: boolean) => void;
signer: Signer;
documentId: number;
};
export function DocumentExpiryDialog({
open,
onOpenChange,
signer,
documentId,
}: DocumentExpiryDialogProps) {
const { _ } = useLingui();
const router = useRouter();
const { toast } = useToast();
const [activeTab, setActiveTab] = useState<'date' | 'period'>('date');
const dateForm = useForm<z.infer<typeof dateFormSchema>>({
resolver: zodResolver(dateFormSchema),
defaultValues: {
expiry: signer.expiry,
},
});
const periodForm = useForm<z.infer<typeof periodFormSchema>>({
resolver: zodResolver(periodFormSchema),
defaultValues: signer.expiry
? calculatePeriod(signer.expiry)
: {
amount: undefined,
unit: undefined,
},
});
const watchAmount = periodForm.watch('amount');
const watchUnit = periodForm.watch('unit');
const { mutateAsync: setSignerExpiry, isLoading } = trpc.recipient.setSignerExpiry.useMutation({
onSuccess: (updatedRecipient) => {
router.refresh();
periodForm.reset(
updatedRecipient?.expired
? calculatePeriod(updatedRecipient.expired)
: {
amount: undefined,
unit: undefined,
},
);
dateForm.reset(
{
expiry: updatedRecipient?.expired ?? undefined,
},
{
keepValues: false,
},
);
toast({
title: _(msg`Signer Expiry Set`),
description: _(msg`The expiry date for the signer has been set.`),
duration: 5000,
});
onOpenChange(false);
},
onError: (error) => {
toast({
title: _(msg`Error`),
description: error.message || _(msg`An error occurred while setting the expiry date.`),
variant: 'destructive',
duration: 7500,
});
},
});
const onSetExpiry = async (
values: z.infer<typeof dateFormSchema> | z.infer<typeof periodFormSchema>,
) => {
if (!signer.nativeId) {
return toast({
title: _(msg`Error`),
description: _(msg`An error occurred while setting the expiry date.`),
variant: 'destructive',
duration: 7500,
});
}
let expiryDate: Date;
if ('expiry' in values) {
expiryDate = values.expiry;
} else {
const now = new Date();
switch (values.unit) {
case 'days':
expiryDate = addDays(now, values.amount);
break;
case 'weeks':
expiryDate = addWeeks(now, values.amount);
break;
case 'months':
expiryDate = addMonths(now, values.amount);
break;
default:
throw new Error(`Invalid unit: ${values.unit}`);
}
}
await setSignerExpiry({
documentId,
signerId: signer.nativeId,
expiry: expiryDate,
});
// TODO: Duncan => Implement logic to update expiry when resending document
// This should be handled on the server-side when a document is resent
// TODO: Duncan => Implement logic to mark recipients as expired
// This should be a scheduled task or part of the completion process on the server
};
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="sm:max-w-[450px]">
<DialogHeader>
<DialogTitle>Set Recipient Expiry</DialogTitle>
<DialogDescription>
Set the expiry date for the document signing recipient. The recipient will not be able
to sign the document after this date.
</DialogDescription>
</DialogHeader>
<Tabs
value={activeTab}
onValueChange={(value) => {
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
return setActiveTab(value as 'date' | 'period');
}}
>
<TabsList className="grid w-full grid-cols-2">
<TabsTrigger value="date">Specific Date</TabsTrigger>
<TabsTrigger value="period">Time Period</TabsTrigger>
</TabsList>
<TabsContent value="date">
<Form {...dateForm}>
<form onSubmit={dateForm.handleSubmit(onSetExpiry)} className="space-y-8">
<FormField
control={dateForm.control}
name="expiry"
render={({ field }) => (
<FormItem className="flex flex-col">
<FormLabel>Expiry Date</FormLabel>
<Popover>
<PopoverTrigger asChild>
<FormControl>
<Button
variant={'outline'}
className={cn(
'w-[240px] pl-3 text-left font-normal',
!field.value && 'text-muted-foreground',
)}
>
{field.value ? format(field.value, 'PPP') : <span>Pick a date</span>}
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
</Button>
</FormControl>
</PopoverTrigger>
<PopoverContent className="z-[1100] w-auto p-0" align="start">
<Calendar
mode="single"
selected={field.value}
onSelect={field.onChange}
disabled={(date) => date < new Date() || date < new Date('1900-01-01')}
initialFocus
/>
</PopoverContent>
</Popover>
<FormDescription>
The document will expire at 11:59 PM on the selected date.
</FormDescription>
<FormMessage />
</FormItem>
)}
/>
<DialogFooter>
<DialogClose asChild>
<Button type="button" variant="secondary">
<Trans>Cancel</Trans>
</Button>
</DialogClose>
<Button type="submit" loading={isLoading}>
<Trans>Save Changes</Trans>
</Button>
</DialogFooter>
</form>
</Form>
</TabsContent>
<TabsContent value="period">
<Form {...periodForm}>
<form onSubmit={periodForm.handleSubmit(onSetExpiry)} className="space-y-8">
<div className="flex space-x-4">
<FormField
control={periodForm.control}
name="amount"
render={({ field }) => (
<FormItem className="flex-1">
<FormLabel>Amount</FormLabel>
<FormControl>
<Select
onValueChange={(value) => field.onChange(parseInt(value, 10))}
value={watchAmount?.toString()}
>
<SelectTrigger>
<SelectValue placeholder="Select amount" />
</SelectTrigger>
<SelectContent>
{[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((num) => (
<SelectItem key={num} value={num.toString()}>
{num}
</SelectItem>
))}
</SelectContent>
</Select>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={periodForm.control}
name="unit"
render={({ field }) => (
<FormItem className="flex-1">
<FormLabel>Unit</FormLabel>
<FormControl>
<Select onValueChange={field.onChange} value={watchUnit}>
{' '}
<SelectTrigger>
<SelectValue placeholder="Select unit" />
</SelectTrigger>
<SelectContent>
<SelectItem value="days">Days</SelectItem>
<SelectItem value="weeks">Weeks</SelectItem>
<SelectItem value="months">Months</SelectItem>
</SelectContent>
</Select>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</div>
<FormDescription>
The document will expire after the selected time period from now.
</FormDescription>
<DialogFooter>
<DialogClose asChild>
<Button type="button" variant="secondary">
<Trans>Cancel</Trans>
</Button>
</DialogClose>
<Button type="submit" loading={isLoading}>
<Trans>Save Changes</Trans>
</Button>
</DialogFooter>
</form>
</Form>
</TabsContent>
</Tabs>
</DialogContent>
</Dialog>
);
}

View File

@ -45,7 +45,7 @@ export const FieldIcon = ({
return (
<div
className={cn(
'text-field-card-foreground flex items-center justify-center gap-x-1 text-[clamp(0.875rem,1.8cqw,1.2rem)]',
'text-field-card-foreground flex items-center justify-center gap-x-1 text-[clamp(0.575rem,25cqw,1.2rem)]',
fontCaveatClassName,
)}
>
@ -71,8 +71,9 @@ export const FieldIcon = ({
}
return (
<div className="text-field-card-foreground flex items-center justify-center gap-x-1.5 text-[clamp(0.625rem,1cqw,0.825rem)]">
<Icon className="h-4 w-4" /> {label}
<div className="text-field-card-foreground flex items-center justify-center gap-x-1.5 text-[clamp(0.425rem,25cqw,0.825rem)]">
<Icon className="h-[clamp(0.625rem,20cqw,0.925rem)] w-[clamp(0.625rem,20cqw,0.925rem)]" />{' '}
{label}
</div>
);
}

View File

@ -35,6 +35,8 @@ export type FieldItemProps = {
disabled?: boolean;
minHeight?: number;
minWidth?: number;
defaultHeight?: number;
defaultWidth?: number;
onResize?: (_node: HTMLElement) => void;
onMove?: (_node: HTMLElement) => void;
onRemove?: () => void;
@ -53,6 +55,8 @@ export const FieldItem = ({
disabled,
minHeight,
minWidth,
defaultHeight,
defaultWidth,
onResize,
onMove,
onRemove,
@ -68,8 +72,8 @@ export const FieldItem = ({
const [coords, setCoords] = useState({
pageX: 0,
pageY: 0,
pageHeight: 0,
pageWidth: 0,
pageHeight: defaultHeight || 0,
pageWidth: defaultWidth || 0,
});
const [settingsActive, setSettingsActive] = useState(false);
const $el = useRef(null);

View File

@ -36,7 +36,7 @@ export const ShowFieldItem = ({ field, recipients }: ShowFieldItemProps) => {
return createPortal(
<div
className={cn('pointer-events-none absolute z-10 opacity-75')}
className={cn('pointer-events-none absolute opacity-75')}
style={{
top: `${coords.y}px`,
left: `${coords.x}px`,
@ -44,18 +44,18 @@ export const ShowFieldItem = ({ field, recipients }: ShowFieldItemProps) => {
width: `${coords.width}px`,
}}
>
<Card className={cn('bg-background h-full w-full')}>
<Card className={cn('bg-background h-full w-full [container-type:size]')}>
<CardContent
className={cn(
'text-muted-foreground/50 flex h-full w-full flex-col items-center justify-center p-2 text-xl',
'text-muted-foreground/50 flex h-full w-full flex-col items-center justify-center p-0 text-[clamp(0.575rem,1.8cqw,1.2rem)] leading-none',
field.type === FieldType.SIGNATURE && fontCaveat.className,
)}
>
{parseMessageDescriptor(_, FRIENDLY_FIELD_TYPE[field.type])}
<p className="text-muted-foreground/50 w-full truncate text-center text-xs">
{/* <p className="text-muted-foreground/50 w-full truncate text-center text-xs">
{signerEmail}
</p>
</p> */}
</CardContent>
</Card>
</div>,

View File

@ -0,0 +1,66 @@
'use client';
import { useState } from 'react';
import { MoreHorizontal, Timer, Trash } from 'lucide-react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuTrigger,
} from '@documenso/ui/primitives/dropdown-menu';
import { cn } from '../../lib/utils';
import type { TAddSignerSchema as Signer } from './add-signers.types';
import { DocumentExpiryDialog } from './document-expiry-dialog';
type SignerActionDropdownProps = {
onDelete: () => void;
deleteDisabled?: boolean;
className?: string;
signer: Signer;
documentId: number;
};
export function SignerActionDropdown({
deleteDisabled,
className,
signer,
documentId,
onDelete,
}: SignerActionDropdownProps) {
const [isExpiryDialogOpen, setExpiryDialogOpen] = useState(false);
return (
<>
<div className={cn('flex items-center justify-center', className)}>
<DropdownMenu>
<DropdownMenuTrigger>
<MoreHorizontal className="text-muted-foreground h-5 w-5" />
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuItem className="gap-x-2" onClick={() => setExpiryDialogOpen(true)}>
<Timer className="h-4 w-4" />
Expiry
</DropdownMenuItem>
<DropdownMenuItem disabled={deleteDisabled} className="gap-x-2" onClick={onDelete}>
<Trash className="h-4 w-4" />
Delete
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</div>
<DocumentExpiryDialog
open={isExpiryDialogOpen}
onOpenChange={setExpiryDialogOpen}
signer={signer}
documentId={documentId}
/>
</>
);
}

View File

@ -45,7 +45,7 @@ export const ZDocumentFlowFormSchema = z.object({
export type TDocumentFlowFormSchema = z.infer<typeof ZDocumentFlowFormSchema>;
export const FRIENDLY_FIELD_TYPE: Record<FieldType, MessageDescriptor | string> = {
export const FRIENDLY_FIELD_TYPE: Record<FieldType, MessageDescriptor> = {
[FieldType.SIGNATURE]: msg`Signature`,
[FieldType.FREE_SIGNATURE]: msg`Free Signature`,
[FieldType.INITIALS]: msg`Initials`,
@ -54,9 +54,9 @@ export const FRIENDLY_FIELD_TYPE: Record<FieldType, MessageDescriptor | string>
[FieldType.EMAIL]: msg`Email`,
[FieldType.NAME]: msg`Name`,
[FieldType.NUMBER]: msg`Number`,
[FieldType.RADIO]: `Radio`,
[FieldType.CHECKBOX]: `Checkbox`,
[FieldType.DROPDOWN]: `Select`,
[FieldType.RADIO]: msg`Radio`,
[FieldType.CHECKBOX]: msg`Checkbox`,
[FieldType.DROPDOWN]: msg`Select`,
};
export interface DocumentFlowStep {

View File

@ -92,4 +92,4 @@ const PopoverHover = ({ trigger, children, contentProps }: PopoverHoverProps) =>
);
};
export { Popover, PopoverTrigger, PopoverContent, PopoverHover };
export { Popover, PopoverContent, PopoverHover, PopoverTrigger };

View File

@ -67,8 +67,11 @@ const fontCaveat = Caveat({
variable: '--font-caveat',
});
const MIN_HEIGHT_PX = 20;
const MIN_WIDTH_PX = 80;
const MIN_HEIGHT_PX = 12;
const MIN_WIDTH_PX = 36;
const DEFAULT_HEIGHT_PX = MIN_HEIGHT_PX * 2.5;
const DEFAULT_WIDTH_PX = MIN_WIDTH_PX * 2.5;
export type AddTemplateFieldsFormProps = {
documentFlow: DocumentFlowStep;
@ -354,8 +357,8 @@ export const AddTemplateFieldsFormPartial = ({
}
fieldBounds.current = {
height: Math.max(MIN_HEIGHT_PX),
width: Math.max(MIN_WIDTH_PX),
height: Math.max(DEFAULT_HEIGHT_PX),
width: Math.max(DEFAULT_WIDTH_PX),
};
});
@ -425,7 +428,7 @@ export const AddTemplateFieldsFormPartial = ({
{selectedField && (
<div
className={cn(
'text-muted-foreground dark:text-muted-background pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center bg-white transition duration-200',
'text-muted-foreground dark:text-muted-background pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center bg-white transition duration-200 [container-type:size]',
selectedSignerStyles.default.base,
{
'-rotate-6 scale-90 opacity-50 dark:bg-black/20': !isFieldWithinBounds,
@ -439,7 +442,9 @@ export const AddTemplateFieldsFormPartial = ({
width: fieldBounds.current.width,
}}
>
{parseMessageDescriptor(_, FRIENDLY_FIELD_TYPE[selectedField])}
<span className="text-[clamp(0.425rem,25cqw,0.825rem)]">
{parseMessageDescriptor(_, FRIENDLY_FIELD_TYPE[selectedField])}
</span>
</div>
)}
@ -452,8 +457,10 @@ export const AddTemplateFieldsFormPartial = ({
recipientIndex={recipientIndex === -1 ? 0 : recipientIndex}
field={field}
disabled={selectedSigner?.email !== field.signerEmail}
minHeight={fieldBounds.current.height}
minWidth={fieldBounds.current.width}
minHeight={MIN_HEIGHT_PX}
minWidth={MIN_WIDTH_PX}
defaultHeight={DEFAULT_HEIGHT_PX}
defaultWidth={DEFAULT_WIDTH_PX}
passive={isFieldWithinBounds && !!selectedField}
onResize={(options) => onFieldResize(options, index)}
onMove={(options) => onFieldMove(options, index)}