mirror of
https://github.com/documenso/documenso.git
synced 2025-11-13 16:23:06 +10:00
chore: merge main
This commit is contained in:
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@documenso/marketing",
|
"name": "@documenso/marketing",
|
||||||
"version": "1.7.2-rc.0",
|
"version": "1.7.2-rc.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@documenso/web",
|
"name": "@documenso/web",
|
||||||
"version": "1.7.2-rc.0",
|
"version": "1.7.2-rc.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@ -114,6 +114,24 @@ export const EditDocumentForm = ({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const { mutateAsync: updateTypedSignature } =
|
||||||
|
trpc.document.updateTypedSignatureSettings.useMutation({
|
||||||
|
...DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
|
||||||
|
onSuccess: (newData) => {
|
||||||
|
utils.document.getDocumentWithDetailsById.setData(
|
||||||
|
{
|
||||||
|
id: initialDocument.id,
|
||||||
|
teamId: team?.id,
|
||||||
|
},
|
||||||
|
(oldData) => ({
|
||||||
|
...(oldData || initialDocument),
|
||||||
|
...newData,
|
||||||
|
id: Number(newData.id),
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
const { mutateAsync: addSigners } = trpc.recipient.addSigners.useMutation({
|
const { mutateAsync: addSigners } = trpc.recipient.addSigners.useMutation({
|
||||||
...DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
|
...DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
|
||||||
onSuccess: (newRecipients) => {
|
onSuccess: (newRecipients) => {
|
||||||
@ -273,6 +291,11 @@ export const EditDocumentForm = ({
|
|||||||
fields: data.fields,
|
fields: data.fields,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await updateTypedSignature({
|
||||||
|
documentId: document.id,
|
||||||
|
typedSignatureEnabled: data.typedSignatureEnabled,
|
||||||
|
});
|
||||||
|
|
||||||
// Clear all field data from localStorage
|
// Clear all field data from localStorage
|
||||||
for (let i = 0; i < localStorage.length; i++) {
|
for (let i = 0; i < localStorage.length; i++) {
|
||||||
const key = localStorage.key(i);
|
const key = localStorage.key(i);
|
||||||
@ -413,6 +436,7 @@ export const EditDocumentForm = ({
|
|||||||
fields={fields}
|
fields={fields}
|
||||||
onSubmit={onAddFieldsFormSubmit}
|
onSubmit={onAddFieldsFormSubmit}
|
||||||
isDocumentPdfLoaded={isDocumentPdfLoaded}
|
isDocumentPdfLoaded={isDocumentPdfLoaded}
|
||||||
|
typedSignatureEnabled={document.documentMeta?.typedSignatureEnabled}
|
||||||
teamId={team?.id}
|
teamId={team?.id}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|||||||
@ -144,6 +144,7 @@ export const TemplatesDataTable = ({
|
|||||||
<div className="flex items-center gap-x-4">
|
<div className="flex items-center gap-x-4">
|
||||||
<UseTemplateDialog
|
<UseTemplateDialog
|
||||||
templateId={row.original.id}
|
templateId={row.original.id}
|
||||||
|
templateSigningOrder={row.original.templateMeta?.signingOrder}
|
||||||
recipients={row.original.Recipient}
|
recipients={row.original.Recipient}
|
||||||
documentRootPath={documentRootPath}
|
documentRootPath={documentRootPath}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -434,12 +434,14 @@ export const TemplateDirectLinkDialog = ({
|
|||||||
<Button
|
<Button
|
||||||
type="button"
|
type="button"
|
||||||
loading={isTogglingTemplateAccess}
|
loading={isTogglingTemplateAccess}
|
||||||
onClick={async () =>
|
onClick={async () => {
|
||||||
toggleTemplateDirectLink({
|
await toggleTemplateDirectLink({
|
||||||
templateId: template.id,
|
templateId: template.id,
|
||||||
enabled: isEnabled,
|
enabled: isEnabled,
|
||||||
})
|
}).catch((e) => null);
|
||||||
}
|
|
||||||
|
onOpenChange(false);
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<Trans>Save</Trans>
|
<Trans>Save</Trans>
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@ -15,7 +15,9 @@ import {
|
|||||||
} from '@documenso/lib/constants/template';
|
} from '@documenso/lib/constants/template';
|
||||||
import { AppError } from '@documenso/lib/errors/app-error';
|
import { AppError } from '@documenso/lib/errors/app-error';
|
||||||
import type { Recipient } from '@documenso/prisma/client';
|
import type { Recipient } from '@documenso/prisma/client';
|
||||||
|
import { DocumentSigningOrder } from '@documenso/prisma/client';
|
||||||
import { trpc } from '@documenso/trpc/react';
|
import { trpc } from '@documenso/trpc/react';
|
||||||
|
import { cn } from '@documenso/ui/lib/utils';
|
||||||
import { Button } from '@documenso/ui/primitives/button';
|
import { Button } from '@documenso/ui/primitives/button';
|
||||||
import { Checkbox } from '@documenso/ui/primitives/checkbox';
|
import { Checkbox } from '@documenso/ui/primitives/checkbox';
|
||||||
import {
|
import {
|
||||||
@ -51,6 +53,7 @@ const ZAddRecipientsForNewDocumentSchema = z
|
|||||||
id: z.number(),
|
id: z.number(),
|
||||||
email: z.string().email(),
|
email: z.string().email(),
|
||||||
name: z.string(),
|
name: z.string(),
|
||||||
|
signingOrder: z.number().optional(),
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
@ -86,6 +89,7 @@ type TAddRecipientsForNewDocumentSchema = z.infer<typeof ZAddRecipientsForNewDoc
|
|||||||
|
|
||||||
export type UseTemplateDialogProps = {
|
export type UseTemplateDialogProps = {
|
||||||
templateId: number;
|
templateId: number;
|
||||||
|
templateSigningOrder?: DocumentSigningOrder | null;
|
||||||
recipients: Recipient[];
|
recipients: Recipient[];
|
||||||
documentRootPath: string;
|
documentRootPath: string;
|
||||||
};
|
};
|
||||||
@ -94,6 +98,7 @@ export function UseTemplateDialog({
|
|||||||
recipients,
|
recipients,
|
||||||
documentRootPath,
|
documentRootPath,
|
||||||
templateId,
|
templateId,
|
||||||
|
templateSigningOrder,
|
||||||
}: UseTemplateDialogProps) {
|
}: UseTemplateDialogProps) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
@ -108,21 +113,24 @@ export function UseTemplateDialog({
|
|||||||
resolver: zodResolver(ZAddRecipientsForNewDocumentSchema),
|
resolver: zodResolver(ZAddRecipientsForNewDocumentSchema),
|
||||||
defaultValues: {
|
defaultValues: {
|
||||||
sendDocument: false,
|
sendDocument: false,
|
||||||
recipients: recipients.map((recipient) => {
|
recipients: recipients
|
||||||
const isRecipientEmailPlaceholder = recipient.email.match(
|
.sort((a, b) => (a.signingOrder || 0) - (b.signingOrder || 0))
|
||||||
TEMPLATE_RECIPIENT_EMAIL_PLACEHOLDER_REGEX,
|
.map((recipient) => {
|
||||||
);
|
const isRecipientEmailPlaceholder = recipient.email.match(
|
||||||
|
TEMPLATE_RECIPIENT_EMAIL_PLACEHOLDER_REGEX,
|
||||||
|
);
|
||||||
|
|
||||||
const isRecipientNamePlaceholder = recipient.name.match(
|
const isRecipientNamePlaceholder = recipient.name.match(
|
||||||
TEMPLATE_RECIPIENT_NAME_PLACEHOLDER_REGEX,
|
TEMPLATE_RECIPIENT_NAME_PLACEHOLDER_REGEX,
|
||||||
);
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: recipient.id,
|
id: recipient.id,
|
||||||
name: !isRecipientNamePlaceholder ? recipient.name : '',
|
name: !isRecipientNamePlaceholder ? recipient.name : '',
|
||||||
email: !isRecipientEmailPlaceholder ? recipient.email : '',
|
email: !isRecipientEmailPlaceholder ? recipient.email : '',
|
||||||
};
|
signingOrder: recipient.signingOrder ?? undefined,
|
||||||
}),
|
};
|
||||||
|
}),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -203,6 +211,33 @@ export function UseTemplateDialog({
|
|||||||
<div className="custom-scrollbar -m-1 max-h-[60vh] space-y-4 overflow-y-auto p-1">
|
<div className="custom-scrollbar -m-1 max-h-[60vh] space-y-4 overflow-y-auto p-1">
|
||||||
{formRecipients.map((recipient, index) => (
|
{formRecipients.map((recipient, index) => (
|
||||||
<div className="flex w-full flex-row space-x-4" key={recipient.id}>
|
<div className="flex w-full flex-row space-x-4" key={recipient.id}>
|
||||||
|
{templateSigningOrder === DocumentSigningOrder.SEQUENTIAL && (
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name={`recipients.${index}.signingOrder`}
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem
|
||||||
|
className={cn('w-20', {
|
||||||
|
'mt-8': index === 0,
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
{...field}
|
||||||
|
disabled
|
||||||
|
className="items-center justify-center"
|
||||||
|
value={
|
||||||
|
field.value?.toString() ||
|
||||||
|
recipients[index]?.signingOrder?.toString()
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name={`recipients.${index}.email`}
|
name={`recipients.${index}.email`}
|
||||||
|
|||||||
@ -9,9 +9,10 @@ import { useSession } from 'next-auth/react';
|
|||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
|
|
||||||
import { useAnalytics } from '@documenso/lib/client-only/hooks/use-analytics';
|
import { useAnalytics } from '@documenso/lib/client-only/hooks/use-analytics';
|
||||||
|
import type { DocumentAndSender } from '@documenso/lib/server-only/document/get-document-by-token';
|
||||||
import type { TRecipientActionAuth } from '@documenso/lib/types/document-auth';
|
import type { TRecipientActionAuth } from '@documenso/lib/types/document-auth';
|
||||||
import { sortFieldsByPosition, validateFieldsInserted } from '@documenso/lib/utils/fields';
|
import { sortFieldsByPosition, validateFieldsInserted } from '@documenso/lib/utils/fields';
|
||||||
import { type Document, type Field, type Recipient, RecipientRole } from '@documenso/prisma/client';
|
import { type Field, type Recipient, RecipientRole } from '@documenso/prisma/client';
|
||||||
import { trpc } from '@documenso/trpc/react';
|
import { trpc } from '@documenso/trpc/react';
|
||||||
import { FieldToolTip } from '@documenso/ui/components/field/field-tooltip';
|
import { FieldToolTip } from '@documenso/ui/components/field/field-tooltip';
|
||||||
import { cn } from '@documenso/ui/lib/utils';
|
import { cn } from '@documenso/ui/lib/utils';
|
||||||
@ -25,7 +26,7 @@ import { useRequiredSigningContext } from './provider';
|
|||||||
import { SignDialog } from './sign-dialog';
|
import { SignDialog } from './sign-dialog';
|
||||||
|
|
||||||
export type SigningFormProps = {
|
export type SigningFormProps = {
|
||||||
document: Document;
|
document: DocumentAndSender;
|
||||||
recipient: Recipient;
|
recipient: Recipient;
|
||||||
fields: Field[];
|
fields: Field[];
|
||||||
redirectUrl?: string | null;
|
redirectUrl?: string | null;
|
||||||
@ -196,6 +197,7 @@ export const SigningForm = ({
|
|||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
setSignature(value);
|
setSignature(value);
|
||||||
}}
|
}}
|
||||||
|
allowTypedSignature={document.documentMeta?.typedSignatureEnabled}
|
||||||
/>
|
/>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
@ -31,12 +31,12 @@ import { useRequiredSigningContext } from './provider';
|
|||||||
import { SigningFieldContainer } from './signing-field-container';
|
import { SigningFieldContainer } from './signing-field-container';
|
||||||
|
|
||||||
type SignatureFieldState = 'empty' | 'signed-image' | 'signed-text';
|
type SignatureFieldState = 'empty' | 'signed-image' | 'signed-text';
|
||||||
|
|
||||||
export type SignatureFieldProps = {
|
export type SignatureFieldProps = {
|
||||||
field: FieldWithSignature;
|
field: FieldWithSignature;
|
||||||
recipient: Recipient;
|
recipient: Recipient;
|
||||||
onSignField?: (value: TSignFieldWithTokenMutationSchema) => Promise<void> | void;
|
onSignField?: (value: TSignFieldWithTokenMutationSchema) => Promise<void> | void;
|
||||||
onUnsignField?: (value: TRemovedSignedFieldWithTokenMutationSchema) => Promise<void> | void;
|
onUnsignField?: (value: TRemovedSignedFieldWithTokenMutationSchema) => Promise<void> | void;
|
||||||
|
typedSignatureEnabled?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const SignatureField = ({
|
export const SignatureField = ({
|
||||||
@ -44,6 +44,7 @@ export const SignatureField = ({
|
|||||||
recipient,
|
recipient,
|
||||||
onSignField,
|
onSignField,
|
||||||
onUnsignField,
|
onUnsignField,
|
||||||
|
typedSignatureEnabled,
|
||||||
}: SignatureFieldProps) => {
|
}: SignatureFieldProps) => {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
@ -92,14 +93,12 @@ export const SignatureField = ({
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When the user clicks the sign button in the dialog where they enter their signature.
|
* When the user clicks the sign button in the dialog where they enter their signature.
|
||||||
*/
|
*/
|
||||||
const onDialogSignClick = () => {
|
const onDialogSignClick = () => {
|
||||||
setShowSignatureModal(false);
|
setShowSignatureModal(false);
|
||||||
setProvidedSignature(localSignature);
|
setProvidedSignature(localSignature);
|
||||||
|
|
||||||
if (!localSignature) {
|
if (!localSignature) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -109,7 +108,6 @@ export const SignatureField = ({
|
|||||||
actionTarget: field.type,
|
actionTarget: field.type,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const onSign = async (authOptions?: TRecipientActionAuth, signature?: string) => {
|
const onSign = async (authOptions?: TRecipientActionAuth, signature?: string) => {
|
||||||
try {
|
try {
|
||||||
const value = signature || providedSignature;
|
const value = signature || providedSignature;
|
||||||
@ -231,11 +229,11 @@ export const SignatureField = ({
|
|||||||
id="signature"
|
id="signature"
|
||||||
className="border-border mt-2 h-44 w-full rounded-md border"
|
className="border-border mt-2 h-44 w-full rounded-md border"
|
||||||
onChange={(value) => setLocalSignature(value)}
|
onChange={(value) => setLocalSignature(value)}
|
||||||
|
allowTypedSignature={typedSignatureEnabled}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<SigningDisclosure />
|
<SigningDisclosure />
|
||||||
|
|
||||||
<DialogFooter>
|
<DialogFooter>
|
||||||
<div className="flex w-full flex-1 flex-nowrap gap-4">
|
<div className="flex w-full flex-1 flex-nowrap gap-4">
|
||||||
<Button
|
<Button
|
||||||
@ -249,7 +247,6 @@ export const SignatureField = ({
|
|||||||
>
|
>
|
||||||
<Trans>Cancel</Trans>
|
<Trans>Cancel</Trans>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
type="button"
|
type="button"
|
||||||
className="flex-1"
|
className="flex-1"
|
||||||
|
|||||||
@ -112,7 +112,12 @@ export const SigningPageView = ({
|
|||||||
{fields.map((field) =>
|
{fields.map((field) =>
|
||||||
match(field.type)
|
match(field.type)
|
||||||
.with(FieldType.SIGNATURE, () => (
|
.with(FieldType.SIGNATURE, () => (
|
||||||
<SignatureField key={field.id} field={field} recipient={recipient} />
|
<SignatureField
|
||||||
|
key={field.id}
|
||||||
|
field={field}
|
||||||
|
recipient={recipient}
|
||||||
|
typedSignatureEnabled={documentMeta?.typedSignatureEnabled}
|
||||||
|
/>
|
||||||
))
|
))
|
||||||
.with(FieldType.INITIALS, () => (
|
.with(FieldType.INITIALS, () => (
|
||||||
<InitialsField key={field.id} field={field} recipient={recipient} />
|
<InitialsField key={field.id} field={field} recipient={recipient} />
|
||||||
|
|||||||
8
package-lock.json
generated
8
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "@documenso/root",
|
"name": "@documenso/root",
|
||||||
"version": "1.7.2-rc.0",
|
"version": "1.7.2-rc.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@documenso/root",
|
"name": "@documenso/root",
|
||||||
"version": "1.7.2-rc.0",
|
"version": "1.7.2-rc.1",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"apps/*",
|
"apps/*",
|
||||||
"packages/*"
|
"packages/*"
|
||||||
@ -80,7 +80,7 @@
|
|||||||
},
|
},
|
||||||
"apps/marketing": {
|
"apps/marketing": {
|
||||||
"name": "@documenso/marketing",
|
"name": "@documenso/marketing",
|
||||||
"version": "1.7.2-rc.0",
|
"version": "1.7.2-rc.1",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@documenso/assets": "*",
|
"@documenso/assets": "*",
|
||||||
@ -441,7 +441,7 @@
|
|||||||
},
|
},
|
||||||
"apps/web": {
|
"apps/web": {
|
||||||
"name": "@documenso/web",
|
"name": "@documenso/web",
|
||||||
"version": "1.7.2-rc.0",
|
"version": "1.7.2-rc.1",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@documenso/api": "*",
|
"@documenso/api": "*",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.7.2-rc.0",
|
"version": "1.7.2-rc.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "turbo run build",
|
"build": "turbo run build",
|
||||||
"build:web": "turbo run build --filter=@documenso/web",
|
"build:web": "turbo run build --filter=@documenso/web",
|
||||||
|
|||||||
@ -12,10 +12,12 @@ import {
|
|||||||
ZDeleteFieldMutationSchema,
|
ZDeleteFieldMutationSchema,
|
||||||
ZDeleteRecipientMutationSchema,
|
ZDeleteRecipientMutationSchema,
|
||||||
ZDownloadDocumentSuccessfulSchema,
|
ZDownloadDocumentSuccessfulSchema,
|
||||||
|
ZFindTeamMembersResponseSchema,
|
||||||
ZGenerateDocumentFromTemplateMutationResponseSchema,
|
ZGenerateDocumentFromTemplateMutationResponseSchema,
|
||||||
ZGenerateDocumentFromTemplateMutationSchema,
|
ZGenerateDocumentFromTemplateMutationSchema,
|
||||||
ZGetDocumentsQuerySchema,
|
ZGetDocumentsQuerySchema,
|
||||||
ZGetTemplatesQuerySchema,
|
ZGetTemplatesQuerySchema,
|
||||||
|
ZInviteTeamMemberMutationSchema,
|
||||||
ZNoBodyMutationSchema,
|
ZNoBodyMutationSchema,
|
||||||
ZResendDocumentForSigningMutationSchema,
|
ZResendDocumentForSigningMutationSchema,
|
||||||
ZSendDocumentForSigningMutationSchema,
|
ZSendDocumentForSigningMutationSchema,
|
||||||
@ -26,13 +28,17 @@ import {
|
|||||||
ZSuccessfulGetDocumentResponseSchema,
|
ZSuccessfulGetDocumentResponseSchema,
|
||||||
ZSuccessfulGetTemplateResponseSchema,
|
ZSuccessfulGetTemplateResponseSchema,
|
||||||
ZSuccessfulGetTemplatesResponseSchema,
|
ZSuccessfulGetTemplatesResponseSchema,
|
||||||
|
ZSuccessfulInviteTeamMemberResponseSchema,
|
||||||
ZSuccessfulRecipientResponseSchema,
|
ZSuccessfulRecipientResponseSchema,
|
||||||
|
ZSuccessfulRemoveTeamMemberResponseSchema,
|
||||||
ZSuccessfulResendDocumentResponseSchema,
|
ZSuccessfulResendDocumentResponseSchema,
|
||||||
ZSuccessfulResponseSchema,
|
ZSuccessfulResponseSchema,
|
||||||
ZSuccessfulSigningResponseSchema,
|
ZSuccessfulSigningResponseSchema,
|
||||||
|
ZSuccessfulUpdateTeamMemberResponseSchema,
|
||||||
ZUnsuccessfulResponseSchema,
|
ZUnsuccessfulResponseSchema,
|
||||||
ZUpdateFieldMutationSchema,
|
ZUpdateFieldMutationSchema,
|
||||||
ZUpdateRecipientMutationSchema,
|
ZUpdateRecipientMutationSchema,
|
||||||
|
ZUpdateTeamMemberMutationSchema,
|
||||||
} from './schema';
|
} from './schema';
|
||||||
|
|
||||||
const c = initContract();
|
const c = initContract();
|
||||||
@ -273,6 +279,61 @@ export const ApiContractV1 = c.router(
|
|||||||
},
|
},
|
||||||
summary: 'Delete a field from a document',
|
summary: 'Delete a field from a document',
|
||||||
},
|
},
|
||||||
|
|
||||||
|
findTeamMembers: {
|
||||||
|
method: 'GET',
|
||||||
|
path: '/api/v1/team/:id/members',
|
||||||
|
responses: {
|
||||||
|
200: ZFindTeamMembersResponseSchema,
|
||||||
|
400: ZUnsuccessfulResponseSchema,
|
||||||
|
401: ZUnsuccessfulResponseSchema,
|
||||||
|
404: ZUnsuccessfulResponseSchema,
|
||||||
|
500: ZUnsuccessfulResponseSchema,
|
||||||
|
},
|
||||||
|
summary: 'List team members',
|
||||||
|
},
|
||||||
|
|
||||||
|
inviteTeamMember: {
|
||||||
|
method: 'POST',
|
||||||
|
path: '/api/v1/team/:id/members/invite',
|
||||||
|
body: ZInviteTeamMemberMutationSchema,
|
||||||
|
responses: {
|
||||||
|
200: ZSuccessfulInviteTeamMemberResponseSchema,
|
||||||
|
400: ZUnsuccessfulResponseSchema,
|
||||||
|
401: ZUnsuccessfulResponseSchema,
|
||||||
|
404: ZUnsuccessfulResponseSchema,
|
||||||
|
500: ZUnsuccessfulResponseSchema,
|
||||||
|
},
|
||||||
|
summary: 'Invite a member to a team',
|
||||||
|
},
|
||||||
|
|
||||||
|
updateTeamMember: {
|
||||||
|
method: 'PUT',
|
||||||
|
path: '/api/v1/team/:id/members/:memberId',
|
||||||
|
body: ZUpdateTeamMemberMutationSchema,
|
||||||
|
responses: {
|
||||||
|
200: ZSuccessfulUpdateTeamMemberResponseSchema,
|
||||||
|
400: ZUnsuccessfulResponseSchema,
|
||||||
|
401: ZUnsuccessfulResponseSchema,
|
||||||
|
404: ZUnsuccessfulResponseSchema,
|
||||||
|
500: ZUnsuccessfulResponseSchema,
|
||||||
|
},
|
||||||
|
summary: 'Update a team member',
|
||||||
|
},
|
||||||
|
|
||||||
|
removeTeamMember: {
|
||||||
|
method: 'DELETE',
|
||||||
|
path: '/api/v1/team/:id/members/:memberId',
|
||||||
|
body: null,
|
||||||
|
responses: {
|
||||||
|
200: ZSuccessfulRemoveTeamMemberResponseSchema,
|
||||||
|
400: ZUnsuccessfulResponseSchema,
|
||||||
|
401: ZUnsuccessfulResponseSchema,
|
||||||
|
404: ZUnsuccessfulResponseSchema,
|
||||||
|
500: ZUnsuccessfulResponseSchema,
|
||||||
|
},
|
||||||
|
summary: 'Remove a member from a team',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
baseHeaders: ZAuthorizationHeadersSchema,
|
baseHeaders: ZAuthorizationHeadersSchema,
|
||||||
|
|||||||
@ -26,6 +26,8 @@ import { getRecipientById } from '@documenso/lib/server-only/recipient/get-recip
|
|||||||
import { getRecipientsForDocument } from '@documenso/lib/server-only/recipient/get-recipients-for-document';
|
import { getRecipientsForDocument } from '@documenso/lib/server-only/recipient/get-recipients-for-document';
|
||||||
import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document';
|
import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document';
|
||||||
import { updateRecipient } from '@documenso/lib/server-only/recipient/update-recipient';
|
import { updateRecipient } from '@documenso/lib/server-only/recipient/update-recipient';
|
||||||
|
import { createTeamMemberInvites } from '@documenso/lib/server-only/team/create-team-member-invites';
|
||||||
|
import { deleteTeamMembers } from '@documenso/lib/server-only/team/delete-team-members';
|
||||||
import type { CreateDocumentFromTemplateResponse } from '@documenso/lib/server-only/template/create-document-from-template';
|
import type { CreateDocumentFromTemplateResponse } from '@documenso/lib/server-only/template/create-document-from-template';
|
||||||
import { createDocumentFromTemplate } from '@documenso/lib/server-only/template/create-document-from-template';
|
import { createDocumentFromTemplate } from '@documenso/lib/server-only/template/create-document-from-template';
|
||||||
import { createDocumentFromTemplateLegacy } from '@documenso/lib/server-only/template/create-document-from-template-legacy';
|
import { createDocumentFromTemplateLegacy } from '@documenso/lib/server-only/template/create-document-from-template-legacy';
|
||||||
@ -49,7 +51,12 @@ import {
|
|||||||
} from '@documenso/lib/universal/upload/server-actions';
|
} from '@documenso/lib/universal/upload/server-actions';
|
||||||
import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs';
|
import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs';
|
||||||
import { prisma } from '@documenso/prisma';
|
import { prisma } from '@documenso/prisma';
|
||||||
import { DocumentDataType, DocumentStatus, SigningStatus } from '@documenso/prisma/client';
|
import {
|
||||||
|
DocumentDataType,
|
||||||
|
DocumentStatus,
|
||||||
|
SigningStatus,
|
||||||
|
TeamMemberRole,
|
||||||
|
} from '@documenso/prisma/client';
|
||||||
|
|
||||||
import { ApiContractV1 } from './contract';
|
import { ApiContractV1 } from './contract';
|
||||||
import { authenticatedMiddleware } from './middleware/authenticated';
|
import { authenticatedMiddleware } from './middleware/authenticated';
|
||||||
@ -1279,4 +1286,270 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
findTeamMembers: authenticatedMiddleware(async (args, user, team) => {
|
||||||
|
const { id: teamId } = args.params;
|
||||||
|
|
||||||
|
if (team?.id !== Number(teamId)) {
|
||||||
|
return {
|
||||||
|
status: 403,
|
||||||
|
body: {
|
||||||
|
message: 'You are not authorized to perform actions against this team.',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const self = await prisma.teamMember.findFirst({
|
||||||
|
where: {
|
||||||
|
userId: user.id,
|
||||||
|
teamId: team.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (self?.role !== TeamMemberRole.ADMIN) {
|
||||||
|
return {
|
||||||
|
status: 403,
|
||||||
|
body: {
|
||||||
|
message: 'You are not authorized to perform actions against this team.',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const members = await prisma.teamMember.findMany({
|
||||||
|
where: {
|
||||||
|
teamId: team.id,
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
user: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
status: 200,
|
||||||
|
body: {
|
||||||
|
members: members.map((member) => ({
|
||||||
|
id: member.id,
|
||||||
|
email: member.user.email,
|
||||||
|
role: member.role,
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}),
|
||||||
|
|
||||||
|
inviteTeamMember: authenticatedMiddleware(async (args, user, team) => {
|
||||||
|
const { id: teamId } = args.params;
|
||||||
|
|
||||||
|
const { email, role } = args.body;
|
||||||
|
|
||||||
|
if (team?.id !== Number(teamId)) {
|
||||||
|
return {
|
||||||
|
status: 403,
|
||||||
|
body: {
|
||||||
|
message: 'You are not authorized to perform actions against this team.',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const self = await prisma.teamMember.findFirst({
|
||||||
|
where: {
|
||||||
|
userId: user.id,
|
||||||
|
teamId: team.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (self?.role !== TeamMemberRole.ADMIN) {
|
||||||
|
return {
|
||||||
|
status: 403,
|
||||||
|
body: {
|
||||||
|
message: 'You are not authorized to perform actions against this team.',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasAlreadyBeenInvited = await prisma.teamMember.findFirst({
|
||||||
|
where: {
|
||||||
|
teamId: team.id,
|
||||||
|
user: {
|
||||||
|
email,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (hasAlreadyBeenInvited) {
|
||||||
|
return {
|
||||||
|
status: 400,
|
||||||
|
body: {
|
||||||
|
message: 'This user has already been invited to the team',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
await createTeamMemberInvites({
|
||||||
|
userId: user.id,
|
||||||
|
userName: user.name ?? '',
|
||||||
|
teamId: team.id,
|
||||||
|
invitations: [
|
||||||
|
{
|
||||||
|
email,
|
||||||
|
role,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
status: 200,
|
||||||
|
body: {
|
||||||
|
message: 'An invite has been sent to the member',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}),
|
||||||
|
|
||||||
|
updateTeamMember: authenticatedMiddleware(async (args, user, team) => {
|
||||||
|
const { id: teamId, memberId } = args.params;
|
||||||
|
|
||||||
|
const { role } = args.body;
|
||||||
|
|
||||||
|
if (team?.id !== Number(teamId)) {
|
||||||
|
return {
|
||||||
|
status: 403,
|
||||||
|
body: {
|
||||||
|
message: 'You are not authorized to perform actions against this team.',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const self = await prisma.teamMember.findFirst({
|
||||||
|
where: {
|
||||||
|
userId: user.id,
|
||||||
|
teamId: team.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (self?.role !== TeamMemberRole.ADMIN) {
|
||||||
|
return {
|
||||||
|
status: 403,
|
||||||
|
body: {
|
||||||
|
message: 'You are not authorized to perform actions against this team.',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const member = await prisma.teamMember.findFirst({
|
||||||
|
where: {
|
||||||
|
id: Number(memberId),
|
||||||
|
teamId: team.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!member) {
|
||||||
|
return {
|
||||||
|
status: 404,
|
||||||
|
body: {
|
||||||
|
message: 'The provided member id does not exist.',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const updatedMember = await prisma.teamMember.update({
|
||||||
|
where: {
|
||||||
|
id: member.id,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
role,
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
user: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
status: 200,
|
||||||
|
body: {
|
||||||
|
id: updatedMember.id,
|
||||||
|
email: updatedMember.user.email,
|
||||||
|
role: updatedMember.role,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}),
|
||||||
|
|
||||||
|
removeTeamMember: authenticatedMiddleware(async (args, user, team) => {
|
||||||
|
const { id: teamId, memberId } = args.params;
|
||||||
|
|
||||||
|
if (team?.id !== Number(teamId)) {
|
||||||
|
return {
|
||||||
|
status: 403,
|
||||||
|
body: {
|
||||||
|
message: 'You are not authorized to perform actions against this team.',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const self = await prisma.teamMember.findFirst({
|
||||||
|
where: {
|
||||||
|
userId: user.id,
|
||||||
|
teamId: team.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (self?.role !== TeamMemberRole.ADMIN) {
|
||||||
|
return {
|
||||||
|
status: 403,
|
||||||
|
body: {
|
||||||
|
message: 'You are not authorized to perform actions against this team.',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const member = await prisma.teamMember.findFirst({
|
||||||
|
where: {
|
||||||
|
id: Number(memberId),
|
||||||
|
teamId: Number(teamId),
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
user: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!member) {
|
||||||
|
return {
|
||||||
|
status: 404,
|
||||||
|
body: {
|
||||||
|
message: 'Member not found',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (team.ownerUserId === member.userId) {
|
||||||
|
return {
|
||||||
|
status: 403,
|
||||||
|
body: {
|
||||||
|
message: 'You cannot remove the owner of the team',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (member.userId === user.id) {
|
||||||
|
return {
|
||||||
|
status: 403,
|
||||||
|
body: {
|
||||||
|
message: 'You cannot remove yourself from the team',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
await deleteTeamMembers({
|
||||||
|
userId: user.id,
|
||||||
|
teamId: team.id,
|
||||||
|
teamMemberIds: [member.id],
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
status: 200,
|
||||||
|
body: {
|
||||||
|
id: member.id,
|
||||||
|
email: member.user.email,
|
||||||
|
role: member.role,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -19,6 +19,7 @@ import {
|
|||||||
RecipientRole,
|
RecipientRole,
|
||||||
SendStatus,
|
SendStatus,
|
||||||
SigningStatus,
|
SigningStatus,
|
||||||
|
TeamMemberRole,
|
||||||
TemplateType,
|
TemplateType,
|
||||||
} from '@documenso/prisma/client';
|
} from '@documenso/prisma/client';
|
||||||
|
|
||||||
@ -532,3 +533,41 @@ export const ZGetTemplatesQuerySchema = z.object({
|
|||||||
page: z.coerce.number().min(1).optional().default(1),
|
page: z.coerce.number().min(1).optional().default(1),
|
||||||
perPage: z.coerce.number().min(1).optional().default(1),
|
perPage: z.coerce.number().min(1).optional().default(1),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const ZFindTeamMembersResponseSchema = z.object({
|
||||||
|
members: z.array(
|
||||||
|
z.object({
|
||||||
|
id: z.number(),
|
||||||
|
email: z.string().email(),
|
||||||
|
role: z.nativeEnum(TeamMemberRole),
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const ZInviteTeamMemberMutationSchema = z.object({
|
||||||
|
email: z
|
||||||
|
.string()
|
||||||
|
.email()
|
||||||
|
.transform((email) => email.toLowerCase()),
|
||||||
|
role: z.nativeEnum(TeamMemberRole).optional().default(TeamMemberRole.MEMBER),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const ZSuccessfulInviteTeamMemberResponseSchema = z.object({
|
||||||
|
message: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const ZUpdateTeamMemberMutationSchema = z.object({
|
||||||
|
role: z.nativeEnum(TeamMemberRole),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const ZSuccessfulUpdateTeamMemberResponseSchema = z.object({
|
||||||
|
id: z.number(),
|
||||||
|
email: z.string().email(),
|
||||||
|
role: z.nativeEnum(TeamMemberRole),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const ZSuccessfulRemoveTeamMemberResponseSchema = z.object({
|
||||||
|
id: z.number(),
|
||||||
|
email: z.string().email(),
|
||||||
|
role: z.nativeEnum(TeamMemberRole),
|
||||||
|
});
|
||||||
|
|||||||
278
packages/app-tests/e2e/api/v1/team-user-management.spec.ts
Normal file
278
packages/app-tests/e2e/api/v1/team-user-management.spec.ts
Normal file
@ -0,0 +1,278 @@
|
|||||||
|
import { expect, test } from '@playwright/test';
|
||||||
|
|
||||||
|
import {
|
||||||
|
ZFindTeamMembersResponseSchema,
|
||||||
|
ZSuccessfulInviteTeamMemberResponseSchema,
|
||||||
|
ZSuccessfulRemoveTeamMemberResponseSchema,
|
||||||
|
ZSuccessfulUpdateTeamMemberResponseSchema,
|
||||||
|
ZUnsuccessfulResponseSchema,
|
||||||
|
} from '@documenso/api/v1/schema';
|
||||||
|
import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app';
|
||||||
|
import { createApiToken } from '@documenso/lib/server-only/public-api/create-api-token';
|
||||||
|
import { prisma } from '@documenso/prisma';
|
||||||
|
import { TeamMemberRole } from '@documenso/prisma/client';
|
||||||
|
import { seedTeam } from '@documenso/prisma/seed/teams';
|
||||||
|
import { seedUser } from '@documenso/prisma/seed/users';
|
||||||
|
|
||||||
|
test.describe('Team API', () => {
|
||||||
|
test('findTeamMembers: should list team members', async ({ request }) => {
|
||||||
|
const team = await seedTeam({
|
||||||
|
createTeamMembers: 3,
|
||||||
|
});
|
||||||
|
|
||||||
|
const ownerMember = team.members.find((member) => member.userId === team.owner.id)!;
|
||||||
|
|
||||||
|
// Should not be undefined
|
||||||
|
expect(ownerMember).toBeTruthy();
|
||||||
|
|
||||||
|
const { token } = await createApiToken({
|
||||||
|
userId: team.owner.id,
|
||||||
|
teamId: team.id,
|
||||||
|
tokenName: 'test',
|
||||||
|
expiresIn: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
const response = await request.get(`${WEBAPP_BASE_URL}/api/v1/team/${team.id}/members`, {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(response.ok()).toBeTruthy();
|
||||||
|
expect(response.status()).toBe(200);
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
const parsed = ZFindTeamMembersResponseSchema.safeParse(data);
|
||||||
|
|
||||||
|
const safeData = parsed.success ? parsed.data : null;
|
||||||
|
|
||||||
|
expect(parsed.success).toBeTruthy();
|
||||||
|
|
||||||
|
expect(safeData!.members).toHaveLength(4); // Owner + 3 members
|
||||||
|
expect(safeData!.members[0]).toHaveProperty('id');
|
||||||
|
expect(safeData!.members[0]).toHaveProperty('email');
|
||||||
|
expect(safeData!.members[0]).toHaveProperty('role');
|
||||||
|
|
||||||
|
expect(safeData!.members).toContainEqual({
|
||||||
|
id: ownerMember.id,
|
||||||
|
email: ownerMember.user.email,
|
||||||
|
role: ownerMember.role,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('inviteTeamMember: should invite a new team member', async ({ request }) => {
|
||||||
|
const team = await seedTeam();
|
||||||
|
|
||||||
|
const { token } = await createApiToken({
|
||||||
|
userId: team.owner.id,
|
||||||
|
teamId: team.id,
|
||||||
|
tokenName: 'test',
|
||||||
|
expiresIn: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
const newUser = await seedUser();
|
||||||
|
|
||||||
|
const response = await request.post(
|
||||||
|
`${WEBAPP_BASE_URL}/api/v1/team/${team.id}/members/invite`,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
email: newUser.email,
|
||||||
|
role: TeamMemberRole.MEMBER,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(response.ok()).toBeTruthy();
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
const parsed = ZSuccessfulInviteTeamMemberResponseSchema.safeParse(data);
|
||||||
|
|
||||||
|
const safeData = parsed.success ? parsed.data : null;
|
||||||
|
|
||||||
|
expect(parsed.success).toBeTruthy();
|
||||||
|
expect(safeData!.message).toBe('An invite has been sent to the member');
|
||||||
|
|
||||||
|
const invite = await prisma.teamMemberInvite.findFirst({
|
||||||
|
where: {
|
||||||
|
email: newUser.email,
|
||||||
|
teamId: team.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(invite).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('updateTeamMember: should update a team member role', async ({ request }) => {
|
||||||
|
const team = await seedTeam({
|
||||||
|
createTeamMembers: 3,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { token } = await createApiToken({
|
||||||
|
userId: team.owner.id,
|
||||||
|
teamId: team.id,
|
||||||
|
tokenName: 'test',
|
||||||
|
expiresIn: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
const member = team.members.find((member) => member.role === TeamMemberRole.MEMBER)!;
|
||||||
|
|
||||||
|
// Should not be undefined
|
||||||
|
expect(member).toBeTruthy();
|
||||||
|
|
||||||
|
const response = await request.put(
|
||||||
|
`${WEBAPP_BASE_URL}/api/v1/team/${team.id}/members/${member.id}`,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
role: TeamMemberRole.ADMIN,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(response.ok()).toBeTruthy();
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
const parsed = ZSuccessfulUpdateTeamMemberResponseSchema.safeParse(data);
|
||||||
|
|
||||||
|
const safeData = parsed.success ? parsed.data : null;
|
||||||
|
|
||||||
|
expect(parsed.success).toBeTruthy();
|
||||||
|
|
||||||
|
expect(safeData!.id).toBe(member.id);
|
||||||
|
expect(safeData!.email).toBe(member.user.email);
|
||||||
|
expect(safeData!.role).toBe(TeamMemberRole.ADMIN);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('removeTeamMember: should remove a team member', async ({ request }) => {
|
||||||
|
const team = await seedTeam({
|
||||||
|
createTeamMembers: 3,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { token } = await createApiToken({
|
||||||
|
userId: team.owner.id,
|
||||||
|
teamId: team.id,
|
||||||
|
tokenName: 'test',
|
||||||
|
expiresIn: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
const member = team.members.find((member) => member.role === TeamMemberRole.MEMBER)!;
|
||||||
|
|
||||||
|
// Should not be undefined
|
||||||
|
expect(member).toBeTruthy();
|
||||||
|
|
||||||
|
const response = await request.delete(
|
||||||
|
`${WEBAPP_BASE_URL}/api/v1/team/${team.id}/members/${member.id}`,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(response.status()).toBe(200);
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
const parsed = ZSuccessfulRemoveTeamMemberResponseSchema.safeParse(data);
|
||||||
|
|
||||||
|
const safeData = parsed.success ? parsed.data : null;
|
||||||
|
|
||||||
|
expect(parsed.success).toBeTruthy();
|
||||||
|
|
||||||
|
expect(safeData!.id).toBe(member.id);
|
||||||
|
expect(safeData!.email).toBe(member.user.email);
|
||||||
|
expect(safeData!.role).toBe(member.role);
|
||||||
|
|
||||||
|
const removedMemberCount = await prisma.teamMember.count({
|
||||||
|
where: {
|
||||||
|
id: member.id,
|
||||||
|
teamId: team.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(removedMemberCount).toBe(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('removeTeamMember: should not remove team owner', async ({ request }) => {
|
||||||
|
const team = await seedTeam({
|
||||||
|
createTeamMembers: 3,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { token } = await createApiToken({
|
||||||
|
userId: team.owner.id,
|
||||||
|
teamId: team.id,
|
||||||
|
tokenName: 'test',
|
||||||
|
expiresIn: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
const ownerMember = team.members.find((member) => member.userId === team.owner.id)!;
|
||||||
|
|
||||||
|
// Should not be undefined
|
||||||
|
expect(ownerMember).toBeTruthy();
|
||||||
|
|
||||||
|
const response = await request.delete(
|
||||||
|
`${WEBAPP_BASE_URL}/api/v1/team/${team.id}/members/${ownerMember.id}`,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(response.status()).toBe(403);
|
||||||
|
|
||||||
|
const parsed = ZUnsuccessfulResponseSchema.safeParse(await response.json());
|
||||||
|
|
||||||
|
expect(parsed.success).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('removeTeamMember: should not remove self', async ({ request }) => {
|
||||||
|
const team = await seedTeam({
|
||||||
|
createTeamMembers: 3,
|
||||||
|
});
|
||||||
|
|
||||||
|
const member = team.members.find((member) => member.role === TeamMemberRole.MEMBER)!;
|
||||||
|
|
||||||
|
// Make our non-owner member an admin
|
||||||
|
await prisma.teamMember.update({
|
||||||
|
where: {
|
||||||
|
id: member.id,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
role: TeamMemberRole.ADMIN,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const { token } = await createApiToken({
|
||||||
|
userId: member.userId,
|
||||||
|
teamId: team.id,
|
||||||
|
tokenName: 'test',
|
||||||
|
expiresIn: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
const response = await request.delete(
|
||||||
|
`${WEBAPP_BASE_URL}/api/v1/team/${team.id}/members/${member.id}`,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(response.status()).toBe(403);
|
||||||
|
|
||||||
|
const parsed = ZUnsuccessfulResponseSchema.safeParse(await response.json());
|
||||||
|
|
||||||
|
expect(parsed.success).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -112,7 +112,6 @@ test('[DIRECT_TEMPLATES]: toggle direct template link', async ({ page }) => {
|
|||||||
await page.getByRole('switch').click();
|
await page.getByRole('switch').click();
|
||||||
await page.getByRole('button', { name: 'Save' }).click();
|
await page.getByRole('button', { name: 'Save' }).click();
|
||||||
await expect(page.getByText('Direct link signing has been').first()).toBeVisible();
|
await expect(page.getByText('Direct link signing has been').first()).toBeVisible();
|
||||||
await page.getByLabel('Direct Link Signing', { exact: true }).press('Escape');
|
|
||||||
|
|
||||||
// Check that the direct template link is no longer accessible.
|
// Check that the direct template link is no longer accessible.
|
||||||
await page.goto(formatDirectTemplatePath(template.directLink?.token || ''));
|
await page.goto(formatDirectTemplatePath(template.directLink?.token || ''));
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test:dev": "playwright test",
|
"test:dev": "NODE_OPTIONS=--experimental-require-module playwright test",
|
||||||
"test-ui:dev": "playwright test --ui",
|
"test-ui:dev": "NODE_OPTIONS=--experimental-require-module playwright test --ui",
|
||||||
"test:e2e": "start-server-and-test \"npm run start -w @documenso/web\" http://localhost:3000 \"playwright test\""
|
"test:e2e": "NODE_OPTIONS=--experimental-require-module start-server-and-test \"npm run start -w @documenso/web\" http://localhost:3000 \"playwright test\""
|
||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
|
|
||||||
export const SUPPORTED_LANGUAGE_CODES = ['de', 'en', 'fr'] as const;
|
export const SUPPORTED_LANGUAGE_CODES = ['de', 'en', 'fr', 'es'] as const;
|
||||||
|
|
||||||
export const ZSupportedLanguageCodeSchema = z.enum(SUPPORTED_LANGUAGE_CODES).catch('en');
|
export const ZSupportedLanguageCodeSchema = z.enum(SUPPORTED_LANGUAGE_CODES).catch('en');
|
||||||
|
|
||||||
@ -42,4 +42,8 @@ export const SUPPORTED_LANGUAGES: Record<string, SupportedLanguage> = {
|
|||||||
full: 'French',
|
full: 'French',
|
||||||
short: 'fr',
|
short: 'fr',
|
||||||
},
|
},
|
||||||
|
es: {
|
||||||
|
full: 'Spanish',
|
||||||
|
short: 'es',
|
||||||
|
},
|
||||||
} satisfies Record<SupportedLanguageCodes, SupportedLanguage>;
|
} satisfies Record<SupportedLanguageCodes, SupportedLanguage>;
|
||||||
|
|||||||
@ -18,6 +18,7 @@ export type CreateDocumentMetaOptions = {
|
|||||||
dateFormat?: string;
|
dateFormat?: string;
|
||||||
redirectUrl?: string;
|
redirectUrl?: string;
|
||||||
signingOrder?: DocumentSigningOrder;
|
signingOrder?: DocumentSigningOrder;
|
||||||
|
typedSignatureEnabled?: boolean;
|
||||||
userId: number;
|
userId: number;
|
||||||
requestMetadata: RequestMetadata;
|
requestMetadata: RequestMetadata;
|
||||||
};
|
};
|
||||||
@ -32,6 +33,7 @@ export const upsertDocumentMeta = async ({
|
|||||||
userId,
|
userId,
|
||||||
redirectUrl,
|
redirectUrl,
|
||||||
signingOrder,
|
signingOrder,
|
||||||
|
typedSignatureEnabled,
|
||||||
requestMetadata,
|
requestMetadata,
|
||||||
}: CreateDocumentMetaOptions) => {
|
}: CreateDocumentMetaOptions) => {
|
||||||
const user = await prisma.user.findFirstOrThrow({
|
const user = await prisma.user.findFirstOrThrow({
|
||||||
@ -82,6 +84,7 @@ export const upsertDocumentMeta = async ({
|
|||||||
documentId,
|
documentId,
|
||||||
redirectUrl,
|
redirectUrl,
|
||||||
signingOrder,
|
signingOrder,
|
||||||
|
typedSignatureEnabled,
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
subject,
|
subject,
|
||||||
@ -91,6 +94,7 @@ export const upsertDocumentMeta = async ({
|
|||||||
timezone,
|
timezone,
|
||||||
redirectUrl,
|
redirectUrl,
|
||||||
signingOrder,
|
signingOrder,
|
||||||
|
typedSignatureEnabled,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -51,7 +51,7 @@ export const createApiToken = async ({
|
|||||||
name: tokenName,
|
name: tokenName,
|
||||||
token: hashedToken,
|
token: hashedToken,
|
||||||
expires: expiresIn ? DateTime.now().plus(timeConstantsRecords[expiresIn]).toJSDate() : null,
|
expires: expiresIn ? DateTime.now().plus(timeConstantsRecords[expiresIn]).toJSDate() : null,
|
||||||
userId: teamId ? null : userId,
|
userId,
|
||||||
teamId,
|
teamId,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@ -25,8 +25,7 @@ export const deleteTokenById = async ({ id, userId, teamId }: DeleteTokenByIdOpt
|
|||||||
return await prisma.apiToken.delete({
|
return await prisma.apiToken.delete({
|
||||||
where: {
|
where: {
|
||||||
id,
|
id,
|
||||||
userId: teamId ? null : userId,
|
teamId: teamId ?? null,
|
||||||
teamId,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@ -8,6 +8,7 @@ export const getUserTokens = async ({ userId }: GetUserTokensOptions) => {
|
|||||||
return await prisma.apiToken.findMany({
|
return await prisma.apiToken.findMany({
|
||||||
where: {
|
where: {
|
||||||
userId,
|
userId,
|
||||||
|
teamId: null,
|
||||||
},
|
},
|
||||||
select: {
|
select: {
|
||||||
id: true,
|
id: true,
|
||||||
|
|||||||
@ -23,7 +23,8 @@ export const getApiTokenByToken = async ({ token }: { token: string }) => {
|
|||||||
throw new Error('Expired token');
|
throw new Error('Expired token');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (apiToken.team) {
|
// Handle a silly choice from many moons ago
|
||||||
|
if (apiToken.team && !apiToken.user) {
|
||||||
apiToken.user = await prisma.user.findFirst({
|
apiToken.user = await prisma.user.findFirst({
|
||||||
where: {
|
where: {
|
||||||
id: apiToken.team.ownerUserId,
|
id: apiToken.team.ownerUserId,
|
||||||
@ -33,9 +34,13 @@ export const getApiTokenByToken = async ({ token }: { token: string }) => {
|
|||||||
|
|
||||||
const { user } = apiToken;
|
const { user } = apiToken;
|
||||||
|
|
||||||
|
// This will never happen but we need to narrow types
|
||||||
if (!user) {
|
if (!user) {
|
||||||
throw new Error('Invalid token');
|
throw new Error('Invalid token');
|
||||||
}
|
}
|
||||||
|
|
||||||
return { ...apiToken, user };
|
return {
|
||||||
|
...apiToken,
|
||||||
|
user,
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -17,6 +17,7 @@ import {
|
|||||||
RecipientRole,
|
RecipientRole,
|
||||||
SendStatus,
|
SendStatus,
|
||||||
SigningStatus,
|
SigningStatus,
|
||||||
|
WebhookTriggerEvents,
|
||||||
} from '@documenso/prisma/client';
|
} from '@documenso/prisma/client';
|
||||||
import type { TSignFieldWithTokenMutationSchema } from '@documenso/trpc/server/field-router/schema';
|
import type { TSignFieldWithTokenMutationSchema } from '@documenso/trpc/server/field-router/schema';
|
||||||
|
|
||||||
@ -39,6 +40,7 @@ import {
|
|||||||
import { formatDocumentsPath } from '../../utils/teams';
|
import { formatDocumentsPath } from '../../utils/teams';
|
||||||
import { sendDocument } from '../document/send-document';
|
import { sendDocument } from '../document/send-document';
|
||||||
import { validateFieldAuth } from '../document/validate-field-auth';
|
import { validateFieldAuth } from '../document/validate-field-auth';
|
||||||
|
import { triggerWebhook } from '../webhooks/trigger/trigger-webhook';
|
||||||
|
|
||||||
export type CreateDocumentFromDirectTemplateOptions = {
|
export type CreateDocumentFromDirectTemplateOptions = {
|
||||||
directRecipientName?: string;
|
directRecipientName?: string;
|
||||||
@ -553,6 +555,23 @@ export const createDocumentFromDirectTemplate = async ({
|
|||||||
teamId: template.teamId || undefined,
|
teamId: template.teamId || undefined,
|
||||||
requestMetadata,
|
requestMetadata,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const updatedDocument = await prisma.document.findFirstOrThrow({
|
||||||
|
where: {
|
||||||
|
id: documentId,
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
documentData: true,
|
||||||
|
Recipient: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
await triggerWebhook({
|
||||||
|
event: WebhookTriggerEvents.DOCUMENT_SIGNED,
|
||||||
|
data: updatedDocument,
|
||||||
|
userId: updatedDocument.userId,
|
||||||
|
teamId: updatedDocument.teamId ?? undefined,
|
||||||
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('[CREATE_DOCUMENT_FROM_DIRECT_TEMPLATE]:', err);
|
console.error('[CREATE_DOCUMENT_FROM_DIRECT_TEMPLATE]:', err);
|
||||||
|
|
||||||
|
|||||||
@ -51,6 +51,11 @@ export const findTemplates = async ({
|
|||||||
},
|
},
|
||||||
Field: true,
|
Field: true,
|
||||||
Recipient: true,
|
Recipient: true,
|
||||||
|
templateMeta: {
|
||||||
|
select: {
|
||||||
|
signingOrder: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
directLink: {
|
directLink: {
|
||||||
select: {
|
select: {
|
||||||
token: true,
|
token: true,
|
||||||
|
|||||||
@ -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: 2024-10-08 12:05\n"
|
"PO-Revision-Date: 2024-10-18 04:04\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"
|
||||||
@ -115,7 +115,7 @@ msgstr "Admin"
|
|||||||
msgid "Advanced Options"
|
msgid "Advanced Options"
|
||||||
msgstr "Erweiterte Optionen"
|
msgstr "Erweiterte Optionen"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:565
|
#: packages/ui/primitives/document-flow/add-fields.tsx:570
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
|
||||||
msgid "Advanced settings"
|
msgid "Advanced settings"
|
||||||
msgstr "Erweiterte Einstellungen"
|
msgstr "Erweiterte Einstellungen"
|
||||||
@ -140,11 +140,11 @@ msgstr "Genehmiger"
|
|||||||
msgid "Approving"
|
msgid "Approving"
|
||||||
msgstr "Genehmigung"
|
msgstr "Genehmigung"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:276
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
|
||||||
msgid "Black"
|
msgid "Black"
|
||||||
msgstr "Schwarz"
|
msgstr "Schwarz"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:290
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:391
|
||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr "Blau"
|
msgstr "Blau"
|
||||||
|
|
||||||
@ -178,7 +178,7 @@ msgstr "CC'd"
|
|||||||
msgid "Character Limit"
|
msgid "Character Limit"
|
||||||
msgstr "Zeichenbeschränkung"
|
msgstr "Zeichenbeschränkung"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:993
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1026
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
|
||||||
msgid "Checkbox"
|
msgid "Checkbox"
|
||||||
msgstr "Checkbox"
|
msgstr "Checkbox"
|
||||||
@ -191,7 +191,7 @@ msgstr "Checkbox-Werte"
|
|||||||
msgid "Clear filters"
|
msgid "Clear filters"
|
||||||
msgstr "Filter löschen"
|
msgstr "Filter löschen"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:310
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:411
|
||||||
msgid "Clear Signature"
|
msgid "Clear Signature"
|
||||||
msgstr "Unterschrift löschen"
|
msgstr "Unterschrift löschen"
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ msgstr "Schließen"
|
|||||||
msgid "Configure Direct Recipient"
|
msgid "Configure Direct Recipient"
|
||||||
msgstr "Direkten Empfänger konfigurieren"
|
msgstr "Direkten Empfänger konfigurieren"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:566
|
#: packages/ui/primitives/document-flow/add-fields.tsx:571
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
|
||||||
msgid "Configure the {0} field"
|
msgid "Configure the {0} field"
|
||||||
msgstr "Konfigurieren Sie das Feld {0}"
|
msgstr "Konfigurieren Sie das Feld {0}"
|
||||||
@ -224,7 +224,7 @@ msgstr "In die Zwischenablage kopiert"
|
|||||||
msgid "Custom Text"
|
msgid "Custom Text"
|
||||||
msgstr "Benutzerdefinierter Text"
|
msgstr "Benutzerdefinierter Text"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:889
|
#: packages/ui/primitives/document-flow/add-fields.tsx:922
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr "Datum"
|
msgstr "Datum"
|
||||||
@ -256,7 +256,7 @@ msgstr "Herunterladen"
|
|||||||
msgid "Drag & drop your PDF here."
|
msgid "Drag & drop your PDF here."
|
||||||
msgstr "Ziehen Sie Ihr PDF hierher."
|
msgstr "Ziehen Sie Ihr PDF hierher."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1019
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1052
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
|
||||||
msgid "Dropdown"
|
msgid "Dropdown"
|
||||||
msgstr "Dropdown"
|
msgstr "Dropdown"
|
||||||
@ -265,7 +265,7 @@ msgstr "Dropdown"
|
|||||||
msgid "Dropdown options"
|
msgid "Dropdown options"
|
||||||
msgstr "Dropdown-Optionen"
|
msgstr "Dropdown-Optionen"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:837
|
#: packages/ui/primitives/document-flow/add-fields.tsx:870
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:272
|
#: packages/ui/primitives/document-flow/add-signature.tsx:272
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:500
|
#: packages/ui/primitives/document-flow/add-signers.tsx:500
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
|
||||||
@ -278,7 +278,7 @@ msgstr "E-Mail"
|
|||||||
msgid "Email Options"
|
msgid "Email Options"
|
||||||
msgstr "E-Mail-Optionen"
|
msgstr "E-Mail-Optionen"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1082
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1117
|
||||||
msgid "Empty field"
|
msgid "Empty field"
|
||||||
msgstr "Leeres Feld"
|
msgstr "Leeres Feld"
|
||||||
|
|
||||||
@ -291,6 +291,10 @@ msgstr "Direktlink-Signierung aktivieren"
|
|||||||
msgid "Enable signing order"
|
msgid "Enable signing order"
|
||||||
msgstr "Aktiviere die Signaturreihenfolge"
|
msgstr "Aktiviere die Signaturreihenfolge"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:790
|
||||||
|
msgid "Enable Typed Signatures"
|
||||||
|
msgstr "Aktivieren Sie getippte Unterschriften"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-password-dialog.tsx:84
|
#: packages/ui/primitives/document-password-dialog.tsx:84
|
||||||
msgid "Enter password"
|
msgid "Enter password"
|
||||||
msgstr "Passwort eingeben"
|
msgstr "Passwort eingeben"
|
||||||
@ -319,7 +323,7 @@ msgstr "Zeichenbeschränkung des Feldes"
|
|||||||
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130
|
||||||
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107
|
||||||
msgid "Field font size"
|
msgid "Field font size"
|
||||||
msgstr ""
|
msgstr "Feldschriftgröße"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:110
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:110
|
||||||
msgid "Field format"
|
msgid "Field format"
|
||||||
@ -340,7 +344,7 @@ msgstr "Feldplatzhalter"
|
|||||||
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124
|
||||||
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101
|
||||||
msgid "Font Size"
|
msgid "Font Size"
|
||||||
msgstr ""
|
msgstr "Schriftgröße"
|
||||||
|
|
||||||
#: packages/ui/components/document/document-global-auth-action-select.tsx:64
|
#: packages/ui/components/document/document-global-auth-action-select.tsx:64
|
||||||
msgid "Global recipient action authentication"
|
msgid "Global recipient action authentication"
|
||||||
@ -350,7 +354,7 @@ msgstr "Globale Empfängerauthentifizierung"
|
|||||||
msgid "Go Back"
|
msgid "Go Back"
|
||||||
msgstr "Zurück"
|
msgstr "Zurück"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:297
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:398
|
||||||
msgid "Green"
|
msgid "Green"
|
||||||
msgstr "Grün"
|
msgstr "Grün"
|
||||||
|
|
||||||
@ -406,7 +410,7 @@ msgstr "Nachricht <0>(Optional)</0>"
|
|||||||
msgid "Min"
|
msgid "Min"
|
||||||
msgstr "Min"
|
msgstr "Min"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:863
|
#: packages/ui/primitives/document-flow/add-fields.tsx:896
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:298
|
#: packages/ui/primitives/document-flow/add-signature.tsx:298
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:535
|
#: packages/ui/primitives/document-flow/add-signers.tsx:535
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:541
|
#: packages/ui/primitives/document-flow/add-signers.tsx:541
|
||||||
@ -428,12 +432,12 @@ msgstr "Muss unterzeichnen"
|
|||||||
msgid "Needs to view"
|
msgid "Needs to view"
|
||||||
msgstr "Muss sehen"
|
msgstr "Muss sehen"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:674
|
#: packages/ui/primitives/document-flow/add-fields.tsx:680
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
|
||||||
msgid "No recipient matching this description was found."
|
msgid "No recipient matching this description was found."
|
||||||
msgstr "Kein passender Empfänger mit dieser Beschreibung gefunden."
|
msgstr "Kein passender Empfänger mit dieser Beschreibung gefunden."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:690
|
#: packages/ui/primitives/document-flow/add-fields.tsx:696
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
|
||||||
msgid "No recipients with this role"
|
msgid "No recipients with this role"
|
||||||
msgstr "Keine Empfänger mit dieser Rolle"
|
msgstr "Keine Empfänger mit dieser Rolle"
|
||||||
@ -458,7 +462,7 @@ msgstr "Kein Unterschriftsfeld gefunden"
|
|||||||
msgid "No value found."
|
msgid "No value found."
|
||||||
msgstr "Kein Wert gefunden."
|
msgstr "Kein Wert gefunden."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:941
|
#: packages/ui/primitives/document-flow/add-fields.tsx:974
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
|
||||||
msgid "Number"
|
msgid "Number"
|
||||||
msgstr "Nummer"
|
msgstr "Nummer"
|
||||||
@ -493,7 +497,7 @@ msgstr "Wählen Sie eine Zahl"
|
|||||||
msgid "Placeholder"
|
msgid "Placeholder"
|
||||||
msgstr "Platzhalter"
|
msgstr "Platzhalter"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:967
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1000
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
|
||||||
msgid "Radio"
|
msgid "Radio"
|
||||||
msgstr "Radio"
|
msgstr "Radio"
|
||||||
@ -520,7 +524,7 @@ msgstr "Erhält Kopie"
|
|||||||
msgid "Recipient action authentication"
|
msgid "Recipient action authentication"
|
||||||
msgstr "Empfängeraktion Authentifizierung"
|
msgstr "Empfängeraktion Authentifizierung"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:283
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:384
|
||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr "Rot"
|
msgstr "Rot"
|
||||||
|
|
||||||
@ -529,7 +533,7 @@ msgstr "Rot"
|
|||||||
msgid "Redirect URL"
|
msgid "Redirect URL"
|
||||||
msgstr "Weiterleitungs-URL"
|
msgstr "Weiterleitungs-URL"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1069
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1104
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Entfernen"
|
msgstr "Entfernen"
|
||||||
|
|
||||||
@ -600,7 +604,7 @@ msgstr "Erweiterte Einstellungen anzeigen"
|
|||||||
msgid "Sign"
|
msgid "Sign"
|
||||||
msgstr "Unterschreiben"
|
msgstr "Unterschreiben"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:785
|
#: packages/ui/primitives/document-flow/add-fields.tsx:818
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:323
|
#: packages/ui/primitives/document-flow/add-signature.tsx:323
|
||||||
#: packages/ui/primitives/document-flow/field-icon.tsx:52
|
#: packages/ui/primitives/document-flow/field-icon.tsx:52
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
|
||||||
@ -648,7 +652,7 @@ msgstr "Einreichen"
|
|||||||
msgid "Template title"
|
msgid "Template title"
|
||||||
msgstr "Vorlagentitel"
|
msgstr "Vorlagentitel"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:915
|
#: packages/ui/primitives/document-flow/add-fields.tsx:948
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
|
||||||
msgid "Text"
|
msgid "Text"
|
||||||
msgstr "Text"
|
msgstr "Text"
|
||||||
@ -709,7 +713,7 @@ msgstr "Der Name des Unterzeichners"
|
|||||||
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
||||||
msgstr "Dies kann überschrieben werden, indem die Authentifizierungsanforderungen im nächsten Schritt direkt für jeden Empfänger festgelegt werden."
|
msgstr "Dies kann überschrieben werden, indem die Authentifizierungsanforderungen im nächsten Schritt direkt für jeden Empfänger festgelegt werden."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:746
|
#: packages/ui/primitives/document-flow/add-fields.tsx:752
|
||||||
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
|
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
|
||||||
msgstr "Dieses Dokument wurde bereits an diesen Empfänger gesendet. Sie können diesen Empfänger nicht mehr bearbeiten."
|
msgstr "Dieses Dokument wurde bereits an diesen Empfänger gesendet. Sie können diesen Empfänger nicht mehr bearbeiten."
|
||||||
|
|
||||||
@ -721,7 +725,7 @@ msgstr "Dieses Dokument ist durch ein Passwort geschützt. Bitte geben Sie das P
|
|||||||
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
|
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
|
||||||
msgstr "Dieses Feld kann nicht geändert oder gelöscht werden. Wenn Sie den direkten Link dieser Vorlage teilen oder zu Ihrem öffentlichen Profil hinzufügen, kann jeder, der darauf zugreift, seinen Namen und seine E-Mail-Adresse eingeben und die ihm zugewiesenen Felder ausfüllen."
|
msgstr "Dieses Feld kann nicht geändert oder gelöscht werden. Wenn Sie den direkten Link dieser Vorlage teilen oder zu Ihrem öffentlichen Profil hinzufügen, kann jeder, der darauf zugreift, seinen Namen und seine E-Mail-Adresse eingeben und die ihm zugewiesenen Felder ausfüllen."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1050
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1084
|
||||||
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
|
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
|
||||||
msgstr "Dieser Empfänger kann nicht mehr bearbeitet werden, da er ein Feld unterschrieben oder das Dokument abgeschlossen hat."
|
msgstr "Dieser Empfänger kann nicht mehr bearbeitet werden, da er ein Feld unterschrieben oder das Dokument abgeschlossen hat."
|
||||||
|
|
||||||
@ -746,7 +750,7 @@ msgstr "Zeitzone"
|
|||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Titel"
|
msgstr "Titel"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1033
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1067
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
|
||||||
msgid "To proceed further, please set at least one value for the {0} field."
|
msgid "To proceed further, please set at least one value for the {0} field."
|
||||||
msgstr "Um fortzufahren, legen Sie bitte mindestens einen Wert für das Feld {0} fest."
|
msgstr "Um fortzufahren, legen Sie bitte mindestens einen Wert für das Feld {0} fest."
|
||||||
@ -812,3 +816,4 @@ msgstr "Sie können derzeit keine Dokumente hochladen."
|
|||||||
#: packages/ui/primitives/document-dropzone.tsx:69
|
#: packages/ui/primitives/document-dropzone.tsx:69
|
||||||
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."
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -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: 2024-10-08 12:05\n"
|
"PO-Revision-Date: 2024-10-18 04:04\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"
|
||||||
@ -618,3 +618,4 @@ msgstr "Sie können Documenso kostenlos selbst hosten oder unsere sofort einsatz
|
|||||||
#: apps/marketing/src/components/(marketing)/carousel.tsx:272
|
#: apps/marketing/src/components/(marketing)/carousel.tsx:272
|
||||||
msgid "Your browser does not support the video tag."
|
msgid "Your browser does not support the video tag."
|
||||||
msgstr "Ihr Browser unterstützt das Video-Tag nicht."
|
msgstr "Ihr Browser unterstützt das Video-Tag nicht."
|
||||||
|
|
||||||
|
|||||||
@ -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: 2024-10-08 12:05\n"
|
"PO-Revision-Date: 2024-10-18 04:04\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"
|
||||||
@ -220,7 +220,7 @@ msgstr "Aktive Abonnements"
|
|||||||
msgid "Add"
|
msgid "Add"
|
||||||
msgstr "Hinzufügen"
|
msgstr "Hinzufügen"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
|
||||||
msgid "Add all relevant fields for each recipient."
|
msgid "Add all relevant fields for each recipient."
|
||||||
msgstr "Fügen Sie alle relevanten Felder für jeden Empfänger hinzu."
|
msgstr "Fügen Sie alle relevanten Felder für jeden Empfänger hinzu."
|
||||||
@ -241,7 +241,7 @@ msgstr "Fügen Sie einen Authenticator hinzu, um als sekundäre Authentifizierun
|
|||||||
msgid "Add email"
|
msgid "Add email"
|
||||||
msgstr "E-Mail hinzufügen"
|
msgstr "E-Mail hinzufügen"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:156
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:174
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86
|
||||||
msgid "Add Fields"
|
msgid "Add Fields"
|
||||||
msgstr "Felder hinzufügen"
|
msgstr "Felder hinzufügen"
|
||||||
@ -263,11 +263,11 @@ msgstr "Passkey hinzufügen"
|
|||||||
msgid "Add Placeholders"
|
msgid "Add Placeholders"
|
||||||
msgstr "Platzhalter hinzufügen"
|
msgstr "Platzhalter hinzufügen"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:151
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169
|
||||||
msgid "Add Signers"
|
msgid "Add Signers"
|
||||||
msgstr "Unterzeichner hinzufügen"
|
msgstr "Unterzeichner hinzufügen"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:161
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179
|
||||||
msgid "Add Subject"
|
msgid "Add Subject"
|
||||||
msgstr "Betreff hinzufügen"
|
msgstr "Betreff hinzufügen"
|
||||||
|
|
||||||
@ -283,7 +283,7 @@ msgstr "Team-E-Mail hinzufügen"
|
|||||||
#~ msgid "Add Text"
|
#~ msgid "Add Text"
|
||||||
#~ msgstr "Add Text"
|
#~ msgstr "Add Text"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
|
||||||
msgid "Add the people who will sign the document."
|
msgid "Add the people who will sign the document."
|
||||||
msgstr "Fügen Sie die Personen hinzu, die das Dokument unterschreiben werden."
|
msgstr "Fügen Sie die Personen hinzu, die das Dokument unterschreiben werden."
|
||||||
|
|
||||||
@ -291,7 +291,7 @@ msgstr "Fügen Sie die Personen hinzu, die das Dokument unterschreiben werden."
|
|||||||
msgid "Add the recipients to create the document with"
|
msgid "Add the recipients to create the document with"
|
||||||
msgstr "Fügen Sie die Empfänger hinzu, um das Dokument zu erstellen"
|
msgstr "Fügen Sie die Empfänger hinzu, um das Dokument zu erstellen"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:162
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180
|
||||||
msgid "Add the subject and message you wish to send to signers."
|
msgid "Add the subject and message you wish to send to signers."
|
||||||
msgstr "Fügen Sie den Betreff und die Nachricht hinzu, die Sie den Unterzeichnern senden möchten."
|
msgstr "Fügen Sie den Betreff und die Nachricht hinzu, die Sie den Unterzeichnern senden möchten."
|
||||||
|
|
||||||
@ -370,13 +370,13 @@ msgstr "Eine E-Mail, in der die Übertragung dieses Teams angefordert wird, wurd
|
|||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "Ein Fehler ist aufgetreten"
|
msgstr "Ein Fehler ist aufgetreten"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:248
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:266
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231
|
||||||
msgid "An error occurred while adding signers."
|
msgid "An error occurred while adding signers."
|
||||||
msgstr "Ein Fehler ist aufgetreten, während Unterzeichner hinzugefügt wurden."
|
msgstr "Ein Fehler ist aufgetreten, während Unterzeichner hinzugefügt wurden."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:278
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301
|
||||||
msgid "An error occurred while adding the fields."
|
msgid "An error occurred while adding the fields."
|
||||||
msgstr "Ein Fehler ist aufgetreten, während die Felder hinzugefügt wurden."
|
msgstr "Ein Fehler ist aufgetreten, während die Felder hinzugefügt wurden."
|
||||||
|
|
||||||
@ -426,7 +426,7 @@ msgstr "Ein Fehler ist aufgetreten, während die Vorlage verschoben wurde."
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129
|
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:175
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:173
|
||||||
msgid "An error occurred while removing the signature."
|
msgid "An error occurred while removing the signature."
|
||||||
msgstr "Ein Fehler ist aufgetreten, während die Unterschrift entfernt wurde."
|
msgstr "Ein Fehler ist aufgetreten, während die Unterschrift entfernt wurde."
|
||||||
|
|
||||||
@ -434,7 +434,7 @@ msgstr "Ein Fehler ist aufgetreten, während die Unterschrift entfernt wurde."
|
|||||||
msgid "An error occurred while removing the text."
|
msgid "An error occurred while removing the text."
|
||||||
msgstr "Ein Fehler ist aufgetreten, während der Text entfernt wurde."
|
msgstr "Ein Fehler ist aufgetreten, während der Text entfernt wurde."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:309
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:332
|
||||||
msgid "An error occurred while sending the document."
|
msgid "An error occurred while sending the document."
|
||||||
msgstr "Ein Fehler ist aufgetreten, während das Dokument gesendet wurde."
|
msgstr "Ein Fehler ist aufgetreten, während das Dokument gesendet wurde."
|
||||||
|
|
||||||
@ -449,7 +449,7 @@ msgstr "Beim Senden Ihrer Bestätigungs-E-Mail ist ein Fehler aufgetreten"
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102
|
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:149
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:147
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168
|
||||||
msgid "An error occurred while signing the document."
|
msgid "An error occurred while signing the document."
|
||||||
msgstr "Ein Fehler ist aufgetreten, während das Dokument unterzeichnet wurde."
|
msgstr "Ein Fehler ist aufgetreten, während das Dokument unterzeichnet wurde."
|
||||||
@ -458,7 +458,7 @@ msgstr "Ein Fehler ist aufgetreten, während das Dokument unterzeichnet wurde."
|
|||||||
msgid "An error occurred while trying to create a checkout session."
|
msgid "An error occurred while trying to create a checkout session."
|
||||||
msgstr "Ein Fehler ist aufgetreten, während versucht wurde, eine Checkout-Sitzung zu erstellen."
|
msgstr "Ein Fehler ist aufgetreten, während versucht wurde, eine Checkout-Sitzung zu erstellen."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:214
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:232
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166
|
||||||
msgid "An error occurred while updating the document settings."
|
msgid "An error occurred while updating the document settings."
|
||||||
msgstr "Ein Fehler ist aufgetreten, während die Dokumenteinstellungen aktualisiert wurden."
|
msgstr "Ein Fehler ist aufgetreten, während die Dokumenteinstellungen aktualisiert wurden."
|
||||||
@ -665,11 +665,11 @@ msgstr "Durch die Aktivierung von 2FA müssen Sie jedes Mal, wenn Sie sich anmel
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:150
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:151
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:250
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:248
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
|
||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
|
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
|
||||||
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
|
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
|
||||||
@ -752,7 +752,7 @@ msgid "Click to copy signing link for sending to recipient"
|
|||||||
msgstr "Klicken Sie, um den Signatur-Link zu kopieren, um ihn an den Empfänger zu senden"
|
msgstr "Klicken Sie, um den Signatur-Link zu kopieren, um ihn an den Empfänger zu senden"
|
||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:175
|
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:175
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:114
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:115
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:435
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:435
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:314
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:314
|
||||||
msgid "Click to insert field"
|
msgid "Click to insert field"
|
||||||
@ -802,7 +802,7 @@ msgstr "Abgeschlossene Dokumente"
|
|||||||
msgid "Completed Documents"
|
msgid "Completed Documents"
|
||||||
msgstr "Abgeschlossene Dokumente"
|
msgstr "Abgeschlossene Dokumente"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165
|
||||||
msgid "Configure general settings for the document."
|
msgid "Configure general settings for the document."
|
||||||
msgstr "Konfigurieren Sie die allgemeinen Einstellungen für das Dokument."
|
msgstr "Konfigurieren Sie die allgemeinen Einstellungen für das Dokument."
|
||||||
|
|
||||||
@ -1274,7 +1274,7 @@ msgstr "Dokument erneut gesendet"
|
|||||||
msgid "Document resealed"
|
msgid "Document resealed"
|
||||||
msgstr "Dokument wieder versiegelt"
|
msgstr "Dokument wieder versiegelt"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:298
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321
|
||||||
msgid "Document sent"
|
msgid "Document sent"
|
||||||
msgstr "Dokument gesendet"
|
msgstr "Dokument gesendet"
|
||||||
|
|
||||||
@ -1369,6 +1369,10 @@ msgstr "Entwurfdokumente"
|
|||||||
msgid "Drafted Documents"
|
msgid "Drafted Documents"
|
||||||
msgstr "Entwurfte Dokumente"
|
msgstr "Entwurfte Dokumente"
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:245
|
||||||
|
#~ msgid "Draw"
|
||||||
|
#~ msgstr "Draw"
|
||||||
|
|
||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:121
|
#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:121
|
||||||
msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team."
|
msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team."
|
||||||
msgstr "Aufgrund einer unbezahlten Rechnung wurde Ihrem Team der Zugriff eingeschränkt. Bitte begleichen Sie die Zahlung, um den vollumfänglichen Zugang zu Ihrem Team wiederherzustellen."
|
msgstr "Aufgrund einer unbezahlten Rechnung wurde Ihrem Team der Zugriff eingeschränkt. Bitte begleichen Sie die Zahlung, um den vollumfänglichen Zugang zu Ihrem Team wiederherzustellen."
|
||||||
@ -1491,10 +1495,10 @@ msgstr "Geben Sie hier Ihren Text ein"
|
|||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41
|
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41
|
||||||
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78
|
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:213
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:231
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:247
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:277
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:308
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331
|
||||||
#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57
|
#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57
|
||||||
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106
|
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106
|
||||||
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112
|
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112
|
||||||
@ -1519,8 +1523,8 @@ msgstr "Geben Sie hier Ihren Text ein"
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101
|
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128
|
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:148
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:146
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:174
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:172
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195
|
||||||
#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54
|
#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54
|
||||||
@ -1597,7 +1601,7 @@ msgstr "Haben Sie Ihr Passwort vergessen?"
|
|||||||
msgid "Full Name"
|
msgid "Full Name"
|
||||||
msgstr "Vollständiger Name"
|
msgstr "Vollständiger Name"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:146
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:164
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60
|
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60
|
||||||
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43
|
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43
|
||||||
@ -2294,7 +2298,7 @@ msgstr "Bitte kontaktieren Sie den Support, wenn Sie diese Aktion rückgängig m
|
|||||||
msgid "Please enter a meaningful name for your token. This will help you identify it later."
|
msgid "Please enter a meaningful name for your token. This will help you identify it later."
|
||||||
msgstr "Bitte geben Sie einen aussagekräftigen Namen für Ihr Token ein. Dies wird Ihnen helfen, es später zu identifizieren."
|
msgstr "Bitte geben Sie einen aussagekräftigen Namen für Ihr Token ein. Dies wird Ihnen helfen, es später zu identifizieren."
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:134
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:135
|
||||||
msgid "Please mark as viewed to complete"
|
msgid "Please mark as viewed to complete"
|
||||||
msgstr "Bitte als angesehen markieren, um abzuschließen"
|
msgstr "Bitte als angesehen markieren, um abzuschließen"
|
||||||
|
|
||||||
@ -2730,13 +2734,13 @@ msgstr "Vorlagen in Ihrem Team-Öffentliches Profil anzeigen, damit Ihre Zielgru
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:259
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:256
|
||||||
#: apps/web/src/components/ui/user-profile-skeleton.tsx:75
|
#: apps/web/src/components/ui/user-profile-skeleton.tsx:75
|
||||||
#: apps/web/src/components/ui/user-profile-timur.tsx:81
|
#: apps/web/src/components/ui/user-profile-timur.tsx:81
|
||||||
msgid "Sign"
|
msgid "Sign"
|
||||||
msgstr "Unterzeichnen"
|
msgstr "Unterzeichnen"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:219
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:217
|
||||||
msgid "Sign as {0} <0>({1})</0>"
|
msgid "Sign as {0} <0>({1})</0>"
|
||||||
msgstr "Unterzeichnen als {0} <0>({1})</0>"
|
msgstr "Unterzeichnen als {0} <0>({1})</0>"
|
||||||
|
|
||||||
@ -2802,8 +2806,8 @@ msgstr "Registrieren mit OIDC"
|
|||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88
|
#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:338
|
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:338
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:197
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:195
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:227
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:225
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:391
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:391
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:270
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:270
|
||||||
#: apps/web/src/components/forms/profile.tsx:132
|
#: apps/web/src/components/forms/profile.tsx:132
|
||||||
@ -3552,6 +3556,10 @@ msgstr "Type 'delete' to confirm"
|
|||||||
msgid "Type a command or search..."
|
msgid "Type a command or search..."
|
||||||
msgstr "Type a command or search..."
|
msgstr "Type a command or search..."
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:275
|
||||||
|
#~ msgid "Typed Signature"
|
||||||
|
#~ msgstr "Typed Signature"
|
||||||
|
|
||||||
#: apps/web/src/app/(unauthenticated)/verify-email/page.tsx:26
|
#: apps/web/src/app/(unauthenticated)/verify-email/page.tsx:26
|
||||||
msgid "Uh oh! Looks like you're missing a token"
|
msgid "Uh oh! Looks like you're missing a token"
|
||||||
msgstr "Uh oh! Looks like you're missing a token"
|
msgstr "Uh oh! Looks like you're missing a token"
|
||||||
@ -4382,7 +4390,7 @@ msgstr "Ihr Dokument wurde erfolgreich aus der Vorlage erstellt."
|
|||||||
msgid "Your document has been re-sent successfully."
|
msgid "Your document has been re-sent successfully."
|
||||||
msgstr "Ihr Dokument wurde erfolgreich erneut gesendet."
|
msgstr "Ihr Dokument wurde erfolgreich erneut gesendet."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:299
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:322
|
||||||
msgid "Your document has been sent successfully."
|
msgid "Your document has been sent successfully."
|
||||||
msgstr "Ihr Dokument wurde erfolgreich gesendet."
|
msgstr "Ihr Dokument wurde erfolgreich gesendet."
|
||||||
|
|
||||||
@ -4489,3 +4497,4 @@ msgstr "Ihr Token wurde erfolgreich erstellt! Stellen Sie sicher, dass Sie es ko
|
|||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86
|
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86
|
||||||
msgid "Your tokens will be shown here once you create them."
|
msgid "Your tokens will be shown here once you create them."
|
||||||
msgstr "Ihre Tokens werden hier angezeigt, sobald Sie sie erstellt haben."
|
msgstr "Ihre Tokens werden hier angezeigt, sobald Sie sie erstellt haben."
|
||||||
|
|
||||||
|
|||||||
@ -110,7 +110,7 @@ msgstr "Admin"
|
|||||||
msgid "Advanced Options"
|
msgid "Advanced Options"
|
||||||
msgstr "Advanced Options"
|
msgstr "Advanced Options"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:565
|
#: packages/ui/primitives/document-flow/add-fields.tsx:570
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
|
||||||
msgid "Advanced settings"
|
msgid "Advanced settings"
|
||||||
msgstr "Advanced settings"
|
msgstr "Advanced settings"
|
||||||
@ -135,11 +135,11 @@ msgstr "Approver"
|
|||||||
msgid "Approving"
|
msgid "Approving"
|
||||||
msgstr "Approving"
|
msgstr "Approving"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:276
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
|
||||||
msgid "Black"
|
msgid "Black"
|
||||||
msgstr "Black"
|
msgstr "Black"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:290
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:391
|
||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr "Blue"
|
msgstr "Blue"
|
||||||
|
|
||||||
@ -173,7 +173,7 @@ msgstr "CC'd"
|
|||||||
msgid "Character Limit"
|
msgid "Character Limit"
|
||||||
msgstr "Character Limit"
|
msgstr "Character Limit"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:993
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1026
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
|
||||||
msgid "Checkbox"
|
msgid "Checkbox"
|
||||||
msgstr "Checkbox"
|
msgstr "Checkbox"
|
||||||
@ -186,7 +186,7 @@ msgstr "Checkbox values"
|
|||||||
msgid "Clear filters"
|
msgid "Clear filters"
|
||||||
msgstr "Clear filters"
|
msgstr "Clear filters"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:310
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:411
|
||||||
msgid "Clear Signature"
|
msgid "Clear Signature"
|
||||||
msgstr "Clear Signature"
|
msgstr "Clear Signature"
|
||||||
|
|
||||||
@ -202,7 +202,7 @@ msgstr "Close"
|
|||||||
msgid "Configure Direct Recipient"
|
msgid "Configure Direct Recipient"
|
||||||
msgstr "Configure Direct Recipient"
|
msgstr "Configure Direct Recipient"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:566
|
#: packages/ui/primitives/document-flow/add-fields.tsx:571
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
|
||||||
msgid "Configure the {0} field"
|
msgid "Configure the {0} field"
|
||||||
msgstr "Configure the {0} field"
|
msgstr "Configure the {0} field"
|
||||||
@ -219,7 +219,7 @@ msgstr "Copied to clipboard"
|
|||||||
msgid "Custom Text"
|
msgid "Custom Text"
|
||||||
msgstr "Custom Text"
|
msgstr "Custom Text"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:889
|
#: packages/ui/primitives/document-flow/add-fields.tsx:922
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr "Date"
|
msgstr "Date"
|
||||||
@ -251,7 +251,7 @@ msgstr "Download"
|
|||||||
msgid "Drag & drop your PDF here."
|
msgid "Drag & drop your PDF here."
|
||||||
msgstr "Drag & drop your PDF here."
|
msgstr "Drag & drop your PDF here."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1019
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1052
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
|
||||||
msgid "Dropdown"
|
msgid "Dropdown"
|
||||||
msgstr "Dropdown"
|
msgstr "Dropdown"
|
||||||
@ -260,7 +260,7 @@ msgstr "Dropdown"
|
|||||||
msgid "Dropdown options"
|
msgid "Dropdown options"
|
||||||
msgstr "Dropdown options"
|
msgstr "Dropdown options"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:837
|
#: packages/ui/primitives/document-flow/add-fields.tsx:870
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:272
|
#: packages/ui/primitives/document-flow/add-signature.tsx:272
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:500
|
#: packages/ui/primitives/document-flow/add-signers.tsx:500
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
|
||||||
@ -273,7 +273,7 @@ msgstr "Email"
|
|||||||
msgid "Email Options"
|
msgid "Email Options"
|
||||||
msgstr "Email Options"
|
msgstr "Email Options"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1082
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1117
|
||||||
msgid "Empty field"
|
msgid "Empty field"
|
||||||
msgstr "Empty field"
|
msgstr "Empty field"
|
||||||
|
|
||||||
@ -286,6 +286,10 @@ msgstr "Enable Direct Link Signing"
|
|||||||
msgid "Enable signing order"
|
msgid "Enable signing order"
|
||||||
msgstr "Enable signing order"
|
msgstr "Enable signing order"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:790
|
||||||
|
msgid "Enable Typed Signatures"
|
||||||
|
msgstr "Enable Typed Signatures"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-password-dialog.tsx:84
|
#: packages/ui/primitives/document-password-dialog.tsx:84
|
||||||
msgid "Enter password"
|
msgid "Enter password"
|
||||||
msgstr "Enter password"
|
msgstr "Enter password"
|
||||||
@ -345,7 +349,7 @@ msgstr "Global recipient action authentication"
|
|||||||
msgid "Go Back"
|
msgid "Go Back"
|
||||||
msgstr "Go Back"
|
msgstr "Go Back"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:297
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:398
|
||||||
msgid "Green"
|
msgid "Green"
|
||||||
msgstr "Green"
|
msgstr "Green"
|
||||||
|
|
||||||
@ -401,7 +405,7 @@ msgstr "Message <0>(Optional)</0>"
|
|||||||
msgid "Min"
|
msgid "Min"
|
||||||
msgstr "Min"
|
msgstr "Min"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:863
|
#: packages/ui/primitives/document-flow/add-fields.tsx:896
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:298
|
#: packages/ui/primitives/document-flow/add-signature.tsx:298
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:535
|
#: packages/ui/primitives/document-flow/add-signers.tsx:535
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:541
|
#: packages/ui/primitives/document-flow/add-signers.tsx:541
|
||||||
@ -423,12 +427,12 @@ msgstr "Needs to sign"
|
|||||||
msgid "Needs to view"
|
msgid "Needs to view"
|
||||||
msgstr "Needs to view"
|
msgstr "Needs to view"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:674
|
#: packages/ui/primitives/document-flow/add-fields.tsx:680
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
|
||||||
msgid "No recipient matching this description was found."
|
msgid "No recipient matching this description was found."
|
||||||
msgstr "No recipient matching this description was found."
|
msgstr "No recipient matching this description was found."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:690
|
#: packages/ui/primitives/document-flow/add-fields.tsx:696
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
|
||||||
msgid "No recipients with this role"
|
msgid "No recipients with this role"
|
||||||
msgstr "No recipients with this role"
|
msgstr "No recipients with this role"
|
||||||
@ -453,7 +457,7 @@ msgstr "No signature field found"
|
|||||||
msgid "No value found."
|
msgid "No value found."
|
||||||
msgstr "No value found."
|
msgstr "No value found."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:941
|
#: packages/ui/primitives/document-flow/add-fields.tsx:974
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
|
||||||
msgid "Number"
|
msgid "Number"
|
||||||
msgstr "Number"
|
msgstr "Number"
|
||||||
@ -488,7 +492,7 @@ msgstr "Pick a number"
|
|||||||
msgid "Placeholder"
|
msgid "Placeholder"
|
||||||
msgstr "Placeholder"
|
msgstr "Placeholder"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:967
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1000
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
|
||||||
msgid "Radio"
|
msgid "Radio"
|
||||||
msgstr "Radio"
|
msgstr "Radio"
|
||||||
@ -515,7 +519,7 @@ msgstr "Receives copy"
|
|||||||
msgid "Recipient action authentication"
|
msgid "Recipient action authentication"
|
||||||
msgstr "Recipient action authentication"
|
msgstr "Recipient action authentication"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:283
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:384
|
||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr "Red"
|
msgstr "Red"
|
||||||
|
|
||||||
@ -524,7 +528,7 @@ msgstr "Red"
|
|||||||
msgid "Redirect URL"
|
msgid "Redirect URL"
|
||||||
msgstr "Redirect URL"
|
msgstr "Redirect URL"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1069
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1104
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Remove"
|
msgstr "Remove"
|
||||||
|
|
||||||
@ -595,7 +599,7 @@ msgstr "Show advanced settings"
|
|||||||
msgid "Sign"
|
msgid "Sign"
|
||||||
msgstr "Sign"
|
msgstr "Sign"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:785
|
#: packages/ui/primitives/document-flow/add-fields.tsx:818
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:323
|
#: packages/ui/primitives/document-flow/add-signature.tsx:323
|
||||||
#: packages/ui/primitives/document-flow/field-icon.tsx:52
|
#: packages/ui/primitives/document-flow/field-icon.tsx:52
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
|
||||||
@ -643,7 +647,7 @@ msgstr "Submit"
|
|||||||
msgid "Template title"
|
msgid "Template title"
|
||||||
msgstr "Template title"
|
msgstr "Template title"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:915
|
#: packages/ui/primitives/document-flow/add-fields.tsx:948
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
|
||||||
msgid "Text"
|
msgid "Text"
|
||||||
msgstr "Text"
|
msgstr "Text"
|
||||||
@ -704,7 +708,7 @@ msgstr "The signer's name"
|
|||||||
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
||||||
msgstr "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
msgstr "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:746
|
#: packages/ui/primitives/document-flow/add-fields.tsx:752
|
||||||
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
|
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
|
||||||
msgstr "This document has already been sent to this recipient. You can no longer edit this recipient."
|
msgstr "This document has already been sent to this recipient. You can no longer edit this recipient."
|
||||||
|
|
||||||
@ -716,7 +720,7 @@ msgstr "This document is password protected. Please enter the password to view t
|
|||||||
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
|
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
|
||||||
msgstr "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
|
msgstr "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1050
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1084
|
||||||
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
|
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
|
||||||
msgstr "This recipient can no longer be modified as they have signed a field, or completed the document."
|
msgstr "This recipient can no longer be modified as they have signed a field, or completed the document."
|
||||||
|
|
||||||
@ -741,7 +745,7 @@ msgstr "Time Zone"
|
|||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Title"
|
msgstr "Title"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1033
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1067
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
|
||||||
msgid "To proceed further, please set at least one value for the {0} field."
|
msgid "To proceed further, please set at least one value for the {0} field."
|
||||||
msgstr "To proceed further, please set at least one value for the {0} field."
|
msgstr "To proceed further, please set at least one value for the {0} field."
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -215,7 +215,7 @@ msgstr "Active Subscriptions"
|
|||||||
msgid "Add"
|
msgid "Add"
|
||||||
msgstr "Add"
|
msgstr "Add"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
|
||||||
msgid "Add all relevant fields for each recipient."
|
msgid "Add all relevant fields for each recipient."
|
||||||
msgstr "Add all relevant fields for each recipient."
|
msgstr "Add all relevant fields for each recipient."
|
||||||
@ -236,7 +236,7 @@ msgstr "Add an authenticator to serve as a secondary authentication method when
|
|||||||
msgid "Add email"
|
msgid "Add email"
|
||||||
msgstr "Add email"
|
msgstr "Add email"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:156
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:174
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86
|
||||||
msgid "Add Fields"
|
msgid "Add Fields"
|
||||||
msgstr "Add Fields"
|
msgstr "Add Fields"
|
||||||
@ -258,11 +258,11 @@ msgstr "Add passkey"
|
|||||||
msgid "Add Placeholders"
|
msgid "Add Placeholders"
|
||||||
msgstr "Add Placeholders"
|
msgstr "Add Placeholders"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:151
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169
|
||||||
msgid "Add Signers"
|
msgid "Add Signers"
|
||||||
msgstr "Add Signers"
|
msgstr "Add Signers"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:161
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179
|
||||||
msgid "Add Subject"
|
msgid "Add Subject"
|
||||||
msgstr "Add Subject"
|
msgstr "Add Subject"
|
||||||
|
|
||||||
@ -278,7 +278,7 @@ msgstr "Add team email"
|
|||||||
#~ msgid "Add Text"
|
#~ msgid "Add Text"
|
||||||
#~ msgstr "Add Text"
|
#~ msgstr "Add Text"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
|
||||||
msgid "Add the people who will sign the document."
|
msgid "Add the people who will sign the document."
|
||||||
msgstr "Add the people who will sign the document."
|
msgstr "Add the people who will sign the document."
|
||||||
|
|
||||||
@ -286,7 +286,7 @@ msgstr "Add the people who will sign the document."
|
|||||||
msgid "Add the recipients to create the document with"
|
msgid "Add the recipients to create the document with"
|
||||||
msgstr "Add the recipients to create the document with"
|
msgstr "Add the recipients to create the document with"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:162
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180
|
||||||
msgid "Add the subject and message you wish to send to signers."
|
msgid "Add the subject and message you wish to send to signers."
|
||||||
msgstr "Add the subject and message you wish to send to signers."
|
msgstr "Add the subject and message you wish to send to signers."
|
||||||
|
|
||||||
@ -365,13 +365,13 @@ msgstr "An email requesting the transfer of this team has been sent."
|
|||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "An error occurred"
|
msgstr "An error occurred"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:248
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:266
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231
|
||||||
msgid "An error occurred while adding signers."
|
msgid "An error occurred while adding signers."
|
||||||
msgstr "An error occurred while adding signers."
|
msgstr "An error occurred while adding signers."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:278
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301
|
||||||
msgid "An error occurred while adding the fields."
|
msgid "An error occurred while adding the fields."
|
||||||
msgstr "An error occurred while adding the fields."
|
msgstr "An error occurred while adding the fields."
|
||||||
|
|
||||||
@ -421,7 +421,7 @@ msgstr "An error occurred while moving the template."
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129
|
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:175
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:173
|
||||||
msgid "An error occurred while removing the signature."
|
msgid "An error occurred while removing the signature."
|
||||||
msgstr "An error occurred while removing the signature."
|
msgstr "An error occurred while removing the signature."
|
||||||
|
|
||||||
@ -429,7 +429,7 @@ msgstr "An error occurred while removing the signature."
|
|||||||
msgid "An error occurred while removing the text."
|
msgid "An error occurred while removing the text."
|
||||||
msgstr "An error occurred while removing the text."
|
msgstr "An error occurred while removing the text."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:309
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:332
|
||||||
msgid "An error occurred while sending the document."
|
msgid "An error occurred while sending the document."
|
||||||
msgstr "An error occurred while sending the document."
|
msgstr "An error occurred while sending the document."
|
||||||
|
|
||||||
@ -444,7 +444,7 @@ msgstr "An error occurred while sending your confirmation email"
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102
|
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:149
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:147
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168
|
||||||
msgid "An error occurred while signing the document."
|
msgid "An error occurred while signing the document."
|
||||||
msgstr "An error occurred while signing the document."
|
msgstr "An error occurred while signing the document."
|
||||||
@ -453,7 +453,7 @@ msgstr "An error occurred while signing the document."
|
|||||||
msgid "An error occurred while trying to create a checkout session."
|
msgid "An error occurred while trying to create a checkout session."
|
||||||
msgstr "An error occurred while trying to create a checkout session."
|
msgstr "An error occurred while trying to create a checkout session."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:214
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:232
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166
|
||||||
msgid "An error occurred while updating the document settings."
|
msgid "An error occurred while updating the document settings."
|
||||||
msgstr "An error occurred while updating the document settings."
|
msgstr "An error occurred while updating the document settings."
|
||||||
@ -660,11 +660,11 @@ msgstr "By enabling 2FA, you will be required to enter a code from your authenti
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:150
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:151
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:250
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:248
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
|
||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
|
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
|
||||||
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
|
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
|
||||||
@ -747,7 +747,7 @@ msgid "Click to copy signing link for sending to recipient"
|
|||||||
msgstr "Click to copy signing link for sending to recipient"
|
msgstr "Click to copy signing link for sending to recipient"
|
||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:175
|
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:175
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:114
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:115
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:435
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:435
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:314
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:314
|
||||||
msgid "Click to insert field"
|
msgid "Click to insert field"
|
||||||
@ -797,7 +797,7 @@ msgstr "Completed documents"
|
|||||||
msgid "Completed Documents"
|
msgid "Completed Documents"
|
||||||
msgstr "Completed Documents"
|
msgstr "Completed Documents"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165
|
||||||
msgid "Configure general settings for the document."
|
msgid "Configure general settings for the document."
|
||||||
msgstr "Configure general settings for the document."
|
msgstr "Configure general settings for the document."
|
||||||
|
|
||||||
@ -1269,7 +1269,7 @@ msgstr "Document re-sent"
|
|||||||
msgid "Document resealed"
|
msgid "Document resealed"
|
||||||
msgstr "Document resealed"
|
msgstr "Document resealed"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:298
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321
|
||||||
msgid "Document sent"
|
msgid "Document sent"
|
||||||
msgstr "Document sent"
|
msgstr "Document sent"
|
||||||
|
|
||||||
@ -1364,6 +1364,10 @@ msgstr "Draft documents"
|
|||||||
msgid "Drafted Documents"
|
msgid "Drafted Documents"
|
||||||
msgstr "Drafted Documents"
|
msgstr "Drafted Documents"
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:245
|
||||||
|
#~ msgid "Draw"
|
||||||
|
#~ msgstr "Draw"
|
||||||
|
|
||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:121
|
#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:121
|
||||||
msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team."
|
msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team."
|
||||||
msgstr "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team."
|
msgstr "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team."
|
||||||
@ -1486,10 +1490,10 @@ msgstr "Enter your text here"
|
|||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41
|
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41
|
||||||
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78
|
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:213
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:231
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:247
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:277
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:308
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331
|
||||||
#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57
|
#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57
|
||||||
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106
|
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106
|
||||||
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112
|
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112
|
||||||
@ -1514,8 +1518,8 @@ msgstr "Enter your text here"
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101
|
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128
|
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:148
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:146
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:174
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:172
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195
|
||||||
#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54
|
#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54
|
||||||
@ -1592,7 +1596,7 @@ msgstr "Forgot your password?"
|
|||||||
msgid "Full Name"
|
msgid "Full Name"
|
||||||
msgstr "Full Name"
|
msgstr "Full Name"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:146
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:164
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60
|
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60
|
||||||
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43
|
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43
|
||||||
@ -2289,7 +2293,7 @@ msgstr "Please contact support if you would like to revert this action."
|
|||||||
msgid "Please enter a meaningful name for your token. This will help you identify it later."
|
msgid "Please enter a meaningful name for your token. This will help you identify it later."
|
||||||
msgstr "Please enter a meaningful name for your token. This will help you identify it later."
|
msgstr "Please enter a meaningful name for your token. This will help you identify it later."
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:134
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:135
|
||||||
msgid "Please mark as viewed to complete"
|
msgid "Please mark as viewed to complete"
|
||||||
msgstr "Please mark as viewed to complete"
|
msgstr "Please mark as viewed to complete"
|
||||||
|
|
||||||
@ -2725,13 +2729,13 @@ msgstr "Show templates in your team public profile for your audience to sign and
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:259
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:256
|
||||||
#: apps/web/src/components/ui/user-profile-skeleton.tsx:75
|
#: apps/web/src/components/ui/user-profile-skeleton.tsx:75
|
||||||
#: apps/web/src/components/ui/user-profile-timur.tsx:81
|
#: apps/web/src/components/ui/user-profile-timur.tsx:81
|
||||||
msgid "Sign"
|
msgid "Sign"
|
||||||
msgstr "Sign"
|
msgstr "Sign"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:219
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:217
|
||||||
msgid "Sign as {0} <0>({1})</0>"
|
msgid "Sign as {0} <0>({1})</0>"
|
||||||
msgstr "Sign as {0} <0>({1})</0>"
|
msgstr "Sign as {0} <0>({1})</0>"
|
||||||
|
|
||||||
@ -2797,8 +2801,8 @@ msgstr "Sign Up with OIDC"
|
|||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88
|
#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:338
|
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:338
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:197
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:195
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:227
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:225
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:391
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:391
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:270
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:270
|
||||||
#: apps/web/src/components/forms/profile.tsx:132
|
#: apps/web/src/components/forms/profile.tsx:132
|
||||||
@ -3547,6 +3551,10 @@ msgstr "Type 'delete' to confirm"
|
|||||||
msgid "Type a command or search..."
|
msgid "Type a command or search..."
|
||||||
msgstr "Type a command or search..."
|
msgstr "Type a command or search..."
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:275
|
||||||
|
#~ msgid "Typed Signature"
|
||||||
|
#~ msgstr "Typed Signature"
|
||||||
|
|
||||||
#: apps/web/src/app/(unauthenticated)/verify-email/page.tsx:26
|
#: apps/web/src/app/(unauthenticated)/verify-email/page.tsx:26
|
||||||
msgid "Uh oh! Looks like you're missing a token"
|
msgid "Uh oh! Looks like you're missing a token"
|
||||||
msgstr "Uh oh! Looks like you're missing a token"
|
msgstr "Uh oh! Looks like you're missing a token"
|
||||||
@ -4377,7 +4385,7 @@ msgstr "Your document has been created from the template successfully."
|
|||||||
msgid "Your document has been re-sent successfully."
|
msgid "Your document has been re-sent successfully."
|
||||||
msgstr "Your document has been re-sent successfully."
|
msgstr "Your document has been re-sent successfully."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:299
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:322
|
||||||
msgid "Your document has been sent successfully."
|
msgid "Your document has been sent successfully."
|
||||||
msgstr "Your document has been sent successfully."
|
msgstr "Your document has been sent successfully."
|
||||||
|
|
||||||
|
|||||||
819
packages/lib/translations/es/common.po
Normal file
819
packages/lib/translations/es/common.po
Normal file
@ -0,0 +1,819 @@
|
|||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"POT-Creation-Date: 2024-07-24 13:01+1000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"X-Generator: @lingui/cli\n"
|
||||||
|
"Language: es\n"
|
||||||
|
"Project-Id-Version: documenso-app\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"PO-Revision-Date: 2024-10-22 02:25\n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: Spanish\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
"X-Crowdin-Project: documenso-app\n"
|
||||||
|
"X-Crowdin-Project-ID: 694691\n"
|
||||||
|
"X-Crowdin-Language: es-ES\n"
|
||||||
|
"X-Crowdin-File: common.po\n"
|
||||||
|
"X-Crowdin-File-ID: 4\n"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/data-table-pagination.tsx:30
|
||||||
|
msgid "{0} of {1} row(s) selected."
|
||||||
|
msgstr "{0} de {1} fila(s) seleccionada."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/data-table-pagination.tsx:41
|
||||||
|
msgid "{visibleRows, plural, one {Showing # result.} other {Showing # results.}}"
|
||||||
|
msgstr "{visibleRows, plural, one {Mostrando # resultado.} other {Mostrando # resultados.}}"
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:53
|
||||||
|
msgid "<0>Inherit authentication method</0> - Use the global action signing authentication method configured in the \"General Settings\" step"
|
||||||
|
msgstr "<0>Heredar método de autenticación</0> - Use el método de autenticación de firma de acción global configurado en el paso \"Configuración General\""
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-global-auth-action-select.tsx:95
|
||||||
|
msgid "<0>No restrictions</0> - No authentication required"
|
||||||
|
msgstr "<0>Sin restricciones</0> - No se requiere autenticación"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-global-auth-access-select.tsx:77
|
||||||
|
msgid "<0>No restrictions</0> - The document can be accessed directly by the URL sent to the recipient"
|
||||||
|
msgstr "<0>Sin restricciones</0> - El documento se puede acceder directamente a través de la URL enviada al destinatario"
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:75
|
||||||
|
msgid "<0>None</0> - No authentication required"
|
||||||
|
msgstr "<0>Ninguno</0> - No se requiere autenticación"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-global-auth-action-select.tsx:89
|
||||||
|
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:69
|
||||||
|
msgid "<0>Require 2FA</0> - The recipient must have an account and 2FA enabled via their settings"
|
||||||
|
msgstr "<0>Requerir 2FA</0> - El destinatario debe tener una cuenta y 2FA habilitado a través de sus configuraciones"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-global-auth-access-select.tsx:72
|
||||||
|
msgid "<0>Require account</0> - The recipient must be signed in to view the document"
|
||||||
|
msgstr "<0>Requerir cuenta</0> - El destinatario debe haber iniciado sesión para ver el documento"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-global-auth-action-select.tsx:83
|
||||||
|
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:63
|
||||||
|
msgid "<0>Require passkey</0> - The recipient must have an account and passkey configured via their settings"
|
||||||
|
msgstr "<0>Requerir clave de acceso</0> - El destinatario debe tener una cuenta y clave de acceso configurada a través de sus configuraciones"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-dropzone.tsx:69
|
||||||
|
msgid "Add a document"
|
||||||
|
msgstr "Agregar un documento"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-settings.tsx:336
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:339
|
||||||
|
msgid "Add a URL to redirect the user to once the document is signed"
|
||||||
|
msgstr "Agregue una URL para redirigir al usuario una vez que se firme el documento"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-settings.tsx:248
|
||||||
|
msgid "Add an external ID to the document. This can be used to identify the document in external systems."
|
||||||
|
msgstr "Agregue un ID externo al documento. Esto se puede usar para identificar el documento en sistemas externos."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:256
|
||||||
|
msgid "Add an external ID to the template. This can be used to identify in external systems."
|
||||||
|
msgstr "Agregue un ID externo a la plantilla. Esto se puede usar para identificar en sistemas externos."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:187
|
||||||
|
msgid "Add another option"
|
||||||
|
msgstr "Agregar otra opción"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:232
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:167
|
||||||
|
msgid "Add another value"
|
||||||
|
msgstr "Agregar otro valor"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:662
|
||||||
|
msgid "Add myself"
|
||||||
|
msgstr "Agregame"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:637
|
||||||
|
msgid "Add Myself"
|
||||||
|
msgstr "Agregame"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:623
|
||||||
|
msgid "Add Placeholder Recipient"
|
||||||
|
msgstr "Agregar destinatario de marcador de posición"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:651
|
||||||
|
msgid "Add Signer"
|
||||||
|
msgstr "Agregar firmante"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:73
|
||||||
|
msgid "Add text"
|
||||||
|
msgstr "Agregar texto"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:78
|
||||||
|
msgid "Add text to the field"
|
||||||
|
msgstr "Agregar texto al campo"
|
||||||
|
|
||||||
|
#: packages/lib/constants/teams.ts:10
|
||||||
|
msgid "Admin"
|
||||||
|
msgstr "Admin"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-settings.tsx:230
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:238
|
||||||
|
msgid "Advanced Options"
|
||||||
|
msgstr "Opciones avanzadas"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:570
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
|
||||||
|
msgid "Advanced settings"
|
||||||
|
msgstr "Configuraciones avanzadas"
|
||||||
|
|
||||||
|
#: packages/lib/constants/template.ts:21
|
||||||
|
msgid "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email."
|
||||||
|
msgstr "Después de la presentación, se generará automáticamente un documento y se agregará a su página de documentos. También recibirá una notificación por correo electrónico."
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:8
|
||||||
|
msgid "Approve"
|
||||||
|
msgstr "Aprobar"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:9
|
||||||
|
msgid "Approved"
|
||||||
|
msgstr "Aprobado"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:11
|
||||||
|
msgid "Approver"
|
||||||
|
msgstr "Aprobador"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:10
|
||||||
|
msgid "Approving"
|
||||||
|
msgstr "Aprobando"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
|
||||||
|
msgid "Black"
|
||||||
|
msgstr "Negro"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:391
|
||||||
|
msgid "Blue"
|
||||||
|
msgstr "Azul"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356
|
||||||
|
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Cancelar"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:193
|
||||||
|
msgid "Cannot remove signer"
|
||||||
|
msgstr "No se puede eliminar el firmante"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:221
|
||||||
|
#~ msgid "Cannot update signer because they have already signed a field"
|
||||||
|
#~ msgstr "Cannot update signer because they have already signed a field"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:17
|
||||||
|
msgid "Cc"
|
||||||
|
msgstr "Cc"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:14
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:16
|
||||||
|
msgid "CC"
|
||||||
|
msgstr "CC"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:15
|
||||||
|
msgid "CC'd"
|
||||||
|
msgstr "CC'd"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:86
|
||||||
|
msgid "Character Limit"
|
||||||
|
msgstr "Límite de caracteres"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1026
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
|
||||||
|
msgid "Checkbox"
|
||||||
|
msgstr "Caja de verificación"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:197
|
||||||
|
msgid "Checkbox values"
|
||||||
|
msgstr "Valores de Checkbox"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/data-table.tsx:156
|
||||||
|
msgid "Clear filters"
|
||||||
|
msgstr "Limpiar filtros"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:411
|
||||||
|
msgid "Clear Signature"
|
||||||
|
msgstr "Limpiar firma"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-signature.tsx:394
|
||||||
|
msgid "Click to insert field"
|
||||||
|
msgstr "Haga clic para insertar campo"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:44
|
||||||
|
msgid "Close"
|
||||||
|
msgstr "Cerrar"
|
||||||
|
|
||||||
|
#: packages/lib/constants/template.ts:12
|
||||||
|
msgid "Configure Direct Recipient"
|
||||||
|
msgstr "Configurar destinatario directo"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:571
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
|
||||||
|
msgid "Configure the {0} field"
|
||||||
|
msgstr "Configurar el campo {0}"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/document-flow-root.tsx:141
|
||||||
|
msgid "Continue"
|
||||||
|
msgstr "Continuar"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-share-button.tsx:46
|
||||||
|
msgid "Copied to clipboard"
|
||||||
|
msgstr "Copiado al portapapeles"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-signature.tsx:360
|
||||||
|
msgid "Custom Text"
|
||||||
|
msgstr "Texto personalizado"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:922
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
|
||||||
|
msgid "Date"
|
||||||
|
msgstr "Fecha"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-settings.tsx:271
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:279
|
||||||
|
msgid "Date Format"
|
||||||
|
msgstr "Formato de fecha"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570
|
||||||
|
msgid "Direct link receiver"
|
||||||
|
msgstr "Receptor de enlace directo"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-global-auth-access-select.tsx:62
|
||||||
|
#: packages/ui/primitives/document-flow/add-settings.tsx:174
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:151
|
||||||
|
msgid "Document access"
|
||||||
|
msgstr "Acceso al documento"
|
||||||
|
|
||||||
|
#: packages/lib/constants/template.ts:20
|
||||||
|
msgid "Document Creation"
|
||||||
|
msgstr "Creación de documento"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-download-button.tsx:68
|
||||||
|
msgid "Download"
|
||||||
|
msgstr "Descargar"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-dropzone.tsx:162
|
||||||
|
msgid "Drag & drop your PDF here."
|
||||||
|
msgstr "Arrastre y suelte su PDF aquí."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1052
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
|
||||||
|
msgid "Dropdown"
|
||||||
|
msgstr "Menú desplegable"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:158
|
||||||
|
msgid "Dropdown options"
|
||||||
|
msgstr "Opciones de menú desplegable"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:870
|
||||||
|
#: packages/ui/primitives/document-flow/add-signature.tsx:272
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:500
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:463
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:470
|
||||||
|
msgid "Email"
|
||||||
|
msgstr "Correo electrónico"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:184
|
||||||
|
msgid "Email Options"
|
||||||
|
msgstr "Opciones de correo electrónico"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1117
|
||||||
|
msgid "Empty field"
|
||||||
|
msgstr "Campo vacío"
|
||||||
|
|
||||||
|
#: packages/lib/constants/template.ts:8
|
||||||
|
msgid "Enable Direct Link Signing"
|
||||||
|
msgstr "Habilitar firma de enlace directo"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:401
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:362
|
||||||
|
msgid "Enable signing order"
|
||||||
|
msgstr "Habilitar orden de firma"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:790
|
||||||
|
msgid "Enable Typed Signatures"
|
||||||
|
msgstr "Habilitar firmas escritas"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-password-dialog.tsx:84
|
||||||
|
msgid "Enter password"
|
||||||
|
msgstr "Ingrese la contraseña"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:257
|
||||||
|
msgid "Error"
|
||||||
|
msgstr "Error"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-settings.tsx:241
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:249
|
||||||
|
msgid "External ID"
|
||||||
|
msgstr "ID externo"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:258
|
||||||
|
msgid "Failed to save settings."
|
||||||
|
msgstr "Fallo al guardar configuraciones."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93
|
||||||
|
msgid "Field character limit"
|
||||||
|
msgstr "Límite de caracteres del campo"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:62
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:44
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:44
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:44
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107
|
||||||
|
msgid "Field font size"
|
||||||
|
msgstr "Tamaño de fuente del campo"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:110
|
||||||
|
msgid "Field format"
|
||||||
|
msgstr "Formato de campo"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:53
|
||||||
|
msgid "Field label"
|
||||||
|
msgstr "Etiqueta de campo"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:65
|
||||||
|
msgid "Field placeholder"
|
||||||
|
msgstr "Marcador de posición de campo"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:56
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:38
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:38
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:38
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101
|
||||||
|
msgid "Font Size"
|
||||||
|
msgstr "Tamaño de fuente"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-global-auth-action-select.tsx:64
|
||||||
|
msgid "Global recipient action authentication"
|
||||||
|
msgstr "Autenticación de acción de destinatario global"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/document-flow-root.tsx:142
|
||||||
|
msgid "Go Back"
|
||||||
|
msgstr "Regresar"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:398
|
||||||
|
msgid "Green"
|
||||||
|
msgstr "Verde"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:72
|
||||||
|
msgid "I am a signer of this document"
|
||||||
|
msgstr "Soy un firmante de este documento"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:75
|
||||||
|
msgid "I am a viewer of this document"
|
||||||
|
msgstr "Soy un visualizador de este documento"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:73
|
||||||
|
msgid "I am an approver of this document"
|
||||||
|
msgstr "Soy un aprobador de este documento"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:74
|
||||||
|
msgid "I am required to receive a copy of this document"
|
||||||
|
msgstr "Se me requiere recibir una copia de este documento"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:74
|
||||||
|
#~ msgid "I am required to recieve a copy of this document"
|
||||||
|
#~ msgstr "I am required to recieve a copy of this document"
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:29
|
||||||
|
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:87
|
||||||
|
msgid "Inherit authentication method"
|
||||||
|
msgstr "Heredar método de autenticación"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48
|
||||||
|
msgid "Label"
|
||||||
|
msgstr "Etiqueta"
|
||||||
|
|
||||||
|
#: packages/lib/constants/teams.ts:11
|
||||||
|
msgid "Manager"
|
||||||
|
msgstr "Gerente"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188
|
||||||
|
msgid "Max"
|
||||||
|
msgstr "Máx"
|
||||||
|
|
||||||
|
#: packages/lib/constants/teams.ts:12
|
||||||
|
msgid "Member"
|
||||||
|
msgstr "Miembro"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-subject.tsx:95
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:215
|
||||||
|
msgid "Message <0>(Optional)</0>"
|
||||||
|
msgstr "Mensaje <0>(Opcional)</0>"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:176
|
||||||
|
msgid "Min"
|
||||||
|
msgstr "Mín"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:896
|
||||||
|
#: packages/ui/primitives/document-flow/add-signature.tsx:298
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:535
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:541
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:658
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:498
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:504
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Nombre"
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-role-select.tsx:52
|
||||||
|
msgid "Needs to approve"
|
||||||
|
msgstr "Necesita aprobar"
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-role-select.tsx:31
|
||||||
|
msgid "Needs to sign"
|
||||||
|
msgstr "Necesita firmar"
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-role-select.tsx:73
|
||||||
|
msgid "Needs to view"
|
||||||
|
msgstr "Necesita ver"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:680
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
|
||||||
|
msgid "No recipient matching this description was found."
|
||||||
|
msgstr "No se encontró ningún destinatario que coincidiera con esta descripción."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:696
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
|
||||||
|
msgid "No recipients with this role"
|
||||||
|
msgstr "No hay destinatarios con este rol"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-global-auth-access-select.tsx:30
|
||||||
|
#: packages/ui/components/document/document-global-auth-access-select.tsx:43
|
||||||
|
#: packages/ui/components/document/document-global-auth-action-select.tsx:31
|
||||||
|
#: packages/ui/components/document/document-global-auth-action-select.tsx:46
|
||||||
|
msgid "No restrictions"
|
||||||
|
msgstr "Sin restricciones"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/data-table.tsx:148
|
||||||
|
msgid "No results found"
|
||||||
|
msgstr "No se encontraron resultados"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:30
|
||||||
|
msgid "No signature field found"
|
||||||
|
msgstr "No se encontró campo de firma"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/combobox.tsx:60
|
||||||
|
#: packages/ui/primitives/multi-select-combobox.tsx:153
|
||||||
|
msgid "No value found."
|
||||||
|
msgstr "No se encontró valor."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:974
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
|
||||||
|
msgid "Number"
|
||||||
|
msgstr "Número"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:103
|
||||||
|
msgid "Number format"
|
||||||
|
msgstr "Formato de número"
|
||||||
|
|
||||||
|
#: packages/lib/constants/template.ts:9
|
||||||
|
msgid "Once enabled, you can select any active recipient to be a direct link signing recipient, or create a new one. This recipient type cannot be edited or deleted."
|
||||||
|
msgstr "Una vez habilitado, puede seleccionar cualquier destinatario activo para que sea un destinatario de firma por enlace directo, o crear uno nuevo. Este tipo de destinatario no puede ser editado ni eliminado."
|
||||||
|
|
||||||
|
#: packages/lib/constants/template.ts:17
|
||||||
|
msgid "Once your template is set up, share the link anywhere you want. The person who opens the link will be able to enter their information in the direct link recipient field and complete any other fields assigned to them."
|
||||||
|
msgstr "Una vez que su plantilla esté configurada, comparta el enlace donde desee. La persona que abra el enlace podrá ingresar su información en el campo de destinatario de enlace directo y completar cualquier otro campo que se le haya asignado."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/data-table-pagination.tsx:77
|
||||||
|
msgid "Page {0} of {1}"
|
||||||
|
msgstr "Página {0} de {1}"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-password-dialog.tsx:62
|
||||||
|
msgid "Password Required"
|
||||||
|
msgstr "Se requiere contraseña"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156
|
||||||
|
msgid "Pick a number"
|
||||||
|
msgstr "Seleccione un número"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:79
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:84
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60
|
||||||
|
msgid "Placeholder"
|
||||||
|
msgstr "Marcador de posición"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1000
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
|
||||||
|
msgid "Radio"
|
||||||
|
msgstr "Radio"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:133
|
||||||
|
msgid "Radio values"
|
||||||
|
msgstr "Valores de radio"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:186
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:147
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:156
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:122
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:133
|
||||||
|
msgid "Read only"
|
||||||
|
msgstr "Solo lectura"
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-role-select.tsx:95
|
||||||
|
msgid "Receives copy"
|
||||||
|
msgstr "Recibe copia"
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:39
|
||||||
|
#: packages/ui/primitives/document-flow/add-settings.tsx:215
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:169
|
||||||
|
msgid "Recipient action authentication"
|
||||||
|
msgstr "Autenticación de acción de destinatario"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:384
|
||||||
|
msgid "Red"
|
||||||
|
msgstr "Rojo"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-settings.tsx:329
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:332
|
||||||
|
msgid "Redirect URL"
|
||||||
|
msgstr "URL de redirección"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1104
|
||||||
|
msgid "Remove"
|
||||||
|
msgstr "Eliminar"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:176
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:146
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:112
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:123
|
||||||
|
msgid "Required field"
|
||||||
|
msgstr "Campo obligatorio"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/data-table-pagination.tsx:55
|
||||||
|
msgid "Rows per page"
|
||||||
|
msgstr "Filas por página"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:355
|
||||||
|
msgid "Save"
|
||||||
|
msgstr "Guardar"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:848
|
||||||
|
msgid "Save Template"
|
||||||
|
msgstr "Guardar plantilla"
|
||||||
|
|
||||||
|
#: packages/ui/components/common/language-switcher-dialog.tsx:34
|
||||||
|
msgid "Search languages..."
|
||||||
|
msgstr "Buscar idiomas..."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:115
|
||||||
|
msgid "Select"
|
||||||
|
msgstr "Seleccionar"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/combobox.tsx:38
|
||||||
|
msgid "Select an option"
|
||||||
|
msgstr "Seleccionar una opción"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:139
|
||||||
|
msgid "Select at least"
|
||||||
|
msgstr "Seleccionar al menos"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:105
|
||||||
|
msgid "Select default option"
|
||||||
|
msgstr "Seleccionar opción predeterminada"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-subject.tsx:124
|
||||||
|
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:34
|
||||||
|
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:64
|
||||||
|
msgid "Send"
|
||||||
|
msgstr "Enviar"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:41
|
||||||
|
msgid "Send Document"
|
||||||
|
msgstr "Enviar documento"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-share-button.tsx:135
|
||||||
|
msgid "Share Signature Card"
|
||||||
|
msgstr "Compartir tarjeta de firma"
|
||||||
|
|
||||||
|
#: packages/lib/constants/template.ts:16
|
||||||
|
msgid "Share the Link"
|
||||||
|
msgstr "Compartir el enlace"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:680
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:655
|
||||||
|
msgid "Show advanced settings"
|
||||||
|
msgstr "Mostrar configuraciones avanzadas"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:20
|
||||||
|
msgid "Sign"
|
||||||
|
msgstr "Firmar"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:818
|
||||||
|
#: packages/ui/primitives/document-flow/add-signature.tsx:323
|
||||||
|
#: packages/ui/primitives/document-flow/field-icon.tsx:52
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
|
||||||
|
msgid "Signature"
|
||||||
|
msgstr "Firma"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:21
|
||||||
|
msgid "Signed"
|
||||||
|
msgstr "Firmado"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:23
|
||||||
|
msgid "Signer"
|
||||||
|
msgstr "Firmante"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:22
|
||||||
|
msgid "Signing"
|
||||||
|
msgstr "Firmando"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:34
|
||||||
|
msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
|
||||||
|
msgstr "Algunos firmantes no han sido asignados a un campo de firma. Asigne al menos 1 campo de firma a cada firmante antes de continuar."
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-share-button.tsx:51
|
||||||
|
msgid "Something went wrong"
|
||||||
|
msgstr "Algo salió mal"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/data-table.tsx:136
|
||||||
|
msgid "Something went wrong."
|
||||||
|
msgstr "Algo salió mal."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/document-flow-root.tsx:107
|
||||||
|
msgid "Step <0>{step} of {maxStep}</0>"
|
||||||
|
msgstr "Paso <0>{step} de {maxStep}</0>"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-subject.tsx:78
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:195
|
||||||
|
msgid "Subject <0>(Optional)</0>"
|
||||||
|
msgstr "Asunto <0>(Opcional)</0>"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-password-dialog.tsx:97
|
||||||
|
msgid "Submit"
|
||||||
|
msgstr "Enviar"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:134
|
||||||
|
msgid "Template title"
|
||||||
|
msgstr "Título de plantilla"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:948
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
|
||||||
|
msgid "Text"
|
||||||
|
msgstr "Texto"
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:44
|
||||||
|
msgid "The authentication required for recipients to sign fields"
|
||||||
|
msgstr "La autenticación requerida para que los destinatarios firmen campos"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-global-auth-action-select.tsx:68
|
||||||
|
msgid "The authentication required for recipients to sign the signature field."
|
||||||
|
msgstr "La autenticación requerida para que los destinatarios firmen el campo de firma."
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-global-auth-access-select.tsx:67
|
||||||
|
msgid "The authentication required for recipients to view the document."
|
||||||
|
msgstr "La autenticación requerida para que los destinatarios vean el documento."
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-send-email-message-helper.tsx:31
|
||||||
|
msgid "The document's name"
|
||||||
|
msgstr "El nombre del documento"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-password-dialog.tsx:52
|
||||||
|
msgid "The password you have entered is incorrect. Please try again."
|
||||||
|
msgstr "La contraseña que ha ingresado es incorrecta. Por favor, inténtelo de nuevo."
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-role-select.tsx:103
|
||||||
|
msgid "The recipient is not required to take any action and receives a copy of the document after it is completed."
|
||||||
|
msgstr "El destinatario no está obligado a tomar ninguna acción y recibe una copia del documento una vez completado."
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-role-select.tsx:60
|
||||||
|
msgid "The recipient is required to approve the document for it to be completed."
|
||||||
|
msgstr "El destinatario debe aprobar el documento para que se complete."
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-role-select.tsx:39
|
||||||
|
msgid "The recipient is required to sign the document for it to be completed."
|
||||||
|
msgstr "El destinatario debe firmar el documento para que se complete."
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-role-select.tsx:81
|
||||||
|
msgid "The recipient is required to view the document for it to be completed."
|
||||||
|
msgstr "El destinatario debe ver el documento para que se complete."
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-share-button.tsx:52
|
||||||
|
msgid "The sharing link could not be created at this time. Please try again."
|
||||||
|
msgstr "El enlace de compartición no se pudo crear en este momento. Por favor, inténtelo de nuevo."
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-share-button.tsx:47
|
||||||
|
msgid "The sharing link has been copied to your clipboard."
|
||||||
|
msgstr "El enlace de compartición ha sido copiado a su portapapeles."
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-send-email-message-helper.tsx:25
|
||||||
|
msgid "The signer's email"
|
||||||
|
msgstr "El correo electrónico del firmante"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-send-email-message-helper.tsx:19
|
||||||
|
msgid "The signer's name"
|
||||||
|
msgstr "El nombre del firmante"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-global-auth-action-select.tsx:72
|
||||||
|
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
||||||
|
msgstr "Esto se puede anular configurando los requisitos de autenticación directamente en cada destinatario en el siguiente paso."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:752
|
||||||
|
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
|
||||||
|
msgstr "Este documento ya ha sido enviado a este destinatario. Ya no puede editar a este destinatario."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-password-dialog.tsx:66
|
||||||
|
msgid "This document is password protected. Please enter the password to view the document."
|
||||||
|
msgstr "Este documento está protegido por contraseña. Por favor ingrese la contraseña para ver el documento."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:573
|
||||||
|
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
|
||||||
|
msgstr "Este campo no se puede modificar ni eliminar. Cuando comparta el enlace directo de esta plantilla o lo agregue a su perfil público, cualquiera que acceda podrá ingresar su nombre y correo electrónico, y completar los campos que se le hayan asignado."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1084
|
||||||
|
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
|
||||||
|
msgstr "Este destinatario ya no puede ser modificado ya que ha firmado un campo o completado el documento."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:165
|
||||||
|
#~ msgid "This signer has already received the document."
|
||||||
|
#~ msgstr "This signer has already received the document."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:194
|
||||||
|
msgid "This signer has already signed the document."
|
||||||
|
msgstr "Este firmante ya ha firmado el documento."
|
||||||
|
|
||||||
|
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:48
|
||||||
|
msgid "This will override any global settings."
|
||||||
|
msgstr "Esto anulará cualquier configuración global."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-settings.tsx:305
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:309
|
||||||
|
msgid "Time Zone"
|
||||||
|
msgstr "Zona horaria"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-settings.tsx:153
|
||||||
|
msgid "Title"
|
||||||
|
msgstr "Título"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1067
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
|
||||||
|
msgid "To proceed further, please set at least one value for the {0} field."
|
||||||
|
msgstr "Para continuar, por favor establezca al menos un valor para el campo {0}."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-subject.tsx:124
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "Actualizar"
|
||||||
|
|
||||||
|
#: packages/lib/constants/template.ts:13
|
||||||
|
msgid "Update the role and add fields as required for the direct recipient. The individual who uses the direct link will sign the document as the direct recipient."
|
||||||
|
msgstr "Actualizar el rol y agregar campos según sea necesario para el destinatario directo. La persona que utilice el enlace directo firmará el documento como destinatario directo."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-dropzone.tsx:168
|
||||||
|
msgid "Upgrade"
|
||||||
|
msgstr "Actualizar"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-dropzone.tsx:70
|
||||||
|
msgid "Upload Template Document"
|
||||||
|
msgstr "Cargar Documento Plantilla"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:132
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167
|
||||||
|
msgid "Validation"
|
||||||
|
msgstr "Validación"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:91
|
||||||
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:96
|
||||||
|
msgid "Value"
|
||||||
|
msgstr "Valor"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:26
|
||||||
|
msgid "View"
|
||||||
|
msgstr "Ver"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:27
|
||||||
|
msgid "Viewed"
|
||||||
|
msgstr "Visto"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:29
|
||||||
|
msgid "Viewer"
|
||||||
|
msgstr "Visor"
|
||||||
|
|
||||||
|
#: packages/lib/constants/recipient-roles.ts:28
|
||||||
|
msgid "Viewing"
|
||||||
|
msgstr "Viendo"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:280
|
||||||
|
#~ msgid "White"
|
||||||
|
#~ msgstr "White"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:44
|
||||||
|
msgid "You are about to send this document to the recipients. Are you sure you want to continue?"
|
||||||
|
msgstr "Está a punto de enviar este documento a los destinatarios. ¿Está seguro de que desea continuar?"
|
||||||
|
|
||||||
|
#: packages/ui/components/document/document-send-email-message-helper.tsx:11
|
||||||
|
msgid "You can use the following variables in your message:"
|
||||||
|
msgstr "Puede usar las siguientes variables en su mensaje:"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-dropzone.tsx:43
|
||||||
|
msgid "You cannot upload documents at this time."
|
||||||
|
msgstr "No puede cargar documentos en este momento."
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-dropzone.tsx:69
|
||||||
|
msgid "You have reached your document limit."
|
||||||
|
msgstr "Ha alcanzado su límite de documentos."
|
||||||
|
|
||||||
621
packages/lib/translations/es/marketing.po
Normal file
621
packages/lib/translations/es/marketing.po
Normal file
@ -0,0 +1,621 @@
|
|||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"POT-Creation-Date: 2024-07-24 13:01+1000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"X-Generator: @lingui/cli\n"
|
||||||
|
"Language: es\n"
|
||||||
|
"Project-Id-Version: documenso-app\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"PO-Revision-Date: 2024-10-22 02:25\n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: Spanish\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
"X-Crowdin-Project: documenso-app\n"
|
||||||
|
"X-Crowdin-Project-ID: 694691\n"
|
||||||
|
"X-Crowdin-Language: es-ES\n"
|
||||||
|
"X-Crowdin-File: marketing.po\n"
|
||||||
|
"X-Crowdin-File-ID: 6\n"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/blog/page.tsx:45
|
||||||
|
msgid "{0}"
|
||||||
|
msgstr "{0}"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:100
|
||||||
|
msgid "5 standard documents per month"
|
||||||
|
msgstr "5 documentos estándar por mes"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:198
|
||||||
|
msgid "5 Users Included"
|
||||||
|
msgstr "5 Usuarios incluidos"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:34
|
||||||
|
msgid "A 10x better signing experience."
|
||||||
|
msgstr "Una experiencia de firma 10 veces mejor."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/singleplayer/client.tsx:51
|
||||||
|
msgid "Add document"
|
||||||
|
msgstr "Agregar documento"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:201
|
||||||
|
msgid "Add More Users for {0}"
|
||||||
|
msgstr "Agregar más usuarios por {0}"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:165
|
||||||
|
msgid "All our metrics, finances, and learnings are public. We believe in transparency and want to share our journey with you. You can read more about why here: <0>Announcing Open Metrics</0>"
|
||||||
|
msgstr "Todos nuestros métricas, finanzas y aprendizajes son públicos. Creemos en la transparencia y queremos compartir nuestro viaje contigo. Puedes leer más sobre por qué aquí: <0>Anunciando Métricas Abiertas</0>"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:58
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:65
|
||||||
|
msgid "Amount Raised"
|
||||||
|
msgstr "Monto recaudado"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:145
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:189
|
||||||
|
msgid "API Access"
|
||||||
|
msgstr "Acceso a API"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:67
|
||||||
|
msgid "Beautiful."
|
||||||
|
msgstr "Hermoso."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:69
|
||||||
|
msgid "Because signing should be celebrated. That’s why we care about the smallest detail in our product."
|
||||||
|
msgstr "Porque la firma debe ser celebrada. Por eso nos importa el más mínimo detalle en nuestro producto."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/footer.tsx:35
|
||||||
|
#: apps/marketing/src/components/(marketing)/header.tsx:57
|
||||||
|
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:36
|
||||||
|
msgid "Blog"
|
||||||
|
msgstr "Blog"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:64
|
||||||
|
msgid "Build on top."
|
||||||
|
msgstr "Construir sobre."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:163
|
||||||
|
msgid "Can I use Documenso commercially?"
|
||||||
|
msgstr "¿Puedo usar Documenso comercialmente?"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/footer.tsx:42
|
||||||
|
msgid "Careers"
|
||||||
|
msgstr "Carreras"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/footer.tsx:36
|
||||||
|
msgid "Changelog"
|
||||||
|
msgstr "Registro de cambios"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:85
|
||||||
|
msgid "Choose a template from the community app store. Or submit your own template for others to use."
|
||||||
|
msgstr "Elige una plantilla de la tienda de aplicaciones de la comunidad. O envía tu propia plantilla para que otros la usen."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:219
|
||||||
|
msgid "Community"
|
||||||
|
msgstr "Comunidad"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx:55
|
||||||
|
msgid "Completed Documents"
|
||||||
|
msgstr "Documentos Completados"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx:33
|
||||||
|
msgid "Completed Documents per Month"
|
||||||
|
msgstr "Documentos Completados por Mes"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:65
|
||||||
|
msgid "Connections"
|
||||||
|
msgstr "Conexiones"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/enterprise.tsx:35
|
||||||
|
msgid "Contact Us"
|
||||||
|
msgstr "Contáctanos"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:67
|
||||||
|
msgid "Create connections and automations with Zapier and more to integrate with your favorite tools."
|
||||||
|
msgstr "Crea conexiones y automatizaciones con Zapier y más para integrarte con tus herramientas favoritas."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/call-to-action.tsx:23
|
||||||
|
msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
||||||
|
msgstr "Crea tu cuenta y comienza a usar la firma de documentos de última generación. La firma abierta y hermosa está a tu alcance."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/tooltip.tsx:35
|
||||||
|
msgid "Customers with an Active Subscriptions."
|
||||||
|
msgstr "Clientes con suscripciones activas."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:33
|
||||||
|
msgid "Customise and expand."
|
||||||
|
msgstr "Personaliza y expande."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/footer.tsx:38
|
||||||
|
msgid "Design"
|
||||||
|
msgstr "Diseño"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:44
|
||||||
|
msgid "Designed for every stage of your journey."
|
||||||
|
msgstr "Diseñado para cada etapa de tu viaje."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/carousel.tsx:40
|
||||||
|
msgid "Direct Link"
|
||||||
|
msgstr "Enlace Directo"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:181
|
||||||
|
msgid "Documenso is a community effort to create an open and vibrant ecosystem around a tool, everybody is free to use and adapt. By being truly open we want to create trusted infrastructure for the future of the internet."
|
||||||
|
msgstr "Documenso es un esfuerzo comunitario para crear un ecosistema abierto y vibrante alrededor de una herramienta que todos son libres de usar y adaptar. Al ser verdaderamente abierto, queremos crear una infraestructura confiable para el futuro de internet."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/typefully.tsx:28
|
||||||
|
msgid "Documenso on X"
|
||||||
|
msgstr "Documenso en X"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/hero.tsx:104
|
||||||
|
msgid "Document signing,<0/>finally open source."
|
||||||
|
msgstr "Firma de documentos,<0/>finalmente código abierto."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/footer.tsx:33
|
||||||
|
#: apps/marketing/src/components/(marketing)/header.tsx:50
|
||||||
|
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:28
|
||||||
|
msgid "Documentation"
|
||||||
|
msgstr "Documentación"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:110
|
||||||
|
msgid "Easily embed Documenso into your product. Simply copy and paste our react widget into your application."
|
||||||
|
msgstr "Incrusta fácilmente Documenso en tu producto. Simplemente copia y pega nuestro widget de react en tu aplicación."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:42
|
||||||
|
#~ msgid "Easy Sharing (Soon)."
|
||||||
|
#~ msgstr "Easy Sharing (Soon)."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:46
|
||||||
|
msgid "Easy Sharing."
|
||||||
|
msgstr "Compartición fácil."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:148
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:192
|
||||||
|
msgid "Email and Discord Support"
|
||||||
|
msgstr "Soporte por correo electrónico y Discord"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:43
|
||||||
|
msgid "Engagement"
|
||||||
|
msgstr "Compromiso"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/singleplayer/client.tsx:64
|
||||||
|
msgid "Enter your details."
|
||||||
|
msgstr "Ingresa tus detalles."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/enterprise.tsx:16
|
||||||
|
msgid "Enterprise Compliance, License or Technical Needs?"
|
||||||
|
msgstr "¿Cumplimiento, licencia o necesidades técnicas de la empresa?"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:128
|
||||||
|
msgid "Everything you need for a great signing experience."
|
||||||
|
msgstr "Todo lo que necesitas para una gran experiencia de firma."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:45
|
||||||
|
msgid "Fast."
|
||||||
|
msgstr "Rápido."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:36
|
||||||
|
msgid "Faster, smarter and more beautiful."
|
||||||
|
msgstr "Más rápido, más inteligente y más hermoso."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:210
|
||||||
|
msgid "Finances"
|
||||||
|
msgstr "Finanzas"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/typefully.tsx:38
|
||||||
|
msgid "Follow us on X"
|
||||||
|
msgstr "Síguenos en X"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:172
|
||||||
|
msgid "For companies looking to scale across multiple teams."
|
||||||
|
msgstr "Para empresas que buscan escalar en múltiples equipos."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:85
|
||||||
|
msgid "For small teams and individuals with basic needs."
|
||||||
|
msgstr "Para pequeños equipos e individuos con necesidades básicas."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:80
|
||||||
|
msgid "Free"
|
||||||
|
msgstr "Gratis"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/blog/page.tsx:26
|
||||||
|
msgid "From the blog"
|
||||||
|
msgstr "Del blog"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/data.ts:9
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/data.ts:17
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/data.ts:25
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/data.ts:33
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/data.ts:41
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/data.ts:49
|
||||||
|
msgid "Full-Time"
|
||||||
|
msgstr "A tiempo completo"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:87
|
||||||
|
msgid "Get paid (Soon)."
|
||||||
|
msgstr "Recibe pago (Pronto)."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/call-to-action.tsx:31
|
||||||
|
msgid "Get started"
|
||||||
|
msgstr "Empezar"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:75
|
||||||
|
msgid "Get Started"
|
||||||
|
msgstr "Comienza"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:47
|
||||||
|
msgid "Get started today."
|
||||||
|
msgstr "Comienza hoy."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/blog/page.tsx:30
|
||||||
|
msgid "Get the latest news from Documenso, including product updates, team announcements and more!"
|
||||||
|
msgstr "¡Obtén las últimas noticias de Documenso, incluidas actualizaciones de productos, anuncios del equipo y más!"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:233
|
||||||
|
msgid "GitHub: Total Merged PRs"
|
||||||
|
msgstr "GitHub: Total de PRs fusionados"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:251
|
||||||
|
msgid "GitHub: Total Open Issues"
|
||||||
|
msgstr "GitHub: Total de problemas abiertos"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:225
|
||||||
|
msgid "GitHub: Total Stars"
|
||||||
|
msgstr "GitHub: Total de estrellas"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:23
|
||||||
|
msgid "Global Salary Bands"
|
||||||
|
msgstr "Bandas salariales globales"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:261
|
||||||
|
msgid "Growth"
|
||||||
|
msgstr "Crecimiento"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:134
|
||||||
|
msgid "How can I contribute?"
|
||||||
|
msgstr "¿Cómo puedo contribuir?"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:105
|
||||||
|
msgid "How do you handle my data?"
|
||||||
|
msgstr "¿Cómo manejan mis datos?"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:118
|
||||||
|
msgid "Individual"
|
||||||
|
msgstr "Individual"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:89
|
||||||
|
msgid "Integrated payments with Stripe so you don’t have to worry about getting paid."
|
||||||
|
msgstr "Pagos integrados con Stripe para que no tengas que preocuparte por cobrar."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:35
|
||||||
|
msgid "Integrates with all your favourite tools."
|
||||||
|
msgstr "Se integra con todas tus herramientas favoritas."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:289
|
||||||
|
msgid "Is there more?"
|
||||||
|
msgstr "¿Hay más?"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:44
|
||||||
|
msgid "It’s up to you. Either clone our repository or rely on our easy to use hosting solution."
|
||||||
|
msgstr "Depende de ti. O bien clona nuestro repositorio o confía en nuestra solución de hosting fácil de usar."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:49
|
||||||
|
msgid "Join Date"
|
||||||
|
msgstr "Fecha de ingreso"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/call-to-action.tsx:19
|
||||||
|
msgid "Join the Open Signing Movement"
|
||||||
|
msgstr "Únete al Movimiento de Firma Abierta"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:46
|
||||||
|
msgid "Location"
|
||||||
|
msgstr "Ubicación"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:66
|
||||||
|
msgid "Make it your own through advanced customization and adjustability."
|
||||||
|
msgstr "Hazlo tuyo a través de personalización y ajustabilidad avanzadas."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:199
|
||||||
|
msgid "Merged PR's"
|
||||||
|
msgstr "PRs fusionados"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:234
|
||||||
|
msgid "Merged PRs"
|
||||||
|
msgstr "PRs fusionados"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:40
|
||||||
|
msgid "Monthly"
|
||||||
|
msgstr "Mensual"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:34
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Nombre"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:30
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:43
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx:52
|
||||||
|
msgid "New Users"
|
||||||
|
msgstr "Nuevos Usuarios"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:106
|
||||||
|
msgid "No credit card required"
|
||||||
|
msgstr "No se requiere tarjeta de crédito"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/callout.tsx:29
|
||||||
|
#: apps/marketing/src/components/(marketing)/hero.tsx:125
|
||||||
|
msgid "No Credit Card required"
|
||||||
|
msgstr "No se requiere tarjeta de crédito"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:61
|
||||||
|
msgid "None of these work for you? Try self-hosting!"
|
||||||
|
msgstr "¿Ninguna de estas opciones funciona para ti? ¡Prueba el autoalojamiento!"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:194
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:252
|
||||||
|
msgid "Open Issues"
|
||||||
|
msgstr "Problemas Abiertos"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:42
|
||||||
|
msgid "Open Source or Hosted."
|
||||||
|
msgstr "Código Abierto o Alojado."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:161
|
||||||
|
#: apps/marketing/src/components/(marketing)/footer.tsx:37
|
||||||
|
#: apps/marketing/src/components/(marketing)/header.tsx:64
|
||||||
|
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:40
|
||||||
|
msgid "Open Startup"
|
||||||
|
msgstr "Startup Abierta"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/footer.tsx:41
|
||||||
|
msgid "OSS Friends"
|
||||||
|
msgstr "Amigos OSS"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:91
|
||||||
|
msgid "Our custom templates come with smart rules that can help you save time and energy."
|
||||||
|
msgstr "Nuestras plantillas personalizadas vienen con reglas inteligentes que pueden ayudarte a ahorrar tiempo y energía."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/enterprise.tsx:20
|
||||||
|
msgid "Our Enterprise License is great for large organizations looking to switch to Documenso for all their signing needs. It's available for our cloud offering as well as self-hosted setups and offers a wide range of compliance and Adminstration Features."
|
||||||
|
msgstr "Nuestra Licencia Empresarial es excelente para grandes organizaciones que buscan cambiar a Documenso para todas sus necesidades de firma. Está disponible para nuestra oferta en la nube, así como para configuraciones autoalojadas y ofrece una amplia gama de funciones de cumplimiento y administración."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/enterprise.tsx:20
|
||||||
|
#~ msgid "Our Enterprise License is great large organizations looking to switch to Documenso for all their signing needs. It's availible for our cloud offering as well as self-hosted setups and offer a wide range of compliance and Adminstration Features."
|
||||||
|
#~ msgstr "Our Enterprise License is great large organizations looking to switch to Documenso for all their signing needs. It's availible for our cloud offering as well as self-hosted setups and offer a wide range of compliance and Adminstration Features."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:65
|
||||||
|
msgid "Our self-hosted option is great for small teams and individuals who need a simple solution. You can use our docker based setup to get started in minutes. Take control with full customizability and data ownership."
|
||||||
|
msgstr "Nuestra opción de autoalojamiento es excelente para pequeños equipos e individuos que necesitan una solución simple. Puedes usar nuestra configuración basada en docker para empezar en minutos. Toma el control con total personalización y propiedad de los datos."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/data.ts:25
|
||||||
|
#~ msgid "Part-Time"
|
||||||
|
#~ msgstr "Part-Time"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:151
|
||||||
|
msgid "Premium Profile Name"
|
||||||
|
msgstr "Nombre de Perfil Premium"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:40
|
||||||
|
#: apps/marketing/src/components/(marketing)/footer.tsx:31
|
||||||
|
#: apps/marketing/src/components/(marketing)/header.tsx:42
|
||||||
|
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:24
|
||||||
|
msgid "Pricing"
|
||||||
|
msgstr "Precios"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/footer.tsx:43
|
||||||
|
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:53
|
||||||
|
msgid "Privacy"
|
||||||
|
msgstr "Privacidad"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/carousel.tsx:58
|
||||||
|
msgid "Profile"
|
||||||
|
msgstr "Perfil"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:108
|
||||||
|
msgid "React Widget (Soon)."
|
||||||
|
msgstr "Widget de React (Pronto)."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:48
|
||||||
|
msgid "Receive your personal link to share with everyone you care about."
|
||||||
|
msgstr "Recibe tu enlace personal para compartirlo con todos los que te importan."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:37
|
||||||
|
msgid "Role"
|
||||||
|
msgstr "Rol"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:37
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:40
|
||||||
|
msgid "Salary"
|
||||||
|
msgstr "Salario"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:62
|
||||||
|
msgid "Save $60 or $120"
|
||||||
|
msgstr "Ahorra $60 o $120"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/i18n-switcher.tsx:47
|
||||||
|
#~ msgid "Search languages..."
|
||||||
|
#~ msgstr "Search languages..."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:109
|
||||||
|
msgid "Securely. Our data centers are located in Frankfurt (Germany), giving us the best local privacy laws. We are very aware of the sensitive nature of our data and follow best practices to ensure the security and integrity of the data entrusted to us."
|
||||||
|
msgstr "De manera segura. Nuestros centros de datos están ubicados en Frankfurt (Alemania), dándonos las mejores leyes de privacidad locales. Somos muy conscientes de la naturaleza sensible de nuestros datos y seguimos las mejores prácticas para garantizar la seguridad y la integridad de los datos que se nos confían."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/share-connect-paid-widget-bento.tsx:37
|
||||||
|
msgid "Send, connect, receive and embed everywhere."
|
||||||
|
msgstr "Enviar, conectar, recibir e incrustar en todas partes."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:34
|
||||||
|
msgid "Seniority"
|
||||||
|
msgstr "Antigüedad"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/footer.tsx:39
|
||||||
|
msgid "Shop"
|
||||||
|
msgstr "Tienda"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/singleplayer/client.tsx:63
|
||||||
|
msgid "Sign"
|
||||||
|
msgstr "Firmar"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/header.tsx:72
|
||||||
|
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:61
|
||||||
|
msgid "Sign in"
|
||||||
|
msgstr "Iniciar sesión"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/header.tsx:77
|
||||||
|
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:57
|
||||||
|
msgid "Sign up"
|
||||||
|
msgstr "Registrarse"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/carousel.tsx:22
|
||||||
|
msgid "Signing Process"
|
||||||
|
msgstr "Proceso de firma"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:94
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:136
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:180
|
||||||
|
msgid "Signup Now"
|
||||||
|
msgstr "Regístrate ahora"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:89
|
||||||
|
msgid "Smart."
|
||||||
|
msgstr "Inteligente."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/hero.tsx:132
|
||||||
|
msgid "Star on GitHub"
|
||||||
|
msgstr "Estrella en GitHub"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:226
|
||||||
|
msgid "Stars"
|
||||||
|
msgstr "Estrellas"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/footer.tsx:40
|
||||||
|
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:44
|
||||||
|
msgid "Status"
|
||||||
|
msgstr "Estado"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/footer.tsx:34
|
||||||
|
#: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:48
|
||||||
|
msgid "Support"
|
||||||
|
msgstr "Soporte"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/team-members.tsx:26
|
||||||
|
msgid "Team"
|
||||||
|
msgstr "Equipo"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:195
|
||||||
|
msgid "Team Inbox"
|
||||||
|
msgstr "Bandeja de entrada del equipo"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/carousel.tsx:28
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:162
|
||||||
|
msgid "Teams"
|
||||||
|
msgstr "Equipos"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:83
|
||||||
|
msgid "Template Store (Soon)."
|
||||||
|
msgstr "Tienda de Plantillas (Pronto)."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:138
|
||||||
|
msgid "That's awesome. You can take a look at the current <0>Issues</0> and join our <1>Discord Community</1> to keep up to date, on what the current priorities are. In any case, we are an open community and welcome all input, technical and non-technical ❤️"
|
||||||
|
msgstr "Eso es increíble. Puedes echar un vistazo a los <0>Problemas</0> actuales y unirte a nuestra <1>Comunidad de Discord</1> para mantenerte al día sobre cuáles son las prioridades actuales. En cualquier caso, somos una comunidad abierta y agradecemos todas las aportaciones, técnicas y no técnicas ❤️"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:293
|
||||||
|
msgid "This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share."
|
||||||
|
msgstr "Esta página está evolucionando a medida que aprendemos lo que hace una gran empresa de firmas. La actualizaremos cuando tengamos más para compartir."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/salary-bands.tsx:31
|
||||||
|
msgid "Title"
|
||||||
|
msgstr "Título"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx:30
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx:55
|
||||||
|
msgid "Total Completed Documents"
|
||||||
|
msgstr "Total de Documentos Completados"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:267
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/page.tsx:268
|
||||||
|
msgid "Total Customers"
|
||||||
|
msgstr "Total de Clientes"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/funding-raised.tsx:29
|
||||||
|
msgid "Total Funding Raised"
|
||||||
|
msgstr "Total de Fondos Recaudados"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:30
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:43
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx:52
|
||||||
|
msgid "Total Users"
|
||||||
|
msgstr "Total de Usuarios"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/open-build-template-bento.tsx:31
|
||||||
|
msgid "Truly your own."
|
||||||
|
msgstr "Realmente tuyo."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/callout.tsx:27
|
||||||
|
#: apps/marketing/src/components/(marketing)/hero.tsx:123
|
||||||
|
msgid "Try our Free Plan"
|
||||||
|
msgstr "Prueba nuestro Plan Gratuito"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/typefully.tsx:20
|
||||||
|
msgid "Twitter Stats"
|
||||||
|
msgstr "Estadísticas de Twitter"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:142
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:186
|
||||||
|
msgid "Unlimited Documents per Month"
|
||||||
|
msgstr "Documentos ilimitados por mes"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:103
|
||||||
|
msgid "Up to 10 recipients per document"
|
||||||
|
msgstr "Hasta 10 destinatarios por documento"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/singleplayer/client.tsx:52
|
||||||
|
msgid "Upload a document and add fields."
|
||||||
|
msgstr "Sube un documento y agrega campos."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:123
|
||||||
|
msgid "Using our hosted version is the easiest way to get started, you can simply subscribe and start signing your documents. We take care of the infrastructure, so you can focus on your business. Additionally, when using our hosted version you benefit from our trusted signing certificates which helps you to build trust with your customers."
|
||||||
|
msgstr "Usar nuestra versión alojada es la forma más fácil de comenzar, simplemente puedes suscribirte y comenzar a firmar tus documentos. Nos ocupamos de la infraestructura, para que puedas concentrarte en tu negocio. Además, al utilizar nuestra versión alojada, te beneficias de nuestros certificados de firma confiables, lo que te ayuda a generar confianza con tus clientes."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/open/typefully.tsx:33
|
||||||
|
msgid "View all stats"
|
||||||
|
msgstr "Ver todas las estadísticas"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:195
|
||||||
|
msgid "We are happy to assist you at <0>support@documenso.com</0> or <1>in our Discord-Support-Channel</1> please message either Lucas or Timur to get added to the channel if you are not already a member."
|
||||||
|
msgstr "Estamos felices de ayudarte en <0>support@documenso.com</0> o <1>en nuestro canal de soporte de Discord</1>. Mensaje a Lucas o Timur para que te agreguen al canal si aún no eres miembro."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:89
|
||||||
|
msgid "What is the difference between the plans?"
|
||||||
|
msgstr "¿Cuál es la diferencia entre los planes?"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/faster-smarter-beautiful-bento.tsx:47
|
||||||
|
msgid "When it comes to sending or receiving a contract, you can count on lightning-fast speeds."
|
||||||
|
msgstr "Cuando se trata de enviar o recibir un contrato, puedes contar con velocidades ultrarrápidas."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:191
|
||||||
|
msgid "Where can I get support?"
|
||||||
|
msgstr "¿Dónde puedo obtener soporte?"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:177
|
||||||
|
msgid "Why should I prefer Documenso over DocuSign or some other signing tool?"
|
||||||
|
msgstr "¿Por qué debería preferir Documenso sobre DocuSign u otra herramienta de firma?"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:119
|
||||||
|
msgid "Why should I use your hosting service?"
|
||||||
|
msgstr "¿Por qué debería usar su servicio de alojamiento?"
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/pricing-table.tsx:60
|
||||||
|
msgid "Yearly"
|
||||||
|
msgstr "Anual"
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:167
|
||||||
|
msgid "Yes! Documenso is offered under the GNU AGPL V3 open source license. This means you can use it for free and even modify it to fit your needs, as long as you publish your changes under the same license."
|
||||||
|
msgstr "¡Sí! Documenso se ofrece bajo la licencia de código abierto GNU AGPL V3. Esto significa que puedes usarlo de forma gratuita e incluso modificarlo para adaptarlo a tus necesidades, siempre que publiques tus cambios bajo la misma licencia."
|
||||||
|
|
||||||
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:93
|
||||||
|
msgid "You can self-host Documenso for free or use our ready-to-use hosted version. The hosted version comes with additional support, painless scalability and more. Early adopters will get access to all features we build this year, for no additional cost! Forever! Yes, that includes multiple users per account later. If you want Documenso for your enterprise, we are happy to talk about your needs."
|
||||||
|
msgstr "Puedes autoalojar Documenso de forma gratuita o usar nuestra versión alojada lista para usar. La versión alojada viene con soporte adicional, escalabilidad sin problemas y más. Los primeros adoptantes tendrán acceso a todas las funciones que construimos este año, sin costo adicional. ¡Para siempre! Sí, eso incluye múltiples usuarios por cuenta más adelante. Si quieres Documenso para tu empresa, estaremos encantados de hablar sobre tus necesidades."
|
||||||
|
|
||||||
|
#: apps/marketing/src/components/(marketing)/carousel.tsx:272
|
||||||
|
msgid "Your browser does not support the video tag."
|
||||||
|
msgstr "Tu navegador no soporta la etiqueta de video."
|
||||||
|
|
||||||
4500
packages/lib/translations/es/web.po
Normal file
4500
packages/lib/translations/es/web.po
Normal file
File diff suppressed because it is too large
Load Diff
@ -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: 2024-10-08 12:05\n"
|
"PO-Revision-Date: 2024-10-18 04:04\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"
|
||||||
@ -115,7 +115,7 @@ msgstr "Administrateur"
|
|||||||
msgid "Advanced Options"
|
msgid "Advanced Options"
|
||||||
msgstr "Options avancées"
|
msgstr "Options avancées"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:565
|
#: packages/ui/primitives/document-flow/add-fields.tsx:570
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
|
||||||
msgid "Advanced settings"
|
msgid "Advanced settings"
|
||||||
msgstr "Paramètres avancés"
|
msgstr "Paramètres avancés"
|
||||||
@ -140,11 +140,11 @@ msgstr "Approuveur"
|
|||||||
msgid "Approving"
|
msgid "Approving"
|
||||||
msgstr "En attente d'approbation"
|
msgstr "En attente d'approbation"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:276
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
|
||||||
msgid "Black"
|
msgid "Black"
|
||||||
msgstr "Noir"
|
msgstr "Noir"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:290
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:391
|
||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr "Bleu"
|
msgstr "Bleu"
|
||||||
|
|
||||||
@ -178,7 +178,7 @@ msgstr "CC'd"
|
|||||||
msgid "Character Limit"
|
msgid "Character Limit"
|
||||||
msgstr "Limite de caractères"
|
msgstr "Limite de caractères"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:993
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1026
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
|
||||||
msgid "Checkbox"
|
msgid "Checkbox"
|
||||||
msgstr "Case à cocher"
|
msgstr "Case à cocher"
|
||||||
@ -191,7 +191,7 @@ msgstr "Valeurs de case à cocher"
|
|||||||
msgid "Clear filters"
|
msgid "Clear filters"
|
||||||
msgstr "Effacer les filtres"
|
msgstr "Effacer les filtres"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:310
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:411
|
||||||
msgid "Clear Signature"
|
msgid "Clear Signature"
|
||||||
msgstr "Effacer la signature"
|
msgstr "Effacer la signature"
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ msgstr "Fermer"
|
|||||||
msgid "Configure Direct Recipient"
|
msgid "Configure Direct Recipient"
|
||||||
msgstr "Configurer le destinataire direct"
|
msgstr "Configurer le destinataire direct"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:566
|
#: packages/ui/primitives/document-flow/add-fields.tsx:571
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
|
||||||
msgid "Configure the {0} field"
|
msgid "Configure the {0} field"
|
||||||
msgstr "Configurer le champ {0}"
|
msgstr "Configurer le champ {0}"
|
||||||
@ -224,7 +224,7 @@ msgstr "Copié dans le presse-papiers"
|
|||||||
msgid "Custom Text"
|
msgid "Custom Text"
|
||||||
msgstr "Texte personnalisé"
|
msgstr "Texte personnalisé"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:889
|
#: packages/ui/primitives/document-flow/add-fields.tsx:922
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr "Date"
|
msgstr "Date"
|
||||||
@ -256,7 +256,7 @@ msgstr "Télécharger"
|
|||||||
msgid "Drag & drop your PDF here."
|
msgid "Drag & drop your PDF here."
|
||||||
msgstr "Faites glisser et déposez votre PDF ici."
|
msgstr "Faites glisser et déposez votre PDF ici."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1019
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1052
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
|
||||||
msgid "Dropdown"
|
msgid "Dropdown"
|
||||||
msgstr "Liste déroulante"
|
msgstr "Liste déroulante"
|
||||||
@ -265,7 +265,7 @@ msgstr "Liste déroulante"
|
|||||||
msgid "Dropdown options"
|
msgid "Dropdown options"
|
||||||
msgstr "Options de liste déroulante"
|
msgstr "Options de liste déroulante"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:837
|
#: packages/ui/primitives/document-flow/add-fields.tsx:870
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:272
|
#: packages/ui/primitives/document-flow/add-signature.tsx:272
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:500
|
#: packages/ui/primitives/document-flow/add-signers.tsx:500
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
|
||||||
@ -278,7 +278,7 @@ msgstr "Email"
|
|||||||
msgid "Email Options"
|
msgid "Email Options"
|
||||||
msgstr "Options d'email"
|
msgstr "Options d'email"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1082
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1117
|
||||||
msgid "Empty field"
|
msgid "Empty field"
|
||||||
msgstr "Champ vide"
|
msgstr "Champ vide"
|
||||||
|
|
||||||
@ -291,6 +291,10 @@ msgstr "Activer la signature de lien direct"
|
|||||||
msgid "Enable signing order"
|
msgid "Enable signing order"
|
||||||
msgstr "Activer l'ordre de signature"
|
msgstr "Activer l'ordre de signature"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-fields.tsx:790
|
||||||
|
msgid "Enable Typed Signatures"
|
||||||
|
msgstr "Activer les signatures tapées"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-password-dialog.tsx:84
|
#: packages/ui/primitives/document-password-dialog.tsx:84
|
||||||
msgid "Enter password"
|
msgid "Enter password"
|
||||||
msgstr "Entrez le mot de passe"
|
msgstr "Entrez le mot de passe"
|
||||||
@ -319,7 +323,7 @@ msgstr "Limite de caractères du champ"
|
|||||||
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130
|
||||||
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107
|
||||||
msgid "Field font size"
|
msgid "Field font size"
|
||||||
msgstr ""
|
msgstr "Taille de police du champ"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:110
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:110
|
||||||
msgid "Field format"
|
msgid "Field format"
|
||||||
@ -340,7 +344,7 @@ msgstr "Espace réservé du champ"
|
|||||||
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124
|
||||||
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101
|
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101
|
||||||
msgid "Font Size"
|
msgid "Font Size"
|
||||||
msgstr ""
|
msgstr "Taille de Police"
|
||||||
|
|
||||||
#: packages/ui/components/document/document-global-auth-action-select.tsx:64
|
#: packages/ui/components/document/document-global-auth-action-select.tsx:64
|
||||||
msgid "Global recipient action authentication"
|
msgid "Global recipient action authentication"
|
||||||
@ -350,7 +354,7 @@ msgstr "Authentification d'action de destinataire globale"
|
|||||||
msgid "Go Back"
|
msgid "Go Back"
|
||||||
msgstr "Retourner"
|
msgstr "Retourner"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:297
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:398
|
||||||
msgid "Green"
|
msgid "Green"
|
||||||
msgstr "Vert"
|
msgstr "Vert"
|
||||||
|
|
||||||
@ -406,7 +410,7 @@ msgstr "Message <0>(Optionnel)</0>"
|
|||||||
msgid "Min"
|
msgid "Min"
|
||||||
msgstr "Min"
|
msgstr "Min"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:863
|
#: packages/ui/primitives/document-flow/add-fields.tsx:896
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:298
|
#: packages/ui/primitives/document-flow/add-signature.tsx:298
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:535
|
#: packages/ui/primitives/document-flow/add-signers.tsx:535
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:541
|
#: packages/ui/primitives/document-flow/add-signers.tsx:541
|
||||||
@ -428,12 +432,12 @@ msgstr "Nécessite une signature"
|
|||||||
msgid "Needs to view"
|
msgid "Needs to view"
|
||||||
msgstr "Nécessite une visualisation"
|
msgstr "Nécessite une visualisation"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:674
|
#: packages/ui/primitives/document-flow/add-fields.tsx:680
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
|
||||||
msgid "No recipient matching this description was found."
|
msgid "No recipient matching this description was found."
|
||||||
msgstr "Aucun destinataire correspondant à cette description n'a été trouvé."
|
msgstr "Aucun destinataire correspondant à cette description n'a été trouvé."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:690
|
#: packages/ui/primitives/document-flow/add-fields.tsx:696
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
|
||||||
msgid "No recipients with this role"
|
msgid "No recipients with this role"
|
||||||
msgstr "Aucun destinataire avec ce rôle"
|
msgstr "Aucun destinataire avec ce rôle"
|
||||||
@ -458,7 +462,7 @@ msgstr "Aucun champ de signature trouvé"
|
|||||||
msgid "No value found."
|
msgid "No value found."
|
||||||
msgstr "Aucune valeur trouvée."
|
msgstr "Aucune valeur trouvée."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:941
|
#: packages/ui/primitives/document-flow/add-fields.tsx:974
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
|
||||||
msgid "Number"
|
msgid "Number"
|
||||||
msgstr "Numéro"
|
msgstr "Numéro"
|
||||||
@ -493,7 +497,7 @@ msgstr "Choisissez un numéro"
|
|||||||
msgid "Placeholder"
|
msgid "Placeholder"
|
||||||
msgstr "Espace réservé"
|
msgstr "Espace réservé"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:967
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1000
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
|
||||||
msgid "Radio"
|
msgid "Radio"
|
||||||
msgstr "Radio"
|
msgstr "Radio"
|
||||||
@ -520,7 +524,7 @@ msgstr "Recevoir une copie"
|
|||||||
msgid "Recipient action authentication"
|
msgid "Recipient action authentication"
|
||||||
msgstr "Authentification d'action de destinataire"
|
msgstr "Authentification d'action de destinataire"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:283
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:384
|
||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr "Rouge"
|
msgstr "Rouge"
|
||||||
|
|
||||||
@ -529,7 +533,7 @@ msgstr "Rouge"
|
|||||||
msgid "Redirect URL"
|
msgid "Redirect URL"
|
||||||
msgstr "URL de redirection"
|
msgstr "URL de redirection"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1069
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1104
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Retirer"
|
msgstr "Retirer"
|
||||||
|
|
||||||
@ -600,7 +604,7 @@ msgstr "Afficher les paramètres avancés"
|
|||||||
msgid "Sign"
|
msgid "Sign"
|
||||||
msgstr "Signer"
|
msgstr "Signer"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:785
|
#: packages/ui/primitives/document-flow/add-fields.tsx:818
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:323
|
#: packages/ui/primitives/document-flow/add-signature.tsx:323
|
||||||
#: packages/ui/primitives/document-flow/field-icon.tsx:52
|
#: packages/ui/primitives/document-flow/field-icon.tsx:52
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
|
||||||
@ -648,7 +652,7 @@ msgstr "Soumettre"
|
|||||||
msgid "Template title"
|
msgid "Template title"
|
||||||
msgstr "Titre du modèle"
|
msgstr "Titre du modèle"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:915
|
#: packages/ui/primitives/document-flow/add-fields.tsx:948
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
|
||||||
msgid "Text"
|
msgid "Text"
|
||||||
msgstr "Texte"
|
msgstr "Texte"
|
||||||
@ -709,7 +713,7 @@ msgstr "Le nom du signataire"
|
|||||||
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
||||||
msgstr "Cela peut être remplacé par le paramétrage direct des exigences d'authentification pour chaque destinataire à l'étape suivante."
|
msgstr "Cela peut être remplacé par le paramétrage direct des exigences d'authentification pour chaque destinataire à l'étape suivante."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:746
|
#: packages/ui/primitives/document-flow/add-fields.tsx:752
|
||||||
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
|
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
|
||||||
msgstr "Ce document a déjà été envoyé à ce destinataire. Vous ne pouvez plus modifier ce destinataire."
|
msgstr "Ce document a déjà été envoyé à ce destinataire. Vous ne pouvez plus modifier ce destinataire."
|
||||||
|
|
||||||
@ -721,7 +725,7 @@ msgstr "Ce document est protégé par mot de passe. Veuillez entrer le mot de pa
|
|||||||
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
|
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
|
||||||
msgstr "Ce champ ne peut pas être modifié ou supprimé. Lorsque vous partagez le lien direct de ce modèle ou l'ajoutez à votre profil public, toute personne qui y accède peut saisir son nom et son email, et remplir les champs qui lui sont attribués."
|
msgstr "Ce champ ne peut pas être modifié ou supprimé. Lorsque vous partagez le lien direct de ce modèle ou l'ajoutez à votre profil public, toute personne qui y accède peut saisir son nom et son email, et remplir les champs qui lui sont attribués."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1050
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1084
|
||||||
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
|
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
|
||||||
msgstr "Ce destinataire ne peut plus être modifié car il a signé un champ ou complété le document."
|
msgstr "Ce destinataire ne peut plus être modifié car il a signé un champ ou complété le document."
|
||||||
|
|
||||||
@ -746,7 +750,7 @@ msgstr "Fuseau horaire"
|
|||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Titre"
|
msgstr "Titre"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:1033
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1067
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
|
||||||
msgid "To proceed further, please set at least one value for the {0} field."
|
msgid "To proceed further, please set at least one value for the {0} field."
|
||||||
msgstr "Pour continuer, veuillez définir au moins une valeur pour le champ {0}."
|
msgstr "Pour continuer, veuillez définir au moins une valeur pour le champ {0}."
|
||||||
@ -812,3 +816,4 @@ msgstr "Vous ne pouvez pas télécharger de documents pour le moment."
|
|||||||
#: packages/ui/primitives/document-dropzone.tsx:69
|
#: packages/ui/primitives/document-dropzone.tsx:69
|
||||||
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."
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -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: 2024-10-08 12:05\n"
|
"PO-Revision-Date: 2024-10-18 04:04\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"
|
||||||
@ -618,3 +618,4 @@ msgstr "Vous pouvez auto-héberger Documenso gratuitement ou utiliser notre vers
|
|||||||
#: apps/marketing/src/components/(marketing)/carousel.tsx:272
|
#: apps/marketing/src/components/(marketing)/carousel.tsx:272
|
||||||
msgid "Your browser does not support the video tag."
|
msgid "Your browser does not support the video tag."
|
||||||
msgstr "Votre navigateur ne prend pas en charge la balise vidéo."
|
msgstr "Votre navigateur ne prend pas en charge la balise vidéo."
|
||||||
|
|
||||||
|
|||||||
@ -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: 2024-10-08 12:05\n"
|
"PO-Revision-Date: 2024-10-18 04:04\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"
|
||||||
@ -220,7 +220,7 @@ msgstr "Abonnements actifs"
|
|||||||
msgid "Add"
|
msgid "Add"
|
||||||
msgstr "Ajouter"
|
msgstr "Ajouter"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
|
||||||
msgid "Add all relevant fields for each recipient."
|
msgid "Add all relevant fields for each recipient."
|
||||||
msgstr "Ajouter tous les champs pertinents pour chaque destinataire."
|
msgstr "Ajouter tous les champs pertinents pour chaque destinataire."
|
||||||
@ -241,7 +241,7 @@ msgstr "Ajouter un authentificateur pour servir de méthode d'authentification s
|
|||||||
msgid "Add email"
|
msgid "Add email"
|
||||||
msgstr "Ajouter un e-mail"
|
msgstr "Ajouter un e-mail"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:156
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:174
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86
|
||||||
msgid "Add Fields"
|
msgid "Add Fields"
|
||||||
msgstr "Ajouter des champs"
|
msgstr "Ajouter des champs"
|
||||||
@ -263,11 +263,11 @@ msgstr "Ajouter une clé de passe"
|
|||||||
msgid "Add Placeholders"
|
msgid "Add Placeholders"
|
||||||
msgstr "Ajouter des espaces réservés"
|
msgstr "Ajouter des espaces réservés"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:151
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169
|
||||||
msgid "Add Signers"
|
msgid "Add Signers"
|
||||||
msgstr "Ajouter des signataires"
|
msgstr "Ajouter des signataires"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:161
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179
|
||||||
msgid "Add Subject"
|
msgid "Add Subject"
|
||||||
msgstr "Ajouter un sujet"
|
msgstr "Ajouter un sujet"
|
||||||
|
|
||||||
@ -283,7 +283,7 @@ msgstr "Ajouter un e-mail d'équipe"
|
|||||||
#~ msgid "Add Text"
|
#~ msgid "Add Text"
|
||||||
#~ msgstr "Add Text"
|
#~ msgstr "Add Text"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
|
||||||
msgid "Add the people who will sign the document."
|
msgid "Add the people who will sign the document."
|
||||||
msgstr "Ajouter les personnes qui signeront le document."
|
msgstr "Ajouter les personnes qui signeront le document."
|
||||||
|
|
||||||
@ -291,7 +291,7 @@ msgstr "Ajouter les personnes qui signeront le document."
|
|||||||
msgid "Add the recipients to create the document with"
|
msgid "Add the recipients to create the document with"
|
||||||
msgstr "Ajouter les destinataires pour créer le document avec"
|
msgstr "Ajouter les destinataires pour créer le document avec"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:162
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180
|
||||||
msgid "Add the subject and message you wish to send to signers."
|
msgid "Add the subject and message you wish to send to signers."
|
||||||
msgstr "Ajouter le sujet et le message que vous souhaitez envoyer aux signataires."
|
msgstr "Ajouter le sujet et le message que vous souhaitez envoyer aux signataires."
|
||||||
|
|
||||||
@ -370,13 +370,13 @@ msgstr "Un e-mail demandant le transfert de cette équipe a été envoyé."
|
|||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "Une erreur est survenue"
|
msgstr "Une erreur est survenue"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:248
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:266
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231
|
||||||
msgid "An error occurred while adding signers."
|
msgid "An error occurred while adding signers."
|
||||||
msgstr "Une erreur est survenue lors de l'ajout de signataires."
|
msgstr "Une erreur est survenue lors de l'ajout de signataires."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:278
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301
|
||||||
msgid "An error occurred while adding the fields."
|
msgid "An error occurred while adding the fields."
|
||||||
msgstr "Une erreur est survenue lors de l'ajout des champs."
|
msgstr "Une erreur est survenue lors de l'ajout des champs."
|
||||||
|
|
||||||
@ -426,7 +426,7 @@ msgstr "Une erreur est survenue lors du déplacement du modèle."
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129
|
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:175
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:173
|
||||||
msgid "An error occurred while removing the signature."
|
msgid "An error occurred while removing the signature."
|
||||||
msgstr "Une erreur est survenue lors de la suppression de la signature."
|
msgstr "Une erreur est survenue lors de la suppression de la signature."
|
||||||
|
|
||||||
@ -434,7 +434,7 @@ msgstr "Une erreur est survenue lors de la suppression de la signature."
|
|||||||
msgid "An error occurred while removing the text."
|
msgid "An error occurred while removing the text."
|
||||||
msgstr "Une erreur est survenue lors de la suppression du texte."
|
msgstr "Une erreur est survenue lors de la suppression du texte."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:309
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:332
|
||||||
msgid "An error occurred while sending the document."
|
msgid "An error occurred while sending the document."
|
||||||
msgstr "Une erreur est survenue lors de l'envoi du document."
|
msgstr "Une erreur est survenue lors de l'envoi du document."
|
||||||
|
|
||||||
@ -449,7 +449,7 @@ msgstr "Une erreur est survenue lors de l'envoi de votre e-mail de confirmation"
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102
|
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:149
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:147
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168
|
||||||
msgid "An error occurred while signing the document."
|
msgid "An error occurred while signing the document."
|
||||||
msgstr "Une erreur est survenue lors de la signature du document."
|
msgstr "Une erreur est survenue lors de la signature du document."
|
||||||
@ -458,7 +458,7 @@ msgstr "Une erreur est survenue lors de la signature du document."
|
|||||||
msgid "An error occurred while trying to create a checkout session."
|
msgid "An error occurred while trying to create a checkout session."
|
||||||
msgstr "Une erreur est survenue lors de la création d'une session de paiement."
|
msgstr "Une erreur est survenue lors de la création d'une session de paiement."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:214
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:232
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166
|
||||||
msgid "An error occurred while updating the document settings."
|
msgid "An error occurred while updating the document settings."
|
||||||
msgstr "Une erreur est survenue lors de la mise à jour des paramètres du document."
|
msgstr "Une erreur est survenue lors de la mise à jour des paramètres du document."
|
||||||
@ -665,11 +665,11 @@ msgstr "En activant l'authentification à deux facteurs (2FA), vous devrez entre
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:150
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:151
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:250
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:248
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
|
||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
|
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
|
||||||
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
|
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
|
||||||
@ -752,7 +752,7 @@ msgid "Click to copy signing link for sending to recipient"
|
|||||||
msgstr "Cliquez pour copier le lien de signature à envoyer au destinataire"
|
msgstr "Cliquez pour copier le lien de signature à envoyer au destinataire"
|
||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:175
|
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:175
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:114
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:115
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:435
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:435
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:314
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:314
|
||||||
msgid "Click to insert field"
|
msgid "Click to insert field"
|
||||||
@ -802,7 +802,7 @@ msgstr "Documents complétés"
|
|||||||
msgid "Completed Documents"
|
msgid "Completed Documents"
|
||||||
msgstr "Documents Complétés"
|
msgstr "Documents Complétés"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165
|
||||||
msgid "Configure general settings for the document."
|
msgid "Configure general settings for the document."
|
||||||
msgstr "Configurer les paramètres généraux pour le document."
|
msgstr "Configurer les paramètres généraux pour le document."
|
||||||
|
|
||||||
@ -1274,7 +1274,7 @@ msgstr "Document renvoyé"
|
|||||||
msgid "Document resealed"
|
msgid "Document resealed"
|
||||||
msgstr "Document resealé"
|
msgstr "Document resealé"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:298
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321
|
||||||
msgid "Document sent"
|
msgid "Document sent"
|
||||||
msgstr "Document envoyé"
|
msgstr "Document envoyé"
|
||||||
|
|
||||||
@ -1369,6 +1369,10 @@ msgstr "Documents en brouillon"
|
|||||||
msgid "Drafted Documents"
|
msgid "Drafted Documents"
|
||||||
msgstr "Documents brouillon"
|
msgstr "Documents brouillon"
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:245
|
||||||
|
#~ msgid "Draw"
|
||||||
|
#~ msgstr "Draw"
|
||||||
|
|
||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:121
|
#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:121
|
||||||
msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team."
|
msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team."
|
||||||
msgstr "En raison d'une facture impayée, votre équipe a été restreinte. Veuillez régler le paiement pour rétablir l'accès complet à votre équipe."
|
msgstr "En raison d'une facture impayée, votre équipe a été restreinte. Veuillez régler le paiement pour rétablir l'accès complet à votre équipe."
|
||||||
@ -1491,10 +1495,10 @@ msgstr "Entrez votre texte ici"
|
|||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41
|
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41
|
||||||
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78
|
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:213
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:231
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:247
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:277
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:308
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331
|
||||||
#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57
|
#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57
|
||||||
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106
|
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106
|
||||||
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112
|
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112
|
||||||
@ -1519,8 +1523,8 @@ msgstr "Entrez votre texte ici"
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101
|
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128
|
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:148
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:146
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:174
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:172
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195
|
||||||
#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54
|
#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54
|
||||||
@ -1597,7 +1601,7 @@ msgstr "Mot de passe oublié ?"
|
|||||||
msgid "Full Name"
|
msgid "Full Name"
|
||||||
msgstr "Nom complet"
|
msgstr "Nom complet"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:146
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:164
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60
|
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60
|
||||||
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43
|
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43
|
||||||
@ -2294,7 +2298,7 @@ msgstr "Veuillez contacter le support si vous souhaitez annuler cette action."
|
|||||||
msgid "Please enter a meaningful name for your token. This will help you identify it later."
|
msgid "Please enter a meaningful name for your token. This will help you identify it later."
|
||||||
msgstr "Veuillez entrer un nom significatif pour votre jeton. Cela vous aidera à l'identifier plus tard."
|
msgstr "Veuillez entrer un nom significatif pour votre jeton. Cela vous aidera à l'identifier plus tard."
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:134
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:135
|
||||||
msgid "Please mark as viewed to complete"
|
msgid "Please mark as viewed to complete"
|
||||||
msgstr "Veuillez marquer comme vu pour terminer"
|
msgstr "Veuillez marquer comme vu pour terminer"
|
||||||
|
|
||||||
@ -2730,13 +2734,13 @@ msgstr "Afficher des modèles dans le profil public de votre équipe pour que vo
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:259
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:256
|
||||||
#: apps/web/src/components/ui/user-profile-skeleton.tsx:75
|
#: apps/web/src/components/ui/user-profile-skeleton.tsx:75
|
||||||
#: apps/web/src/components/ui/user-profile-timur.tsx:81
|
#: apps/web/src/components/ui/user-profile-timur.tsx:81
|
||||||
msgid "Sign"
|
msgid "Sign"
|
||||||
msgstr "Signer"
|
msgstr "Signer"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:219
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:217
|
||||||
msgid "Sign as {0} <0>({1})</0>"
|
msgid "Sign as {0} <0>({1})</0>"
|
||||||
msgstr "Signer comme {0} <0>({1})</0>"
|
msgstr "Signer comme {0} <0>({1})</0>"
|
||||||
|
|
||||||
@ -2802,8 +2806,8 @@ msgstr "S'inscrire avec OIDC"
|
|||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88
|
#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:338
|
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:338
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:197
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:195
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:227
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:225
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:391
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:391
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:270
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:270
|
||||||
#: apps/web/src/components/forms/profile.tsx:132
|
#: apps/web/src/components/forms/profile.tsx:132
|
||||||
@ -3552,6 +3556,10 @@ msgstr "Tapez 'supprimer' pour confirmer"
|
|||||||
msgid "Type a command or search..."
|
msgid "Type a command or search..."
|
||||||
msgstr "Tapez une commande ou recherchez..."
|
msgstr "Tapez une commande ou recherchez..."
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:275
|
||||||
|
#~ msgid "Typed Signature"
|
||||||
|
#~ msgstr "Typed Signature"
|
||||||
|
|
||||||
#: apps/web/src/app/(unauthenticated)/verify-email/page.tsx:26
|
#: apps/web/src/app/(unauthenticated)/verify-email/page.tsx:26
|
||||||
msgid "Uh oh! Looks like you're missing a token"
|
msgid "Uh oh! Looks like you're missing a token"
|
||||||
msgstr "Oh oh ! On dirait que vous manquez un jeton"
|
msgstr "Oh oh ! On dirait que vous manquez un jeton"
|
||||||
@ -4382,7 +4390,7 @@ msgstr "Votre document a été créé à partir du modèle avec succès."
|
|||||||
msgid "Your document has been re-sent successfully."
|
msgid "Your document has been re-sent successfully."
|
||||||
msgstr "Votre document a été renvoyé avec succès."
|
msgstr "Votre document a été renvoyé avec succès."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:299
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:322
|
||||||
msgid "Your document has been sent successfully."
|
msgid "Your document has been sent successfully."
|
||||||
msgstr "Votre document a été envoyé avec succès."
|
msgstr "Votre document a été envoyé avec succès."
|
||||||
|
|
||||||
@ -4489,3 +4497,4 @@ msgstr "Votre jeton a été créé avec succès ! Assurez-vous de le copier car
|
|||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86
|
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86
|
||||||
msgid "Your tokens will be shown here once you create them."
|
msgid "Your tokens will be shown here once you create them."
|
||||||
msgstr "Vos jetons seront affichés ici une fois que vous les aurez créés."
|
msgstr "Vos jetons seront affichés ici une fois que vous les aurez créés."
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,2 @@
|
|||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "DocumentMeta" ADD COLUMN "enabledTypedSignature" BOOLEAN NOT NULL DEFAULT false;
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- You are about to drop the column `enabledTypedSignature` on the `DocumentMeta` table. All the data in the column will be lost.
|
||||||
|
|
||||||
|
*/
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "DocumentMeta" DROP COLUMN "enabledTypedSignature",
|
||||||
|
ADD COLUMN "typedSignatureEnabled" BOOLEAN NOT NULL DEFAULT false;
|
||||||
@ -359,16 +359,17 @@ model DocumentData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
model DocumentMeta {
|
model DocumentMeta {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
subject String?
|
subject String?
|
||||||
message String?
|
message String?
|
||||||
timezone String? @default("Etc/UTC") @db.Text
|
timezone String? @default("Etc/UTC") @db.Text
|
||||||
password String?
|
password String?
|
||||||
dateFormat String? @default("yyyy-MM-dd hh:mm a") @db.Text
|
dateFormat String? @default("yyyy-MM-dd hh:mm a") @db.Text
|
||||||
documentId Int @unique
|
documentId Int @unique
|
||||||
document Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
|
document Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
|
||||||
redirectUrl String?
|
redirectUrl String?
|
||||||
signingOrder DocumentSigningOrder @default(PARALLEL)
|
signingOrder DocumentSigningOrder @default(PARALLEL)
|
||||||
|
typedSignatureEnabled Boolean @default(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ReadStatus {
|
enum ReadStatus {
|
||||||
|
|||||||
@ -42,7 +42,7 @@ export const seedTeam = async ({
|
|||||||
createMany: {
|
createMany: {
|
||||||
data: [teamOwner, ...teamMembers].map((user) => ({
|
data: [teamOwner, ...teamMembers].map((user) => ({
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
role: TeamMemberRole.ADMIN,
|
role: user === teamOwner ? TeamMemberRole.ADMIN : TeamMemberRole.MEMBER,
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@ -44,6 +44,7 @@ import {
|
|||||||
ZSetSettingsForDocumentMutationSchema,
|
ZSetSettingsForDocumentMutationSchema,
|
||||||
ZSetSigningOrderForDocumentMutationSchema,
|
ZSetSigningOrderForDocumentMutationSchema,
|
||||||
ZSetTitleForDocumentMutationSchema,
|
ZSetTitleForDocumentMutationSchema,
|
||||||
|
ZUpdateTypedSignatureSettingsMutationSchema,
|
||||||
} from './schema';
|
} from './schema';
|
||||||
|
|
||||||
export const documentRouter = router({
|
export const documentRouter = router({
|
||||||
@ -334,6 +335,46 @@ export const documentRouter = router({
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
updateTypedSignatureSettings: authenticatedProcedure
|
||||||
|
.input(ZUpdateTypedSignatureSettingsMutationSchema)
|
||||||
|
.mutation(async ({ input, ctx }) => {
|
||||||
|
try {
|
||||||
|
const { documentId, teamId, typedSignatureEnabled } = input;
|
||||||
|
|
||||||
|
const document = await getDocumentById({
|
||||||
|
id: documentId,
|
||||||
|
teamId,
|
||||||
|
userId: ctx.user.id,
|
||||||
|
}).catch(() => null);
|
||||||
|
|
||||||
|
if (!document) {
|
||||||
|
throw new TRPCError({
|
||||||
|
code: 'NOT_FOUND',
|
||||||
|
message: 'Document not found',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return await upsertDocumentMeta({
|
||||||
|
documentId,
|
||||||
|
typedSignatureEnabled,
|
||||||
|
userId: ctx.user.id,
|
||||||
|
requestMetadata: extractNextApiRequestMetadata(ctx.req),
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
|
||||||
|
if (err instanceof TRPCError) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new TRPCError({
|
||||||
|
code: 'BAD_REQUEST',
|
||||||
|
message:
|
||||||
|
'We were unable to update the settings for this document. Please try again later.',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
|
||||||
sendDocument: authenticatedProcedure
|
sendDocument: authenticatedProcedure
|
||||||
.input(ZSendDocumentMutationSchema)
|
.input(ZSendDocumentMutationSchema)
|
||||||
.mutation(async ({ input, ctx }) => {
|
.mutation(async ({ input, ctx }) => {
|
||||||
|
|||||||
@ -162,6 +162,16 @@ export type TSetSigningOrderForDocumentMutationSchema = z.infer<
|
|||||||
typeof ZSetSigningOrderForDocumentMutationSchema
|
typeof ZSetSigningOrderForDocumentMutationSchema
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
export const ZUpdateTypedSignatureSettingsMutationSchema = z.object({
|
||||||
|
documentId: z.number(),
|
||||||
|
teamId: z.number().optional(),
|
||||||
|
typedSignatureEnabled: z.boolean(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TUpdateTypedSignatureSettingsMutationSchema = z.infer<
|
||||||
|
typeof ZUpdateTypedSignatureSettingsMutationSchema
|
||||||
|
>;
|
||||||
|
|
||||||
export const ZResendDocumentMutationSchema = z.object({
|
export const ZResendDocumentMutationSchema = z.object({
|
||||||
documentId: z.number(),
|
documentId: z.number(),
|
||||||
recipients: z.array(z.number()).min(1),
|
recipients: z.array(z.number()).min(1),
|
||||||
|
|||||||
@ -48,7 +48,9 @@ import { cn } from '../../lib/utils';
|
|||||||
import { Alert, AlertDescription } from '../alert';
|
import { Alert, AlertDescription } from '../alert';
|
||||||
import { Button } from '../button';
|
import { Button } from '../button';
|
||||||
import { Card, CardContent } from '../card';
|
import { Card, CardContent } from '../card';
|
||||||
|
import { Checkbox } from '../checkbox';
|
||||||
import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem } from '../command';
|
import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem } from '../command';
|
||||||
|
import { Form, FormControl, FormField, FormItem, FormLabel } from '../form/form';
|
||||||
import { Popover, PopoverContent, PopoverTrigger } from '../popover';
|
import { Popover, PopoverContent, PopoverTrigger } from '../popover';
|
||||||
import { useStep } from '../stepper';
|
import { useStep } from '../stepper';
|
||||||
import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip';
|
import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip';
|
||||||
@ -97,6 +99,7 @@ export type AddFieldsFormProps = {
|
|||||||
onSubmit: (_data: TAddFieldsFormSchema) => void;
|
onSubmit: (_data: TAddFieldsFormSchema) => void;
|
||||||
canGoBack?: boolean;
|
canGoBack?: boolean;
|
||||||
isDocumentPdfLoaded: boolean;
|
isDocumentPdfLoaded: boolean;
|
||||||
|
typedSignatureEnabled?: boolean;
|
||||||
teamId?: number;
|
teamId?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -108,6 +111,7 @@ export const AddFieldsFormPartial = ({
|
|||||||
onSubmit,
|
onSubmit,
|
||||||
canGoBack = false,
|
canGoBack = false,
|
||||||
isDocumentPdfLoaded,
|
isDocumentPdfLoaded,
|
||||||
|
typedSignatureEnabled,
|
||||||
teamId,
|
teamId,
|
||||||
}: AddFieldsFormProps) => {
|
}: AddFieldsFormProps) => {
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
@ -122,13 +126,7 @@ export const AddFieldsFormPartial = ({
|
|||||||
const [showAdvancedSettings, setShowAdvancedSettings] = useState(false);
|
const [showAdvancedSettings, setShowAdvancedSettings] = useState(false);
|
||||||
const [currentField, setCurrentField] = useState<FieldFormType>();
|
const [currentField, setCurrentField] = useState<FieldFormType>();
|
||||||
|
|
||||||
const {
|
const form = useForm<TAddFieldsFormSchema>({
|
||||||
control,
|
|
||||||
handleSubmit,
|
|
||||||
formState: { isSubmitting },
|
|
||||||
setValue,
|
|
||||||
getValues,
|
|
||||||
} = useForm<TAddFieldsFormSchema>({
|
|
||||||
defaultValues: {
|
defaultValues: {
|
||||||
fields: fields.map((field) => ({
|
fields: fields.map((field) => ({
|
||||||
nativeId: field.id,
|
nativeId: field.id,
|
||||||
@ -143,6 +141,7 @@ export const AddFieldsFormPartial = ({
|
|||||||
recipients.find((recipient) => recipient.id === field.recipientId)?.email ?? '',
|
recipients.find((recipient) => recipient.id === field.recipientId)?.email ?? '',
|
||||||
fieldMeta: field.fieldMeta ? ZFieldMetaSchema.parse(field.fieldMeta) : undefined,
|
fieldMeta: field.fieldMeta ? ZFieldMetaSchema.parse(field.fieldMeta) : undefined,
|
||||||
})),
|
})),
|
||||||
|
typedSignatureEnabled: typedSignatureEnabled ?? false,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -150,10 +149,10 @@ export const AddFieldsFormPartial = ({
|
|||||||
useHotkeys(['ctrl+v', 'meta+v'], (evt) => onFieldPaste(evt));
|
useHotkeys(['ctrl+v', 'meta+v'], (evt) => onFieldPaste(evt));
|
||||||
useHotkeys(['ctrl+d', 'meta+d'], (evt) => onFieldCopy(evt, { duplicate: true }));
|
useHotkeys(['ctrl+d', 'meta+d'], (evt) => onFieldCopy(evt, { duplicate: true }));
|
||||||
|
|
||||||
const onFormSubmit = handleSubmit(onSubmit);
|
const onFormSubmit = form.handleSubmit(onSubmit);
|
||||||
|
|
||||||
const handleSavedFieldSettings = (fieldState: FieldMeta) => {
|
const handleSavedFieldSettings = (fieldState: FieldMeta) => {
|
||||||
const initialValues = getValues();
|
const initialValues = form.getValues();
|
||||||
|
|
||||||
const updatedFields = initialValues.fields.map((field) => {
|
const updatedFields = initialValues.fields.map((field) => {
|
||||||
if (field.formId === currentField?.formId) {
|
if (field.formId === currentField?.formId) {
|
||||||
@ -168,7 +167,7 @@ export const AddFieldsFormPartial = ({
|
|||||||
return field;
|
return field;
|
||||||
});
|
});
|
||||||
|
|
||||||
setValue('fields', updatedFields);
|
form.setValue('fields', updatedFields);
|
||||||
};
|
};
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@ -177,7 +176,7 @@ export const AddFieldsFormPartial = ({
|
|||||||
update,
|
update,
|
||||||
fields: localFields,
|
fields: localFields,
|
||||||
} = useFieldArray({
|
} = useFieldArray({
|
||||||
control,
|
control: form.control,
|
||||||
name: 'fields',
|
name: 'fields',
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -532,6 +531,12 @@ export const AddFieldsFormPartial = ({
|
|||||||
);
|
);
|
||||||
}, [recipientsByRole]);
|
}, [recipientsByRole]);
|
||||||
|
|
||||||
|
const isTypedSignatureEnabled = form.watch('typedSignatureEnabled');
|
||||||
|
|
||||||
|
const handleTypedSignatureChange = (value: boolean) => {
|
||||||
|
form.setValue('typedSignatureEnabled', value, { shouldDirty: true });
|
||||||
|
};
|
||||||
|
|
||||||
const hasSameOwnerAsRecipient =
|
const hasSameOwnerAsRecipient =
|
||||||
recipientsByRole.SIGNER.length === 1 &&
|
recipientsByRole.SIGNER.length === 1 &&
|
||||||
recipientsByRole.SIGNER[0].email === session?.user?.email;
|
recipientsByRole.SIGNER[0].email === session?.user?.email;
|
||||||
@ -583,6 +588,7 @@ export const AddFieldsFormPartial = ({
|
|||||||
title={documentFlow.title}
|
title={documentFlow.title}
|
||||||
description={documentFlow.description}
|
description={documentFlow.description}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<DocumentFlowFormContainerContent>
|
<DocumentFlowFormContainerContent>
|
||||||
<div className="flex flex-col">
|
<div className="flex flex-col">
|
||||||
{selectedField && (
|
{selectedField && (
|
||||||
@ -766,269 +772,297 @@ export const AddFieldsFormPartial = ({
|
|||||||
</Popover>
|
</Popover>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="-mx-2 flex-1 overflow-y-auto px-2">
|
<Form {...form}>
|
||||||
<fieldset disabled={isFieldsDisabled} className="my-2 grid grid-cols-3 gap-4">
|
<FormField
|
||||||
<button
|
control={form.control}
|
||||||
type="button"
|
name="typedSignatureEnabled"
|
||||||
className="group h-full w-full"
|
render={({ field: { value, ...field } }) => (
|
||||||
onClick={() => setSelectedField(FieldType.SIGNATURE)}
|
<FormItem className="mb-6 flex flex-row items-center space-x-2 space-y-0">
|
||||||
onMouseDown={() => setSelectedField(FieldType.SIGNATURE)}
|
<FormControl>
|
||||||
data-selected={selectedField === FieldType.SIGNATURE ? true : undefined}
|
<Checkbox
|
||||||
>
|
{...field}
|
||||||
<Card
|
id="typedSignatureEnabled"
|
||||||
className={cn(
|
checkClassName="text-white"
|
||||||
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
checked={value}
|
||||||
// selectedSignerStyles.borderClass,
|
onCheckedChange={(checked) => field.onChange(checked)}
|
||||||
)}
|
disabled={form.formState.isSubmitting}
|
||||||
>
|
/>
|
||||||
<CardContent className="flex flex-col items-center justify-center px-6 py-4">
|
</FormControl>
|
||||||
<p
|
|
||||||
className={cn(
|
|
||||||
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-lg font-normal',
|
|
||||||
fontCaveat.className,
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
<Trans>Signature</Trans>
|
|
||||||
</p>
|
|
||||||
</CardContent>
|
|
||||||
</Card>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button
|
<FormLabel
|
||||||
type="button"
|
htmlFor="typedSignatureEnabled"
|
||||||
className="group h-full w-full"
|
className="text-sm leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||||
onClick={() => setSelectedField(FieldType.INITIALS)}
|
>
|
||||||
onMouseDown={() => setSelectedField(FieldType.INITIALS)}
|
<Trans>Enable Typed Signatures</Trans>
|
||||||
data-selected={selectedField === FieldType.INITIALS ? true : undefined}
|
</FormLabel>
|
||||||
>
|
</FormItem>
|
||||||
<Card
|
)}
|
||||||
className={cn(
|
/>
|
||||||
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
|
||||||
// selectedSignerStyles.borderClass,
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
<CardContent className="flex flex-col items-center justify-center px-6 py-4">
|
|
||||||
<p
|
|
||||||
className={cn(
|
|
||||||
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
<Contact className="h-4 w-4" />
|
|
||||||
Initials
|
|
||||||
</p>
|
|
||||||
</CardContent>
|
|
||||||
</Card>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button
|
<div className="-mx-2 flex-1 overflow-y-auto px-2">
|
||||||
type="button"
|
<fieldset disabled={isFieldsDisabled} className="my-2 grid grid-cols-3 gap-4">
|
||||||
className="group h-full w-full"
|
<button
|
||||||
onClick={() => setSelectedField(FieldType.EMAIL)}
|
type="button"
|
||||||
onMouseDown={() => setSelectedField(FieldType.EMAIL)}
|
className="group h-full w-full"
|
||||||
data-selected={selectedField === FieldType.EMAIL ? true : undefined}
|
onClick={() => setSelectedField(FieldType.SIGNATURE)}
|
||||||
>
|
onMouseDown={() => setSelectedField(FieldType.SIGNATURE)}
|
||||||
<Card
|
data-selected={selectedField === FieldType.SIGNATURE ? true : undefined}
|
||||||
className={cn(
|
|
||||||
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
|
||||||
// selectedSignerStyles.borderClass,
|
|
||||||
)}
|
|
||||||
>
|
>
|
||||||
<CardContent className="flex flex-col items-center justify-center px-6 py-4">
|
<Card
|
||||||
<p
|
className={cn(
|
||||||
className={cn(
|
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
||||||
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
// selectedSignerStyles.borderClass,
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<Mail className="h-4 w-4" />
|
<CardContent className="flex flex-col items-center justify-center px-6 py-4">
|
||||||
<Trans>Email</Trans>
|
<p
|
||||||
</p>
|
className={cn(
|
||||||
</CardContent>
|
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-lg font-normal',
|
||||||
</Card>
|
fontCaveat.className,
|
||||||
</button>
|
)}
|
||||||
|
>
|
||||||
|
<Trans>Signature</Trans>
|
||||||
|
</p>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</button>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="group h-full w-full"
|
className="group h-full w-full"
|
||||||
onClick={() => setSelectedField(FieldType.NAME)}
|
onClick={() => setSelectedField(FieldType.INITIALS)}
|
||||||
onMouseDown={() => setSelectedField(FieldType.NAME)}
|
onMouseDown={() => setSelectedField(FieldType.INITIALS)}
|
||||||
data-selected={selectedField === FieldType.NAME ? true : undefined}
|
data-selected={selectedField === FieldType.INITIALS ? true : undefined}
|
||||||
>
|
|
||||||
<Card
|
|
||||||
className={cn(
|
|
||||||
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
|
||||||
// selectedSignerStyles.borderClass,
|
|
||||||
)}
|
|
||||||
>
|
>
|
||||||
<CardContent className="p-4">
|
<Card
|
||||||
<p
|
className={cn(
|
||||||
className={cn(
|
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
||||||
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
// selectedSignerStyles.borderClass,
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<User className="h-4 w-4" />
|
<CardContent className="flex flex-col items-center justify-center px-6 py-4">
|
||||||
<Trans>Name</Trans>
|
<p
|
||||||
</p>
|
className={cn(
|
||||||
</CardContent>
|
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
||||||
</Card>
|
)}
|
||||||
</button>
|
>
|
||||||
|
<Contact className="h-4 w-4" />
|
||||||
|
Initials
|
||||||
|
</p>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</button>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="group h-full w-full"
|
className="group h-full w-full"
|
||||||
onClick={() => setSelectedField(FieldType.DATE)}
|
onClick={() => setSelectedField(FieldType.EMAIL)}
|
||||||
onMouseDown={() => setSelectedField(FieldType.DATE)}
|
onMouseDown={() => setSelectedField(FieldType.EMAIL)}
|
||||||
data-selected={selectedField === FieldType.DATE ? true : undefined}
|
data-selected={selectedField === FieldType.EMAIL ? true : undefined}
|
||||||
>
|
|
||||||
<Card
|
|
||||||
className={cn(
|
|
||||||
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
|
||||||
// selectedSignerStyles.borderClass,
|
|
||||||
)}
|
|
||||||
>
|
>
|
||||||
<CardContent className="p-4">
|
<Card
|
||||||
<p
|
className={cn(
|
||||||
className={cn(
|
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
||||||
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
// selectedSignerStyles.borderClass,
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<CalendarDays className="h-4 w-4" />
|
<CardContent className="flex flex-col items-center justify-center px-6 py-4">
|
||||||
<Trans>Date</Trans>
|
<p
|
||||||
</p>
|
className={cn(
|
||||||
</CardContent>
|
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
||||||
</Card>
|
)}
|
||||||
</button>
|
>
|
||||||
|
<Mail className="h-4 w-4" />
|
||||||
|
<Trans>Email</Trans>
|
||||||
|
</p>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</button>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="group h-full w-full"
|
className="group h-full w-full"
|
||||||
onClick={() => setSelectedField(FieldType.TEXT)}
|
onClick={() => setSelectedField(FieldType.NAME)}
|
||||||
onMouseDown={() => setSelectedField(FieldType.TEXT)}
|
onMouseDown={() => setSelectedField(FieldType.NAME)}
|
||||||
data-selected={selectedField === FieldType.TEXT ? true : undefined}
|
data-selected={selectedField === FieldType.NAME ? true : undefined}
|
||||||
>
|
|
||||||
<Card
|
|
||||||
className={cn(
|
|
||||||
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
|
||||||
// selectedSignerStyles.borderClass,
|
|
||||||
)}
|
|
||||||
>
|
>
|
||||||
<CardContent className="p-4">
|
<Card
|
||||||
<p
|
className={cn(
|
||||||
className={cn(
|
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
||||||
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
// selectedSignerStyles.borderClass,
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<Type className="h-4 w-4" />
|
<CardContent className="p-4">
|
||||||
<Trans>Text</Trans>
|
<p
|
||||||
</p>
|
className={cn(
|
||||||
</CardContent>
|
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
||||||
</Card>
|
)}
|
||||||
</button>
|
>
|
||||||
|
<User className="h-4 w-4" />
|
||||||
|
<Trans>Name</Trans>
|
||||||
|
</p>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</button>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="group h-full w-full"
|
className="group h-full w-full"
|
||||||
onClick={() => setSelectedField(FieldType.NUMBER)}
|
onClick={() => setSelectedField(FieldType.DATE)}
|
||||||
onMouseDown={() => setSelectedField(FieldType.NUMBER)}
|
onMouseDown={() => setSelectedField(FieldType.DATE)}
|
||||||
data-selected={selectedField === FieldType.NUMBER ? true : undefined}
|
data-selected={selectedField === FieldType.DATE ? true : undefined}
|
||||||
>
|
|
||||||
<Card
|
|
||||||
className={cn(
|
|
||||||
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
|
||||||
// selectedSignerStyles.borderClass,
|
|
||||||
)}
|
|
||||||
>
|
>
|
||||||
<CardContent className="p-4">
|
<Card
|
||||||
<p
|
className={cn(
|
||||||
className={cn(
|
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
||||||
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
// selectedSignerStyles.borderClass,
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<Hash className="h-4 w-4" />
|
<CardContent className="p-4">
|
||||||
<Trans>Number</Trans>
|
<p
|
||||||
</p>
|
className={cn(
|
||||||
</CardContent>
|
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
||||||
</Card>
|
)}
|
||||||
</button>
|
>
|
||||||
|
<CalendarDays className="h-4 w-4" />
|
||||||
|
<Trans>Date</Trans>
|
||||||
|
</p>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</button>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="group h-full w-full"
|
className="group h-full w-full"
|
||||||
onClick={() => setSelectedField(FieldType.RADIO)}
|
onClick={() => setSelectedField(FieldType.TEXT)}
|
||||||
onMouseDown={() => setSelectedField(FieldType.RADIO)}
|
onMouseDown={() => setSelectedField(FieldType.TEXT)}
|
||||||
data-selected={selectedField === FieldType.RADIO ? true : undefined}
|
data-selected={selectedField === FieldType.TEXT ? true : undefined}
|
||||||
>
|
|
||||||
<Card
|
|
||||||
className={cn(
|
|
||||||
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
|
||||||
// selectedSignerStyles.borderClass,
|
|
||||||
)}
|
|
||||||
>
|
>
|
||||||
<CardContent className="p-4">
|
<Card
|
||||||
<p
|
className={cn(
|
||||||
className={cn(
|
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
||||||
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
// selectedSignerStyles.borderClass,
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<Disc className="h-4 w-4" />
|
<CardContent className="p-4">
|
||||||
<Trans>Radio</Trans>
|
<p
|
||||||
</p>
|
className={cn(
|
||||||
</CardContent>
|
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
||||||
</Card>
|
)}
|
||||||
</button>
|
>
|
||||||
|
<Type className="h-4 w-4" />
|
||||||
|
<Trans>Text</Trans>
|
||||||
|
</p>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</button>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="group h-full w-full"
|
className="group h-full w-full"
|
||||||
onClick={() => setSelectedField(FieldType.CHECKBOX)}
|
onClick={() => setSelectedField(FieldType.NUMBER)}
|
||||||
onMouseDown={() => setSelectedField(FieldType.CHECKBOX)}
|
onMouseDown={() => setSelectedField(FieldType.NUMBER)}
|
||||||
data-selected={selectedField === FieldType.CHECKBOX ? true : undefined}
|
data-selected={selectedField === FieldType.NUMBER ? true : undefined}
|
||||||
>
|
|
||||||
<Card
|
|
||||||
className={cn(
|
|
||||||
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
|
||||||
// selectedSignerStyles.borderClass,
|
|
||||||
)}
|
|
||||||
>
|
>
|
||||||
<CardContent className="p-4">
|
<Card
|
||||||
<p
|
className={cn(
|
||||||
className={cn(
|
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
||||||
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
// selectedSignerStyles.borderClass,
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<CheckSquare className="h-4 w-4" />
|
<CardContent className="p-4">
|
||||||
<Trans>Checkbox</Trans>
|
<p
|
||||||
</p>
|
className={cn(
|
||||||
</CardContent>
|
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
||||||
</Card>
|
)}
|
||||||
</button>
|
>
|
||||||
|
<Hash className="h-4 w-4" />
|
||||||
|
<Trans>Number</Trans>
|
||||||
|
</p>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</button>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="group h-full w-full"
|
className="group h-full w-full"
|
||||||
onClick={() => setSelectedField(FieldType.DROPDOWN)}
|
onClick={() => setSelectedField(FieldType.RADIO)}
|
||||||
onMouseDown={() => setSelectedField(FieldType.DROPDOWN)}
|
onMouseDown={() => setSelectedField(FieldType.RADIO)}
|
||||||
data-selected={selectedField === FieldType.DROPDOWN ? true : undefined}
|
data-selected={selectedField === FieldType.RADIO ? true : undefined}
|
||||||
>
|
|
||||||
<Card
|
|
||||||
className={cn(
|
|
||||||
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
|
||||||
// selectedSignerStyles.borderClass,
|
|
||||||
)}
|
|
||||||
>
|
>
|
||||||
<CardContent className="p-4">
|
<Card
|
||||||
<p
|
className={cn(
|
||||||
className={cn(
|
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
||||||
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
// selectedSignerStyles.borderClass,
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<ChevronDown className="h-4 w-4" />
|
<CardContent className="p-4">
|
||||||
<Trans>Dropdown</Trans>
|
<p
|
||||||
</p>
|
className={cn(
|
||||||
</CardContent>
|
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
||||||
</Card>
|
)}
|
||||||
</button>
|
>
|
||||||
</fieldset>
|
<Disc className="h-4 w-4" />
|
||||||
</div>
|
<Trans>Radio</Trans>
|
||||||
|
</p>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="group h-full w-full"
|
||||||
|
onClick={() => setSelectedField(FieldType.CHECKBOX)}
|
||||||
|
onMouseDown={() => setSelectedField(FieldType.CHECKBOX)}
|
||||||
|
data-selected={selectedField === FieldType.CHECKBOX ? true : undefined}
|
||||||
|
>
|
||||||
|
<Card
|
||||||
|
className={cn(
|
||||||
|
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
||||||
|
// selectedSignerStyles.borderClass,
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<CardContent className="p-4">
|
||||||
|
<p
|
||||||
|
className={cn(
|
||||||
|
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<CheckSquare className="h-4 w-4" />
|
||||||
|
<Trans>Checkbox</Trans>
|
||||||
|
</p>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="group h-full w-full"
|
||||||
|
onClick={() => setSelectedField(FieldType.DROPDOWN)}
|
||||||
|
onMouseDown={() => setSelectedField(FieldType.DROPDOWN)}
|
||||||
|
data-selected={selectedField === FieldType.DROPDOWN ? true : undefined}
|
||||||
|
>
|
||||||
|
<Card
|
||||||
|
className={cn(
|
||||||
|
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
|
||||||
|
// selectedSignerStyles.borderClass,
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<CardContent className="p-4">
|
||||||
|
<p
|
||||||
|
className={cn(
|
||||||
|
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<ChevronDown className="h-4 w-4" />
|
||||||
|
<Trans>Dropdown</Trans>
|
||||||
|
</p>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</button>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
</Form>
|
||||||
</div>
|
</div>
|
||||||
</DocumentFlowFormContainerContent>
|
</DocumentFlowFormContainerContent>
|
||||||
|
|
||||||
@ -1065,8 +1099,9 @@ export const AddFieldsFormPartial = ({
|
|||||||
<DocumentFlowFormContainerStep step={currentStep} maxStep={totalSteps} />
|
<DocumentFlowFormContainerStep step={currentStep} maxStep={totalSteps} />
|
||||||
|
|
||||||
<DocumentFlowFormContainerActions
|
<DocumentFlowFormContainerActions
|
||||||
loading={isSubmitting}
|
loading={form.formState.isSubmitting}
|
||||||
disabled={isSubmitting}
|
disabled={form.formState.isSubmitting}
|
||||||
|
disableNextStep={hasErrors}
|
||||||
onGoBackClick={() => {
|
onGoBackClick={() => {
|
||||||
previousStep();
|
previousStep();
|
||||||
remove();
|
remove();
|
||||||
|
|||||||
@ -18,6 +18,7 @@ export const ZAddFieldsFormSchema = z.object({
|
|||||||
fieldMeta: ZFieldMetaSchema,
|
fieldMeta: ZFieldMetaSchema,
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
|
typedSignatureEnabled: z.boolean(),
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TAddFieldsFormSchema = z.infer<typeof ZAddFieldsFormSchema>;
|
export type TAddFieldsFormSchema = z.infer<typeof ZAddFieldsFormSchema>;
|
||||||
|
|||||||
@ -3,12 +3,15 @@
|
|||||||
import type { HTMLAttributes, MouseEvent, PointerEvent, TouchEvent } from 'react';
|
import type { HTMLAttributes, MouseEvent, PointerEvent, TouchEvent } from 'react';
|
||||||
import { useEffect, useMemo, useRef, useState } from 'react';
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
||||||
|
|
||||||
|
import { Caveat } from 'next/font/google';
|
||||||
|
|
||||||
import { Trans } from '@lingui/macro';
|
import { Trans } from '@lingui/macro';
|
||||||
import { Undo2 } from 'lucide-react';
|
import { Undo2 } from 'lucide-react';
|
||||||
import type { StrokeOptions } from 'perfect-freehand';
|
import type { StrokeOptions } from 'perfect-freehand';
|
||||||
import { getStroke } from 'perfect-freehand';
|
import { getStroke } from 'perfect-freehand';
|
||||||
|
|
||||||
import { unsafe_useEffectOnce } from '@documenso/lib/client-only/hooks/use-effect-once';
|
import { unsafe_useEffectOnce } from '@documenso/lib/client-only/hooks/use-effect-once';
|
||||||
|
import { Input } from '@documenso/ui/primitives/input';
|
||||||
import {
|
import {
|
||||||
Select,
|
Select,
|
||||||
SelectContent,
|
SelectContent,
|
||||||
@ -21,12 +24,20 @@ import { cn } from '../../lib/utils';
|
|||||||
import { getSvgPathFromStroke } from './helper';
|
import { getSvgPathFromStroke } from './helper';
|
||||||
import { Point } from './point';
|
import { Point } from './point';
|
||||||
|
|
||||||
|
const fontCaveat = Caveat({
|
||||||
|
weight: ['500'],
|
||||||
|
subsets: ['latin'],
|
||||||
|
display: 'swap',
|
||||||
|
variable: '--font-caveat',
|
||||||
|
});
|
||||||
|
|
||||||
const DPI = 2;
|
const DPI = 2;
|
||||||
|
|
||||||
export type SignaturePadProps = Omit<HTMLAttributes<HTMLCanvasElement>, 'onChange'> & {
|
export type SignaturePadProps = Omit<HTMLAttributes<HTMLCanvasElement>, 'onChange'> & {
|
||||||
onChange?: (_signatureDataUrl: string | null) => void;
|
onChange?: (_signatureDataUrl: string | null) => void;
|
||||||
containerClassName?: string;
|
containerClassName?: string;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
|
allowTypedSignature?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const SignaturePad = ({
|
export const SignaturePad = ({
|
||||||
@ -35,6 +46,7 @@ export const SignaturePad = ({
|
|||||||
defaultValue,
|
defaultValue,
|
||||||
onChange,
|
onChange,
|
||||||
disabled = false,
|
disabled = false,
|
||||||
|
allowTypedSignature,
|
||||||
...props
|
...props
|
||||||
}: SignaturePadProps) => {
|
}: SignaturePadProps) => {
|
||||||
const $el = useRef<HTMLCanvasElement>(null);
|
const $el = useRef<HTMLCanvasElement>(null);
|
||||||
@ -44,6 +56,7 @@ export const SignaturePad = ({
|
|||||||
const [lines, setLines] = useState<Point[][]>([]);
|
const [lines, setLines] = useState<Point[][]>([]);
|
||||||
const [currentLine, setCurrentLine] = useState<Point[]>([]);
|
const [currentLine, setCurrentLine] = useState<Point[]>([]);
|
||||||
const [selectedColor, setSelectedColor] = useState('black');
|
const [selectedColor, setSelectedColor] = useState('black');
|
||||||
|
const [typedSignature, setTypedSignature] = useState('');
|
||||||
|
|
||||||
const perfectFreehandOptions = useMemo(() => {
|
const perfectFreehandOptions = useMemo(() => {
|
||||||
const size = $el.current ? Math.min($el.current.height, $el.current.width) * 0.03 : 10;
|
const size = $el.current ? Math.min($el.current.height, $el.current.width) * 0.03 : 10;
|
||||||
@ -181,34 +194,107 @@ export const SignaturePad = ({
|
|||||||
|
|
||||||
onChange?.(null);
|
onChange?.(null);
|
||||||
|
|
||||||
|
setTypedSignature('');
|
||||||
setLines([]);
|
setLines([]);
|
||||||
setCurrentLine([]);
|
setCurrentLine([]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const renderTypedSignature = () => {
|
||||||
|
if ($el.current && typedSignature) {
|
||||||
|
const ctx = $el.current.getContext('2d');
|
||||||
|
|
||||||
|
if (ctx) {
|
||||||
|
const canvasWidth = $el.current.width;
|
||||||
|
const canvasHeight = $el.current.height;
|
||||||
|
|
||||||
|
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
|
||||||
|
ctx.textAlign = 'center';
|
||||||
|
ctx.textBaseline = 'middle';
|
||||||
|
ctx.fillStyle = selectedColor;
|
||||||
|
|
||||||
|
// Calculate the desired width (25ch)
|
||||||
|
const desiredWidth = canvasWidth * 0.85; // 85% of canvas width
|
||||||
|
|
||||||
|
// Start with a base font size
|
||||||
|
let fontSize = 18;
|
||||||
|
ctx.font = `${fontSize}px ${fontCaveat.style.fontFamily}`;
|
||||||
|
|
||||||
|
// Measure 10 characters and calculate scale factor
|
||||||
|
const characterWidth = ctx.measureText('m'.repeat(10)).width;
|
||||||
|
const scaleFactor = desiredWidth / characterWidth;
|
||||||
|
|
||||||
|
// Apply scale factor to font size
|
||||||
|
fontSize = fontSize * scaleFactor;
|
||||||
|
|
||||||
|
// Adjust font size if it exceeds canvas width
|
||||||
|
ctx.font = `${fontSize}px ${fontCaveat.style.fontFamily}`;
|
||||||
|
|
||||||
|
const textWidth = ctx.measureText(typedSignature).width;
|
||||||
|
|
||||||
|
if (textWidth > desiredWidth) {
|
||||||
|
fontSize = fontSize * (desiredWidth / textWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set final font and render text
|
||||||
|
ctx.font = `${fontSize}px ${fontCaveat.style.fontFamily}`;
|
||||||
|
ctx.fillText(typedSignature, canvasWidth / 2, canvasHeight / 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleTypedSignatureChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
const newValue = event.target.value;
|
||||||
|
setTypedSignature(newValue);
|
||||||
|
|
||||||
|
if (newValue.trim() !== '') {
|
||||||
|
onChange?.($el.current?.toDataURL() || null);
|
||||||
|
} else {
|
||||||
|
onChange?.(null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (typedSignature.trim() !== '') {
|
||||||
|
renderTypedSignature();
|
||||||
|
onChange?.($el.current?.toDataURL() || null);
|
||||||
|
} else {
|
||||||
|
onClearClick();
|
||||||
|
}
|
||||||
|
}, [typedSignature, selectedColor]);
|
||||||
|
|
||||||
const onUndoClick = () => {
|
const onUndoClick = () => {
|
||||||
if (lines.length === 0) {
|
if (lines.length === 0 && typedSignature.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const newLines = lines.slice(0, -1);
|
if (typedSignature.length > 0) {
|
||||||
setLines(newLines);
|
const newTypedSignature = typedSignature.slice(0, -1);
|
||||||
|
setTypedSignature(newTypedSignature);
|
||||||
|
// You might want to call onChange here as well
|
||||||
|
// onChange?.(newTypedSignature);
|
||||||
|
} else {
|
||||||
|
const newLines = lines.slice(0, -1);
|
||||||
|
setLines(newLines);
|
||||||
|
|
||||||
// Clear the canvas
|
// Clear and redraw the canvas
|
||||||
if ($el.current) {
|
if ($el.current) {
|
||||||
const ctx = $el.current.getContext('2d');
|
const ctx = $el.current.getContext('2d');
|
||||||
const { width, height } = $el.current;
|
const { width, height } = $el.current;
|
||||||
ctx?.clearRect(0, 0, width, height);
|
ctx?.clearRect(0, 0, width, height);
|
||||||
|
|
||||||
if (typeof defaultValue === 'string' && $imageData.current) {
|
if (typeof defaultValue === 'string' && $imageData.current) {
|
||||||
ctx?.putImageData($imageData.current, 0, 0);
|
ctx?.putImageData($imageData.current, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
newLines.forEach((line) => {
|
||||||
|
const pathData = new Path2D(
|
||||||
|
getSvgPathFromStroke(getStroke(line, perfectFreehandOptions)),
|
||||||
|
);
|
||||||
|
ctx?.fill(pathData);
|
||||||
|
});
|
||||||
|
|
||||||
|
onChange?.($el.current.toDataURL());
|
||||||
}
|
}
|
||||||
|
|
||||||
newLines.forEach((line) => {
|
|
||||||
const pathData = new Path2D(getSvgPathFromStroke(getStroke(line, perfectFreehandOptions)));
|
|
||||||
ctx?.fill(pathData);
|
|
||||||
});
|
|
||||||
|
|
||||||
onChange?.($el.current.toDataURL());
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -263,6 +349,21 @@ export const SignaturePad = ({
|
|||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{allowTypedSignature && (
|
||||||
|
<div
|
||||||
|
className={cn('ml-4 pb-1', {
|
||||||
|
'ml-10': lines.length > 0 || typedSignature.length > 0,
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
<Input
|
||||||
|
placeholder="Type your signature"
|
||||||
|
className="w-1/2 border-none p-0 focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0"
|
||||||
|
value={typedSignature}
|
||||||
|
onChange={handleTypedSignatureChange}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
<div className="text-foreground absolute right-2 top-2 filter">
|
<div className="text-foreground absolute right-2 top-2 filter">
|
||||||
<Select defaultValue={selectedColor} onValueChange={(value) => setSelectedColor(value)}>
|
<Select defaultValue={selectedColor} onValueChange={(value) => setSelectedColor(value)}>
|
||||||
<SelectTrigger className="h-auto w-auto border-none p-0.5">
|
<SelectTrigger className="h-auto w-auto border-none p-0.5">
|
||||||
@ -311,13 +412,13 @@ export const SignaturePad = ({
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{lines.length > 0 && (
|
{(lines.length > 0 || typedSignature.length > 0) && (
|
||||||
<div className="absolute bottom-4 left-4 flex gap-2">
|
<div className="absolute bottom-4 left-4 flex gap-2">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
title="undo"
|
title="undo"
|
||||||
className="focus-visible:ring-ring ring-offset-background text-muted-foreground/60 hover:text-muted-foreground rounded-full p-0 text-[0.688rem] focus-visible:outline-none focus-visible:ring-2"
|
className="focus-visible:ring-ring ring-offset-background text-muted-foreground/60 hover:text-muted-foreground rounded-full p-0 text-[0.688rem] focus-visible:outline-none focus-visible:ring-2"
|
||||||
onClick={() => onUndoClick()}
|
onClick={onUndoClick}
|
||||||
>
|
>
|
||||||
<Undo2 className="h-4 w-4" />
|
<Undo2 className="h-4 w-4" />
|
||||||
<span className="sr-only">Undo</span>
|
<span className="sr-only">Undo</span>
|
||||||
|
|||||||
Reference in New Issue
Block a user