Compare commits

..

26 Commits

Author SHA1 Message Date
ce53bcea8c v2.0.11 2025-11-13 10:56:58 +11:00
5a3d5b8b4a fix: persist missed meta values for envelopes (#2185) 2025-11-13 10:44:59 +11:00
3d1fe85d62 fix: add foreign key indexes (#2184)
Can't believe we missed some of these ☠️
2025-11-13 10:43:11 +11:00
1772c3ee36 v2.0.10 2025-11-12 18:57:24 +11:00
f55b902a01 fix: openapi path for envelope item download 2025-11-12 18:57:03 +11:00
50db4e39be v2.0.9 2025-11-12 18:22:46 +11:00
2802813c76 fix: add default values for envelope field meta (#2181)
🙏
2025-11-12 18:22:30 +11:00
29d40f1cca v2.0.8 2025-11-12 17:19:53 +11:00
d67f32eae2 chore: add translations (#2166)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-11-12 17:17:44 +11:00
a33233443b chore: extract translations (#2179) 2025-11-12 17:09:50 +11:00
68a3608aee fix: handle bracket notation arrays (#2178)
Co-authored-by: David Nguyen <davidngu28@gmail.com>
2025-11-12 16:38:06 +11:00
378dd605b9 v2.0.7 2025-11-12 13:09:18 +11:00
211ae6c9e9 fix: prefill arcoforms with formdata endpoints (#2169) 2025-11-12 12:41:10 +11:00
f931885a95 fix: remove redundant endpoint (#2170)
Remove duplicate redundant endpoint
2025-11-12 11:01:15 +11:00
4ade408001 fix: include cmaps for pdf viewer (#2177)
We were previously omitting cmaps meaning that
when signing documents with certain UTF-8 characters or CJK characters
they would appear as outlined squares in the pdf viewer despite the
actual pdf looking as expected with the characters displaying correctly.
2025-11-12 11:00:44 +11:00
3d0e3c6e8e fix: update dropzone to create envelopes (#2168) 2025-11-11 20:49:42 +11:00
936d8d90b3 fix: envelope auth not being passed (#2167) 2025-11-11 13:05:05 +11:00
c6b08d8594 feat: org insights (#1937) 2025-11-11 12:09:58 +11:00
575634e326 fix: add pluralization to document details (#2130) 2025-11-11 10:54:12 +11:00
c66eda4aae chore: add message context in user organisation table (#2138) 2025-11-11 10:44:20 +11:00
ef52b35f79 chore: change message in dropzone wrappers (#2137) 2025-11-11 10:43:22 +11:00
95a647034a chore: add message context in envelope download dialog (#2136) 2025-11-11 10:42:30 +11:00
34dba0b6ff chore: fix message formatting (#2135) 2025-11-11 10:41:54 +11:00
fccd97e124 fix: add pluralization to 2fa code template (#2131) 2025-11-11 10:39:05 +11:00
3dbbcefddf fix: add pluralization to passkey page (#2129) 2025-11-11 10:37:54 +11:00
2aea3c4de0 fix: rename envelope buttons (#2161) 2025-11-10 22:21:34 +11:00
112 changed files with 3511 additions and 1861 deletions

View File

@ -176,7 +176,7 @@ export const EnvelopeDownloadDialog = ({
{!isDownloadingState[generateDownloadKey(item.id, 'original')] && ( {!isDownloadingState[generateDownloadKey(item.id, 'original')] && (
<DownloadIcon className="mr-2 h-4 w-4" /> <DownloadIcon className="mr-2 h-4 w-4" />
)} )}
<Trans>Original</Trans> <Trans context="Original document (adjective)">Original</Trans>
</Button> </Button>
{envelopeStatus === DocumentStatus.COMPLETED && ( {envelopeStatus === DocumentStatus.COMPLETED && (
@ -190,7 +190,7 @@ export const EnvelopeDownloadDialog = ({
{!isDownloadingState[generateDownloadKey(item.id, 'signed')] && ( {!isDownloadingState[generateDownloadKey(item.id, 'signed')] && (
<DownloadIcon className="mr-2 h-4 w-4" /> <DownloadIcon className="mr-2 h-4 w-4" />
)} )}
<Trans>Signed</Trans> <Trans context="Signed document (adjective)">Signed</Trans>
</Button> </Button>
)} )}
</div> </div>

View File

@ -3,7 +3,7 @@ import { useEffect, useState } from 'react';
import { zodResolver } from '@hookform/resolvers/zod'; import { zodResolver } from '@hookform/resolvers/zod';
import { msg } from '@lingui/core/macro'; import { msg } from '@lingui/core/macro';
import { useLingui } from '@lingui/react'; import { useLingui } from '@lingui/react';
import { Trans } from '@lingui/react/macro'; import { Plural, Trans } from '@lingui/react/macro';
import type * as DialogPrimitive from '@radix-ui/react-dialog'; import type * as DialogPrimitive from '@radix-ui/react-dialog';
import { startRegistration } from '@simplewebauthn/browser'; import { startRegistration } from '@simplewebauthn/browser';
import { KeyRoundIcon } from 'lucide-react'; import { KeyRoundIcon } from 'lucide-react';
@ -209,7 +209,11 @@ export const PasskeyCreateDialog = ({ trigger, onSuccess, ...props }: PasskeyCre
)) ))
.with('TOO_MANY_PASSKEYS', () => ( .with('TOO_MANY_PASSKEYS', () => (
<AlertDescription> <AlertDescription>
<Trans>You cannot have more than {MAXIMUM_PASSKEYS} passkeys.</Trans> <Plural
value={MAXIMUM_PASSKEYS}
one="You cannot have more than # passkey."
other="You cannot have more than # passkeys."
/>
</AlertDescription> </AlertDescription>
)) ))
.with('InvalidStateError', () => ( .with('InvalidStateError', () => (

View File

@ -96,7 +96,7 @@ export const TemplateCreateDialog = ({ folderId }: TemplateCreateDialogProps) =>
<DialogTrigger asChild> <DialogTrigger asChild>
<Button className="cursor-pointer" disabled={!user.emailVerified}> <Button className="cursor-pointer" disabled={!user.emailVerified}>
<FilePlus className="-ml-1 mr-2 h-4 w-4" /> <FilePlus className="-ml-1 mr-2 h-4 w-4" />
<Trans>New Template</Trans> <Trans>Template (Legacy)</Trans>
</Button> </Button>
</DialogTrigger> </DialogTrigger>

View File

@ -265,7 +265,7 @@ export const TemplateDirectLinkDialog = ({
{remaining.directTemplates !== 0 && ( {remaining.directTemplates !== 0 && (
<DialogFooter className="mx-auto mt-4"> <DialogFooter className="mx-auto mt-4">
<Button type="button" onClick={() => setCurrentStep('SELECT_RECIPIENT')}> <Button type="button" onClick={() => setCurrentStep('SELECT_RECIPIENT')}>
<Trans> Enable direct link signing</Trans> <Trans>Enable direct link signing</Trans>
</Button> </Button>
</DialogFooter> </DialogFooter>
)} )}

View File

@ -0,0 +1,49 @@
import { useTransition } from 'react';
import { msg } from '@lingui/core/macro';
import { useLingui } from '@lingui/react';
import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params';
import type { DateRange } from '@documenso/lib/types/search-params';
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@documenso/ui/primitives/select';
type DateRangeFilterProps = {
currentRange: DateRange;
};
export const DateRangeFilter = ({ currentRange }: DateRangeFilterProps) => {
const { _ } = useLingui();
const [isPending, startTransition] = useTransition();
const updateSearchParams = useUpdateSearchParams();
const handleRangeChange = (value: string) => {
startTransition(() => {
updateSearchParams({
dateRange: value as DateRange,
page: 1,
});
});
};
return (
<div className="flex items-center gap-2">
<Select value={currentRange} onValueChange={handleRangeChange} disabled={isPending}>
<SelectTrigger className="w-48">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="last30days">{_(msg`Last 30 Days`)}</SelectItem>
<SelectItem value="last90days">{_(msg`Last 90 Days`)}</SelectItem>
<SelectItem value="lastYear">{_(msg`Last Year`)}</SelectItem>
<SelectItem value="allTime">{_(msg`All Time`)}</SelectItem>
</SelectContent>
</Select>
</div>
);
};

View File

@ -3,6 +3,7 @@ import { useMemo, useState } from 'react';
import { msg } from '@lingui/core/macro'; import { msg } from '@lingui/core/macro';
import { useLingui } from '@lingui/react'; import { useLingui } from '@lingui/react';
import { Trans } from '@lingui/react/macro'; import { Trans } from '@lingui/react/macro';
import { EnvelopeType } from '@prisma/client';
import { useNavigate, useParams } from 'react-router'; import { useNavigate, useParams } from 'react-router';
import { match } from 'ts-pattern'; import { match } from 'ts-pattern';
@ -17,7 +18,7 @@ import { formatDocumentsPath } from '@documenso/lib/utils/teams';
import { trpc } from '@documenso/trpc/react'; import { trpc } from '@documenso/trpc/react';
import type { TCreateDocumentPayloadSchema } from '@documenso/trpc/server/document-router/create-document.types'; import type { TCreateDocumentPayloadSchema } from '@documenso/trpc/server/document-router/create-document.types';
import { cn } from '@documenso/ui/lib/utils'; import { cn } from '@documenso/ui/lib/utils';
import { DocumentDropzone } from '@documenso/ui/primitives/document-upload'; import { DocumentUploadButton as DocumentUploadButtonPrimitive } from '@documenso/ui/primitives/document-upload-button';
import { import {
Tooltip, Tooltip,
TooltipContent, TooltipContent,
@ -28,11 +29,11 @@ import { useToast } from '@documenso/ui/primitives/use-toast';
import { useCurrentTeam } from '~/providers/team'; import { useCurrentTeam } from '~/providers/team';
export type DocumentUploadButtonProps = { export type DocumentUploadButtonLegacyProps = {
className?: string; className?: string;
}; };
export const DocumentUploadButton = ({ className }: DocumentUploadButtonProps) => { export const DocumentUploadButtonLegacy = ({ className }: DocumentUploadButtonLegacyProps) => {
const { _ } = useLingui(); const { _ } = useLingui();
const { toast } = useToast(); const { toast } = useToast();
const { user } = useSession(); const { user } = useSession();
@ -75,8 +76,10 @@ export const DocumentUploadButton = ({ className }: DocumentUploadButtonProps) =
const payload = { const payload = {
title: file.name, title: file.name,
timezone: userTimezone,
folderId: folderId ?? undefined, folderId: folderId ?? undefined,
meta: {
timezone: userTimezone,
},
} satisfies TCreateDocumentPayloadSchema; } satisfies TCreateDocumentPayloadSchema;
const formData = new FormData(); const formData = new FormData();
@ -144,12 +147,14 @@ export const DocumentUploadButton = ({ className }: DocumentUploadButtonProps) =
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<div> <div>
<DocumentDropzone <DocumentUploadButtonPrimitive
loading={isLoading} loading={isLoading}
disabled={remaining.documents === 0 || !user.emailVerified} disabled={remaining.documents === 0 || !user.emailVerified}
disabledMessage={disabledMessage} disabledMessage={disabledMessage}
onDrop={async (files) => onFileDrop(files[0])} onDrop={async (files) => onFileDrop(files[0])}
onDropRejected={onFileDropRejected} onDropRejected={onFileDropRejected}
type={EnvelopeType.DOCUMENT}
internalVersion="1"
/> />
</div> </div>
</TooltipTrigger> </TooltipTrigger>

View File

@ -233,7 +233,19 @@ export const EnvelopeEditorSettingsDialog = ({
const canUpdateVisibility = canAccessTeamDocument(team.currentTeamRole, envelope.visibility); const canUpdateVisibility = canAccessTeamDocument(team.currentTeamRole, envelope.visibility);
const onFormSubmit = async (data: TAddSettingsFormSchema) => { const onFormSubmit = async (data: TAddSettingsFormSchema) => {
const { timezone, dateFormat, redirectUrl, language, signatureTypes } = data.meta; const {
timezone,
dateFormat,
redirectUrl,
language,
signatureTypes,
distributionMethod,
emailId,
emailSettings,
message,
subject,
emailReplyTo,
} = data.meta;
const parsedGlobalAccessAuth = z const parsedGlobalAccessAuth = z
.array(ZDocumentAccessAuthTypesSchema) .array(ZDocumentAccessAuthTypesSchema)
@ -251,10 +263,16 @@ export const EnvelopeEditorSettingsDialog = ({
timezone, timezone,
dateFormat, dateFormat,
redirectUrl, redirectUrl,
emailId,
message,
subject,
emailReplyTo,
emailSettings,
distributionMethod,
language: isValidLanguageCode(language) ? language : undefined, language: isValidLanguageCode(language) ? language : undefined,
drawSignatureEnabled: signatureTypes.includes(DocumentSignatureType.DRAW),
typedSignatureEnabled: signatureTypes.includes(DocumentSignatureType.TYPE), typedSignatureEnabled: signatureTypes.includes(DocumentSignatureType.TYPE),
uploadSignatureEnabled: signatureTypes.includes(DocumentSignatureType.UPLOAD), uploadSignatureEnabled: signatureTypes.includes(DocumentSignatureType.UPLOAD),
drawSignatureEnabled: signatureTypes.includes(DocumentSignatureType.DRAW),
}, },
}); });

View File

@ -75,14 +75,12 @@ export const EnvelopeSignerCompleteDialog = () => {
accessAuthOptions?: TRecipientAccessAuth, accessAuthOptions?: TRecipientAccessAuth,
) => { ) => {
try { try {
const payload = { await completeDocument({
token: recipient.token, token: recipient.token,
documentId: mapSecondaryIdToDocumentId(envelope.secondaryId), documentId: mapSecondaryIdToDocumentId(envelope.secondaryId),
authOptions: accessAuthOptions, accessAuthOptions,
...(nextSigner?.email && nextSigner?.name ? { nextSigner } : {}), ...(nextSigner?.email && nextSigner?.name ? { nextSigner } : {}),
}; });
await completeDocument(payload);
analytics.capture('App: Recipient has completed signing', { analytics.capture('App: Recipient has completed signing', {
signerId: recipient.id, signerId: recipient.id,

View File

@ -1,10 +1,15 @@
import { type ReactNode, useState } from 'react'; import { type ReactNode, useState } from 'react';
import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react/macro';
import { useLingui } from '@lingui/react';
import { Trans } from '@lingui/react/macro'; import { Trans } from '@lingui/react/macro';
import { EnvelopeType } from '@prisma/client';
import { Loader } from 'lucide-react'; import { Loader } from 'lucide-react';
import { ErrorCode, type FileRejection, useDropzone } from 'react-dropzone'; import {
ErrorCode as DropzoneErrorCode,
ErrorCode,
type FileRejection,
useDropzone,
} from 'react-dropzone';
import { Link, useNavigate, useParams } from 'react-router'; import { Link, useNavigate, useParams } from 'react-router';
import { match } from 'ts-pattern'; import { match } from 'ts-pattern';
@ -16,21 +21,26 @@ import { APP_DOCUMENT_UPLOAD_SIZE_LIMIT, IS_BILLING_ENABLED } from '@documenso/l
import { DEFAULT_DOCUMENT_TIME_ZONE, TIME_ZONES } from '@documenso/lib/constants/time-zones'; import { DEFAULT_DOCUMENT_TIME_ZONE, TIME_ZONES } from '@documenso/lib/constants/time-zones';
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
import { megabytesToBytes } from '@documenso/lib/universal/unit-convertions'; import { megabytesToBytes } from '@documenso/lib/universal/unit-convertions';
import { formatDocumentsPath } from '@documenso/lib/utils/teams'; import { formatDocumentsPath, formatTemplatesPath } from '@documenso/lib/utils/teams';
import { trpc } from '@documenso/trpc/react'; import { trpc } from '@documenso/trpc/react';
import type { TCreateDocumentPayloadSchema } from '@documenso/trpc/server/document-router/create-document.types'; import type { TCreateEnvelopePayload } from '@documenso/trpc/server/envelope-router/create-envelope.types';
import { cn } from '@documenso/ui/lib/utils'; import { cn } from '@documenso/ui/lib/utils';
import { useToast } from '@documenso/ui/primitives/use-toast'; import { useToast } from '@documenso/ui/primitives/use-toast';
import { useCurrentTeam } from '~/providers/team'; import { useCurrentTeam } from '~/providers/team';
export interface DocumentDropZoneWrapperProps { export interface EnvelopeDropZoneWrapperProps {
children: ReactNode; children: ReactNode;
type: EnvelopeType;
className?: string; className?: string;
} }
export const DocumentDropZoneWrapper = ({ children, className }: DocumentDropZoneWrapperProps) => { export const EnvelopeDropZoneWrapper = ({
const { _ } = useLingui(); children,
type,
className,
}: EnvelopeDropZoneWrapperProps) => {
const { t } = useLingui();
const { toast } = useToast(); const { toast } = useToast();
const { user } = useSession(); const { user } = useSession();
const { folderId } = useParams(); const { folderId } = useParams();
@ -47,13 +57,13 @@ export const DocumentDropZoneWrapper = ({ children, className }: DocumentDropZon
TIME_ZONES.find((timezone) => timezone === Intl.DateTimeFormat().resolvedOptions().timeZone) ?? TIME_ZONES.find((timezone) => timezone === Intl.DateTimeFormat().resolvedOptions().timeZone) ??
DEFAULT_DOCUMENT_TIME_ZONE; DEFAULT_DOCUMENT_TIME_ZONE;
const { quota, remaining, refreshLimits } = useLimits(); const { quota, remaining, refreshLimits, maximumEnvelopeItemCount } = useLimits();
const { mutateAsync: createDocument } = trpc.document.create.useMutation(); const { mutateAsync: createEnvelope } = trpc.envelope.create.useMutation();
const isUploadDisabled = remaining.documents === 0 || !user.emailVerified; const isUploadDisabled = remaining.documents === 0 || !user.emailVerified;
const onFileDrop = async (file: File) => { const onFileDrop = async (files: File[]) => {
if (isUploadDisabled && IS_BILLING_ENABLED()) { if (isUploadDisabled && IS_BILLING_ENABLED()) {
await navigate(`/o/${organisation.url}/settings/billing`); await navigate(`/o/${organisation.url}/settings/billing`);
return; return;
@ -63,51 +73,67 @@ export const DocumentDropZoneWrapper = ({ children, className }: DocumentDropZon
setIsLoading(true); setIsLoading(true);
const payload = { const payload = {
title: file.name, folderId,
timezone: userTimezone, type,
folderId: folderId ?? undefined, title: files[0].name,
} satisfies TCreateDocumentPayloadSchema; meta: {
timezone: userTimezone,
},
} satisfies TCreateEnvelopePayload;
const formData = new FormData(); const formData = new FormData();
formData.append('payload', JSON.stringify(payload)); formData.append('payload', JSON.stringify(payload));
formData.append('file', file);
const { envelopeId: id } = await createDocument(formData); for (const file of files) {
formData.append('files', file);
}
const { id } = await createEnvelope(formData);
void refreshLimits(); void refreshLimits();
toast({ toast({
title: _(msg`Document uploaded`), title: type === EnvelopeType.DOCUMENT ? t`Document uploaded` : t`Template uploaded`,
description: _(msg`Your document has been uploaded successfully.`), description:
type === EnvelopeType.DOCUMENT
? t`Your document has been uploaded successfully.`
: t`Your template has been uploaded successfully.`,
duration: 5000, duration: 5000,
}); });
analytics.capture('App: Document Uploaded', { if (type === EnvelopeType.DOCUMENT) {
userId: user.id, analytics.capture('App: Document Uploaded', {
documentId: id, userId: user.id,
timestamp: new Date().toISOString(), documentId: id,
}); timestamp: new Date().toISOString(),
});
}
await navigate(`${formatDocumentsPath(team.url)}/${id}/edit`); const pathPrefix =
type === EnvelopeType.DOCUMENT
? formatDocumentsPath(team.url)
: formatTemplatesPath(team.url);
await navigate(`${pathPrefix}/${id}/edit`);
} catch (err) { } catch (err) {
const error = AppError.parseError(err); const error = AppError.parseError(err);
const errorMessage = match(error.code) const errorMessage = match(error.code)
.with('INVALID_DOCUMENT_FILE', () => msg`You cannot upload encrypted PDFs`) .with('INVALID_DOCUMENT_FILE', () => t`You cannot upload encrypted PDFs`)
.with( .with(
AppErrorCode.LIMIT_EXCEEDED, AppErrorCode.LIMIT_EXCEEDED,
() => msg`You have reached your document limit for this month. Please upgrade your plan.`, () => t`You have reached your document limit for this month. Please upgrade your plan.`,
) )
.with( .with(
'ENVELOPE_ITEM_LIMIT_EXCEEDED', 'ENVELOPE_ITEM_LIMIT_EXCEEDED',
() => msg`You have reached the limit of the number of files per envelope`, () => t`You have reached the limit of the number of files per envelope`,
) )
.otherwise(() => msg`An error occurred while uploading your document.`); .otherwise(() => t`An error occurred during upload.`);
toast({ toast({
title: _(msg`Error`), title: t`Error`,
description: _(errorMessage), description: errorMessage,
variant: 'destructive', variant: 'destructive',
duration: 7500, duration: 7500,
}); });
@ -121,6 +147,20 @@ export const DocumentDropZoneWrapper = ({ children, className }: DocumentDropZon
return; return;
} }
const maxItemsReached = fileRejections.some((fileRejection) =>
fileRejection.errors.some((error) => error.code === DropzoneErrorCode.TooManyFiles),
);
if (maxItemsReached) {
toast({
title: t`You cannot upload more than ${maximumEnvelopeItemCount} items per envelope.`,
duration: 5000,
variant: 'destructive',
});
return;
}
// Since users can only upload only one file (no multi-upload), we only handle the first file rejection // Since users can only upload only one file (no multi-upload), we only handle the first file rejection
const { file, errors } = fileRejections[0]; const { file, errors } = fileRejections[0];
@ -148,14 +188,14 @@ export const DocumentDropZoneWrapper = ({ children, className }: DocumentDropZon
const description = ( const description = (
<> <>
<span className="font-medium"> <span className="font-medium">
{file.name} <Trans>couldn't be uploaded:</Trans> <Trans>{file.name} couldn't be uploaded:</Trans>
</span> </span>
{errorNodes} {errorNodes}
</> </>
); );
toast({ toast({
title: _(msg`Upload failed`), title: t`Upload failed`,
description, description,
duration: 5000, duration: 5000,
variant: 'destructive', variant: 'destructive',
@ -165,17 +205,11 @@ export const DocumentDropZoneWrapper = ({ children, className }: DocumentDropZon
accept: { accept: {
'application/pdf': ['.pdf'], 'application/pdf': ['.pdf'],
}, },
//disabled: isUploadDisabled, multiple: true,
multiple: false,
maxSize: megabytesToBytes(APP_DOCUMENT_UPLOAD_SIZE_LIMIT), maxSize: megabytesToBytes(APP_DOCUMENT_UPLOAD_SIZE_LIMIT),
onDrop: ([acceptedFile]) => { maxFiles: maximumEnvelopeItemCount,
if (acceptedFile) { onDrop: (files) => void onFileDrop(files),
void onFileDrop(acceptedFile); onDropRejected: onFileDropRejected,
}
},
onDropRejected: (fileRejections) => {
onFileDropRejected(fileRejections);
},
noClick: true, noClick: true,
noDragEventsBubbling: true, noDragEventsBubbling: true,
}); });
@ -189,7 +223,11 @@ export const DocumentDropZoneWrapper = ({ children, className }: DocumentDropZon
<div className="bg-muted/60 fixed left-0 top-0 z-[9999] h-full w-full backdrop-blur-[4px]"> <div className="bg-muted/60 fixed left-0 top-0 z-[9999] h-full w-full backdrop-blur-[4px]">
<div className="pointer-events-none flex h-full w-full flex-col items-center justify-center"> <div className="pointer-events-none flex h-full w-full flex-col items-center justify-center">
<h2 className="text-foreground text-2xl font-semibold"> <h2 className="text-foreground text-2xl font-semibold">
<Trans>Upload Document</Trans> {type === EnvelopeType.DOCUMENT ? (
<Trans>Upload Document</Trans>
) : (
<Trans>Upload Template</Trans>
)}
</h2> </h2>
<p className="text-muted-foreground text-md mt-4"> <p className="text-muted-foreground text-md mt-4">
@ -224,7 +262,7 @@ export const DocumentDropZoneWrapper = ({ children, className }: DocumentDropZon
<div className="pointer-events-none flex h-1/2 w-full flex-col items-center justify-center"> <div className="pointer-events-none flex h-1/2 w-full flex-col items-center justify-center">
<Loader className="text-primary h-12 w-12 animate-spin" /> <Loader className="text-primary h-12 w-12 animate-spin" />
<p className="text-foreground mt-8 font-medium"> <p className="text-foreground mt-8 font-medium">
<Trans>Uploading document...</Trans> <Trans>Uploading</Trans>
</p> </p>
</div> </div>
</div> </div>

View File

@ -18,7 +18,7 @@ import { formatDocumentsPath, formatTemplatesPath } from '@documenso/lib/utils/t
import { trpc } from '@documenso/trpc/react'; import { trpc } from '@documenso/trpc/react';
import type { TCreateEnvelopePayload } from '@documenso/trpc/server/envelope-router/create-envelope.types'; import type { TCreateEnvelopePayload } from '@documenso/trpc/server/envelope-router/create-envelope.types';
import { cn } from '@documenso/ui/lib/utils'; import { cn } from '@documenso/ui/lib/utils';
import { DocumentDropzone } from '@documenso/ui/primitives/document-upload'; import { DocumentUploadButton } from '@documenso/ui/primitives/document-upload-button';
import { import {
Tooltip, Tooltip,
TooltipContent, TooltipContent,
@ -175,13 +175,14 @@ export const EnvelopeUploadButton = ({ className, type, folderId }: EnvelopeUplo
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<div> <div>
<DocumentDropzone <DocumentUploadButton
loading={isLoading} loading={isLoading}
disabled={remaining.documents === 0 || !user.emailVerified} disabled={remaining.documents === 0 || !user.emailVerified}
disabledMessage={disabledMessage} disabledMessage={disabledMessage}
onDrop={onFileDrop} onDrop={onFileDrop}
onDropRejected={onFileDropRejected} onDropRejected={onFileDropRejected}
type="envelope" type={type}
internalVersion="2"
maxFiles={maximumEnvelopeItemCount} maxFiles={maximumEnvelopeItemCount}
/> />
</div> </div>

View File

@ -6,7 +6,6 @@ import { FolderIcon, HomeIcon } from 'lucide-react';
import { Link } from 'react-router'; import { Link } from 'react-router';
import { useCurrentOrganisation } from '@documenso/lib/client-only/providers/organisation'; import { useCurrentOrganisation } from '@documenso/lib/client-only/providers/organisation';
import { IS_ENVELOPES_ENABLED } from '@documenso/lib/constants/app';
import { formatDocumentsPath, formatTemplatesPath } from '@documenso/lib/utils/teams'; import { formatDocumentsPath, formatTemplatesPath } from '@documenso/lib/utils/teams';
import { trpc } from '@documenso/trpc/react'; import { trpc } from '@documenso/trpc/react';
import { type TFolderWithSubfolders } from '@documenso/trpc/server/folder-router/schema'; import { type TFolderWithSubfolders } from '@documenso/trpc/server/folder-router/schema';
@ -17,11 +16,11 @@ import { FolderDeleteDialog } from '~/components/dialogs/folder-delete-dialog';
import { FolderMoveDialog } from '~/components/dialogs/folder-move-dialog'; import { FolderMoveDialog } from '~/components/dialogs/folder-move-dialog';
import { FolderUpdateDialog } from '~/components/dialogs/folder-update-dialog'; import { FolderUpdateDialog } from '~/components/dialogs/folder-update-dialog';
import { TemplateCreateDialog } from '~/components/dialogs/template-create-dialog'; import { TemplateCreateDialog } from '~/components/dialogs/template-create-dialog';
import { DocumentUploadButton } from '~/components/general/document/document-upload-button'; import { DocumentUploadButtonLegacy } from '~/components/general/document/document-upload-button-legacy';
import { FolderCard, FolderCardEmpty } from '~/components/general/folder/folder-card'; import { FolderCard, FolderCardEmpty } from '~/components/general/folder/folder-card';
import { useCurrentTeam } from '~/providers/team'; import { useCurrentTeam } from '~/providers/team';
import { EnvelopeUploadButton } from '../document/envelope-upload-button'; import { EnvelopeUploadButton } from '../envelope/envelope-upload-button';
export type FolderGridProps = { export type FolderGridProps = {
type: FolderType; type: FolderType;
@ -99,14 +98,12 @@ export const FolderGrid = ({ type, parentId }: FolderGridProps) => {
</div> </div>
<div className="flex gap-4 sm:flex-row sm:justify-end"> <div className="flex gap-4 sm:flex-row sm:justify-end">
{(IS_ENVELOPES_ENABLED || organisation.organisationClaim.flags.allowEnvelopes) && ( <EnvelopeUploadButton type={type} folderId={parentId || undefined} />
<EnvelopeUploadButton type={type} folderId={parentId || undefined} />
)}
{type === FolderType.DOCUMENT ? ( {type === FolderType.DOCUMENT ? (
<DocumentUploadButton /> <DocumentUploadButtonLegacy /> // If you delete this, delete the component as well.
) : ( ) : (
<TemplateCreateDialog folderId={parentId ?? undefined} /> <TemplateCreateDialog folderId={parentId ?? undefined} /> // If you delete this, delete the component as well.
)} )}
<FolderCreateDialog type={type} /> <FolderCreateDialog type={type} />

View File

@ -1,171 +0,0 @@
import { type ReactNode, useState } from 'react';
import { msg } from '@lingui/core/macro';
import { useLingui } from '@lingui/react';
import { Trans } from '@lingui/react/macro';
import { Loader } from 'lucide-react';
import { ErrorCode, type FileRejection, useDropzone } from 'react-dropzone';
import { useNavigate, useParams } from 'react-router';
import { match } from 'ts-pattern';
import { APP_DOCUMENT_UPLOAD_SIZE_LIMIT } from '@documenso/lib/constants/app';
import { megabytesToBytes } from '@documenso/lib/universal/unit-convertions';
import { formatTemplatesPath } from '@documenso/lib/utils/teams';
import { trpc } from '@documenso/trpc/react';
import type { TCreateTemplatePayloadSchema } from '@documenso/trpc/server/template-router/schema';
import { cn } from '@documenso/ui/lib/utils';
import { useToast } from '@documenso/ui/primitives/use-toast';
import { useCurrentTeam } from '~/providers/team';
export interface TemplateDropZoneWrapperProps {
children: ReactNode;
className?: string;
}
export const TemplateDropZoneWrapper = ({ children, className }: TemplateDropZoneWrapperProps) => {
const { _ } = useLingui();
const { toast } = useToast();
const { folderId } = useParams();
const team = useCurrentTeam();
const navigate = useNavigate();
const [isLoading, setIsLoading] = useState(false);
const { mutateAsync: createTemplate } = trpc.template.createTemplate.useMutation();
const onFileDrop = async (file: File) => {
try {
setIsLoading(true);
const payload = {
title: file.name,
folderId: folderId ?? undefined,
} satisfies TCreateTemplatePayloadSchema;
const formData = new FormData();
formData.append('payload', JSON.stringify(payload));
formData.append('file', file);
const { envelopeId: id } = await createTemplate(formData);
toast({
title: _(msg`Template uploaded`),
description: _(
msg`Your template has been uploaded successfully. You will be redirected to the template page.`,
),
duration: 5000,
});
await navigate(`${formatTemplatesPath(team.url)}/${id}/edit`);
} catch {
toast({
title: _(msg`Something went wrong`),
description: _(msg`Please try again later.`),
variant: 'destructive',
});
} finally {
setIsLoading(false);
}
};
const onFileDropRejected = (fileRejections: FileRejection[]) => {
if (!fileRejections.length) {
return;
}
// Since users can only upload only one file (no multi-upload), we only handle the first file rejection
const { file, errors } = fileRejections[0];
if (!errors.length) {
return;
}
const errorNodes = errors.map((error, index) => (
<span key={index} className="block">
{match(error.code)
.with(ErrorCode.FileTooLarge, () => (
<Trans>File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB</Trans>
))
.with(ErrorCode.FileInvalidType, () => <Trans>Only PDF files are allowed</Trans>)
.with(ErrorCode.FileTooSmall, () => <Trans>File is too small</Trans>)
.with(ErrorCode.TooManyFiles, () => (
<Trans>Only one file can be uploaded at a time</Trans>
))
.otherwise(() => (
<Trans>Unknown error</Trans>
))}
</span>
));
const description = (
<>
<span className="font-medium">
{file.name} <Trans>couldn't be uploaded:</Trans>
</span>
{errorNodes}
</>
);
toast({
title: _(msg`Upload failed`),
description,
duration: 5000,
variant: 'destructive',
});
};
const { getRootProps, getInputProps, isDragActive } = useDropzone({
accept: {
'application/pdf': ['.pdf'],
},
//disabled: isUploadDisabled,
multiple: false,
maxSize: megabytesToBytes(APP_DOCUMENT_UPLOAD_SIZE_LIMIT),
onDrop: ([acceptedFile]) => {
if (acceptedFile) {
void onFileDrop(acceptedFile);
}
},
onDropRejected: (fileRejections) => {
onFileDropRejected(fileRejections);
},
noClick: true,
noDragEventsBubbling: true,
});
return (
<div {...getRootProps()} className={cn('relative min-h-screen', className)}>
<input {...getInputProps()} />
{children}
{isDragActive && (
<div className="bg-muted/60 fixed left-0 top-0 z-[9999] h-full w-full backdrop-blur-[4px]">
<div className="pointer-events-none flex h-full w-full flex-col items-center justify-center">
<h2 className="text-foreground text-2xl font-semibold">
<Trans>Upload Template</Trans>
</h2>
<p className="text-muted-foreground text-md mt-4">
<Trans>Drag and drop your PDF file here</Trans>
</p>
</div>
</div>
)}
{isLoading && (
<div className="bg-muted/30 absolute inset-0 z-50 backdrop-blur-[2px]">
<div className="pointer-events-none flex h-1/2 w-full flex-col items-center justify-center">
<Loader className="text-primary h-12 w-12 animate-spin" />
<p className="text-foreground mt-8 font-medium">
<Trans>Uploading template...</Trans>
</p>
</div>
</div>
)}
</div>
);
};

View File

@ -2,40 +2,49 @@ import { useEffect, useMemo, useState, useTransition } from 'react';
import { msg } from '@lingui/core/macro'; import { msg } from '@lingui/core/macro';
import { useLingui } from '@lingui/react'; import { useLingui } from '@lingui/react';
import { Trans } from '@lingui/react/macro';
import { ChevronDownIcon, ChevronUpIcon, ChevronsUpDown, Loader } from 'lucide-react'; import { ChevronDownIcon, ChevronUpIcon, ChevronsUpDown, Loader } from 'lucide-react';
import { Link } from 'react-router';
import { useDebouncedValue } from '@documenso/lib/client-only/hooks/use-debounced-value'; import { useDebouncedValue } from '@documenso/lib/client-only/hooks/use-debounced-value';
import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params';
import type { DateRange } from '@documenso/lib/types/search-params';
import type { DataTableColumnDef } from '@documenso/ui/primitives/data-table'; import type { DataTableColumnDef } from '@documenso/ui/primitives/data-table';
import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTable } from '@documenso/ui/primitives/data-table';
import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination';
import { Input } from '@documenso/ui/primitives/input'; import { Input } from '@documenso/ui/primitives/input';
export type SigningVolume = { export type OrganisationOverview = {
id: number; id: string;
name: string; name: string;
signingVolume: number; signingVolume: number;
createdAt: Date; createdAt: Date;
planId: string; customerId: string;
subscriptionStatus?: string;
isActive?: boolean;
teamCount?: number;
memberCount?: number;
}; };
type LeaderboardTableProps = { type OrganisationOverviewTableProps = {
signingVolume: SigningVolume[]; organisations: OrganisationOverview[];
totalPages: number; totalPages: number;
perPage: number; perPage: number;
page: number; page: number;
sortBy: 'name' | 'createdAt' | 'signingVolume'; sortBy: 'name' | 'createdAt' | 'signingVolume';
sortOrder: 'asc' | 'desc'; sortOrder: 'asc' | 'desc';
dateRange: DateRange;
}; };
export const AdminLeaderboardTable = ({ export const AdminOrganisationOverviewTable = ({
signingVolume, organisations,
totalPages, totalPages,
perPage, perPage,
page, page,
sortBy, sortBy,
sortOrder, sortOrder,
}: LeaderboardTableProps) => { dateRange,
}: OrganisationOverviewTableProps) => {
const { _, i18n } = useLingui(); const { _, i18n } = useLingui();
const [isPending, startTransition] = useTransition(); const [isPending, startTransition] = useTransition();
@ -67,17 +76,16 @@ export const AdminLeaderboardTable = ({
cell: ({ row }) => { cell: ({ row }) => {
return ( return (
<div> <div>
<a <Link
className="text-primary underline" className="hover:underline"
href={`https://dashboard.stripe.com/subscriptions/${row.original.planId}`} to={`/admin/organisation-insights/${row.original.id}?dateRange=${dateRange}`}
target="_blank"
> >
{row.getValue('name')} {row.getValue('name')}
</a> </Link>
</div> </div>
); );
}, },
size: 250, size: 240,
}, },
{ {
header: () => ( header: () => (
@ -85,7 +93,9 @@ export const AdminLeaderboardTable = ({
className="flex cursor-pointer items-center" className="flex cursor-pointer items-center"
onClick={() => handleColumnSort('signingVolume')} onClick={() => handleColumnSort('signingVolume')}
> >
{_(msg`Signing Volume`)} <span className="whitespace-nowrap">
<Trans>Document Volume</Trans>
</span>
{sortBy === 'signingVolume' ? ( {sortBy === 'signingVolume' ? (
sortOrder === 'asc' ? ( sortOrder === 'asc' ? (
<ChevronUpIcon className="ml-2 h-4 w-4" /> <ChevronUpIcon className="ml-2 h-4 w-4" />
@ -99,6 +109,23 @@ export const AdminLeaderboardTable = ({
), ),
accessorKey: 'signingVolume', accessorKey: 'signingVolume',
cell: ({ row }) => <div>{Number(row.getValue('signingVolume'))}</div>, cell: ({ row }) => <div>{Number(row.getValue('signingVolume'))}</div>,
size: 160,
},
{
header: () => {
return <Trans>Teams</Trans>;
},
accessorKey: 'teamCount',
cell: ({ row }) => <div>{Number(row.original.teamCount) || 0}</div>,
size: 120,
},
{
header: () => {
return <Trans>Members</Trans>;
},
accessorKey: 'memberCount',
cell: ({ row }) => <div>{Number(row.original.memberCount) || 0}</div>,
size: 160,
}, },
{ {
header: () => { header: () => {
@ -107,7 +134,9 @@ export const AdminLeaderboardTable = ({
className="flex cursor-pointer items-center" className="flex cursor-pointer items-center"
onClick={() => handleColumnSort('createdAt')} onClick={() => handleColumnSort('createdAt')}
> >
{_(msg`Created`)} <span className="whitespace-nowrap">
<Trans>Created</Trans>
</span>
{sortBy === 'createdAt' ? ( {sortBy === 'createdAt' ? (
sortOrder === 'asc' ? ( sortOrder === 'asc' ? (
<ChevronUpIcon className="ml-2 h-4 w-4" /> <ChevronUpIcon className="ml-2 h-4 w-4" />
@ -121,10 +150,11 @@ export const AdminLeaderboardTable = ({
); );
}, },
accessorKey: 'createdAt', accessorKey: 'createdAt',
cell: ({ row }) => i18n.date(row.original.createdAt), cell: ({ row }) => i18n.date(new Date(row.original.createdAt)),
size: 120,
}, },
] satisfies DataTableColumnDef<SigningVolume>[]; ] satisfies DataTableColumnDef<OrganisationOverview>[];
}, [sortOrder, sortBy]); }, [sortOrder, sortBy, dateRange]);
useEffect(() => { useEffect(() => {
startTransition(() => { startTransition(() => {
@ -169,13 +199,13 @@ export const AdminLeaderboardTable = ({
<Input <Input
className="my-6 flex flex-row gap-4" className="my-6 flex flex-row gap-4"
type="text" type="text"
placeholder={_(msg`Search by name or email`)} placeholder={_(msg`Search by organisation name`)}
value={searchString} value={searchString}
onChange={handleChange} onChange={handleChange}
/> />
<DataTable <DataTable
columns={columns} columns={columns}
data={signingVolume} data={organisations}
perPage={perPage} perPage={perPage}
currentPage={page} currentPage={page}
totalPages={totalPages} totalPages={totalPages}

View File

@ -93,13 +93,31 @@ export const AdminOrganisationsTable = ({
), ),
}, },
{ {
header: t`Status`, id: 'role',
header: t`Role`,
cell: ({ row }) => ( cell: ({ row }) => (
<Badge variant="neutral"> <Badge variant="neutral">
{row.original.owner.id === memberUserId ? t`Owner` : t`Member`} {row.original.owner.id === memberUserId ? t`Owner` : t`Member`}
</Badge> </Badge>
), ),
}, },
{
id: 'billingStatus',
header: t`Status`,
cell: ({ row }) => {
const subscription = row.original.subscription;
const isPaid = subscription && subscription.status === 'ACTIVE';
return (
<div
className={`inline-flex items-center rounded-full px-2 py-1 text-xs font-medium ${
isPaid ? 'bg-green-100 text-green-800' : 'bg-gray-100 text-gray-800'
}`}
>
{isPaid ? t`Paid` : t`Free`}
</div>
);
},
},
{ {
header: t`Subscription`, header: t`Subscription`,
cell: ({ row }) => cell: ({ row }) =>
@ -168,7 +186,7 @@ export const AdminOrganisationsTable = ({
onPaginationChange={onPaginationChange} onPaginationChange={onPaginationChange}
columnVisibility={{ columnVisibility={{
owner: showOwnerColumn, owner: showOwnerColumn,
status: memberUserId !== undefined, role: memberUserId !== undefined,
}} }}
error={{ error={{
enable: isLoadingError, enable: isLoadingError,

View File

@ -0,0 +1,287 @@
import { useTransition } from 'react';
import { msg } from '@lingui/core/macro';
import { useLingui } from '@lingui/react';
import { Building2, Loader, TrendingUp, Users } from 'lucide-react';
import { Link } from 'react-router';
import { useNavigation } from 'react-router';
import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params';
import type { OrganisationDetailedInsights } from '@documenso/lib/server-only/admin/get-organisation-detailed-insights';
import type { DateRange } from '@documenso/lib/types/search-params';
import type { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status';
import { Button } from '@documenso/ui/primitives/button';
import type { DataTableColumnDef } from '@documenso/ui/primitives/data-table';
import { DataTable } from '@documenso/ui/primitives/data-table';
import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination';
import { DateRangeFilter } from '~/components/filters/date-range-filter';
import { DocumentStatus } from '~/components/general/document/document-status';
type OrganisationInsightsTableProps = {
insights: OrganisationDetailedInsights;
page: number;
perPage: number;
dateRange: DateRange;
view: 'teams' | 'users' | 'documents';
};
export const OrganisationInsightsTable = ({
insights,
page,
perPage,
dateRange,
view,
}: OrganisationInsightsTableProps) => {
const { _, i18n } = useLingui();
const [isPending, startTransition] = useTransition();
const navigation = useNavigation();
const updateSearchParams = useUpdateSearchParams();
const isLoading = isPending || navigation.state === 'loading';
const onPaginationChange = (newPage: number, newPerPage: number) => {
startTransition(() => {
updateSearchParams({
page: newPage,
perPage: newPerPage,
});
});
};
const handleViewChange = (newView: 'teams' | 'users' | 'documents') => {
startTransition(() => {
updateSearchParams({
view: newView,
page: 1,
});
});
};
const teamsColumns = [
{
header: _(msg`Team Name`),
accessorKey: 'name',
cell: ({ row }) => <span className="block max-w-full truncate">{row.getValue('name')}</span>,
size: 240,
},
{
header: _(msg`Members`),
accessorKey: 'memberCount',
cell: ({ row }) => Number(row.getValue('memberCount')),
size: 120,
},
{
header: _(msg`Documents`),
accessorKey: 'documentCount',
cell: ({ row }) => Number(row.getValue('documentCount')),
size: 140,
},
{
header: _(msg`Created`),
accessorKey: 'createdAt',
cell: ({ row }) => i18n.date(new Date(row.getValue('createdAt'))),
size: 160,
},
] satisfies DataTableColumnDef<(typeof insights.teams)[number]>[];
const usersColumns = [
{
header: () => <span className="whitespace-nowrap">{_(msg`Name`)}</span>,
accessorKey: 'name',
cell: ({ row }) => (
<Link
className="block max-w-full truncate hover:underline"
to={`/admin/users/${row.original.id}`}
>
{(row.getValue('name') as string) || (row.getValue('email') as string)}
</Link>
),
size: 220,
},
{
header: () => <span className="whitespace-nowrap">{_(msg`Email`)}</span>,
accessorKey: 'email',
cell: ({ row }) => <span className="block max-w-full truncate">{row.getValue('email')}</span>,
size: 260,
},
{
header: () => <span className="whitespace-nowrap">{_(msg`Documents Created`)}</span>,
accessorKey: 'documentCount',
cell: ({ row }) => Number(row.getValue('documentCount')),
size: 180,
},
{
header: () => <span className="whitespace-nowrap">{_(msg`Documents Completed`)}</span>,
accessorKey: 'signedDocumentCount',
cell: ({ row }) => Number(row.getValue('signedDocumentCount')),
size: 180,
},
{
header: () => <span className="whitespace-nowrap">{_(msg`Joined`)}</span>,
accessorKey: 'createdAt',
cell: ({ row }) => i18n.date(new Date(row.getValue('createdAt'))),
size: 160,
},
] satisfies DataTableColumnDef<(typeof insights.users)[number]>[];
const documentsColumns = [
{
header: () => <span className="whitespace-nowrap">{_(msg`Title`)}</span>,
accessorKey: 'title',
cell: ({ row }) => (
<Link
className="block max-w-[200px] truncate hover:underline"
to={`/admin/documents/${row.original.id}`}
title={row.getValue('title') as string}
>
{row.getValue('title')}
</Link>
),
size: 200,
},
{
header: () => <span className="whitespace-nowrap">{_(msg`Status`)}</span>,
accessorKey: 'status',
cell: ({ row }) => (
<DocumentStatus status={row.getValue('status') as ExtendedDocumentStatus} />
),
size: 120,
},
{
header: () => <span className="whitespace-nowrap">{_(msg`Team`)}</span>,
accessorKey: 'teamName',
cell: ({ row }) => (
<span className="block max-w-[150px] truncate" title={row.getValue('teamName') as string}>
{row.getValue('teamName')}
</span>
),
size: 150,
},
{
header: () => <span className="whitespace-nowrap">{_(msg`Created`)}</span>,
accessorKey: 'createdAt',
cell: ({ row }) => i18n.date(new Date(row.getValue('createdAt'))),
size: 140,
},
{
header: () => <span className="whitespace-nowrap">{_(msg`Completed`)}</span>,
accessorKey: 'completedAt',
cell: ({ row }) => {
const completedAt = row.getValue('completedAt') as Date | null;
return completedAt ? i18n.date(new Date(completedAt)) : '-';
},
size: 140,
},
] satisfies DataTableColumnDef<(typeof insights.documents)[number]>[];
const getCurrentData = (): unknown[] => {
switch (view) {
case 'teams':
return insights.teams;
case 'users':
return insights.users;
case 'documents':
return insights.documents;
default:
return [];
}
};
const getCurrentColumns = (): DataTableColumnDef<unknown>[] => {
switch (view) {
case 'teams':
return teamsColumns as unknown as DataTableColumnDef<unknown>[];
case 'users':
return usersColumns as unknown as DataTableColumnDef<unknown>[];
case 'documents':
return documentsColumns as unknown as DataTableColumnDef<unknown>[];
default:
return [];
}
};
return (
<div className="relative">
{insights.summary && (
<div className="mb-6 grid grid-cols-2 gap-4 md:grid-cols-3">
<SummaryCard icon={Building2} title={_(msg`Teams`)} value={insights.summary.totalTeams} />
<SummaryCard icon={Users} title={_(msg`Members`)} value={insights.summary.totalMembers} />
<SummaryCard
icon={TrendingUp}
title={_(msg`Documents Completed`)}
value={insights.summary.volumeThisPeriod}
/>
</div>
)}
<div className="mb-6 flex items-center justify-between">
<div className="flex gap-2">
<Button
variant={view === 'teams' ? 'default' : 'outline'}
onClick={() => handleViewChange('teams')}
disabled={isLoading}
>
{_(msg`Teams`)}
</Button>
<Button
variant={view === 'users' ? 'default' : 'outline'}
onClick={() => handleViewChange('users')}
disabled={isLoading}
>
{_(msg`Users`)}
</Button>
<Button
variant={view === 'documents' ? 'default' : 'outline'}
onClick={() => handleViewChange('documents')}
disabled={isLoading}
>
{_(msg`Documents`)}
</Button>
</div>
<DateRangeFilter currentRange={dateRange} />
</div>
<div className={view === 'documents' ? 'overflow-hidden' : undefined}>
<DataTable<unknown, unknown>
columns={getCurrentColumns()}
data={getCurrentData()}
perPage={perPage}
currentPage={page}
totalPages={insights.totalPages}
onPaginationChange={onPaginationChange}
>
{(table) => <DataTablePagination additionalInformation="VisibleCount" table={table} />}
</DataTable>
</div>
{isLoading && (
<div className="absolute inset-0 flex items-center justify-center bg-white/50">
<Loader className="h-8 w-8 animate-spin text-gray-500" />
</div>
)}
</div>
);
};
const SummaryCard = ({
icon: Icon,
title,
value,
subtitle,
}: {
icon: React.ComponentType<{ className?: string }>;
title: string;
value: number;
subtitle?: string;
}) => (
<div className="bg-card flex items-start gap-x-2 rounded-lg border px-4 py-3">
<Icon className="text-muted-foreground h-4 w-4 items-start" />
<div className="-mt-0.5 space-y-2">
<p className="text-muted-foreground text-sm font-medium">{title}</p>
<p className="text-2xl font-bold">{value}</p>
{subtitle && <p className="text-muted-foreground text-xs">{subtitle}</p>}
</div>
</div>
);

View File

@ -56,7 +56,14 @@ export const UserOrganisationsTable = () => {
avatarFallback={row.original.name.slice(0, 1).toUpperCase()} avatarFallback={row.original.name.slice(0, 1).toUpperCase()}
primaryText={ primaryText={
<span className="text-foreground/80 font-semibold"> <span className="text-foreground/80 font-semibold">
{isPersonalLayoutMode ? _(msg`Personal`) : row.original.name} {isPersonalLayoutMode
? _(
msg({
message: `Personal`,
context: `Personal organisation (adjective)`,
}),
)
: row.original.name}
</span> </span>
} }
secondaryText={ secondaryText={

View File

@ -88,14 +88,12 @@ export default function Layout({ loaderData, params, matches }: Route.ComponentP
? { ? {
heading: msg`Organisation not found`, heading: msg`Organisation not found`,
subHeading: msg`404 Organisation not found`, subHeading: msg`404 Organisation not found`,
message: msg`The organisation you are looking for may have been removed, renamed or may have never message: msg`The organisation you are looking for may have been removed, renamed or may have never existed.`,
existed.`,
} }
: { : {
heading: msg`Team not found`, heading: msg`Team not found`,
subHeading: msg`404 Team not found`, subHeading: msg`404 Team not found`,
message: msg`The team you are looking for may have been removed, renamed or may have never message: msg`The team you are looking for may have been removed, renamed or may have never existed.`,
existed.`,
}, },
}} }}
primaryButton={ primaryButton={

View File

@ -114,13 +114,13 @@ export default function AdminLayout() {
variant="ghost" variant="ghost"
className={cn( className={cn(
'justify-start md:w-full', 'justify-start md:w-full',
pathname?.startsWith('/admin/leaderboard') && 'bg-secondary', pathname?.startsWith('/admin/organisation-insights') && 'bg-secondary',
)} )}
asChild asChild
> >
<Link to="/admin/leaderboard"> <Link to="/admin/organisation-insights">
<Trophy className="mr-2 h-5 w-5" /> <Trophy className="mr-2 h-5 w-5" />
<Trans>Leaderboard</Trans> <Trans>Organisation Insights</Trans>
</Link> </Link>
</Button> </Button>
@ -128,7 +128,7 @@ export default function AdminLayout() {
variant="ghost" variant="ghost"
className={cn( className={cn(
'justify-start md:w-full', 'justify-start md:w-full',
pathname?.startsWith('/admin/banner') && 'bg-secondary', pathname?.startsWith('/admin/site-settings') && 'bg-secondary',
)} )}
asChild asChild
> >

View File

@ -1,77 +0,0 @@
import { Trans } from '@lingui/react/macro';
import { getSigningVolume } from '@documenso/lib/server-only/admin/get-signing-volume';
import {
AdminLeaderboardTable,
type SigningVolume,
} from '~/components/tables/admin-leaderboard-table';
import type { Route } from './+types/leaderboard';
export async function loader({ request }: Route.LoaderArgs) {
const url = new URL(request.url);
const rawSortBy = url.searchParams.get('sortBy') || 'signingVolume';
const rawSortOrder = url.searchParams.get('sortOrder') || 'desc';
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
const sortOrder = (['asc', 'desc'].includes(rawSortOrder) ? rawSortOrder : 'desc') as
| 'asc'
| 'desc';
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
const sortBy = (
['name', 'createdAt', 'signingVolume'].includes(rawSortBy) ? rawSortBy : 'signingVolume'
) as 'name' | 'createdAt' | 'signingVolume';
const page = Number(url.searchParams.get('page')) || 1;
const perPage = Number(url.searchParams.get('perPage')) || 10;
const search = url.searchParams.get('search') || '';
const { leaderboard, totalPages } = await getSigningVolume({
search,
page,
perPage,
sortBy,
sortOrder,
});
const typedSigningVolume: SigningVolume[] = leaderboard.map((item) => ({
...item,
name: item.name || '',
createdAt: item.createdAt || new Date(),
}));
return {
signingVolume: typedSigningVolume,
totalPages,
page,
perPage,
sortBy,
sortOrder,
};
}
export default function Leaderboard({ loaderData }: Route.ComponentProps) {
const { signingVolume, totalPages, page, perPage, sortBy, sortOrder } = loaderData;
return (
<div>
<div className="flex items-center">
<h2 className="text-4xl font-semibold">
<Trans>Signing Volume</Trans>
</h2>
</div>
<div className="mt-8">
<AdminLeaderboardTable
signingVolume={signingVolume}
totalPages={totalPages}
page={page}
perPage={perPage}
sortBy={sortBy}
sortOrder={sortOrder}
/>
</div>
</div>
);
}

View File

@ -0,0 +1,59 @@
import { getOrganisationDetailedInsights } from '@documenso/lib/server-only/admin/get-organisation-detailed-insights';
import type { DateRange } from '@documenso/lib/types/search-params';
import { getAdminOrganisation } from '@documenso/trpc/server/admin-router/get-admin-organisation';
import { OrganisationInsightsTable } from '~/components/tables/organisation-insights-table';
import type { Route } from './+types/organisation-insights.$id';
export async function loader({ params, request }: Route.LoaderArgs) {
const { id } = params;
const url = new URL(request.url);
const page = Number(url.searchParams.get('page')) || 1;
const perPage = Number(url.searchParams.get('perPage')) || 10;
const dateRange = (url.searchParams.get('dateRange') || 'last30days') as DateRange;
const view = (url.searchParams.get('view') || 'teams') as 'teams' | 'users' | 'documents';
const [insights, organisation] = await Promise.all([
getOrganisationDetailedInsights({
organisationId: id,
page,
perPage,
dateRange,
view,
}),
getAdminOrganisation({ organisationId: id }),
]);
return {
organisationId: id,
organisationName: organisation.name,
insights,
page,
perPage,
dateRange,
view,
};
}
export default function OrganisationInsights({ loaderData }: Route.ComponentProps) {
const { insights, page, perPage, dateRange, view, organisationName } = loaderData;
return (
<div>
<div className="flex items-center justify-between">
<h2 className="text-4xl font-semibold">{organisationName}</h2>
</div>
<div className="mt-8">
<OrganisationInsightsTable
insights={insights}
page={page}
perPage={perPage}
dateRange={dateRange}
view={view}
/>
</div>
</div>
);
}

View File

@ -0,0 +1,91 @@
import { Trans } from '@lingui/react/macro';
import { getOrganisationInsights } from '@documenso/lib/server-only/admin/get-signing-volume';
import type { DateRange } from '@documenso/lib/types/search-params';
import { DateRangeFilter } from '~/components/filters/date-range-filter';
import {
AdminOrganisationOverviewTable,
type OrganisationOverview,
} from '~/components/tables/admin-organisation-overview-table';
import type { Route } from './+types/organisation-insights._index';
export async function loader({ request }: Route.LoaderArgs) {
const url = new URL(request.url);
const rawSortBy = url.searchParams.get('sortBy') || 'signingVolume';
const rawSortOrder = url.searchParams.get('sortOrder') || 'desc';
const isSortOrder = (value: string): value is 'asc' | 'desc' =>
value === 'asc' || value === 'desc';
const isSortBy = (value: string): value is 'name' | 'createdAt' | 'signingVolume' =>
value === 'name' || value === 'createdAt' || value === 'signingVolume';
const sortOrder: 'asc' | 'desc' = isSortOrder(rawSortOrder) ? rawSortOrder : 'desc';
const sortBy: 'name' | 'createdAt' | 'signingVolume' = isSortBy(rawSortBy)
? rawSortBy
: 'signingVolume';
const page = Number(url.searchParams.get('page')) || 1;
const perPage = Number(url.searchParams.get('perPage')) || 10;
const search = url.searchParams.get('search') || '';
const dateRange = (url.searchParams.get('dateRange') || 'last30days') as DateRange;
const { organisations, totalPages } = await getOrganisationInsights({
search,
page,
perPage,
sortBy,
sortOrder,
dateRange,
});
const typedOrganisations: OrganisationOverview[] = organisations.map((item) => ({
id: String(item.id),
name: item.name || '',
signingVolume: item.signingVolume,
createdAt: item.createdAt || new Date(),
customerId: item.customerId || '',
subscriptionStatus: item.subscriptionStatus,
teamCount: item.teamCount || 0,
memberCount: item.memberCount || 0,
}));
return {
organisations: typedOrganisations,
totalPages,
page,
perPage,
sortBy,
sortOrder,
dateRange,
};
}
export default function Organisations({ loaderData }: Route.ComponentProps) {
const { organisations, totalPages, page, perPage, sortBy, sortOrder, dateRange } = loaderData;
return (
<div>
<div className="flex items-center justify-between">
<h2 className="text-4xl font-semibold">
<Trans>Organisation Insights</Trans>
</h2>
<DateRangeFilter currentRange={dateRange} />
</div>
<div className="mt-8">
<AdminOrganisationOverviewTable
organisations={organisations}
totalPages={totalPages}
page={page}
perPage={perPage}
sortBy={sortBy}
sortOrder={sortOrder}
dateRange={dateRange}
/>
</div>
</div>
);
}

View File

@ -142,8 +142,7 @@ export default function OrganisationGroupSettingsPage({ params }: Route.Componen
404: { 404: {
heading: msg`Organisation not found`, heading: msg`Organisation not found`,
subHeading: msg`404 Organisation not found`, subHeading: msg`404 Organisation not found`,
message: msg`The organisation you are looking for may have been removed, renamed or may have never message: msg`The organisation you are looking for may have been removed, renamed or may have never existed.`,
existed.`,
}, },
}} }}
primaryButton={ primaryButton={

View File

@ -59,8 +59,7 @@ export default function UserPage({ params }: { params: { id: number } }) {
404: { 404: {
heading: msg`User not found`, heading: msg`User not found`,
subHeading: msg`404 User not found`, subHeading: msg`404 User not found`,
message: msg`The user you are looking for may have been removed, renamed or may have never message: msg`The user you are looking for may have been removed, renamed or may have never existed.`,
existed.`,
}, },
}} }}
primaryButton={ primaryButton={

View File

@ -117,8 +117,7 @@ export default function OrganisationEmailDomainSettingsPage({ params }: Route.Co
404: { 404: {
heading: msg`Email domain not found`, heading: msg`Email domain not found`,
subHeading: msg`404 Email domain not found`, subHeading: msg`404 Email domain not found`,
message: msg`The email domain you are looking for may have been removed, renamed or may have never message: msg`The email domain you are looking for may have been removed, renamed or may have never existed.`,
existed.`,
}, },
}} }}
primaryButton={ primaryButton={

View File

@ -89,8 +89,7 @@ export default function OrganisationGroupSettingsPage({ params }: Route.Componen
404: { 404: {
heading: msg`Organisation group not found`, heading: msg`Organisation group not found`,
subHeading: msg`404 Organisation group not found`, subHeading: msg`404 Organisation group not found`,
message: msg`The organisation group you are looking for may have been removed, renamed or may have never message: msg`The organisation group you are looking for may have been removed, renamed or may have never existed.`,
existed.`,
}, },
}} }}
primaryButton={ primaryButton={

View File

@ -60,8 +60,7 @@ export default function Layout() {
404: { 404: {
heading: msg`Team not found`, heading: msg`Team not found`,
subHeading: msg`404 Team not found`, subHeading: msg`404 Team not found`,
message: msg`The team you are looking for may have been removed, renamed or may have never message: msg`The team you are looking for may have been removed, renamed or may have never existed.`,
existed.`,
}, },
}} }}
primaryButton={ primaryButton={

View File

@ -71,8 +71,7 @@ export default function DocumentPage({ params }: Route.ComponentProps) {
404: { 404: {
heading: msg`Not found`, heading: msg`Not found`,
subHeading: msg`404 Not found`, subHeading: msg`404 Not found`,
message: msg`The document you are looking for may have been removed, renamed or may have never message: msg`The document you are looking for may have been removed, renamed or may have never existed.`,
existed.`,
}, },
}} }}
primaryButton={ primaryButton={
@ -127,7 +126,11 @@ export default function DocumentPage({ params }: Route.ComponentProps) {
position="bottom" position="bottom"
> >
<span> <span>
<Trans>{envelope.recipients.length} Recipient(s)</Trans> <Plural
value={envelope.recipients.length}
one="# Recipient"
other="# Recipients"
/>
</span> </span>
</StackAvatarsWithTooltip> </StackAvatarsWithTooltip>
</div> </div>

View File

@ -82,8 +82,7 @@ export default function EnvelopeEditorPage({ params }: Route.ComponentProps) {
404: { 404: {
heading: msg`Not found`, heading: msg`Not found`,
subHeading: msg`404 Not found`, subHeading: msg`404 Not found`,
message: msg`The document you are looking for may have been removed, renamed or may have never message: msg`The document you are looking for may have been removed, renamed or may have never existed.`,
existed.`,
}, },
}} }}
primaryButton={ primaryButton={

View File

@ -1,6 +1,7 @@
import { useEffect, useMemo, useState } from 'react'; import { useEffect, useMemo, useState } from 'react';
import { Trans } from '@lingui/react/macro'; import { Trans } from '@lingui/react/macro';
import { EnvelopeType } from '@prisma/client';
import { FolderType, OrganisationType } from '@prisma/client'; import { FolderType, OrganisationType } from '@prisma/client';
import { useParams, useSearchParams } from 'react-router'; import { useParams, useSearchParams } from 'react-router';
import { Link } from 'react-router'; import { Link } from 'react-router';
@ -18,9 +19,9 @@ import { Avatar, AvatarFallback, AvatarImage } from '@documenso/ui/primitives/av
import { Tabs, TabsList, TabsTrigger } from '@documenso/ui/primitives/tabs'; import { Tabs, TabsList, TabsTrigger } from '@documenso/ui/primitives/tabs';
import { DocumentMoveToFolderDialog } from '~/components/dialogs/document-move-to-folder-dialog'; import { DocumentMoveToFolderDialog } from '~/components/dialogs/document-move-to-folder-dialog';
import { DocumentDropZoneWrapper } from '~/components/general/document/document-drop-zone-wrapper';
import { DocumentSearch } from '~/components/general/document/document-search'; import { DocumentSearch } from '~/components/general/document/document-search';
import { DocumentStatus } from '~/components/general/document/document-status'; import { DocumentStatus } from '~/components/general/document/document-status';
import { EnvelopeDropZoneWrapper } from '~/components/general/envelope/envelope-drop-zone-wrapper';
import { FolderGrid } from '~/components/general/folder/folder-grid'; import { FolderGrid } from '~/components/general/folder/folder-grid';
import { PeriodSelector } from '~/components/general/period-selector'; import { PeriodSelector } from '~/components/general/period-selector';
import { DocumentsTable } from '~/components/tables/documents-table'; import { DocumentsTable } from '~/components/tables/documents-table';
@ -108,9 +109,8 @@ export default function DocumentsPage() {
} }
}, [data?.stats]); }, [data?.stats]);
// Todo: Envelopes - Change the dropzone wrapper to create to V2 documents after we're ready.
return ( return (
<DocumentDropZoneWrapper> <EnvelopeDropZoneWrapper type={EnvelopeType.DOCUMENT}>
<div className="mx-auto w-full max-w-screen-xl px-4 md:px-8"> <div className="mx-auto w-full max-w-screen-xl px-4 md:px-8">
<FolderGrid type={FolderType.DOCUMENT} parentId={folderId ?? null} /> <FolderGrid type={FolderType.DOCUMENT} parentId={folderId ?? null} />
@ -210,6 +210,6 @@ export default function DocumentsPage() {
/> />
)} )}
</div> </div>
</DocumentDropZoneWrapper> </EnvelopeDropZoneWrapper>
); );
} }

View File

@ -109,8 +109,7 @@ export default function WebhookPage({ params }: Route.ComponentProps) {
404: { 404: {
heading: msg`Webhook not found`, heading: msg`Webhook not found`,
subHeading: msg`404 Webhook not found`, subHeading: msg`404 Webhook not found`,
message: msg`The webhook you are looking for may have been removed, renamed or may have never message: msg`The webhook you are looking for may have been removed, renamed or may have never existed.`,
existed.`,
}, },
}} }}
primaryButton={ primaryButton={

View File

@ -66,8 +66,7 @@ export default function TemplatePage({ params }: Route.ComponentProps) {
404: { 404: {
heading: msg`Not found`, heading: msg`Not found`,
subHeading: msg`404 Not found`, subHeading: msg`404 Not found`,
message: msg`The template you are looking for may have been removed, renamed or may have never message: msg`The template you are looking for may have been removed, renamed or may have never existed.`,
existed.`,
}, },
}} }}
primaryButton={ primaryButton={

View File

@ -1,4 +1,5 @@
import { Trans } from '@lingui/react/macro'; import { Trans } from '@lingui/react/macro';
import { EnvelopeType } from '@prisma/client';
import { Bird } from 'lucide-react'; import { Bird } from 'lucide-react';
import { useParams, useSearchParams } from 'react-router'; import { useParams, useSearchParams } from 'react-router';
@ -8,8 +9,8 @@ import { formatDocumentsPath, formatTemplatesPath } from '@documenso/lib/utils/t
import { trpc } from '@documenso/trpc/react'; import { trpc } from '@documenso/trpc/react';
import { Avatar, AvatarFallback, AvatarImage } from '@documenso/ui/primitives/avatar'; import { Avatar, AvatarFallback, AvatarImage } from '@documenso/ui/primitives/avatar';
import { EnvelopeDropZoneWrapper } from '~/components/general/envelope/envelope-drop-zone-wrapper';
import { FolderGrid } from '~/components/general/folder/folder-grid'; import { FolderGrid } from '~/components/general/folder/folder-grid';
import { TemplateDropZoneWrapper } from '~/components/general/template/template-drop-zone-wrapper';
import { TemplatesTable } from '~/components/tables/templates-table'; import { TemplatesTable } from '~/components/tables/templates-table';
import { useCurrentTeam } from '~/providers/team'; import { useCurrentTeam } from '~/providers/team';
import { appMetaTags } from '~/utils/meta'; import { appMetaTags } from '~/utils/meta';
@ -37,7 +38,7 @@ export default function TemplatesPage() {
}); });
return ( return (
<TemplateDropZoneWrapper> <EnvelopeDropZoneWrapper type={EnvelopeType.TEMPLATE}>
<div className="mx-auto max-w-screen-xl px-4 md:px-8"> <div className="mx-auto max-w-screen-xl px-4 md:px-8">
<FolderGrid type={FolderType.TEMPLATE} parentId={folderId ?? null} /> <FolderGrid type={FolderType.TEMPLATE} parentId={folderId ?? null} />
@ -85,6 +86,6 @@ export default function TemplatesPage() {
</div> </div>
</div> </div>
</div> </div>
</TemplateDropZoneWrapper> </EnvelopeDropZoneWrapper>
); );
} }

View File

@ -106,5 +106,5 @@
"vite-plugin-babel-macros": "^1.0.6", "vite-plugin-babel-macros": "^1.0.6",
"vite-tsconfig-paths": "^5.1.4" "vite-tsconfig-paths": "^5.1.4"
}, },
"version": "2.0.6" "version": "2.0.11"
} }

View File

@ -21,7 +21,7 @@ export const downloadRoute = new Hono<HonoEnv>()
* Requires API key authentication via Authorization header. * Requires API key authentication via Authorization header.
*/ */
.get( .get(
'/envelopeItem/:envelopeItemId/download', '/envelope/item/:envelopeItemId/download',
sValidator('param', ZDownloadEnvelopeItemRequestParamsSchema), sValidator('param', ZDownloadEnvelopeItemRequestParamsSchema),
async (c) => { async (c) => {
const logger = c.get('logger'); const logger = c.get('logger');

View File

@ -2,12 +2,19 @@ import { lingui } from '@lingui/vite-plugin';
import { reactRouter } from '@react-router/dev/vite'; import { reactRouter } from '@react-router/dev/vite';
import autoprefixer from 'autoprefixer'; import autoprefixer from 'autoprefixer';
import serverAdapter from 'hono-react-router-adapter/vite'; import serverAdapter from 'hono-react-router-adapter/vite';
import { createRequire } from 'node:module';
import path from 'node:path'; import path from 'node:path';
import tailwindcss from 'tailwindcss'; import tailwindcss from 'tailwindcss';
import { defineConfig } from 'vite'; import { defineConfig, normalizePath } from 'vite';
import macrosPlugin from 'vite-plugin-babel-macros'; import macrosPlugin from 'vite-plugin-babel-macros';
import { viteStaticCopy } from 'vite-plugin-static-copy';
import tsconfigPaths from 'vite-tsconfig-paths'; import tsconfigPaths from 'vite-tsconfig-paths';
const require = createRequire(import.meta.url);
const pdfjsDistPath = path.dirname(require.resolve('pdfjs-dist/package.json'));
const cMapsDir = normalizePath(path.join(pdfjsDistPath, 'cmaps'));
/** /**
* Note: We load the env variables externally so we can have runtime enviroment variables * Note: We load the env variables externally so we can have runtime enviroment variables
* for docker. * for docker.
@ -25,6 +32,14 @@ export default defineConfig({
strictPort: true, strictPort: true,
}, },
plugins: [ plugins: [
viteStaticCopy({
targets: [
{
src: cMapsDir,
dest: 'static',
},
],
}),
reactRouter(), reactRouter(),
macrosPlugin(), macrosPlugin(),
lingui(), lingui(),

View File

@ -4,6 +4,7 @@
FROM node:22-alpine3.20 AS base FROM node:22-alpine3.20 AS base
RUN apk add --no-cache openssl RUN apk add --no-cache openssl
RUN apk add --no-cache font-freefont
########################### ###########################
@ -114,4 +115,4 @@ COPY --chown=nodejs:nodejs ./docker/start.sh /app/apps/remix/start.sh
WORKDIR /app/apps/remix WORKDIR /app/apps/remix
CMD ["sh", "start.sh"] CMD ["sh", "start.sh"]

102
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "@documenso/root", "name": "@documenso/root",
"version": "2.0.6", "version": "2.0.11",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@documenso/root", "name": "@documenso/root",
"version": "2.0.6", "version": "2.0.11",
"workspaces": [ "workspaces": [
"apps/*", "apps/*",
"packages/*" "packages/*"
@ -52,6 +52,7 @@
"trpc-to-openapi": "2.4.0", "trpc-to-openapi": "2.4.0",
"turbo": "^1.9.3", "turbo": "^1.9.3",
"vite": "^6.3.5", "vite": "^6.3.5",
"vite-plugin-static-copy": "^3.1.4",
"zod-openapi": "^4.2.4", "zod-openapi": "^4.2.4",
"zod-prisma-types": "3.3.5" "zod-prisma-types": "3.3.5"
}, },
@ -100,7 +101,7 @@
}, },
"apps/remix": { "apps/remix": {
"name": "@documenso/remix", "name": "@documenso/remix",
"version": "2.0.6", "version": "2.0.11",
"dependencies": { "dependencies": {
"@cantoo/pdf-lib": "^2.5.2", "@cantoo/pdf-lib": "^2.5.2",
"@documenso/api": "*", "@documenso/api": "*",
@ -19112,10 +19113,13 @@
} }
}, },
"node_modules/fdir": { "node_modules/fdir": {
"version": "6.4.4", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
"integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"license": "MIT", "license": "MIT",
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": { "peerDependencies": {
"picomatch": "^3 || ^4" "picomatch": "^3 || ^4"
}, },
@ -33479,13 +33483,13 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/tinyglobby": { "node_modules/tinyglobby": {
"version": "0.2.13", "version": "0.2.15",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
"integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"fdir": "^6.4.4", "fdir": "^6.5.0",
"picomatch": "^4.0.2" "picomatch": "^4.0.3"
}, },
"engines": { "engines": {
"node": ">=12.0.0" "node": ">=12.0.0"
@ -33495,9 +33499,9 @@
} }
}, },
"node_modules/tinyglobby/node_modules/picomatch": { "node_modules/tinyglobby/node_modules/picomatch": {
"version": "4.0.2", "version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
@ -35944,6 +35948,76 @@
"vite": ">=2" "vite": ">=2"
} }
}, },
"node_modules/vite-plugin-static-copy": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-3.1.4.tgz",
"integrity": "sha512-iCmr4GSw4eSnaB+G8zc2f4dxSuDjbkjwpuBLLGvQYR9IW7rnDzftnUjOH5p4RYR+d4GsiBqXRvzuFhs5bnzVyw==",
"dev": true,
"license": "MIT",
"dependencies": {
"chokidar": "^3.6.0",
"p-map": "^7.0.3",
"picocolors": "^1.1.1",
"tinyglobby": "^0.2.15"
},
"engines": {
"node": "^18.0.0 || >=20.0.0"
},
"peerDependencies": {
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
}
},
"node_modules/vite-plugin-static-copy/node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/vite-plugin-static-copy/node_modules/p-map": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz",
"integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/vite-plugin-static-copy/node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/vite-tsconfig-paths": { "node_modules/vite-tsconfig-paths": {
"version": "5.1.4", "version": "5.1.4",
"resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz",

View File

@ -1,6 +1,6 @@
{ {
"private": true, "private": true,
"version": "2.0.6", "version": "2.0.11",
"scripts": { "scripts": {
"build": "turbo run build", "build": "turbo run build",
"dev": "turbo run dev --filter=@documenso/remix", "dev": "turbo run dev --filter=@documenso/remix",
@ -45,6 +45,12 @@
"@commitlint/config-conventional": "^17.7.0", "@commitlint/config-conventional": "^17.7.0",
"@lingui/cli": "^5.2.0", "@lingui/cli": "^5.2.0",
"@prisma/client": "^6.18.0", "@prisma/client": "^6.18.0",
"@trpc/client": "11.7.0",
"@trpc/react-query": "11.7.0",
"@trpc/server": "11.7.0",
"@ts-rest/core": "^3.52.1",
"@ts-rest/open-api": "^3.52.1",
"@ts-rest/serverless": "^3.52.1",
"dotenv": "^16.5.0", "dotenv": "^16.5.0",
"dotenv-cli": "^8.0.0", "dotenv-cli": "^8.0.0",
"eslint": "^8.40.0", "eslint": "^8.40.0",
@ -59,18 +65,13 @@
"prisma-json-types-generator": "^3.6.2", "prisma-json-types-generator": "^3.6.2",
"prisma-kysely": "^1.8.0", "prisma-kysely": "^1.8.0",
"rimraf": "^5.0.1", "rimraf": "^5.0.1",
"turbo": "^1.9.3",
"@trpc/client": "11.7.0",
"@trpc/react-query": "11.7.0",
"@trpc/server": "11.7.0",
"superjson": "^2.2.5", "superjson": "^2.2.5",
"trpc-to-openapi": "2.4.0", "trpc-to-openapi": "2.4.0",
"turbo": "^1.9.3",
"vite": "^6.3.5",
"vite-plugin-static-copy": "^3.1.4",
"zod-openapi": "^4.2.4", "zod-openapi": "^4.2.4",
"@ts-rest/core": "^3.52.1", "zod-prisma-types": "3.3.5"
"@ts-rest/open-api": "^3.52.1",
"@ts-rest/serverless": "^3.52.1",
"zod-prisma-types": "3.3.5",
"vite": "^6.3.5"
}, },
"name": "@documenso/root", "name": "@documenso/root",
"workspaces": [ "workspaces": [

View File

@ -9,6 +9,7 @@ import { seedTeamMember } from '@documenso/prisma/seed/teams';
import { seedBlankTemplate } from '@documenso/prisma/seed/templates'; import { seedBlankTemplate } from '@documenso/prisma/seed/templates';
import { apiSignin } from '../fixtures/authentication'; import { apiSignin } from '../fixtures/authentication';
import { expectTextToBeVisible } from '../fixtures/generic';
test.describe.configure({ mode: 'parallel' }); test.describe.configure({ mode: 'parallel' });
@ -81,20 +82,23 @@ test('[TEAMS]: can create a document inside a document folder', async ({ page })
redirectPath: `/t/${team.url}/documents/f/${teamFolder.id}`, redirectPath: `/t/${team.url}/documents/f/${teamFolder.id}`,
}); });
const fileInput = page.locator('input[type="file"]').nth(1); // Upload document.
await fileInput.waitFor({ state: 'attached' }); const [fileChooser] = await Promise.all([
page.waitForEvent('filechooser'),
page.getByRole('button', { name: 'Document (Legacy)' }).click(),
]);
await fileInput.setInputFiles( await fileChooser.setFiles(
path.join(__dirname, '../../../assets/documenso-supporter-pledge.pdf'), path.join(__dirname, '../../../assets/documenso-supporter-pledge.pdf'),
); );
await page.waitForTimeout(3000); await page.waitForTimeout(3000);
await expect(page.getByText('documenso-supporter-pledge.pdf')).toBeVisible(); await expectTextToBeVisible(page, 'documenso-supporter-pledge.pdf');
await page.goto(`/t/${team.url}/documents/f/${teamFolder.id}`); await page.goto(`/t/${team.url}/documents/f/${teamFolder.id}`);
await expect(page.getByText('documenso-supporter-pledge.pdf')).toBeVisible(); await expectTextToBeVisible(page, 'documenso-supporter-pledge.pdf');
}); });
test('[TEAMS]: can pin a document folder', async ({ page }) => { test('[TEAMS]: can pin a document folder', async ({ page }) => {
@ -368,7 +372,7 @@ test('[TEAMS]: can create a template inside a template folder', async ({ page })
await expect(page.getByText('Team Client Templates')).toBeVisible(); await expect(page.getByText('Team Client Templates')).toBeVisible();
await page.getByRole('button', { name: 'New Template' }).click(); await page.getByRole('button', { name: 'Template (Legacy)' }).click();
await page.getByText('Upload Template Document').click(); await page.getByText('Upload Template Document').click();
@ -382,11 +386,11 @@ test('[TEAMS]: can create a template inside a template folder', async ({ page })
await page.waitForTimeout(3000); await page.waitForTimeout(3000);
// Expect redirect. // Expect redirect.
await expect(page.getByText('documenso-supporter-pledge.pdf')).toBeVisible(); await expectTextToBeVisible(page, 'documenso-supporter-pledge.pdf');
// Return to folder and verify file is visible. // Return to folder and verify file is visible.
await page.goto(`/t/${team.url}/templates/f/${folder.id}`); await page.goto(`/t/${team.url}/templates/f/${folder.id}`);
await expect(page.getByText('documenso-supporter-pledge.pdf')).toBeVisible(); await expectTextToBeVisible(page, 'documenso-supporter-pledge.pdf');
}); });
test('[TEAMS]: can pin a template folder', async ({ page }) => { test('[TEAMS]: can pin a template folder', async ({ page }) => {
@ -842,7 +846,7 @@ test('[TEAMS]: documents inherit folder visibility', async ({ page }) => {
// Upload document. // Upload document.
const [fileChooser] = await Promise.all([ const [fileChooser] = await Promise.all([
page.waitForEvent('filechooser'), page.waitForEvent('filechooser'),
page.getByRole('button', { name: 'Upload Document' }).click(), page.getByRole('button', { name: 'Document (Legacy)' }).click(),
]); ]);
await fileChooser.setFiles( await fileChooser.setFiles(
@ -851,7 +855,7 @@ test('[TEAMS]: documents inherit folder visibility', async ({ page }) => {
await page.waitForTimeout(3000); await page.waitForTimeout(3000);
await expect(page.getByText('documenso-supporter-pledge.pdf')).toBeVisible(); await expectTextToBeVisible(page, 'documenso-supporter-pledge.pdf');
await expect(page.getByRole('combobox').filter({ hasText: 'Admins only' })).toBeVisible(); await expect(page.getByRole('combobox').filter({ hasText: 'Admins only' })).toBeVisible();
}); });

View File

@ -1,4 +1,4 @@
import { Trans } from '@lingui/react/macro'; import { Plural, Trans } from '@lingui/react/macro';
import { Heading, Img, Section, Text } from '../components'; import { Heading, Img, Section, Text } from '../components';
@ -46,7 +46,11 @@ export const TemplateAccessAuth2FA = ({
</Section> </Section>
<Text className="mt-4 text-center text-sm text-slate-600"> <Text className="mt-4 text-center text-sm text-slate-600">
<Trans>This code will expire in {expiresInMinutes} minutes.</Trans> <Plural
value={expiresInMinutes}
one="This code will expire in # minute."
other="This code will expire in # minutes."
/>
</Text> </Text>
<Text className="mt-4 text-center text-sm text-slate-500"> <Text className="mt-4 text-center text-sm text-slate-500">

View File

@ -15,5 +15,3 @@ export const API_V2_BETA_URL = '/api/v2-beta';
export const API_V2_URL = '/api/v2'; export const API_V2_URL = '/api/v2';
export const SUPPORT_EMAIL = env('NEXT_PUBLIC_SUPPORT_EMAIL') ?? 'support@documenso.com'; export const SUPPORT_EMAIL = env('NEXT_PUBLIC_SUPPORT_EMAIL') ?? 'support@documenso.com';
export const IS_ENVELOPES_ENABLED = env('NEXT_PUBLIC_FEATURE_ENVELOPES_ENABLED') === 'true';

View File

@ -0,0 +1,363 @@
import type { DocumentStatus } from '@prisma/client';
import { EnvelopeType } from '@prisma/client';
import type { DateRange } from '@documenso/lib/types/search-params';
import { kyselyPrisma, sql } from '@documenso/prisma';
export type OrganisationSummary = {
totalTeams: number;
totalMembers: number;
totalDocuments: number;
activeDocuments: number;
completedDocuments: number;
volumeThisPeriod: number;
volumeAllTime: number;
};
export type OrganisationDetailedInsights = {
teams: TeamInsights[];
users: UserInsights[];
documents: DocumentInsights[];
totalPages: number;
summary?: OrganisationSummary;
};
export type TeamInsights = {
id: number;
name: string;
memberCount: number;
documentCount: number;
createdAt: Date;
};
export type UserInsights = {
id: number;
name: string;
email: string;
documentCount: number;
signedDocumentCount: number;
createdAt: Date;
};
export type DocumentInsights = {
id: string;
title: string;
status: DocumentStatus;
teamName: string;
createdAt: Date;
completedAt: Date | null;
};
export type GetOrganisationDetailedInsightsOptions = {
organisationId: string;
page?: number;
perPage?: number;
dateRange?: DateRange;
view: 'teams' | 'users' | 'documents';
};
export async function getOrganisationDetailedInsights({
organisationId,
page = 1,
perPage = 10,
dateRange = 'last30days',
view,
}: GetOrganisationDetailedInsightsOptions): Promise<OrganisationDetailedInsights> {
const offset = Math.max(page - 1, 0) * perPage;
const now = new Date();
let createdAtFrom: Date | null = null;
switch (dateRange) {
case 'last30days': {
createdAtFrom = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
break;
}
case 'last90days': {
createdAtFrom = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);
break;
}
case 'lastYear': {
createdAtFrom = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate());
break;
}
case 'allTime':
default:
createdAtFrom = null;
break;
}
const summaryData = await getOrganisationSummary(organisationId, createdAtFrom);
const viewData = await (async () => {
switch (view) {
case 'teams':
return await getTeamInsights(organisationId, offset, perPage, createdAtFrom);
case 'users':
return await getUserInsights(organisationId, offset, perPage, createdAtFrom);
case 'documents':
return await getDocumentInsights(organisationId, offset, perPage, createdAtFrom);
default:
throw new Error(`Invalid view: ${view}`);
}
})();
return {
...viewData,
summary: summaryData,
};
}
async function getTeamInsights(
organisationId: string,
offset: number,
perPage: number,
createdAtFrom: Date | null,
): Promise<OrganisationDetailedInsights> {
const teamsQuery = kyselyPrisma.$kysely
.selectFrom('Team as t')
.leftJoin('Envelope as e', (join) =>
join
.onRef('t.id', '=', 'e.teamId')
.on('e.deletedAt', 'is', null)
.on('e.type', '=', sql.lit(EnvelopeType.DOCUMENT)),
)
.leftJoin('TeamGroup as tg', 'tg.teamId', 't.id')
.leftJoin('OrganisationGroup as og', 'og.id', 'tg.organisationGroupId')
.leftJoin('OrganisationGroupMember as ogm', 'ogm.groupId', 'og.id')
.leftJoin('OrganisationMember as om', 'om.id', 'ogm.organisationMemberId')
.where('t.organisationId', '=', organisationId)
.select([
't.id as id',
't.name as name',
't.createdAt as createdAt',
sql<number>`COUNT(DISTINCT om."userId")`.as('memberCount'),
(createdAtFrom
? sql<number>`COUNT(DISTINCT CASE WHEN e.id IS NOT NULL AND e."createdAt" >= ${createdAtFrom} THEN e.id END)`
: sql<number>`COUNT(DISTINCT e.id)`
).as('documentCount'),
])
.groupBy(['t.id', 't.name', 't.createdAt'])
.orderBy('documentCount', 'desc')
.limit(perPage)
.offset(offset);
const countQuery = kyselyPrisma.$kysely
.selectFrom('Team as t')
.where('t.organisationId', '=', organisationId)
.select(({ fn }) => [fn.countAll().as('count')]);
const [teams, countResult] = await Promise.all([teamsQuery.execute(), countQuery.execute()]);
const count = Number(countResult[0]?.count || 0);
return {
teams: teams as TeamInsights[],
users: [],
documents: [],
totalPages: Math.ceil(Number(count) / perPage),
};
}
async function getUserInsights(
organisationId: string,
offset: number,
perPage: number,
createdAtFrom: Date | null,
): Promise<OrganisationDetailedInsights> {
const usersBase = kyselyPrisma.$kysely
.selectFrom('OrganisationMember as om')
.innerJoin('User as u', 'u.id', 'om.userId')
.where('om.organisationId', '=', organisationId)
.leftJoin('Envelope as e', (join) =>
join
.onRef('e.userId', '=', 'u.id')
.on('e.deletedAt', 'is', null)
.on('e.type', '=', sql.lit(EnvelopeType.DOCUMENT)),
)
.leftJoin('Team as td', (join) =>
join.onRef('td.id', '=', 'e.teamId').on('td.organisationId', '=', organisationId),
)
.leftJoin('Recipient as r', (join) =>
join.onRef('r.email', '=', 'u.email').on('r.signedAt', 'is not', null),
)
.leftJoin('Envelope as se', (join) =>
join
.onRef('se.id', '=', 'r.envelopeId')
.on('se.deletedAt', 'is', null)
.on('se.type', '=', sql.lit(EnvelopeType.DOCUMENT)),
)
.leftJoin('Team as ts', (join) =>
join.onRef('ts.id', '=', 'se.teamId').on('ts.organisationId', '=', organisationId),
);
const usersQuery = usersBase
.select([
'u.id as id',
'u.name as name',
'u.email as email',
'u.createdAt as createdAt',
(createdAtFrom
? sql<number>`COUNT(DISTINCT CASE WHEN e.id IS NOT NULL AND td.id IS NOT NULL AND e."createdAt" >= ${createdAtFrom} THEN e.id END)`
: sql<number>`COUNT(DISTINCT CASE WHEN td.id IS NOT NULL THEN e.id END)`
).as('documentCount'),
(createdAtFrom
? sql<number>`COUNT(DISTINCT CASE WHEN e.id IS NOT NULL AND td.id IS NOT NULL AND e.status = 'COMPLETED' AND e."createdAt" >= ${createdAtFrom} THEN e.id END)`
: sql<number>`COUNT(DISTINCT CASE WHEN e.id IS NOT NULL AND td.id IS NOT NULL AND e.status = 'COMPLETED' THEN e.id END)`
).as('signedDocumentCount'),
])
.groupBy(['u.id', 'u.name', 'u.email', 'u.createdAt'])
.orderBy('u.createdAt', 'desc')
.limit(perPage)
.offset(offset);
const countQuery = kyselyPrisma.$kysely
.selectFrom('OrganisationMember as om')
.innerJoin('User as u', 'u.id', 'om.userId')
.where('om.organisationId', '=', organisationId)
.select(({ fn }) => [fn.countAll().as('count')]);
const [users, countResult] = await Promise.all([usersQuery.execute(), countQuery.execute()]);
const count = Number(countResult[0]?.count || 0);
return {
teams: [],
users: users as UserInsights[],
documents: [],
totalPages: Math.ceil(Number(count) / perPage),
};
}
async function getDocumentInsights(
organisationId: string,
offset: number,
perPage: number,
createdAtFrom: Date | null,
): Promise<OrganisationDetailedInsights> {
let documentsQuery = kyselyPrisma.$kysely
.selectFrom('Envelope as e')
.innerJoin('Team as t', 'e.teamId', 't.id')
.where('t.organisationId', '=', organisationId)
.where('e.deletedAt', 'is', null)
.where(() => sql`e.type = ${EnvelopeType.DOCUMENT}::"EnvelopeType"`);
if (createdAtFrom) {
documentsQuery = documentsQuery.where('e.createdAt', '>=', createdAtFrom);
}
documentsQuery = documentsQuery
.select([
'e.id as id',
'e.title as title',
'e.status as status',
'e.createdAt as createdAt',
'e.completedAt as completedAt',
't.name as teamName',
])
.orderBy('e.createdAt', 'desc')
.limit(perPage)
.offset(offset);
let countQuery = kyselyPrisma.$kysely
.selectFrom('Envelope as e')
.innerJoin('Team as t', 'e.teamId', 't.id')
.where('t.organisationId', '=', organisationId)
.where('e.deletedAt', 'is', null)
.where(() => sql`e.type = ${EnvelopeType.DOCUMENT}::"EnvelopeType"`);
if (createdAtFrom) {
countQuery = countQuery.where('e.createdAt', '>=', createdAtFrom);
}
countQuery = countQuery.select(({ fn }) => [fn.countAll().as('count')]);
const [documents, countResult] = await Promise.all([
documentsQuery.execute(),
countQuery.execute(),
]);
const count = Number((countResult[0] as { count: number })?.count || 0);
return {
teams: [],
users: [],
documents: documents.map((doc) => ({
...doc,
id: String((doc as { id: number }).id),
})) as DocumentInsights[],
totalPages: Math.ceil(Number(count) / perPage),
};
}
async function getOrganisationSummary(
organisationId: string,
createdAtFrom: Date | null,
): Promise<OrganisationSummary> {
const summaryQuery = kyselyPrisma.$kysely
.selectFrom('Organisation as o')
.where('o.id', '=', organisationId)
.select([
sql<number>`(SELECT COUNT(DISTINCT t2.id) FROM "Team" AS t2 WHERE t2."organisationId" = o.id)`.as(
'totalTeams',
),
sql<number>`(SELECT COUNT(DISTINCT om2."userId") FROM "OrganisationMember" AS om2 WHERE om2."organisationId" = o.id)`.as(
'totalMembers',
),
sql<number>`(
SELECT COUNT(DISTINCT e2.id)
FROM "Envelope" AS e2
INNER JOIN "Team" AS t2 ON t2.id = e2."teamId"
WHERE t2."organisationId" = o.id AND e2."deletedAt" IS NULL AND e2.type = 'DOCUMENT'
)`.as('totalDocuments'),
sql<number>`(
SELECT COUNT(DISTINCT e2.id)
FROM "Envelope" AS e2
INNER JOIN "Team" AS t2 ON t2.id = e2."teamId"
WHERE t2."organisationId" = o.id AND e2."deletedAt" IS NULL AND e2.type = 'DOCUMENT' AND e2.status IN ('DRAFT', 'PENDING')
)`.as('activeDocuments'),
sql<number>`(
SELECT COUNT(DISTINCT e2.id)
FROM "Envelope" AS e2
INNER JOIN "Team" AS t2 ON t2.id = e2."teamId"
WHERE t2."organisationId" = o.id AND e2."deletedAt" IS NULL AND e2.type = 'DOCUMENT' AND e2.status = 'COMPLETED'
)`.as('completedDocuments'),
(createdAtFrom
? sql<number>`(
SELECT COUNT(DISTINCT e2.id)
FROM "Envelope" AS e2
INNER JOIN "Team" AS t2 ON t2.id = e2."teamId"
WHERE t2."organisationId" = o.id
AND e2."deletedAt" IS NULL
AND e2.type = 'DOCUMENT'
AND e2.status = 'COMPLETED'
AND e2."createdAt" >= ${createdAtFrom}
)`
: sql<number>`(
SELECT COUNT(DISTINCT e2.id)
FROM "Envelope" AS e2
INNER JOIN "Team" AS t2 ON t2.id = e2."teamId"
WHERE t2."organisationId" = o.id
AND e2."deletedAt" IS NULL
AND e2.type = 'DOCUMENT'
AND e2.status = 'COMPLETED'
)`
).as('volumeThisPeriod'),
sql<number>`(
SELECT COUNT(DISTINCT e2.id)
FROM "Envelope" AS e2
INNER JOIN "Team" AS t2 ON t2.id = e2."teamId"
WHERE t2."organisationId" = o.id AND e2."deletedAt" IS NULL AND e2.type = 'DOCUMENT' AND e2.status = 'COMPLETED'
)`.as('volumeAllTime'),
]);
const result = await summaryQuery.executeTakeFirst();
return {
totalTeams: Number(result?.totalTeams || 0),
totalMembers: Number(result?.totalMembers || 0),
totalDocuments: Number(result?.totalDocuments || 0),
activeDocuments: Number(result?.activeDocuments || 0),
completedDocuments: Number(result?.completedDocuments || 0),
volumeThisPeriod: Number(result?.volumeThisPeriod || 0),
volumeAllTime: Number(result?.volumeAllTime || 0),
};
}

View File

@ -1,13 +1,17 @@
import { DocumentStatus, EnvelopeType, SubscriptionStatus } from '@prisma/client'; import { DocumentStatus, EnvelopeType } from '@prisma/client';
import type { DateRange } from '@documenso/lib/types/search-params';
import { kyselyPrisma, sql } from '@documenso/prisma'; import { kyselyPrisma, sql } from '@documenso/prisma';
export type SigningVolume = { export type OrganisationInsights = {
id: number; id: number;
name: string; name: string;
signingVolume: number; signingVolume: number;
createdAt: Date; createdAt: Date;
planId: string; customerId: string | null;
subscriptionStatus?: string;
teamCount?: number;
memberCount?: number;
}; };
export type GetSigningVolumeOptions = { export type GetSigningVolumeOptions = {
@ -28,28 +32,26 @@ export async function getSigningVolume({
const offset = Math.max(page - 1, 0) * perPage; const offset = Math.max(page - 1, 0) * perPage;
let findQuery = kyselyPrisma.$kysely let findQuery = kyselyPrisma.$kysely
.selectFrom('Subscription as s') .selectFrom('Organisation as o')
.innerJoin('Organisation as o', 's.organisationId', 'o.id')
.leftJoin('Team as t', 'o.id', 't.organisationId') .leftJoin('Team as t', 'o.id', 't.organisationId')
.leftJoin('Envelope as e', (join) => .leftJoin('Envelope as e', (join) =>
join join
.onRef('t.id', '=', 'e.teamId') .onRef('t.id', '=', 'e.teamId')
.on('e.status', '=', sql.lit(DocumentStatus.COMPLETED)) .on('e.status', '=', sql.lit(DocumentStatus.COMPLETED))
.on('e.deletedAt', 'is', null), .on('e.deletedAt', 'is', null)
.on('e.type', '=', sql.lit(EnvelopeType.DOCUMENT)),
) )
.where(sql`s.status = ${SubscriptionStatus.ACTIVE}::"SubscriptionStatus"`)
.where((eb) => .where((eb) =>
eb.or([eb('o.name', 'ilike', `%${search}%`), eb('t.name', 'ilike', `%${search}%`)]), eb.or([eb('o.name', 'ilike', `%${search}%`), eb('t.name', 'ilike', `%${search}%`)]),
) )
.where('e.type', '=', EnvelopeType.DOCUMENT)
.select([ .select([
's.id as id', 'o.id as id',
's.createdAt as createdAt', 'o.createdAt as createdAt',
's.planId as planId', 'o.customerId as customerId',
sql<string>`COALESCE(o.name, 'Unknown')`.as('name'), sql<string>`COALESCE(o.name, 'Unknown')`.as('name'),
sql<number>`COUNT(DISTINCT e.id)`.as('signingVolume'), sql<number>`COUNT(DISTINCT e.id)`.as('signingVolume'),
]) ])
.groupBy(['s.id', 'o.name']); .groupBy(['o.id', 'o.name', 'o.customerId']);
switch (sortBy) { switch (sortBy) {
case 'name': case 'name':
@ -68,19 +70,127 @@ export async function getSigningVolume({
findQuery = findQuery.limit(perPage).offset(offset); findQuery = findQuery.limit(perPage).offset(offset);
const countQuery = kyselyPrisma.$kysely const countQuery = kyselyPrisma.$kysely
.selectFrom('Subscription as s') .selectFrom('Organisation as o')
.innerJoin('Organisation as o', 's.organisationId', 'o.id')
.leftJoin('Team as t', 'o.id', 't.organisationId') .leftJoin('Team as t', 'o.id', 't.organisationId')
.where(sql`s.status = ${SubscriptionStatus.ACTIVE}::"SubscriptionStatus"`)
.where((eb) => .where((eb) =>
eb.or([eb('o.name', 'ilike', `%${search}%`), eb('t.name', 'ilike', `%${search}%`)]), eb.or([eb('o.name', 'ilike', `%${search}%`), eb('t.name', 'ilike', `%${search}%`)]),
) )
.select(({ fn }) => [fn.countAll().as('count')]); .select(() => [sql<number>`COUNT(DISTINCT o.id)`.as('count')]);
const [results, [{ count }]] = await Promise.all([findQuery.execute(), countQuery.execute()]); const [results, [{ count }]] = await Promise.all([findQuery.execute(), countQuery.execute()]);
return { return {
leaderboard: results, organisations: results,
totalPages: Math.ceil(Number(count) / perPage),
};
}
export type GetOrganisationInsightsOptions = GetSigningVolumeOptions & {
dateRange?: DateRange;
startDate?: Date;
endDate?: Date;
};
export async function getOrganisationInsights({
search = '',
page = 1,
perPage = 10,
sortBy = 'signingVolume',
sortOrder = 'desc',
dateRange = 'last30days',
startDate,
endDate,
}: GetOrganisationInsightsOptions) {
const offset = Math.max(page - 1, 0) * perPage;
const now = new Date();
let dateCondition = sql`1=1`;
if (startDate && endDate) {
dateCondition = sql`e."createdAt" >= ${startDate} AND e."createdAt" <= ${endDate}`;
} else {
switch (dateRange) {
case 'last30days': {
const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
dateCondition = sql`e."createdAt" >= ${thirtyDaysAgo}`;
break;
}
case 'last90days': {
const ninetyDaysAgo = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);
dateCondition = sql`e."createdAt" >= ${ninetyDaysAgo}`;
break;
}
case 'lastYear': {
const oneYearAgo = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate());
dateCondition = sql`e."createdAt" >= ${oneYearAgo}`;
break;
}
case 'allTime':
default:
dateCondition = sql`1=1`;
break;
}
}
let findQuery = kyselyPrisma.$kysely
.selectFrom('Organisation as o')
.leftJoin('Team as t', 'o.id', 't.organisationId')
.leftJoin('Envelope as e', (join) =>
join
.onRef('t.id', '=', 'e.teamId')
.on('e.status', '=', sql.lit(DocumentStatus.COMPLETED))
.on('e.deletedAt', 'is', null)
.on('e.type', '=', sql.lit(EnvelopeType.DOCUMENT)),
)
.leftJoin('OrganisationMember as om', 'o.id', 'om.organisationId')
.leftJoin('Subscription as s', 'o.id', 's.organisationId')
.where((eb) =>
eb.or([eb('o.name', 'ilike', `%${search}%`), eb('t.name', 'ilike', `%${search}%`)]),
)
.select([
'o.id as id',
'o.createdAt as createdAt',
'o.customerId as customerId',
sql<string>`COALESCE(o.name, 'Unknown')`.as('name'),
sql<number>`COUNT(DISTINCT CASE WHEN e.id IS NOT NULL AND ${dateCondition} THEN e.id END)`.as(
'signingVolume',
),
sql<number>`GREATEST(COUNT(DISTINCT t.id), 1)`.as('teamCount'),
sql<number>`COUNT(DISTINCT om."userId")`.as('memberCount'),
sql<string>`CASE WHEN s.status IS NOT NULL THEN s.status ELSE NULL END`.as(
'subscriptionStatus',
),
])
.groupBy(['o.id', 'o.name', 'o.customerId', 's.status']);
switch (sortBy) {
case 'name':
findQuery = findQuery.orderBy('name', sortOrder);
break;
case 'createdAt':
findQuery = findQuery.orderBy('createdAt', sortOrder);
break;
case 'signingVolume':
findQuery = findQuery.orderBy('signingVolume', sortOrder);
break;
default:
findQuery = findQuery.orderBy('signingVolume', 'desc');
}
findQuery = findQuery.limit(perPage).offset(offset);
const countQuery = kyselyPrisma.$kysely
.selectFrom('Organisation as o')
.leftJoin('Team as t', 'o.id', 't.organisationId')
.where((eb) =>
eb.or([eb('o.name', 'ilike', `%${search}%`), eb('t.name', 'ilike', `%${search}%`)]),
)
.select(() => [sql<number>`COUNT(DISTINCT o.id)`.as('count')]);
const [results, [{ count }]] = await Promise.all([findQuery.execute(), countQuery.execute()]);
return {
organisations: results,
totalPages: Math.ceil(Number(count) / perPage), totalPages: Math.ceil(Number(count) / perPage),
}; };
} }

View File

@ -19,7 +19,7 @@ import { prisma } from '@documenso/prisma';
import { AppError, AppErrorCode } from '../../errors/app-error'; import { AppError, AppErrorCode } from '../../errors/app-error';
import { jobs } from '../../jobs/client'; import { jobs } from '../../jobs/client';
import type { TRecipientAccessAuth, TRecipientActionAuth } from '../../types/document-auth'; import type { TRecipientAccessAuth } from '../../types/document-auth';
import { DocumentAuth } from '../../types/document-auth'; import { DocumentAuth } from '../../types/document-auth';
import { import {
ZWebhookDocumentSchema, ZWebhookDocumentSchema,
@ -37,7 +37,6 @@ export type CompleteDocumentWithTokenOptions = {
token: string; token: string;
id: EnvelopeIdOptions; id: EnvelopeIdOptions;
userId?: number; userId?: number;
authOptions?: TRecipientActionAuth;
accessAuthOptions?: TRecipientAccessAuth; accessAuthOptions?: TRecipientAccessAuth;
requestMetadata?: RequestMetadata; requestMetadata?: RequestMetadata;
nextSigner?: { nextSigner?: {

View File

@ -1,5 +1,7 @@
import Konva from 'konva'; // sort-imports-ignore
import 'konva/skia-backend'; import 'konva/skia-backend';
import Konva from 'konva';
import path from 'node:path'; import path from 'node:path';
import type { Canvas } from 'skia-canvas'; import type { Canvas } from 'skia-canvas';
import { FontLibrary } from 'skia-canvas'; import { FontLibrary } from 'skia-canvas';
@ -21,13 +23,13 @@ export const insertFieldInPDFV2 = async ({
}: InsertFieldInPDFV2Options) => { }: InsertFieldInPDFV2Options) => {
const fontPath = path.join(process.cwd(), 'public/fonts'); const fontPath = path.join(process.cwd(), 'public/fonts');
FontLibrary.use([ FontLibrary.use({
path.join(fontPath, 'caveat.ttf'), ['Caveat']: [path.join(fontPath, 'caveat.ttf')],
path.join(fontPath, 'noto-sans.ttf'), ['Noto Sans']: [path.join(fontPath, 'noto-sans.ttf')],
path.join(fontPath, 'noto-sans-japanese.ttf'), ['Noto Sans Japanese']: [path.join(fontPath, 'noto-sans-japanese.ttf')],
path.join(fontPath, 'noto-sans-chinese.ttf'), ['Noto Sans Chinese']: [path.join(fontPath, 'noto-sans-chinese.ttf')],
path.join(fontPath, 'noto-sans-korean.ttf'), ['Noto Sans Korean']: [path.join(fontPath, 'noto-sans-korean.ttf')],
]); });
const stage = new Konva.Stage({ width: pageWidth, height: pageHeight }); const stage = new Konva.Stage({ width: pageWidth, height: pageHeight });
const layer = new Konva.Layer(); const layer = new Konva.Layer();

View File

@ -8,7 +8,7 @@ msgstr ""
"Language: de\n" "Language: de\n"
"Project-Id-Version: documenso-app\n" "Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-11-07 03:40\n" "PO-Revision-Date: 2025-11-12 06:14\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: German\n" "Language-Team: German\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@ -18,10 +18,6 @@ msgstr ""
"X-Crowdin-File: web.po\n" "X-Crowdin-File: web.po\n"
"X-Crowdin-File-ID: 8\n" "X-Crowdin-File-ID: 8\n"
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid " Enable direct link signing"
msgstr " Direktlink-Signierung aktivieren"
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid ".PDF documents accepted (max {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB)" msgid ".PDF documents accepted (max {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB)"
msgstr ".PDF-Dokumente akzeptiert (max. {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB)" msgstr ".PDF-Dokumente akzeptiert (max. {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB)"
@ -98,6 +94,11 @@ msgstr "{0, plural, one {# Ordner} other {# Ordner}}"
msgid "{0, plural, one {# recipient} other {# recipients}}" msgid "{0, plural, one {# recipient} other {# recipients}}"
msgstr "{0, plural, one {# Empfänger} other {# Empfänger}}" msgstr "{0, plural, one {# Empfänger} other {# Empfänger}}"
#. placeholder {0}: envelope.recipients.length
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
msgid "{0, plural, one {# Recipient} other {# Recipients}}"
msgstr "{0, plural, one {# Empfänger} other {# Empfänger}}"
#. placeholder {0}: org.teams.length #. placeholder {0}: org.teams.length
#: apps/remix/app/routes/_authenticated+/dashboard.tsx #: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "{0, plural, one {# team} other {# teams}}" msgid "{0, plural, one {# team} other {# teams}}"
@ -151,6 +152,11 @@ msgstr "{0, plural, one {Warte auf 1 Empfänger} other {Warte auf # Empfänger}}
msgid "{0}" msgid "{0}"
msgstr "{0}" msgstr "{0}"
#. placeholder {0}: file.name
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "{0} couldn't be uploaded:"
msgstr "{0} konnte nicht hochgeladen werden:"
#. placeholder {0}: team.name #. placeholder {0}: team.name
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx #: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
msgid "{0} direct signing templates" msgid "{0} direct signing templates"
@ -169,9 +175,9 @@ msgstr "{0} hat dich eingeladen, ein Dokument {recipientActionVerb}"
#. placeholder {0}: remaining.documents #. placeholder {0}: remaining.documents
#. placeholder {1}: quota.documents #. placeholder {1}: quota.documents
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "{0} of {1} documents remaining this month." msgid "{0} of {1} documents remaining this month."
msgstr "{0} von {1} Dokumenten verbleibend in diesem Monat." msgstr "{0} von {1} Dokumenten verbleibend in diesem Monat."
@ -188,11 +194,6 @@ msgstr "{0} von {1} Zeile(n) ausgewählt."
msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"." msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr "{0} im Namen von \"{1}\" hat Sie eingeladen, das Dokument \"{2}\" {recipientActionVerb}." msgstr "{0} im Namen von \"{1}\" hat Sie eingeladen, das Dokument \"{2}\" {recipientActionVerb}."
#. placeholder {0}: envelope.recipients.length
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
msgid "{0} Recipient(s)"
msgstr "{0} Empfänger(in)"
#. placeholder {0}: organisation.name #. placeholder {0}: organisation.name
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
msgid "{0} Teams" msgid "{0} Teams"
@ -206,6 +207,10 @@ msgstr "{browserInfo} auf {os}"
msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}" msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}"
msgstr "{charactersRemaining, plural, one {1 Zeichen verbleibend} other {{charactersRemaining} Zeichen verbleibend}}" msgstr "{charactersRemaining, plural, one {1 Zeichen verbleibend} other {{charactersRemaining} Zeichen verbleibend}}"
#: packages/email/template-components/template-access-auth-2fa.tsx
msgid "{expiresInMinutes, plural, one {This code will expire in # minute.} other {This code will expire in # minutes.}}"
msgstr "{expiresInMinutes, plural, one {Dieser Code wird in # Minute ablaufen.} other {Dieser Code wird in # Minuten ablaufen.}}"
#: packages/email/templates/document-invite.tsx #: packages/email/templates/document-invite.tsx
msgid "{inviterName} <0>({inviterEmail})</0>" msgid "{inviterName} <0>({inviterEmail})</0>"
msgstr "{inviterName} <0>({inviterEmail})</0>" msgstr "{inviterName} <0>({inviterEmail})</0>"
@ -254,6 +259,10 @@ msgstr "{inviterName} im Namen von \"{teamName}\" hat dich eingeladen, {0}<0/>\"
msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}" msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}"
msgstr "{inviterName} im Namen von \"{teamName}\" hat Sie eingeladen, das Dokument {documentName} {action}" msgstr "{inviterName} im Namen von \"{teamName}\" hat Sie eingeladen, das Dokument {documentName} {action}"
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "{MAXIMUM_PASSKEYS, plural, one {You cannot have more than # passkey.} other {You cannot have more than # passkeys.}}"
msgstr "{MAXIMUM_PASSKEYS, plural, one {Sie können nicht mehr als # Zugangsschlüssel haben.} other {Sie können nicht mehr als # Zugangsschlüssel haben.}}"
#: packages/lib/utils/document-audit-logs.ts #: packages/lib/utils/document-audit-logs.ts
msgid "{prefix} added a field" msgid "{prefix} added a field"
msgstr "{prefix} hat ein Feld hinzugefügt" msgstr "{prefix} hat ein Feld hinzugefügt"
@ -1231,6 +1240,7 @@ msgid "All templates"
msgstr "Alle Vorlagen" msgstr "Alle Vorlagen"
#: apps/remix/app/components/general/period-selector.tsx #: apps/remix/app/components/general/period-selector.tsx
#: apps/remix/app/components/filters/date-range-filter.tsx
msgid "All Time" msgid "All Time"
msgstr "Alle Zeiten" msgstr "Alle Zeiten"
@ -1312,6 +1322,10 @@ msgstr "Eine E-Mail mit dieser Adresse existiert bereits."
msgid "An error occurred" msgid "An error occurred"
msgstr "Ein Fehler ist aufgetreten" msgstr "Ein Fehler ist aufgetreten"
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "An error occurred during upload."
msgstr "Ein Fehler ist beim Hochladen aufgetreten"
#: apps/remix/app/components/general/template/template-edit-form.tsx #: apps/remix/app/components/general/template/template-edit-form.tsx
msgid "An error occurred while adding fields." msgid "An error occurred while adding fields."
msgstr "Ein Fehler ist aufgetreten beim Hinzufügen von Feldern." msgstr "Ein Fehler ist aufgetreten beim Hinzufügen von Feldern."
@ -1477,9 +1491,8 @@ msgstr "Ein Fehler ist aufgetreten, während die Unterschrift aktualisiert wurde
msgid "An error occurred while updating your profile." msgid "An error occurred while updating your profile."
msgstr "Ein Fehler ist aufgetreten, während dein Profil aktualisiert wurde." msgstr "Ein Fehler ist aufgetreten, während dein Profil aktualisiert wurde."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "An error occurred while uploading your document." msgid "An error occurred while uploading your document."
msgstr "Ein Fehler ist aufgetreten, während dein Dokument hochgeladen wurde." msgstr "Ein Fehler ist aufgetreten, während dein Dokument hochgeladen wurde."
@ -1857,6 +1870,10 @@ msgstr "Schwarz"
msgid "Blue" msgid "Blue"
msgstr "Blau" msgstr "Blau"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Bottom"
msgstr "Unten"
#: apps/remix/app/components/forms/branding-preferences-form.tsx #: apps/remix/app/components/forms/branding-preferences-form.tsx
msgid "Brand Details" msgid "Brand Details"
msgstr "Markendetails" msgstr "Markendetails"
@ -2097,6 +2114,10 @@ msgstr "Ccers"
msgid "Center" msgid "Center"
msgstr "Zentrum" msgstr "Zentrum"
#: apps/remix/app/components/forms/editor/editor-field-text-form.tsx
msgid "Character limit"
msgstr "Zeichenbeschränkung"
#: apps/remix/app/components/forms/editor/editor-field-text-form.tsx #: apps/remix/app/components/forms/editor/editor-field-text-form.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx #: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
msgid "Character Limit" msgid "Character Limit"
@ -2263,6 +2284,7 @@ msgstr "Dokument abschließen"
msgid "Complete the fields for the following signers." msgid "Complete the fields for the following signers."
msgstr "Vervollständigen Sie die Felder für die folgenden Unterzeichner." msgstr "Vervollständigen Sie die Felder für die folgenden Unterzeichner."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-document-jobs-table.tsx #: apps/remix/app/components/tables/admin-document-jobs-table.tsx
#: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx #: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx
#: apps/remix/app/components/general/template/template-page-view-documents-table.tsx #: apps/remix/app/components/general/template/template-page-view-documents-table.tsx
@ -2543,11 +2565,6 @@ msgstr "Signierlinks kopieren"
msgid "Copy token" msgid "Copy token"
msgstr "Token kopieren" msgstr "Token kopieren"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "couldn't be uploaded:"
msgstr "konnte nicht hochgeladen werden:"
#: apps/remix/app/routes/_profile+/_layout.tsx #: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx #: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx #: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
@ -2739,9 +2756,11 @@ msgstr "Erstellen Sie Ihr Konto und beginnen Sie mit dem modernen Dokumentensign
#: apps/remix/app/components/tables/templates-table.tsx #: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx #: apps/remix/app/components/tables/settings-security-passkey-table.tsx
#: apps/remix/app/components/tables/organisation-teams-table.tsx #: apps/remix/app/components/tables/organisation-teams-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table.tsx #: apps/remix/app/components/tables/documents-table.tsx
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx #: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/general/template/template-page-view-information.tsx #: apps/remix/app/components/general/template/template-page-view-information.tsx
#: apps/remix/app/components/general/template/template-page-view-documents-table.tsx #: apps/remix/app/components/general/template/template-page-view-documents-table.tsx
#: apps/remix/app/components/general/document/document-page-view-information.tsx #: apps/remix/app/components/general/document/document-page-view-information.tsx
@ -3222,6 +3241,10 @@ msgstr "Dokument \"{0}\" - Ablehnung Bestätigt"
msgid "Document \"{0}\" Cancelled" msgid "Document \"{0}\" Cancelled"
msgstr "Dokument „{0}“ abgebrochen" msgstr "Dokument „{0}“ abgebrochen"
#: packages/ui/primitives/document-upload-button.tsx
msgid "Document (Legacy)"
msgstr "Dokument (Legacy)"
#: apps/remix/app/components/general/envelope-editor/envelope-editor.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor.tsx
msgid "Document & Recipients" msgid "Document & Recipients"
msgstr "Dokument & Empfänger" msgstr "Dokument & Empfänger"
@ -3354,6 +3377,10 @@ msgstr "Dokument in Ihrem Konto gefunden"
msgid "Document ID" msgid "Document ID"
msgstr "Dokument-ID" msgstr "Dokument-ID"
#: apps/remix/app/components/general/document/document-page-view-information.tsx
msgid "Document ID (Legacy)"
msgstr "Dokumenten-ID (Legacy)"
#: apps/remix/app/components/general/document/document-status.tsx #: apps/remix/app/components/general/document/document-status.tsx
msgid "Document inbox" msgid "Document inbox"
msgstr "Dokumenten-Posteingang" msgstr "Dokumenten-Posteingang"
@ -3478,14 +3505,14 @@ msgid "Document updated successfully"
msgstr "Dokument erfolgreich aktualisiert" msgstr "Dokument erfolgreich aktualisiert"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Document upload disabled due to unpaid invoices" msgid "Document upload disabled due to unpaid invoices"
msgstr "Dokumenten-Upload deaktiviert aufgrund unbezahlter Rechnungen" msgstr "Dokumenten-Upload deaktiviert aufgrund unbezahlter Rechnungen"
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Document uploaded" msgid "Document uploaded"
msgstr "Dokument hochgeladen" msgstr "Dokument hochgeladen"
@ -3507,6 +3534,10 @@ msgctxt "Audit log format"
msgid "Document visibility updated" msgid "Document visibility updated"
msgstr "Sichtbarkeit des Dokuments aktualisiert" msgstr "Sichtbarkeit des Dokuments aktualisiert"
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
msgid "Document Volume"
msgstr "Dokumentenmenge"
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx #: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document will be permanently deleted" msgid "Document will be permanently deleted"
msgstr "Dokument wird dauerhaft gelöscht" msgstr "Dokument wird dauerhaft gelöscht"
@ -3520,6 +3551,8 @@ msgstr "Dokumentation"
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.legacy_editor.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.legacy_editor.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx #: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/user-profile-timur.tsx #: apps/remix/app/components/general/user-profile-timur.tsx
#: apps/remix/app/components/general/app-nav-mobile.tsx #: apps/remix/app/components/general/app-nav-mobile.tsx
@ -3534,6 +3567,15 @@ msgstr "Dokumente"
msgid "Documents and resources related to this envelope." msgid "Documents and resources related to this envelope."
msgstr "Dokumente und Ressourcen im Zusammenhang mit diesem Umschlag." msgstr "Dokumente und Ressourcen im Zusammenhang mit diesem Umschlag."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Documents Completed"
msgstr "Dokumente abgeschlossen"
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Documents Created"
msgstr "Dokumente erstellt"
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
msgid "Documents created from template" msgid "Documents created from template"
msgstr "Dokumente erstellt aus Vorlage" msgstr "Dokumente erstellt aus Vorlage"
@ -3631,8 +3673,7 @@ msgstr "Ziehen Sie Ihr PDF hierher."
msgid "Drag and drop or click to upload" msgid "Drag and drop or click to upload"
msgstr "Ziehen Sie die Datei hierher oder klicken Sie, um hochzuladen" msgstr "Ziehen Sie die Datei hierher oder klicken Sie, um hochzuladen"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Drag and drop your PDF file here" msgid "Drag and drop your PDF file here"
msgstr "Ziehen Sie Ihre PDF-Datei hierher" msgstr "Ziehen Sie Ihre PDF-Datei hierher"
@ -3736,6 +3777,7 @@ msgstr "Offenlegung der elektronischen Unterschrift"
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx #: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/settings-nav-desktop.tsx #: apps/remix/app/components/general/settings-nav-desktop.tsx
@ -3925,6 +3967,10 @@ msgstr "Aktivieren Sie das benutzerdefinierte Branding für alle Dokumente in di
msgid "Enable custom branding for all documents in this team" msgid "Enable custom branding for all documents in this team"
msgstr "Aktivieren Sie das benutzerdefinierte Branding für alle Dokumente in diesem Team" msgstr "Aktivieren Sie das benutzerdefinierte Branding für alle Dokumente in diesem Team"
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid "Enable direct link signing"
msgstr "Direktlink-Signierung aktivieren"
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx #: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: packages/lib/constants/template.ts #: packages/lib/constants/template.ts
msgid "Enable Direct Link Signing" msgid "Enable Direct Link Signing"
@ -4073,6 +4119,8 @@ msgstr "Umschlag aktualisiert"
#: apps/remix/app/components/general/template/template-edit-form.tsx #: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx #: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/envelope-signing/envelope-signer-page-renderer.tsx #: apps/remix/app/components/general/envelope-signing/envelope-signer-page-renderer.tsx
#: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
@ -4096,8 +4144,7 @@ msgstr "Umschlag aktualisiert"
#: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx #: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
@ -4106,7 +4153,6 @@ msgstr "Umschlag aktualisiert"
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-attachments-popover.tsx #: apps/remix/app/components/general/document/document-attachments-popover.tsx
#: apps/remix/app/components/general/document/document-attachments-popover.tsx #: apps/remix/app/components/general/document/document-attachments-popover.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx #: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
@ -4254,7 +4300,6 @@ msgstr "Fehlgeschlagen: {failedCount}"
msgid "Feature Flags" msgid "Feature Flags"
msgstr "Funktionsflaggen" msgstr "Funktionsflaggen"
#: apps/remix/app/components/forms/editor/editor-field-text-form.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx #: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
msgid "Field character limit" msgid "Field character limit"
msgstr "Zeichenbeschränkung des Feldes" msgstr "Zeichenbeschränkung des Feldes"
@ -4311,19 +4356,17 @@ msgid "Fields updated"
msgstr "Felder aktualisiert" msgstr "Felder aktualisiert"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "Die Datei darf nicht größer als {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB sein" msgstr "Die Datei darf nicht größer als {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB sein"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "Datei ist größer als {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgstr "Datei ist größer als {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "File is too small" msgid "File is too small"
msgstr "Datei ist zu klein" msgstr "Datei ist zu klein"
@ -4402,6 +4445,7 @@ msgstr "Passwort vergessen?"
msgid "Forgot your password?" msgid "Forgot your password?"
msgstr "Hast du dein Passwort vergessen?" msgstr "Hast du dein Passwort vergessen?"
#: apps/remix/app/components/tables/admin-organisations-table.tsx
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx #: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
msgid "Free" msgid "Free"
msgstr "Kostenlos" msgstr "Kostenlos"
@ -4934,6 +4978,10 @@ msgstr "Tritt {organisationName} auf Documenso bei"
msgid "Join our community on <0>Discord</0> for community support and discussion." msgid "Join our community on <0>Discord</0> for community support and discussion."
msgstr "Treten Sie unserer Community auf <0>Discord</0> bei, um Unterstützung zu erhalten und sich auszutauschen." msgstr "Treten Sie unserer Community auf <0>Discord</0> bei, um Unterstützung zu erhalten und sich auszutauschen."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Joined"
msgstr "Beigetreten"
#. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' }) #. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' })
#: apps/remix/app/routes/_authenticated+/dashboard.tsx #: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "Joined {0}" msgid "Joined {0}"
@ -4967,10 +5015,18 @@ msgstr "Die letzten 14 Tage"
msgid "Last 30 days" msgid "Last 30 days"
msgstr "Die letzten 30 Tage" msgstr "Die letzten 30 Tage"
#: apps/remix/app/components/filters/date-range-filter.tsx
msgid "Last 30 Days"
msgstr "Letzte 30 Tage"
#: apps/remix/app/components/general/period-selector.tsx #: apps/remix/app/components/general/period-selector.tsx
msgid "Last 7 days" msgid "Last 7 days"
msgstr "Die letzten 7 Tage" msgstr "Die letzten 7 Tage"
#: apps/remix/app/components/filters/date-range-filter.tsx
msgid "Last 90 Days"
msgstr "Letzte 90 Tage"
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx #: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
msgid "Last Active" msgid "Last Active"
msgstr "Zuletzt aktiv" msgstr "Zuletzt aktiv"
@ -5000,9 +5056,9 @@ msgstr "Zuletzt aktualisiert am"
msgid "Last used" msgid "Last used"
msgstr "Zuletzt verwendet" msgstr "Zuletzt verwendet"
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx #: apps/remix/app/components/filters/date-range-filter.tsx
msgid "Leaderboard" msgid "Last Year"
msgstr "Bestenliste" msgstr "Letztes Jahr"
#: apps/remix/app/components/tables/user-organisations-table.tsx #: apps/remix/app/components/tables/user-organisations-table.tsx
#: apps/remix/app/components/dialogs/organisation-leave-dialog.tsx #: apps/remix/app/components/dialogs/organisation-leave-dialog.tsx
@ -5028,6 +5084,14 @@ msgstr "Links"
msgid "Legality of Electronic Signatures" msgid "Legality of Electronic Signatures"
msgstr "Rechtlichkeit elektronischer Unterschriften" msgstr "Rechtlichkeit elektronischer Unterschriften"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Letter spacing"
msgstr "Buchstabenspacing"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Letter Spacing"
msgstr "Buchstabenspacing"
#: apps/remix/app/components/general/app-command-menu.tsx #: apps/remix/app/components/general/app-command-menu.tsx
msgid "Light Mode" msgid "Light Mode"
msgstr "Lichtmodus" msgstr "Lichtmodus"
@ -5036,6 +5100,14 @@ msgstr "Lichtmodus"
msgid "Like to have your own public profile with agreements?" msgid "Like to have your own public profile with agreements?"
msgstr "Möchten Sie Ihr eigenes öffentliches Profil mit Vereinbarungen haben?" msgstr "Möchten Sie Ihr eigenes öffentliches Profil mit Vereinbarungen haben?"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Line height"
msgstr "Zeilenhöhe"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Line Height"
msgstr "Zeilenhöhe"
#: packages/email/templates/confirm-team-email.tsx #: packages/email/templates/confirm-team-email.tsx
msgid "Link expires in 1 hour." msgid "Link expires in 1 hour."
msgstr "Link läuft in 1 Stunde ab." msgstr "Link läuft in 1 Stunde ab."
@ -5315,7 +5387,10 @@ msgstr "Mitglied seit"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
#: apps/remix/app/components/tables/team-groups-table.tsx #: apps/remix/app/components/tables/team-groups-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-groups-table.tsx #: apps/remix/app/components/tables/organisation-groups-table.tsx
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx #: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx #: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
msgid "Members" msgid "Members"
@ -5333,6 +5408,10 @@ msgstr "Nachricht"
msgid "Message <0>(Optional)</0>" msgid "Message <0>(Optional)</0>"
msgstr "Nachricht <0>(Optional)</0>" msgstr "Nachricht <0>(Optional)</0>"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Middle"
msgstr "Mitte"
#: apps/remix/app/components/forms/editor/editor-field-number-form.tsx #: apps/remix/app/components/forms/editor/editor-field-number-form.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx
msgid "Min" msgid "Min"
@ -5408,7 +5487,8 @@ msgstr "N/A"
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx #: apps/remix/app/components/tables/settings-security-passkey-table.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx #: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx #: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx #: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-document-jobs-table.tsx #: apps/remix/app/components/tables/admin-document-jobs-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
@ -5475,7 +5555,6 @@ msgstr "Nie ablaufen"
msgid "New Password" msgid "New Password"
msgstr "Neues Passwort" msgstr "Neues Passwort"
#: apps/remix/app/components/dialogs/template-create-dialog.tsx
#: apps/remix/app/components/dialogs/template-create-dialog.tsx #: apps/remix/app/components/dialogs/template-create-dialog.tsx
msgid "New Template" msgid "New Template"
msgstr "Neue Vorlage" msgstr "Neue Vorlage"
@ -5739,13 +5818,11 @@ msgstr "Nur Administratoren können auf das Dokument zugreifen und es anzeigen"
msgid "Only managers and above can access and view the document" msgid "Only managers and above can access and view the document"
msgstr "Nur Manager und darüber können auf das Dokument zugreifen und es anzeigen" msgstr "Nur Manager und darüber können auf das Dokument zugreifen und es anzeigen"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Only one file can be uploaded at a time" msgid "Only one file can be uploaded at a time"
msgstr "Es kann jeweils nur eine Datei hochgeladen werden." msgstr "Es kann jeweils nur eine Datei hochgeladen werden."
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Only PDF files are allowed" msgid "Only PDF files are allowed"
msgstr "Nur PDF-Dateien sind erlaubt" msgstr "Nur PDF-Dateien sind erlaubt"
@ -5813,6 +5890,11 @@ msgstr "Einstellungen für Organisationsgruppen"
msgid "Organisation has been updated successfully" msgid "Organisation has been updated successfully"
msgstr "Organisation wurde erfolgreich aktualisiert" msgstr "Organisation wurde erfolgreich aktualisiert"
#: apps/remix/app/routes/_authenticated+/admin+/organisation-insights._index.tsx
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
msgid "Organisation Insights"
msgstr "Organisationseinblicke"
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
msgid "Organisation invitation" msgid "Organisation invitation"
msgstr "Organisationseinladung" msgstr "Organisationseinladung"
@ -5909,6 +5991,7 @@ msgid "Organize your documents and templates"
msgstr "Organisieren Sie Ihre Dokumente und Vorlagen" msgstr "Organisieren Sie Ihre Dokumente und Vorlagen"
#: apps/remix/app/components/dialogs/envelope-download-dialog.tsx #: apps/remix/app/components/dialogs/envelope-download-dialog.tsx
msgctxt "Original document (adjective)"
msgid "Original" msgid "Original"
msgstr "Original" msgstr "Original"
@ -5949,6 +6032,10 @@ msgstr "Seite {0} von {1}"
msgid "Page {0} of {numPages}" msgid "Page {0} of {numPages}"
msgstr "Seite {0} von {numPages}" msgstr "Seite {0} von {numPages}"
#: apps/remix/app/components/tables/admin-organisations-table.tsx
msgid "Paid"
msgstr "Bezahlt"
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx #: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
#: apps/remix/app/components/forms/signin.tsx #: apps/remix/app/components/forms/signin.tsx
msgid "Passkey" msgid "Passkey"
@ -6074,6 +6161,7 @@ msgid "per year"
msgstr "pro Jahr" msgstr "pro Jahr"
#: apps/remix/app/components/tables/user-organisations-table.tsx #: apps/remix/app/components/tables/user-organisations-table.tsx
msgctxt "Personal organisation (adjective)"
msgid "Personal" msgid "Personal"
msgstr "Persönlich" msgstr "Persönlich"
@ -6273,7 +6361,6 @@ msgstr "Bitte versuchen Sie eine andere Domain."
msgid "Please try again and make sure you enter the correct email address." msgid "Please try again and make sure you enter the correct email address."
msgstr "Bitte versuchen Sie es erneut und stellen Sie sicher, dass Sie die korrekte E-Mail-Adresse eingeben." msgstr "Bitte versuchen Sie es erneut und stellen Sie sicher, dass Sie die korrekte E-Mail-Adresse eingeben."
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/dialogs/template-create-dialog.tsx #: apps/remix/app/components/dialogs/template-create-dialog.tsx
msgid "Please try again later." msgid "Please try again later."
msgstr "Bitte versuchen Sie es später noch einmal." msgstr "Bitte versuchen Sie es später noch einmal."
@ -6439,6 +6526,7 @@ msgid "Read only"
msgstr "Nur lesen" msgstr "Nur lesen"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx #: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
#: packages/ui/components/document/envelope-recipient-field-tooltip.tsx
msgid "Read Only" msgid "Read Only"
msgstr "Nur lesen" msgstr "Nur lesen"
@ -6874,6 +6962,7 @@ msgstr "Rechts"
#: apps/remix/app/components/tables/organisation-members-table.tsx #: apps/remix/app/components/tables/organisation-members-table.tsx
#: apps/remix/app/components/tables/organisation-member-invites-table.tsx #: apps/remix/app/components/tables/organisation-member-invites-table.tsx
#: apps/remix/app/components/tables/organisation-groups-table.tsx #: apps/remix/app/components/tables/organisation-groups-table.tsx
#: apps/remix/app/components/tables/admin-organisations-table.tsx
#: apps/remix/app/components/embed/authoring/configure-document-recipients.tsx #: apps/remix/app/components/embed/authoring/configure-document-recipients.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx #: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx #: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
@ -6936,7 +7025,6 @@ msgstr "Suche nach Anspruchs-ID oder Name"
msgid "Search by document title" msgid "Search by document title"
msgstr "Nach Dokumenttitel suchen" msgstr "Nach Dokumenttitel suchen"
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
msgid "Search by name or email" msgid "Search by name or email"
msgstr "Nach Name oder E-Mail suchen" msgstr "Nach Name oder E-Mail suchen"
@ -6945,6 +7033,10 @@ msgstr "Nach Name oder E-Mail suchen"
msgid "Search by organisation ID, name, customer ID or owner email" msgid "Search by organisation ID, name, customer ID or owner email"
msgstr "Suche nach Organisations-ID, Name, Kunden-ID oder E-Mail des Inhabers" msgstr "Suche nach Organisations-ID, Name, Kunden-ID oder E-Mail des Inhabers"
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
msgid "Search by organisation name"
msgstr "Suche nach Organisationsname"
#: apps/remix/app/components/general/document/document-search.tsx #: apps/remix/app/components/general/document/document-search.tsx
msgid "Search documents..." msgid "Search documents..."
msgstr "Dokumente suchen..." msgstr "Dokumente suchen..."
@ -7115,6 +7207,10 @@ msgstr "Wählen Sie die Mitglieder, die in diese Gruppe aufgenommen werden solle
msgid "Select triggers" msgid "Select triggers"
msgstr "Auslöser auswählen" msgstr "Auslöser auswählen"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Select vertical align"
msgstr "Vertikale Ausrichtung auswählen"
#: apps/remix/app/components/dialogs/folder-update-dialog.tsx #: apps/remix/app/components/dialogs/folder-update-dialog.tsx
msgid "Select visibility" msgid "Select visibility"
msgstr "Sichtbarkeit auswählen" msgstr "Sichtbarkeit auswählen"
@ -7485,12 +7581,16 @@ msgstr "Gesammelte Unterschriften"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx #: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx #: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: apps/remix/app/components/dialogs/envelope-download-dialog.tsx
#: packages/ui/components/document/envelope-recipient-field-tooltip.tsx #: packages/ui/components/document/envelope-recipient-field-tooltip.tsx
#: packages/ui/components/document/document-read-only-fields.tsx #: packages/ui/components/document/document-read-only-fields.tsx
msgid "Signed" msgid "Signed"
msgstr "Unterzeichnet" msgstr "Unterzeichnet"
#: apps/remix/app/components/dialogs/envelope-download-dialog.tsx
msgctxt "Signed document (adjective)"
msgid "Signed"
msgstr "Signiert"
#: packages/lib/constants/recipient-roles.ts #: packages/lib/constants/recipient-roles.ts
msgctxt "Recipient role actioned" msgctxt "Recipient role actioned"
msgid "Signed" msgid "Signed"
@ -7556,11 +7656,6 @@ msgstr "Unterzeichnungslinks wurden für dieses Dokument erstellt."
msgid "Signing order is enabled." msgid "Signing order is enabled."
msgstr "Unterzeichnungsreihenfolge ist aktiviert." msgstr "Unterzeichnungsreihenfolge ist aktiviert."
#: apps/remix/app/routes/_authenticated+/admin+/leaderboard.tsx
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx
msgid "Signing Volume"
msgstr "Unterzeichnungsvolumen"
#: apps/remix/app/components/forms/signup.tsx #: apps/remix/app/components/forms/signup.tsx
msgid "Signups are disabled." msgid "Signups are disabled."
msgstr "Registrierungen sind deaktiviert." msgstr "Registrierungen sind deaktiviert."
@ -7594,7 +7689,6 @@ msgstr "Einige Unterzeichner haben noch kein Unterschriftsfeld zugewiesen bekomm
#: apps/remix/app/components/tables/organisation-member-invites-table.tsx #: apps/remix/app/components/tables/organisation-member-invites-table.tsx
#: apps/remix/app/components/general/billing-plans.tsx #: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx #: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx #: apps/remix/app/components/general/teams/team-email-usage.tsx
#: apps/remix/app/components/general/teams/team-email-dropdown.tsx #: apps/remix/app/components/general/teams/team-email-dropdown.tsx
#: apps/remix/app/components/general/organisations/organisation-invitations.tsx #: apps/remix/app/components/general/organisations/organisation-invitations.tsx
@ -7712,6 +7806,7 @@ msgstr "Statistiken"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/audit-log.tsx #: apps/remix/app/routes/_internal+/[__htmltopdf]+/audit-log.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx #: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx #: apps/remix/app/components/tables/organisation-email-domains-table.tsx
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx #: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
@ -7905,6 +8000,7 @@ msgstr "Systemthema"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/organisation-teams-table.tsx #: apps/remix/app/components/tables/organisation-teams-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Team" msgid "Team"
msgstr "Team" msgstr "Team"
@ -7990,6 +8086,7 @@ msgstr "Teammitglieder"
msgid "Team members have been added." msgid "Team members have been added."
msgstr "Teammitglieder wurden hinzugefügt." msgstr "Teammitglieder wurden hinzugefügt."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/forms/team-update-form.tsx #: apps/remix/app/components/forms/team-update-form.tsx
#: apps/remix/app/components/dialogs/team-create-dialog.tsx #: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Team Name" msgid "Team Name"
@ -8034,6 +8131,9 @@ msgstr "Team-URL"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/dashboard.tsx #: apps/remix/app/routes/_authenticated+/dashboard.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/general/org-menu-switcher.tsx #: apps/remix/app/components/general/org-menu-switcher.tsx
msgid "Teams" msgid "Teams"
msgstr "Teams" msgstr "Teams"
@ -8056,6 +8156,11 @@ msgstr "Teams, denen diese Organisationsgruppe derzeit zugewiesen ist"
msgid "Template" msgid "Template"
msgstr "Vorlage" msgstr "Vorlage"
#: apps/remix/app/components/dialogs/template-create-dialog.tsx
#: packages/ui/primitives/document-upload-button.tsx
msgid "Template (Legacy)"
msgstr "Vorlage (Legacy)"
#: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx #: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx
msgid "Template Created" msgid "Template Created"
msgstr "Vorlage erstellt" msgstr "Vorlage erstellt"
@ -8084,6 +8189,10 @@ msgstr "Vorlage ist von Deinem öffentlichen Profil entfernt worden."
msgid "Template has been updated." msgid "Template has been updated."
msgstr "Vorlage wurde aktualisiert." msgstr "Vorlage wurde aktualisiert."
#: apps/remix/app/components/general/template/template-page-view-information.tsx
msgid "Template ID (Legacy)"
msgstr "Vorlagen-ID (Legacy)"
#: apps/remix/app/components/general/legacy-field-warning-popover.tsx #: apps/remix/app/components/general/legacy-field-warning-popover.tsx
msgid "Template is using legacy field insertion" msgid "Template is using legacy field insertion"
msgstr "Vorlage verwendet Altfeld-Integration" msgstr "Vorlage verwendet Altfeld-Integration"
@ -8108,8 +8217,8 @@ msgstr "Vorlagentitel"
msgid "Template updated successfully" msgid "Template updated successfully"
msgstr "Vorlage erfolgreich aktualisiert" msgstr "Vorlage erfolgreich aktualisiert"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Template uploaded" msgid "Template uploaded"
msgstr "Vorlage hochgeladen" msgstr "Vorlage hochgeladen"
@ -8266,9 +8375,8 @@ msgstr "Das gesuchte Dokument konnte nicht gefunden werden."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
msgid "The document you are looking for may have been removed, renamed or may have never\n" msgid "The document you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Das gesuchte Dokument wurde möglicherweise entfernt, umbenannt oder existierte nie."
msgstr "Das gesuchte Dokument wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
#: packages/ui/components/document/document-send-email-message-helper.tsx #: packages/ui/components/document/document-send-email-message-helper.tsx
msgid "The document's name" msgid "The document's name"
@ -8279,9 +8387,8 @@ msgid "The email address which will show up in the \"Reply To\" field in emails"
msgstr "Die E-Mail-Adresse, die im \"Antwort an\"-Feld in E-Mails angezeigt wird" msgstr "Die E-Mail-Adresse, die im \"Antwort an\"-Feld in E-Mails angezeigt wird"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
msgid "The email domain you are looking for may have been removed, renamed or may have never\n" msgid "The email domain you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Die gesuchte E-Mail-Domäne wurde möglicherweise entfernt, umbenannt oder existierte nie."
msgstr "Die gesuchte E-Mail-Domain wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
#: apps/remix/app/components/forms/signin.tsx #: apps/remix/app/components/forms/signin.tsx
msgid "The email or password provided is incorrect" msgid "The email or password provided is incorrect"
@ -8337,23 +8444,17 @@ msgid "The organisation email has been created successfully."
msgstr "Die E-Mail der Organisation wurde erfolgreich erstellt." msgstr "Die E-Mail der Organisation wurde erfolgreich erstellt."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "The organisation group you are looking for may have been removed, renamed or may have never\n" msgid "The organisation group you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Die gesuchte Organisationsgruppe wurde möglicherweise entfernt, umbenannt oder existierte nie."
msgstr "Die Organisationsgruppe, nach der Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "The organisation role that will be applied to all members in this group." msgid "The organisation role that will be applied to all members in this group."
msgstr "Die Organisationsrolle, die auf alle Mitglieder in dieser Gruppe angewendet wird." msgstr "Die Organisationsrolle, die auf alle Mitglieder in dieser Gruppe angewendet wird."
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Die Organisation, nach der Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
#: apps/remix/app/routes/_authenticated+/_layout.tsx #: apps/remix/app/routes/_authenticated+/_layout.tsx
msgid "The organisation you are looking for may have been removed, renamed or may have never\n" #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
" existed." msgid "The organisation you are looking for may have been removed, renamed or may have never existed."
msgstr "Die Organisation, nach der Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert." msgstr "Die gesuchte Organisation wurde möglicherweise entfernt, umbenannt oder existierte nie."
#: apps/remix/app/components/general/generic-error-layout.tsx #: apps/remix/app/components/general/generic-error-layout.tsx
msgid "The page you are looking for was moved, removed, renamed or might never have existed." msgid "The page you are looking for was moved, removed, renamed or might never have existed."
@ -8444,14 +8545,9 @@ msgid "The team email <0>{teamEmail}</0> has been removed from the following tea
msgstr "Die Team-E-Mail <0>{teamEmail}</0> wurde aus dem folgenden Team entfernt" msgstr "Die Team-E-Mail <0>{teamEmail}</0> wurde aus dem folgenden Team entfernt"
#: apps/remix/app/routes/_authenticated+/_layout.tsx #: apps/remix/app/routes/_authenticated+/_layout.tsx
msgid "The team you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Das Team, das Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
msgid "The team you are looking for may have been removed, renamed or may have never\n" msgid "The team you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Das Team, das Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
msgstr "Das Team, das Sie suchen, könnte entfernt, umbenannt oder nie existiert haben."
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx #: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
msgid "The template has been moved successfully." msgid "The template has been moved successfully."
@ -8466,9 +8562,8 @@ msgid "The template you are looking for could not be found."
msgstr "Die gesuchte Vorlage konnte nicht gefunden werden." msgstr "Die gesuchte Vorlage konnte nicht gefunden werden."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
msgid "The template you are looking for may have been removed, renamed or may have never\n" msgid "The template you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Die gesuchte Vorlage wurde möglicherweise entfernt, umbenannt oder existierte nie."
msgstr "Die gesuchte Vorlage wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
#: apps/remix/app/components/dialogs/webhook-test-dialog.tsx #: apps/remix/app/components/dialogs/webhook-test-dialog.tsx
msgid "The test webhook has been successfully sent to your endpoint." msgid "The test webhook has been successfully sent to your endpoint."
@ -8508,9 +8603,8 @@ msgid "The URL for Documenso to send webhook events to."
msgstr "Die URL für Documenso, um Webhook-Ereignisse zu senden." msgstr "Die URL für Documenso, um Webhook-Ereignisse zu senden."
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
msgid "The user you are looking for may have been removed, renamed or may have never\n" msgid "The user you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Der gesuchte Benutzer wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
msgstr "Der Benutzer, nach dem Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx #: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
msgid "The user's two factor authentication has been reset successfully." msgid "The user's two factor authentication has been reset successfully."
@ -8529,9 +8623,8 @@ msgid "The webhook was successfully created."
msgstr "Der Webhook wurde erfolgreich erstellt." msgstr "Der Webhook wurde erfolgreich erstellt."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
msgid "The webhook you are looking for may have been removed, renamed or may have never\n" msgid "The webhook you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Der gesuchte Webhook wurde möglicherweise entfernt, umbenannt oder existierte nie."
msgstr "Das gesuchte Webhook wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
#: apps/remix/app/components/tables/documents-table-empty-state.tsx #: apps/remix/app/components/tables/documents-table-empty-state.tsx
msgid "There are no active drafts at the current moment. You can upload a document to start drafting." msgid "There are no active drafts at the current moment. You can upload a document to start drafting."
@ -8587,10 +8680,6 @@ msgstr "Diese Aktion ist umkehrbar, jedoch bitte seien Sie vorsichtig, da das Ko
msgid "This claim is locked and cannot be deleted." msgid "This claim is locked and cannot be deleted."
msgstr "Dieser Anspruch ist gesperrt und kann nicht gelöscht werden." msgstr "Dieser Anspruch ist gesperrt und kann nicht gelöscht werden."
#: packages/email/template-components/template-access-auth-2fa.tsx
msgid "This code will expire in {expiresInMinutes} minutes."
msgstr "Dieser Code läuft in {expiresInMinutes} Minuten ab."
#: packages/email/template-components/template-document-super-delete.tsx #: packages/email/template-components/template-document-super-delete.tsx
msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." 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." msgstr "Dieses Dokument kann nicht wiederhergestellt werden. Wenn du den Grund für zukünftige Dokumente anfechten möchtest, kontaktiere bitte den Support."
@ -8836,6 +8925,7 @@ msgstr "Zeitzone"
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx #: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
#: apps/remix/app/components/tables/templates-table.tsx #: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table.tsx #: apps/remix/app/components/tables/documents-table.tsx
#: apps/remix/app/components/general/template/template-page-view-documents-table.tsx #: apps/remix/app/components/general/template/template-page-view-documents-table.tsx
@ -8848,6 +8938,19 @@ msgstr "Titel"
msgid "Title cannot be empty" msgid "Title cannot be empty"
msgstr "Titel darf nicht leer sein" msgstr "Titel darf nicht leer sein"
#. placeholder {0}: actionVerb.toLowerCase()
#. placeholder {1}: actionTarget.toLowerCase()
#. placeholder {2}: recipient.email
#: apps/remix/app/components/general/document-signing/document-signing-auth-account.tsx
msgid "To {0} this {1}, you need to be logged in as <0>{2}</0>"
msgstr "Um {0} diese {1}zu {2}müssen Sie als <0>{2}</0> angemeldet sein."
#. placeholder {0}: actionVerb.toLowerCase()
#. placeholder {1}: actionTarget.toLowerCase()
#: apps/remix/app/components/general/document-signing/document-signing-auth-account.tsx
msgid "To {0} this {1}, you need to be logged in."
msgstr "Um {0} diese {1}, müssen Sie angemeldet sein."
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
msgid "To accept this invitation you must create an account." msgid "To accept this invitation you must create an account."
msgstr "Um diese Einladung anzunehmen, müssen Sie ein Konto erstellen." msgstr "Um diese Einladung anzunehmen, müssen Sie ein Konto erstellen."
@ -8888,6 +8991,10 @@ msgstr "Um Zugang zu Ihrem Konto zu erhalten, bestätigen Sie bitte Ihre E-Mail-
msgid "To mark this document as viewed, you need to be logged in as <0>{0}</0>" msgid "To mark this document as viewed, you need to be logged in as <0>{0}</0>"
msgstr "Um dieses Dokument als angesehen zu markieren, müssen Sie als <0>{0}</0> angemeldet sein" msgstr "Um dieses Dokument als angesehen zu markieren, müssen Sie als <0>{0}</0> angemeldet sein"
#: apps/remix/app/components/general/document-signing/document-signing-auth-account.tsx
msgid "To mark this document as viewed, you need to be logged in."
msgstr "Um dieses Dokument als angesehen zu markieren, müssen Sie angemeldet sein."
#. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select' #. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select'
#. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select' #. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select'
#: packages/ui/primitives/template-flow/add-template-fields.tsx #: packages/ui/primitives/template-flow/add-template-fields.tsx
@ -8943,6 +9050,10 @@ msgstr "Das Token ist abgelaufen. Bitte versuchen Sie es erneut."
msgid "Token name" msgid "Token name"
msgstr "Token-Name" msgstr "Token-Name"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Top"
msgstr "Oben"
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx #: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
msgid "Total Documents" msgid "Total Documents"
msgstr "Gesamtdokumente" msgstr "Gesamtdokumente"
@ -9122,8 +9233,7 @@ msgstr "Unvollendet"
msgid "Unknown" msgid "Unknown"
msgstr "Unbekannt" msgstr "Unbekannt"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Unknown error" msgid "Unknown error"
msgstr "Unbekannter Fehler" msgstr "Unbekannter Fehler"
@ -9281,7 +9391,7 @@ msgstr "Passwort wird aktualisiert..."
msgid "Updating Your Information" msgid "Updating Your Information"
msgstr "Aktualisierung Ihrer Informationen" msgstr "Aktualisierung Ihrer Informationen"
#: packages/ui/primitives/document-upload.tsx #: packages/ui/primitives/document-upload-button.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "Upgrade" msgid "Upgrade"
msgstr "Upgrade" msgstr "Upgrade"
@ -9291,7 +9401,7 @@ msgstr "Upgrade"
msgid "Upgrade <0>{0}</0> to {planName}" msgid "Upgrade <0>{0}</0> to {planName}"
msgstr "<0>{0}</0> auf {planName} aktualisieren" msgstr "<0>{0}</0> auf {planName} aktualisieren"
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Upgrade your plan to upload more documents" msgid "Upgrade your plan to upload more documents"
msgstr "Aktualisieren Sie Ihren Tarif, um mehr Dokumente hochzuladen" msgstr "Aktualisieren Sie Ihren Tarif, um mehr Dokumente hochzuladen"
@ -9333,9 +9443,9 @@ msgstr "Benutzerdefiniertes Dokument hochladen"
msgid "Upload disabled" msgid "Upload disabled"
msgstr "Hochladen deaktiviert" msgstr "Hochladen deaktiviert"
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
#: packages/ui/primitives/document-upload.tsx #: packages/ui/primitives/document-upload-button.tsx
msgid "Upload Document" msgid "Upload Document"
msgstr "Dokument hochladen" msgstr "Dokument hochladen"
@ -9343,14 +9453,9 @@ msgstr "Dokument hochladen"
msgid "Upload documents and add recipients" msgid "Upload documents and add recipients"
msgstr "Dokumente hochladen und Empfänger hinzufügen" msgstr "Dokumente hochladen und Empfänger hinzufügen"
#: packages/ui/primitives/document-upload.tsx
msgid "Upload Envelope"
msgstr "Umschlag hochladen"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Upload failed" msgid "Upload failed"
msgstr "Hochladen fehlgeschlagen" msgstr "Hochladen fehlgeschlagen"
@ -9358,11 +9463,11 @@ msgstr "Hochladen fehlgeschlagen"
msgid "Upload Signature" msgid "Upload Signature"
msgstr "Signatur hochladen" msgstr "Signatur hochladen"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: packages/ui/primitives/document-upload-button.tsx
msgid "Upload Template" msgid "Upload Template"
msgstr "Vorlage hochladen" msgstr "Vorlage hochladen"
#: packages/ui/primitives/document-upload.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "Upload Template Document" msgid "Upload Template Document"
msgstr "Vorlagendokument hochladen" msgstr "Vorlagendokument hochladen"
@ -9389,17 +9494,10 @@ msgid "Uploaded file not an allowed file type"
msgstr "Die hochgeladene Datei ist kein zulässiger Dateityp" msgstr "Die hochgeladene Datei ist kein zulässiger Dateityp"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Uploading" msgid "Uploading"
msgstr "Hochladen" msgstr "Hochladen"
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Uploading document..."
msgstr "Dokument wird hochgeladen..."
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
msgid "Uploading template..."
msgstr "Vorlage wird hochgeladen..."
#: apps/remix/app/components/general/document/document-attachments-popover.tsx #: apps/remix/app/components/general/document/document-attachments-popover.tsx
msgid "URL" msgid "URL"
msgstr "URL" msgstr "URL"
@ -9472,6 +9570,7 @@ msgid "User with this email already exists. Please use a different email address
msgstr "Ein Benutzer mit dieser E-Mail existiert bereits. Bitte verwenden Sie eine andere E-Mail-Adresse." msgstr "Ein Benutzer mit dieser E-Mail existiert bereits. Bitte verwenden Sie eine andere E-Mail-Adresse."
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx #: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Users" msgid "Users"
msgstr "Benutzer" msgstr "Benutzer"
@ -9494,6 +9593,10 @@ msgstr "Validierung fehlgeschlagen"
msgid "Value" msgid "Value"
msgstr "Wert" msgstr "Wert"
#: packages/lib/types/field-meta.ts
msgid "Value must be a number"
msgstr "Wert muss eine Zahl sein"
#: packages/email/template-components/template-access-auth-2fa.tsx #: packages/email/template-components/template-access-auth-2fa.tsx
msgid "Verification Code Required" msgid "Verification Code Required"
msgstr "Verifizierungscode erforderlich" msgstr "Verifizierungscode erforderlich"
@ -9526,8 +9629,8 @@ msgstr "Überprüfen Sie Ihre E-Mail-Adresse"
msgid "Verify your email address to unlock all features." msgid "Verify your email address to unlock all features."
msgstr "Überprüfen Sie Ihre E-Mail-Adresse, um alle Funktionen freizuschalten." msgstr "Überprüfen Sie Ihre E-Mail-Adresse, um alle Funktionen freizuschalten."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Verify your email to upload documents." msgid "Verify your email to upload documents."
msgstr "Überprüfen Sie Ihre E-Mail, um Dokumente hochzuladen." msgstr "Überprüfen Sie Ihre E-Mail, um Dokumente hochzuladen."
@ -9541,6 +9644,10 @@ msgstr "Überprüfen Sie Ihre Team-E-Mail-Adresse"
msgid "Vertical" msgid "Vertical"
msgstr "Vertikal" msgstr "Vertikal"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Vertical Align"
msgstr "Vertikale Ausrichtung"
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx #: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
@ -10393,10 +10500,6 @@ msgstr "Sie können keine Gruppe löschen, die eine höhere Rolle hat als Sie."
msgid "You cannot delete this item because the document has been sent to recipients" msgid "You cannot delete this item because the document has been sent to recipients"
msgstr "Sie können dieses Element nicht löschen, da das Dokument an Empfänger gesendet wurde" msgstr "Sie können dieses Element nicht löschen, da das Dokument an Empfänger gesendet wurde"
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "You cannot have more than {MAXIMUM_PASSKEYS} passkeys."
msgstr "Sie dürfen nicht mehr als {MAXIMUM_PASSKEYS} Passkeys haben."
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx #: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
msgid "You cannot modify a group which has a higher role than you." msgid "You cannot modify a group which has a higher role than you."
msgstr "Sie können keine Gruppe ändern, die eine höhere Rolle hat als Sie." msgstr "Sie können keine Gruppe ändern, die eine höhere Rolle hat als Sie."
@ -10413,20 +10516,21 @@ msgstr "Sie können ein Teammitglied, das eine höhere Rolle als Sie hat, nicht
msgid "You cannot remove members from this team if the inherit member feature is enabled." msgid "You cannot remove members from this team if the inherit member feature is enabled."
msgstr "Sie können keine Mitglieder aus diesem Team entfernen, wenn die Funktion Mitglied übernehmen aktiviert ist." msgstr "Sie können keine Mitglieder aus diesem Team entfernen, wenn die Funktion Mitglied übernehmen aktiviert ist."
#: packages/ui/primitives/document-upload.tsx #: packages/ui/primitives/document-upload-button.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "You cannot upload documents at this time." msgid "You cannot upload documents at this time."
msgstr "Sie können derzeit keine Dokumente hochladen." msgstr "Sie können derzeit keine Dokumente hochladen."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "You cannot upload encrypted PDFs" msgid "You cannot upload encrypted PDFs"
msgstr "Sie können keine verschlüsselten PDFs hochladen" msgstr "Sie können keine verschlüsselten PDFs hochladen"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "You cannot upload more than {maximumEnvelopeItemCount} items per envelope." msgid "You cannot upload more than {maximumEnvelopeItemCount} items per envelope."
msgstr "Sie können nicht mehr als {maximumEnvelopeItemCount} Elemente pro Umschlag hochladen." msgstr "Sie können nicht mehr als {maximumEnvelopeItemCount} Elemente pro Umschlag hochladen."
@ -10502,9 +10606,9 @@ msgstr "Sie haben noch keine Vorlagen erstellt. Bitte laden Sie eine Datei hoch,
msgid "You have not yet created or received any documents. To create a document please upload one." msgid "You have not yet created or received any documents. To create a document please upload one."
msgstr "Sie haben noch keine Dokumente erstellt oder erhalten. Bitte laden Sie ein Dokument hoch, um eines zu erstellen." msgstr "Sie haben noch keine Dokumente erstellt oder erhalten. Bitte laden Sie ein Dokument hoch, um eines zu erstellen."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "You have reached the limit of the number of files per envelope" msgid "You have reached the limit of the number of files per envelope"
msgstr "Sie haben das Limit für die Anzahl der Dateien pro Umschlag erreicht" msgstr "Sie haben das Limit für die Anzahl der Dateien pro Umschlag erreicht"
@ -10517,14 +10621,14 @@ msgstr "Sie haben das maximale Limit von {0} direkten Vorlagen erreicht. <0>Upgr
msgid "You have reached the maximum number of teams for your plan. Please contact sales at <0>{SUPPORT_EMAIL}</0> if you would like to adjust your plan." msgid "You have reached the maximum number of teams for your plan. Please contact sales at <0>{SUPPORT_EMAIL}</0> if you would like to adjust your plan."
msgstr "Sie haben die maximale Anzahl an Teams für Ihren Plan erreicht. Bitte kontaktieren Sie den Vertrieb unter <0>{SUPPORT_EMAIL}</0>, wenn Sie Ihren Plan anpassen möchten." msgstr "Sie haben die maximale Anzahl an Teams für Ihren Plan erreicht. Bitte kontaktieren Sie den Vertrieb unter <0>{SUPPORT_EMAIL}</0>, wenn Sie Ihren Plan anpassen möchten."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "You have reached your document limit for this month. Please upgrade your plan." msgid "You have reached your document limit for this month. Please upgrade your plan."
msgstr "Sie haben Ihr Dokumentenlimit für diesen Monat erreicht. Bitte aktualisieren Sie Ihren Plan." msgstr "Sie haben Ihr Dokumentenlimit für diesen Monat erreicht. Bitte aktualisieren Sie Ihren Plan."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "You have reached your document limit." msgid "You have reached your document limit."
msgstr "Sie haben Ihr Dokumentenlimit erreicht." msgstr "Sie haben Ihr Dokumentenlimit erreicht."
@ -10714,7 +10818,7 @@ msgstr "Ihr aktueller Plan ist überfällig."
msgid "Your direct signing templates" msgid "Your direct signing templates"
msgstr "Ihre direkten Unterzeichnungsvorlagen" msgstr "Ihre direkten Unterzeichnungsvorlagen"
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "Your document failed to upload." msgid "Your document failed to upload."
msgstr "Ihr Dokument konnte nicht hochgeladen werden." msgstr "Ihr Dokument konnte nicht hochgeladen werden."
@ -10743,9 +10847,9 @@ msgstr "Ihr Dokument wurde erfolgreich gesendet."
msgid "Your document has been successfully duplicated." msgid "Your document has been successfully duplicated."
msgstr "Ihr Dokument wurde erfolgreich dupliziert." msgstr "Ihr Dokument wurde erfolgreich dupliziert."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Your document has been uploaded successfully." msgid "Your document has been uploaded successfully."
msgstr "Ihr Dokument wurde erfolgreich hochgeladen." msgstr "Ihr Dokument wurde erfolgreich hochgeladen."
@ -10896,14 +11000,11 @@ msgstr "Ihre Vorlage wurde erfolgreich dupliziert."
msgid "Your template has been successfully deleted." msgid "Your template has been successfully deleted."
msgstr "Ihre Vorlage wurde erfolgreich gelöscht." msgstr "Ihre Vorlage wurde erfolgreich gelöscht."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Your template has been uploaded successfully." msgid "Your template has been uploaded successfully."
msgstr "Ihre Vorlage wurde erfolgreich hochgeladen." msgstr "Ihre Vorlage wurde erfolgreich hochgeladen."
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
msgid "Your template has been uploaded successfully. You will be redirected to the template page."
msgstr "Ihre Vorlage wurde erfolgreich hochgeladen. Sie werden zur Vorlagenseite weitergeleitet."
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx #: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx
msgid "Your template will be duplicated." msgid "Your template will be duplicated."
msgstr "Ihre Vorlage wird dupliziert." msgstr "Ihre Vorlage wird dupliziert."

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@ msgstr ""
"Language: es\n" "Language: es\n"
"Project-Id-Version: documenso-app\n" "Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-11-07 03:40\n" "PO-Revision-Date: 2025-11-12 06:14\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Spanish\n" "Language-Team: Spanish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@ -18,10 +18,6 @@ msgstr ""
"X-Crowdin-File: web.po\n" "X-Crowdin-File: web.po\n"
"X-Crowdin-File-ID: 8\n" "X-Crowdin-File-ID: 8\n"
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid " Enable direct link signing"
msgstr " Habilitar la firma mediante enlace directo"
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid ".PDF documents accepted (max {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB)" msgid ".PDF documents accepted (max {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB)"
msgstr ".Documentos PDF aceptados (máx {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB)" msgstr ".Documentos PDF aceptados (máx {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB)"
@ -98,6 +94,11 @@ msgstr "{0, plural, one {# carpeta} other {# carpetas}}"
msgid "{0, plural, one {# recipient} other {# recipients}}" msgid "{0, plural, one {# recipient} other {# recipients}}"
msgstr "{0, plural, one {# destinatario} other {# destinatarios}}" msgstr "{0, plural, one {# destinatario} other {# destinatarios}}"
#. placeholder {0}: envelope.recipients.length
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
msgid "{0, plural, one {# Recipient} other {# Recipients}}"
msgstr "{0, plural, one {# Destinatario} other {# Destinatarios}}"
#. placeholder {0}: org.teams.length #. placeholder {0}: org.teams.length
#: apps/remix/app/routes/_authenticated+/dashboard.tsx #: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "{0, plural, one {# team} other {# teams}}" msgid "{0, plural, one {# team} other {# teams}}"
@ -151,6 +152,11 @@ msgstr "{0, plural, one {Esperando 1 destinatario} other {Esperando # destinatar
msgid "{0}" msgid "{0}"
msgstr "{0}" msgstr "{0}"
#. placeholder {0}: file.name
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "{0} couldn't be uploaded:"
msgstr "{0} no pudo ser subido:"
#. placeholder {0}: team.name #. placeholder {0}: team.name
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx #: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
msgid "{0} direct signing templates" msgid "{0} direct signing templates"
@ -169,9 +175,9 @@ msgstr "{0} te invitó a {recipientActionVerb} un documento"
#. placeholder {0}: remaining.documents #. placeholder {0}: remaining.documents
#. placeholder {1}: quota.documents #. placeholder {1}: quota.documents
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "{0} of {1} documents remaining this month." msgid "{0} of {1} documents remaining this month."
msgstr "{0} de {1} documentos restantes este mes." msgstr "{0} de {1} documentos restantes este mes."
@ -188,11 +194,6 @@ msgstr "{0} de {1} fila(s) seleccionada."
msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"." msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr "{0} en nombre de \"{1}\" te ha invitado a {recipientActionVerb} el documento \"{2}\"." msgstr "{0} en nombre de \"{1}\" te ha invitado a {recipientActionVerb} el documento \"{2}\"."
#. placeholder {0}: envelope.recipients.length
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
msgid "{0} Recipient(s)"
msgstr "{0} Destinatario(s)"
#. placeholder {0}: organisation.name #. placeholder {0}: organisation.name
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
msgid "{0} Teams" msgid "{0} Teams"
@ -206,6 +207,10 @@ msgstr "{browserInfo} en {os}"
msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}" msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}"
msgstr "{charactersRemaining, plural, one {1 carácter restante} other {{charactersRemaining} caracteres restantes}}" msgstr "{charactersRemaining, plural, one {1 carácter restante} other {{charactersRemaining} caracteres restantes}}"
#: packages/email/template-components/template-access-auth-2fa.tsx
msgid "{expiresInMinutes, plural, one {This code will expire in # minute.} other {This code will expire in # minutes.}}"
msgstr "{expiresInMinutes, plural, one {Este código expirará en # minuto.} other {Este código expirará en # minutos.}}"
#: packages/email/templates/document-invite.tsx #: packages/email/templates/document-invite.tsx
msgid "{inviterName} <0>({inviterEmail})</0>" msgid "{inviterName} <0>({inviterEmail})</0>"
msgstr "{inviterName} <0>({inviterEmail})</0>" msgstr "{inviterName} <0>({inviterEmail})</0>"
@ -254,6 +259,10 @@ msgstr "{inviterName} en nombre de \"{teamName}\" te ha invitado a {0}<0/>\"{doc
msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}" msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}"
msgstr "{inviterName} en nombre de \"{teamName}\" te ha invitado a {action} {documentName}" msgstr "{inviterName} en nombre de \"{teamName}\" te ha invitado a {action} {documentName}"
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "{MAXIMUM_PASSKEYS, plural, one {You cannot have more than # passkey.} other {You cannot have more than # passkeys.}}"
msgstr "{MAXIMUM_PASSKEYS, plural, one {No puedes tener más de # clave de acceso.} other {No puedes tener más de # claves de acceso.}}"
#: packages/lib/utils/document-audit-logs.ts #: packages/lib/utils/document-audit-logs.ts
msgid "{prefix} added a field" msgid "{prefix} added a field"
msgstr "{prefix} agregó un campo" msgstr "{prefix} agregó un campo"
@ -1231,6 +1240,7 @@ msgid "All templates"
msgstr "Todas las plantillas" msgstr "Todas las plantillas"
#: apps/remix/app/components/general/period-selector.tsx #: apps/remix/app/components/general/period-selector.tsx
#: apps/remix/app/components/filters/date-range-filter.tsx
msgid "All Time" msgid "All Time"
msgstr "Todo el Tiempo" msgstr "Todo el Tiempo"
@ -1312,6 +1322,10 @@ msgstr "Ya existe un correo electrónico con esta dirección."
msgid "An error occurred" msgid "An error occurred"
msgstr "Ocurrió un error" msgstr "Ocurrió un error"
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "An error occurred during upload."
msgstr "Ocurrió un error durante la subida."
#: apps/remix/app/components/general/template/template-edit-form.tsx #: apps/remix/app/components/general/template/template-edit-form.tsx
msgid "An error occurred while adding fields." msgid "An error occurred while adding fields."
msgstr "Ocurrió un error al agregar campos." msgstr "Ocurrió un error al agregar campos."
@ -1477,9 +1491,8 @@ msgstr "Ocurrió un error al actualizar la firma."
msgid "An error occurred while updating your profile." msgid "An error occurred while updating your profile."
msgstr "Ocurrió un error al actualizar tu perfil." msgstr "Ocurrió un error al actualizar tu perfil."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "An error occurred while uploading your document." msgid "An error occurred while uploading your document."
msgstr "Ocurrió un error al subir tu documento." msgstr "Ocurrió un error al subir tu documento."
@ -1857,6 +1870,10 @@ msgstr "Negro"
msgid "Blue" msgid "Blue"
msgstr "Azul" msgstr "Azul"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Bottom"
msgstr "Fondo"
#: apps/remix/app/components/forms/branding-preferences-form.tsx #: apps/remix/app/components/forms/branding-preferences-form.tsx
msgid "Brand Details" msgid "Brand Details"
msgstr "Detalles de la Marca" msgstr "Detalles de la Marca"
@ -2097,6 +2114,10 @@ msgstr "Ccers"
msgid "Center" msgid "Center"
msgstr "Centro" msgstr "Centro"
#: apps/remix/app/components/forms/editor/editor-field-text-form.tsx
msgid "Character limit"
msgstr "Límite de caracteres"
#: apps/remix/app/components/forms/editor/editor-field-text-form.tsx #: apps/remix/app/components/forms/editor/editor-field-text-form.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx #: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
msgid "Character Limit" msgid "Character Limit"
@ -2263,6 +2284,7 @@ msgstr "Documento Completo"
msgid "Complete the fields for the following signers." msgid "Complete the fields for the following signers."
msgstr "Completa los campos para los siguientes firmantes." msgstr "Completa los campos para los siguientes firmantes."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-document-jobs-table.tsx #: apps/remix/app/components/tables/admin-document-jobs-table.tsx
#: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx #: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx
#: apps/remix/app/components/general/template/template-page-view-documents-table.tsx #: apps/remix/app/components/general/template/template-page-view-documents-table.tsx
@ -2543,11 +2565,6 @@ msgstr "Copiar enlaces de firma"
msgid "Copy token" msgid "Copy token"
msgstr "Copiar token" msgstr "Copiar token"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "couldn't be uploaded:"
msgstr "no se pudo cargar:"
#: apps/remix/app/routes/_profile+/_layout.tsx #: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx #: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx #: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
@ -2739,9 +2756,11 @@ msgstr "Crea tu cuenta y comienza a utilizar la firma de documentos de última g
#: apps/remix/app/components/tables/templates-table.tsx #: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx #: apps/remix/app/components/tables/settings-security-passkey-table.tsx
#: apps/remix/app/components/tables/organisation-teams-table.tsx #: apps/remix/app/components/tables/organisation-teams-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table.tsx #: apps/remix/app/components/tables/documents-table.tsx
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx #: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/general/template/template-page-view-information.tsx #: apps/remix/app/components/general/template/template-page-view-information.tsx
#: apps/remix/app/components/general/template/template-page-view-documents-table.tsx #: apps/remix/app/components/general/template/template-page-view-documents-table.tsx
#: apps/remix/app/components/general/document/document-page-view-information.tsx #: apps/remix/app/components/general/document/document-page-view-information.tsx
@ -3222,6 +3241,10 @@ msgstr "Documento \"{0}\" - Rechazo confirmado"
msgid "Document \"{0}\" Cancelled" msgid "Document \"{0}\" Cancelled"
msgstr "Documento \"{0}\" Cancelado" msgstr "Documento \"{0}\" Cancelado"
#: packages/ui/primitives/document-upload-button.tsx
msgid "Document (Legacy)"
msgstr "Documento (Legado)"
#: apps/remix/app/components/general/envelope-editor/envelope-editor.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor.tsx
msgid "Document & Recipients" msgid "Document & Recipients"
msgstr "Documento y Destinatarios" msgstr "Documento y Destinatarios"
@ -3354,6 +3377,10 @@ msgstr "Documento encontrado en tu cuenta"
msgid "Document ID" msgid "Document ID"
msgstr "ID del documento" msgstr "ID del documento"
#: apps/remix/app/components/general/document/document-page-view-information.tsx
msgid "Document ID (Legacy)"
msgstr "ID de documento (Legado)"
#: apps/remix/app/components/general/document/document-status.tsx #: apps/remix/app/components/general/document/document-status.tsx
msgid "Document inbox" msgid "Document inbox"
msgstr "Bandeja de documentos" msgstr "Bandeja de documentos"
@ -3478,14 +3505,14 @@ msgid "Document updated successfully"
msgstr "Documento actualizado con éxito" msgstr "Documento actualizado con éxito"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Document upload disabled due to unpaid invoices" msgid "Document upload disabled due to unpaid invoices"
msgstr "La carga de documentos está deshabilitada debido a facturas impagadas" msgstr "La carga de documentos está deshabilitada debido a facturas impagadas"
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Document uploaded" msgid "Document uploaded"
msgstr "Documento subido" msgstr "Documento subido"
@ -3507,6 +3534,10 @@ msgctxt "Audit log format"
msgid "Document visibility updated" msgid "Document visibility updated"
msgstr "Visibilidad del documento actualizada" msgstr "Visibilidad del documento actualizada"
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
msgid "Document Volume"
msgstr "Volumen del documento"
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx #: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document will be permanently deleted" msgid "Document will be permanently deleted"
msgstr "El documento será eliminado permanentemente" msgstr "El documento será eliminado permanentemente"
@ -3520,6 +3551,8 @@ msgstr "Documentación"
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.legacy_editor.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.legacy_editor.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx #: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/user-profile-timur.tsx #: apps/remix/app/components/general/user-profile-timur.tsx
#: apps/remix/app/components/general/app-nav-mobile.tsx #: apps/remix/app/components/general/app-nav-mobile.tsx
@ -3534,6 +3567,15 @@ msgstr "Documentos"
msgid "Documents and resources related to this envelope." msgid "Documents and resources related to this envelope."
msgstr "Documentos y recursos relacionados con este sobre." msgstr "Documentos y recursos relacionados con este sobre."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Documents Completed"
msgstr "Documentos completados"
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Documents Created"
msgstr "Documentos creados"
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
msgid "Documents created from template" msgid "Documents created from template"
msgstr "Documentos creados a partir de la plantilla" msgstr "Documentos creados a partir de la plantilla"
@ -3631,8 +3673,7 @@ msgstr "Arrastre y suelte su PDF aquí."
msgid "Drag and drop or click to upload" msgid "Drag and drop or click to upload"
msgstr "Arrastra y suelta o haz clic para cargar" msgstr "Arrastra y suelta o haz clic para cargar"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Drag and drop your PDF file here" msgid "Drag and drop your PDF file here"
msgstr "Arrastra y suelta tu archivo PDF aquí" msgstr "Arrastra y suelta tu archivo PDF aquí"
@ -3736,6 +3777,7 @@ msgstr "Divulgación de Firma Electrónica"
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx #: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/settings-nav-desktop.tsx #: apps/remix/app/components/general/settings-nav-desktop.tsx
@ -3925,6 +3967,10 @@ msgstr "Habilita la marca personalizada para todos los documentos en esta organi
msgid "Enable custom branding for all documents in this team" msgid "Enable custom branding for all documents in this team"
msgstr "Habilita la marca personalizada para todos los documentos en este equipo" msgstr "Habilita la marca personalizada para todos los documentos en este equipo"
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid "Enable direct link signing"
msgstr "Habilitar firma por enlace directo"
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx #: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: packages/lib/constants/template.ts #: packages/lib/constants/template.ts
msgid "Enable Direct Link Signing" msgid "Enable Direct Link Signing"
@ -4073,6 +4119,8 @@ msgstr "Sobre actualizado"
#: apps/remix/app/components/general/template/template-edit-form.tsx #: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx #: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/envelope-signing/envelope-signer-page-renderer.tsx #: apps/remix/app/components/general/envelope-signing/envelope-signer-page-renderer.tsx
#: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
@ -4096,8 +4144,7 @@ msgstr "Sobre actualizado"
#: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx #: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
@ -4106,7 +4153,6 @@ msgstr "Sobre actualizado"
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-attachments-popover.tsx #: apps/remix/app/components/general/document/document-attachments-popover.tsx
#: apps/remix/app/components/general/document/document-attachments-popover.tsx #: apps/remix/app/components/general/document/document-attachments-popover.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx #: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
@ -4254,7 +4300,6 @@ msgstr "Fallidos: {failedCount}"
msgid "Feature Flags" msgid "Feature Flags"
msgstr "Flags de características" msgstr "Flags de características"
#: apps/remix/app/components/forms/editor/editor-field-text-form.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx #: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
msgid "Field character limit" msgid "Field character limit"
msgstr "Límite de caracteres del campo" msgstr "Límite de caracteres del campo"
@ -4311,19 +4356,17 @@ msgid "Fields updated"
msgstr "Campos actualizados" msgstr "Campos actualizados"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "El archivo no puede ser mayor a {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgstr "El archivo no puede ser mayor a {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "El archivo es mayor que {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgstr "El archivo es mayor que {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "File is too small" msgid "File is too small"
msgstr "El archivo es demasiado pequeño" msgstr "El archivo es demasiado pequeño"
@ -4402,6 +4445,7 @@ msgstr "¿Olvidaste tu contraseña?"
msgid "Forgot your password?" msgid "Forgot your password?"
msgstr "¿Olvidaste tu contraseña?" msgstr "¿Olvidaste tu contraseña?"
#: apps/remix/app/components/tables/admin-organisations-table.tsx
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx #: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
msgid "Free" msgid "Free"
msgstr "Gratis" msgstr "Gratis"
@ -4934,6 +4978,10 @@ msgstr "Únete a {organisationName} en Documenso"
msgid "Join our community on <0>Discord</0> for community support and discussion." msgid "Join our community on <0>Discord</0> for community support and discussion."
msgstr "Únete a nuestra comunidad en <0>Discord</0> para soporte y debate." msgstr "Únete a nuestra comunidad en <0>Discord</0> para soporte y debate."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Joined"
msgstr "Unido"
#. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' }) #. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' })
#: apps/remix/app/routes/_authenticated+/dashboard.tsx #: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "Joined {0}" msgid "Joined {0}"
@ -4967,10 +5015,18 @@ msgstr "Últimos 14 días"
msgid "Last 30 days" msgid "Last 30 days"
msgstr "Últimos 30 días" msgstr "Últimos 30 días"
#: apps/remix/app/components/filters/date-range-filter.tsx
msgid "Last 30 Days"
msgstr "Últimos 30 días"
#: apps/remix/app/components/general/period-selector.tsx #: apps/remix/app/components/general/period-selector.tsx
msgid "Last 7 days" msgid "Last 7 days"
msgstr "Últimos 7 días" msgstr "Últimos 7 días"
#: apps/remix/app/components/filters/date-range-filter.tsx
msgid "Last 90 Days"
msgstr "Últimos 90 días"
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx #: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
msgid "Last Active" msgid "Last Active"
msgstr "Última actividad" msgstr "Última actividad"
@ -5000,9 +5056,9 @@ msgstr "Última actualización el"
msgid "Last used" msgid "Last used"
msgstr "Último uso" msgstr "Último uso"
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx #: apps/remix/app/components/filters/date-range-filter.tsx
msgid "Leaderboard" msgid "Last Year"
msgstr "Tabla de clasificación" msgstr "Último año"
#: apps/remix/app/components/tables/user-organisations-table.tsx #: apps/remix/app/components/tables/user-organisations-table.tsx
#: apps/remix/app/components/dialogs/organisation-leave-dialog.tsx #: apps/remix/app/components/dialogs/organisation-leave-dialog.tsx
@ -5028,6 +5084,14 @@ msgstr "Izquierda"
msgid "Legality of Electronic Signatures" msgid "Legality of Electronic Signatures"
msgstr "Legalidad de las Firmas Electrónicas" msgstr "Legalidad de las Firmas Electrónicas"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Letter spacing"
msgstr "Espaciado de letras"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Letter Spacing"
msgstr "Espaciado de letras"
#: apps/remix/app/components/general/app-command-menu.tsx #: apps/remix/app/components/general/app-command-menu.tsx
msgid "Light Mode" msgid "Light Mode"
msgstr "Modo claro" msgstr "Modo claro"
@ -5036,6 +5100,14 @@ msgstr "Modo claro"
msgid "Like to have your own public profile with agreements?" msgid "Like to have your own public profile with agreements?"
msgstr "¿Te gustaría tener tu propio perfil público con acuerdos?" msgstr "¿Te gustaría tener tu propio perfil público con acuerdos?"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Line height"
msgstr "Altura de línea"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Line Height"
msgstr "Altura de línea"
#: packages/email/templates/confirm-team-email.tsx #: packages/email/templates/confirm-team-email.tsx
msgid "Link expires in 1 hour." msgid "Link expires in 1 hour."
msgstr "El enlace expira en 1 hora." msgstr "El enlace expira en 1 hora."
@ -5315,7 +5387,10 @@ msgstr "Miembro desde"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
#: apps/remix/app/components/tables/team-groups-table.tsx #: apps/remix/app/components/tables/team-groups-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-groups-table.tsx #: apps/remix/app/components/tables/organisation-groups-table.tsx
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx #: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx #: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
msgid "Members" msgid "Members"
@ -5333,6 +5408,10 @@ msgstr "Mensaje"
msgid "Message <0>(Optional)</0>" msgid "Message <0>(Optional)</0>"
msgstr "Mensaje <0>(Opcional)</0>" msgstr "Mensaje <0>(Opcional)</0>"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Middle"
msgstr "Centro"
#: apps/remix/app/components/forms/editor/editor-field-number-form.tsx #: apps/remix/app/components/forms/editor/editor-field-number-form.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx
msgid "Min" msgid "Min"
@ -5408,7 +5487,8 @@ msgstr "N/A"
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx #: apps/remix/app/components/tables/settings-security-passkey-table.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx #: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx #: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx #: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-document-jobs-table.tsx #: apps/remix/app/components/tables/admin-document-jobs-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
@ -5475,7 +5555,6 @@ msgstr "Nunca expira"
msgid "New Password" msgid "New Password"
msgstr "Nueva Contraseña" msgstr "Nueva Contraseña"
#: apps/remix/app/components/dialogs/template-create-dialog.tsx
#: apps/remix/app/components/dialogs/template-create-dialog.tsx #: apps/remix/app/components/dialogs/template-create-dialog.tsx
msgid "New Template" msgid "New Template"
msgstr "Nueva plantilla" msgstr "Nueva plantilla"
@ -5739,13 +5818,11 @@ msgstr "Solo los administradores pueden acceder y ver el documento"
msgid "Only managers and above can access and view the document" msgid "Only managers and above can access and view the document"
msgstr "Solo los gerentes y superiores pueden acceder y ver el documento" msgstr "Solo los gerentes y superiores pueden acceder y ver el documento"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Only one file can be uploaded at a time" msgid "Only one file can be uploaded at a time"
msgstr "Solo se puede cargar un archivo a la vez" msgstr "Solo se puede cargar un archivo a la vez"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Only PDF files are allowed" msgid "Only PDF files are allowed"
msgstr "Solo se permiten archivos PDF" msgstr "Solo se permiten archivos PDF"
@ -5813,6 +5890,11 @@ msgstr "Configuración de Grupo de Organización"
msgid "Organisation has been updated successfully" msgid "Organisation has been updated successfully"
msgstr "La organización ha sido actualizada con éxito" msgstr "La organización ha sido actualizada con éxito"
#: apps/remix/app/routes/_authenticated+/admin+/organisation-insights._index.tsx
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
msgid "Organisation Insights"
msgstr "Perspectivas de la organización"
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
msgid "Organisation invitation" msgid "Organisation invitation"
msgstr "Invitación de Organización" msgstr "Invitación de Organización"
@ -5909,6 +5991,7 @@ msgid "Organize your documents and templates"
msgstr "Organiza tus documentos y plantillas" msgstr "Organiza tus documentos y plantillas"
#: apps/remix/app/components/dialogs/envelope-download-dialog.tsx #: apps/remix/app/components/dialogs/envelope-download-dialog.tsx
msgctxt "Original document (adjective)"
msgid "Original" msgid "Original"
msgstr "Original" msgstr "Original"
@ -5949,6 +6032,10 @@ msgstr "Página {0} de {1}"
msgid "Page {0} of {numPages}" msgid "Page {0} of {numPages}"
msgstr "Página {0} de {numPages}" msgstr "Página {0} de {numPages}"
#: apps/remix/app/components/tables/admin-organisations-table.tsx
msgid "Paid"
msgstr "Pagado"
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx #: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
#: apps/remix/app/components/forms/signin.tsx #: apps/remix/app/components/forms/signin.tsx
msgid "Passkey" msgid "Passkey"
@ -6074,6 +6161,7 @@ msgid "per year"
msgstr "al año" msgstr "al año"
#: apps/remix/app/components/tables/user-organisations-table.tsx #: apps/remix/app/components/tables/user-organisations-table.tsx
msgctxt "Personal organisation (adjective)"
msgid "Personal" msgid "Personal"
msgstr "Personal" msgstr "Personal"
@ -6273,7 +6361,6 @@ msgstr "Por favor, intenta con un dominio diferente."
msgid "Please try again and make sure you enter the correct email address." msgid "Please try again and make sure you enter the correct email address."
msgstr "Por favor, intenta de nuevo y asegúrate de ingresar la dirección de correo electrónico correcta." msgstr "Por favor, intenta de nuevo y asegúrate de ingresar la dirección de correo electrónico correcta."
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/dialogs/template-create-dialog.tsx #: apps/remix/app/components/dialogs/template-create-dialog.tsx
msgid "Please try again later." msgid "Please try again later."
msgstr "Por favor, intenta de nuevo más tarde." msgstr "Por favor, intenta de nuevo más tarde."
@ -6439,6 +6526,7 @@ msgid "Read only"
msgstr "Solo lectura" msgstr "Solo lectura"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx #: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
#: packages/ui/components/document/envelope-recipient-field-tooltip.tsx
msgid "Read Only" msgid "Read Only"
msgstr "Solo lectura" msgstr "Solo lectura"
@ -6874,6 +6962,7 @@ msgstr "Derecha"
#: apps/remix/app/components/tables/organisation-members-table.tsx #: apps/remix/app/components/tables/organisation-members-table.tsx
#: apps/remix/app/components/tables/organisation-member-invites-table.tsx #: apps/remix/app/components/tables/organisation-member-invites-table.tsx
#: apps/remix/app/components/tables/organisation-groups-table.tsx #: apps/remix/app/components/tables/organisation-groups-table.tsx
#: apps/remix/app/components/tables/admin-organisations-table.tsx
#: apps/remix/app/components/embed/authoring/configure-document-recipients.tsx #: apps/remix/app/components/embed/authoring/configure-document-recipients.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx #: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx #: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
@ -6936,7 +7025,6 @@ msgstr "Buscar por ID de reclamo o nombre"
msgid "Search by document title" msgid "Search by document title"
msgstr "Buscar por título del documento" msgstr "Buscar por título del documento"
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
msgid "Search by name or email" msgid "Search by name or email"
msgstr "Buscar por nombre o correo electrónico" msgstr "Buscar por nombre o correo electrónico"
@ -6945,6 +7033,10 @@ msgstr "Buscar por nombre o correo electrónico"
msgid "Search by organisation ID, name, customer ID or owner email" msgid "Search by organisation ID, name, customer ID or owner email"
msgstr "Buscar por ID de organización, nombre, ID de cliente o correo electrónico del propietario" msgstr "Buscar por ID de organización, nombre, ID de cliente o correo electrónico del propietario"
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
msgid "Search by organisation name"
msgstr "Buscar por nombre de organización"
#: apps/remix/app/components/general/document/document-search.tsx #: apps/remix/app/components/general/document/document-search.tsx
msgid "Search documents..." msgid "Search documents..."
msgstr "Buscar documentos..." msgstr "Buscar documentos..."
@ -7115,6 +7207,10 @@ msgstr "Seleccione a los miembros para incluir en este grupo"
msgid "Select triggers" msgid "Select triggers"
msgstr "Seleccionar activaciones" msgstr "Seleccionar activaciones"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Select vertical align"
msgstr "Seleccionar alineación vertical"
#: apps/remix/app/components/dialogs/folder-update-dialog.tsx #: apps/remix/app/components/dialogs/folder-update-dialog.tsx
msgid "Select visibility" msgid "Select visibility"
msgstr "Seleccionar visibilidad" msgstr "Seleccionar visibilidad"
@ -7485,12 +7581,16 @@ msgstr "Firmas recolectadas"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx #: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx #: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: apps/remix/app/components/dialogs/envelope-download-dialog.tsx
#: packages/ui/components/document/envelope-recipient-field-tooltip.tsx #: packages/ui/components/document/envelope-recipient-field-tooltip.tsx
#: packages/ui/components/document/document-read-only-fields.tsx #: packages/ui/components/document/document-read-only-fields.tsx
msgid "Signed" msgid "Signed"
msgstr "Firmado" msgstr "Firmado"
#: apps/remix/app/components/dialogs/envelope-download-dialog.tsx
msgctxt "Signed document (adjective)"
msgid "Signed"
msgstr "Firmado"
#: packages/lib/constants/recipient-roles.ts #: packages/lib/constants/recipient-roles.ts
msgctxt "Recipient role actioned" msgctxt "Recipient role actioned"
msgid "Signed" msgid "Signed"
@ -7556,11 +7656,6 @@ msgstr "Se han generado enlaces de firma para este documento."
msgid "Signing order is enabled." msgid "Signing order is enabled."
msgstr "El orden de firma está habilitado." msgstr "El orden de firma está habilitado."
#: apps/remix/app/routes/_authenticated+/admin+/leaderboard.tsx
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx
msgid "Signing Volume"
msgstr "Volumen de firmas"
#: apps/remix/app/components/forms/signup.tsx #: apps/remix/app/components/forms/signup.tsx
msgid "Signups are disabled." msgid "Signups are disabled."
msgstr "Las inscripciones están deshabilitadas." msgstr "Las inscripciones están deshabilitadas."
@ -7594,7 +7689,6 @@ msgstr "Algunos firmantes no han sido asignados a un campo de firma. Asigne al m
#: apps/remix/app/components/tables/organisation-member-invites-table.tsx #: apps/remix/app/components/tables/organisation-member-invites-table.tsx
#: apps/remix/app/components/general/billing-plans.tsx #: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx #: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx #: apps/remix/app/components/general/teams/team-email-usage.tsx
#: apps/remix/app/components/general/teams/team-email-dropdown.tsx #: apps/remix/app/components/general/teams/team-email-dropdown.tsx
#: apps/remix/app/components/general/organisations/organisation-invitations.tsx #: apps/remix/app/components/general/organisations/organisation-invitations.tsx
@ -7712,6 +7806,7 @@ msgstr "Estadísticas"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/audit-log.tsx #: apps/remix/app/routes/_internal+/[__htmltopdf]+/audit-log.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx #: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx #: apps/remix/app/components/tables/organisation-email-domains-table.tsx
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx #: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
@ -7905,6 +8000,7 @@ msgstr "Tema del sistema"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/organisation-teams-table.tsx #: apps/remix/app/components/tables/organisation-teams-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Team" msgid "Team"
msgstr "Equipo" msgstr "Equipo"
@ -7990,6 +8086,7 @@ msgstr "Miembros del equipo"
msgid "Team members have been added." msgid "Team members have been added."
msgstr "Se han añadido miembros del equipo." msgstr "Se han añadido miembros del equipo."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/forms/team-update-form.tsx #: apps/remix/app/components/forms/team-update-form.tsx
#: apps/remix/app/components/dialogs/team-create-dialog.tsx #: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Team Name" msgid "Team Name"
@ -8034,6 +8131,9 @@ msgstr "URL del equipo"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/dashboard.tsx #: apps/remix/app/routes/_authenticated+/dashboard.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/general/org-menu-switcher.tsx #: apps/remix/app/components/general/org-menu-switcher.tsx
msgid "Teams" msgid "Teams"
msgstr "Equipos" msgstr "Equipos"
@ -8056,6 +8156,11 @@ msgstr "Equipos a los que actualmente está asignado este grupo de organización
msgid "Template" msgid "Template"
msgstr "Plantilla" msgstr "Plantilla"
#: apps/remix/app/components/dialogs/template-create-dialog.tsx
#: packages/ui/primitives/document-upload-button.tsx
msgid "Template (Legacy)"
msgstr "Plantilla (Legado)"
#: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx #: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx
msgid "Template Created" msgid "Template Created"
msgstr "Plantilla Creada" msgstr "Plantilla Creada"
@ -8084,6 +8189,10 @@ msgstr "La plantilla ha sido eliminada de tu perfil público."
msgid "Template has been updated." msgid "Template has been updated."
msgstr "La plantilla ha sido actualizada." msgstr "La plantilla ha sido actualizada."
#: apps/remix/app/components/general/template/template-page-view-information.tsx
msgid "Template ID (Legacy)"
msgstr "ID de plantilla (Legado)"
#: apps/remix/app/components/general/legacy-field-warning-popover.tsx #: apps/remix/app/components/general/legacy-field-warning-popover.tsx
msgid "Template is using legacy field insertion" msgid "Template is using legacy field insertion"
msgstr "La plantilla utiliza inserción de campos heredada" msgstr "La plantilla utiliza inserción de campos heredada"
@ -8108,8 +8217,8 @@ msgstr "Título de plantilla"
msgid "Template updated successfully" msgid "Template updated successfully"
msgstr "Plantilla actualizada con éxito" msgstr "Plantilla actualizada con éxito"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Template uploaded" msgid "Template uploaded"
msgstr "Plantilla subida" msgstr "Plantilla subida"
@ -8266,10 +8375,8 @@ msgstr "No se pudo encontrar el documento que está buscando."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
msgid "The document you are looking for may have been removed, renamed or may have never\n" msgid "The document you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "El documento que estás buscando puede haber sido eliminado, renombrado o quizás nunca exist."
msgstr "El documento que está buscando puede haber sido eliminado, renombrado o puede que nunca\n"
" haya existido."
#: packages/ui/components/document/document-send-email-message-helper.tsx #: packages/ui/components/document/document-send-email-message-helper.tsx
msgid "The document's name" msgid "The document's name"
@ -8280,9 +8387,8 @@ msgid "The email address which will show up in the \"Reply To\" field in emails"
msgstr "La dirección de correo que aparecerá en el campo \"Responder a\" en los correos electrónicos" msgstr "La dirección de correo que aparecerá en el campo \"Responder a\" en los correos electrónicos"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
msgid "The email domain you are looking for may have been removed, renamed or may have never\n" msgid "The email domain you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "El dominio de correo electrónico que estás buscando puede haber sido eliminado, renombrado o quizás nunca exist."
msgstr "El dominio de correo electrónico que estás buscando puede haber sido eliminado, renombrado o puede que nunca haya existido."
#: apps/remix/app/components/forms/signin.tsx #: apps/remix/app/components/forms/signin.tsx
msgid "The email or password provided is incorrect" msgid "The email or password provided is incorrect"
@ -8338,23 +8444,17 @@ msgid "The organisation email has been created successfully."
msgstr "El correo electrónico de la organización se ha creado con éxito." msgstr "El correo electrónico de la organización se ha creado con éxito."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "The organisation group you are looking for may have been removed, renamed or may have never\n" msgid "The organisation group you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "El grupo de organizaciones que estás buscando puede haber sido eliminado, renombrado o quizás nunca exist."
msgstr "El grupo de organización que está buscando puede haber sido eliminado, renombrado o puede que nunca haya existido."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "The organisation role that will be applied to all members in this group." msgid "The organisation role that will be applied to all members in this group."
msgstr "El rol de organización que se aplicará a todos los miembros de este grupo." msgstr "El rol de organización que se aplicará a todos los miembros de este grupo."
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "La organización que está buscando puede haber sido eliminada, renombrada o puede que nunca haya existido."
#: apps/remix/app/routes/_authenticated+/_layout.tsx #: apps/remix/app/routes/_authenticated+/_layout.tsx
msgid "The organisation you are looking for may have been removed, renamed or may have never\n" #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
" existed." msgid "The organisation you are looking for may have been removed, renamed or may have never existed."
msgstr "La organización que está buscando puede haber sido eliminada, renombrada o puede que nunca haya existido." msgstr "La organización que estás buscando puede haber sido eliminada, renombrada o quizás nunca existió."
#: apps/remix/app/components/general/generic-error-layout.tsx #: apps/remix/app/components/general/generic-error-layout.tsx
msgid "The page you are looking for was moved, removed, renamed or might never have existed." msgid "The page you are looking for was moved, removed, renamed or might never have existed."
@ -8445,15 +8545,9 @@ msgid "The team email <0>{teamEmail}</0> has been removed from the following tea
msgstr "El correo electrónico del equipo <0>{teamEmail}</0> ha sido eliminado del siguiente equipo" msgstr "El correo electrónico del equipo <0>{teamEmail}</0> ha sido eliminado del siguiente equipo"
#: apps/remix/app/routes/_authenticated+/_layout.tsx #: apps/remix/app/routes/_authenticated+/_layout.tsx
msgid "The team you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "El equipo que está buscando puede haber sido eliminado, renombrado o puede que nunca haya existido."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
msgid "The team you are looking for may have been removed, renamed or may have never\n" msgid "The team you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "El equipo que estás buscando puede haber sido eliminado, renombrado o quizás nunca exist."
msgstr "El equipo que buscas puede haber sido eliminado, renombrado o quizás nunca\n"
" existió."
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx #: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
msgid "The template has been moved successfully." msgid "The template has been moved successfully."
@ -8468,10 +8562,8 @@ msgid "The template you are looking for could not be found."
msgstr "No se pudo encontrar la plantilla que está buscando." msgstr "No se pudo encontrar la plantilla que está buscando."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
msgid "The template you are looking for may have been removed, renamed or may have never\n" msgid "The template you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "La plantilla que estás buscando puede haber sido eliminada, renombrada o quizás nunca exist."
msgstr "La plantilla que está buscando puede haber sido eliminada, renombrada o puede que nunca\n"
" haya existido."
#: apps/remix/app/components/dialogs/webhook-test-dialog.tsx #: apps/remix/app/components/dialogs/webhook-test-dialog.tsx
msgid "The test webhook has been successfully sent to your endpoint." msgid "The test webhook has been successfully sent to your endpoint."
@ -8511,9 +8603,8 @@ msgid "The URL for Documenso to send webhook events to."
msgstr "La URL para Documenso para enviar eventos de webhook." msgstr "La URL para Documenso para enviar eventos de webhook."
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
msgid "The user you are looking for may have been removed, renamed or may have never\n" msgid "The user you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "El usuario que estás buscando puede haber sido eliminado, renombrado o quizás nunca exist."
msgstr "El usuario que está buscando puede haber sido eliminado, renombrado o puede que nunca haya existido."
#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx #: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
msgid "The user's two factor authentication has been reset successfully." msgid "The user's two factor authentication has been reset successfully."
@ -8532,9 +8623,8 @@ msgid "The webhook was successfully created."
msgstr "El webhook fue creado con éxito." msgstr "El webhook fue creado con éxito."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
msgid "The webhook you are looking for may have been removed, renamed or may have never\n" msgid "The webhook you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "El webhook que estás buscando puede haber sido eliminado, renombrado o quizás nunca exist."
msgstr "El webhook que buscas puede haber sido eliminado, renombrado o puede que nunca haya existido."
#: apps/remix/app/components/tables/documents-table-empty-state.tsx #: apps/remix/app/components/tables/documents-table-empty-state.tsx
msgid "There are no active drafts at the current moment. You can upload a document to start drafting." msgid "There are no active drafts at the current moment. You can upload a document to start drafting."
@ -8590,10 +8680,6 @@ msgstr "Esta acción es reversible, pero ten cuidado ya que la cuenta podría ve
msgid "This claim is locked and cannot be deleted." msgid "This claim is locked and cannot be deleted."
msgstr "Esta reclamo está bloqueado y no puede ser eliminado." msgstr "Esta reclamo está bloqueado y no puede ser eliminado."
#: packages/email/template-components/template-access-auth-2fa.tsx
msgid "This code will expire in {expiresInMinutes} minutes."
msgstr "Este código caducará en {expiresInMinutes} minutos."
#: packages/email/template-components/template-document-super-delete.tsx #: packages/email/template-components/template-document-super-delete.tsx
msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." 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." msgstr "Este documento no se puede recuperar, si deseas impugnar la razón para documentos futuros, por favor contacta con el soporte."
@ -8839,6 +8925,7 @@ msgstr "Zona horaria"
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx #: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
#: apps/remix/app/components/tables/templates-table.tsx #: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table.tsx #: apps/remix/app/components/tables/documents-table.tsx
#: apps/remix/app/components/general/template/template-page-view-documents-table.tsx #: apps/remix/app/components/general/template/template-page-view-documents-table.tsx
@ -8851,6 +8938,19 @@ msgstr "Título"
msgid "Title cannot be empty" msgid "Title cannot be empty"
msgstr "El título no puede estar vacío" msgstr "El título no puede estar vacío"
#. placeholder {0}: actionVerb.toLowerCase()
#. placeholder {1}: actionTarget.toLowerCase()
#. placeholder {2}: recipient.email
#: apps/remix/app/components/general/document-signing/document-signing-auth-account.tsx
msgid "To {0} this {1}, you need to be logged in as <0>{2}</0>"
msgstr "Para {0} este {1}, necesitas estar conectado como <0>{2}</0>"
#. placeholder {0}: actionVerb.toLowerCase()
#. placeholder {1}: actionTarget.toLowerCase()
#: apps/remix/app/components/general/document-signing/document-signing-auth-account.tsx
msgid "To {0} this {1}, you need to be logged in."
msgstr "Para {0} este {1}, necesitas estar conectado."
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
msgid "To accept this invitation you must create an account." msgid "To accept this invitation you must create an account."
msgstr "Para aceptar esta invitación debes crear una cuenta." msgstr "Para aceptar esta invitación debes crear una cuenta."
@ -8891,6 +8991,10 @@ msgstr "Para acceder a tu cuenta, por favor confirma tu dirección de correo ele
msgid "To mark this document as viewed, you need to be logged in as <0>{0}</0>" msgid "To mark this document as viewed, you need to be logged in as <0>{0}</0>"
msgstr "Para marcar este documento como visto, debes iniciar sesión como <0>{0}</0>" msgstr "Para marcar este documento como visto, debes iniciar sesión como <0>{0}</0>"
#: apps/remix/app/components/general/document-signing/document-signing-auth-account.tsx
msgid "To mark this document as viewed, you need to be logged in."
msgstr "Para marcar este documento como visto, necesitas estar conectado."
#. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select' #. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select'
#. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select' #. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select'
#: packages/ui/primitives/template-flow/add-template-fields.tsx #: packages/ui/primitives/template-flow/add-template-fields.tsx
@ -8946,6 +9050,10 @@ msgstr "El token ha expirado. Por favor, inténtelo de nuevo."
msgid "Token name" msgid "Token name"
msgstr "Nombre del token" msgstr "Nombre del token"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Top"
msgstr "Parte superior"
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx #: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
msgid "Total Documents" msgid "Total Documents"
msgstr "Total de documentos" msgstr "Total de documentos"
@ -9125,8 +9233,7 @@ msgstr "Incompleto"
msgid "Unknown" msgid "Unknown"
msgstr "Desconocido" msgstr "Desconocido"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Unknown error" msgid "Unknown error"
msgstr "Error desconocido" msgstr "Error desconocido"
@ -9284,7 +9391,7 @@ msgstr "Actualizando contraseña..."
msgid "Updating Your Information" msgid "Updating Your Information"
msgstr "Actualizando Su Información" msgstr "Actualizando Su Información"
#: packages/ui/primitives/document-upload.tsx #: packages/ui/primitives/document-upload-button.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "Upgrade" msgid "Upgrade"
msgstr "Actualizar" msgstr "Actualizar"
@ -9294,7 +9401,7 @@ msgstr "Actualizar"
msgid "Upgrade <0>{0}</0> to {planName}" msgid "Upgrade <0>{0}</0> to {planName}"
msgstr "Actualizar <0>{0}</0> a {planName}" msgstr "Actualizar <0>{0}</0> a {planName}"
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Upgrade your plan to upload more documents" msgid "Upgrade your plan to upload more documents"
msgstr "Actualiza tu plan para cargar más documentos" msgstr "Actualiza tu plan para cargar más documentos"
@ -9336,9 +9443,9 @@ msgstr "Subir documento personalizado"
msgid "Upload disabled" msgid "Upload disabled"
msgstr "Subida desactivada" msgstr "Subida desactivada"
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
#: packages/ui/primitives/document-upload.tsx #: packages/ui/primitives/document-upload-button.tsx
msgid "Upload Document" msgid "Upload Document"
msgstr "Cargar Documento" msgstr "Cargar Documento"
@ -9346,14 +9453,9 @@ msgstr "Cargar Documento"
msgid "Upload documents and add recipients" msgid "Upload documents and add recipients"
msgstr "Suba documentos y añada destinatarios" msgstr "Suba documentos y añada destinatarios"
#: packages/ui/primitives/document-upload.tsx
msgid "Upload Envelope"
msgstr "Cargar sobre (subir)"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Upload failed" msgid "Upload failed"
msgstr "Subida fallida" msgstr "Subida fallida"
@ -9361,11 +9463,11 @@ msgstr "Subida fallida"
msgid "Upload Signature" msgid "Upload Signature"
msgstr "Subir firma" msgstr "Subir firma"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: packages/ui/primitives/document-upload-button.tsx
msgid "Upload Template" msgid "Upload Template"
msgstr "Subir plantilla" msgstr "Subir plantilla"
#: packages/ui/primitives/document-upload.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "Upload Template Document" msgid "Upload Template Document"
msgstr "Cargar Documento Plantilla" msgstr "Cargar Documento Plantilla"
@ -9392,17 +9494,10 @@ msgid "Uploaded file not an allowed file type"
msgstr "El archivo subido no es un tipo de archivo permitido" msgstr "El archivo subido no es un tipo de archivo permitido"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Uploading" msgid "Uploading"
msgstr "Subiendo" msgstr "Subiendo"
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Uploading document..."
msgstr "Cargando documento..."
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
msgid "Uploading template..."
msgstr "Subiendo plantilla..."
#: apps/remix/app/components/general/document/document-attachments-popover.tsx #: apps/remix/app/components/general/document/document-attachments-popover.tsx
msgid "URL" msgid "URL"
msgstr "URL" msgstr "URL"
@ -9475,6 +9570,7 @@ msgid "User with this email already exists. Please use a different email address
msgstr "Un usuario con este correo electrónico ya existe. Por favor, use una dirección de correo diferente." msgstr "Un usuario con este correo electrónico ya existe. Por favor, use una dirección de correo diferente."
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx #: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Users" msgid "Users"
msgstr "Usuarios" msgstr "Usuarios"
@ -9497,6 +9593,10 @@ msgstr "Validación fallida"
msgid "Value" msgid "Value"
msgstr "Valor" msgstr "Valor"
#: packages/lib/types/field-meta.ts
msgid "Value must be a number"
msgstr "El valor debe ser un número"
#: packages/email/template-components/template-access-auth-2fa.tsx #: packages/email/template-components/template-access-auth-2fa.tsx
msgid "Verification Code Required" msgid "Verification Code Required"
msgstr "Código de verificación requerido" msgstr "Código de verificación requerido"
@ -9529,8 +9629,8 @@ msgstr "Verifica tu dirección de correo electrónico"
msgid "Verify your email address to unlock all features." msgid "Verify your email address to unlock all features."
msgstr "Verifica tu dirección de correo electrónico para desbloquear todas las funciones." msgstr "Verifica tu dirección de correo electrónico para desbloquear todas las funciones."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Verify your email to upload documents." msgid "Verify your email to upload documents."
msgstr "Verifica tu correo electrónico para subir documentos." msgstr "Verifica tu correo electrónico para subir documentos."
@ -9544,6 +9644,10 @@ msgstr "Verifica tu dirección de correo electrónico del equipo"
msgid "Vertical" msgid "Vertical"
msgstr "Vertical" msgstr "Vertical"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Vertical Align"
msgstr "Alineación vertical"
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx #: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
@ -10396,10 +10500,6 @@ msgstr "No puedes eliminar un grupo que tiene un rol superior al tuyo."
msgid "You cannot delete this item because the document has been sent to recipients" msgid "You cannot delete this item because the document has been sent to recipients"
msgstr "No puede eliminar este elemento porque el documento ha sido enviado a los destinatarios" msgstr "No puede eliminar este elemento porque el documento ha sido enviado a los destinatarios"
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "You cannot have more than {MAXIMUM_PASSKEYS} passkeys."
msgstr "No puedes tener más de {MAXIMUM_PASSKEYS} claves de acceso."
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx #: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
msgid "You cannot modify a group which has a higher role than you." msgid "You cannot modify a group which has a higher role than you."
msgstr "No puedes modificar un grupo que tiene un rol superior al tuyo." msgstr "No puedes modificar un grupo que tiene un rol superior al tuyo."
@ -10416,20 +10516,21 @@ msgstr "No puedes modificar a un miembro del equipo que tenga un rol más alto q
msgid "You cannot remove members from this team if the inherit member feature is enabled." msgid "You cannot remove members from this team if the inherit member feature is enabled."
msgstr "No puedes eliminar miembros de este equipo si la función de heredar miembros está habilitada." msgstr "No puedes eliminar miembros de este equipo si la función de heredar miembros está habilitada."
#: packages/ui/primitives/document-upload.tsx #: packages/ui/primitives/document-upload-button.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "You cannot upload documents at this time." msgid "You cannot upload documents at this time."
msgstr "No puede cargar documentos en este momento." msgstr "No puede cargar documentos en este momento."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "You cannot upload encrypted PDFs" msgid "You cannot upload encrypted PDFs"
msgstr "No puedes subir PDFs encriptados" msgstr "No puedes subir PDFs encriptados"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "You cannot upload more than {maximumEnvelopeItemCount} items per envelope." msgid "You cannot upload more than {maximumEnvelopeItemCount} items per envelope."
msgstr "No puede subir más de {maximumEnvelopeItemCount} elementos por sobre." msgstr "No puede subir más de {maximumEnvelopeItemCount} elementos por sobre."
@ -10505,9 +10606,9 @@ msgstr "Aún no has creado plantillas. Para crear una plantilla, por favor carga
msgid "You have not yet created or received any documents. To create a document please upload one." msgid "You have not yet created or received any documents. To create a document please upload one."
msgstr "Aún no has creado ni recibido documentos. Para crear un documento, por favor carga uno." msgstr "Aún no has creado ni recibido documentos. Para crear un documento, por favor carga uno."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "You have reached the limit of the number of files per envelope" msgid "You have reached the limit of the number of files per envelope"
msgstr "Has alcanzado el límite de archivos por sobre" msgstr "Has alcanzado el límite de archivos por sobre"
@ -10520,14 +10621,14 @@ msgstr "Has alcanzado el límite máximo de {0} plantillas directas. <0>¡Actual
msgid "You have reached the maximum number of teams for your plan. Please contact sales at <0>{SUPPORT_EMAIL}</0> if you would like to adjust your plan." msgid "You have reached the maximum number of teams for your plan. Please contact sales at <0>{SUPPORT_EMAIL}</0> if you would like to adjust your plan."
msgstr "Has alcanzado el número máximo de equipos para tu plan. Por favor, contacta con ventas en <0>{SUPPORT_EMAIL}</0> si deseas ajustar tu plan." msgstr "Has alcanzado el número máximo de equipos para tu plan. Por favor, contacta con ventas en <0>{SUPPORT_EMAIL}</0> si deseas ajustar tu plan."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "You have reached your document limit for this month. Please upgrade your plan." msgid "You have reached your document limit for this month. Please upgrade your plan."
msgstr "Ha alcanzado su límite de documentos para este mes. Por favor, actualice su plan." msgstr "Ha alcanzado su límite de documentos para este mes. Por favor, actualice su plan."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "You have reached your document limit." msgid "You have reached your document limit."
msgstr "Ha alcanzado su límite de documentos." msgstr "Ha alcanzado su límite de documentos."
@ -10717,7 +10818,7 @@ msgstr "Tu plan actual está vencido."
msgid "Your direct signing templates" msgid "Your direct signing templates"
msgstr "Tus {0} plantillas de firma directa" msgstr "Tus {0} plantillas de firma directa"
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "Your document failed to upload." msgid "Your document failed to upload."
msgstr "Tu documento no se pudo cargar." msgstr "Tu documento no se pudo cargar."
@ -10746,9 +10847,9 @@ msgstr "Tu documento ha sido enviado con éxito."
msgid "Your document has been successfully duplicated." msgid "Your document has been successfully duplicated."
msgstr "Tu documento ha sido duplicado con éxito." msgstr "Tu documento ha sido duplicado con éxito."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Your document has been uploaded successfully." msgid "Your document has been uploaded successfully."
msgstr "Tu documento ha sido subido con éxito." msgstr "Tu documento ha sido subido con éxito."
@ -10899,14 +11000,11 @@ msgstr "Tu plantilla ha sido duplicada con éxito."
msgid "Your template has been successfully deleted." msgid "Your template has been successfully deleted."
msgstr "Tu plantilla ha sido eliminada con éxito." msgstr "Tu plantilla ha sido eliminada con éxito."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Your template has been uploaded successfully." msgid "Your template has been uploaded successfully."
msgstr "Su plantilla ha sido subida exitosamente." msgstr "Su plantilla ha sido subida exitosamente."
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
msgid "Your template has been uploaded successfully. You will be redirected to the template page."
msgstr "Tu plantilla ha sido cargada exitosamente. Serás redirigido a la página de plantillas."
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx #: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx
msgid "Your template will be duplicated." msgid "Your template will be duplicated."
msgstr "Tu plantilla será duplicada." msgstr "Tu plantilla será duplicada."

View File

@ -8,7 +8,7 @@ msgstr ""
"Language: fr\n" "Language: fr\n"
"Project-Id-Version: documenso-app\n" "Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-11-07 03:40\n" "PO-Revision-Date: 2025-11-12 06:14\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: French\n" "Language-Team: French\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
@ -18,10 +18,6 @@ msgstr ""
"X-Crowdin-File: web.po\n" "X-Crowdin-File: web.po\n"
"X-Crowdin-File-ID: 8\n" "X-Crowdin-File-ID: 8\n"
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid " Enable direct link signing"
msgstr " Activer la signature par lien direct"
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid ".PDF documents accepted (max {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB)" msgid ".PDF documents accepted (max {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB)"
msgstr "Documents .PDF acceptés (max {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}Mo)" msgstr "Documents .PDF acceptés (max {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}Mo)"
@ -98,6 +94,11 @@ msgstr "{0, plural, one {# dossier} other {# dossiers}}"
msgid "{0, plural, one {# recipient} other {# recipients}}" msgid "{0, plural, one {# recipient} other {# recipients}}"
msgstr "{0, plural, one {# destinataire} other {# destinataires}}" msgstr "{0, plural, one {# destinataire} other {# destinataires}}"
#. placeholder {0}: envelope.recipients.length
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
msgid "{0, plural, one {# Recipient} other {# Recipients}}"
msgstr "{0, plural, one {# Destinataire} other {# Destinataires}}"
#. placeholder {0}: org.teams.length #. placeholder {0}: org.teams.length
#: apps/remix/app/routes/_authenticated+/dashboard.tsx #: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "{0, plural, one {# team} other {# teams}}" msgid "{0, plural, one {# team} other {# teams}}"
@ -151,6 +152,11 @@ msgstr "{0, plural, one {En attente d'1 destinataire} other {En attente de # des
msgid "{0}" msgid "{0}"
msgstr "{0}" msgstr "{0}"
#. placeholder {0}: file.name
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "{0} couldn't be uploaded:"
msgstr "{0} n'a pas pu être téléchargé :"
#. placeholder {0}: team.name #. placeholder {0}: team.name
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx #: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
msgid "{0} direct signing templates" msgid "{0} direct signing templates"
@ -169,9 +175,9 @@ msgstr "{0} vous a invité à {recipientActionVerb} un document"
#. placeholder {0}: remaining.documents #. placeholder {0}: remaining.documents
#. placeholder {1}: quota.documents #. placeholder {1}: quota.documents
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "{0} of {1} documents remaining this month." msgid "{0} of {1} documents remaining this month."
msgstr "{0} des {1} documents restants ce mois-ci." msgstr "{0} des {1} documents restants ce mois-ci."
@ -188,11 +194,6 @@ msgstr "{0} sur {1} ligne(s) sélectionnée(s)."
msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"." msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr "{0} représentant \"{1}\" vous a invité à {recipientActionVerb} le document \"{2}\"." msgstr "{0} représentant \"{1}\" vous a invité à {recipientActionVerb} le document \"{2}\"."
#. placeholder {0}: envelope.recipients.length
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
msgid "{0} Recipient(s)"
msgstr "{0} Destinataire(s)"
#. placeholder {0}: organisation.name #. placeholder {0}: organisation.name
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
msgid "{0} Teams" msgid "{0} Teams"
@ -206,6 +207,10 @@ msgstr "{browserInfo} sur {os}"
msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}" msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}"
msgstr "{charactersRemaining, plural, one {1 caractère restant} other {{charactersRemaining} caractères restants}}" msgstr "{charactersRemaining, plural, one {1 caractère restant} other {{charactersRemaining} caractères restants}}"
#: packages/email/template-components/template-access-auth-2fa.tsx
msgid "{expiresInMinutes, plural, one {This code will expire in # minute.} other {This code will expire in # minutes.}}"
msgstr "{expiresInMinutes, plural, one {Ce code expirera dans # minute.} other {Ce code expirera dans # minutes.}}"
#: packages/email/templates/document-invite.tsx #: packages/email/templates/document-invite.tsx
msgid "{inviterName} <0>({inviterEmail})</0>" msgid "{inviterName} <0>({inviterEmail})</0>"
msgstr "{inviterName} <0>({inviterEmail})</0>" msgstr "{inviterName} <0>({inviterEmail})</0>"
@ -254,6 +259,10 @@ msgstr "{inviterName} représentant \"{teamName}\" vous a invité à {0}<0/>\"{d
msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}" msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}"
msgstr "{inviterName} représentant \"{teamName}\" vous a invité à {action} {documentName}" msgstr "{inviterName} représentant \"{teamName}\" vous a invité à {action} {documentName}"
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "{MAXIMUM_PASSKEYS, plural, one {You cannot have more than # passkey.} other {You cannot have more than # passkeys.}}"
msgstr "{MAXIMUM_PASSKEYS, plural, one {Vous ne pouvez pas avoir plus de # clé d'accès.} other {Vous ne pouvez pas avoir plus de # clés d'accès.}}"
#: packages/lib/utils/document-audit-logs.ts #: packages/lib/utils/document-audit-logs.ts
msgid "{prefix} added a field" msgid "{prefix} added a field"
msgstr "{prefix} a ajouté un champ" msgstr "{prefix} a ajouté un champ"
@ -1231,6 +1240,7 @@ msgid "All templates"
msgstr "Tous les modèles" msgstr "Tous les modèles"
#: apps/remix/app/components/general/period-selector.tsx #: apps/remix/app/components/general/period-selector.tsx
#: apps/remix/app/components/filters/date-range-filter.tsx
msgid "All Time" msgid "All Time"
msgstr "Depuis toujours" msgstr "Depuis toujours"
@ -1312,6 +1322,10 @@ msgstr "Un email avec cette adresse existe déjà."
msgid "An error occurred" msgid "An error occurred"
msgstr "Une erreur est survenue" msgstr "Une erreur est survenue"
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "An error occurred during upload."
msgstr "Une erreur est survenue lors du téléchargement."
#: apps/remix/app/components/general/template/template-edit-form.tsx #: apps/remix/app/components/general/template/template-edit-form.tsx
msgid "An error occurred while adding fields." msgid "An error occurred while adding fields."
msgstr "Une erreur est survenue lors de l'ajout des champs." msgstr "Une erreur est survenue lors de l'ajout des champs."
@ -1477,9 +1491,8 @@ msgstr "Une erreur est survenue lors de la mise à jour de la signature."
msgid "An error occurred while updating your profile." msgid "An error occurred while updating your profile."
msgstr "Une erreur est survenue lors de la mise à jour de votre profil." msgstr "Une erreur est survenue lors de la mise à jour de votre profil."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "An error occurred while uploading your document." msgid "An error occurred while uploading your document."
msgstr "Une erreur est survenue lors de l'importation de votre document." msgstr "Une erreur est survenue lors de l'importation de votre document."
@ -1857,6 +1870,10 @@ msgstr "Noir"
msgid "Blue" msgid "Blue"
msgstr "Bleu" msgstr "Bleu"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Bottom"
msgstr "Bas"
#: apps/remix/app/components/forms/branding-preferences-form.tsx #: apps/remix/app/components/forms/branding-preferences-form.tsx
msgid "Brand Details" msgid "Brand Details"
msgstr "Détails de la marque" msgstr "Détails de la marque"
@ -2097,6 +2114,10 @@ msgstr "CCers"
msgid "Center" msgid "Center"
msgstr "Centre" msgstr "Centre"
#: apps/remix/app/components/forms/editor/editor-field-text-form.tsx
msgid "Character limit"
msgstr "Limite de caractères"
#: apps/remix/app/components/forms/editor/editor-field-text-form.tsx #: apps/remix/app/components/forms/editor/editor-field-text-form.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx #: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
msgid "Character Limit" msgid "Character Limit"
@ -2263,6 +2284,7 @@ msgstr "Compléter le Document"
msgid "Complete the fields for the following signers." msgid "Complete the fields for the following signers."
msgstr "Complétez les champs pour les signataires suivants." msgstr "Complétez les champs pour les signataires suivants."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-document-jobs-table.tsx #: apps/remix/app/components/tables/admin-document-jobs-table.tsx
#: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx #: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx
#: apps/remix/app/components/general/template/template-page-view-documents-table.tsx #: apps/remix/app/components/general/template/template-page-view-documents-table.tsx
@ -2543,11 +2565,6 @@ msgstr "Copier les liens de signature"
msgid "Copy token" msgid "Copy token"
msgstr "Copier le token" msgstr "Copier le token"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "couldn't be uploaded:"
msgstr "n'a pas pu être téléchargé :"
#: apps/remix/app/routes/_profile+/_layout.tsx #: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx #: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx #: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
@ -2739,9 +2756,11 @@ msgstr "Créez votre compte et commencez à utiliser la signature de documents
#: apps/remix/app/components/tables/templates-table.tsx #: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx #: apps/remix/app/components/tables/settings-security-passkey-table.tsx
#: apps/remix/app/components/tables/organisation-teams-table.tsx #: apps/remix/app/components/tables/organisation-teams-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table.tsx #: apps/remix/app/components/tables/documents-table.tsx
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx #: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/general/template/template-page-view-information.tsx #: apps/remix/app/components/general/template/template-page-view-information.tsx
#: apps/remix/app/components/general/template/template-page-view-documents-table.tsx #: apps/remix/app/components/general/template/template-page-view-documents-table.tsx
#: apps/remix/app/components/general/document/document-page-view-information.tsx #: apps/remix/app/components/general/document/document-page-view-information.tsx
@ -3222,6 +3241,10 @@ msgstr "Document \"{0}\" - Rejet Confirmé"
msgid "Document \"{0}\" Cancelled" msgid "Document \"{0}\" Cancelled"
msgstr "Document \"{0}\" Annulé" msgstr "Document \"{0}\" Annulé"
#: packages/ui/primitives/document-upload-button.tsx
msgid "Document (Legacy)"
msgstr "Document (Legacy)"
#: apps/remix/app/components/general/envelope-editor/envelope-editor.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor.tsx
msgid "Document & Recipients" msgid "Document & Recipients"
msgstr "Document & Destinataires" msgstr "Document & Destinataires"
@ -3354,6 +3377,10 @@ msgstr "Document trouvé dans votre compte"
msgid "Document ID" msgid "Document ID"
msgstr "ID du document" msgstr "ID du document"
#: apps/remix/app/components/general/document/document-page-view-information.tsx
msgid "Document ID (Legacy)"
msgstr "ID de Document (Legacy)"
#: apps/remix/app/components/general/document/document-status.tsx #: apps/remix/app/components/general/document/document-status.tsx
msgid "Document inbox" msgid "Document inbox"
msgstr "Boîte de réception des documents" msgstr "Boîte de réception des documents"
@ -3478,14 +3505,14 @@ msgid "Document updated successfully"
msgstr "Document mis à jour avec succès" msgstr "Document mis à jour avec succès"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Document upload disabled due to unpaid invoices" msgid "Document upload disabled due to unpaid invoices"
msgstr "Importation de documents désactivé en raison de factures impayées" msgstr "Importation de documents désactivé en raison de factures impayées"
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Document uploaded" msgid "Document uploaded"
msgstr "Document importé" msgstr "Document importé"
@ -3507,6 +3534,10 @@ msgctxt "Audit log format"
msgid "Document visibility updated" msgid "Document visibility updated"
msgstr "Visibilité du document mise à jour" msgstr "Visibilité du document mise à jour"
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
msgid "Document Volume"
msgstr "Volume de documents"
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx #: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document will be permanently deleted" msgid "Document will be permanently deleted"
msgstr "Le document sera supprimé de manière permanente" msgstr "Le document sera supprimé de manière permanente"
@ -3520,6 +3551,8 @@ msgstr "Documentation"
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.legacy_editor.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.legacy_editor.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx #: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/user-profile-timur.tsx #: apps/remix/app/components/general/user-profile-timur.tsx
#: apps/remix/app/components/general/app-nav-mobile.tsx #: apps/remix/app/components/general/app-nav-mobile.tsx
@ -3534,6 +3567,15 @@ msgstr "Documents"
msgid "Documents and resources related to this envelope." msgid "Documents and resources related to this envelope."
msgstr "Documents et ressources liés à cette enveloppe." msgstr "Documents et ressources liés à cette enveloppe."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Documents Completed"
msgstr "Documents Complétés"
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Documents Created"
msgstr "Documents Créés"
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
msgid "Documents created from template" msgid "Documents created from template"
msgstr "Documents créés à partir du modèle" msgstr "Documents créés à partir du modèle"
@ -3631,8 +3673,7 @@ msgstr "Faites glisser et déposez votre PDF ici."
msgid "Drag and drop or click to upload" msgid "Drag and drop or click to upload"
msgstr "Glissez-déposez ou cliquez pour importer" msgstr "Glissez-déposez ou cliquez pour importer"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Drag and drop your PDF file here" msgid "Drag and drop your PDF file here"
msgstr "Faites glisser et déposez votre fichier PDF ici" msgstr "Faites glisser et déposez votre fichier PDF ici"
@ -3736,6 +3777,7 @@ msgstr "Divulgation de signature électronique"
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx #: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/settings-nav-desktop.tsx #: apps/remix/app/components/general/settings-nav-desktop.tsx
@ -3925,6 +3967,10 @@ msgstr "Activez la personnalisation de la marque pour tous les documents de cett
msgid "Enable custom branding for all documents in this team" msgid "Enable custom branding for all documents in this team"
msgstr "Activez la personnalisation de la marque pour tous les documents de cette équipe" msgstr "Activez la personnalisation de la marque pour tous les documents de cette équipe"
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid "Enable direct link signing"
msgstr "Activer la signature par lien direct"
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx #: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: packages/lib/constants/template.ts #: packages/lib/constants/template.ts
msgid "Enable Direct Link Signing" msgid "Enable Direct Link Signing"
@ -4073,6 +4119,8 @@ msgstr "Enveloppe mise à jour"
#: apps/remix/app/components/general/template/template-edit-form.tsx #: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx #: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/envelope-signing/envelope-signer-page-renderer.tsx #: apps/remix/app/components/general/envelope-signing/envelope-signer-page-renderer.tsx
#: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
@ -4096,8 +4144,7 @@ msgstr "Enveloppe mise à jour"
#: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx #: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
@ -4106,7 +4153,6 @@ msgstr "Enveloppe mise à jour"
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-attachments-popover.tsx #: apps/remix/app/components/general/document/document-attachments-popover.tsx
#: apps/remix/app/components/general/document/document-attachments-popover.tsx #: apps/remix/app/components/general/document/document-attachments-popover.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx #: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
@ -4254,7 +4300,6 @@ msgstr "Échoués : {failedCount}"
msgid "Feature Flags" msgid "Feature Flags"
msgstr "Drapeaux de fonctionnalités" msgstr "Drapeaux de fonctionnalités"
#: apps/remix/app/components/forms/editor/editor-field-text-form.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx #: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
msgid "Field character limit" msgid "Field character limit"
msgstr "Limite de caractères du champ" msgstr "Limite de caractères du champ"
@ -4311,19 +4356,17 @@ msgid "Fields updated"
msgstr "Champs mis à jour" msgstr "Champs mis à jour"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "Le fichier ne peut pas dépasser {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} Mo" msgstr "Le fichier ne peut pas dépasser {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} Mo"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "Le fichier est plus grand que {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} Mo" msgstr "Le fichier est plus grand que {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} Mo"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "File is too small" msgid "File is too small"
msgstr "Le fichier est trop petit" msgstr "Le fichier est trop petit"
@ -4402,6 +4445,7 @@ msgstr "Mot de passe oublié ?"
msgid "Forgot your password?" msgid "Forgot your password?"
msgstr "Vous avez oublié votre mot de passe ?" msgstr "Vous avez oublié votre mot de passe ?"
#: apps/remix/app/components/tables/admin-organisations-table.tsx
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx #: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
msgid "Free" msgid "Free"
msgstr "Gratuit" msgstr "Gratuit"
@ -4934,6 +4978,10 @@ msgstr "Rejoindre {organisationName} sur Documenso"
msgid "Join our community on <0>Discord</0> for community support and discussion." msgid "Join our community on <0>Discord</0> for community support and discussion."
msgstr "Rejoignez notre communauté sur <0>Discord</0> pour obtenir de l'aide et discuter." msgstr "Rejoignez notre communauté sur <0>Discord</0> pour obtenir de l'aide et discuter."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Joined"
msgstr "Joint"
#. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' }) #. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' })
#: apps/remix/app/routes/_authenticated+/dashboard.tsx #: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "Joined {0}" msgid "Joined {0}"
@ -4967,10 +5015,18 @@ msgstr "14 derniers jours"
msgid "Last 30 days" msgid "Last 30 days"
msgstr "30 derniers jours" msgstr "30 derniers jours"
#: apps/remix/app/components/filters/date-range-filter.tsx
msgid "Last 30 Days"
msgstr "30 derniers jours"
#: apps/remix/app/components/general/period-selector.tsx #: apps/remix/app/components/general/period-selector.tsx
msgid "Last 7 days" msgid "Last 7 days"
msgstr "7 derniers jours" msgstr "7 derniers jours"
#: apps/remix/app/components/filters/date-range-filter.tsx
msgid "Last 90 Days"
msgstr "90 derniers jours"
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx #: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
msgid "Last Active" msgid "Last Active"
msgstr "Dernière activité" msgstr "Dernière activité"
@ -5000,9 +5056,9 @@ msgstr "Dernière mise à jour à"
msgid "Last used" msgid "Last used"
msgstr "Dernière utilisation" msgstr "Dernière utilisation"
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx #: apps/remix/app/components/filters/date-range-filter.tsx
msgid "Leaderboard" msgid "Last Year"
msgstr "Classement" msgstr "Dernière Année"
#: apps/remix/app/components/tables/user-organisations-table.tsx #: apps/remix/app/components/tables/user-organisations-table.tsx
#: apps/remix/app/components/dialogs/organisation-leave-dialog.tsx #: apps/remix/app/components/dialogs/organisation-leave-dialog.tsx
@ -5028,6 +5084,14 @@ msgstr "Gauche"
msgid "Legality of Electronic Signatures" msgid "Legality of Electronic Signatures"
msgstr "Légalité des signatures électroniques" msgstr "Légalité des signatures électroniques"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Letter spacing"
msgstr "Espacement des lettres"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Letter Spacing"
msgstr "Espacement des Lettres"
#: apps/remix/app/components/general/app-command-menu.tsx #: apps/remix/app/components/general/app-command-menu.tsx
msgid "Light Mode" msgid "Light Mode"
msgstr "Mode clair" msgstr "Mode clair"
@ -5036,6 +5100,14 @@ msgstr "Mode clair"
msgid "Like to have your own public profile with agreements?" msgid "Like to have your own public profile with agreements?"
msgstr "Vous voulez avoir votre propre profil public avec des accords ?" msgstr "Vous voulez avoir votre propre profil public avec des accords ?"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Line height"
msgstr "Hauteur de ligne"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Line Height"
msgstr "Hauteur de Ligne"
#: packages/email/templates/confirm-team-email.tsx #: packages/email/templates/confirm-team-email.tsx
msgid "Link expires in 1 hour." msgid "Link expires in 1 hour."
msgstr "Le lien expire dans 1 heure." msgstr "Le lien expire dans 1 heure."
@ -5315,7 +5387,10 @@ msgstr "Membre depuis"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
#: apps/remix/app/components/tables/team-groups-table.tsx #: apps/remix/app/components/tables/team-groups-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-groups-table.tsx #: apps/remix/app/components/tables/organisation-groups-table.tsx
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx #: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx #: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
msgid "Members" msgid "Members"
@ -5333,6 +5408,10 @@ msgstr "Message"
msgid "Message <0>(Optional)</0>" msgid "Message <0>(Optional)</0>"
msgstr "Message <0>(Optionnel)</0>" msgstr "Message <0>(Optionnel)</0>"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Middle"
msgstr "Milieu"
#: apps/remix/app/components/forms/editor/editor-field-number-form.tsx #: apps/remix/app/components/forms/editor/editor-field-number-form.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx
msgid "Min" msgid "Min"
@ -5408,7 +5487,8 @@ msgstr "N/A"
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx #: apps/remix/app/components/tables/settings-security-passkey-table.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx #: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx #: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx #: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-document-jobs-table.tsx #: apps/remix/app/components/tables/admin-document-jobs-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
@ -5475,7 +5555,6 @@ msgstr "Ne jamais expirer"
msgid "New Password" msgid "New Password"
msgstr "Nouveau Mot de Passe" msgstr "Nouveau Mot de Passe"
#: apps/remix/app/components/dialogs/template-create-dialog.tsx
#: apps/remix/app/components/dialogs/template-create-dialog.tsx #: apps/remix/app/components/dialogs/template-create-dialog.tsx
msgid "New Template" msgid "New Template"
msgstr "Nouveau modèle" msgstr "Nouveau modèle"
@ -5739,13 +5818,11 @@ msgstr "Seules les administrateurs peuvent accéder et voir le document"
msgid "Only managers and above can access and view the document" msgid "Only managers and above can access and view the document"
msgstr "Seuls les responsables et au-dessus peuvent accéder et voir le document" msgstr "Seuls les responsables et au-dessus peuvent accéder et voir le document"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Only one file can be uploaded at a time" msgid "Only one file can be uploaded at a time"
msgstr "Un seul fichier peut être téléchargé à la fois" msgstr "Un seul fichier peut être téléchargé à la fois"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Only PDF files are allowed" msgid "Only PDF files are allowed"
msgstr "Seuls les fichiers PDF sont autorisés" msgstr "Seuls les fichiers PDF sont autorisés"
@ -5813,6 +5890,11 @@ msgstr "Paramètres du groupe d'organisation"
msgid "Organisation has been updated successfully" msgid "Organisation has been updated successfully"
msgstr "L'organisation a été mise à jour avec succès" msgstr "L'organisation a été mise à jour avec succès"
#: apps/remix/app/routes/_authenticated+/admin+/organisation-insights._index.tsx
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
msgid "Organisation Insights"
msgstr "Aperçu de l'Organisation"
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
msgid "Organisation invitation" msgid "Organisation invitation"
msgstr "Invitation à l'organisation" msgstr "Invitation à l'organisation"
@ -5909,6 +5991,7 @@ msgid "Organize your documents and templates"
msgstr "Organisez vos documents et modèles" msgstr "Organisez vos documents et modèles"
#: apps/remix/app/components/dialogs/envelope-download-dialog.tsx #: apps/remix/app/components/dialogs/envelope-download-dialog.tsx
msgctxt "Original document (adjective)"
msgid "Original" msgid "Original"
msgstr "Original" msgstr "Original"
@ -5949,6 +6032,10 @@ msgstr "Page {0} sur {1}"
msgid "Page {0} of {numPages}" msgid "Page {0} of {numPages}"
msgstr "Page {0} sur {numPages}" msgstr "Page {0} sur {numPages}"
#: apps/remix/app/components/tables/admin-organisations-table.tsx
msgid "Paid"
msgstr "Payé"
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx #: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
#: apps/remix/app/components/forms/signin.tsx #: apps/remix/app/components/forms/signin.tsx
msgid "Passkey" msgid "Passkey"
@ -6074,6 +6161,7 @@ msgid "per year"
msgstr "par an" msgstr "par an"
#: apps/remix/app/components/tables/user-organisations-table.tsx #: apps/remix/app/components/tables/user-organisations-table.tsx
msgctxt "Personal organisation (adjective)"
msgid "Personal" msgid "Personal"
msgstr "Personnel" msgstr "Personnel"
@ -6273,7 +6361,6 @@ msgstr "Veuillez essayer un autre domaine."
msgid "Please try again and make sure you enter the correct email address." msgid "Please try again and make sure you enter the correct email address."
msgstr "Veuillez réessayer et assurez-vous d'entrer la bonne adresse email." msgstr "Veuillez réessayer et assurez-vous d'entrer la bonne adresse email."
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/dialogs/template-create-dialog.tsx #: apps/remix/app/components/dialogs/template-create-dialog.tsx
msgid "Please try again later." msgid "Please try again later."
msgstr "Veuillez réessayer plus tard." msgstr "Veuillez réessayer plus tard."
@ -6439,6 +6526,7 @@ msgid "Read only"
msgstr "Lecture seule" msgstr "Lecture seule"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx #: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
#: packages/ui/components/document/envelope-recipient-field-tooltip.tsx
msgid "Read Only" msgid "Read Only"
msgstr "Lecture Seule" msgstr "Lecture Seule"
@ -6874,6 +6962,7 @@ msgstr "Droit"
#: apps/remix/app/components/tables/organisation-members-table.tsx #: apps/remix/app/components/tables/organisation-members-table.tsx
#: apps/remix/app/components/tables/organisation-member-invites-table.tsx #: apps/remix/app/components/tables/organisation-member-invites-table.tsx
#: apps/remix/app/components/tables/organisation-groups-table.tsx #: apps/remix/app/components/tables/organisation-groups-table.tsx
#: apps/remix/app/components/tables/admin-organisations-table.tsx
#: apps/remix/app/components/embed/authoring/configure-document-recipients.tsx #: apps/remix/app/components/embed/authoring/configure-document-recipients.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx #: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx #: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
@ -6936,7 +7025,6 @@ msgstr "Recherche par ID de réclamation ou nom"
msgid "Search by document title" msgid "Search by document title"
msgstr "Recherche par titre de document" msgstr "Recherche par titre de document"
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
msgid "Search by name or email" msgid "Search by name or email"
msgstr "Recherche par nom ou e-mail" msgstr "Recherche par nom ou e-mail"
@ -6945,6 +7033,10 @@ msgstr "Recherche par nom ou e-mail"
msgid "Search by organisation ID, name, customer ID or owner email" msgid "Search by organisation ID, name, customer ID or owner email"
msgstr "Rechercher par ID d'organisation, nom, ID client ou e-mail du propriétaire" msgstr "Rechercher par ID d'organisation, nom, ID client ou e-mail du propriétaire"
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
msgid "Search by organisation name"
msgstr "Rechercher par nom d'organisation"
#: apps/remix/app/components/general/document/document-search.tsx #: apps/remix/app/components/general/document/document-search.tsx
msgid "Search documents..." msgid "Search documents..."
msgstr "Rechercher des documents..." msgstr "Rechercher des documents..."
@ -7115,6 +7207,10 @@ msgstr "Sélectionnez les membres à inclure dans ce groupe"
msgid "Select triggers" msgid "Select triggers"
msgstr "Sélectionner les déclencheurs" msgstr "Sélectionner les déclencheurs"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Select vertical align"
msgstr "Sélectionner l'alignement vertical"
#: apps/remix/app/components/dialogs/folder-update-dialog.tsx #: apps/remix/app/components/dialogs/folder-update-dialog.tsx
msgid "Select visibility" msgid "Select visibility"
msgstr "Sélectionner la visibilité" msgstr "Sélectionner la visibilité"
@ -7485,12 +7581,16 @@ msgstr "Signatures collectées"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx #: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx #: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: apps/remix/app/components/dialogs/envelope-download-dialog.tsx
#: packages/ui/components/document/envelope-recipient-field-tooltip.tsx #: packages/ui/components/document/envelope-recipient-field-tooltip.tsx
#: packages/ui/components/document/document-read-only-fields.tsx #: packages/ui/components/document/document-read-only-fields.tsx
msgid "Signed" msgid "Signed"
msgstr "Signé" msgstr "Signé"
#: apps/remix/app/components/dialogs/envelope-download-dialog.tsx
msgctxt "Signed document (adjective)"
msgid "Signed"
msgstr "Signé"
#: packages/lib/constants/recipient-roles.ts #: packages/lib/constants/recipient-roles.ts
msgctxt "Recipient role actioned" msgctxt "Recipient role actioned"
msgid "Signed" msgid "Signed"
@ -7556,11 +7656,6 @@ msgstr "Des liens de signature ont été générés pour ce document."
msgid "Signing order is enabled." msgid "Signing order is enabled."
msgstr "L'ordre de signature est activé." msgstr "L'ordre de signature est activé."
#: apps/remix/app/routes/_authenticated+/admin+/leaderboard.tsx
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx
msgid "Signing Volume"
msgstr "Volume de signatures"
#: apps/remix/app/components/forms/signup.tsx #: apps/remix/app/components/forms/signup.tsx
msgid "Signups are disabled." msgid "Signups are disabled."
msgstr "Les inscriptions sont désactivées." msgstr "Les inscriptions sont désactivées."
@ -7594,7 +7689,6 @@ msgstr "Certains signataires n'ont pas été assignés à un champ de signature.
#: apps/remix/app/components/tables/organisation-member-invites-table.tsx #: apps/remix/app/components/tables/organisation-member-invites-table.tsx
#: apps/remix/app/components/general/billing-plans.tsx #: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx #: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx #: apps/remix/app/components/general/teams/team-email-usage.tsx
#: apps/remix/app/components/general/teams/team-email-dropdown.tsx #: apps/remix/app/components/general/teams/team-email-dropdown.tsx
#: apps/remix/app/components/general/organisations/organisation-invitations.tsx #: apps/remix/app/components/general/organisations/organisation-invitations.tsx
@ -7712,6 +7806,7 @@ msgstr "Statistiques"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/audit-log.tsx #: apps/remix/app/routes/_internal+/[__htmltopdf]+/audit-log.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx #: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx #: apps/remix/app/components/tables/organisation-email-domains-table.tsx
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx #: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
@ -7905,6 +8000,7 @@ msgstr "Thème système"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/organisation-teams-table.tsx #: apps/remix/app/components/tables/organisation-teams-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Team" msgid "Team"
msgstr "Équipe" msgstr "Équipe"
@ -7990,6 +8086,7 @@ msgstr "Membres de l'équipe"
msgid "Team members have been added." msgid "Team members have been added."
msgstr "Les membres de l'équipe ont été ajoutés." msgstr "Les membres de l'équipe ont été ajoutés."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/forms/team-update-form.tsx #: apps/remix/app/components/forms/team-update-form.tsx
#: apps/remix/app/components/dialogs/team-create-dialog.tsx #: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Team Name" msgid "Team Name"
@ -8034,6 +8131,9 @@ msgstr "URL de l'équipe"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/dashboard.tsx #: apps/remix/app/routes/_authenticated+/dashboard.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/general/org-menu-switcher.tsx #: apps/remix/app/components/general/org-menu-switcher.tsx
msgid "Teams" msgid "Teams"
msgstr "Équipes" msgstr "Équipes"
@ -8056,6 +8156,11 @@ msgstr "Équipes auxquelles ce groupe d'organisation est actuellement attribué"
msgid "Template" msgid "Template"
msgstr "Modèle" msgstr "Modèle"
#: apps/remix/app/components/dialogs/template-create-dialog.tsx
#: packages/ui/primitives/document-upload-button.tsx
msgid "Template (Legacy)"
msgstr "Modèle (Legacy)"
#: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx #: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx
msgid "Template Created" msgid "Template Created"
msgstr "Modèle créé" msgstr "Modèle créé"
@ -8084,6 +8189,10 @@ msgstr "Le modèle a été retiré de votre profil public."
msgid "Template has been updated." msgid "Template has been updated."
msgstr "Le modèle a été mis à jour." msgstr "Le modèle a été mis à jour."
#: apps/remix/app/components/general/template/template-page-view-information.tsx
msgid "Template ID (Legacy)"
msgstr "ID de Modèle (Legacy)"
#: apps/remix/app/components/general/legacy-field-warning-popover.tsx #: apps/remix/app/components/general/legacy-field-warning-popover.tsx
msgid "Template is using legacy field insertion" msgid "Template is using legacy field insertion"
msgstr "Le modèle utilise l'insertion de champ héritée" msgstr "Le modèle utilise l'insertion de champ héritée"
@ -8108,8 +8217,8 @@ msgstr "Titre du modèle"
msgid "Template updated successfully" msgid "Template updated successfully"
msgstr "Modèle mis à jour avec succès" msgstr "Modèle mis à jour avec succès"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Template uploaded" msgid "Template uploaded"
msgstr "Modèle de document téléchargé" msgstr "Modèle de document téléchargé"
@ -8266,9 +8375,8 @@ msgstr "Le document que vous cherchez n'a pas pu être trouvé."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
msgid "The document you are looking for may have been removed, renamed or may have never\n" msgid "The document you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Le document que vous recherchez a peut-être été supprimé, renommé ou n'a jamais existé."
msgstr "Le document que vous cherchez a peut-être été supprimé, renommé ou n'a peut-être jamais existé."
#: packages/ui/components/document/document-send-email-message-helper.tsx #: packages/ui/components/document/document-send-email-message-helper.tsx
msgid "The document's name" msgid "The document's name"
@ -8279,9 +8387,8 @@ msgid "The email address which will show up in the \"Reply To\" field in emails"
msgstr "L'adresse e-mail qui apparaîtra dans le champ \"Répondre à\" dans les courriels" msgstr "L'adresse e-mail qui apparaîtra dans le champ \"Répondre à\" dans les courriels"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
msgid "The email domain you are looking for may have been removed, renamed or may have never\n" msgid "The email domain you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Le domaine de messagerie que vous recherchez a peut-être été supprimé, renommé ou n'a jamais existé."
msgstr "Le domaine de messagerie que vous recherchez a peut-être été supprimé, renommé ou n'a peut-être jamais existé."
#: apps/remix/app/components/forms/signin.tsx #: apps/remix/app/components/forms/signin.tsx
msgid "The email or password provided is incorrect" msgid "The email or password provided is incorrect"
@ -8337,23 +8444,17 @@ msgid "The organisation email has been created successfully."
msgstr "L'e-mail de l'organisation a été créé avec succès." msgstr "L'e-mail de l'organisation a été créé avec succès."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "The organisation group you are looking for may have been removed, renamed or may have never\n" msgid "The organisation group you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Le groupe d'organisation que vous recherchez a peut-être été supprimé, renommé ou n'a jamais existé."
msgstr "Le groupe d'organisation que vous cherchez peut avoir été supprimé, renommé ou n'a peut-être jamais existé."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "The organisation role that will be applied to all members in this group." msgid "The organisation role that will be applied to all members in this group."
msgstr "Le rôle d'organisation qui sera appliqué à tous les membres de ce groupe." msgstr "Le rôle d'organisation qui sera appliqué à tous les membres de ce groupe."
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "L'organisation que vous cherchez peut avoir été supprimée, renommée ou n'a peut-être jamais existé."
#: apps/remix/app/routes/_authenticated+/_layout.tsx #: apps/remix/app/routes/_authenticated+/_layout.tsx
msgid "The organisation you are looking for may have been removed, renamed or may have never\n" #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
" existed." msgid "The organisation you are looking for may have been removed, renamed or may have never existed."
msgstr "L'organisation que vous cherchez peut avoir été supprimée, renommée ou n'a peut-être jamais existé." msgstr "L'organisation que vous recherchez a peut-être été supprimée, renommée ou n'a jamais existé."
#: apps/remix/app/components/general/generic-error-layout.tsx #: apps/remix/app/components/general/generic-error-layout.tsx
msgid "The page you are looking for was moved, removed, renamed or might never have existed." msgid "The page you are looking for was moved, removed, renamed or might never have existed."
@ -8444,14 +8545,9 @@ msgid "The team email <0>{teamEmail}</0> has been removed from the following tea
msgstr "L'email d'équipe <0>{teamEmail}</0> a été supprimé de l'équipe suivante" msgstr "L'email d'équipe <0>{teamEmail}</0> a été supprimé de l'équipe suivante"
#: apps/remix/app/routes/_authenticated+/_layout.tsx #: apps/remix/app/routes/_authenticated+/_layout.tsx
msgid "The team you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "L'équipe que vous cherchez peut avoir été supprimée, renommée ou n'a peut-être jamais existé."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
msgid "The team you are looking for may have been removed, renamed or may have never\n" msgid "The team you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "L'équipe que vous recherchez a peut-être été supprimée, renommée ou n'a jamais existé."
msgstr "L'équipe que vous cherchez a peut-être été supprimée, renommée ou n'a peut-être jamais existé."
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx #: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
msgid "The template has been moved successfully." msgid "The template has been moved successfully."
@ -8466,9 +8562,8 @@ msgid "The template you are looking for could not be found."
msgstr "Le modèle que vous cherchez n'a pas pu être trouvé." msgstr "Le modèle que vous cherchez n'a pas pu être trouvé."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
msgid "The template you are looking for may have been removed, renamed or may have never\n" msgid "The template you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Le modèle que vous recherchez a peut-être été supprimé, renommé ou n'a jamais existé."
msgstr "Le modèle que vous cherchez a peut-être été supprimé, renommé ou n'a peut-être jamais existé."
#: apps/remix/app/components/dialogs/webhook-test-dialog.tsx #: apps/remix/app/components/dialogs/webhook-test-dialog.tsx
msgid "The test webhook has been successfully sent to your endpoint." msgid "The test webhook has been successfully sent to your endpoint."
@ -8508,9 +8603,8 @@ msgid "The URL for Documenso to send webhook events to."
msgstr "L'URL pour Documenso pour envoyer des événements webhook." msgstr "L'URL pour Documenso pour envoyer des événements webhook."
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
msgid "The user you are looking for may have been removed, renamed or may have never\n" msgid "The user you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "L'utilisateur que vous recherchez a peut-être été supprimé, renommé ou n'a jamais existé."
msgstr "L'utilisateur que vous cherchez peut avoir été supprimé, renommé ou n'a peut-être jamais existé."
#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx #: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
msgid "The user's two factor authentication has been reset successfully." msgid "The user's two factor authentication has been reset successfully."
@ -8529,9 +8623,8 @@ msgid "The webhook was successfully created."
msgstr "Le webhook a été créé avec succès." msgstr "Le webhook a été créé avec succès."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
msgid "The webhook you are looking for may have been removed, renamed or may have never\n" msgid "The webhook you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Le webhook que vous recherchez a peut-être été supprimé, renommé ou n'a jamais existé."
msgstr "Le webhook que vous recherchez a peut-être été supprimé, renommé ou n'a peut-être jamais existé."
#: apps/remix/app/components/tables/documents-table-empty-state.tsx #: apps/remix/app/components/tables/documents-table-empty-state.tsx
msgid "There are no active drafts at the current moment. You can upload a document to start drafting." msgid "There are no active drafts at the current moment. You can upload a document to start drafting."
@ -8587,10 +8680,6 @@ msgstr "Cette action est réversible, mais veuillez faire attention car le compt
msgid "This claim is locked and cannot be deleted." msgid "This claim is locked and cannot be deleted."
msgstr "Cette réclamation est verrouillée et ne peut pas être supprimée." msgstr "Cette réclamation est verrouillée et ne peut pas être supprimée."
#: packages/email/template-components/template-access-auth-2fa.tsx
msgid "This code will expire in {expiresInMinutes} minutes."
msgstr "Ce code expirera dans {expiresInMinutes} minutes."
#: packages/email/template-components/template-document-super-delete.tsx #: packages/email/template-components/template-document-super-delete.tsx
msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." 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." msgstr "Ce document ne peut pas être récupéré, si vous souhaitez contester la raison des documents futurs, veuillez contacter le support."
@ -8836,6 +8925,7 @@ msgstr "Fuseau horaire"
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx #: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
#: apps/remix/app/components/tables/templates-table.tsx #: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table.tsx #: apps/remix/app/components/tables/documents-table.tsx
#: apps/remix/app/components/general/template/template-page-view-documents-table.tsx #: apps/remix/app/components/general/template/template-page-view-documents-table.tsx
@ -8848,6 +8938,19 @@ msgstr "Titre"
msgid "Title cannot be empty" msgid "Title cannot be empty"
msgstr "Le titre ne peut pas être vide" msgstr "Le titre ne peut pas être vide"
#. placeholder {0}: actionVerb.toLowerCase()
#. placeholder {1}: actionTarget.toLowerCase()
#. placeholder {2}: recipient.email
#: apps/remix/app/components/general/document-signing/document-signing-auth-account.tsx
msgid "To {0} this {1}, you need to be logged in as <0>{2}</0>"
msgstr "Pour {0} ce {1}, vous devez être connecté en tant que <0>{2}</0>"
#. placeholder {0}: actionVerb.toLowerCase()
#. placeholder {1}: actionTarget.toLowerCase()
#: apps/remix/app/components/general/document-signing/document-signing-auth-account.tsx
msgid "To {0} this {1}, you need to be logged in."
msgstr "Pour {0} ce {1}, vous devez être connecté."
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
msgid "To accept this invitation you must create an account." msgid "To accept this invitation you must create an account."
msgstr "Pour accepter cette invitation, vous devez créer un compte." msgstr "Pour accepter cette invitation, vous devez créer un compte."
@ -8888,6 +8991,10 @@ msgstr "Pour accéder à votre compte, veuillez confirmer votre adresse e-mail e
msgid "To mark this document as viewed, you need to be logged in as <0>{0}</0>" msgid "To mark this document as viewed, you need to be logged in as <0>{0}</0>"
msgstr "Pour marquer ce document comme consulté, vous devez être connecté en tant que <0>{0}</0>" msgstr "Pour marquer ce document comme consulté, vous devez être connecté en tant que <0>{0}</0>"
#: apps/remix/app/components/general/document-signing/document-signing-auth-account.tsx
msgid "To mark this document as viewed, you need to be logged in."
msgstr "Pour marquer ce document comme vu, vous devez être connecté."
#. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select' #. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select'
#. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select' #. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select'
#: packages/ui/primitives/template-flow/add-template-fields.tsx #: packages/ui/primitives/template-flow/add-template-fields.tsx
@ -8943,6 +9050,10 @@ msgstr "Le token a expiré. Veuillez réessayer."
msgid "Token name" msgid "Token name"
msgstr "Nom du token" msgstr "Nom du token"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Top"
msgstr "Haut"
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx #: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
msgid "Total Documents" msgid "Total Documents"
msgstr "Total des documents" msgstr "Total des documents"
@ -9122,8 +9233,7 @@ msgstr "Non complet"
msgid "Unknown" msgid "Unknown"
msgstr "Inconnu" msgstr "Inconnu"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Unknown error" msgid "Unknown error"
msgstr "Erreur inconnue" msgstr "Erreur inconnue"
@ -9281,7 +9391,7 @@ msgstr "Mise à jour du mot de passe..."
msgid "Updating Your Information" msgid "Updating Your Information"
msgstr "Mise à jour de vos informations" msgstr "Mise à jour de vos informations"
#: packages/ui/primitives/document-upload.tsx #: packages/ui/primitives/document-upload-button.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "Upgrade" msgid "Upgrade"
msgstr "Améliorer" msgstr "Améliorer"
@ -9291,7 +9401,7 @@ msgstr "Améliorer"
msgid "Upgrade <0>{0}</0> to {planName}" msgid "Upgrade <0>{0}</0> to {planName}"
msgstr "Mettre à niveau <0>{0}</0> vers {planName}" msgstr "Mettre à niveau <0>{0}</0> vers {planName}"
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Upgrade your plan to upload more documents" msgid "Upgrade your plan to upload more documents"
msgstr "Mettez à niveau votre plan pour importer plus de documents" msgstr "Mettez à niveau votre plan pour importer plus de documents"
@ -9333,9 +9443,9 @@ msgstr "Importer un document personnalisé"
msgid "Upload disabled" msgid "Upload disabled"
msgstr "Importation désactivée" msgstr "Importation désactivée"
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
#: packages/ui/primitives/document-upload.tsx #: packages/ui/primitives/document-upload-button.tsx
msgid "Upload Document" msgid "Upload Document"
msgstr "Importer le document" msgstr "Importer le document"
@ -9343,14 +9453,9 @@ msgstr "Importer le document"
msgid "Upload documents and add recipients" msgid "Upload documents and add recipients"
msgstr "Importer des documents et ajouter des destinataires" msgstr "Importer des documents et ajouter des destinataires"
#: packages/ui/primitives/document-upload.tsx
msgid "Upload Envelope"
msgstr "Télécharger l'enveloppe"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Upload failed" msgid "Upload failed"
msgstr "Échec de l'importation" msgstr "Échec de l'importation"
@ -9358,11 +9463,11 @@ msgstr "Échec de l'importation"
msgid "Upload Signature" msgid "Upload Signature"
msgstr "Importer une signature" msgstr "Importer une signature"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: packages/ui/primitives/document-upload-button.tsx
msgid "Upload Template" msgid "Upload Template"
msgstr "Télécharger le modèle" msgstr "Télécharger le modèle"
#: packages/ui/primitives/document-upload.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "Upload Template Document" msgid "Upload Template Document"
msgstr "Importer le document modèle" msgstr "Importer le document modèle"
@ -9389,17 +9494,10 @@ msgid "Uploaded file not an allowed file type"
msgstr "Le fichier importé n'est pas un type de fichier autorisé" msgstr "Le fichier importé n'est pas un type de fichier autorisé"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Uploading" msgid "Uploading"
msgstr "Importation en cours" msgstr "Importation en cours"
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Uploading document..."
msgstr "Importation du document..."
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
msgid "Uploading template..."
msgstr "Téléchargement du modèle en cours..."
#: apps/remix/app/components/general/document/document-attachments-popover.tsx #: apps/remix/app/components/general/document/document-attachments-popover.tsx
msgid "URL" msgid "URL"
msgstr "URL" msgstr "URL"
@ -9472,6 +9570,7 @@ msgid "User with this email already exists. Please use a different email address
msgstr "Un utilisateur avec cet e-mail existe déjà. Veuillez utiliser une adresse e-mail différente." msgstr "Un utilisateur avec cet e-mail existe déjà. Veuillez utiliser une adresse e-mail différente."
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx #: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Users" msgid "Users"
msgstr "Utilisateurs" msgstr "Utilisateurs"
@ -9494,6 +9593,10 @@ msgstr "La validation a échoué"
msgid "Value" msgid "Value"
msgstr "Valeur" msgstr "Valeur"
#: packages/lib/types/field-meta.ts
msgid "Value must be a number"
msgstr "La valeur doit être un nombre"
#: packages/email/template-components/template-access-auth-2fa.tsx #: packages/email/template-components/template-access-auth-2fa.tsx
msgid "Verification Code Required" msgid "Verification Code Required"
msgstr "Code de vérification requis" msgstr "Code de vérification requis"
@ -9526,8 +9629,8 @@ msgstr "Vérifiez votre adresse e-mail"
msgid "Verify your email address to unlock all features." msgid "Verify your email address to unlock all features."
msgstr "Vérifiez votre adresse e-mail pour débloquer toutes les fonctionnalités." msgstr "Vérifiez votre adresse e-mail pour débloquer toutes les fonctionnalités."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Verify your email to upload documents." msgid "Verify your email to upload documents."
msgstr "Vérifiez votre e-mail pour importer des documents." msgstr "Vérifiez votre e-mail pour importer des documents."
@ -9541,6 +9644,10 @@ msgstr "Vérifiez votre adresse e-mail d'équipe"
msgid "Vertical" msgid "Vertical"
msgstr "Vertical" msgstr "Vertical"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Vertical Align"
msgstr "Alignement Vertical"
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx #: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
@ -10393,10 +10500,6 @@ msgstr "Vous ne pouvez pas supprimer un groupe qui a un rôle supérieur au vôt
msgid "You cannot delete this item because the document has been sent to recipients" msgid "You cannot delete this item because the document has been sent to recipients"
msgstr "Vous ne pouvez pas supprimer cet élément car le document a été envoyé aux destinataires" msgstr "Vous ne pouvez pas supprimer cet élément car le document a été envoyé aux destinataires"
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "You cannot have more than {MAXIMUM_PASSKEYS} passkeys."
msgstr "Vous ne pouvez pas avoir plus de {MAXIMUM_PASSKEYS} clés de passkey."
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx #: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
msgid "You cannot modify a group which has a higher role than you." msgid "You cannot modify a group which has a higher role than you."
msgstr "Vous ne pouvez pas modifier un groupe qui a un rôle supérieur au vôtre." msgstr "Vous ne pouvez pas modifier un groupe qui a un rôle supérieur au vôtre."
@ -10413,20 +10516,21 @@ msgstr "Vous ne pouvez pas modifier un membre de l'équipe qui a un rôle plus
msgid "You cannot remove members from this team if the inherit member feature is enabled." msgid "You cannot remove members from this team if the inherit member feature is enabled."
msgstr "Vous ne pouvez pas retirer des membres de cette équipe si la fonctionnalité d'héritage de membre est activée." msgstr "Vous ne pouvez pas retirer des membres de cette équipe si la fonctionnalité d'héritage de membre est activée."
#: packages/ui/primitives/document-upload.tsx #: packages/ui/primitives/document-upload-button.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "You cannot upload documents at this time." msgid "You cannot upload documents at this time."
msgstr "Vous ne pouvez pas importer de documents pour le moment." msgstr "Vous ne pouvez pas importer de documents pour le moment."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "You cannot upload encrypted PDFs" msgid "You cannot upload encrypted PDFs"
msgstr "Vous ne pouvez pas importer de PDF cryptés" msgstr "Vous ne pouvez pas importer de PDF cryptés"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "You cannot upload more than {maximumEnvelopeItemCount} items per envelope." msgid "You cannot upload more than {maximumEnvelopeItemCount} items per envelope."
msgstr "Vous ne pouvez pas télécharger plus de {maximumEnvelopeItemCount} articles par enveloppe." msgstr "Vous ne pouvez pas télécharger plus de {maximumEnvelopeItemCount} articles par enveloppe."
@ -10502,9 +10606,9 @@ msgstr "Vous n'avez pas encore créé de modèles. Pour créer un modèle, veuil
msgid "You have not yet created or received any documents. To create a document please upload one." msgid "You have not yet created or received any documents. To create a document please upload one."
msgstr "Vous n'avez pas encore créé ou reçu de documents. Pour créer un document, veuillez en importer un." msgstr "Vous n'avez pas encore créé ou reçu de documents. Pour créer un document, veuillez en importer un."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "You have reached the limit of the number of files per envelope" msgid "You have reached the limit of the number of files per envelope"
msgstr "Vous avez atteint la limite du nombre de fichiers par enveloppe" msgstr "Vous avez atteint la limite du nombre de fichiers par enveloppe"
@ -10517,14 +10621,14 @@ msgstr "Vous avez atteint la limite maximale de {0} modèles directs. <0>Mettez
msgid "You have reached the maximum number of teams for your plan. Please contact sales at <0>{SUPPORT_EMAIL}</0> if you would like to adjust your plan." msgid "You have reached the maximum number of teams for your plan. Please contact sales at <0>{SUPPORT_EMAIL}</0> if you would like to adjust your plan."
msgstr "Vous avez atteint le nombre maximum d'équipes pour votre abonnement. Veuillez contacter le service commercial à <0>{SUPPORT_EMAIL}</0> si vous souhaitez ajuster votre plan." msgstr "Vous avez atteint le nombre maximum d'équipes pour votre abonnement. Veuillez contacter le service commercial à <0>{SUPPORT_EMAIL}</0> si vous souhaitez ajuster votre plan."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "You have reached your document limit for this month. Please upgrade your plan." msgid "You have reached your document limit for this month. Please upgrade your plan."
msgstr "Vous avez atteint votre limite de documents pour ce mois. Veuillez passer à l'abonnement supérieur." msgstr "Vous avez atteint votre limite de documents pour ce mois. Veuillez passer à l'abonnement supérieur."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "You have reached your document limit." msgid "You have reached your document limit."
msgstr "Vous avez atteint votre limite de documents." msgstr "Vous avez atteint votre limite de documents."
@ -10714,7 +10818,7 @@ msgstr "Votre plan actuel est arrivé à échéance."
msgid "Your direct signing templates" msgid "Your direct signing templates"
msgstr "Vos modèles de signature directe" msgstr "Vos modèles de signature directe"
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "Your document failed to upload." msgid "Your document failed to upload."
msgstr "L'importation de votre document a échoué." msgstr "L'importation de votre document a échoué."
@ -10743,9 +10847,9 @@ msgstr "Votre document a été envoyé avec succès."
msgid "Your document has been successfully duplicated." msgid "Your document has been successfully duplicated."
msgstr "Votre document a été dupliqué avec succès." msgstr "Votre document a été dupliqué avec succès."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Your document has been uploaded successfully." msgid "Your document has been uploaded successfully."
msgstr "Votre document a été importé avec succès." msgstr "Votre document a été importé avec succès."
@ -10896,14 +11000,11 @@ msgstr "Votre modèle a été dupliqué avec succès."
msgid "Your template has been successfully deleted." msgid "Your template has been successfully deleted."
msgstr "Votre modèle a été supprimé avec succès." msgstr "Votre modèle a été supprimé avec succès."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Your template has been uploaded successfully." msgid "Your template has been uploaded successfully."
msgstr "Votre modèle a été importé avec succès." msgstr "Votre modèle a été importé avec succès."
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
msgid "Your template has been uploaded successfully. You will be redirected to the template page."
msgstr "Votre modèle a été téléchargé avec succès. Vous serez redirigé vers la page du modèle."
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx #: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx
msgid "Your template will be duplicated." msgid "Your template will be duplicated."
msgstr "Votre modèle sera dupliqué." msgstr "Votre modèle sera dupliqué."

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@ msgstr ""
"Language: nl\n" "Language: nl\n"
"Project-Id-Version: documenso-app\n" "Project-Id-Version: documenso-app\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-11-07 03:40\n" "PO-Revision-Date: 2025-11-12 06:14\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@ -18,10 +18,6 @@ msgstr ""
"X-Crowdin-File: web.po\n" "X-Crowdin-File: web.po\n"
"X-Crowdin-File-ID: 8\n" "X-Crowdin-File-ID: 8\n"
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid " Enable direct link signing"
msgstr " Directe koppelingsondertekening inschakelen"
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid ".PDF documents accepted (max {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB)" msgid ".PDF documents accepted (max {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB)"
msgstr ".PDF documenten geaccepteerd (max {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB)" msgstr ".PDF documenten geaccepteerd (max {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB)"
@ -98,6 +94,11 @@ msgstr "{0, plural, one {# map} other {# mappen}}"
msgid "{0, plural, one {# recipient} other {# recipients}}" msgid "{0, plural, one {# recipient} other {# recipients}}"
msgstr "{0, plural, one {# ontvanger} other {# ontvangers}}" msgstr "{0, plural, one {# ontvanger} other {# ontvangers}}"
#. placeholder {0}: envelope.recipients.length
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
msgid "{0, plural, one {# Recipient} other {# Recipients}}"
msgstr "{0, plural, one {# Ontvanger} other {# Ontvangers}}"
#. placeholder {0}: org.teams.length #. placeholder {0}: org.teams.length
#: apps/remix/app/routes/_authenticated+/dashboard.tsx #: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "{0, plural, one {# team} other {# teams}}" msgid "{0, plural, one {# team} other {# teams}}"
@ -151,6 +152,11 @@ msgstr "{0, plural, one {Wachten op 1 ontvanger} other {Wachten op # ontvangers}
msgid "{0}" msgid "{0}"
msgstr "{0}" msgstr "{0}"
#. placeholder {0}: file.name
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "{0} couldn't be uploaded:"
msgstr "{0} kon niet worden geüpload:"
#. placeholder {0}: team.name #. placeholder {0}: team.name
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx #: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
msgid "{0} direct signing templates" msgid "{0} direct signing templates"
@ -169,9 +175,9 @@ msgstr "{0} heeft je uitgenodigd om {recipientActionVerb} een document"
#. placeholder {0}: remaining.documents #. placeholder {0}: remaining.documents
#. placeholder {1}: quota.documents #. placeholder {1}: quota.documents
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "{0} of {1} documents remaining this month." msgid "{0} of {1} documents remaining this month."
msgstr "{0} van de {1} documenten blijven deze maand over." msgstr "{0} van de {1} documenten blijven deze maand over."
@ -188,11 +194,6 @@ msgstr "{0} van {1} rij(en) geselecteerd."
msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"." msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr "{0} namens \"{1}\" heeft je uitgenodigd om {recipientActionVerb} het document \"{2}\"." msgstr "{0} namens \"{1}\" heeft je uitgenodigd om {recipientActionVerb} het document \"{2}\"."
#. placeholder {0}: envelope.recipients.length
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
msgid "{0} Recipient(s)"
msgstr "{0} Ontvanger(s)"
#. placeholder {0}: organisation.name #. placeholder {0}: organisation.name
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
msgid "{0} Teams" msgid "{0} Teams"
@ -206,6 +207,10 @@ msgstr "{browserInfo} op {os}"
msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}" msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}"
msgstr "{charactersRemaining, plural, one {1 resterend teken} other {{charactersRemaining} resterende tekens}}" msgstr "{charactersRemaining, plural, one {1 resterend teken} other {{charactersRemaining} resterende tekens}}"
#: packages/email/template-components/template-access-auth-2fa.tsx
msgid "{expiresInMinutes, plural, one {This code will expire in # minute.} other {This code will expire in # minutes.}}"
msgstr "{expiresInMinutes, plural, one {Deze code verloopt over # minuut.} other {Deze code verloopt over # minuten.}}"
#: packages/email/templates/document-invite.tsx #: packages/email/templates/document-invite.tsx
msgid "{inviterName} <0>({inviterEmail})</0>" msgid "{inviterName} <0>({inviterEmail})</0>"
msgstr "{inviterName} <0>({inviterEmail})</0>" msgstr "{inviterName} <0>({inviterEmail})</0>"
@ -254,6 +259,10 @@ msgstr "{inviterName} namens \"{teamName}\" heeft u uitgenodigd voor {0}<0/>\"{d
msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}" msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}"
msgstr "{inviterName} namens \"{teamName}\" heeft je uitgenodigd om {action} {documentName}" msgstr "{inviterName} namens \"{teamName}\" heeft je uitgenodigd om {action} {documentName}"
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "{MAXIMUM_PASSKEYS, plural, one {You cannot have more than # passkey.} other {You cannot have more than # passkeys.}}"
msgstr "{MAXIMUM_PASSKEYS, plural, one {U kunt niet meer dan # toegangssleutel hebben.} other {U kunt niet meer dan # toegangssleutels hebben.}}"
#: packages/lib/utils/document-audit-logs.ts #: packages/lib/utils/document-audit-logs.ts
msgid "{prefix} added a field" msgid "{prefix} added a field"
msgstr "{prefix} heeft een veld toegevoegd" msgstr "{prefix} heeft een veld toegevoegd"
@ -1231,6 +1240,7 @@ msgid "All templates"
msgstr "Alle sjablonen" msgstr "Alle sjablonen"
#: apps/remix/app/components/general/period-selector.tsx #: apps/remix/app/components/general/period-selector.tsx
#: apps/remix/app/components/filters/date-range-filter.tsx
msgid "All Time" msgid "All Time"
msgstr "Alle tijden" msgstr "Alle tijden"
@ -1312,6 +1322,10 @@ msgstr "Er bestaat al een e-mail met dit adres."
msgid "An error occurred" msgid "An error occurred"
msgstr "Er is een fout opgetreden" msgstr "Er is een fout opgetreden"
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "An error occurred during upload."
msgstr "Er is een fout opgetreden tijdens het uploaden."
#: apps/remix/app/components/general/template/template-edit-form.tsx #: apps/remix/app/components/general/template/template-edit-form.tsx
msgid "An error occurred while adding fields." msgid "An error occurred while adding fields."
msgstr "Er is een fout opgetreden bij het toevoegen van velden." msgstr "Er is een fout opgetreden bij het toevoegen van velden."
@ -1477,9 +1491,8 @@ msgstr "Er is een fout opgetreden bij het updaten van de handtekening."
msgid "An error occurred while updating your profile." msgid "An error occurred while updating your profile."
msgstr "Er is een fout opgetreden bij het updaten van uw profiel." msgstr "Er is een fout opgetreden bij het updaten van uw profiel."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "An error occurred while uploading your document." msgid "An error occurred while uploading your document."
msgstr "Er is een fout opgetreden bij het uploaden van uw document." msgstr "Er is een fout opgetreden bij het uploaden van uw document."
@ -1857,6 +1870,10 @@ msgstr "Zwart"
msgid "Blue" msgid "Blue"
msgstr "Blauw" msgstr "Blauw"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Bottom"
msgstr "Onderkant"
#: apps/remix/app/components/forms/branding-preferences-form.tsx #: apps/remix/app/components/forms/branding-preferences-form.tsx
msgid "Brand Details" msgid "Brand Details"
msgstr "Merkgegevens" msgstr "Merkgegevens"
@ -2097,6 +2114,10 @@ msgstr "Cc-ers"
msgid "Center" msgid "Center"
msgstr "Midden" msgstr "Midden"
#: apps/remix/app/components/forms/editor/editor-field-text-form.tsx
msgid "Character limit"
msgstr "Tekenlimiet"
#: apps/remix/app/components/forms/editor/editor-field-text-form.tsx #: apps/remix/app/components/forms/editor/editor-field-text-form.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx #: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
msgid "Character Limit" msgid "Character Limit"
@ -2263,6 +2284,7 @@ msgstr "Document Voltooien"
msgid "Complete the fields for the following signers." msgid "Complete the fields for the following signers."
msgstr "Vul de velden in voor de volgende ondertekenaars." msgstr "Vul de velden in voor de volgende ondertekenaars."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-document-jobs-table.tsx #: apps/remix/app/components/tables/admin-document-jobs-table.tsx
#: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx #: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx
#: apps/remix/app/components/general/template/template-page-view-documents-table.tsx #: apps/remix/app/components/general/template/template-page-view-documents-table.tsx
@ -2543,11 +2565,6 @@ msgstr "Ondertekeningslinks Kopiëren"
msgid "Copy token" msgid "Copy token"
msgstr "Kopieer token" msgstr "Kopieer token"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "couldn't be uploaded:"
msgstr "kon niet worden geüpload:"
#: apps/remix/app/routes/_profile+/_layout.tsx #: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx #: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx #: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
@ -2739,9 +2756,11 @@ msgstr "Maak uw account aan en begin met het gebruik van geavanceerde documenton
#: apps/remix/app/components/tables/templates-table.tsx #: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx #: apps/remix/app/components/tables/settings-security-passkey-table.tsx
#: apps/remix/app/components/tables/organisation-teams-table.tsx #: apps/remix/app/components/tables/organisation-teams-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table.tsx #: apps/remix/app/components/tables/documents-table.tsx
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx #: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/general/template/template-page-view-information.tsx #: apps/remix/app/components/general/template/template-page-view-information.tsx
#: apps/remix/app/components/general/template/template-page-view-documents-table.tsx #: apps/remix/app/components/general/template/template-page-view-documents-table.tsx
#: apps/remix/app/components/general/document/document-page-view-information.tsx #: apps/remix/app/components/general/document/document-page-view-information.tsx
@ -3222,6 +3241,10 @@ msgstr "Document \"{0}\" - Afwijzing Bevestigd"
msgid "Document \"{0}\" Cancelled" msgid "Document \"{0}\" Cancelled"
msgstr "Document \"{0}\" Geannuleerd" msgstr "Document \"{0}\" Geannuleerd"
#: packages/ui/primitives/document-upload-button.tsx
msgid "Document (Legacy)"
msgstr "Document (Legacy)"
#: apps/remix/app/components/general/envelope-editor/envelope-editor.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor.tsx
msgid "Document & Recipients" msgid "Document & Recipients"
msgstr "Document & Ontvangers" msgstr "Document & Ontvangers"
@ -3354,6 +3377,10 @@ msgstr "Document gevonden in uw account"
msgid "Document ID" msgid "Document ID"
msgstr "Document ID" msgstr "Document ID"
#: apps/remix/app/components/general/document/document-page-view-information.tsx
msgid "Document ID (Legacy)"
msgstr "Document-ID (Legacy)"
#: apps/remix/app/components/general/document/document-status.tsx #: apps/remix/app/components/general/document/document-status.tsx
msgid "Document inbox" msgid "Document inbox"
msgstr "Document Inkommand" msgstr "Document Inkommand"
@ -3478,14 +3505,14 @@ msgid "Document updated successfully"
msgstr "Document succesvol bijgewerkt" msgstr "Document succesvol bijgewerkt"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Document upload disabled due to unpaid invoices" msgid "Document upload disabled due to unpaid invoices"
msgstr "Documentupload uitgeschakeld vanwege onbetaalde facturen" msgstr "Documentupload uitgeschakeld vanwege onbetaalde facturen"
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Document uploaded" msgid "Document uploaded"
msgstr "Document Geüpload" msgstr "Document Geüpload"
@ -3507,6 +3534,10 @@ msgctxt "Audit log format"
msgid "Document visibility updated" msgid "Document visibility updated"
msgstr "Zichtbaarheid van document bijgewerkt" msgstr "Zichtbaarheid van document bijgewerkt"
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
msgid "Document Volume"
msgstr "Documentvolume"
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx #: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document will be permanently deleted" msgid "Document will be permanently deleted"
msgstr "Document zal permanent worden verwijderd" msgstr "Document zal permanent worden verwijderd"
@ -3520,6 +3551,8 @@ msgstr "Documentatie"
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.legacy_editor.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.legacy_editor.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx #: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/user-profile-timur.tsx #: apps/remix/app/components/general/user-profile-timur.tsx
#: apps/remix/app/components/general/app-nav-mobile.tsx #: apps/remix/app/components/general/app-nav-mobile.tsx
@ -3534,6 +3567,15 @@ msgstr "Documenten"
msgid "Documents and resources related to this envelope." msgid "Documents and resources related to this envelope."
msgstr "Documenten en bronnen met betrekking tot deze envelop." msgstr "Documenten en bronnen met betrekking tot deze envelop."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Documents Completed"
msgstr "Voltooide documenten"
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Documents Created"
msgstr "Aangemaakte documenten"
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
msgid "Documents created from template" msgid "Documents created from template"
msgstr "Documenten gemaakt op basis van sjabloon" msgstr "Documenten gemaakt op basis van sjabloon"
@ -3631,8 +3673,7 @@ msgstr "Sleep & zet hier je PDF neer."
msgid "Drag and drop or click to upload" msgid "Drag and drop or click to upload"
msgstr "Sleep en zet neer of klik om te uploaden" msgstr "Sleep en zet neer of klik om te uploaden"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Drag and drop your PDF file here" msgid "Drag and drop your PDF file here"
msgstr "Sleep en zet uw PDF-bestand hier neer" msgstr "Sleep en zet uw PDF-bestand hier neer"
@ -3736,6 +3777,7 @@ msgstr "Elektronische Handtekening bekendmaking"
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx #: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/settings-nav-desktop.tsx #: apps/remix/app/components/general/settings-nav-desktop.tsx
@ -3925,6 +3967,10 @@ msgstr "Aangepaste branding inschakelen voor alle documenten in deze organisatie
msgid "Enable custom branding for all documents in this team" msgid "Enable custom branding for all documents in this team"
msgstr "Aangepaste branding inschakelen voor alle documenten in dit team" msgstr "Aangepaste branding inschakelen voor alle documenten in dit team"
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid "Enable direct link signing"
msgstr "Directe link ondertekenen inschakelen"
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx #: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: packages/lib/constants/template.ts #: packages/lib/constants/template.ts
msgid "Enable Direct Link Signing" msgid "Enable Direct Link Signing"
@ -4073,6 +4119,8 @@ msgstr "Envelop bijgewerkt"
#: apps/remix/app/components/general/template/template-edit-form.tsx #: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx #: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/envelope-signing/envelope-signer-page-renderer.tsx #: apps/remix/app/components/general/envelope-signing/envelope-signer-page-renderer.tsx
#: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
@ -4096,8 +4144,7 @@ msgstr "Envelop bijgewerkt"
#: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx #: apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx #: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
@ -4106,7 +4153,6 @@ msgstr "Envelop bijgewerkt"
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx #: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-attachments-popover.tsx #: apps/remix/app/components/general/document/document-attachments-popover.tsx
#: apps/remix/app/components/general/document/document-attachments-popover.tsx #: apps/remix/app/components/general/document/document-attachments-popover.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx #: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
@ -4254,7 +4300,6 @@ msgstr "Mislukt: {failedCount}"
msgid "Feature Flags" msgid "Feature Flags"
msgstr "Functievlaggen" msgstr "Functievlaggen"
#: apps/remix/app/components/forms/editor/editor-field-text-form.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx #: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
msgid "Field character limit" msgid "Field character limit"
msgstr "Veld tekenlimiet" msgstr "Veld tekenlimiet"
@ -4311,19 +4356,17 @@ msgid "Fields updated"
msgstr "Velden bijgewerkt" msgstr "Velden bijgewerkt"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "Bestand mag niet groter zijn dan {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgstr "Bestand mag niet groter zijn dan {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "Bestand is groter dan {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgstr "Bestand is groter dan {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "File is too small" msgid "File is too small"
msgstr "Bestand is te klein" msgstr "Bestand is te klein"
@ -4402,6 +4445,7 @@ msgstr "Wachtwoord Vergeten?"
msgid "Forgot your password?" msgid "Forgot your password?"
msgstr "Wachtwoord vergeten?" msgstr "Wachtwoord vergeten?"
#: apps/remix/app/components/tables/admin-organisations-table.tsx
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx #: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
msgid "Free" msgid "Free"
msgstr "Gratis" msgstr "Gratis"
@ -4934,6 +4978,10 @@ msgstr "Word lid van {organisationName} op Documenso"
msgid "Join our community on <0>Discord</0> for community support and discussion." msgid "Join our community on <0>Discord</0> for community support and discussion."
msgstr "Word lid van onze community op <0>Discord</0> voor community ondersteuning en discussie." msgstr "Word lid van onze community op <0>Discord</0> voor community ondersteuning en discussie."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Joined"
msgstr "Toegetreden"
#. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' }) #. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' })
#: apps/remix/app/routes/_authenticated+/dashboard.tsx #: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "Joined {0}" msgid "Joined {0}"
@ -4967,10 +5015,18 @@ msgstr "Laatste 14 dagen"
msgid "Last 30 days" msgid "Last 30 days"
msgstr "Laatste 30 dagen" msgstr "Laatste 30 dagen"
#: apps/remix/app/components/filters/date-range-filter.tsx
msgid "Last 30 Days"
msgstr "Laatste 30 dagen"
#: apps/remix/app/components/general/period-selector.tsx #: apps/remix/app/components/general/period-selector.tsx
msgid "Last 7 days" msgid "Last 7 days"
msgstr "Laatste 7 dagen" msgstr "Laatste 7 dagen"
#: apps/remix/app/components/filters/date-range-filter.tsx
msgid "Last 90 Days"
msgstr "Laatste 90 dagen"
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx #: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
msgid "Last Active" msgid "Last Active"
msgstr "Laatst actief" msgstr "Laatst actief"
@ -5000,9 +5056,9 @@ msgstr "Laatst geüpdatet om"
msgid "Last used" msgid "Last used"
msgstr "Laatst gebruikt" msgstr "Laatst gebruikt"
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx #: apps/remix/app/components/filters/date-range-filter.tsx
msgid "Leaderboard" msgid "Last Year"
msgstr "Ranglijst" msgstr "Vorig jaar"
#: apps/remix/app/components/tables/user-organisations-table.tsx #: apps/remix/app/components/tables/user-organisations-table.tsx
#: apps/remix/app/components/dialogs/organisation-leave-dialog.tsx #: apps/remix/app/components/dialogs/organisation-leave-dialog.tsx
@ -5028,6 +5084,14 @@ msgstr "Links"
msgid "Legality of Electronic Signatures" msgid "Legality of Electronic Signatures"
msgstr "Geldigheid van Elektronische Handtekeningen" msgstr "Geldigheid van Elektronische Handtekeningen"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Letter spacing"
msgstr "Letterafstand"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Letter Spacing"
msgstr "Letterafstand"
#: apps/remix/app/components/general/app-command-menu.tsx #: apps/remix/app/components/general/app-command-menu.tsx
msgid "Light Mode" msgid "Light Mode"
msgstr "Lichte Modus" msgstr "Lichte Modus"
@ -5036,6 +5100,14 @@ msgstr "Lichte Modus"
msgid "Like to have your own public profile with agreements?" msgid "Like to have your own public profile with agreements?"
msgstr "Wil je je eigen openbare profiel met overeenkomsten?" msgstr "Wil je je eigen openbare profiel met overeenkomsten?"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Line height"
msgstr "Lijnhoogte"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Line Height"
msgstr "Lijnhoogte"
#: packages/email/templates/confirm-team-email.tsx #: packages/email/templates/confirm-team-email.tsx
msgid "Link expires in 1 hour." msgid "Link expires in 1 hour."
msgstr "Link verloopt in 1 uur." msgstr "Link verloopt in 1 uur."
@ -5315,7 +5387,10 @@ msgstr "Lid sinds"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
#: apps/remix/app/components/tables/team-groups-table.tsx #: apps/remix/app/components/tables/team-groups-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-groups-table.tsx #: apps/remix/app/components/tables/organisation-groups-table.tsx
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx #: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx #: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
msgid "Members" msgid "Members"
@ -5333,6 +5408,10 @@ msgstr "Bericht"
msgid "Message <0>(Optional)</0>" msgid "Message <0>(Optional)</0>"
msgstr "Bericht <0>(Optioneel)</0>" msgstr "Bericht <0>(Optioneel)</0>"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Middle"
msgstr "Midden"
#: apps/remix/app/components/forms/editor/editor-field-number-form.tsx #: apps/remix/app/components/forms/editor/editor-field-number-form.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx
msgid "Min" msgid "Min"
@ -5408,7 +5487,8 @@ msgstr "N.v.t."
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx #: apps/remix/app/components/tables/settings-security-passkey-table.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx #: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx #: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx #: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-document-jobs-table.tsx #: apps/remix/app/components/tables/admin-document-jobs-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
@ -5475,7 +5555,6 @@ msgstr "Nooit verlopen"
msgid "New Password" msgid "New Password"
msgstr "Nieuw wachtwoord" msgstr "Nieuw wachtwoord"
#: apps/remix/app/components/dialogs/template-create-dialog.tsx
#: apps/remix/app/components/dialogs/template-create-dialog.tsx #: apps/remix/app/components/dialogs/template-create-dialog.tsx
msgid "New Template" msgid "New Template"
msgstr "Nieuwe sjabloon" msgstr "Nieuwe sjabloon"
@ -5739,13 +5818,11 @@ msgstr "Alleen beheerders hebben toegang tot en kunnen het document bekijken"
msgid "Only managers and above can access and view the document" msgid "Only managers and above can access and view the document"
msgstr "Alleen managers en hoger kunnen toegang krijgen tot en het document bekijken" msgstr "Alleen managers en hoger kunnen toegang krijgen tot en het document bekijken"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Only one file can be uploaded at a time" msgid "Only one file can be uploaded at a time"
msgstr "Er kan slechts één bestand tegelijk worden geüpload" msgstr "Er kan slechts één bestand tegelijk worden geüpload"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Only PDF files are allowed" msgid "Only PDF files are allowed"
msgstr "Alleen PDF-bestanden zijn toegestaan" msgstr "Alleen PDF-bestanden zijn toegestaan"
@ -5813,6 +5890,11 @@ msgstr "Instellingen organisatiegroep"
msgid "Organisation has been updated successfully" msgid "Organisation has been updated successfully"
msgstr "Organisatie succesvol bijgewerkt" msgstr "Organisatie succesvol bijgewerkt"
#: apps/remix/app/routes/_authenticated+/admin+/organisation-insights._index.tsx
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
msgid "Organisation Insights"
msgstr "Organisatie-inzichten"
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
msgid "Organisation invitation" msgid "Organisation invitation"
msgstr "Organisatie uitnodiging" msgstr "Organisatie uitnodiging"
@ -5909,6 +5991,7 @@ msgid "Organize your documents and templates"
msgstr "Organiseer uw documenten en sjablonen" msgstr "Organiseer uw documenten en sjablonen"
#: apps/remix/app/components/dialogs/envelope-download-dialog.tsx #: apps/remix/app/components/dialogs/envelope-download-dialog.tsx
msgctxt "Original document (adjective)"
msgid "Original" msgid "Original"
msgstr "Origineel" msgstr "Origineel"
@ -5949,6 +6032,10 @@ msgstr "Pagina {0} van {1}"
msgid "Page {0} of {numPages}" msgid "Page {0} of {numPages}"
msgstr "Pagina {0} van {numPages}" msgstr "Pagina {0} van {numPages}"
#: apps/remix/app/components/tables/admin-organisations-table.tsx
msgid "Paid"
msgstr "Betaald"
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx #: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
#: apps/remix/app/components/forms/signin.tsx #: apps/remix/app/components/forms/signin.tsx
msgid "Passkey" msgid "Passkey"
@ -6074,6 +6161,7 @@ msgid "per year"
msgstr "per jaar" msgstr "per jaar"
#: apps/remix/app/components/tables/user-organisations-table.tsx #: apps/remix/app/components/tables/user-organisations-table.tsx
msgctxt "Personal organisation (adjective)"
msgid "Personal" msgid "Personal"
msgstr "Persoonlijk" msgstr "Persoonlijk"
@ -6273,7 +6361,6 @@ msgstr "Probeer een ander domein."
msgid "Please try again and make sure you enter the correct email address." msgid "Please try again and make sure you enter the correct email address."
msgstr "Probeer opnieuw en zorg ervoor dat je het juiste e-mailadres invoert." msgstr "Probeer opnieuw en zorg ervoor dat je het juiste e-mailadres invoert."
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/dialogs/template-create-dialog.tsx #: apps/remix/app/components/dialogs/template-create-dialog.tsx
msgid "Please try again later." msgid "Please try again later."
msgstr "Probeer het later nog eens." msgstr "Probeer het later nog eens."
@ -6439,6 +6526,7 @@ msgid "Read only"
msgstr "Alleen lezen" msgstr "Alleen lezen"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx #: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
#: packages/ui/components/document/envelope-recipient-field-tooltip.tsx
msgid "Read Only" msgid "Read Only"
msgstr "Alleen lezen" msgstr "Alleen lezen"
@ -6874,6 +6962,7 @@ msgstr "Rechts"
#: apps/remix/app/components/tables/organisation-members-table.tsx #: apps/remix/app/components/tables/organisation-members-table.tsx
#: apps/remix/app/components/tables/organisation-member-invites-table.tsx #: apps/remix/app/components/tables/organisation-member-invites-table.tsx
#: apps/remix/app/components/tables/organisation-groups-table.tsx #: apps/remix/app/components/tables/organisation-groups-table.tsx
#: apps/remix/app/components/tables/admin-organisations-table.tsx
#: apps/remix/app/components/embed/authoring/configure-document-recipients.tsx #: apps/remix/app/components/embed/authoring/configure-document-recipients.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx #: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx #: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
@ -6936,7 +7025,6 @@ msgstr "Zoek op claim ID of naam"
msgid "Search by document title" msgid "Search by document title"
msgstr "Zoek op documenttitel" msgstr "Zoek op documenttitel"
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx #: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
msgid "Search by name or email" msgid "Search by name or email"
msgstr "Zoek op naam of e-mail" msgstr "Zoek op naam of e-mail"
@ -6945,6 +7033,10 @@ msgstr "Zoek op naam of e-mail"
msgid "Search by organisation ID, name, customer ID or owner email" msgid "Search by organisation ID, name, customer ID or owner email"
msgstr "Zoek op organisatienummer, naam, klant-ID of e-mail van eigenaar" msgstr "Zoek op organisatienummer, naam, klant-ID of e-mail van eigenaar"
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
msgid "Search by organisation name"
msgstr "Zoek op organisatienaam"
#: apps/remix/app/components/general/document/document-search.tsx #: apps/remix/app/components/general/document/document-search.tsx
msgid "Search documents..." msgid "Search documents..."
msgstr "Documenten zoeken..." msgstr "Documenten zoeken..."
@ -7115,6 +7207,10 @@ msgstr "Selecteer de leden die in deze groep moeten worden opgenomen"
msgid "Select triggers" msgid "Select triggers"
msgstr "Selecteer triggers" msgstr "Selecteer triggers"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Select vertical align"
msgstr "Selecteer verticale uitlijning"
#: apps/remix/app/components/dialogs/folder-update-dialog.tsx #: apps/remix/app/components/dialogs/folder-update-dialog.tsx
msgid "Select visibility" msgid "Select visibility"
msgstr "Selecteer zichtbaarheid" msgstr "Selecteer zichtbaarheid"
@ -7485,12 +7581,16 @@ msgstr "Handtekeningen verzameld"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx #: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx #: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: apps/remix/app/components/dialogs/envelope-download-dialog.tsx
#: packages/ui/components/document/envelope-recipient-field-tooltip.tsx #: packages/ui/components/document/envelope-recipient-field-tooltip.tsx
#: packages/ui/components/document/document-read-only-fields.tsx #: packages/ui/components/document/document-read-only-fields.tsx
msgid "Signed" msgid "Signed"
msgstr "Ondertekend" msgstr "Ondertekend"
#: apps/remix/app/components/dialogs/envelope-download-dialog.tsx
msgctxt "Signed document (adjective)"
msgid "Signed"
msgstr "Ondertekend"
#: packages/lib/constants/recipient-roles.ts #: packages/lib/constants/recipient-roles.ts
msgctxt "Recipient role actioned" msgctxt "Recipient role actioned"
msgid "Signed" msgid "Signed"
@ -7556,11 +7656,6 @@ msgstr "Ondertekeningslinks zijn gegenereerd voor dit document."
msgid "Signing order is enabled." msgid "Signing order is enabled."
msgstr "Ondertekenvolgorde is ingeschakeld." msgstr "Ondertekenvolgorde is ingeschakeld."
#: apps/remix/app/routes/_authenticated+/admin+/leaderboard.tsx
#: apps/remix/app/components/tables/admin-leaderboard-table.tsx
msgid "Signing Volume"
msgstr "Onderteken volume"
#: apps/remix/app/components/forms/signup.tsx #: apps/remix/app/components/forms/signup.tsx
msgid "Signups are disabled." msgid "Signups are disabled."
msgstr "Registraties zijn uitgeschakeld." msgstr "Registraties zijn uitgeschakeld."
@ -7594,7 +7689,6 @@ msgstr "Enkele ondertekenaars hebben geen handtekeningenveld toegewezen gekregen
#: apps/remix/app/components/tables/organisation-member-invites-table.tsx #: apps/remix/app/components/tables/organisation-member-invites-table.tsx
#: apps/remix/app/components/general/billing-plans.tsx #: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx #: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx #: apps/remix/app/components/general/teams/team-email-usage.tsx
#: apps/remix/app/components/general/teams/team-email-dropdown.tsx #: apps/remix/app/components/general/teams/team-email-dropdown.tsx
#: apps/remix/app/components/general/organisations/organisation-invitations.tsx #: apps/remix/app/components/general/organisations/organisation-invitations.tsx
@ -7712,6 +7806,7 @@ msgstr "Statistieken"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/audit-log.tsx #: apps/remix/app/routes/_internal+/[__htmltopdf]+/audit-log.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx #: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx #: apps/remix/app/components/tables/organisation-email-domains-table.tsx
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx #: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
@ -7905,6 +8000,7 @@ msgstr "Systeemthema"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/organisation-teams-table.tsx #: apps/remix/app/components/tables/organisation-teams-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Team" msgid "Team"
msgstr "Team" msgstr "Team"
@ -7990,6 +8086,7 @@ msgstr "Teamleden"
msgid "Team members have been added." msgid "Team members have been added."
msgstr "Teamleden zijn toegevoegd." msgstr "Teamleden zijn toegevoegd."
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/forms/team-update-form.tsx #: apps/remix/app/components/forms/team-update-form.tsx
#: apps/remix/app/components/dialogs/team-create-dialog.tsx #: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Team Name" msgid "Team Name"
@ -8034,6 +8131,9 @@ msgstr "Team URL"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/dashboard.tsx #: apps/remix/app/routes/_authenticated+/dashboard.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
#: apps/remix/app/components/general/org-menu-switcher.tsx #: apps/remix/app/components/general/org-menu-switcher.tsx
msgid "Teams" msgid "Teams"
msgstr "Teams" msgstr "Teams"
@ -8056,6 +8156,11 @@ msgstr "Teams waaraan deze organisatiegroep momenteel is toegewezen"
msgid "Template" msgid "Template"
msgstr "Sjabloon" msgstr "Sjabloon"
#: apps/remix/app/components/dialogs/template-create-dialog.tsx
#: packages/ui/primitives/document-upload-button.tsx
msgid "Template (Legacy)"
msgstr "Sjabloon (Legacy)"
#: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx #: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx
msgid "Template Created" msgid "Template Created"
msgstr "Sjabloon Gemaakt" msgstr "Sjabloon Gemaakt"
@ -8084,6 +8189,10 @@ msgstr "Sjabloon is verwijderd van je openbare profiel."
msgid "Template has been updated." msgid "Template has been updated."
msgstr "Sjabloon is bijgewerkt." msgstr "Sjabloon is bijgewerkt."
#: apps/remix/app/components/general/template/template-page-view-information.tsx
msgid "Template ID (Legacy)"
msgstr "Sjabloon-ID (Legacy)"
#: apps/remix/app/components/general/legacy-field-warning-popover.tsx #: apps/remix/app/components/general/legacy-field-warning-popover.tsx
msgid "Template is using legacy field insertion" msgid "Template is using legacy field insertion"
msgstr "Sjabloon maakt gebruik van verouderde veldinvoeging" msgstr "Sjabloon maakt gebruik van verouderde veldinvoeging"
@ -8108,8 +8217,8 @@ msgstr "Sjabloontitel"
msgid "Template updated successfully" msgid "Template updated successfully"
msgstr "Sjabloon succesvol bijgewerkt" msgstr "Sjabloon succesvol bijgewerkt"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Template uploaded" msgid "Template uploaded"
msgstr "Sjabloon geüpload" msgstr "Sjabloon geüpload"
@ -8266,9 +8375,8 @@ msgstr "Het document dat u zoekt, kon niet worden gevonden."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
msgid "The document you are looking for may have been removed, renamed or may have never\n" msgid "The document you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Het document dat u zoekt, kan zijn verwijderd, hernoemd of heeft mogelijk nooit bestaan."
msgstr "Het document dat u zoekt, is mogelijk verwijderd, hernoemd of heeft nooit bestaan."
#: packages/ui/components/document/document-send-email-message-helper.tsx #: packages/ui/components/document/document-send-email-message-helper.tsx
msgid "The document's name" msgid "The document's name"
@ -8279,9 +8387,8 @@ msgid "The email address which will show up in the \"Reply To\" field in emails"
msgstr "Het e-mailadres dat in het \"Antwoord aan\" veld in e-mails verschijnt" msgstr "Het e-mailadres dat in het \"Antwoord aan\" veld in e-mails verschijnt"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
msgid "The email domain you are looking for may have been removed, renamed or may have never\n" msgid "The email domain you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Het e-maildomein dat u zoekt, kan zijn verwijderd, hernoemd of heeft mogelijk nooit bestaan."
msgstr "Het e-maildomein dat u zoekt kan zijn verwijderd, hernoemd of heeft mogelijk nooit bestaan."
#: apps/remix/app/components/forms/signin.tsx #: apps/remix/app/components/forms/signin.tsx
msgid "The email or password provided is incorrect" msgid "The email or password provided is incorrect"
@ -8337,23 +8444,17 @@ msgid "The organisation email has been created successfully."
msgstr "Het organisatie-e-mail is succesvol aangemaakt." msgstr "Het organisatie-e-mail is succesvol aangemaakt."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "The organisation group you are looking for may have been removed, renamed or may have never\n" msgid "The organisation group you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "De organisatiewerkgroep die u zoekt, kan zijn verwijderd, hernoemd of heeft mogelijk nooit bestaan."
msgstr "De organisatiegroep die u zoekt, is mogelijk verwijderd, hernoemd of heeft mogelijk nooit bestaan."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "The organisation role that will be applied to all members in this group." msgid "The organisation role that will be applied to all members in this group."
msgstr "De organisatierol die op alle leden in deze groep zal worden toegepast." msgstr "De organisatierol die op alle leden in deze groep zal worden toegepast."
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "De organisatie die u zoekt, is mogelijk verwijderd, hernoemd of heeft mogelijk nooit bestaan."
#: apps/remix/app/routes/_authenticated+/_layout.tsx #: apps/remix/app/routes/_authenticated+/_layout.tsx
msgid "The organisation you are looking for may have been removed, renamed or may have never\n" #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
" existed." msgid "The organisation you are looking for may have been removed, renamed or may have never existed."
msgstr "De organisatie die u zoekt, is mogelijk verwijderd, hernoemd of heeft mogelijk nooit bestaan." msgstr "De organisatie die u zoekt, kan zijn verwijderd, hernoemd of heeft mogelijk nooit bestaan."
#: apps/remix/app/components/general/generic-error-layout.tsx #: apps/remix/app/components/general/generic-error-layout.tsx
msgid "The page you are looking for was moved, removed, renamed or might never have existed." msgid "The page you are looking for was moved, removed, renamed or might never have existed."
@ -8444,15 +8545,9 @@ msgid "The team email <0>{teamEmail}</0> has been removed from the following tea
msgstr "Het team e-mail <0>{teamEmail}</0> is verwijderd uit het volgende team" msgstr "Het team e-mail <0>{teamEmail}</0> is verwijderd uit het volgende team"
#: apps/remix/app/routes/_authenticated+/_layout.tsx #: apps/remix/app/routes/_authenticated+/_layout.tsx
msgid "The team you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Het team dat u zoekt, is mogelijk verwijderd, hernoemd of heeft mogelijk nooit bestaan."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
msgid "The team you are looking for may have been removed, renamed or may have never\n" msgid "The team you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Het team dat u zoekt, kan zijn verwijderd, hernoemd of heeft mogelijk nooit bestaan."
msgstr "Het team dat u zoekt, is mogelijk verwijderd of hernoemd, of heeft mogelijk nooit\n"
" bestaan."
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx #: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
msgid "The template has been moved successfully." msgid "The template has been moved successfully."
@ -8467,9 +8562,8 @@ msgid "The template you are looking for could not be found."
msgstr "De sjabloon die u zoekt, kon niet worden gevonden." msgstr "De sjabloon die u zoekt, kon niet worden gevonden."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
msgid "The template you are looking for may have been removed, renamed or may have never\n" msgid "The template you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "Het sjabloon dat u zoekt, kan zijn verwijderd, hernoemd of heeft mogelijk nooit bestaan."
msgstr "De sjabloon die u zoekt, is mogelijk verwijderd, hernoemd of heeft nooit bestaan."
#: apps/remix/app/components/dialogs/webhook-test-dialog.tsx #: apps/remix/app/components/dialogs/webhook-test-dialog.tsx
msgid "The test webhook has been successfully sent to your endpoint." msgid "The test webhook has been successfully sent to your endpoint."
@ -8509,9 +8603,8 @@ msgid "The URL for Documenso to send webhook events to."
msgstr "De URL voor Documenso om webhook-gebeurtenissen naar toe te sturen." msgstr "De URL voor Documenso om webhook-gebeurtenissen naar toe te sturen."
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx #: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
msgid "The user you are looking for may have been removed, renamed or may have never\n" msgid "The user you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "De gebruiker die u zoekt, kan zijn verwijderd, hernoemd of heeft mogelijk nooit bestaan."
msgstr "De gebruiker die u zoekt, is mogelijk verwijderd, hernoemd of heeft mogelijk nooit bestaan."
#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx #: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
msgid "The user's two factor authentication has been reset successfully." msgid "The user's two factor authentication has been reset successfully."
@ -8530,9 +8623,8 @@ msgid "The webhook was successfully created."
msgstr "De webhook is succesvol aangemaakt." msgstr "De webhook is succesvol aangemaakt."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
msgid "The webhook you are looking for may have been removed, renamed or may have never\n" msgid "The webhook you are looking for may have been removed, renamed or may have never existed."
" existed." msgstr "De webhook die u zoekt, kan zijn verwijderd, hernoemd of heeft mogelijk nooit bestaan."
msgstr "De webhook die u zoekt, kan zijn verwijderd, hernoemd of mogelijk nooit hebben bestaan."
#: apps/remix/app/components/tables/documents-table-empty-state.tsx #: apps/remix/app/components/tables/documents-table-empty-state.tsx
msgid "There are no active drafts at the current moment. You can upload a document to start drafting." msgid "There are no active drafts at the current moment. You can upload a document to start drafting."
@ -8588,10 +8680,6 @@ msgstr "Deze actie is omkeerbaar, maar wees voorzichtig, omdat het account mogel
msgid "This claim is locked and cannot be deleted." msgid "This claim is locked and cannot be deleted."
msgstr "Deze aanspraak is vergrendeld en kan niet worden verwijderd." msgstr "Deze aanspraak is vergrendeld en kan niet worden verwijderd."
#: packages/email/template-components/template-access-auth-2fa.tsx
msgid "This code will expire in {expiresInMinutes} minutes."
msgstr "Deze code verloopt over {expiresInMinutes} minuten."
#: packages/email/template-components/template-document-super-delete.tsx #: packages/email/template-components/template-document-super-delete.tsx
msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support."
msgstr "Dit document kan niet worden hersteld, als u de reden voor toekomstige documenten wilt betwisten, neem dan contact op met de ondersteuning." msgstr "Dit document kan niet worden hersteld, als u de reden voor toekomstige documenten wilt betwisten, neem dan contact op met de ondersteuning."
@ -8837,6 +8925,7 @@ msgstr "Tijdzone"
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx #: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
#: apps/remix/app/components/tables/templates-table.tsx #: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table.tsx #: apps/remix/app/components/tables/documents-table.tsx
#: apps/remix/app/components/general/template/template-page-view-documents-table.tsx #: apps/remix/app/components/general/template/template-page-view-documents-table.tsx
@ -8849,6 +8938,19 @@ msgstr "Titel"
msgid "Title cannot be empty" msgid "Title cannot be empty"
msgstr "Titel mag niet leeg zijn" msgstr "Titel mag niet leeg zijn"
#. placeholder {0}: actionVerb.toLowerCase()
#. placeholder {1}: actionTarget.toLowerCase()
#. placeholder {2}: recipient.email
#: apps/remix/app/components/general/document-signing/document-signing-auth-account.tsx
msgid "To {0} this {1}, you need to be logged in as <0>{2}</0>"
msgstr "Om {0} deze {1} te kunnen uitvoeren, moet u ingelogd zijn als <0>{2}</0>"
#. placeholder {0}: actionVerb.toLowerCase()
#. placeholder {1}: actionTarget.toLowerCase()
#: apps/remix/app/components/general/document-signing/document-signing-auth-account.tsx
msgid "To {0} this {1}, you need to be logged in."
msgstr "Om {0} deze {1} te kunnen uitvoeren, moet u ingelogd zijn."
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
msgid "To accept this invitation you must create an account." msgid "To accept this invitation you must create an account."
msgstr "Om deze uitnodiging te accepteren moet u een account aanmaken." msgstr "Om deze uitnodiging te accepteren moet u een account aanmaken."
@ -8889,6 +8991,10 @@ msgstr "Om toegang te krijgen tot uw account, bevestig uw e-mailadres door op de
msgid "To mark this document as viewed, you need to be logged in as <0>{0}</0>" msgid "To mark this document as viewed, you need to be logged in as <0>{0}</0>"
msgstr "Om dit document als bekeken te markeren, moet u zijn ingelogd als <0>{0}</0>" msgstr "Om dit document als bekeken te markeren, moet u zijn ingelogd als <0>{0}</0>"
#: apps/remix/app/components/general/document-signing/document-signing-auth-account.tsx
msgid "To mark this document as viewed, you need to be logged in."
msgstr "Om dit document als bekeken te markeren, moet u ingelogd zijn."
#. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select' #. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select'
#. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select' #. placeholder {0}: emptyCheckboxFields.length > 0 ? 'Checkbox' : emptyRadioFields.length > 0 ? 'Radio' : 'Select'
#: packages/ui/primitives/template-flow/add-template-fields.tsx #: packages/ui/primitives/template-flow/add-template-fields.tsx
@ -8944,6 +9050,10 @@ msgstr "Token is verlopen. Probeer het opnieuw."
msgid "Token name" msgid "Token name"
msgstr "Tokennaam" msgstr "Tokennaam"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Top"
msgstr "Bovenkant"
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx #: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
msgid "Total Documents" msgid "Total Documents"
msgstr "Totaal aantal documenten" msgstr "Totaal aantal documenten"
@ -9123,8 +9233,7 @@ msgstr "Onvoltooid"
msgid "Unknown" msgid "Unknown"
msgstr "Onbekend" msgstr "Onbekend"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Unknown error" msgid "Unknown error"
msgstr "Onbekende fout" msgstr "Onbekende fout"
@ -9282,7 +9391,7 @@ msgstr "Wachtwoord bijwerken..."
msgid "Updating Your Information" msgid "Updating Your Information"
msgstr "Uw Informatie Bijwerken" msgstr "Uw Informatie Bijwerken"
#: packages/ui/primitives/document-upload.tsx #: packages/ui/primitives/document-upload-button.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "Upgrade" msgid "Upgrade"
msgstr "Upgrade" msgstr "Upgrade"
@ -9292,7 +9401,7 @@ msgstr "Upgrade"
msgid "Upgrade <0>{0}</0> to {planName}" msgid "Upgrade <0>{0}</0> to {planName}"
msgstr "Gebruik uw toegangssleutel voor authenticatie" msgstr "Gebruik uw toegangssleutel voor authenticatie"
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Upgrade your plan to upload more documents" msgid "Upgrade your plan to upload more documents"
msgstr "Upgrade je plan om meer documenten te uploaden" msgstr "Upgrade je plan om meer documenten te uploaden"
@ -9334,9 +9443,9 @@ msgstr "Aangepast document uploaden"
msgid "Upload disabled" msgid "Upload disabled"
msgstr "Uploaden uitgeschakeld" msgstr "Uploaden uitgeschakeld"
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
#: packages/ui/primitives/document-upload.tsx #: packages/ui/primitives/document-upload-button.tsx
msgid "Upload Document" msgid "Upload Document"
msgstr "Document uploaden" msgstr "Document uploaden"
@ -9344,14 +9453,9 @@ msgstr "Document uploaden"
msgid "Upload documents and add recipients" msgid "Upload documents and add recipients"
msgstr "Documenten uploaden en ontvangers toevoegen" msgstr "Documenten uploaden en ontvangers toevoegen"
#: packages/ui/primitives/document-upload.tsx
msgid "Upload Envelope"
msgstr "Upload envelop"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Upload failed" msgid "Upload failed"
msgstr "Uploaden mislukt" msgstr "Uploaden mislukt"
@ -9359,11 +9463,11 @@ msgstr "Uploaden mislukt"
msgid "Upload Signature" msgid "Upload Signature"
msgstr "Handtekening uploaden" msgstr "Handtekening uploaden"
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: packages/ui/primitives/document-upload-button.tsx
msgid "Upload Template" msgid "Upload Template"
msgstr "Upload Sjabloon" msgstr "Upload Sjabloon"
#: packages/ui/primitives/document-upload.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "Upload Template Document" msgid "Upload Template Document"
msgstr "Sjabloondocument uploaden" msgstr "Sjabloondocument uploaden"
@ -9390,17 +9494,10 @@ msgid "Uploaded file not an allowed file type"
msgstr "Geüpload bestand is geen toegestaan bestandsformaat" msgstr "Geüpload bestand is geen toegestaan bestandsformaat"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Uploading" msgid "Uploading"
msgstr "Uploaden" msgstr "Uploaden"
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
msgid "Uploading document..."
msgstr "Document uploaden..."
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
msgid "Uploading template..."
msgstr "Sjabloon uploaden..."
#: apps/remix/app/components/general/document/document-attachments-popover.tsx #: apps/remix/app/components/general/document/document-attachments-popover.tsx
msgid "URL" msgid "URL"
msgstr "URL" msgstr "URL"
@ -9473,6 +9570,7 @@ msgid "User with this email already exists. Please use a different email address
msgstr "Er bestaat al een gebruiker met dit e-mailadres. Gebruik een ander e-mailadres." msgstr "Er bestaat al een gebruiker met dit e-mailadres. Gebruik een ander e-mailadres."
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx #: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
#: apps/remix/app/components/tables/organisation-insights-table.tsx
msgid "Users" msgid "Users"
msgstr "Gebruikers" msgstr "Gebruikers"
@ -9495,6 +9593,10 @@ msgstr "Validatie mislukt"
msgid "Value" msgid "Value"
msgstr "Waarde" msgstr "Waarde"
#: packages/lib/types/field-meta.ts
msgid "Value must be a number"
msgstr "Waarde moet een getal zijn"
#: packages/email/template-components/template-access-auth-2fa.tsx #: packages/email/template-components/template-access-auth-2fa.tsx
msgid "Verification Code Required" msgid "Verification Code Required"
msgstr "Verificatiecode vereist" msgstr "Verificatiecode vereist"
@ -9527,8 +9629,8 @@ msgstr "Verifieer uw e-mailadres"
msgid "Verify your email address to unlock all features." msgid "Verify your email address to unlock all features."
msgstr "Verifieer uw e-mailadres om alle functies te ontgrendelen." msgstr "Verifieer uw e-mailadres om alle functies te ontgrendelen."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Verify your email to upload documents." msgid "Verify your email to upload documents."
msgstr "Verifieer uw e-mail om documenten te uploaden." msgstr "Verifieer uw e-mail om documenten te uploaden."
@ -9542,6 +9644,10 @@ msgstr "Verifieer uw e-mailadres van het team"
msgid "Vertical" msgid "Vertical"
msgstr "Verticaal" msgstr "Verticaal"
#: apps/remix/app/components/forms/editor/editor-field-generic-field-forms.tsx
msgid "Vertical Align"
msgstr "Verticale uitlijning"
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx #: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx #: apps/remix/app/components/tables/inbox-table.tsx
@ -10394,10 +10500,6 @@ msgstr "U kunt geen groep wijzigen die een hogere rol heeft dan u."
msgid "You cannot delete this item because the document has been sent to recipients" msgid "You cannot delete this item because the document has been sent to recipients"
msgstr "U kunt dit item niet verwijderen omdat het document naar ontvangers is verzonden" msgstr "U kunt dit item niet verwijderen omdat het document naar ontvangers is verzonden"
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "You cannot have more than {MAXIMUM_PASSKEYS} passkeys."
msgstr "Je kunt niet meer dan {MAXIMUM_PASSKEYS} toegangssleutels hebben."
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx #: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
msgid "You cannot modify a group which has a higher role than you." msgid "You cannot modify a group which has a higher role than you."
msgstr "U kunt geen organisatielid wijzigen die een hogere rol heeft dan u." msgstr "U kunt geen organisatielid wijzigen die een hogere rol heeft dan u."
@ -10414,20 +10516,21 @@ msgstr "Je kunt een teamlid met een hogere rol dan jezelf niet wijzigen."
msgid "You cannot remove members from this team if the inherit member feature is enabled." msgid "You cannot remove members from this team if the inherit member feature is enabled."
msgstr "U heeft momenteel een inactief <0>{currentProductName}</0> abonnement." msgstr "U heeft momenteel een inactief <0>{currentProductName}</0> abonnement."
#: packages/ui/primitives/document-upload.tsx #: packages/ui/primitives/document-upload-button.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "You cannot upload documents at this time." msgid "You cannot upload documents at this time."
msgstr "Op dit moment kunt u geen documenten uploaden." msgstr "Op dit moment kunt u geen documenten uploaden."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "You cannot upload encrypted PDFs" msgid "You cannot upload encrypted PDFs"
msgstr "Je kunt geen versleutelde PDF's uploaden" msgstr "Je kunt geen versleutelde PDF's uploaden"
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "You cannot upload more than {maximumEnvelopeItemCount} items per envelope." msgid "You cannot upload more than {maximumEnvelopeItemCount} items per envelope."
msgstr "U kunt niet meer dan {maximumEnvelopeItemCount} items per envelop uploaden." msgstr "U kunt niet meer dan {maximumEnvelopeItemCount} items per envelop uploaden."
@ -10503,9 +10606,9 @@ msgstr "Je hebt nog geen sjablonen gemaakt. Om een sjabloon te maken, upload er
msgid "You have not yet created or received any documents. To create a document please upload one." msgid "You have not yet created or received any documents. To create a document please upload one."
msgstr "Je hebt nog geen documenten gemaakt of ontvangen. Om een document te maken, upload er een." msgstr "Je hebt nog geen documenten gemaakt of ontvangen. Om een document te maken, upload er een."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "You have reached the limit of the number of files per envelope" msgid "You have reached the limit of the number of files per envelope"
msgstr "U heeft de limiet van het aantal bestanden per envelop bereikt" msgstr "U heeft de limiet van het aantal bestanden per envelop bereikt"
@ -10518,14 +10621,14 @@ msgstr "Je hebt de maximale limiet van {0} directe sjablonen bereikt. <0>Upgrade
msgid "You have reached the maximum number of teams for your plan. Please contact sales at <0>{SUPPORT_EMAIL}</0> if you would like to adjust your plan." msgid "You have reached the maximum number of teams for your plan. Please contact sales at <0>{SUPPORT_EMAIL}</0> if you would like to adjust your plan."
msgstr "U heeft het maximale aantal teams voor uw plan bereikt. Neem contact op met de verkoopafdeling via <0>{SUPPORT_EMAIL}</0> als u uw plan wilt aanpassen." msgstr "U heeft het maximale aantal teams voor uw plan bereikt. Neem contact op met de verkoopafdeling via <0>{SUPPORT_EMAIL}</0> als u uw plan wilt aanpassen."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "You have reached your document limit for this month. Please upgrade your plan." msgid "You have reached your document limit for this month. Please upgrade your plan."
msgstr "U heeft uw documentlimiet voor deze maand bereikt. Upgrade uw abonnement." msgstr "U heeft uw documentlimiet voor deze maand bereikt. Upgrade uw abonnement."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: packages/ui/primitives/document-dropzone.tsx #: packages/ui/primitives/document-dropzone.tsx
msgid "You have reached your document limit." msgid "You have reached your document limit."
msgstr "Je hebt jouw documentlimiet bereikt." msgstr "Je hebt jouw documentlimiet bereikt."
@ -10715,7 +10818,7 @@ msgstr "Uw huidige abonnement is verlopen."
msgid "Your direct signing templates" msgid "Your direct signing templates"
msgstr "Jouw directe ondertekeningssjablonen" msgstr "Jouw directe ondertekeningssjablonen"
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "Your document failed to upload." msgid "Your document failed to upload."
msgstr "Het uploaden van je document is mislukt." msgstr "Het uploaden van je document is mislukt."
@ -10744,9 +10847,9 @@ msgstr "Je document is succesvol verzonden."
msgid "Your document has been successfully duplicated." msgid "Your document has been successfully duplicated."
msgstr "Jouw document is succesvol gedupliceerd." msgstr "Jouw document is succesvol gedupliceerd."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/document/document-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx #: apps/remix/app/components/general/document/document-upload-button-legacy.tsx
msgid "Your document has been uploaded successfully." msgid "Your document has been uploaded successfully."
msgstr "Je document is succesvol geüpload." msgstr "Je document is succesvol geüpload."
@ -10897,14 +11000,11 @@ msgstr "Jouw sjabloon is succesvol gedupliceerd."
msgid "Your template has been successfully deleted." msgid "Your template has been successfully deleted."
msgstr "Jouw sjabloon is succesvol verwijderd." msgstr "Jouw sjabloon is succesvol verwijderd."
#: apps/remix/app/components/general/document/envelope-upload-button.tsx #: apps/remix/app/components/general/envelope/envelope-upload-button.tsx
#: apps/remix/app/components/general/envelope/envelope-drop-zone-wrapper.tsx
msgid "Your template has been uploaded successfully." msgid "Your template has been uploaded successfully."
msgstr "Uw sjabloon is succesvol geüpload." msgstr "Uw sjabloon is succesvol geüpload."
#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
msgid "Your template has been uploaded successfully. You will be redirected to the template page."
msgstr "Uw sjabloon is succesvol geüpload. U wordt doorgestuurd naar de sjabloonpagina."
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx #: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx
msgid "Your template will be duplicated." msgid "Your template will be duplicated."
msgstr "Jouw sjabloon zal worden gedupliceerd." msgstr "Jouw sjabloon zal worden gedupliceerd."

File diff suppressed because it is too large Load Diff

View File

@ -372,3 +372,52 @@ export const FIELD_META_DEFAULT_VALUES: Record<FieldType, TFieldMetaSchema> = {
[FieldType.CHECKBOX]: FIELD_CHECKBOX_META_DEFAULT_VALUES, [FieldType.CHECKBOX]: FIELD_CHECKBOX_META_DEFAULT_VALUES,
[FieldType.DROPDOWN]: FIELD_DROPDOWN_META_DEFAULT_VALUES, [FieldType.DROPDOWN]: FIELD_DROPDOWN_META_DEFAULT_VALUES,
} as const; } as const;
export const ZEnvelopeFieldAndMetaSchema = z.discriminatedUnion('type', [
z.object({
type: z.literal(FieldType.SIGNATURE),
fieldMeta: ZSignatureFieldMeta.optional().default(FIELD_SIGNATURE_META_DEFAULT_VALUES),
}),
z.object({
type: z.literal(FieldType.FREE_SIGNATURE),
fieldMeta: z.undefined(),
}),
z.object({
type: z.literal(FieldType.INITIALS),
fieldMeta: ZInitialsFieldMeta.optional().default(FIELD_INITIALS_META_DEFAULT_VALUES),
}),
z.object({
type: z.literal(FieldType.NAME),
fieldMeta: ZNameFieldMeta.optional().default(FIELD_NAME_META_DEFAULT_VALUES),
}),
z.object({
type: z.literal(FieldType.EMAIL),
fieldMeta: ZEmailFieldMeta.optional().default(FIELD_EMAIL_META_DEFAULT_VALUES),
}),
z.object({
type: z.literal(FieldType.DATE),
fieldMeta: ZDateFieldMeta.optional().default(FIELD_DATE_META_DEFAULT_VALUES),
}),
z.object({
type: z.literal(FieldType.TEXT),
fieldMeta: ZTextFieldMeta.optional().default(FIELD_TEXT_META_DEFAULT_VALUES),
}),
z.object({
type: z.literal(FieldType.NUMBER),
fieldMeta: ZNumberFieldMeta.optional().default(FIELD_NUMBER_META_DEFAULT_VALUES),
}),
z.object({
type: z.literal(FieldType.RADIO),
fieldMeta: ZRadioFieldMeta.optional().default(FIELD_RADIO_META_DEFAULT_VALUES),
}),
z.object({
type: z.literal(FieldType.CHECKBOX),
fieldMeta: ZCheckboxFieldMeta.optional().default(FIELD_CHECKBOX_META_DEFAULT_VALUES),
}),
z.object({
type: z.literal(FieldType.DROPDOWN),
fieldMeta: ZDropdownFieldMeta.optional().default(FIELD_DROPDOWN_META_DEFAULT_VALUES),
}),
]);
type TEnvelopeFieldAndMeta = z.infer<typeof ZEnvelopeFieldAndMetaSchema>;

View File

@ -1,5 +1,7 @@
import { z } from 'zod'; import { z } from 'zod';
export type DateRange = 'last30days' | 'last90days' | 'lastYear' | 'allTime';
/** /**
* Backend only schema is used for find search params. * Backend only schema is used for find search params.
* *

View File

@ -9,7 +9,7 @@ import type { FieldToRender, RenderFieldElementOptions } from './field-renderer'
import { calculateFieldPosition } from './field-renderer'; import { calculateFieldPosition } from './field-renderer';
export const konvaTextFontFamily = export const konvaTextFontFamily =
'Noto Sans, Noto Sans Japanese, Noto Sans Chinese, Noto Sans Korean, sans-serif'; '"Noto Sans", "Noto Sans Japanese", "Noto Sans Chinese", "Noto Sans Korean", sans-serif';
export const konvaTextFill = 'black'; export const konvaTextFill = 'black';
export const upsertFieldGroup = ( export const upsertFieldGroup = (

View File

@ -0,0 +1,41 @@
-- CreateIndex
CREATE INDEX "Envelope_folderId_idx" ON "Envelope"("folderId");
-- CreateIndex
CREATE INDEX "Envelope_teamId_idx" ON "Envelope"("teamId");
-- CreateIndex
CREATE INDEX "Envelope_userId_idx" ON "Envelope"("userId");
-- CreateIndex
CREATE INDEX "EnvelopeAttachment_envelopeId_idx" ON "EnvelopeAttachment"("envelopeId");
-- CreateIndex
CREATE INDEX "EnvelopeItem_envelopeId_idx" ON "EnvelopeItem"("envelopeId");
-- CreateIndex
CREATE INDEX "Field_envelopeItemId_idx" ON "Field"("envelopeItemId");
-- CreateIndex
CREATE INDEX "OrganisationGroup_organisationId_idx" ON "OrganisationGroup"("organisationId");
-- CreateIndex
CREATE INDEX "OrganisationGroupMember_groupId_idx" ON "OrganisationGroupMember"("groupId");
-- CreateIndex
CREATE INDEX "OrganisationGroupMember_organisationMemberId_idx" ON "OrganisationGroupMember"("organisationMemberId");
-- CreateIndex
CREATE INDEX "Session_userId_idx" ON "Session"("userId");
-- CreateIndex
CREATE INDEX "Session_sessionToken_idx" ON "Session"("sessionToken");
-- CreateIndex
CREATE INDEX "Team_organisationId_idx" ON "Team"("organisationId");
-- CreateIndex
CREATE INDEX "TeamGroup_teamId_idx" ON "TeamGroup"("teamId");
-- CreateIndex
CREATE INDEX "TeamGroup_organisationGroupId_idx" ON "TeamGroup"("organisationGroupId");

View File

@ -319,6 +319,9 @@ model Session {
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
user User? @relation(fields: [userId], references: [id], onDelete: Cascade) user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([userId])
@@index([sessionToken])
} }
enum DocumentStatus { enum DocumentStatus {
@ -426,6 +429,10 @@ model Envelope {
documentMeta DocumentMeta @relation(fields: [documentMetaId], references: [id]) documentMeta DocumentMeta @relation(fields: [documentMetaId], references: [id])
envelopeAttachments EnvelopeAttachment[] envelopeAttachments EnvelopeAttachment[]
@@index([folderId])
@@index([teamId])
@@index([userId])
} }
model EnvelopeItem { model EnvelopeItem {
@ -444,6 +451,7 @@ model EnvelopeItem {
field Field[] field Field[]
@@unique([documentDataId]) @@unique([documentDataId])
@@index([envelopeId])
} }
model DocumentAuditLog { model DocumentAuditLog {
@ -526,6 +534,8 @@ model EnvelopeAttachment {
envelopeId String envelopeId String
envelope Envelope @relation(fields: [envelopeId], references: [id], onDelete: Cascade) envelope Envelope @relation(fields: [envelopeId], references: [id], onDelete: Cascade)
@@index([envelopeId])
} }
enum ReadStatus { enum ReadStatus {
@ -613,6 +623,7 @@ model Field {
fieldMeta Json? /// [FieldMeta] @zod.custom.use(ZFieldMetaNotOptionalSchema) fieldMeta Json? /// [FieldMeta] @zod.custom.use(ZFieldMetaNotOptionalSchema)
@@index([envelopeId]) @@index([envelopeId])
@@index([envelopeItemId])
@@index([recipientId]) @@index([recipientId])
} }
@ -728,6 +739,8 @@ model OrganisationGroup {
organisationGroupMembers OrganisationGroupMember[] organisationGroupMembers OrganisationGroupMember[]
teamGroups TeamGroup[] teamGroups TeamGroup[]
@@index([organisationId])
} }
model OrganisationGroupMember { model OrganisationGroupMember {
@ -740,6 +753,8 @@ model OrganisationGroupMember {
organisationMemberId String organisationMemberId String
@@unique([organisationMemberId, groupId]) @@unique([organisationMemberId, groupId])
@@index([groupId])
@@index([organisationMemberId])
} }
model TeamGroup { model TeamGroup {
@ -754,6 +769,8 @@ model TeamGroup {
team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) team Team @relation(fields: [teamId], references: [id], onDelete: Cascade)
@@unique([teamId, organisationGroupId]) @@unique([teamId, organisationGroupId])
@@index([teamId])
@@index([organisationGroupId])
} }
enum OrganisationGroupType { enum OrganisationGroupType {
@ -865,6 +882,8 @@ model Team {
teamGlobalSettingsId String @unique teamGlobalSettingsId String @unique
teamGlobalSettings TeamGlobalSettings @relation(fields: [teamGlobalSettingsId], references: [id], onDelete: Cascade) teamGlobalSettings TeamGlobalSettings @relation(fields: [teamGlobalSettingsId], references: [id], onDelete: Cascade)
@@index([organisationId])
} }
model TeamEmail { model TeamEmail {

View File

@ -41,10 +41,14 @@ export const createAttachmentRoute = authenticatedProcedure
type: EnvelopeType.DOCUMENT, type: EnvelopeType.DOCUMENT,
}); });
await createAttachment({ const attachment = await createAttachment({
envelopeId: envelope.id, envelopeId: envelope.id,
teamId, teamId,
userId, userId,
data, data,
}); });
return {
id: attachment.id,
};
}); });

View File

@ -8,7 +8,9 @@ export const ZCreateAttachmentRequestSchema = z.object({
}), }),
}); });
export const ZCreateAttachmentResponseSchema = z.void(); export const ZCreateAttachmentResponseSchema = z.object({
id: z.string(),
});
export type TCreateAttachmentRequest = z.infer<typeof ZCreateAttachmentRequestSchema>; export type TCreateAttachmentRequest = z.infer<typeof ZCreateAttachmentRequestSchema>;
export type TCreateAttachmentResponse = z.infer<typeof ZCreateAttachmentResponseSchema>; export type TCreateAttachmentResponse = z.infer<typeof ZCreateAttachmentResponseSchema>;

View File

@ -1,5 +1,6 @@
import { deleteAttachment } from '@documenso/lib/server-only/envelope-attachment/delete-attachment'; import { deleteAttachment } from '@documenso/lib/server-only/envelope-attachment/delete-attachment';
import { ZGenericSuccessResponse } from '../../schema';
import { authenticatedProcedure } from '../../trpc'; import { authenticatedProcedure } from '../../trpc';
import { import {
ZDeleteAttachmentRequestSchema, ZDeleteAttachmentRequestSchema,
@ -33,4 +34,6 @@ export const deleteAttachmentRoute = authenticatedProcedure
userId, userId,
teamId, teamId,
}); });
return ZGenericSuccessResponse;
}); });

View File

@ -1,10 +1,12 @@
import { z } from 'zod'; import { z } from 'zod';
import { ZSuccessResponseSchema } from '../../schema';
export const ZDeleteAttachmentRequestSchema = z.object({ export const ZDeleteAttachmentRequestSchema = z.object({
id: z.string(), id: z.string(),
}); });
export const ZDeleteAttachmentResponseSchema = z.void(); export const ZDeleteAttachmentResponseSchema = ZSuccessResponseSchema;
export type TDeleteAttachmentRequest = z.infer<typeof ZDeleteAttachmentRequestSchema>; export type TDeleteAttachmentRequest = z.infer<typeof ZDeleteAttachmentRequestSchema>;
export type TDeleteAttachmentResponse = z.infer<typeof ZDeleteAttachmentResponseSchema>; export type TDeleteAttachmentResponse = z.infer<typeof ZDeleteAttachmentResponseSchema>;

View File

@ -1,5 +1,6 @@
import { updateAttachment } from '@documenso/lib/server-only/envelope-attachment/update-attachment'; import { updateAttachment } from '@documenso/lib/server-only/envelope-attachment/update-attachment';
import { ZGenericSuccessResponse } from '../../schema';
import { authenticatedProcedure } from '../../trpc'; import { authenticatedProcedure } from '../../trpc';
import { import {
ZUpdateAttachmentRequestSchema, ZUpdateAttachmentRequestSchema,
@ -34,4 +35,6 @@ export const updateAttachmentRoute = authenticatedProcedure
teamId, teamId,
data, data,
}); });
return ZGenericSuccessResponse;
}); });

View File

@ -1,5 +1,7 @@
import { z } from 'zod'; import { z } from 'zod';
import { ZSuccessResponseSchema } from '../../schema';
export const ZUpdateAttachmentRequestSchema = z.object({ export const ZUpdateAttachmentRequestSchema = z.object({
id: z.string(), id: z.string(),
data: z.object({ data: z.object({
@ -8,7 +10,7 @@ export const ZUpdateAttachmentRequestSchema = z.object({
}), }),
}); });
export const ZUpdateAttachmentResponseSchema = z.void(); export const ZUpdateAttachmentResponseSchema = ZSuccessResponseSchema;
export type TUpdateAttachmentRequest = z.infer<typeof ZUpdateAttachmentRequestSchema>; export type TUpdateAttachmentRequest = z.infer<typeof ZUpdateAttachmentRequestSchema>;
export type TUpdateAttachmentResponse = z.infer<typeof ZUpdateAttachmentResponseSchema>; export type TUpdateAttachmentResponse = z.infer<typeof ZUpdateAttachmentResponseSchema>;

View File

@ -1,136 +0,0 @@
import { EnvelopeType } from '@prisma/client';
import { getServerLimits } from '@documenso/ee/server-only/limits/server';
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
import { createEnvelope } from '@documenso/lib/server-only/envelope/create-envelope';
import { putPdfFileServerSide } from '@documenso/lib/universal/upload/put-file.server';
import { mapSecondaryIdToDocumentId } from '@documenso/lib/utils/envelope';
import { prisma } from '@documenso/prisma';
import { authenticatedProcedure } from '../trpc';
import {
ZCreateDocumentFormDataRequestSchema,
ZCreateDocumentFormDataResponseSchema,
createDocumentFormDataMeta,
} from './create-document-formdata.types';
/**
* Temporary endpoint for V2 Beta until we allow passthrough documents on create.
*
* @public
*/
export const createDocumentFormDataRoute = authenticatedProcedure
.meta(createDocumentFormDataMeta)
.input(ZCreateDocumentFormDataRequestSchema)
.output(ZCreateDocumentFormDataResponseSchema)
.mutation(async ({ input, ctx }) => {
const { teamId, user } = ctx;
const { payload, file } = input;
const {
title,
externalId,
visibility,
globalAccessAuth,
globalActionAuth,
recipients,
meta,
folderId,
attachments,
} = payload;
const { remaining } = await getServerLimits({ userId: user.id, teamId });
if (remaining.documents <= 0) {
throw new AppError(AppErrorCode.LIMIT_EXCEEDED, {
message: 'You have reached your document limit for this month. Please upgrade your plan.',
statusCode: 400,
});
}
const documentData = await putPdfFileServerSide(file);
const createdEnvelope = await createEnvelope({
userId: ctx.user.id,
teamId,
normalizePdf: false, // Not normalizing because of presigned URL.
internalVersion: 1,
data: {
type: EnvelopeType.DOCUMENT,
title,
externalId,
visibility,
globalAccessAuth,
globalActionAuth,
recipients: (recipients || []).map((recipient) => ({
...recipient,
fields: (recipient.fields || []).map((field) => ({
...field,
page: field.pageNumber,
positionX: field.pageX,
positionY: field.pageY,
documentDataId: documentData.id,
})),
})),
folderId,
envelopeItems: [
{
// If you ever allow more than 1 in this endpoint, make sure to use `maximumEnvelopeItemCount` to limit it.
documentDataId: documentData.id,
},
],
},
attachments,
meta: {
...meta,
emailSettings: meta?.emailSettings ?? undefined,
},
requestMetadata: ctx.metadata,
});
const envelopeItems = await prisma.envelopeItem.findMany({
where: {
envelopeId: createdEnvelope.id,
},
include: {
documentData: true,
},
});
const legacyDocumentId = mapSecondaryIdToDocumentId(createdEnvelope.secondaryId);
const firstDocumentData = envelopeItems[0].documentData;
if (!firstDocumentData) {
throw new Error('Document data not found');
}
return {
document: {
...createdEnvelope,
envelopeId: createdEnvelope.id,
documentDataId: firstDocumentData.id,
documentData: {
...firstDocumentData,
envelopeItemId: envelopeItems[0].id,
},
documentMeta: {
...createdEnvelope.documentMeta,
documentId: legacyDocumentId,
},
id: legacyDocumentId,
fields: createdEnvelope.fields.map((field) => ({
...field,
documentId: legacyDocumentId,
templateId: null,
})),
recipients: createdEnvelope.recipients.map((recipient) => ({
...recipient,
documentId: legacyDocumentId,
templateId: null,
})),
},
folder: createdEnvelope.folder, // Todo: Remove this prior to api-v2 release.
};
});

View File

@ -1,97 +0,0 @@
import { z } from 'zod';
import { zfd } from 'zod-form-data';
import { ZDocumentSchema } from '@documenso/lib/types/document';
import {
ZDocumentAccessAuthTypesSchema,
ZDocumentActionAuthTypesSchema,
} from '@documenso/lib/types/document-auth';
import { ZDocumentFormValuesSchema } from '@documenso/lib/types/document-form-values';
import { ZDocumentMetaCreateSchema } from '@documenso/lib/types/document-meta';
import { ZEnvelopeAttachmentTypeSchema } from '@documenso/lib/types/envelope-attachment';
import {
ZFieldHeightSchema,
ZFieldPageNumberSchema,
ZFieldPageXSchema,
ZFieldPageYSchema,
ZFieldWidthSchema,
} from '@documenso/lib/types/field';
import { ZFieldAndMetaSchema } from '@documenso/lib/types/field-meta';
import { zodFormData } from '../../utils/zod-form-data';
import { ZCreateRecipientSchema } from '../recipient-router/schema';
import type { TrpcRouteMeta } from '../trpc';
import {
ZDocumentExternalIdSchema,
ZDocumentTitleSchema,
ZDocumentVisibilitySchema,
} from './schema';
export const createDocumentFormDataMeta: TrpcRouteMeta = {
openapi: {
method: 'POST',
path: '/document/create/formdata',
contentTypes: ['multipart/form-data'],
summary: 'Create document',
description: 'Create a document using form data.',
tags: ['Document'],
},
};
const ZCreateDocumentFormDataPayloadRequestSchema = z.object({
title: ZDocumentTitleSchema,
externalId: ZDocumentExternalIdSchema.optional(),
visibility: ZDocumentVisibilitySchema.optional(),
globalAccessAuth: z.array(ZDocumentAccessAuthTypesSchema).optional(),
globalActionAuth: z.array(ZDocumentActionAuthTypesSchema).optional(),
formValues: ZDocumentFormValuesSchema.optional(),
folderId: z
.string()
.describe(
'The ID of the folder to create the document in. If not provided, the document will be created in the root folder.',
)
.optional(),
recipients: z
.array(
ZCreateRecipientSchema.extend({
fields: ZFieldAndMetaSchema.and(
z.object({
pageNumber: ZFieldPageNumberSchema,
pageX: ZFieldPageXSchema,
pageY: ZFieldPageYSchema,
width: ZFieldWidthSchema,
height: ZFieldHeightSchema,
}),
)
.array()
.optional(),
}),
)
.optional(),
attachments: z
.array(
z.object({
label: z.string().min(1, 'Label is required'),
data: z.string().url('Must be a valid URL'),
type: ZEnvelopeAttachmentTypeSchema.optional().default('link'),
}),
)
.optional(),
meta: ZDocumentMetaCreateSchema.optional(),
});
// !: Can't use zfd.formData() here because it receives `undefined`
// !: somewhere in the pipeline of our openapi schema generation and throws
// !: an error.
export const ZCreateDocumentFormDataRequestSchema = zodFormData({
payload: zfd.json(ZCreateDocumentFormDataPayloadRequestSchema),
file: zfd.file(),
});
export const ZCreateDocumentFormDataResponseSchema = z.object({
document: ZDocumentSchema,
});
export type TCreateDocumentFormDataRequest = z.infer<typeof ZCreateDocumentFormDataRequestSchema>;
export type TCreateDocumentFormDataResponse = z.infer<typeof ZCreateDocumentFormDataResponseSchema>;

View File

@ -3,6 +3,7 @@ import { EnvelopeType } from '@prisma/client';
import { getServerLimits } from '@documenso/ee/server-only/limits/server'; import { getServerLimits } from '@documenso/ee/server-only/limits/server';
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
import { createEnvelope } from '@documenso/lib/server-only/envelope/create-envelope'; import { createEnvelope } from '@documenso/lib/server-only/envelope/create-envelope';
import { insertFormValuesInPdf } from '@documenso/lib/server-only/pdf/insert-form-values-in-pdf';
import { putNormalizedPdfFileServerSide } from '@documenso/lib/universal/upload/put-file.server'; import { putNormalizedPdfFileServerSide } from '@documenso/lib/universal/upload/put-file.server';
import { mapSecondaryIdToDocumentId } from '@documenso/lib/utils/envelope'; import { mapSecondaryIdToDocumentId } from '@documenso/lib/utils/envelope';
@ -22,9 +23,34 @@ export const createDocumentRoute = authenticatedProcedure
const { payload, file } = input; const { payload, file } = input;
const { title, timezone, folderId, attachments } = payload; const {
title,
externalId,
visibility,
globalAccessAuth,
globalActionAuth,
recipients,
meta,
folderId,
formValues,
attachments,
} = payload;
const { id: documentDataId } = await putNormalizedPdfFileServerSide(file); let pdf = Buffer.from(await file.arrayBuffer());
if (formValues) {
// eslint-disable-next-line require-atomic-updates
pdf = await insertFormValuesInPdf({
pdf,
formValues,
});
}
const { id: documentDataId } = await putNormalizedPdfFileServerSide({
name: file.name,
type: 'application/pdf',
arrayBuffer: async () => Promise.resolve(pdf),
});
ctx.logger.info({ ctx.logger.info({
input: { input: {
@ -48,7 +74,20 @@ export const createDocumentRoute = authenticatedProcedure
data: { data: {
type: EnvelopeType.DOCUMENT, type: EnvelopeType.DOCUMENT,
title, title,
userTimezone: timezone, externalId,
visibility,
globalAccessAuth,
globalActionAuth,
recipients: (recipients || []).map((recipient) => ({
...recipient,
fields: (recipient.fields || []).map((field) => ({
...field,
page: field.pageNumber,
positionX: field.pageX,
positionY: field.pageY,
documentDataId,
})),
})),
folderId, folderId,
envelopeItems: [ envelopeItems: [
{ {
@ -58,7 +97,10 @@ export const createDocumentRoute = authenticatedProcedure
], ],
}, },
attachments, attachments,
normalizePdf: true, meta: {
...meta,
emailSettings: meta?.emailSettings ?? undefined,
},
requestMetadata: ctx.metadata, requestMetadata: ctx.metadata,
}); });

View File

@ -1,12 +1,27 @@
import { z } from 'zod'; import { z } from 'zod';
import { zfd } from 'zod-form-data'; import { zfd } from 'zod-form-data';
import { ZDocumentMetaTimezoneSchema } from '@documenso/lib/types/document-meta'; import {
ZDocumentAccessAuthTypesSchema,
ZDocumentActionAuthTypesSchema,
} from '@documenso/lib/types/document-auth';
import { ZDocumentFormValuesSchema } from '@documenso/lib/types/document-form-values';
import { ZDocumentMetaCreateSchema } from '@documenso/lib/types/document-meta';
import { ZDocumentVisibilitySchema } from '@documenso/lib/types/document-visibility';
import { ZEnvelopeAttachmentTypeSchema } from '@documenso/lib/types/envelope-attachment'; import { ZEnvelopeAttachmentTypeSchema } from '@documenso/lib/types/envelope-attachment';
import {
ZFieldHeightSchema,
ZFieldPageNumberSchema,
ZFieldPageXSchema,
ZFieldPageYSchema,
ZFieldWidthSchema,
} from '@documenso/lib/types/field';
import { ZFieldAndMetaSchema } from '@documenso/lib/types/field-meta';
import { zodFormData } from '../../utils/zod-form-data'; import { zodFormData } from '../../utils/zod-form-data';
import { ZCreateRecipientSchema } from '../recipient-router/schema';
import type { TrpcRouteMeta } from '../trpc'; import type { TrpcRouteMeta } from '../trpc';
import { ZDocumentTitleSchema } from './schema'; import { ZDocumentExternalIdSchema, ZDocumentTitleSchema } from './schema';
export const createDocumentMeta: TrpcRouteMeta = { export const createDocumentMeta: TrpcRouteMeta = {
openapi: { openapi: {
@ -21,8 +36,35 @@ export const createDocumentMeta: TrpcRouteMeta = {
export const ZCreateDocumentPayloadSchema = z.object({ export const ZCreateDocumentPayloadSchema = z.object({
title: ZDocumentTitleSchema, title: ZDocumentTitleSchema,
timezone: ZDocumentMetaTimezoneSchema.optional(), externalId: ZDocumentExternalIdSchema.optional(),
folderId: z.string().describe('The ID of the folder to create the document in').optional(), visibility: ZDocumentVisibilitySchema.optional(),
globalAccessAuth: z.array(ZDocumentAccessAuthTypesSchema).optional(),
globalActionAuth: z.array(ZDocumentActionAuthTypesSchema).optional(),
formValues: ZDocumentFormValuesSchema.optional(),
folderId: z
.string()
.describe(
'The ID of the folder to create the document in. If not provided, the document will be created in the root folder.',
)
.optional(),
recipients: z
.array(
ZCreateRecipientSchema.extend({
fields: ZFieldAndMetaSchema.and(
z.object({
pageNumber: ZFieldPageNumberSchema,
pageX: ZFieldPageXSchema,
pageY: ZFieldPageYSchema,
width: ZFieldWidthSchema,
height: ZFieldHeightSchema,
}),
)
.array()
.optional(),
}),
)
.optional(),
attachments: z attachments: z
.array( .array(
z.object({ z.object({
@ -32,6 +74,7 @@ export const ZCreateDocumentPayloadSchema = z.object({
}), }),
) )
.optional(), .optional(),
meta: ZDocumentMetaCreateSchema.optional(),
}); });
export const ZCreateDocumentRequestSchema = zodFormData({ export const ZCreateDocumentRequestSchema = zodFormData({

View File

@ -1,12 +1,12 @@
import { deleteDocument } from '@documenso/lib/server-only/document/delete-document'; import { deleteDocument } from '@documenso/lib/server-only/document/delete-document';
import { ZGenericSuccessResponse } from '../schema';
import { authenticatedProcedure } from '../trpc'; import { authenticatedProcedure } from '../trpc';
import { import {
ZDeleteDocumentRequestSchema, ZDeleteDocumentRequestSchema,
ZDeleteDocumentResponseSchema, ZDeleteDocumentResponseSchema,
deleteDocumentMeta, deleteDocumentMeta,
} from './delete-document.types'; } from './delete-document.types';
import { ZGenericSuccessResponse } from './schema';
export const deleteDocumentRoute = authenticatedProcedure export const deleteDocumentRoute = authenticatedProcedure
.meta(deleteDocumentMeta) .meta(deleteDocumentMeta)

View File

@ -1,7 +1,7 @@
import { z } from 'zod'; import { z } from 'zod';
import { ZSuccessResponseSchema } from '../schema';
import type { TrpcRouteMeta } from '../trpc'; import type { TrpcRouteMeta } from '../trpc';
import { ZSuccessResponseSchema } from './schema';
export const deleteDocumentMeta: TrpcRouteMeta = { export const deleteDocumentMeta: TrpcRouteMeta = {
openapi: { openapi: {

View File

@ -19,5 +19,6 @@ export const downloadDocumentRoute = authenticatedProcedure
}, },
}); });
// This endpoint is purely for V2 API, which is implemented in the Hono remix server.
throw new Error('NOT_IMPLEMENTED'); throw new Error('NOT_IMPLEMENTED');
}); });

View File

@ -1,12 +1,12 @@
import { resendDocument } from '@documenso/lib/server-only/document/resend-document'; import { resendDocument } from '@documenso/lib/server-only/document/resend-document';
import { ZGenericSuccessResponse } from '../schema';
import { authenticatedProcedure } from '../trpc'; import { authenticatedProcedure } from '../trpc';
import { import {
ZRedistributeDocumentRequestSchema, ZRedistributeDocumentRequestSchema,
ZRedistributeDocumentResponseSchema, ZRedistributeDocumentResponseSchema,
redistributeDocumentMeta, redistributeDocumentMeta,
} from './redistribute-document.types'; } from './redistribute-document.types';
import { ZGenericSuccessResponse } from './schema';
export const redistributeDocumentRoute = authenticatedProcedure export const redistributeDocumentRoute = authenticatedProcedure
.meta(redistributeDocumentMeta) .meta(redistributeDocumentMeta)

View File

@ -1,7 +1,7 @@
import { z } from 'zod'; import { z } from 'zod';
import { ZSuccessResponseSchema } from '../schema';
import type { TrpcRouteMeta } from '../trpc'; import type { TrpcRouteMeta } from '../trpc';
import { ZSuccessResponseSchema } from './schema';
export const redistributeDocumentMeta: TrpcRouteMeta = { export const redistributeDocumentMeta: TrpcRouteMeta = {
openapi: { openapi: {

View File

@ -5,7 +5,6 @@ import { deleteAttachmentRoute } from './attachment/delete-attachment';
import { findAttachmentsRoute } from './attachment/find-attachments'; import { findAttachmentsRoute } from './attachment/find-attachments';
import { updateAttachmentRoute } from './attachment/update-attachment'; import { updateAttachmentRoute } from './attachment/update-attachment';
import { createDocumentRoute } from './create-document'; import { createDocumentRoute } from './create-document';
import { createDocumentFormDataRoute } from './create-document-formdata';
import { createDocumentTemporaryRoute } from './create-document-temporary'; import { createDocumentTemporaryRoute } from './create-document-temporary';
import { deleteDocumentRoute } from './delete-document'; import { deleteDocumentRoute } from './delete-document';
import { distributeDocumentRoute } from './distribute-document'; import { distributeDocumentRoute } from './distribute-document';
@ -39,11 +38,11 @@ export const documentRouter = router({
search: searchDocumentRoute, search: searchDocumentRoute,
share: shareDocumentRoute, share: shareDocumentRoute,
// Temporary v2 beta routes to be removed once V2 is fully released.
downloadBeta: downloadDocumentBetaRoute,
download: downloadDocumentRoute, download: downloadDocumentRoute,
// Deprecated endpoints which need to be removed in the future.
downloadBeta: downloadDocumentBetaRoute,
createDocumentTemporary: createDocumentTemporaryRoute, createDocumentTemporary: createDocumentTemporaryRoute,
createDocumentFormData: createDocumentFormDataRoute,
// Internal document routes for custom frontend requests. // Internal document routes for custom frontend requests.
getDocumentByToken: getDocumentByTokenRoute, getDocumentByToken: getDocumentByTokenRoute,

View File

@ -1,19 +1,6 @@
import { DocumentVisibility } from '@prisma/client'; import { DocumentVisibility } from '@prisma/client';
import { z } from 'zod'; import { z } from 'zod';
/**
* Required for empty responses since we currently can't 201 requests for our openapi setup.
*
* Without this it will throw an error in Speakeasy SDK when it tries to parse an empty response.
*/
export const ZSuccessResponseSchema = z.object({
success: z.literal(true),
});
export const ZGenericSuccessResponse = {
success: true,
} satisfies z.infer<typeof ZSuccessResponseSchema>;
export const ZDocumentTitleSchema = z export const ZDocumentTitleSchema = z
.string() .string()
.trim() .trim()

View File

@ -21,10 +21,14 @@ export const createAttachmentRoute = authenticatedProcedure
input: { envelopeId, label: data.label }, input: { envelopeId, label: data.label },
}); });
await createAttachment({ const attachment = await createAttachment({
envelopeId, envelopeId,
teamId, teamId,
userId, userId,
data, data,
}); });
return {
id: attachment.id,
};
}); });

View File

@ -20,7 +20,9 @@ export const ZCreateAttachmentRequestSchema = z.object({
}), }),
}); });
export const ZCreateAttachmentResponseSchema = z.void(); export const ZCreateAttachmentResponseSchema = z.object({
id: z.string(),
});
export type TCreateAttachmentRequest = z.infer<typeof ZCreateAttachmentRequestSchema>; export type TCreateAttachmentRequest = z.infer<typeof ZCreateAttachmentRequestSchema>;
export type TCreateAttachmentResponse = z.infer<typeof ZCreateAttachmentResponseSchema>; export type TCreateAttachmentResponse = z.infer<typeof ZCreateAttachmentResponseSchema>;

View File

@ -1,5 +1,6 @@
import { deleteAttachment } from '@documenso/lib/server-only/envelope-attachment/delete-attachment'; import { deleteAttachment } from '@documenso/lib/server-only/envelope-attachment/delete-attachment';
import { ZGenericSuccessResponse } from '../../schema';
import { authenticatedProcedure } from '../../trpc'; import { authenticatedProcedure } from '../../trpc';
import { import {
ZDeleteAttachmentRequestSchema, ZDeleteAttachmentRequestSchema,
@ -26,4 +27,6 @@ export const deleteAttachmentRoute = authenticatedProcedure
userId, userId,
teamId, teamId,
}); });
return ZGenericSuccessResponse;
}); });

View File

@ -1,5 +1,6 @@
import { z } from 'zod'; import { z } from 'zod';
import { ZSuccessResponseSchema } from '../../schema';
import type { TrpcRouteMeta } from '../../trpc'; import type { TrpcRouteMeta } from '../../trpc';
export const deleteAttachmentMeta: TrpcRouteMeta = { export const deleteAttachmentMeta: TrpcRouteMeta = {
@ -16,7 +17,7 @@ export const ZDeleteAttachmentRequestSchema = z.object({
id: z.string(), id: z.string(),
}); });
export const ZDeleteAttachmentResponseSchema = z.void(); export const ZDeleteAttachmentResponseSchema = ZSuccessResponseSchema;
export type TDeleteAttachmentRequest = z.infer<typeof ZDeleteAttachmentRequestSchema>; export type TDeleteAttachmentRequest = z.infer<typeof ZDeleteAttachmentRequestSchema>;
export type TDeleteAttachmentResponse = z.infer<typeof ZDeleteAttachmentResponseSchema>; export type TDeleteAttachmentResponse = z.infer<typeof ZDeleteAttachmentResponseSchema>;

View File

@ -1,5 +1,6 @@
import { updateAttachment } from '@documenso/lib/server-only/envelope-attachment/update-attachment'; import { updateAttachment } from '@documenso/lib/server-only/envelope-attachment/update-attachment';
import { ZGenericSuccessResponse } from '../../schema';
import { authenticatedProcedure } from '../../trpc'; import { authenticatedProcedure } from '../../trpc';
import { import {
ZUpdateAttachmentRequestSchema, ZUpdateAttachmentRequestSchema,
@ -27,4 +28,6 @@ export const updateAttachmentRoute = authenticatedProcedure
teamId, teamId,
data, data,
}); });
return ZGenericSuccessResponse;
}); });

View File

@ -1,5 +1,6 @@
import { z } from 'zod'; import { z } from 'zod';
import { ZSuccessResponseSchema } from '../../schema';
import type { TrpcRouteMeta } from '../../trpc'; import type { TrpcRouteMeta } from '../../trpc';
export const updateAttachmentMeta: TrpcRouteMeta = { export const updateAttachmentMeta: TrpcRouteMeta = {
@ -20,7 +21,7 @@ export const ZUpdateAttachmentRequestSchema = z.object({
}), }),
}); });
export const ZUpdateAttachmentResponseSchema = z.void(); export const ZUpdateAttachmentResponseSchema = ZSuccessResponseSchema;
export type TUpdateAttachmentRequest = z.infer<typeof ZUpdateAttachmentRequestSchema>; export type TUpdateAttachmentRequest = z.infer<typeof ZUpdateAttachmentRequestSchema>;
export type TUpdateAttachmentResponse = z.infer<typeof ZUpdateAttachmentResponseSchema>; export type TUpdateAttachmentResponse = z.infer<typeof ZUpdateAttachmentResponseSchema>;

View File

@ -11,6 +11,7 @@ export const createEnvelopeItemsMeta: TrpcRouteMeta = {
method: 'POST', method: 'POST',
path: '/envelope/item/create-many', path: '/envelope/item/create-many',
summary: 'Create envelope items', summary: 'Create envelope items',
contentTypes: ['multipart/form-data'],
description: 'Create multiple envelope items for an envelope', description: 'Create multiple envelope items for an envelope',
tags: ['Envelope Items'], tags: ['Envelope Items'],
}, },

View File

@ -3,6 +3,7 @@ import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
import { createEnvelope } from '@documenso/lib/server-only/envelope/create-envelope'; import { createEnvelope } from '@documenso/lib/server-only/envelope/create-envelope';
import { putNormalizedPdfFileServerSide } from '@documenso/lib/universal/upload/put-file.server'; import { putNormalizedPdfFileServerSide } from '@documenso/lib/universal/upload/put-file.server';
import { insertFormValuesInPdf } from '../../../lib/server-only/pdf/insert-form-values-in-pdf';
import { authenticatedProcedure } from '../trpc'; import { authenticatedProcedure } from '../trpc';
import { import {
ZCreateEnvelopeRequestSchema, ZCreateEnvelopeRequestSchema,
@ -58,10 +59,31 @@ export const createEnvelopeRoute = authenticatedProcedure
}); });
} }
if (files.some((file) => !file.type.startsWith('application/pdf'))) {
throw new AppError('INVALID_DOCUMENT_FILE', {
message: 'You cannot upload non-PDF files',
statusCode: 400,
});
}
// For each file, stream to s3 and create the document data. // For each file, stream to s3 and create the document data.
const envelopeItems = await Promise.all( const envelopeItems = await Promise.all(
files.map(async (file) => { files.map(async (file) => {
const { id: documentDataId } = await putNormalizedPdfFileServerSide(file); let pdf = Buffer.from(await file.arrayBuffer());
if (formValues) {
// eslint-disable-next-line require-atomic-updates
pdf = await insertFormValuesInPdf({
pdf,
formValues,
});
}
const { id: documentDataId } = await putNormalizedPdfFileServerSide({
name: file.name,
type: 'application/pdf',
arrayBuffer: async () => Promise.resolve(pdf),
});
return { return {
title: file.name, title: file.name,

View File

@ -16,7 +16,7 @@ import {
ZClampedFieldWidthSchema, ZClampedFieldWidthSchema,
ZFieldPageNumberSchema, ZFieldPageNumberSchema,
} from '@documenso/lib/types/field'; } from '@documenso/lib/types/field';
import { ZFieldAndMetaSchema } from '@documenso/lib/types/field-meta'; import { ZEnvelopeFieldAndMetaSchema } from '@documenso/lib/types/field-meta';
import { zodFormData } from '../../utils/zod-form-data'; import { zodFormData } from '../../utils/zod-form-data';
import { import {
@ -55,7 +55,7 @@ export const ZCreateEnvelopePayloadSchema = z.object({
recipients: z recipients: z
.array( .array(
ZCreateRecipientSchema.extend({ ZCreateRecipientSchema.extend({
fields: ZFieldAndMetaSchema.and( fields: ZEnvelopeFieldAndMetaSchema.and(
z.object({ z.object({
identifier: z identifier: z
.union([z.string(), z.number()]) .union([z.string(), z.number()])

View File

@ -5,6 +5,7 @@ import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-
import { canEnvelopeItemsBeModified } from '@documenso/lib/utils/envelope'; import { canEnvelopeItemsBeModified } from '@documenso/lib/utils/envelope';
import { prisma } from '@documenso/prisma'; import { prisma } from '@documenso/prisma';
import { ZGenericSuccessResponse } from '../schema';
import { authenticatedProcedure } from '../trpc'; import { authenticatedProcedure } from '../trpc';
import { import {
ZDeleteEnvelopeItemRequestSchema, ZDeleteEnvelopeItemRequestSchema,
@ -100,4 +101,6 @@ export const deleteEnvelopeItemRoute = authenticatedProcedure
}, },
}, },
}); });
return ZGenericSuccessResponse;
}); });

View File

@ -1,5 +1,6 @@
import { z } from 'zod'; import { z } from 'zod';
import { ZSuccessResponseSchema } from '../schema';
import type { TrpcRouteMeta } from '../trpc'; import type { TrpcRouteMeta } from '../trpc';
export const deleteEnvelopeItemMeta: TrpcRouteMeta = { export const deleteEnvelopeItemMeta: TrpcRouteMeta = {
@ -17,7 +18,7 @@ export const ZDeleteEnvelopeItemRequestSchema = z.object({
envelopeItemId: z.string(), envelopeItemId: z.string(),
}); });
export const ZDeleteEnvelopeItemResponseSchema = z.void(); export const ZDeleteEnvelopeItemResponseSchema = ZSuccessResponseSchema;
export type TDeleteEnvelopeItemRequest = z.infer<typeof ZDeleteEnvelopeItemRequestSchema>; export type TDeleteEnvelopeItemRequest = z.infer<typeof ZDeleteEnvelopeItemRequestSchema>;
export type TDeleteEnvelopeItemResponse = z.infer<typeof ZDeleteEnvelopeItemResponseSchema>; export type TDeleteEnvelopeItemResponse = z.infer<typeof ZDeleteEnvelopeItemResponseSchema>;

View File

@ -6,6 +6,7 @@ import { deleteDocument } from '@documenso/lib/server-only/document/delete-docum
import { deleteTemplate } from '@documenso/lib/server-only/template/delete-template'; import { deleteTemplate } from '@documenso/lib/server-only/template/delete-template';
import { prisma } from '@documenso/prisma'; import { prisma } from '@documenso/prisma';
import { ZGenericSuccessResponse } from '../schema';
import { authenticatedProcedure } from '../trpc'; import { authenticatedProcedure } from '../trpc';
import { import {
ZDeleteEnvelopeRequestSchema, ZDeleteEnvelopeRequestSchema,
@ -65,4 +66,6 @@ export const deleteEnvelopeRoute = authenticatedProcedure
}), }),
) )
.exhaustive(); .exhaustive();
return ZGenericSuccessResponse;
}); });

View File

@ -1,5 +1,6 @@
import { z } from 'zod'; import { z } from 'zod';
import { ZSuccessResponseSchema } from '../schema';
import type { TrpcRouteMeta } from '../trpc'; import type { TrpcRouteMeta } from '../trpc';
export const deleteEnvelopeMeta: TrpcRouteMeta = { export const deleteEnvelopeMeta: TrpcRouteMeta = {
@ -15,7 +16,7 @@ export const ZDeleteEnvelopeRequestSchema = z.object({
envelopeId: z.string(), envelopeId: z.string(),
}); });
export const ZDeleteEnvelopeResponseSchema = z.void(); export const ZDeleteEnvelopeResponseSchema = ZSuccessResponseSchema;
export type TDeleteEnvelopeRequest = z.infer<typeof ZDeleteEnvelopeRequestSchema>; export type TDeleteEnvelopeRequest = z.infer<typeof ZDeleteEnvelopeRequestSchema>;
export type TDeleteEnvelopeResponse = z.infer<typeof ZDeleteEnvelopeResponseSchema>; export type TDeleteEnvelopeResponse = z.infer<typeof ZDeleteEnvelopeResponseSchema>;

View File

@ -1,6 +1,7 @@
import { updateDocumentMeta } from '@documenso/lib/server-only/document-meta/upsert-document-meta'; import { updateDocumentMeta } from '@documenso/lib/server-only/document-meta/upsert-document-meta';
import { sendDocument } from '@documenso/lib/server-only/document/send-document'; import { sendDocument } from '@documenso/lib/server-only/document/send-document';
import { ZGenericSuccessResponse } from '../schema';
import { authenticatedProcedure } from '../trpc'; import { authenticatedProcedure } from '../trpc';
import { import {
ZDistributeEnvelopeRequestSchema, ZDistributeEnvelopeRequestSchema,
@ -53,4 +54,6 @@ export const distributeEnvelopeRoute = authenticatedProcedure
teamId, teamId,
requestMetadata: ctx.metadata, requestMetadata: ctx.metadata,
}); });
return ZGenericSuccessResponse;
}); });

View File

@ -2,6 +2,7 @@ import { z } from 'zod';
import { ZDocumentMetaUpdateSchema } from '@documenso/lib/types/document-meta'; import { ZDocumentMetaUpdateSchema } from '@documenso/lib/types/document-meta';
import { ZSuccessResponseSchema } from '../schema';
import type { TrpcRouteMeta } from '../trpc'; import type { TrpcRouteMeta } from '../trpc';
export const distributeEnvelopeMeta: TrpcRouteMeta = { export const distributeEnvelopeMeta: TrpcRouteMeta = {
@ -30,7 +31,7 @@ export const ZDistributeEnvelopeRequestSchema = z.object({
}).optional(), }).optional(),
}); });
export const ZDistributeEnvelopeResponseSchema = z.void(); export const ZDistributeEnvelopeResponseSchema = ZSuccessResponseSchema;
export type TDistributeEnvelopeRequest = z.infer<typeof ZDistributeEnvelopeRequestSchema>; export type TDistributeEnvelopeRequest = z.infer<typeof ZDistributeEnvelopeRequestSchema>;
export type TDistributeEnvelopeResponse = z.infer<typeof ZDistributeEnvelopeResponseSchema>; export type TDistributeEnvelopeResponse = z.infer<typeof ZDistributeEnvelopeResponseSchema>;

View File

@ -19,5 +19,6 @@ export const downloadEnvelopeItemRoute = authenticatedProcedure
}, },
}); });
// This endpoint is purely for V2 API, which is implemented in the Hono remix server.
throw new Error('NOT_IMPLEMENTED'); throw new Error('NOT_IMPLEMENTED');
}); });

View File

@ -5,7 +5,7 @@ import type { TrpcRouteMeta } from '../trpc';
export const downloadEnvelopeItemMeta: TrpcRouteMeta = { export const downloadEnvelopeItemMeta: TrpcRouteMeta = {
openapi: { openapi: {
method: 'GET', method: 'GET',
path: '/envelopeItem/{envelopeItemId}/download', path: '/envelope/item/{envelopeItemId}/download',
summary: 'Download an envelope item', summary: 'Download an envelope item',
description: 'Download an envelope item by its ID', description: 'Download an envelope item by its ID',
tags: ['Envelope Items'], tags: ['Envelope Items'],

View File

@ -8,7 +8,7 @@ import {
ZFieldPageNumberSchema, ZFieldPageNumberSchema,
ZFieldSchema, ZFieldSchema,
} from '@documenso/lib/types/field'; } from '@documenso/lib/types/field';
import { ZFieldAndMetaSchema } from '@documenso/lib/types/field-meta'; import { ZEnvelopeFieldAndMetaSchema } from '@documenso/lib/types/field-meta';
import type { TrpcRouteMeta } from '../../trpc'; import type { TrpcRouteMeta } from '../../trpc';
@ -16,14 +16,13 @@ export const createEnvelopeFieldsMeta: TrpcRouteMeta = {
openapi: { openapi: {
method: 'POST', method: 'POST',
path: '/envelope/field/create-many', path: '/envelope/field/create-many',
contentTypes: ['multipart/form-data'],
summary: 'Create envelope fields', summary: 'Create envelope fields',
description: 'Create multiple fields for an envelope', description: 'Create multiple fields for an envelope',
tags: ['Envelope Fields'], tags: ['Envelope Fields'],
}, },
}; };
const ZCreateFieldSchema = ZFieldAndMetaSchema.and( const ZCreateFieldSchema = ZEnvelopeFieldAndMetaSchema.and(
z.object({ z.object({
recipientId: z.number().describe('The ID of the recipient to create the field for'), recipientId: z.number().describe('The ID of the recipient to create the field for'),
envelopeItemId: z envelopeItemId: z

View File

@ -7,6 +7,7 @@ import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-
import { canRecipientFieldsBeModified } from '@documenso/lib/utils/recipients'; import { canRecipientFieldsBeModified } from '@documenso/lib/utils/recipients';
import { prisma } from '@documenso/prisma'; import { prisma } from '@documenso/prisma';
import { ZGenericSuccessResponse } from '../../schema';
import { authenticatedProcedure } from '../../trpc'; import { authenticatedProcedure } from '../../trpc';
import { import {
ZDeleteEnvelopeFieldRequestSchema, ZDeleteEnvelopeFieldRequestSchema,
@ -115,4 +116,6 @@ export const deleteEnvelopeFieldRoute = authenticatedProcedure
return deletedField; return deletedField;
}); });
return ZGenericSuccessResponse;
}); });

View File

@ -1,5 +1,6 @@
import { z } from 'zod'; import { z } from 'zod';
import { ZSuccessResponseSchema } from '../../schema';
import type { TrpcRouteMeta } from '../../trpc'; import type { TrpcRouteMeta } from '../../trpc';
export const deleteEnvelopeFieldMeta: TrpcRouteMeta = { export const deleteEnvelopeFieldMeta: TrpcRouteMeta = {
@ -16,7 +17,7 @@ export const ZDeleteEnvelopeFieldRequestSchema = z.object({
fieldId: z.number(), fieldId: z.number(),
}); });
export const ZDeleteEnvelopeFieldResponseSchema = z.void(); export const ZDeleteEnvelopeFieldResponseSchema = ZSuccessResponseSchema;
export type TDeleteEnvelopeFieldRequest = z.infer<typeof ZDeleteEnvelopeFieldRequestSchema>; export type TDeleteEnvelopeFieldRequest = z.infer<typeof ZDeleteEnvelopeFieldRequestSchema>;
export type TDeleteEnvelopeFieldResponse = z.infer<typeof ZDeleteEnvelopeFieldResponseSchema>; export type TDeleteEnvelopeFieldResponse = z.infer<typeof ZDeleteEnvelopeFieldResponseSchema>;

View File

@ -8,7 +8,7 @@ import {
ZFieldPageNumberSchema, ZFieldPageNumberSchema,
ZFieldSchema, ZFieldSchema,
} from '@documenso/lib/types/field'; } from '@documenso/lib/types/field';
import { ZFieldAndMetaSchema } from '@documenso/lib/types/field-meta'; import { ZEnvelopeFieldAndMetaSchema } from '@documenso/lib/types/field-meta';
import type { TrpcRouteMeta } from '../../trpc'; import type { TrpcRouteMeta } from '../../trpc';
@ -22,7 +22,7 @@ export const updateEnvelopeFieldsMeta: TrpcRouteMeta = {
}, },
}; };
const ZUpdateFieldSchema = ZFieldAndMetaSchema.and( const ZUpdateFieldSchema = ZEnvelopeFieldAndMetaSchema.and(
z.object({ z.object({
id: z.number().describe('The ID of the field to update.'), id: z.number().describe('The ID of the field to update.'),
envelopeItemId: z envelopeItemId: z

View File

@ -1,5 +1,6 @@
import { deleteEnvelopeRecipient } from '@documenso/lib/server-only/recipient/delete-envelope-recipient'; import { deleteEnvelopeRecipient } from '@documenso/lib/server-only/recipient/delete-envelope-recipient';
import { ZGenericSuccessResponse } from '../../schema';
import { authenticatedProcedure } from '../../trpc'; import { authenticatedProcedure } from '../../trpc';
import { import {
ZDeleteEnvelopeRecipientRequestSchema, ZDeleteEnvelopeRecipientRequestSchema,
@ -27,4 +28,6 @@ export const deleteEnvelopeRecipientRoute = authenticatedProcedure
recipientId, recipientId,
requestMetadata: metadata, requestMetadata: metadata,
}); });
return ZGenericSuccessResponse;
}); });

View File

@ -1,5 +1,6 @@
import { z } from 'zod'; import { z } from 'zod';
import { ZSuccessResponseSchema } from '../../schema';
import type { TrpcRouteMeta } from '../../trpc'; import type { TrpcRouteMeta } from '../../trpc';
export const deleteEnvelopeRecipientMeta: TrpcRouteMeta = { export const deleteEnvelopeRecipientMeta: TrpcRouteMeta = {
@ -16,7 +17,7 @@ export const ZDeleteEnvelopeRecipientRequestSchema = z.object({
recipientId: z.number(), recipientId: z.number(),
}); });
export const ZDeleteEnvelopeRecipientResponseSchema = z.void(); export const ZDeleteEnvelopeRecipientResponseSchema = ZSuccessResponseSchema;
export type TDeleteEnvelopeRecipientRequest = z.infer<typeof ZDeleteEnvelopeRecipientRequestSchema>; export type TDeleteEnvelopeRecipientRequest = z.infer<typeof ZDeleteEnvelopeRecipientRequestSchema>;
export type TDeleteEnvelopeRecipientResponse = z.infer< export type TDeleteEnvelopeRecipientResponse = z.infer<

View File

@ -1,5 +1,6 @@
import { resendDocument } from '@documenso/lib/server-only/document/resend-document'; import { resendDocument } from '@documenso/lib/server-only/document/resend-document';
import { ZGenericSuccessResponse } from '../schema';
import { authenticatedProcedure } from '../trpc'; import { authenticatedProcedure } from '../trpc';
import { import {
ZRedistributeEnvelopeRequestSchema, ZRedistributeEnvelopeRequestSchema,
@ -32,4 +33,6 @@ export const redistributeEnvelopeRoute = authenticatedProcedure
recipients, recipients,
requestMetadata: ctx.metadata, requestMetadata: ctx.metadata,
}); });
return ZGenericSuccessResponse;
}); });

View File

@ -1,5 +1,6 @@
import { z } from 'zod'; import { z } from 'zod';
import { ZSuccessResponseSchema } from '../schema';
import type { TrpcRouteMeta } from '../trpc'; import type { TrpcRouteMeta } from '../trpc';
export const redistributeEnvelopeMeta: TrpcRouteMeta = { export const redistributeEnvelopeMeta: TrpcRouteMeta = {
@ -21,7 +22,7 @@ export const ZRedistributeEnvelopeRequestSchema = z.object({
.describe('The IDs of the recipients to redistribute the envelope to.'), .describe('The IDs of the recipients to redistribute the envelope to.'),
}); });
export const ZRedistributeEnvelopeResponseSchema = z.void(); export const ZRedistributeEnvelopeResponseSchema = ZSuccessResponseSchema;
export type TRedistributeEnvelopeRequest = z.infer<typeof ZRedistributeEnvelopeRequestSchema>; export type TRedistributeEnvelopeRequest = z.infer<typeof ZRedistributeEnvelopeRequestSchema>;
export type TRedistributeEnvelopeResponse = z.infer<typeof ZRedistributeEnvelopeResponseSchema>; export type TRedistributeEnvelopeResponse = z.infer<typeof ZRedistributeEnvelopeResponseSchema>;

View File

@ -8,6 +8,7 @@ import { createEnvelopeItemsRoute } from './create-envelope-items';
import { deleteEnvelopeRoute } from './delete-envelope'; import { deleteEnvelopeRoute } from './delete-envelope';
import { deleteEnvelopeItemRoute } from './delete-envelope-item'; import { deleteEnvelopeItemRoute } from './delete-envelope-item';
import { distributeEnvelopeRoute } from './distribute-envelope'; import { distributeEnvelopeRoute } from './distribute-envelope';
import { downloadEnvelopeItemRoute } from './download-envelope-item';
import { duplicateEnvelopeRoute } from './duplicate-envelope'; import { duplicateEnvelopeRoute } from './duplicate-envelope';
import { createEnvelopeFieldsRoute } from './envelope-fields/create-envelope-fields'; import { createEnvelopeFieldsRoute } from './envelope-fields/create-envelope-fields';
import { deleteEnvelopeFieldRoute } from './envelope-fields/delete-envelope-field'; import { deleteEnvelopeFieldRoute } from './envelope-fields/delete-envelope-field';
@ -46,6 +47,7 @@ export const envelopeRouter = router({
createMany: createEnvelopeItemsRoute, createMany: createEnvelopeItemsRoute,
updateMany: updateEnvelopeItemsRoute, updateMany: updateEnvelopeItemsRoute,
delete: deleteEnvelopeItemRoute, delete: deleteEnvelopeItemRoute,
download: downloadEnvelopeItemRoute,
}, },
recipient: { recipient: {
get: getEnvelopeRecipientRoute, get: getEnvelopeRecipientRoute,

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