feat: i18n for emails (#1442)

## Description

Support setting a document language that will control the language used
for sending emails to recipients. Additional work has been done to
convert all emails to using our i18n implementation so we can later add
controls for sending other kinds of emails in a users target language.

## Related Issue

N/A

## Changes Made

- Added `<Trans>` and `msg` macros to emails
- Introduced a new `renderEmailWithI18N` utility in the lib package
- Updated all emails to use the `<Tailwind>` component at the top level
due to rendering constraints
- Updated the `i18n.server.tsx` file to not use a top level await

## Testing Performed

- Configured document language and verified emails were sent in the
expected language
- Created a document from a template and verified that the templates
language was transferred to the document
This commit is contained in:
Lucas Smith
2024-11-05 11:52:54 +11:00
committed by GitHub
parent 04b1ce1aab
commit 4dd95016b1
163 changed files with 3549 additions and 1461 deletions

View File

@ -301,6 +301,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
dateFormat: dateFormat?.value,
redirectUrl: body.meta.redirectUrl,
signingOrder: body.meta.signingOrder,
language: body.meta.language,
requestMetadata: extractNextApiRequestMetadata(args.req),
});

View File

@ -2,6 +2,7 @@ import { extendZodWithOpenApi } from '@anatine/zod-openapi';
import { z } from 'zod';
import { DATE_FORMATS, DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats';
import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n';
import '@documenso/lib/constants/time-zones';
import { DEFAULT_DOCUMENT_TIME_ZONE, TIME_ZONES } from '@documenso/lib/constants/time-zones';
import { ZUrlSchema } from '@documenso/lib/schemas/common';
@ -127,6 +128,7 @@ export const ZCreateDocumentMutationSchema = z.object({
}),
redirectUrl: z.string(),
signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
language: z.enum(SUPPORTED_LANGUAGE_CODES).optional(),
})
.partial(),
authOptions: z
@ -181,6 +183,7 @@ export const ZCreateDocumentFromTemplateMutationSchema = z.object({
dateFormat: z.string(),
redirectUrl: z.string(),
signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
language: z.enum(SUPPORTED_LANGUAGE_CODES).optional(),
})
.partial()
.optional(),
@ -247,6 +250,7 @@ export const ZGenerateDocumentFromTemplateMutationSchema = z.object({
dateFormat: z.string(),
redirectUrl: ZUrlSchema,
signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
language: z.enum(SUPPORTED_LANGUAGE_CODES).optional(),
})
.partial()
.optional(),

View File

@ -1 +0,0 @@
export { render, renderAsync } from '@react-email/render';

39
packages/email/render.tsx Normal file
View File

@ -0,0 +1,39 @@
import * as reactEmail from '@react-email/render';
import config from '@documenso/tailwind-config';
import { Tailwind } from './components';
export const render: typeof reactEmail.render = (element, options) => {
return reactEmail.render(
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
{element}
</Tailwind>,
options,
);
};
export const renderAsync: typeof reactEmail.renderAsync = async (element, options) => {
return reactEmail.renderAsync(
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
{element}
</Tailwind>,
options,
);
};

View File

@ -1,3 +1,6 @@
import { Trans } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Button, Section, Text } from '../components';
import { TemplateDocumentImage } from './template-document-image';
@ -10,17 +13,21 @@ export const TemplateConfirmationEmail = ({
confirmationLink,
assetBaseUrl,
}: TemplateConfirmationEmailProps) => {
const { _ } = useLingui();
return (
<>
<TemplateDocumentImage className="mt-6" assetBaseUrl={assetBaseUrl} />
<Section className="flex-row items-center justify-center">
<Text className="text-primary mx-auto mb-0 max-w-[80%] text-center text-lg font-semibold">
Welcome to Documenso!
<Trans>Welcome to Documenso!</Trans>
</Text>
<Text className="my-1 text-center text-base text-slate-400">
Before you get started, please confirm your email address by clicking the button below:
<Trans>
Before you get started, please confirm your email address by clicking the button below:
</Trans>
</Text>
<Section className="mb-6 mt-8 text-center">
@ -28,11 +35,13 @@ export const TemplateConfirmationEmail = ({
className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline"
href={confirmationLink}
>
Confirm email
<Trans>Confirm email</Trans>
</Button>
<Text className="mt-8 text-center text-sm italic text-slate-400">
You can also copy and paste this link into your browser: {confirmationLink} (link
expires in 1 hour)
<Trans>
You can also copy and paste this link into your browser: {confirmationLink} (link
expires in 1 hour)
</Trans>
</Text>
</Section>
</Section>

View File

@ -1,3 +1,5 @@
import { Trans } from '@lingui/macro';
import { Section, Text } from '../components';
import { TemplateDocumentImage } from './template-document-image';
@ -19,16 +21,18 @@ export const TemplateDocumentCancel = ({
<Section>
<Text className="text-primary mx-auto mb-0 max-w-[80%] text-center text-lg font-semibold">
{inviterName} has cancelled the document
<br />"{documentName}"
<Trans>
{inviterName} has cancelled the document
<br />"{documentName}"
</Trans>
</Text>
<Text className="my-1 text-center text-base text-slate-400">
All signatures have been voided.
<Trans>All signatures have been voided.</Trans>
</Text>
<Text className="my-1 text-center text-base text-slate-400">
You don't need to sign it anymore.
<Trans>You don't need to sign it anymore.</Trans>
</Text>
</Section>
</>

View File

@ -1,3 +1,5 @@
import { Trans } from '@lingui/macro';
import { Button, Column, Img, Section, Text } from '../components';
import { TemplateDocumentImage } from './template-document-image';
@ -30,17 +32,17 @@ export const TemplateDocumentCompleted = ({
src={getAssetUrl('/static/completed.png')}
className="-mt-0.5 mr-2 inline h-7 w-7 align-middle"
/>
Completed
<Trans>Completed</Trans>
</Text>
</Column>
</Section>
<Text className="text-primary mb-0 text-center text-lg font-semibold">
{customBody ?? `${documentName}” was signed by all signers`}
<Trans>{customBody ?? `${documentName}” was signed by all signers`}</Trans>
</Text>
<Text className="my-1 text-center text-base text-slate-400">
Continue by downloading the document.
<Trans>Continue by downloading the document.</Trans>
</Text>
<Section className="mb-6 mt-8 text-center">
@ -59,7 +61,7 @@ export const TemplateDocumentCompleted = ({
src={getAssetUrl('/static/download.png')}
className="mb-0.5 mr-2 inline h-5 w-5 align-middle"
/>
Download
<Trans>Download</Trans>
</Button>
</Section>
</Section>

View File

@ -1,3 +1,6 @@
import { Trans } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { RECIPIENT_ROLES_DESCRIPTION_ENG } from '@documenso/lib/constants/recipient-roles';
import type { RecipientRole } from '@documenso/prisma/client';
@ -26,6 +29,8 @@ export const TemplateDocumentInvite = ({
isTeamInvite,
teamName,
}: TemplateDocumentInviteProps) => {
const { _ } = useLingui();
const { actionVerb, progressiveVerb } = RECIPIENT_ROLES_DESCRIPTION_ENG[role];
return (
@ -35,28 +40,30 @@ export const TemplateDocumentInvite = ({
<Section>
<Text className="text-primary mx-auto mb-0 max-w-[80%] text-center text-lg font-semibold">
{selfSigner ? (
<>
{`Please ${actionVerb.toLowerCase()} your document`}
<Trans>
{`Please ${_(actionVerb).toLowerCase()} your document`}
<br />
{`"${documentName}"`}
</>
</Trans>
) : isTeamInvite ? (
<>
{`${inviterName} on behalf of ${teamName} has invited you to ${actionVerb.toLowerCase()}`}
<Trans>
{`${inviterName} on behalf of ${teamName} has invited you to ${_(
actionVerb,
).toLowerCase()}`}
<br />
{`"${documentName}"`}
</>
</Trans>
) : (
<>
{`${inviterName} has invited you to ${actionVerb.toLowerCase()}`}
<Trans>
{`${inviterName} has invited you to ${_(actionVerb).toLowerCase()}`}
<br />
{`"${documentName}"`}
</>
</Trans>
)}
</Text>
<Text className="my-1 text-center text-base text-slate-400">
Continue by {progressiveVerb.toLowerCase()} the document.
<Trans>Continue by {_(progressiveVerb).toLowerCase()} the document.</Trans>
</Text>
<Section className="mb-6 mt-8 text-center">
@ -64,7 +71,7 @@ export const TemplateDocumentInvite = ({
className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline"
href={signDocumentLink}
>
{actionVerb} Document
<Trans>{_(actionVerb)} Document</Trans>
</Button>
</Section>
</Section>

View File

@ -1,3 +1,5 @@
import { Trans } from '@lingui/macro';
import { Column, Img, Section, Text } from '../components';
import { TemplateDocumentImage } from './template-document-image';
@ -26,19 +28,21 @@ export const TemplateDocumentPending = ({
src={getAssetUrl('/static/clock.png')}
className="-mt-0.5 mr-2 inline h-7 w-7 align-middle"
/>
Waiting for others
<Trans>Waiting for others</Trans>
</Text>
</Column>
</Section>
<Text className="text-primary mb-0 text-center text-lg font-semibold">
{documentName} has been signed
<Trans>{documentName} has been signed</Trans>
</Text>
<Text className="mx-auto mb-6 mt-1 max-w-[80%] text-center text-base text-slate-400">
We're still waiting for other signers to sign this document.
<br />
We'll notify you as soon as it's ready.
<Trans>
We're still waiting for other signers to sign this document.
<br />
We'll notify you as soon as it's ready.
</Trans>
</Text>
</Section>
</>

View File

@ -1,3 +1,4 @@
import { Trans } from '@lingui/macro';
import { env } from 'next-runtime-env';
import { Button, Column, Img, Link, Section, Text } from '../components';
@ -32,25 +33,27 @@ export const TemplateDocumentSelfSigned = ({
src={getAssetUrl('/static/completed.png')}
className="-mt-0.5 mr-2 inline h-7 w-7 align-middle"
/>
Completed
<Trans>Completed</Trans>
</Text>
</Column>
</Section>
<Text className="text-primary mb-0 mt-6 text-center text-lg font-semibold">
You have signed {documentName}
<Trans>You have signed {documentName}</Trans>
</Text>
<Text className="mx-auto mb-6 mt-1 max-w-[80%] text-center text-base text-slate-400">
Create a{' '}
<Link
href={signUpUrl}
target="_blank"
className="text-documenso-700 hover:text-documenso-600 whitespace-nowrap"
>
free account
</Link>{' '}
to access your signed documents at any time.
<Trans>
Create a{' '}
<Link
href={signUpUrl}
target="_blank"
className="text-documenso-700 hover:text-documenso-600 whitespace-nowrap"
>
free account
</Link>{' '}
to access your signed documents at any time.
</Trans>
</Text>
<Section className="mb-6 mt-8 text-center">
@ -62,7 +65,7 @@ export const TemplateDocumentSelfSigned = ({
src={getAssetUrl('/static/user-plus.png')}
className="mb-0.5 mr-2 inline h-5 w-5 align-middle"
/>
Create account
<Trans>Create account</Trans>
</Button>
<Button
@ -73,7 +76,7 @@ export const TemplateDocumentSelfSigned = ({
src={getAssetUrl('/static/review.png')}
className="mb-0.5 mr-2 inline h-5 w-5 align-middle"
/>
View plans
<Trans>View plans</Trans>
</Button>
</Section>
</Section>

View File

@ -1,3 +1,5 @@
import { Trans } from '@lingui/macro';
import { Section, Text } from '../components';
import { TemplateDocumentImage } from './template-document-image';
@ -18,20 +20,22 @@ export const TemplateDocumentDelete = ({
<Section>
<Text className="text-primary mb-0 mt-6 text-left text-lg font-semibold">
Your document has been deleted by an admin!
<Trans>Your document has been deleted by an admin!</Trans>
</Text>
<Text className="mx-auto mb-6 mt-1 text-left text-base text-slate-400">
"{documentName}" has been deleted by an admin.
<Trans>"{documentName}" has been deleted by an admin.</Trans>
</Text>
<Text className="mx-auto mb-6 mt-1 text-left text-base text-slate-400">
This document can not be recovered, if you would like to dispute the reason for future
documents please contact support.
<Trans>
This document can not be recovered, if you would like to dispute the reason for future
documents please contact support.
</Trans>
</Text>
<Text className="mx-auto mt-1 text-left text-base text-slate-400">
The reason provided for deletion is the following:
<Trans>The reason provided for deletion is the following:</Trans>
</Text>
<Text className="mx-auto mb-6 mt-1 text-left text-base italic text-slate-400">

View File

@ -1,3 +1,5 @@
import { Trans } from '@lingui/macro';
import { Link, Section, Text } from '../components';
export type TemplateFooterProps = {
@ -9,10 +11,12 @@ export const TemplateFooter = ({ isDocument = true }: TemplateFooterProps) => {
<Section>
{isDocument && (
<Text className="my-4 text-base text-slate-400">
This document was sent using{' '}
<Link className="text-[#7AC455]" href="https://documen.so/mail-footer">
Documenso.
</Link>
<Trans>
This document was sent using{' '}
<Link className="text-[#7AC455]" href="https://documen.so/mail-footer">
Documenso.
</Link>
</Trans>
</Text>
)}

View File

@ -1,3 +1,5 @@
import { Trans } from '@lingui/macro';
import { Button, Section, Text } from '../components';
import { TemplateDocumentImage } from './template-document-image';
@ -16,11 +18,11 @@ export const TemplateForgotPassword = ({
<Section className="flex-row items-center justify-center">
<Text className="text-primary mx-auto mb-0 max-w-[80%] text-center text-lg font-semibold">
Forgot your password?
<Trans>Forgot your password?</Trans>
</Text>
<Text className="my-1 text-center text-base text-slate-400">
That's okay, it happens! Click the button below to reset your password.
<Trans>That's okay, it happens! Click the button below to reset your password.</Trans>
</Text>
<Section className="mb-6 mt-8 text-center">
@ -28,7 +30,7 @@ export const TemplateForgotPassword = ({
className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline"
href={resetPasswordLink}
>
Reset Password
<Trans>Reset Password</Trans>
</Button>
</Section>
</Section>

View File

@ -1,3 +1,4 @@
import { Trans } from '@lingui/macro';
import { env } from 'next-runtime-env';
import { Button, Section, Text } from '../components';
@ -18,11 +19,11 @@ export const TemplateResetPassword = ({ assetBaseUrl }: TemplateResetPasswordPro
<Section className="flex-row items-center justify-center">
<Text className="text-primary mx-auto mb-0 max-w-[80%] text-center text-lg font-semibold">
Password updated!
<Trans>Password updated!</Trans>
</Text>
<Text className="my-1 text-center text-base text-slate-400">
Your password has been updated.
<Trans>Your password has been updated.</Trans>
</Text>
<Section className="mb-6 mt-8 text-center">
@ -30,7 +31,7 @@ export const TemplateResetPassword = ({ assetBaseUrl }: TemplateResetPasswordPro
className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline"
href={`${NEXT_PUBLIC_WEBAPP_URL ?? 'http://localhost:3000'}/signin`}
>
Sign In
<Trans>Sign In</Trans>
</Button>
</Section>
</Section>

View File

@ -1,6 +1,7 @@
import config from '@documenso/tailwind-config';
import { msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components';
import { Body, Container, Head, Html, Img, Preview, Section } from '../components';
import type { TemplateConfirmationEmailProps } from '../template-components/template-confirmation-email';
import { TemplateConfirmationEmail } from '../template-components/template-confirmation-email';
import { TemplateFooter } from '../template-components/template-footer';
@ -9,7 +10,9 @@ export const ConfirmEmailTemplate = ({
confirmationLink,
assetBaseUrl = 'http://localhost:3002',
}: TemplateConfirmationEmailProps) => {
const previewText = `Please confirm your email address`;
const { _ } = useLingui();
const previewText = msg`Please confirm your email address`;
const getAssetUrl = (path: string) => {
return new URL(path, assetBaseUrl).toString();
@ -18,40 +21,30 @@ export const ConfirmEmailTemplate = ({
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Preview>{_(previewText)}</Preview>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<TemplateConfirmationEmail
confirmationLink={confirmationLink}
assetBaseUrl={assetBaseUrl}
/>
</Section>
</Container>
<div className="mx-auto mt-12 max-w-xl" />
<TemplateConfirmationEmail
confirmationLink={confirmationLink}
assetBaseUrl={assetBaseUrl}
/>
</Section>
</Container>
<div className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Tailwind>
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,5 +1,7 @@
import { msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { formatTeamUrl } from '@documenso/lib/utils/teams';
import config from '@documenso/tailwind-config';
import {
Body,
@ -11,7 +13,6 @@ import {
Link,
Preview,
Section,
Tailwind,
Text,
} from '../components';
import { TemplateFooter } from '../template-components/template-footer';
@ -32,97 +33,90 @@ export const ConfirmTeamEmailTemplate = ({
teamUrl = 'demo',
token = '',
}: ConfirmTeamEmailProps) => {
const previewText = `Accept team email request for ${teamName} on Documenso`;
const { _ } = useLingui();
const previewText = msg`Accept team email request for ${teamName} on Documenso`;
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 px-2 pt-2 backdrop-blur-sm">
<Preview>{_(previewText)}</Preview>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 px-2 pt-2 backdrop-blur-sm">
<TemplateImage
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
/>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
staticAsset="mail-open.png"
/>
</Section>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
staticAsset="mail-open.png"
/>
</Section>
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">
Verify your team email address
</Text>
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">
Verify your team email address
<Text className="text-center text-base">
<span className="font-bold">{teamName}</span> has requested to use your email
address for their team on Documenso.
</Text>
<div className="mx-auto mt-6 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
<Section className="mt-6">
<Text className="my-0 text-sm">
By accepting this request, you will be granting <strong>{teamName}</strong> access
to:
</Text>
<Text className="text-center text-base">
<span className="font-bold">{teamName}</span> has requested to use your email
address for their team on Documenso.
<ul className="mb-0 mt-2">
<li className="text-sm">
View all documents sent to and from this email address
</li>
<li className="mt-1 text-sm">
Allow document recipients to reply directly to this email address
</li>
<li className="mt-1 text-sm">
Send documents on behalf of the team using the email address
</li>
</ul>
<Text className="mt-2 text-sm">
You can revoke access at any time in your team settings on Documenso{' '}
<Link href={`${baseUrl}/settings/teams`}>here.</Link>
</Text>
<div className="mx-auto mt-6 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
<Section className="mt-6">
<Text className="my-0 text-sm">
By accepting this request, you will be granting <strong>{teamName}</strong>{' '}
access to:
</Text>
<ul className="mb-0 mt-2">
<li className="text-sm">
View all documents sent to and from this email address
</li>
<li className="mt-1 text-sm">
Allow document recipients to reply directly to this email address
</li>
<li className="mt-1 text-sm">
Send documents on behalf of the team using the email address
</li>
</ul>
<Text className="mt-2 text-sm">
You can revoke access at any time in your team settings on Documenso{' '}
<Link href={`${baseUrl}/settings/teams`}>here.</Link>
</Text>
</Section>
<Section className="mb-6 mt-8 text-center">
<Button
className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline"
href={`${baseUrl}/team/verify/email/${token}`}
>
Accept
</Button>
</Section>
</Section>
<Text className="text-center text-xs text-slate-500">Link expires in 1 hour.</Text>
</Container>
<Section className="mb-6 mt-8 text-center">
<Button
className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline"
href={`${baseUrl}/team/verify/email/${token}`}
>
Accept
</Button>
</Section>
</Section>
<Hr className="mx-auto mt-12 max-w-xl" />
<Text className="text-center text-xs text-slate-500">Link expires in 1 hour.</Text>
</Container>
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Tailwind>
<Hr className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,6 +1,7 @@
import config from '@documenso/tailwind-config';
import { msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Body, Container, Head, Hr, Html, Img, Preview, Section, Tailwind } from '../components';
import { Body, Container, Head, Hr, Html, Img, Preview, Section } from '../components';
import type { TemplateDocumentCancelProps } from '../template-components/template-document-cancel';
import { TemplateDocumentCancel } from '../template-components/template-document-cancel';
import { TemplateFooter } from '../template-components/template-footer';
@ -13,7 +14,9 @@ export const DocumentCancelTemplate = ({
documentName = 'Open Source Pledge.pdf',
assetBaseUrl = 'http://localhost:3002',
}: DocumentCancelEmailTemplateProps) => {
const previewText = `${inviterName} has cancelled the document ${documentName}, you don't need to sign it anymore.`;
const { _ } = useLingui();
const previewText = msg`${inviterName} has cancelled the document ${documentName}, you don't need to sign it anymore.`;
const getAssetUrl = (path: string) => {
return new URL(path, assetBaseUrl).toString();
@ -22,43 +25,34 @@ export const DocumentCancelTemplate = ({
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Preview>{_(previewText)}</Preview>
<TemplateDocumentCancel
inviterName={inviterName}
inviterEmail={inviterEmail}
documentName={documentName}
assetBaseUrl={assetBaseUrl}
/>
</Section>
</Container>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Hr className="mx-auto mt-12 max-w-xl" />
<TemplateDocumentCancel
inviterName={inviterName}
inviterEmail={inviterEmail}
documentName={documentName}
assetBaseUrl={assetBaseUrl}
/>
</Section>
</Container>
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Tailwind>
<Hr className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,6 +1,7 @@
import config from '@documenso/tailwind-config';
import { msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components';
import { Body, Container, Head, Html, Img, Preview, Section } from '../components';
import type { TemplateDocumentCompletedProps } from '../template-components/template-document-completed';
import { TemplateDocumentCompleted } from '../template-components/template-document-completed';
import { TemplateFooter } from '../template-components/template-footer';
@ -15,7 +16,9 @@ export const DocumentCompletedEmailTemplate = ({
assetBaseUrl = 'http://localhost:3002',
customBody,
}: DocumentCompletedEmailTemplateProps) => {
const previewText = `Completed Document`;
const { _ } = useLingui();
const previewText = msg`Completed Document`;
const getAssetUrl = (path: string) => {
return new URL(path, assetBaseUrl).toString();
@ -24,41 +27,32 @@ export const DocumentCompletedEmailTemplate = ({
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<Section className="p-2">
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Preview>{_(previewText)}</Preview>
<TemplateDocumentCompleted
downloadLink={downloadLink}
documentName={documentName}
assetBaseUrl={assetBaseUrl}
customBody={customBody}
/>
</Section>
</Container>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<Section className="p-2">
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Tailwind>
<TemplateDocumentCompleted
downloadLink={downloadLink}
documentName={documentName}
assetBaseUrl={assetBaseUrl}
customBody={customBody}
/>
</Section>
</Container>
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,18 +1,9 @@
import { RECIPIENT_ROLES_DESCRIPTION_ENG } from '@documenso/lib/constants/recipient-roles';
import config from '@documenso/tailwind-config';
import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import {
Body,
Button,
Container,
Head,
Html,
Img,
Preview,
Section,
Tailwind,
Text,
} from '../components';
import { RECIPIENT_ROLES_DESCRIPTION_ENG } from '@documenso/lib/constants/recipient-roles';
import { Body, Button, Container, Head, Html, Img, Preview, Section, Text } from '../components';
import TemplateDocumentImage from '../template-components/template-document-image';
import { TemplateFooter } from '../template-components/template-footer';
import { RecipientRole } from '.prisma/client';
@ -32,9 +23,11 @@ export const DocumentCreatedFromDirectTemplateEmailTemplate = ({
documentName = 'Open Source Pledge.pdf',
assetBaseUrl = 'http://localhost:3002',
}: DocumentCompletedEmailTemplateProps) => {
const action = RECIPIENT_ROLES_DESCRIPTION_ENG[recipientRole].actioned.toLowerCase();
const { _ } = useLingui();
const previewText = `Document created from direct template`;
const action = _(RECIPIENT_ROLES_DESCRIPTION_ENG[recipientRole].actioned).toLowerCase();
const previewText = msg`Document created from direct template`;
const getAssetUrl = (path: string) => {
return new URL(path, assetBaseUrl).toString();
@ -43,55 +36,48 @@ export const DocumentCreatedFromDirectTemplateEmailTemplate = ({
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<Section className="p-2">
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Preview>{_(previewText)}</Preview>
<TemplateDocumentImage className="mt-6" assetBaseUrl={assetBaseUrl} />
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<Section className="p-2">
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Section>
<Text className="text-primary mb-0 text-center text-lg font-semibold">
<TemplateDocumentImage className="mt-6" assetBaseUrl={assetBaseUrl} />
<Section>
<Text className="text-primary mb-0 text-center text-lg font-semibold">
<Trans>
{recipientName} {action} a document by using one of your direct links
</Text>
</Trans>
</Text>
<div className="mx-auto my-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-sm text-slate-600">
{documentName}
</div>
<div className="mx-auto my-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-sm text-slate-600">
{documentName}
</div>
<Section className="my-6 text-center">
<Button
className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline"
href={documentLink}
>
View document
</Button>
</Section>
<Section className="my-6 text-center">
<Button
className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline"
href={documentLink}
>
<Trans>View document</Trans>
</Button>
</Section>
</Section>
</Container>
</Section>
</Container>
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Tailwind>
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,20 +1,10 @@
import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { RECIPIENT_ROLES_DESCRIPTION_ENG } from '@documenso/lib/constants/recipient-roles';
import type { RecipientRole } from '@documenso/prisma/client';
import config from '@documenso/tailwind-config';
import {
Body,
Container,
Head,
Hr,
Html,
Img,
Link,
Preview,
Section,
Tailwind,
Text,
} from '../components';
import { Body, Container, Head, Hr, Html, Img, Link, Preview, Section, Text } from '../components';
import type { TemplateDocumentInviteProps } from '../template-components/template-document-invite';
import { TemplateDocumentInvite } from '../template-components/template-document-invite';
import { TemplateFooter } from '../template-components/template-footer';
@ -40,13 +30,15 @@ export const DocumentInviteEmailTemplate = ({
isTeamInvite = false,
teamName,
}: DocumentInviteEmailTemplateProps) => {
const action = RECIPIENT_ROLES_DESCRIPTION_ENG[role].actionVerb.toLowerCase();
const { _ } = useLingui();
const action = _(RECIPIENT_ROLES_DESCRIPTION_ENG[role].actionVerb).toLowerCase();
const previewText = selfSigner
? `Please ${action} your document ${documentName}`
? msg`Please ${action} your document ${documentName}`
: isTeamInvite
? `${inviterName} on behalf of ${teamName} has invited you to ${action} ${documentName}`
: `${inviterName} has invited you to ${action} ${documentName}`;
? msg`${inviterName} on behalf of ${teamName} has invited you to ${action} ${documentName}`
: msg`${inviterName} has invited you to ${action} ${documentName}`;
const getAssetUrl = (path: string) => {
return new URL(path, assetBaseUrl).toString();
@ -55,67 +47,62 @@ export const DocumentInviteEmailTemplate = ({
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Preview>{_(previewText)}</Preview>
<TemplateDocumentInvite
inviterName={inviterName}
inviterEmail={inviterEmail}
documentName={documentName}
signDocumentLink={signDocumentLink}
assetBaseUrl={assetBaseUrl}
role={role}
selfSigner={selfSigner}
isTeamInvite={isTeamInvite}
teamName={teamName}
/>
</Section>
</Container>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Container className="mx-auto mt-12 max-w-xl">
<Section>
<Text className="my-4 text-base font-semibold">
<TemplateDocumentInvite
inviterName={inviterName}
inviterEmail={inviterEmail}
documentName={documentName}
signDocumentLink={signDocumentLink}
assetBaseUrl={assetBaseUrl}
role={role}
selfSigner={selfSigner}
isTeamInvite={isTeamInvite}
teamName={teamName}
/>
</Section>
</Container>
<Container className="mx-auto mt-12 max-w-xl">
<Section>
<Text className="my-4 text-base font-semibold">
<Trans>
{inviterName}{' '}
<Link className="font-normal text-slate-400" href="mailto:{inviterEmail}">
({inviterEmail})
</Link>
</Text>
</Trans>
</Text>
<Text className="mt-2 text-base text-slate-400">
{customBody ? (
<pre className="font-sans text-base text-slate-400">{customBody}</pre>
) : (
<Text className="mt-2 text-base text-slate-400">
{customBody ? (
<pre className="font-sans text-base text-slate-400">{customBody}</pre>
) : (
<Trans>
`${inviterName} has invited you to ${action} the document "${documentName}".`
)}
</Text>
</Section>
</Container>
</Trans>
)}
</Text>
</Section>
</Container>
<Hr className="mx-auto mt-12 max-w-xl" />
<Hr className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Tailwind>
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,6 +1,7 @@
import config from '@documenso/tailwind-config';
import { msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components';
import { Body, Container, Head, Html, Img, Preview, Section } from '../components';
import type { TemplateDocumentPendingProps } from '../template-components/template-document-pending';
import { TemplateDocumentPending } from '../template-components/template-document-pending';
import { TemplateFooter } from '../template-components/template-footer';
@ -11,7 +12,9 @@ export const DocumentPendingEmailTemplate = ({
documentName = 'Open Source Pledge.pdf',
assetBaseUrl = 'http://localhost:3002',
}: DocumentPendingEmailTemplateProps) => {
const previewText = `Pending Document`;
const { _ } = useLingui();
const previewText = msg`Pending Document`;
const getAssetUrl = (path: string) => {
return new URL(path, assetBaseUrl).toString();
@ -20,36 +23,27 @@ export const DocumentPendingEmailTemplate = ({
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Preview>{_(previewText)}</Preview>
<TemplateDocumentPending documentName={documentName} assetBaseUrl={assetBaseUrl} />
</Section>
</Container>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Tailwind>
<TemplateDocumentPending documentName={documentName} assetBaseUrl={assetBaseUrl} />
</Section>
</Container>
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,6 +1,7 @@
import config from '@documenso/tailwind-config';
import { msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components';
import { Body, Container, Head, Html, Img, Preview, Section } from '../components';
import type { TemplateDocumentSelfSignedProps } from '../template-components/template-document-self-signed';
import { TemplateDocumentSelfSigned } from '../template-components/template-document-self-signed';
import { TemplateFooter } from '../template-components/template-footer';
@ -11,7 +12,9 @@ export const DocumentSelfSignedEmailTemplate = ({
documentName = 'Open Source Pledge.pdf',
assetBaseUrl = 'http://localhost:3002',
}: DocumentSelfSignedTemplateProps) => {
const previewText = `Completed Document`;
const { _ } = useLingui();
const previewText = msg`Completed Document`;
const getAssetUrl = (path: string) => {
return new URL(path, assetBaseUrl).toString();
@ -20,39 +23,27 @@ export const DocumentSelfSignedEmailTemplate = ({
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<Section className="p-2">
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Preview>{_(previewText)}</Preview>
<TemplateDocumentSelfSigned
documentName={documentName}
assetBaseUrl={assetBaseUrl}
/>
</Section>
</Container>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<Section className="p-2">
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Tailwind>
<TemplateDocumentSelfSigned documentName={documentName} assetBaseUrl={assetBaseUrl} />
</Section>
</Container>
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,6 +1,7 @@
import config from '@documenso/tailwind-config';
import { msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Body, Container, Head, Hr, Html, Img, Preview, Section, Tailwind } from '../components';
import { Body, Container, Head, Hr, Html, Img, Preview, Section } from '../components';
import {
TemplateDocumentDelete,
type TemplateDocumentDeleteProps,
@ -14,7 +15,9 @@ export const DocumentSuperDeleteEmailTemplate = ({
assetBaseUrl = 'http://localhost:3002',
reason = 'Unknown',
}: DocumentDeleteEmailTemplateProps) => {
const previewText = `An admin has deleted your document "${documentName}".`;
const { _ } = useLingui();
const previewText = msg`An admin has deleted your document "${documentName}".`;
const getAssetUrl = (path: string) => {
return new URL(path, assetBaseUrl).toString();
@ -23,42 +26,33 @@ export const DocumentSuperDeleteEmailTemplate = ({
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Preview>{_(previewText)}</Preview>
<TemplateDocumentDelete
reason={reason}
documentName={documentName}
assetBaseUrl={assetBaseUrl}
/>
</Section>
</Container>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Hr className="mx-auto mt-12 max-w-xl" />
<TemplateDocumentDelete
reason={reason}
documentName={documentName}
assetBaseUrl={assetBaseUrl}
/>
</Section>
</Container>
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Tailwind>
<Hr className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,6 +1,7 @@
import config from '@documenso/tailwind-config';
import { msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components';
import { Body, Container, Head, Html, Img, Preview, Section } from '../components';
import { TemplateFooter } from '../template-components/template-footer';
import type { TemplateForgotPasswordProps } from '../template-components/template-forgot-password';
import { TemplateForgotPassword } from '../template-components/template-forgot-password';
@ -11,7 +12,9 @@ export const ForgotPasswordTemplate = ({
resetPasswordLink = 'https://documenso.com',
assetBaseUrl = 'http://localhost:3002',
}: ForgotPasswordTemplateProps) => {
const previewText = `Password Reset Requested`;
const { _ } = useLingui();
const previewText = msg`Password Reset Requested`;
const getAssetUrl = (path: string) => {
return new URL(path, assetBaseUrl).toString();
@ -20,41 +23,32 @@ export const ForgotPasswordTemplate = ({
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Preview>{_(previewText)}</Preview>
<TemplateForgotPassword
resetPasswordLink={resetPasswordLink}
assetBaseUrl={assetBaseUrl}
/>
</Section>
</Container>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<div className="mx-auto mt-12 max-w-xl" />
<TemplateForgotPassword
resetPasswordLink={resetPasswordLink}
assetBaseUrl={assetBaseUrl}
/>
</Section>
</Container>
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Tailwind>
<div className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,17 +1,7 @@
import config from '@documenso/tailwind-config';
import { msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import {
Body,
Container,
Head,
Hr,
Html,
Img,
Preview,
Section,
Tailwind,
Text,
} from '../components';
import { Body, Container, Head, Hr, Html, Img, Preview, Section, Text } from '../components';
import type { TemplateDocumentCancelProps } from '../template-components/template-document-cancel';
import TemplateDocumentImage from '../template-components/template-document-image';
import { TemplateFooter } from '../template-components/template-footer';
@ -23,7 +13,9 @@ export const RecipientRemovedFromDocumentTemplate = ({
documentName = 'Open Source Pledge.pdf',
assetBaseUrl = 'http://localhost:3002',
}: DocumentCancelEmailTemplateProps) => {
const previewText = `${inviterName} has removed you from the document ${documentName}.`;
const { _ } = useLingui();
const previewText = msg`${inviterName} has removed you from the document ${documentName}.`;
const getAssetUrl = (path: string) => {
return new URL(path, assetBaseUrl).toString();
@ -32,45 +24,36 @@ export const RecipientRemovedFromDocumentTemplate = ({
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Preview>{_(previewText)}</Preview>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<TemplateDocumentImage className="mt-6" assetBaseUrl={assetBaseUrl} />
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<TemplateDocumentImage className="mt-6" assetBaseUrl={assetBaseUrl} />
<Section>
<Text className="text-primary mx-auto mb-0 max-w-[80%] text-center text-lg font-semibold">
{inviterName} has removed you from the document
<br />"{documentName}"
</Text>
</Section>
<Text className="text-primary mx-auto mb-0 max-w-[80%] text-center text-lg font-semibold">
{inviterName} has removed you from the document
<br />"{documentName}"
</Text>
</Section>
</Container>
</Section>
</Container>
<Hr className="mx-auto mt-12 max-w-xl" />
<Hr className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Tailwind>
<Container className="mx-auto max-w-xl">
<TemplateFooter />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,18 +1,7 @@
import config from '@documenso/tailwind-config';
import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import {
Body,
Container,
Head,
Hr,
Html,
Img,
Link,
Preview,
Section,
Tailwind,
Text,
} from '../components';
import { Body, Container, Head, Hr, Html, Img, Link, Preview, Section, Text } from '../components';
import { TemplateFooter } from '../template-components/template-footer';
import type { TemplateResetPasswordProps } from '../template-components/template-reset-password';
import { TemplateResetPassword } from '../template-components/template-reset-password';
@ -24,7 +13,9 @@ export const ResetPasswordTemplate = ({
userEmail = 'lucas@documenso.com',
assetBaseUrl = 'http://localhost:3002',
}: ResetPasswordTemplateProps) => {
const previewText = `Password Reset Successful`;
const { _ } = useLingui();
const previewText = msg`Password Reset Successful`;
const getAssetUrl = (path: string) => {
return new URL(path, assetBaseUrl).toString();
@ -33,65 +24,62 @@ export const ResetPasswordTemplate = ({
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Preview>{_(previewText)}</Preview>
<TemplateResetPassword
userName={userName}
userEmail={userEmail}
assetBaseUrl={assetBaseUrl}
/>
</Section>
</Container>
<Body className="mx-auto my-auto bg-white font-sans">
<Section>
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-4 backdrop-blur-sm">
<Section>
<Img
src={getAssetUrl('/static/logo.png')}
alt="Documenso Logo"
className="mb-4 h-6"
/>
<Container className="mx-auto mt-12 max-w-xl">
<Section>
<Text className="my-4 text-base font-semibold">
<TemplateResetPassword
userName={userName}
userEmail={userEmail}
assetBaseUrl={assetBaseUrl}
/>
</Section>
</Container>
<Container className="mx-auto mt-12 max-w-xl">
<Section>
<Text className="my-4 text-base font-semibold">
<Trans>
Hi, {userName}{' '}
<Link className="font-normal text-slate-400" href={`mailto:${userEmail}`}>
({userEmail})
</Link>
</Text>
</Trans>
</Text>
<Text className="mt-2 text-base text-slate-400">
<Text className="mt-2 text-base text-slate-400">
<Trans>
We've changed your password as you asked. You can now sign in with your new
password.
</Text>
<Text className="mt-2 text-base text-slate-400">
</Trans>
</Text>
<Text className="mt-2 text-base text-slate-400">
<Trans>
Didn't request a password change? We are here to help you secure your account,
just{' '}
<Link className="text-documenso-700 font-normal" href="mailto:hi@documenso.com">
contact us.
</Link>
</Text>
</Section>
</Container>
</Trans>
</Text>
</Section>
</Container>
<Hr className="mx-auto mt-12 max-w-xl" />
<Hr className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Tailwind>
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,7 +1,9 @@
import { formatTeamUrl } from '@documenso/lib/utils/teams';
import config from '@documenso/tailwind-config';
import { msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Body, Container, Head, Hr, Html, Preview, Section, Tailwind, Text } from '../components';
import { formatTeamUrl } from '@documenso/lib/utils/teams';
import { Body, Container, Head, Hr, Html, Preview, Section, Text } from '../components';
import { TemplateFooter } from '../template-components/template-footer';
import TemplateImage from '../template-components/template-image';
@ -18,67 +20,60 @@ export const TeamDeleteEmailTemplate = ({
teamUrl = 'demo',
isOwner = false,
}: TeamDeleteEmailProps) => {
const { _ } = useLingui();
const previewText = isOwner
? 'Your team has been deleted'
: 'A team you were a part of has been deleted';
? msg`Your team has been deleted`
: msg`A team you were a part of has been deleted`;
const title = isOwner
? 'Your team has been deleted'
: 'A team you were a part of has been deleted';
? msg`Your team has been deleted`
: msg`A team you were a part of has been deleted`;
const description = isOwner
? 'The following team has been deleted by you'
: 'The following team has been deleted by its owner. You will no longer be able to access this team and its documents';
? msg`The following team has been deleted by you`
: msg`The following team has been deleted by its owner. You will no longer be able to access this team and its documents`;
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white text-slate-500">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<Preview>{_(previewText)}</Preview>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white text-slate-500">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<TemplateImage
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
/>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
staticAsset="delete-team.png"
/>
</Section>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
staticAsset="delete-team.png"
/>
</Section>
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">{_(title)}</Text>
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">{title}</Text>
<Text className="my-1 text-center text-base">{_(description)}</Text>
<Text className="my-1 text-center text-base">{description}</Text>
<div className="mx-auto my-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
</Section>
</Container>
<div className="mx-auto my-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
</Section>
</Container>
<Hr className="mx-auto mt-12 max-w-xl" />
<Hr className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Tailwind>
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,7 +1,9 @@
import { formatTeamUrl } from '@documenso/lib/utils/teams';
import config from '@documenso/tailwind-config';
import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Body, Container, Head, Hr, Html, Preview, Section, Tailwind, Text } from '../components';
import { formatTeamUrl } from '@documenso/lib/utils/teams';
import { Body, Container, Head, Hr, Html, Preview, Section, Text } from '../components';
import { TemplateFooter } from '../template-components/template-footer';
import TemplateImage from '../template-components/template-image';
@ -20,62 +22,57 @@ export const TeamEmailRemovedTemplate = ({
teamName = 'Team Name',
teamUrl = 'demo',
}: TeamEmailRemovedTemplateProps) => {
const previewText = `Team email removed for ${teamName} on Documenso`;
const { _ } = useLingui();
const previewText = msg`Team email removed for ${teamName} on Documenso`;
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white text-slate-500">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 px-2 pt-2 backdrop-blur-sm">
<Preview>{_(previewText)}</Preview>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white text-slate-500">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 px-2 pt-2 backdrop-blur-sm">
<TemplateImage
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
/>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
staticAsset="mail-open-alert.png"
/>
</Section>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
staticAsset="mail-open-alert.png"
/>
</Section>
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">
<Trans>Team email removed</Trans>
</Text>
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">
Team email removed
</Text>
<Text className="my-1 text-center text-base">
<Text className="my-1 text-center text-base">
<Trans>
The team email <span className="font-bold">{teamEmail}</span> has been removed
from the following team
</Text>
</Trans>
</Text>
<div className="mx-auto mb-6 mt-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
</Section>
</Container>
<div className="mx-auto mb-6 mt-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
</Section>
</Container>
<Hr className="mx-auto mt-12 max-w-xl" />
<Hr className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Tailwind>
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,18 +1,9 @@
import { formatTeamUrl } from '@documenso/lib/utils/teams';
import config from '@documenso/tailwind-config';
import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import {
Body,
Button,
Container,
Head,
Hr,
Html,
Preview,
Section,
Tailwind,
Text,
} from '../components';
import { formatTeamUrl } from '@documenso/lib/utils/teams';
import { Body, Button, Container, Head, Hr, Html, Preview, Section, Text } from '../components';
import { TemplateFooter } from '../template-components/template-footer';
import TemplateImage from '../template-components/template-image';
@ -33,80 +24,75 @@ export const TeamInviteEmailTemplate = ({
teamUrl = 'demo',
token = '',
}: TeamInviteEmailProps) => {
const previewText = `Accept invitation to join a team on Documenso`;
const { _ } = useLingui();
const previewText = msg`Accept invitation to join a team on Documenso`;
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white text-slate-500">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<Preview>{_(previewText)}</Preview>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white text-slate-500">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<TemplateImage
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
/>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
staticAsset="add-user.png"
/>
</Section>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
staticAsset="add-user.png"
/>
</Section>
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">
<Trans>Join {teamName} on Documenso</Trans>
</Text>
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">
Join {teamName} on Documenso
</Text>
<Text className="my-1 text-center text-base">
<Trans>You have been invited to join the following team</Trans>
</Text>
<Text className="my-1 text-center text-base">
You have been invited to join the following team
</Text>
<div className="mx-auto my-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
<div className="mx-auto my-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
<Text className="my-1 text-center text-base">
<Text className="my-1 text-center text-base">
<Trans>
by <span className="text-slate-900">{senderName}</span>
</Text>
</Trans>
</Text>
<Section className="mb-6 mt-6 text-center">
<Button
className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline"
href={`${baseUrl}/team/invite/${token}`}
>
Accept
</Button>
<Button
className="ml-4 inline-flex items-center justify-center rounded-lg bg-gray-50 px-6 py-3 text-center text-sm font-medium text-slate-600 no-underline"
href={`${baseUrl}/team/decline/${token}`}
>
Decline
</Button>
</Section>
<Section className="mb-6 mt-6 text-center">
<Button
className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline"
href={`${baseUrl}/team/invite/${token}`}
>
<Trans>Accept</Trans>
</Button>
<Button
className="ml-4 inline-flex items-center justify-center rounded-lg bg-gray-50 px-6 py-3 text-center text-sm font-medium text-slate-600 no-underline"
href={`${baseUrl}/team/decline/${token}`}
>
<Trans>Decline</Trans>
</Button>
</Section>
</Container>
</Section>
</Container>
<Hr className="mx-auto mt-12 max-w-xl" />
<Hr className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Tailwind>
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,7 +1,9 @@
import { formatTeamUrl } from '@documenso/lib/utils/teams';
import config from '@documenso/tailwind-config';
import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Body, Container, Head, Hr, Html, Preview, Section, Tailwind, Text } from '../components';
import { formatTeamUrl } from '@documenso/lib/utils/teams';
import { Body, Container, Head, Hr, Html, Preview, Section, Text } from '../components';
import { TemplateFooter } from '../template-components/template-footer';
import TemplateImage from '../template-components/template-image';
@ -22,61 +24,56 @@ export const TeamJoinEmailTemplate = ({
teamName = 'Team Name',
teamUrl = 'demo',
}: TeamJoinEmailProps) => {
const previewText = 'A team member has joined a team on Documenso';
const { _ } = useLingui();
const previewText = msg`A team member has joined a team on Documenso`;
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white text-slate-500">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<Preview>{_(previewText)}</Preview>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white text-slate-500">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<TemplateImage
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
/>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
staticAsset="add-user.png"
/>
</Section>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
staticAsset="add-user.png"
/>
</Section>
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">
<Trans>
{memberName || memberEmail} joined the team {teamName} on Documenso
</Text>
</Trans>
</Text>
<Text className="my-1 text-center text-base">
{memberEmail} joined the following team
</Text>
<Text className="my-1 text-center text-base">
<Trans>{memberEmail} joined the following team</Trans>
</Text>
<div className="mx-auto my-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
</Section>
</Container>
<div className="mx-auto my-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
</Section>
</Container>
<Hr className="mx-auto mt-12 max-w-xl" />
<Hr className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Tailwind>
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,7 +1,9 @@
import { formatTeamUrl } from '@documenso/lib/utils/teams';
import config from '@documenso/tailwind-config';
import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { Body, Container, Head, Hr, Html, Preview, Section, Tailwind, Text } from '../components';
import { formatTeamUrl } from '@documenso/lib/utils/teams';
import { Body, Container, Head, Hr, Html, Preview, Section, Text } from '../components';
import { TemplateFooter } from '../template-components/template-footer';
import TemplateImage from '../template-components/template-image';
@ -22,61 +24,56 @@ export const TeamLeaveEmailTemplate = ({
teamName = 'Team Name',
teamUrl = 'demo',
}: TeamLeaveEmailProps) => {
const previewText = 'A team member has left a team on Documenso';
const { _ } = useLingui();
const previewText = msg`A team member has left a team on Documenso`;
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white text-slate-500">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<Preview>{_(previewText)}</Preview>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white text-slate-500">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 p-2 backdrop-blur-sm">
<TemplateImage
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
/>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
staticAsset="delete-user.png"
/>
</Section>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
staticAsset="delete-user.png"
/>
</Section>
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">
<Trans>
{memberName || memberEmail} left the team {teamName} on Documenso
</Text>
</Trans>
</Text>
<Text className="my-1 text-center text-base">
{memberEmail} left the following team
</Text>
<Text className="my-1 text-center text-base">
<Trans>{memberEmail} left the following team</Trans>
</Text>
<div className="mx-auto my-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
</Section>
</Container>
<div className="mx-auto my-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
</Section>
</Container>
<Hr className="mx-auto mt-12 max-w-xl" />
<Hr className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Tailwind>
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -1,18 +1,9 @@
import { formatTeamUrl } from '@documenso/lib/utils/teams';
import config from '@documenso/tailwind-config';
import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import {
Body,
Button,
Container,
Head,
Hr,
Html,
Preview,
Section,
Tailwind,
Text,
} from '../components';
import { formatTeamUrl } from '@documenso/lib/utils/teams';
import { Body, Button, Container, Head, Hr, Html, Preview, Section, Text } from '../components';
import { TemplateFooter } from '../template-components/template-footer';
import TemplateImage from '../template-components/template-image';
@ -33,78 +24,77 @@ export const TeamTransferRequestTemplate = ({
teamUrl = 'demo',
token = '',
}: TeamTransferRequestTemplateProps) => {
const previewText = 'Accept team transfer request on Documenso';
const { _ } = useLingui();
const previewText = msg`Accept team transfer request on Documenso`;
return (
<Html>
<Head />
<Preview>{previewText}</Preview>
<Tailwind
config={{
theme: {
extend: {
colors: config.theme.extend.colors,
},
},
}}
>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white text-slate-500">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 px-2 pt-2 backdrop-blur-sm">
<Preview>{_(previewText)}</Preview>
<Body className="mx-auto my-auto font-sans">
<Section className="bg-white text-slate-500">
<Container className="mx-auto mb-2 mt-8 max-w-xl rounded-lg border border-solid border-slate-200 px-2 pt-2 backdrop-blur-sm">
<TemplateImage
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
/>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
className="mb-4 h-6 p-2"
staticAsset="logo.png"
staticAsset="add-user.png"
/>
</Section>
<Section>
<TemplateImage
className="mx-auto"
assetBaseUrl={assetBaseUrl}
staticAsset="add-user.png"
/>
</Section>
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">
<Trans>{teamName} ownership transfer request</Trans>
</Text>
<Section className="p-2 text-slate-500">
<Text className="text-center text-lg font-medium text-black">
{teamName} ownership transfer request
</Text>
<Text className="my-1 text-center text-base">
<Text className="my-1 text-center text-base">
<Trans>
<span className="font-bold">{senderName}</span> has requested that you take
ownership of the following team
</Text>
</Trans>
</Text>
<div className="mx-auto my-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
<div className="mx-auto my-2 w-fit rounded-lg bg-gray-50 px-4 py-2 text-base font-medium text-slate-600">
{formatTeamUrl(teamUrl, baseUrl)}
</div>
<Text className="text-center text-sm">
<Text className="text-center text-sm">
<Trans>
By accepting this request, you will take responsibility for any billing items
associated with this team.
</Text>
</Trans>
</Text>
<Section className="mb-6 mt-6 text-center">
<Button
className="bg-documenso-500 ml-2 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline"
href={`${baseUrl}/team/verify/transfer/${token}`}
>
Accept
</Button>
</Section>
<Section className="mb-6 mt-6 text-center">
<Button
className="bg-documenso-500 ml-2 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline"
href={`${baseUrl}/team/verify/transfer/${token}`}
>
<Trans>Accept</Trans>
</Button>
</Section>
</Section>
<Text className="text-center text-xs">Link expires in 1 hour.</Text>
</Container>
<Text className="text-center text-xs">
<Trans>Link expires in 1 hour.</Trans>
</Text>
</Container>
<Hr className="mx-auto mt-12 max-w-xl" />
<Hr className="mx-auto mt-12 max-w-xl" />
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Tailwind>
<Container className="mx-auto max-w-xl">
<TemplateFooter isDocument={false} />
</Container>
</Section>
</Body>
</Html>
);
};

View File

@ -7,12 +7,17 @@ import { setupI18n } from '@lingui/core';
import { setI18n } from '@lingui/react/server';
import { IS_APP_WEB } from '../../constants/app';
import { SUPPORTED_LANGUAGE_CODES } from '../../constants/i18n';
import {
APP_I18N_OPTIONS,
SUPPORTED_LANGUAGE_CODES,
isValidLanguageCode,
} from '../../constants/i18n';
import { extractLocaleData } from '../../utils/i18n';
import { remember } from '../../utils/remember';
type SupportedLanguages = (typeof SUPPORTED_LANGUAGE_CODES)[number];
async function loadCatalog(lang: SupportedLanguages): Promise<{
export async function loadCatalog(lang: SupportedLanguages): Promise<{
[k: string]: Messages;
}> {
const extension = process.env.NODE_ENV === 'development' ? 'po' : 'js';
@ -20,14 +25,12 @@ async function loadCatalog(lang: SupportedLanguages): Promise<{
let { messages } = await import(`../../translations/${lang}/${context}.${extension}`);
// Dirty way to load common messages for development since it's not compiled.
if (process.env.NODE_ENV === 'development') {
const commonMessages = await import(`../../translations/${lang}/common.${extension}`);
if (extension === 'po') {
const { messages: commonMessages } = await import(
`../../translations/${lang}/common.${extension}`
);
messages = {
...messages,
...commonMessages.messages,
};
messages = { ...messages, ...commonMessages };
}
return {
@ -35,40 +38,63 @@ async function loadCatalog(lang: SupportedLanguages): Promise<{
};
}
const catalogs = await Promise.all(SUPPORTED_LANGUAGE_CODES.map(loadCatalog));
const catalogs = Promise.all(SUPPORTED_LANGUAGE_CODES.map(loadCatalog));
// transform array of catalogs into a single object
export const allMessages = catalogs.reduce((acc, oneCatalog) => {
return { ...acc, ...oneCatalog };
}, {});
const allMessages = async () => {
return await catalogs.then((catalogs) =>
catalogs.reduce((acc, oneCatalog) => {
return {
...acc,
...oneCatalog,
};
}, {}),
);
};
type AllI18nInstances = { [K in SupportedLanguages]: I18n };
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
export const allI18nInstances = SUPPORTED_LANGUAGE_CODES.reduce((acc, lang) => {
const messages = allMessages[lang] ?? {};
export const allI18nInstances = remember('i18n.allI18nInstances', async () => {
const loadedMessages = await allMessages();
const i18n = setupI18n({
locale: lang,
messages: { [lang]: messages },
});
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
return SUPPORTED_LANGUAGE_CODES.reduce((acc, lang) => {
const messages = loadedMessages[lang] ?? {};
return { ...acc, [lang]: i18n };
}, {}) as AllI18nInstances;
const i18n = setupI18n({
locale: lang,
messages: { [lang]: messages },
});
return { ...acc, [lang]: i18n };
}, {}) as AllI18nInstances;
});
// eslint-disable-next-line @typescript-eslint/ban-types
export const getI18nInstance = async (lang?: SupportedLanguages | (string & {})) => {
const instances = await allI18nInstances;
if (!isValidLanguageCode(lang)) {
return instances[APP_I18N_OPTIONS.sourceLang];
}
return instances[lang] ?? instances[APP_I18N_OPTIONS.sourceLang];
};
/**
* This needs to be run in all layouts and page server components that require i18n.
*
* https://lingui.dev/tutorials/react-rsc#pages-layouts-and-lingui
*/
export const setupI18nSSR = () => {
export const setupI18nSSR = async () => {
const { lang, locales } = extractLocaleData({
cookies: cookies(),
headers: headers(),
});
// Get and set a ready-made i18n instance for the given language.
const i18n = allI18nInstances[lang];
const i18n = await getI18nInstance(lang);
// Reactivate the i18n instance with the locale for date and number formatting.
i18n.activate(lang, locales);

View File

@ -47,3 +47,6 @@ export const SUPPORTED_LANGUAGES: Record<string, SupportedLanguage> = {
short: 'es',
},
} satisfies Record<SupportedLanguageCodes, SupportedLanguage>;
export const isValidLanguageCode = (code: unknown): code is SupportedLanguageCodes =>
SUPPORTED_LANGUAGE_CODES.includes(code as SupportedLanguageCodes);

View File

@ -67,9 +67,9 @@ export const RECIPIENT_ROLES_DESCRIPTION_ENG = {
} satisfies Record<keyof typeof RecipientRole, unknown>;
export const RECIPIENT_ROLE_TO_EMAIL_TYPE = {
[RecipientRole.SIGNER]: 'SIGNING_REQUEST',
[RecipientRole.VIEWER]: 'VIEW_REQUEST',
[RecipientRole.APPROVER]: 'APPROVE_REQUEST',
[RecipientRole.SIGNER]: `SIGNING_REQUEST`,
[RecipientRole.VIEWER]: `VIEW_REQUEST`,
[RecipientRole.APPROVER]: `APPROVE_REQUEST`,
} as const;
export const RECIPIENT_ROLE_SIGNING_REASONS = {

View File

@ -43,18 +43,10 @@ export class LocalJobProvider extends BaseJobProvider {
}
public async triggerJob(options: SimpleTriggerJobOptions) {
console.log({ jobDefinitions: this._jobDefinitions });
const eligibleJobs = Object.values(this._jobDefinitions).filter(
(job) => job.trigger.name === options.name,
);
console.log({ options });
console.log(
'Eligible jobs:',
eligibleJobs.map((job) => job.name),
);
await Promise.all(
eligibleJobs.map(async (job) => {
// Ideally we will change this to a createMany with returning later once we upgrade Prisma

View File

@ -1,9 +1,9 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { z } from 'zod';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import DocumentInviteEmailTemplate from '@documenso/email/templates/document-invite';
import { prisma } from '@documenso/prisma';
import {
@ -13,6 +13,7 @@ import {
SendStatus,
} from '@documenso/prisma/client';
import { getI18nInstance } from '../../../client-only/providers/i18n.server';
import { NEXT_PUBLIC_WEBAPP_URL } from '../../../constants/app';
import { FROM_ADDRESS, FROM_NAME } from '../../../constants/email';
import {
@ -23,6 +24,7 @@ import { DOCUMENT_AUDIT_LOG_TYPE } from '../../../types/document-audit-logs';
import { ZRequestMetadataSchema } from '../../../universal/extract-request-metadata';
import { createDocumentAuditLogData } from '../../../utils/document-audit-logs';
import { renderCustomEmailTemplate } from '../../../utils/render-custom-email-template';
import { renderEmailWithI18N } from '../../../utils/render-email-with-i18n';
import { type JobDefinition } from '../../client/_internal/job';
const SEND_SIGNING_EMAIL_JOB_DEFINITION_ID = 'send.signing.requested.email';
@ -90,22 +92,32 @@ export const SEND_SIGNING_EMAIL_JOB_DEFINITION = {
const recipientActionVerb =
RECIPIENT_ROLES_DESCRIPTION_ENG[recipient.role].actionVerb.toLowerCase();
const i18n = await getI18nInstance(documentMeta?.language);
let emailMessage = customEmail?.message || '';
let emailSubject = `Please ${recipientActionVerb} this document`;
let emailSubject = i18n._(msg`Please ${recipientActionVerb} this document`);
if (selfSigner) {
emailMessage = `You have initiated the document ${`"${document.title}"`} that requires you to ${recipientActionVerb} it.`;
emailSubject = `Please ${recipientActionVerb} your document`;
emailMessage = i18n._(
msg`You have initiated the document ${`"${document.title}"`} that requires you to ${recipientActionVerb} it.`,
);
emailSubject = i18n._(msg`Please ${recipientActionVerb} your document`);
}
if (isDirectTemplate) {
emailMessage = `A document was created by your direct template that requires you to ${recipientActionVerb} it.`;
emailSubject = `Please ${recipientActionVerb} this document created by your direct template`;
emailMessage = i18n._(
msg`A document was created by your direct template that requires you to ${recipientActionVerb} it.`,
);
emailSubject = i18n._(
msg`Please ${recipientActionVerb} this document created by your direct template`,
);
}
if (isTeamDocument && team) {
emailSubject = `${team.name} invited you to ${recipientActionVerb} a document`;
emailMessage = `${user.name} on behalf of ${team.name} has invited you to ${recipientActionVerb} the document "${document.title}".`;
emailSubject = i18n._(msg`${team.name} invited you to ${recipientActionVerb} a document`);
emailMessage = i18n._(
msg`${user.name} on behalf of ${team.name} has invited you to ${recipientActionVerb} the document "${document.title}".`,
);
}
const customEmailTemplate = {
@ -132,6 +144,14 @@ export const SEND_SIGNING_EMAIL_JOB_DEFINITION = {
});
await io.runTask('send-signing-email', async () => {
const [html, text] = await Promise.all([
renderEmailWithI18N(template, { lang: documentMeta?.language }),
renderEmailWithI18N(template, {
lang: documentMeta?.language,
plainText: true,
}),
]);
await mailer.sendMail({
to: {
name: recipient.name,
@ -145,8 +165,8 @@ export const SEND_SIGNING_EMAIL_JOB_DEFINITION = {
documentMeta?.subject || emailSubject,
customEmailTemplate,
),
html: render(template),
text: render(template, { plainText: true }),
html,
text,
});
});

View File

@ -1,13 +1,15 @@
import { msg } from '@lingui/macro';
import { z } from 'zod';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import TeamJoinEmailTemplate from '@documenso/email/templates/team-join';
import { prisma } from '@documenso/prisma';
import { TeamMemberRole } from '@documenso/prisma/client';
import { getI18nInstance } from '../../../client-only/providers/i18n.server';
import { WEBAPP_BASE_URL } from '../../../constants/app';
import { FROM_ADDRESS, FROM_NAME } from '../../../constants/email';
import { renderEmailWithI18N } from '../../../utils/render-email-with-i18n';
import type { JobDefinition } from '../../client/_internal/job';
const SEND_TEAM_MEMBER_JOINED_EMAIL_JOB_DEFINITION_ID = 'send.team-member-joined.email';
@ -71,15 +73,23 @@ export const SEND_TEAM_MEMBER_JOINED_EMAIL_JOB_DEFINITION = {
teamUrl: team.url,
});
// !: Replace with the actual language of the recipient later
const [html, text] = await Promise.all([
renderEmailWithI18N(emailContent),
renderEmailWithI18N(emailContent, { plainText: true }),
]);
const i18n = await getI18nInstance();
await mailer.sendMail({
to: member.user.email,
from: {
name: FROM_NAME,
address: FROM_ADDRESS,
},
subject: 'A new member has joined your team',
html: render(emailContent),
text: render(emailContent, { plainText: true }),
subject: i18n._(msg`A new member has joined your team`),
html,
text,
});
},
);

View File

@ -1,13 +1,15 @@
import { msg } from '@lingui/macro';
import { z } from 'zod';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import TeamJoinEmailTemplate from '@documenso/email/templates/team-join';
import { prisma } from '@documenso/prisma';
import { TeamMemberRole } from '@documenso/prisma/client';
import { getI18nInstance } from '../../../client-only/providers/i18n.server';
import { WEBAPP_BASE_URL } from '../../../constants/app';
import { FROM_ADDRESS, FROM_NAME } from '../../../constants/email';
import { renderEmailWithI18N } from '../../../utils/render-email-with-i18n';
import type { JobDefinition } from '../../client/_internal/job';
const SEND_TEAM_MEMBER_LEFT_EMAIL_JOB_DEFINITION_ID = 'send.team-member-left.email';
@ -61,15 +63,22 @@ export const SEND_TEAM_MEMBER_LEFT_EMAIL_JOB_DEFINITION = {
teamUrl: team.url,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(emailContent),
renderEmailWithI18N(emailContent, { plainText: true }),
]);
const i18n = await getI18nInstance();
await mailer.sendMail({
to: member.user.email,
from: {
name: FROM_NAME,
address: FROM_ADDRESS,
},
subject: `A team member has left ${team.name}`,
html: render(emailContent),
text: render(emailContent, { plainText: true }),
subject: i18n._(msg`A team member has left ${team.name}`),
html,
text,
});
});
}

View File

@ -25,6 +25,9 @@
"@documenso/email": "*",
"@documenso/prisma": "*",
"@documenso/signing": "*",
"@lingui/core": "^4.11.3",
"@lingui/macro": "^4.11.3",
"@lingui/react": "^4.11.3",
"@next-auth/prisma-adapter": "1.0.7",
"@noble/ciphers": "0.4.0",
"@noble/hashes": "1.3.2",

View File

@ -1,11 +1,14 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import { ConfirmEmailTemplate } from '@documenso/email/templates/confirm-email';
import { prisma } from '@documenso/prisma';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export interface SendConfirmationEmailProps {
userId: number;
@ -45,6 +48,13 @@ export const sendConfirmationEmail = async ({ userId }: SendConfirmationEmailPro
confirmationLink,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(confirmationTemplate),
renderEmailWithI18N(confirmationTemplate, { plainText: true }),
]);
const i18n = await getI18nInstance();
return mailer.sendMail({
to: {
address: user.email,
@ -54,8 +64,8 @@ export const sendConfirmationEmail = async ({ userId }: SendConfirmationEmailPro
name: senderName,
address: senderAddress,
},
subject: 'Please confirm your email',
html: render(confirmationTemplate),
text: render(confirmationTemplate, { plainText: true }),
subject: i18n._(msg`Please confirm your email`),
html,
text,
});
};

View File

@ -1,11 +1,14 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import { ForgotPasswordTemplate } from '@documenso/email/templates/forgot-password';
import { prisma } from '@documenso/prisma';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export interface SendForgotPasswordOptions {
userId: number;
@ -39,6 +42,13 @@ export const sendForgotPassword = async ({ userId }: SendForgotPasswordOptions)
resetPasswordLink,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template),
renderEmailWithI18N(template, { plainText: true }),
]);
const i18n = await getI18nInstance();
return await mailer.sendMail({
to: {
address: user.email,
@ -48,8 +58,8 @@ export const sendForgotPassword = async ({ userId }: SendForgotPasswordOptions)
name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso',
address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com',
},
subject: 'Forgot Password?',
html: render(template),
text: render(template, { plainText: true }),
subject: i18n._(msg`Forgot Password?`),
html,
text,
});
};

View File

@ -1,11 +1,11 @@
import { createElement } from 'react';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import { ResetPasswordTemplate } from '@documenso/email/templates/reset-password';
import { prisma } from '@documenso/prisma';
import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export interface SendResetPasswordOptions {
userId: number;
@ -26,6 +26,11 @@ export const sendResetPassword = async ({ userId }: SendResetPasswordOptions) =>
userName: user.name || '',
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template),
renderEmailWithI18N(template, { plainText: true }),
]);
return await mailer.sendMail({
to: {
address: user.email,
@ -36,7 +41,7 @@ export const sendResetPassword = async ({ userId }: SendResetPasswordOptions) =>
address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com',
},
subject: 'Password Reset Success!',
html: render(template),
text: render(template, { plainText: true }),
html,
text,
});
};

View File

@ -9,6 +9,8 @@ import {
import { prisma } from '@documenso/prisma';
import type { DocumentSigningOrder } from '@documenso/prisma/client';
import type { SupportedLanguageCodes } from '../../constants/i18n';
export type CreateDocumentMetaOptions = {
documentId: number;
subject?: string;
@ -19,6 +21,7 @@ export type CreateDocumentMetaOptions = {
redirectUrl?: string;
signingOrder?: DocumentSigningOrder;
typedSignatureEnabled?: boolean;
language?: SupportedLanguageCodes;
userId: number;
requestMetadata: RequestMetadata;
};
@ -34,6 +37,7 @@ export const upsertDocumentMeta = async ({
redirectUrl,
signingOrder,
typedSignatureEnabled,
language,
requestMetadata,
}: CreateDocumentMetaOptions) => {
const user = await prisma.user.findFirstOrThrow({
@ -85,6 +89,7 @@ export const upsertDocumentMeta = async ({
redirectUrl,
signingOrder,
typedSignatureEnabled,
language,
},
update: {
subject,
@ -95,6 +100,7 @@ export const upsertDocumentMeta = async ({
redirectUrl,
signingOrder,
typedSignatureEnabled,
language,
},
});

View File

@ -3,7 +3,6 @@
import { createElement } from 'react';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import DocumentCancelTemplate from '@documenso/email/templates/document-cancel';
import { prisma } from '@documenso/prisma';
import type { Document, DocumentMeta, Recipient, User } from '@documenso/prisma/client';
@ -14,6 +13,7 @@ import { FROM_ADDRESS, FROM_NAME } from '../../constants/email';
import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs';
import type { RequestMetadata } from '../../universal/extract-request-metadata';
import { createDocumentAuditLogData } from '../../utils/document-audit-logs';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export type DeleteDocumentOptions = {
id: number;
@ -191,6 +191,11 @@ const handleDocumentOwnerDelete = async ({
assetBaseUrl,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template),
renderEmailWithI18N(template, { plainText: true }),
]);
await mailer.sendMail({
to: {
address: recipient.email,
@ -201,8 +206,8 @@ const handleDocumentOwnerDelete = async ({
address: FROM_ADDRESS,
},
subject: 'Document Cancelled',
html: render(template),
text: render(template, { plainText: true }),
html,
text,
});
}),
);

View File

@ -1,11 +1,12 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import { DocumentInviteEmailTemplate } from '@documenso/email/templates/document-invite';
import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email';
import {
RECIPIENT_ROLES_DESCRIPTION_ENG,
RECIPIENT_ROLES_DESCRIPTION,
RECIPIENT_ROLE_TO_EMAIL_TYPE,
} from '@documenso/lib/constants/recipient-roles';
import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs';
@ -16,7 +17,9 @@ import { prisma } from '@documenso/prisma';
import { DocumentStatus, RecipientRole, SigningStatus } from '@documenso/prisma/client';
import type { Prisma } from '@documenso/prisma/client';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
import { getDocumentWhereInput } from './get-document-by-id';
export type ResendDocumentOptions = {
@ -92,25 +95,28 @@ export const resendDocument = async ({
return;
}
const i18n = await getI18nInstance(document.documentMeta?.language);
const recipientEmailType = RECIPIENT_ROLE_TO_EMAIL_TYPE[recipient.role];
const { email, name } = recipient;
const selfSigner = email === user.email;
const recipientActionVerb =
RECIPIENT_ROLES_DESCRIPTION_ENG[recipient.role].actionVerb.toLowerCase();
const recipientActionVerb = i18n
._(RECIPIENT_ROLES_DESCRIPTION[recipient.role].actionVerb)
.toLowerCase();
let emailMessage = customEmail?.message || '';
let emailSubject = `Reminder: Please ${recipientActionVerb} this document`;
let emailMessage = msg`${customEmail?.message || ''}`;
let emailSubject = msg`Reminder: Please ${recipientActionVerb} this document`;
if (selfSigner) {
emailMessage = `You have initiated the document ${`"${document.title}"`} that requires you to ${recipientActionVerb} it.`;
emailSubject = `Reminder: Please ${recipientActionVerb} your document`;
emailMessage = msg`You have initiated the document ${`"${document.title}"`} that requires you to ${recipientActionVerb} it.`;
emailSubject = msg`Reminder: Please ${recipientActionVerb} your document`;
}
if (isTeamDocument && document.team) {
emailSubject = `Reminder: ${document.team.name} invited you to ${recipientActionVerb} a document`;
emailMessage = `${user.name} on behalf of ${document.team.name} has invited you to ${recipientActionVerb} the document "${document.title}".`;
emailSubject = msg`Reminder: ${document.team.name} invited you to ${recipientActionVerb} a document`;
emailMessage = msg`${user.name} on behalf of ${document.team.name} has invited you to ${recipientActionVerb} the document "${document.title}".`;
}
const customEmailTemplate = {
@ -128,7 +134,7 @@ export const resendDocument = async ({
inviterEmail: isTeamDocument ? document.team?.teamEmail?.email || user.email : user.email,
assetBaseUrl,
signDocumentLink,
customBody: renderCustomEmailTemplate(emailMessage, customEmailTemplate),
customBody: renderCustomEmailTemplate(i18n._(emailMessage), customEmailTemplate),
role: recipient.role,
selfSigner,
isTeamInvite: isTeamDocument,
@ -137,6 +143,14 @@ export const resendDocument = async ({
await prisma.$transaction(
async (tx) => {
const [html, text] = await Promise.all([
renderEmailWithI18N(template, { lang: document.documentMeta?.language }),
renderEmailWithI18N(template, {
lang: document.documentMeta?.language,
plainText: true,
}),
]);
await mailer.sendMail({
to: {
address: email,
@ -147,10 +161,13 @@ export const resendDocument = async ({
address: FROM_ADDRESS,
},
subject: customEmail?.subject
? renderCustomEmailTemplate(`Reminder: ${customEmail.subject}`, customEmailTemplate)
: emailSubject,
html: render(template),
text: render(template, { plainText: true }),
? renderCustomEmailTemplate(
i18n._(msg`Reminder: ${customEmail.subject}`),
customEmailTemplate,
)
: i18n._(emailSubject),
html,
text,
});
await tx.documentAuditLog.create({

View File

@ -1,17 +1,20 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import { DocumentCompletedEmailTemplate } from '@documenso/email/templates/document-completed';
import { prisma } from '@documenso/prisma';
import { DocumentSource } from '@documenso/prisma/client';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app';
import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs';
import type { RequestMetadata } from '../../universal/extract-request-metadata';
import { getFile } from '../../universal/upload/get-file';
import { createDocumentAuditLogData } from '../../utils/document-audit-logs';
import { renderCustomEmailTemplate } from '../../utils/render-custom-email-template';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export interface SendDocumentOptions {
documentId: number;
@ -61,6 +64,8 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo
}`;
}
const i18n = await getI18nInstance(document.documentMeta?.language);
// If the document owner is not a recipient then send the email to them separately
if (!document.Recipient.find((recipient) => recipient.email === owner.email)) {
const template = createElement(DocumentCompletedEmailTemplate, {
@ -69,6 +74,11 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo
downloadLink: documentOwnerDownloadLink,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template, { lang: document.documentMeta?.language }),
renderEmailWithI18N(template, { lang: document.documentMeta?.language, plainText: true }),
]);
await mailer.sendMail({
to: [
{
@ -80,9 +90,9 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo
name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso',
address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com',
},
subject: 'Signing Complete!',
html: render(template),
text: render(template, { plainText: true }),
subject: i18n._(msg`Signing Complete!`),
html,
text,
attachments: [
{
filename: document.title.endsWith('.pdf') ? document.title : document.title + '.pdf',
@ -129,6 +139,11 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo
: undefined,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template, { lang: document.documentMeta?.language }),
renderEmailWithI18N(template, { lang: document.documentMeta?.language, plainText: true }),
]);
await mailer.sendMail({
to: [
{
@ -143,9 +158,9 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo
subject:
isDirectTemplate && document.documentMeta?.subject
? renderCustomEmailTemplate(document.documentMeta.subject, customEmailTemplate)
: 'Signing Complete!',
html: render(template),
text: render(template, { plainText: true }),
: i18n._(msg`Signing Complete!`),
html,
text,
attachments: [
{
filename: document.title.endsWith('.pdf') ? document.title : document.title + '.pdf',

View File

@ -1,11 +1,14 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import { DocumentSuperDeleteEmailTemplate } from '@documenso/email/templates/document-super-delete';
import { prisma } from '@documenso/prisma';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export interface SendDeleteEmailOptions {
documentId: number;
@ -36,6 +39,13 @@ export const sendDeleteEmail = async ({ documentId, reason }: SendDeleteEmailOpt
assetBaseUrl,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template),
renderEmailWithI18N(template, { plainText: true }),
]);
const i18n = await getI18nInstance();
await mailer.sendMail({
to: {
address: email,
@ -45,8 +55,8 @@ export const sendDeleteEmail = async ({ documentId, reason }: SendDeleteEmailOpt
name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso',
address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com',
},
subject: 'Document Deleted!',
html: render(template),
text: render(template, { plainText: true }),
subject: i18n._(msg`Document Deleted!`),
html,
text,
});
};

View File

@ -1,11 +1,14 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import { DocumentPendingEmailTemplate } from '@documenso/email/templates/document-pending';
import { prisma } from '@documenso/prisma';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export interface SendPendingEmailOptions {
documentId: number;
@ -28,6 +31,7 @@ export const sendPendingEmail = async ({ documentId, recipientId }: SendPendingE
id: recipientId,
},
},
documentMeta: true,
},
});
@ -50,6 +54,13 @@ export const sendPendingEmail = async ({ documentId, recipientId }: SendPendingE
assetBaseUrl,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template, { lang: document.documentMeta?.language }),
renderEmailWithI18N(template, { lang: document.documentMeta?.language, plainText: true }),
]);
const i18n = await getI18nInstance();
await mailer.sendMail({
to: {
address: email,
@ -59,8 +70,8 @@ export const sendPendingEmail = async ({ documentId, recipientId }: SendPendingE
name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso',
address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com',
},
subject: 'Waiting for others to complete signing.',
html: render(template),
text: render(template, { plainText: true }),
subject: i18n._(msg`Waiting for others to complete signing.`),
html,
text,
});
};

View File

@ -2,17 +2,20 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import DocumentCancelTemplate from '@documenso/email/templates/document-cancel';
import { prisma } from '@documenso/prisma';
import { DocumentStatus, SendStatus } from '@documenso/prisma/client';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app';
import { FROM_ADDRESS, FROM_NAME } from '../../constants/email';
import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs';
import type { RequestMetadata } from '../../universal/extract-request-metadata';
import { createDocumentAuditLogData } from '../../utils/document-audit-logs';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export type SuperDeleteDocumentOptions = {
id: number;
@ -53,6 +56,13 @@ export const superDeleteDocument = async ({ id, requestMetadata }: SuperDeleteDo
assetBaseUrl,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template, { lang: document.documentMeta?.language }),
renderEmailWithI18N(template, { lang: document.documentMeta?.language, plainText: true }),
]);
const i18n = await getI18nInstance(document.documentMeta?.language);
await mailer.sendMail({
to: {
address: recipient.email,
@ -62,9 +72,9 @@ export const superDeleteDocument = async ({ id, requestMetadata }: SuperDeleteDo
name: FROM_NAME,
address: FROM_ADDRESS,
},
subject: 'Document Cancelled',
html: render(template),
text: render(template, { plainText: true }),
subject: i18n._(msg`Document Cancelled`),
html,
text,
});
}),
);

View File

@ -1,8 +1,9 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import RecipientRemovedFromDocumentTemplate from '@documenso/email/templates/recipient-removed-from-document';
import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs';
import {
@ -21,10 +22,12 @@ import type { Recipient } from '@documenso/prisma/client';
import { RecipientRole } from '@documenso/prisma/client';
import { SendStatus, SigningStatus } from '@documenso/prisma/client';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app';
import { FROM_ADDRESS, FROM_NAME } from '../../constants/email';
import { AppError, AppErrorCode } from '../../errors/app-error';
import { canRecipientBeModified } from '../../utils/recipients';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export interface SetRecipientsForDocumentOptions {
userId: number;
@ -62,6 +65,7 @@ export const setRecipientsForDocument = async ({
},
include: {
Field: true,
documentMeta: true,
},
});
@ -291,6 +295,13 @@ export const setRecipientsForDocument = async ({
assetBaseUrl,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template, { lang: document.documentMeta?.language }),
renderEmailWithI18N(template, { lang: document.documentMeta?.language, plainText: true }),
]);
const i18n = await getI18nInstance(document.documentMeta?.language);
await mailer.sendMail({
to: {
address: recipient.email,
@ -300,9 +311,9 @@ export const setRecipientsForDocument = async ({
name: FROM_NAME,
address: FROM_ADDRESS,
},
subject: 'You have been removed from a document',
html: render(template),
text: render(template, { plainText: true }),
subject: i18n._(msg`You have been removed from a document`),
html,
text,
});
}),
);

View File

@ -81,7 +81,7 @@ export const acceptTeamInvitation = async ({ userId, teamId }: AcceptTeamInvitat
await jobs.triggerJob({
name: 'send.team-member-joined.email',
payload: {
teamId: team.id,
teamId: teamMember.teamId,
memberId: teamMember.id,
},
});

View File

@ -1,9 +1,9 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { z } from 'zod';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import { ConfirmTeamEmailTemplate } from '@documenso/email/templates/confirm-team-email';
import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app';
import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email';
@ -13,6 +13,9 @@ import { createTokenVerification } from '@documenso/lib/utils/token-verification
import { prisma } from '@documenso/prisma';
import { Prisma } from '@documenso/prisma/client';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export type CreateTeamEmailVerificationOptions = {
userId: number;
teamId: number;
@ -122,14 +125,23 @@ export const sendTeamEmailVerificationEmail = async (
token,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template),
renderEmailWithI18N(template, { plainText: true }),
]);
const i18n = await getI18nInstance();
await mailer.sendMail({
to: email,
from: {
name: FROM_NAME,
address: FROM_ADDRESS,
},
subject: `A request to use your email has been initiated by ${teamName} on Documenso`,
html: render(template),
text: render(template, { plainText: true }),
subject: i18n._(
msg`A request to use your email has been initiated by ${teamName} on Documenso`,
),
html,
text,
});
};

View File

@ -1,9 +1,9 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { nanoid } from 'nanoid';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import type { TeamInviteEmailProps } from '@documenso/email/templates/team-invite';
import { TeamInviteEmailTemplate } from '@documenso/email/templates/team-invite';
import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app';
@ -15,6 +15,9 @@ import { prisma } from '@documenso/prisma';
import { TeamMemberInviteStatus } from '@documenso/prisma/client';
import type { TCreateTeamMemberInvitesMutationSchema } from '@documenso/trpc/server/team-router/schema';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export type CreateTeamMemberInvitesOptions = {
userId: number;
userName: string;
@ -148,14 +151,23 @@ export const sendTeamMemberInviteEmail = async ({
...emailTemplateOptions,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template),
renderEmailWithI18N(template, { plainText: true }),
]);
const i18n = await getI18nInstance();
await mailer.sendMail({
to: email,
from: {
name: FROM_NAME,
address: FROM_ADDRESS,
},
subject: `You have been invited to join ${emailTemplateOptions.teamName} on Documenso`,
html: render(template),
text: render(template, { plainText: true }),
subject: i18n._(
msg`You have been invited to join ${emailTemplateOptions.teamName} on Documenso`,
),
html,
text,
});
};

View File

@ -1,13 +1,17 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import { TeamEmailRemovedTemplate } from '@documenso/email/templates/team-email-removed';
import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app';
import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email';
import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams';
import { prisma } from '@documenso/prisma';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export type DeleteTeamEmailOptions = {
userId: number;
userEmail: string;
@ -73,6 +77,13 @@ export const deleteTeamEmail = async ({ userId, userEmail, teamId }: DeleteTeamE
teamUrl: team.url,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template),
renderEmailWithI18N(template, { plainText: true }),
]);
const i18n = await getI18nInstance();
await mailer.sendMail({
to: {
address: team.owner.email,
@ -82,9 +93,9 @@ export const deleteTeamEmail = async ({ userId, userEmail, teamId }: DeleteTeamE
name: FROM_NAME,
address: FROM_ADDRESS,
},
subject: `Team email has been revoked for ${team.name}`,
html: render(template),
text: render(template, { plainText: true }),
subject: i18n._(msg`Team email has been revoked for ${team.name}`),
html,
text,
});
} catch (e) {
// Todo: Teams - Alert us.

View File

@ -1,7 +1,6 @@
import { createElement } from 'react';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import type { TeamDeleteEmailProps } from '@documenso/email/templates/team-delete';
import { TeamDeleteEmailTemplate } from '@documenso/email/templates/team-delete';
import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app';
@ -11,6 +10,7 @@ import { stripe } from '@documenso/lib/server-only/stripe';
import { prisma } from '@documenso/prisma';
import { jobs } from '../../jobs/client';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export type DeleteTeamOptions = {
userId: number;
@ -95,6 +95,11 @@ export const sendTeamDeleteEmail = async ({
...emailTemplateOptions,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template),
renderEmailWithI18N(template, { plainText: true }),
]);
await mailer.sendMail({
to: email,
from: {
@ -102,7 +107,7 @@ export const sendTeamDeleteEmail = async ({
address: FROM_ADDRESS,
},
subject: `Team "${emailTemplateOptions.teamName}" has been deleted on Documenso`,
html: render(template),
text: render(template, { plainText: true }),
html,
text,
});
};

View File

@ -1,13 +1,17 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import { TeamTransferRequestTemplate } from '@documenso/email/templates/team-transfer-request';
import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app';
import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email';
import { createTokenVerification } from '@documenso/lib/utils/token-verification';
import { prisma } from '@documenso/prisma';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
export type RequestTeamOwnershipTransferOptions = {
/**
* The ID of the user initiating the transfer.
@ -93,15 +97,24 @@ export const requestTeamOwnershipTransfer = async ({
token,
});
const [html, text] = await Promise.all([
renderEmailWithI18N(template),
renderEmailWithI18N(template, { plainText: true }),
]);
const i18n = await getI18nInstance();
await mailer.sendMail({
to: newOwnerUser.email,
from: {
name: FROM_NAME,
address: FROM_ADDRESS,
},
subject: `You have been requested to take ownership of team ${team.name} on Documenso`,
html: render(template),
text: render(template, { plainText: true }),
subject: i18n._(
msg`You have been requested to take ownership of team ${team.name} on Documenso`,
),
html,
text,
});
},
{ timeout: 30_000 },

View File

@ -1,10 +1,10 @@
import { createElement } from 'react';
import { msg } from '@lingui/macro';
import { DateTime } from 'luxon';
import { match } from 'ts-pattern';
import { mailer } from '@documenso/email/mailer';
import { render } from '@documenso/email/render';
import { DocumentCreatedFromDirectTemplateEmailTemplate } from '@documenso/email/templates/document-created-from-direct-template';
import { nanoid } from '@documenso/lib/universal/id';
import { prisma } from '@documenso/prisma';
@ -22,6 +22,7 @@ import {
} from '@documenso/prisma/client';
import type { TSignFieldWithTokenMutationSchema } from '@documenso/trpc/server/field-router/schema';
import { getI18nInstance } from '../../client-only/providers/i18n.server';
import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app';
import { DEFAULT_DOCUMENT_DATE_FORMAT } from '../../constants/date-formats';
import { DEFAULT_DOCUMENT_TIME_ZONE } from '../../constants/time-zones';
@ -38,6 +39,7 @@ import {
createRecipientAuthOptions,
extractDocumentAuthMethods,
} from '../../utils/document-auth';
import { renderEmailWithI18N } from '../../utils/render-email-with-i18n';
import { formatDocumentsPath } from '../../utils/teams';
import { sendDocument } from '../document/send-document';
import { validateFieldAuth } from '../document/validate-field-auth';
@ -143,6 +145,7 @@ export const createDocumentFromDirectTemplate = async ({
const metaDateFormat = template.templateMeta?.dateFormat || DEFAULT_DOCUMENT_DATE_FORMAT;
const metaEmailMessage = template.templateMeta?.message || '';
const metaEmailSubject = template.templateMeta?.subject || '';
const metaLanguage = template.templateMeta?.language;
const metaSigningOrder = template.templateMeta?.signingOrder || DocumentSigningOrder.PARALLEL;
// Associate, validate and map to a query every direct template recipient field with the provided fields.
@ -270,6 +273,7 @@ export const createDocumentFromDirectTemplate = async ({
dateFormat: metaDateFormat,
message: metaEmailMessage,
subject: metaEmailSubject,
language: metaLanguage,
signingOrder: metaSigningOrder,
},
},
@ -529,6 +533,13 @@ export const createDocumentFromDirectTemplate = async ({
assetBaseUrl: NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000',
});
const [html, text] = await Promise.all([
renderEmailWithI18N(emailTemplate, { lang: metaLanguage }),
renderEmailWithI18N(emailTemplate, { lang: metaLanguage, plainText: true }),
]);
const i18n = await getI18nInstance(metaLanguage);
await mailer.sendMail({
to: [
{
@ -540,9 +551,9 @@ export const createDocumentFromDirectTemplate = async ({
name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso',
address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com',
},
subject: 'Document created from direct template',
html: render(emailTemplate),
text: render(emailTemplate, { plainText: true }),
subject: i18n._(msg`Document created from direct template`),
html,
text,
});
return {

View File

@ -46,6 +46,7 @@ export const createDocumentFromTemplateLegacy = async ({
Recipient: true,
Field: true,
templateDocumentData: true,
templateMeta: true,
},
});
@ -78,6 +79,17 @@ export const createDocumentFromTemplateLegacy = async ({
token: nanoid(),
})),
},
documentMeta: {
create: {
subject: template.templateMeta?.subject,
message: template.templateMeta?.message,
timezone: template.templateMeta?.timezone,
dateFormat: template.templateMeta?.dateFormat,
redirectUrl: template.templateMeta?.redirectUrl,
signingOrder: template.templateMeta?.signingOrder ?? undefined,
language: template.templateMeta?.language,
},
},
},
include: {

View File

@ -11,6 +11,7 @@ import {
WebhookTriggerEvents,
} from '@documenso/prisma/client';
import type { SupportedLanguageCodes } from '../../constants/i18n';
import { AppError, AppErrorCode } from '../../errors/app-error';
import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs';
import { ZRecipientAuthOptionsSchema } from '../../types/document-auth';
@ -60,6 +61,7 @@ export type CreateDocumentFromTemplateOptions = {
dateFormat?: string;
redirectUrl?: string;
signingOrder?: DocumentSigningOrder;
language?: SupportedLanguageCodes;
};
requestMetadata?: RequestMetadata;
};
@ -179,6 +181,7 @@ export const createDocumentFromTemplate = async ({
override?.signingOrder ||
template.templateMeta?.signingOrder ||
DocumentSigningOrder.PARALLEL,
language: override?.language || template.templateMeta?.language,
},
},
Recipient: {

View File

@ -39,7 +39,7 @@ export const sendConfirmationToken = async ({
mostRecentToken?.createdAt &&
DateTime.fromJSDate(mostRecentToken.createdAt).diffNow('minutes').minutes > -5
) {
return;
// return;
}
const createdToken = await prisma.verificationToken.create({
@ -64,6 +64,7 @@ export const sendConfirmationToken = async ({
return { success: true };
} catch (err) {
console.log(err);
throw new Error(`Failed to send the confirmation email`);
}
};

View File

@ -18,14 +18,104 @@ msgstr ""
"X-Crowdin-File: common.po\n"
"X-Crowdin-File-ID: 4\n"
#: packages/email/template-components/template-document-super-delete.tsx:27
msgid "\"{documentName}\" has been deleted by an admin."
msgstr ""
#: packages/email/template-components/template-document-pending.tsx:37
msgid "“{documentName}” has been signed"
msgstr ""
#: packages/email/template-components/template-document-completed.tsx:41
#: packages/lib/server-only/document/resend-document.tsx:109
msgid "{0}"
msgstr ""
#: packages/email/template-components/template-document-invite.tsx:74
msgid "{0} Document"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:117
msgid "{0} invited you to {recipientActionVerb} a document"
msgstr ""
#: packages/email/templates/team-join.tsx:55
msgid "{0} joined the team {teamName} on Documenso"
msgstr ""
#: packages/email/templates/team-leave.tsx:55
msgid "{0} left the team {teamName} on Documenso"
msgstr ""
#: packages/ui/primitives/data-table-pagination.tsx:30
msgid "{0} of {1} row(s) selected."
msgstr "{0} von {1} Zeile(n) ausgewählt."
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:119
#: packages/lib/server-only/document/resend-document.tsx:119
msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr ""
#: packages/email/templates/document-invite.tsx:79
msgid "{inviterName} <0>({inviterEmail})</0>"
msgstr ""
#: packages/email/templates/document-cancel.tsx:19
msgid "{inviterName} has cancelled the document {documentName}, you don't need to sign it anymore."
msgstr ""
#: packages/email/template-components/template-document-cancel.tsx:24
msgid "{inviterName} has cancelled the document<0/>\"{documentName}\""
msgstr ""
#: packages/email/template-components/template-document-invite.tsx:57
msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\""
msgstr ""
#: packages/email/templates/document-invite.tsx:41
msgid "{inviterName} has invited you to {action} {documentName}"
msgstr ""
#: packages/email/templates/recipient-removed-from-document.tsx:18
msgid "{inviterName} has removed you from the document {documentName}."
msgstr ""
#: packages/email/template-components/template-document-invite.tsx:49
msgid "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\""
msgstr ""
#: packages/email/templates/document-invite.tsx:40
msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
msgstr ""
#: packages/email/templates/team-join.tsx:61
msgid "{memberEmail} joined the following team"
msgstr ""
#: packages/email/templates/team-leave.tsx:61
msgid "{memberEmail} left the following team"
msgstr ""
#: packages/email/templates/document-created-from-direct-template.tsx:55
msgid "{recipientName} {action} a document by using one of your direct links"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:55
msgid "{teamName} ownership transfer request"
msgstr ""
#: packages/ui/primitives/data-table-pagination.tsx:41
msgid "{visibleRows, plural, one {Showing # result.} other {Showing # results.}}"
msgstr "{visibleRows, plural, one {Eine # Ergebnis wird angezeigt.} other {# Ergebnisse werden angezeigt.}}"
#: packages/email/templates/document-invite.tsx:91
msgid "`${inviterName} has invited you to ${action} the document \"${documentName}\".`"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:59
msgid "<0>{senderName}</0> has requested that you take ownership of the following team"
msgstr ""
#: 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>Authentifizierungsmethode erben</0> - Verwenden Sie die in den \"Allgemeinen Einstellungen\" konfigurierte globale Aktionssignatur-Authentifizierungsmethode"
@ -56,20 +146,66 @@ msgstr "<0>Konto erforderlich</0> - Der Empfänger muss angemeldet sein, um das
msgid "<0>Require passkey</0> - The recipient must have an account and passkey configured via their settings"
msgstr "<0>Passkey erforderlich</0> - Der Empfänger muss ein Konto haben und den Passkey über seine Einstellungen konfiguriert haben"
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:109
msgid "A document was created by your direct template that requires you to {recipientActionVerb} it."
msgstr ""
#: packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts:90
msgid "A new member has joined your team"
msgstr ""
#: packages/lib/server-only/team/create-team-email-verification.ts:142
msgid "A request to use your email has been initiated by {teamName} on Documenso"
msgstr ""
#: packages/email/templates/team-join.tsx:29
msgid "A team member has joined a team on Documenso"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-team-member-left-email.ts:79
msgid "A team member has left {0}"
msgstr ""
#: packages/email/templates/team-leave.tsx:29
msgid "A team member has left a team on Documenso"
msgstr ""
#: packages/email/templates/team-delete.tsx:27
#: packages/email/templates/team-delete.tsx:31
msgid "A team you were a part of has been deleted"
msgstr ""
#: packages/email/templates/team-invite.tsx:77
#: packages/email/templates/team-transfer-request.tsx:81
msgid "Accept"
msgstr ""
#: packages/email/templates/team-invite.tsx:29
msgid "Accept invitation to join a team on Documenso"
msgstr ""
#: packages/email/templates/confirm-team-email.tsx:38
msgid "Accept team email request for {teamName} on Documenso"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:29
msgid "Accept team transfer request on Documenso"
msgstr ""
#: packages/ui/primitives/document-dropzone.tsx:69
msgid "Add a document"
msgstr "Dokument hinzufügen"
#: packages/ui/primitives/document-flow/add-settings.tsx:336
#: packages/ui/primitives/template-flow/add-template-settings.tsx:339
#: packages/ui/primitives/document-flow/add-settings.tsx:378
#: packages/ui/primitives/template-flow/add-template-settings.tsx:378
msgid "Add a URL to redirect the user to once the document is signed"
msgstr "Fügen Sie eine URL hinzu, um den Benutzer nach der Unterzeichnung des Dokuments weiterzuleiten"
#: packages/ui/primitives/document-flow/add-settings.tsx:248
#: packages/ui/primitives/document-flow/add-settings.tsx:290
msgid "Add an external ID to the document. This can be used to identify the document in external systems."
msgstr "Fügen Sie dem Dokument eine externe ID hinzu. Diese kann verwendet werden, um das Dokument in externen Systemen zu identifizieren."
#: packages/ui/primitives/template-flow/add-template-settings.tsx:256
#: packages/ui/primitives/template-flow/add-template-settings.tsx:295
msgid "Add an external ID to the template. This can be used to identify in external systems."
msgstr "Fügen Sie der Vorlage eine externe ID hinzu. Diese kann zur Identifizierung in externen Systemen verwendet werden."
@ -110,8 +246,8 @@ msgstr "Text zum Feld hinzufügen"
msgid "Admin"
msgstr "Admin"
#: packages/ui/primitives/document-flow/add-settings.tsx:230
#: packages/ui/primitives/template-flow/add-template-settings.tsx:238
#: packages/ui/primitives/document-flow/add-settings.tsx:272
#: packages/ui/primitives/template-flow/add-template-settings.tsx:277
msgid "Advanced Options"
msgstr "Erweiterte Optionen"
@ -124,6 +260,14 @@ msgstr "Erweiterte Einstellungen"
msgid "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email."
msgstr "Nach der Übermittlung wird ein Dokument automatisch generiert und zu Ihrer Dokumentenseite hinzugefügt. Sie erhalten außerdem eine Benachrichtigung per E-Mail."
#: packages/email/template-components/template-document-cancel.tsx:31
msgid "All signatures have been voided."
msgstr ""
#: packages/email/templates/document-super-delete.tsx:20
msgid "An admin has deleted your document \"{documentName}\"."
msgstr ""
#: packages/ui/primitives/pdf-viewer.tsx:167
msgid "An error occurred while loading the document."
msgstr "Ein Fehler ist beim Laden des Dokuments aufgetreten."
@ -132,6 +276,10 @@ msgstr "Ein Fehler ist beim Laden des Dokuments aufgetreten."
msgid "Approve"
msgstr "Genehmigen"
#: packages/lib/constants/recipient-roles.ts:68
#~ msgid "APPROVE_REQUEST"
#~ msgstr ""
#: packages/lib/constants/recipient-roles.ts:9
msgid "Approved"
msgstr "Genehmigt"
@ -148,6 +296,10 @@ msgstr "Genehmigende"
msgid "Approving"
msgstr "Genehmigung"
#: packages/email/template-components/template-confirmation-email.tsx:28
msgid "Before you get started, please confirm your email address by clicking the button below:"
msgstr ""
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
msgid "Black"
msgstr "Schwarz"
@ -156,6 +308,14 @@ msgstr "Schwarz"
msgid "Blue"
msgstr "Blau"
#: packages/email/templates/team-invite.tsx:67
msgid "by <0>{senderName}</0>"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:70
msgid "By accepting this request, you will take responsibility for any billing items associated with this team."
msgstr ""
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58
msgid "Cancel"
@ -206,6 +366,16 @@ msgstr "Klicken, um das Feld einzufügen"
msgid "Close"
msgstr "Schließen"
#: packages/email/template-components/template-document-completed.tsx:35
#: packages/email/template-components/template-document-self-signed.tsx:36
msgid "Completed"
msgstr ""
#: packages/email/templates/document-completed.tsx:21
#: packages/email/templates/document-self-signed.tsx:17
msgid "Completed Document"
msgstr ""
#: packages/lib/constants/template.ts:12
msgid "Configure Direct Recipient"
msgstr "Direkten Empfänger konfigurieren"
@ -215,10 +385,22 @@ msgstr "Direkten Empfänger konfigurieren"
msgid "Configure the {0} field"
msgstr "Konfigurieren Sie das Feld {0}"
#: packages/email/template-components/template-confirmation-email.tsx:38
msgid "Confirm email"
msgstr ""
#: packages/ui/primitives/document-flow/document-flow-root.tsx:141
msgid "Continue"
msgstr "Fortsetzen"
#: packages/email/template-components/template-document-invite.tsx:66
msgid "Continue by {0} the document."
msgstr ""
#: packages/email/template-components/template-document-completed.tsx:45
msgid "Continue by downloading the document."
msgstr ""
#: packages/ui/components/document/document-share-button.tsx:46
msgid "Copied to clipboard"
msgstr "In die Zwischenablage kopiert"
@ -227,6 +409,14 @@ msgstr "In die Zwischenablage kopiert"
msgid "Copy Link"
msgstr "Link kopieren"
#: packages/email/template-components/template-document-self-signed.tsx:46
msgid "Create a <0>free account</0> to access your signed documents at any time."
msgstr ""
#: packages/email/template-components/template-document-self-signed.tsx:68
msgid "Create account"
msgstr ""
#: packages/ui/primitives/document-flow/add-signature.tsx:360
msgid "Custom Text"
msgstr "Benutzerdefinierter Text"
@ -237,25 +427,47 @@ msgstr "Benutzerdefinierter Text"
msgid "Date"
msgstr "Datum"
#: packages/ui/primitives/document-flow/add-settings.tsx:271
#: packages/ui/primitives/template-flow/add-template-settings.tsx:279
#: packages/ui/primitives/document-flow/add-settings.tsx:313
#: packages/ui/primitives/template-flow/add-template-settings.tsx:318
msgid "Date Format"
msgstr "Datumsformat"
#: packages/email/templates/team-invite.tsx:83
msgid "Decline"
msgstr ""
#: packages/email/templates/reset-password.tsx:65
msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us.</0>"
msgstr ""
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570
msgid "Direct link receiver"
msgstr "Empfänger des direkten Links"
#: 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
#: packages/ui/primitives/document-flow/add-settings.tsx:216
#: packages/ui/primitives/template-flow/add-template-settings.tsx:190
msgid "Document access"
msgstr "Dokumentenzugriff"
#: packages/lib/server-only/document/super-delete-document.ts:75
msgid "Document Cancelled"
msgstr ""
#: packages/email/templates/document-created-from-direct-template.tsx:30
#: packages/lib/server-only/template/create-document-from-direct-template.ts:554
msgid "Document created from direct template"
msgstr ""
#: packages/lib/constants/template.ts:20
msgid "Document Creation"
msgstr "Dokumenterstellung"
#: packages/lib/server-only/document/send-delete-email.ts:58
msgid "Document Deleted!"
msgstr ""
#: packages/email/template-components/template-document-completed.tsx:64
#: packages/ui/components/document/document-download-button.tsx:68
msgid "Download"
msgstr "Herunterladen"
@ -288,7 +500,7 @@ msgstr "E-Mail"
msgid "Email is required"
msgstr "E-Mail ist erforderlich"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:184
#: packages/ui/primitives/template-flow/add-template-settings.tsx:223
msgid "Email Options"
msgstr "E-Mail-Optionen"
@ -318,8 +530,8 @@ msgstr "Passwort eingeben"
msgid "Error"
msgstr "Fehler"
#: packages/ui/primitives/document-flow/add-settings.tsx:241
#: packages/ui/primitives/template-flow/add-template-settings.tsx:249
#: packages/ui/primitives/document-flow/add-settings.tsx:283
#: packages/ui/primitives/template-flow/add-template-settings.tsx:288
msgid "External ID"
msgstr "Externe ID"
@ -361,6 +573,14 @@ msgstr "Feldplatzhalter"
msgid "Font Size"
msgstr "Schriftgröße"
#: packages/lib/server-only/auth/send-forgot-password.ts:61
msgid "Forgot Password?"
msgstr ""
#: packages/email/template-components/template-forgot-password.tsx:21
msgid "Forgot your password?"
msgstr ""
#: packages/ui/primitives/document-flow/types.ts:50
msgid "Free Signature"
msgstr "Freie Unterschrift"
@ -377,6 +597,10 @@ msgstr "Zurück"
msgid "Green"
msgstr "Grün"
#: packages/email/templates/reset-password.tsx:50
msgid "Hi, {userName} <0>({userEmail})</0>"
msgstr ""
#: packages/lib/constants/recipient-roles.ts:76
msgid "I am a signer of this document"
msgstr "Ich bin ein Unterzeichner dieses Dokuments"
@ -410,12 +634,25 @@ msgstr "Ungültige E-Mail"
msgid "Invalid email address"
msgstr "Ungültige E-Mail-Adresse"
#: packages/email/templates/team-invite.tsx:55
msgid "Join {teamName} on Documenso"
msgstr ""
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48
msgid "Label"
msgstr "Beschriftung"
#: packages/ui/primitives/document-flow/add-settings.tsx:176
#: packages/ui/primitives/template-flow/add-template-settings.tsx:150
msgid "Language"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:87
msgid "Link expires in 1 hour."
msgstr ""
#: packages/ui/primitives/lazy-pdf-viewer.tsx:15
#: packages/ui/primitives/pdf-viewer.tsx:44
msgid "Loading document..."
@ -434,7 +671,7 @@ msgid "Member"
msgstr "Mitglied"
#: packages/ui/primitives/document-flow/add-subject.tsx:95
#: packages/ui/primitives/template-flow/add-template-settings.tsx:215
#: packages/ui/primitives/template-flow/add-template-settings.tsx:254
msgid "Message <0>(Optional)</0>"
msgstr "Nachricht <0>(Optional)</0>"
@ -525,6 +762,22 @@ msgstr "Seite {0} von {numPages}"
msgid "Password Required"
msgstr "Passwort erforderlich"
#: packages/email/templates/forgot-password.tsx:17
msgid "Password Reset Requested"
msgstr ""
#: packages/email/templates/reset-password.tsx:18
msgid "Password Reset Successful"
msgstr ""
#: packages/email/template-components/template-reset-password.tsx:22
msgid "Password updated!"
msgstr ""
#: packages/email/templates/document-pending.tsx:17
msgid "Pending Document"
msgstr ""
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156
msgid "Pick a number"
msgstr "Wählen Sie eine Zahl"
@ -535,6 +788,34 @@ msgstr "Wählen Sie eine Zahl"
msgid "Placeholder"
msgstr "Platzhalter"
#: packages/email/template-components/template-document-invite.tsx:43
msgid "Please {0} your document<0/>\"{documentName}\""
msgstr ""
#: packages/email/templates/document-invite.tsx:38
msgid "Please {action} your document {documentName}"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:98
msgid "Please {recipientActionVerb} this document"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:112
msgid "Please {recipientActionVerb} this document created by your direct template"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:104
msgid "Please {recipientActionVerb} your document"
msgstr ""
#: packages/lib/server-only/auth/send-confirmation-email.ts:67
msgid "Please confirm your email"
msgstr ""
#: packages/email/templates/confirm-email.tsx:15
msgid "Please confirm your email address"
msgstr ""
#: packages/ui/primitives/pdf-viewer.tsx:223
#: packages/ui/primitives/pdf-viewer.tsx:238
msgid "Please try again or contact our support."
@ -561,8 +842,8 @@ msgid "Receives copy"
msgstr "Erhält Kopie"
#: 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
#: packages/ui/primitives/document-flow/add-settings.tsx:257
#: packages/ui/primitives/template-flow/add-template-settings.tsx:208
msgid "Recipient action authentication"
msgstr "Empfängeraktion Authentifizierung"
@ -570,11 +851,27 @@ msgstr "Empfängeraktion Authentifizierung"
msgid "Red"
msgstr "Rot"
#: packages/ui/primitives/document-flow/add-settings.tsx:329
#: packages/ui/primitives/template-flow/add-template-settings.tsx:332
#: packages/ui/primitives/document-flow/add-settings.tsx:371
#: packages/ui/primitives/template-flow/add-template-settings.tsx:371
msgid "Redirect URL"
msgstr "Weiterleitungs-URL"
#: packages/lib/server-only/document/resend-document.tsx:165
msgid "Reminder: {0}"
msgstr ""
#: packages/lib/server-only/document/resend-document.tsx:118
msgid "Reminder: {0} invited you to {recipientActionVerb} a document"
msgstr ""
#: packages/lib/server-only/document/resend-document.tsx:110
msgid "Reminder: Please {recipientActionVerb} this document"
msgstr ""
#: packages/lib/server-only/document/resend-document.tsx:114
msgid "Reminder: Please {recipientActionVerb} your document"
msgstr ""
#: packages/ui/primitives/document-flow/add-fields.tsx:1110
msgid "Remove"
msgstr "Entfernen"
@ -587,6 +884,10 @@ msgstr "Entfernen"
msgid "Required field"
msgstr "Pflichtfeld"
#: packages/email/template-components/template-forgot-password.tsx:33
msgid "Reset Password"
msgstr ""
#: packages/ui/components/document/document-share-button.tsx:147
msgid "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!"
msgstr "Seien Sie versichert, Ihr Dokument ist streng vertraulich und wird niemals geteilt. Nur Ihre Unterzeichnungserfahrung wird hervorgehoben. Teilen Sie Ihre personalisierte Unterschriftkarte, um Ihre Unterschrift zu präsentieren!"
@ -654,6 +955,10 @@ msgstr "Erweiterte Einstellungen anzeigen"
msgid "Sign"
msgstr "Unterschreiben"
#: packages/email/template-components/template-reset-password.tsx:34
msgid "Sign In"
msgstr ""
#: packages/ui/primitives/document-flow/add-fields.tsx:823
#: packages/ui/primitives/document-flow/add-signature.tsx:323
#: packages/ui/primitives/document-flow/field-icon.tsx:52
@ -682,6 +987,15 @@ msgstr "Unterzeichner müssen eindeutige E-Mails haben"
msgid "Signing"
msgstr "Unterzeichnung"
#: packages/lib/server-only/document/send-completed-email.ts:93
#: packages/lib/server-only/document/send-completed-email.ts:161
msgid "Signing Complete!"
msgstr ""
#: packages/lib/constants/recipient-roles.ts:66
#~ msgid "SIGNING_REQUEST"
#~ msgstr ""
#: 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 "Einige Unterzeichner haben noch kein Unterschriftsfeld zugewiesen bekommen. Bitte weisen Sie jedem Unterzeichner mindestens ein Unterschriftsfeld zu, bevor Sie fortfahren."
@ -704,7 +1018,7 @@ msgid "Step <0>{step} of {maxStep}</0>"
msgstr "Schritt <0>{step} von {maxStep}</0>"
#: packages/ui/primitives/document-flow/add-subject.tsx:78
#: packages/ui/primitives/template-flow/add-template-settings.tsx:195
#: packages/ui/primitives/template-flow/add-template-settings.tsx:234
msgid "Subject <0>(Optional)</0>"
msgstr "Betreff <0>(Optional)</0>"
@ -712,7 +1026,19 @@ msgstr "Betreff <0>(Optional)</0>"
msgid "Submit"
msgstr "Einreichen"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:134
#: packages/lib/server-only/team/delete-team-email.ts:96
msgid "Team email has been revoked for {0}"
msgstr ""
#: packages/email/templates/team-email-removed.tsx:53
msgid "Team email removed"
msgstr ""
#: packages/email/templates/team-email-removed.tsx:27
msgid "Team email removed for {teamName} on Documenso"
msgstr ""
#: packages/ui/primitives/template-flow/add-template-settings.tsx:133
msgid "Template title"
msgstr "Vorlagentitel"
@ -722,6 +1048,10 @@ msgstr "Vorlagentitel"
msgid "Text"
msgstr "Text"
#: packages/email/template-components/template-forgot-password.tsx:25
msgid "That's okay, it happens! Click the button below to reset your password."
msgstr ""
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:44
msgid "The authentication required for recipients to sign fields"
msgstr "Die Authentifizierung, die erforderlich ist, damit Empfänger Felder signieren"
@ -738,10 +1068,22 @@ msgstr "Die Authentifizierung, die erforderlich ist, damit Empfänger das Dokume
msgid "The document's name"
msgstr "Der Name des Dokuments"
#: packages/email/templates/team-delete.tsx:35
msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents"
msgstr ""
#: packages/email/templates/team-delete.tsx:34
msgid "The following team has been deleted by you"
msgstr ""
#: packages/ui/primitives/document-password-dialog.tsx:52
msgid "The password you have entered is incorrect. Please try again."
msgstr "Das eingegebene Passwort ist falsch. Bitte versuchen Sie es erneut."
#: packages/email/template-components/template-document-super-delete.tsx:38
msgid "The reason provided for deletion is the following:"
msgstr ""
#: 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 "Der Empfänger muss keine Aktion ausführen und erhält nach Abschluss eine Kopie des Dokuments."
@ -774,10 +1116,18 @@ msgstr "Die E-Mail des Unterzeichners"
msgid "The signer's name"
msgstr "Der Name des Unterzeichners"
#: packages/email/templates/team-email-removed.tsx:57
msgid "The team email <0>{teamEmail}</0> has been removed from the following team"
msgstr ""
#: 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 "Dies kann überschrieben werden, indem die Authentifizierungsanforderungen im nächsten Schritt direkt für jeden Empfänger festgelegt werden."
#: packages/email/template-components/template-document-super-delete.tsx:31
msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support."
msgstr ""
#: packages/ui/primitives/document-flow/add-fields.tsx:757
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
msgstr "Dieses Dokument wurde bereits an diesen Empfänger gesendet. Sie können diesen Empfänger nicht mehr bearbeiten."
@ -786,6 +1136,10 @@ msgstr "Dieses Dokument wurde bereits an diesen Empfänger gesendet. Sie können
msgid "This document is password protected. Please enter the password to view the document."
msgstr "Dieses Dokument ist durch ein Passwort geschützt. Bitte geben Sie das Passwort ein, um das Dokument anzusehen."
#: packages/email/template-components/template-footer.tsx:14
msgid "This document was sent using <0>Documenso.</0>"
msgstr ""
#: 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 "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."
@ -802,12 +1156,12 @@ msgstr "Dieser Unterzeichner hat das Dokument bereits unterschrieben."
msgid "This will override any global settings."
msgstr "Dies überschreibt alle globalen Einstellungen."
#: packages/ui/primitives/document-flow/add-settings.tsx:305
#: packages/ui/primitives/template-flow/add-template-settings.tsx:309
#: packages/ui/primitives/document-flow/add-settings.tsx:347
#: packages/ui/primitives/template-flow/add-template-settings.tsx:348
msgid "Time Zone"
msgstr "Zeitzone"
#: packages/ui/primitives/document-flow/add-settings.tsx:153
#: packages/ui/primitives/document-flow/add-settings.tsx:155
msgid "Title"
msgstr "Titel"
@ -846,6 +1200,18 @@ msgstr "Wert"
msgid "View"
msgstr "Betrachten"
#: packages/email/templates/document-created-from-direct-template.tsx:69
msgid "View document"
msgstr ""
#: packages/email/template-components/template-document-self-signed.tsx:79
msgid "View plans"
msgstr ""
#: packages/lib/constants/recipient-roles.ts:67
#~ msgid "VIEW_REQUEST"
#~ msgstr ""
#: packages/lib/constants/recipient-roles.ts:27
msgid "Viewed"
msgstr "Betrachtet"
@ -862,10 +1228,34 @@ msgstr "Betrachter"
msgid "Viewing"
msgstr "Betrachten"
#: packages/email/template-components/template-document-pending.tsx:31
msgid "Waiting for others"
msgstr ""
#: packages/lib/server-only/document/send-pending-email.ts:73
msgid "Waiting for others to complete signing."
msgstr ""
#: packages/email/template-components/template-document-pending.tsx:41
msgid "We're still waiting for other signers to sign this document.<0/>We'll notify you as soon as it's ready."
msgstr ""
#: packages/email/templates/reset-password.tsx:59
msgid "We've changed your password as you asked. You can now sign in with your new password."
msgstr ""
#: packages/email/template-components/template-confirmation-email.tsx:24
msgid "Welcome to Documenso!"
msgstr ""
#: 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 "Sie sind dabei, dieses Dokument an die Empfänger zu senden. Sind Sie sicher, dass Sie fortfahren möchten?"
#: packages/email/template-components/template-confirmation-email.tsx:41
msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)"
msgstr ""
#: packages/ui/components/document/document-send-email-message-helper.tsx:11
msgid "You can use the following variables in your message:"
msgstr "Sie können die folgenden Variablen in Ihrer Nachricht verwenden:"
@ -874,7 +1264,48 @@ msgstr "Sie können die folgenden Variablen in Ihrer Nachricht verwenden:"
msgid "You cannot upload documents at this time."
msgstr "Sie können derzeit keine Dokumente hochladen."
#: packages/email/template-components/template-document-cancel.tsx:35
msgid "You don't need to sign it anymore."
msgstr ""
#: packages/lib/server-only/team/create-team-member-invites.ts:168
msgid "You have been invited to join {0} on Documenso"
msgstr ""
#: packages/email/templates/team-invite.tsx:59
msgid "You have been invited to join the following team"
msgstr ""
#: packages/lib/server-only/recipient/set-recipients-for-document.ts:314
msgid "You have been removed from a document"
msgstr ""
#: packages/lib/server-only/team/request-team-ownership-transfer.ts:114
msgid "You have been requested to take ownership of team {0} on Documenso"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:102
#: packages/lib/server-only/document/resend-document.tsx:113
msgid "You have initiated the document {0} that requires you to {recipientActionVerb} it."
msgstr ""
#: packages/ui/primitives/document-dropzone.tsx:69
msgid "You have reached your document limit."
msgstr "Sie haben Ihr Dokumentenlimit erreicht."
#: packages/email/template-components/template-document-self-signed.tsx:42
msgid "You have signed “{documentName}”"
msgstr ""
#: packages/email/template-components/template-document-super-delete.tsx:23
msgid "Your document has been deleted by an admin!"
msgstr ""
#: packages/email/template-components/template-reset-password.tsx:26
msgid "Your password has been updated."
msgstr ""
#: packages/email/templates/team-delete.tsx:26
#: packages/email/templates/team-delete.tsx:30
msgid "Your team has been deleted"
msgstr ""

View File

@ -42,7 +42,7 @@ msgstr "Dokument hinzufügen"
msgid "Add More Users for {0}"
msgstr "Mehr Benutzer hinzufügen für {0}"
#: apps/marketing/src/app/(marketing)/open/page.tsx:165
#: apps/marketing/src/app/(marketing)/open/page.tsx:164
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 "Alle unsere Kennzahlen, Finanzen und Erkenntnisse sind öffentlich. Wir glauben an Transparenz und möchten unsere Reise mit Ihnen teilen. Mehr erfahren Sie hier: <0>Ankündigung Offene Kennzahlen</0>"
@ -90,7 +90,7 @@ msgstr "Änderungsprotokoll"
msgid "Choose a template from the community app store. Or submit your own template for others to use."
msgstr "Wählen Sie eine Vorlage aus dem Community-App-Store. Oder reichen Sie Ihre eigene Vorlage ein, damit andere sie benutzen können."
#: apps/marketing/src/app/(marketing)/open/page.tsx:219
#: apps/marketing/src/app/(marketing)/open/page.tsx:218
msgid "Community"
msgstr "Gemeinschaft"
@ -193,7 +193,7 @@ msgstr "Schnell."
msgid "Faster, smarter and more beautiful."
msgstr "Schneller, intelligenter und schöner."
#: apps/marketing/src/app/(marketing)/open/page.tsx:210
#: apps/marketing/src/app/(marketing)/open/page.tsx:209
msgid "Finances"
msgstr "Finanzen"
@ -246,15 +246,15 @@ msgstr "Fangen Sie heute an."
msgid "Get the latest news from Documenso, including product updates, team announcements and more!"
msgstr "Erhalten Sie die neuesten Nachrichten von Documenso, einschließlich Produkt-Updates, Team-Ankündigungen und mehr!"
#: apps/marketing/src/app/(marketing)/open/page.tsx:233
#: apps/marketing/src/app/(marketing)/open/page.tsx:232
msgid "GitHub: Total Merged PRs"
msgstr "GitHub: Gesamte PRs zusammengeführt"
#: apps/marketing/src/app/(marketing)/open/page.tsx:251
#: apps/marketing/src/app/(marketing)/open/page.tsx:250
msgid "GitHub: Total Open Issues"
msgstr "GitHub: Gesamte offene Issues"
#: apps/marketing/src/app/(marketing)/open/page.tsx:225
#: apps/marketing/src/app/(marketing)/open/page.tsx:224
msgid "GitHub: Total Stars"
msgstr "GitHub: Gesamtanzahl Sterne"
@ -262,7 +262,7 @@ msgstr "GitHub: Gesamtanzahl Sterne"
msgid "Global Salary Bands"
msgstr "Globale Gehaltsbänder"
#: apps/marketing/src/app/(marketing)/open/page.tsx:261
#: apps/marketing/src/app/(marketing)/open/page.tsx:260
msgid "Growth"
msgstr "Wachstum"
@ -286,7 +286,7 @@ msgstr "Integrierte Zahlungen mit Stripe, sodass Sie sich keine Sorgen ums Bezah
msgid "Integrates with all your favourite tools."
msgstr "Integriert sich mit all Ihren Lieblingstools."
#: apps/marketing/src/app/(marketing)/open/page.tsx:289
#: apps/marketing/src/app/(marketing)/open/page.tsx:288
msgid "Is there more?"
msgstr "Gibt es mehr?"
@ -310,11 +310,11 @@ msgstr "Standort"
msgid "Make it your own through advanced customization and adjustability."
msgstr "Machen Sie es zu Ihrem eigenen durch erweiterte Anpassung und Einstellbarkeit."
#: apps/marketing/src/app/(marketing)/open/page.tsx:199
#: apps/marketing/src/app/(marketing)/open/page.tsx:198
msgid "Merged PR's"
msgstr "Zusammengeführte PRs"
#: apps/marketing/src/app/(marketing)/open/page.tsx:234
#: apps/marketing/src/app/(marketing)/open/page.tsx:233
msgid "Merged PRs"
msgstr "Zusammengeführte PRs"
@ -345,8 +345,8 @@ msgstr "Keine Kreditkarte erforderlich"
msgid "None of these work for you? Try self-hosting!"
msgstr "Keines dieser Angebote passt zu Ihnen? Versuchen Sie das Selbst-Hosting!"
#: apps/marketing/src/app/(marketing)/open/page.tsx:194
#: apps/marketing/src/app/(marketing)/open/page.tsx:252
#: apps/marketing/src/app/(marketing)/open/page.tsx:193
#: apps/marketing/src/app/(marketing)/open/page.tsx:251
msgid "Open Issues"
msgstr "Offene Issues"
@ -354,7 +354,7 @@ msgstr "Offene Issues"
msgid "Open Source or Hosted."
msgstr "Open Source oder Hosted."
#: apps/marketing/src/app/(marketing)/open/page.tsx:161
#: apps/marketing/src/app/(marketing)/open/page.tsx:160
#: 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
@ -466,7 +466,7 @@ msgstr "Intelligent."
msgid "Star on GitHub"
msgstr "Auf GitHub favorisieren"
#: apps/marketing/src/app/(marketing)/open/page.tsx:226
#: apps/marketing/src/app/(marketing)/open/page.tsx:225
msgid "Stars"
msgstr "Favoriten"
@ -501,7 +501,7 @@ msgstr "Vorlagen-Shop (Demnächst)."
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 "Das ist großartig. Sie können sich die aktuellen <0>Issues</0> ansehen und unserer <1>Discord-Community</1> beitreten, um auf dem neuesten Stand zu bleiben, was die aktuellen Prioritäten sind. In jedem Fall sind wir eine offene Gemeinschaft und begrüßen jegliche Beiträge, technische und nicht-technische ❤️"
#: apps/marketing/src/app/(marketing)/open/page.tsx:293
#: apps/marketing/src/app/(marketing)/open/page.tsx:292
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 "Diese Seite entwickelt sich weiter, während wir lernen, was ein großartiges Signing-Unternehmen ausmacht. Wir werden sie aktualisieren, wenn wir mehr zu teilen haben."
@ -514,8 +514,8 @@ msgstr "Titel"
msgid "Total Completed Documents"
msgstr "Insgesamt Abgeschlossene Dokumente"
#: apps/marketing/src/app/(marketing)/open/page.tsx:266
#: apps/marketing/src/app/(marketing)/open/page.tsx:267
#: apps/marketing/src/app/(marketing)/open/page.tsx:268
msgid "Total Customers"
msgstr "Insgesamt Kunden"
@ -602,4 +602,3 @@ msgstr "Sie können Documenso kostenlos selbst hosten oder unsere sofort einsatz
#: apps/marketing/src/components/(marketing)/carousel.tsx:272
msgid "Your browser does not support the video tag."
msgstr "Ihr Browser unterstützt das Video-Tag nicht."

View File

@ -260,12 +260,12 @@ msgstr "Aktive Abonnements"
msgid "Add"
msgstr "Hinzufügen"
#: 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)/documents/[id]/edit-document.tsx:176
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:88
msgid "Add all relevant fields for each recipient."
msgstr "Fügen Sie alle relevanten Felder für jeden Empfänger hinzu."
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:83
msgid "Add all relevant placeholders for each recipient."
msgstr "Fügen Sie alle relevanten Platzhalter für jeden Empfänger hinzu."
@ -281,8 +281,8 @@ msgstr "Fügen Sie einen Authenticator hinzu, um als sekundäre Authentifizierun
msgid "Add email"
msgstr "E-Mail hinzufügen"
#: 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)/documents/[id]/edit-document.tsx:175
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
msgid "Add Fields"
msgstr "Felder hinzufügen"
@ -295,15 +295,15 @@ msgstr "Mehr hinzufügen"
msgid "Add passkey"
msgstr "Passkey hinzufügen"
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:81
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82
msgid "Add Placeholders"
msgstr "Platzhalter hinzufügen"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
msgid "Add Signers"
msgstr "Unterzeichner hinzufügen"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180
msgid "Add Subject"
msgstr "Betreff hinzufügen"
@ -311,7 +311,7 @@ msgstr "Betreff hinzufügen"
msgid "Add team email"
msgstr "Team-E-Mail hinzufügen"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:171
msgid "Add the people who will sign the document."
msgstr "Fügen Sie die Personen hinzu, die das Dokument unterschreiben werden."
@ -319,7 +319,7 @@ msgstr "Fügen Sie die Personen hinzu, die das Dokument unterschreiben werden."
msgid "Add the recipients to create the document with"
msgstr "Fügen Sie die Empfänger hinzu, um das Dokument zu erstellen"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181
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."
@ -414,13 +414,13 @@ msgstr "Eine E-Mail, in der die Übertragung dieses Teams angefordert wird, wurd
msgid "An error occurred"
msgstr "Ein Fehler ist aufgetreten"
#: 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:231
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:268
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:201
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:235
msgid "An error occurred while adding signers."
msgstr "Ein Fehler ist aufgetreten, während Unterzeichner hinzugefügt wurden."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303
msgid "An error occurred while adding the fields."
msgstr "Ein Fehler ist aufgetreten, während die Felder hinzugefügt wurden."
@ -482,7 +482,7 @@ msgstr "Ein Fehler ist aufgetreten, während die Unterschrift entfernt wurde."
msgid "An error occurred while removing the text."
msgstr "Ein Fehler ist aufgetreten, während der Text entfernt wurde."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:332
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:334
msgid "An error occurred while sending the document."
msgstr "Ein Fehler ist aufgetreten, während das Dokument gesendet wurde."
@ -507,8 +507,8 @@ msgstr "Ein Fehler ist aufgetreten, während das Dokument unterzeichnet wurde."
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."
#: 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)/documents/[id]/edit-document.tsx:234
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:170
msgid "An error occurred while updating the document settings."
msgstr "Ein Fehler ist aufgetreten, während die Dokumenteinstellungen aktualisiert wurden."
@ -869,11 +869,11 @@ msgstr "Abgeschlossene Dokumente"
msgid "Completed Documents"
msgstr "Abgeschlossene Dokumente"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:166
msgid "Configure general settings for the document."
msgstr "Konfigurieren Sie die allgemeinen Einstellungen für das Dokument."
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:78
msgid "Configure general settings for the template."
msgstr "Konfigurieren Sie die allgemeinen Einstellungen für die Vorlage."
@ -1350,7 +1350,7 @@ msgstr "Dokument erneut gesendet"
msgid "Document resealed"
msgstr "Dokument wieder versiegelt"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:323
msgid "Document sent"
msgstr "Dokument gesendet"
@ -1579,16 +1579,16 @@ 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/users/[id]/page.tsx:78
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:231
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:233
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:267
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:302
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:333
#: 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:112
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:165
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:196
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:230
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:169
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:200
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:234
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:160
@ -1679,8 +1679,8 @@ msgstr "Haben Sie Ihr Passwort vergessen?"
msgid "Full Name"
msgstr "Vollständiger Name"
#: 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)/documents/[id]/edit-document.tsx:165
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77
#: 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/mobile-nav.tsx:51
@ -3244,7 +3244,7 @@ msgstr "Vorlage wurde aktualisiert."
msgid "Template moved"
msgstr "Vorlage verschoben"
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:219
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:223
msgid "Template saved"
msgstr "Vorlage gespeichert"
@ -4521,7 +4521,7 @@ msgstr "Ihr Dokument wurde erfolgreich aus der Vorlage erstellt."
msgid "Your document has been re-sent successfully."
msgstr "Ihr Dokument wurde erfolgreich erneut gesendet."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:322
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:324
msgid "Your document has been sent successfully."
msgstr "Ihr Dokument wurde erfolgreich gesendet."
@ -4612,7 +4612,7 @@ msgstr "Ihre Vorlage wurde erfolgreich gelöscht."
msgid "Your template will be duplicated."
msgstr "Ihre Vorlage wird dupliziert."
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:220
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:224
msgid "Your templates has been saved successfully."
msgstr "Ihre Vorlagen wurden erfolgreich gespeichert."
@ -4628,4 +4628,3 @@ 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
msgid "Your tokens will be shown here once you create them."
msgstr "Ihre Tokens werden hier angezeigt, sobald Sie sie erstellt haben."

View File

@ -13,14 +13,104 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: packages/email/template-components/template-document-super-delete.tsx:27
msgid "\"{documentName}\" has been deleted by an admin."
msgstr "\"{documentName}\" has been deleted by an admin."
#: packages/email/template-components/template-document-pending.tsx:37
msgid "“{documentName}” has been signed"
msgstr "“{documentName}” has been signed"
#: packages/email/template-components/template-document-completed.tsx:41
#: packages/lib/server-only/document/resend-document.tsx:109
msgid "{0}"
msgstr "{0}"
#: packages/email/template-components/template-document-invite.tsx:74
msgid "{0} Document"
msgstr "{0} Document"
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:117
msgid "{0} invited you to {recipientActionVerb} a document"
msgstr "{0} invited you to {recipientActionVerb} a document"
#: packages/email/templates/team-join.tsx:55
msgid "{0} joined the team {teamName} on Documenso"
msgstr "{0} joined the team {teamName} on Documenso"
#: packages/email/templates/team-leave.tsx:55
msgid "{0} left the team {teamName} on Documenso"
msgstr "{0} left the team {teamName} on Documenso"
#: packages/ui/primitives/data-table-pagination.tsx:30
msgid "{0} of {1} row(s) selected."
msgstr "{0} of {1} row(s) selected."
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:119
#: packages/lib/server-only/document/resend-document.tsx:119
msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
#: packages/email/templates/document-invite.tsx:79
msgid "{inviterName} <0>({inviterEmail})</0>"
msgstr "{inviterName} <0>({inviterEmail})</0>"
#: packages/email/templates/document-cancel.tsx:19
msgid "{inviterName} has cancelled the document {documentName}, you don't need to sign it anymore."
msgstr "{inviterName} has cancelled the document {documentName}, you don't need to sign it anymore."
#: packages/email/template-components/template-document-cancel.tsx:24
msgid "{inviterName} has cancelled the document<0/>\"{documentName}\""
msgstr "{inviterName} has cancelled the document<0/>\"{documentName}\""
#: packages/email/template-components/template-document-invite.tsx:57
msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\""
msgstr "{inviterName} has invited you to {0}<0/>\"{documentName}\""
#: packages/email/templates/document-invite.tsx:41
msgid "{inviterName} has invited you to {action} {documentName}"
msgstr "{inviterName} has invited you to {action} {documentName}"
#: packages/email/templates/recipient-removed-from-document.tsx:18
msgid "{inviterName} has removed you from the document {documentName}."
msgstr "{inviterName} has removed you from the document {documentName}."
#: packages/email/template-components/template-document-invite.tsx:49
msgid "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\""
msgstr "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\""
#: packages/email/templates/document-invite.tsx:40
msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
msgstr "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
#: packages/email/templates/team-join.tsx:61
msgid "{memberEmail} joined the following team"
msgstr "{memberEmail} joined the following team"
#: packages/email/templates/team-leave.tsx:61
msgid "{memberEmail} left the following team"
msgstr "{memberEmail} left the following team"
#: packages/email/templates/document-created-from-direct-template.tsx:55
msgid "{recipientName} {action} a document by using one of your direct links"
msgstr "{recipientName} {action} a document by using one of your direct links"
#: packages/email/templates/team-transfer-request.tsx:55
msgid "{teamName} ownership transfer request"
msgstr "{teamName} ownership transfer request"
#: packages/ui/primitives/data-table-pagination.tsx:41
msgid "{visibleRows, plural, one {Showing # result.} other {Showing # results.}}"
msgstr "{visibleRows, plural, one {Showing # result.} other {Showing # results.}}"
#: packages/email/templates/document-invite.tsx:91
msgid "`${inviterName} has invited you to ${action} the document \"${documentName}\".`"
msgstr "`${inviterName} has invited you to ${action} the document \"${documentName}\".`"
#: packages/email/templates/team-transfer-request.tsx:59
msgid "<0>{senderName}</0> has requested that you take ownership of the following team"
msgstr "<0>{senderName}</0> has requested that you take ownership of the following team"
#: 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>Inherit authentication method</0> - Use the global action signing authentication method configured in the \"General Settings\" step"
@ -51,20 +141,66 @@ msgstr "<0>Require account</0> - The recipient must be signed in to view the doc
msgid "<0>Require passkey</0> - The recipient must have an account and passkey configured via their settings"
msgstr "<0>Require passkey</0> - The recipient must have an account and passkey configured via their settings"
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:109
msgid "A document was created by your direct template that requires you to {recipientActionVerb} it."
msgstr "A document was created by your direct template that requires you to {recipientActionVerb} it."
#: packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts:90
msgid "A new member has joined your team"
msgstr "A new member has joined your team"
#: packages/lib/server-only/team/create-team-email-verification.ts:142
msgid "A request to use your email has been initiated by {teamName} on Documenso"
msgstr "A request to use your email has been initiated by {teamName} on Documenso"
#: packages/email/templates/team-join.tsx:29
msgid "A team member has joined a team on Documenso"
msgstr "A team member has joined a team on Documenso"
#: packages/lib/jobs/definitions/emails/send-team-member-left-email.ts:79
msgid "A team member has left {0}"
msgstr "A team member has left {0}"
#: packages/email/templates/team-leave.tsx:29
msgid "A team member has left a team on Documenso"
msgstr "A team member has left a team on Documenso"
#: packages/email/templates/team-delete.tsx:27
#: packages/email/templates/team-delete.tsx:31
msgid "A team you were a part of has been deleted"
msgstr "A team you were a part of has been deleted"
#: packages/email/templates/team-invite.tsx:77
#: packages/email/templates/team-transfer-request.tsx:81
msgid "Accept"
msgstr "Accept"
#: packages/email/templates/team-invite.tsx:29
msgid "Accept invitation to join a team on Documenso"
msgstr "Accept invitation to join a team on Documenso"
#: packages/email/templates/confirm-team-email.tsx:38
msgid "Accept team email request for {teamName} on Documenso"
msgstr "Accept team email request for {teamName} on Documenso"
#: packages/email/templates/team-transfer-request.tsx:29
msgid "Accept team transfer request on Documenso"
msgstr "Accept team transfer request on Documenso"
#: packages/ui/primitives/document-dropzone.tsx:69
msgid "Add a document"
msgstr "Add a document"
#: packages/ui/primitives/document-flow/add-settings.tsx:336
#: packages/ui/primitives/template-flow/add-template-settings.tsx:339
#: packages/ui/primitives/document-flow/add-settings.tsx:378
#: packages/ui/primitives/template-flow/add-template-settings.tsx:378
msgid "Add a URL to redirect the user to once the document is signed"
msgstr "Add a URL to redirect the user to once the document is signed"
#: packages/ui/primitives/document-flow/add-settings.tsx:248
#: packages/ui/primitives/document-flow/add-settings.tsx:290
msgid "Add an external ID to the document. This can be used to identify the document in external systems."
msgstr "Add an external ID to the document. This can be used to identify the document in external systems."
#: packages/ui/primitives/template-flow/add-template-settings.tsx:256
#: packages/ui/primitives/template-flow/add-template-settings.tsx:295
msgid "Add an external ID to the template. This can be used to identify in external systems."
msgstr "Add an external ID to the template. This can be used to identify in external systems."
@ -105,8 +241,8 @@ msgstr "Add text to the field"
msgid "Admin"
msgstr "Admin"
#: packages/ui/primitives/document-flow/add-settings.tsx:230
#: packages/ui/primitives/template-flow/add-template-settings.tsx:238
#: packages/ui/primitives/document-flow/add-settings.tsx:272
#: packages/ui/primitives/template-flow/add-template-settings.tsx:277
msgid "Advanced Options"
msgstr "Advanced Options"
@ -119,6 +255,14 @@ msgstr "Advanced settings"
msgid "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email."
msgstr "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email."
#: packages/email/template-components/template-document-cancel.tsx:31
msgid "All signatures have been voided."
msgstr "All signatures have been voided."
#: packages/email/templates/document-super-delete.tsx:20
msgid "An admin has deleted your document \"{documentName}\"."
msgstr "An admin has deleted your document \"{documentName}\"."
#: packages/ui/primitives/pdf-viewer.tsx:167
msgid "An error occurred while loading the document."
msgstr "An error occurred while loading the document."
@ -127,6 +271,10 @@ msgstr "An error occurred while loading the document."
msgid "Approve"
msgstr "Approve"
#: packages/lib/constants/recipient-roles.ts:68
#~ msgid "APPROVE_REQUEST"
#~ msgstr "APPROVE_REQUEST"
#: packages/lib/constants/recipient-roles.ts:9
msgid "Approved"
msgstr "Approved"
@ -143,6 +291,10 @@ msgstr "Approvers"
msgid "Approving"
msgstr "Approving"
#: packages/email/template-components/template-confirmation-email.tsx:28
msgid "Before you get started, please confirm your email address by clicking the button below:"
msgstr "Before you get started, please confirm your email address by clicking the button below:"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
msgid "Black"
msgstr "Black"
@ -151,6 +303,14 @@ msgstr "Black"
msgid "Blue"
msgstr "Blue"
#: packages/email/templates/team-invite.tsx:67
msgid "by <0>{senderName}</0>"
msgstr "by <0>{senderName}</0>"
#: packages/email/templates/team-transfer-request.tsx:70
msgid "By accepting this request, you will take responsibility for any billing items associated with this team."
msgstr "By accepting this request, you will take responsibility for any billing items associated with this team."
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58
msgid "Cancel"
@ -201,6 +361,16 @@ msgstr "Click to insert field"
msgid "Close"
msgstr "Close"
#: packages/email/template-components/template-document-completed.tsx:35
#: packages/email/template-components/template-document-self-signed.tsx:36
msgid "Completed"
msgstr "Completed"
#: packages/email/templates/document-completed.tsx:21
#: packages/email/templates/document-self-signed.tsx:17
msgid "Completed Document"
msgstr "Completed Document"
#: packages/lib/constants/template.ts:12
msgid "Configure Direct Recipient"
msgstr "Configure Direct Recipient"
@ -210,10 +380,22 @@ msgstr "Configure Direct Recipient"
msgid "Configure the {0} field"
msgstr "Configure the {0} field"
#: packages/email/template-components/template-confirmation-email.tsx:38
msgid "Confirm email"
msgstr "Confirm email"
#: packages/ui/primitives/document-flow/document-flow-root.tsx:141
msgid "Continue"
msgstr "Continue"
#: packages/email/template-components/template-document-invite.tsx:66
msgid "Continue by {0} the document."
msgstr "Continue by {0} the document."
#: packages/email/template-components/template-document-completed.tsx:45
msgid "Continue by downloading the document."
msgstr "Continue by downloading the document."
#: packages/ui/components/document/document-share-button.tsx:46
msgid "Copied to clipboard"
msgstr "Copied to clipboard"
@ -222,6 +404,14 @@ msgstr "Copied to clipboard"
msgid "Copy Link"
msgstr "Copy Link"
#: packages/email/template-components/template-document-self-signed.tsx:46
msgid "Create a <0>free account</0> to access your signed documents at any time."
msgstr "Create a <0>free account</0> to access your signed documents at any time."
#: packages/email/template-components/template-document-self-signed.tsx:68
msgid "Create account"
msgstr "Create account"
#: packages/ui/primitives/document-flow/add-signature.tsx:360
msgid "Custom Text"
msgstr "Custom Text"
@ -232,25 +422,47 @@ msgstr "Custom Text"
msgid "Date"
msgstr "Date"
#: packages/ui/primitives/document-flow/add-settings.tsx:271
#: packages/ui/primitives/template-flow/add-template-settings.tsx:279
#: packages/ui/primitives/document-flow/add-settings.tsx:313
#: packages/ui/primitives/template-flow/add-template-settings.tsx:318
msgid "Date Format"
msgstr "Date Format"
#: packages/email/templates/team-invite.tsx:83
msgid "Decline"
msgstr "Decline"
#: packages/email/templates/reset-password.tsx:65
msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us.</0>"
msgstr "Didn't request a password change? We are here to help you secure your account, just <0>contact us.</0>"
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570
msgid "Direct link receiver"
msgstr "Direct link receiver"
#: 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
#: packages/ui/primitives/document-flow/add-settings.tsx:216
#: packages/ui/primitives/template-flow/add-template-settings.tsx:190
msgid "Document access"
msgstr "Document access"
#: packages/lib/server-only/document/super-delete-document.ts:75
msgid "Document Cancelled"
msgstr "Document Cancelled"
#: packages/email/templates/document-created-from-direct-template.tsx:30
#: packages/lib/server-only/template/create-document-from-direct-template.ts:554
msgid "Document created from direct template"
msgstr "Document created from direct template"
#: packages/lib/constants/template.ts:20
msgid "Document Creation"
msgstr "Document Creation"
#: packages/lib/server-only/document/send-delete-email.ts:58
msgid "Document Deleted!"
msgstr "Document Deleted!"
#: packages/email/template-components/template-document-completed.tsx:64
#: packages/ui/components/document/document-download-button.tsx:68
msgid "Download"
msgstr "Download"
@ -283,7 +495,7 @@ msgstr "Email"
msgid "Email is required"
msgstr "Email is required"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:184
#: packages/ui/primitives/template-flow/add-template-settings.tsx:223
msgid "Email Options"
msgstr "Email Options"
@ -313,8 +525,8 @@ msgstr "Enter password"
msgid "Error"
msgstr "Error"
#: packages/ui/primitives/document-flow/add-settings.tsx:241
#: packages/ui/primitives/template-flow/add-template-settings.tsx:249
#: packages/ui/primitives/document-flow/add-settings.tsx:283
#: packages/ui/primitives/template-flow/add-template-settings.tsx:288
msgid "External ID"
msgstr "External ID"
@ -356,6 +568,14 @@ msgstr "Field placeholder"
msgid "Font Size"
msgstr "Font Size"
#: packages/lib/server-only/auth/send-forgot-password.ts:61
msgid "Forgot Password?"
msgstr "Forgot Password?"
#: packages/email/template-components/template-forgot-password.tsx:21
msgid "Forgot your password?"
msgstr "Forgot your password?"
#: packages/ui/primitives/document-flow/types.ts:50
msgid "Free Signature"
msgstr "Free Signature"
@ -372,6 +592,10 @@ msgstr "Go Back"
msgid "Green"
msgstr "Green"
#: packages/email/templates/reset-password.tsx:50
msgid "Hi, {userName} <0>({userEmail})</0>"
msgstr "Hi, {userName} <0>({userEmail})</0>"
#: packages/lib/constants/recipient-roles.ts:76
msgid "I am a signer of this document"
msgstr "I am a signer of this document"
@ -405,12 +629,25 @@ msgstr "Invalid email"
msgid "Invalid email address"
msgstr "Invalid email address"
#: packages/email/templates/team-invite.tsx:55
msgid "Join {teamName} on Documenso"
msgstr "Join {teamName} on Documenso"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48
msgid "Label"
msgstr "Label"
#: packages/ui/primitives/document-flow/add-settings.tsx:176
#: packages/ui/primitives/template-flow/add-template-settings.tsx:150
msgid "Language"
msgstr "Language"
#: packages/email/templates/team-transfer-request.tsx:87
msgid "Link expires in 1 hour."
msgstr "Link expires in 1 hour."
#: packages/ui/primitives/lazy-pdf-viewer.tsx:15
#: packages/ui/primitives/pdf-viewer.tsx:44
msgid "Loading document..."
@ -429,7 +666,7 @@ msgid "Member"
msgstr "Member"
#: packages/ui/primitives/document-flow/add-subject.tsx:95
#: packages/ui/primitives/template-flow/add-template-settings.tsx:215
#: packages/ui/primitives/template-flow/add-template-settings.tsx:254
msgid "Message <0>(Optional)</0>"
msgstr "Message <0>(Optional)</0>"
@ -520,6 +757,22 @@ msgstr "Page {0} of {numPages}"
msgid "Password Required"
msgstr "Password Required"
#: packages/email/templates/forgot-password.tsx:17
msgid "Password Reset Requested"
msgstr "Password Reset Requested"
#: packages/email/templates/reset-password.tsx:18
msgid "Password Reset Successful"
msgstr "Password Reset Successful"
#: packages/email/template-components/template-reset-password.tsx:22
msgid "Password updated!"
msgstr "Password updated!"
#: packages/email/templates/document-pending.tsx:17
msgid "Pending Document"
msgstr "Pending Document"
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156
msgid "Pick a number"
msgstr "Pick a number"
@ -530,6 +783,34 @@ msgstr "Pick a number"
msgid "Placeholder"
msgstr "Placeholder"
#: packages/email/template-components/template-document-invite.tsx:43
msgid "Please {0} your document<0/>\"{documentName}\""
msgstr "Please {0} your document<0/>\"{documentName}\""
#: packages/email/templates/document-invite.tsx:38
msgid "Please {action} your document {documentName}"
msgstr "Please {action} your document {documentName}"
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:98
msgid "Please {recipientActionVerb} this document"
msgstr "Please {recipientActionVerb} this document"
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:112
msgid "Please {recipientActionVerb} this document created by your direct template"
msgstr "Please {recipientActionVerb} this document created by your direct template"
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:104
msgid "Please {recipientActionVerb} your document"
msgstr "Please {recipientActionVerb} your document"
#: packages/lib/server-only/auth/send-confirmation-email.ts:67
msgid "Please confirm your email"
msgstr "Please confirm your email"
#: packages/email/templates/confirm-email.tsx:15
msgid "Please confirm your email address"
msgstr "Please confirm your email address"
#: packages/ui/primitives/pdf-viewer.tsx:223
#: packages/ui/primitives/pdf-viewer.tsx:238
msgid "Please try again or contact our support."
@ -556,8 +837,8 @@ msgid "Receives copy"
msgstr "Receives copy"
#: 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
#: packages/ui/primitives/document-flow/add-settings.tsx:257
#: packages/ui/primitives/template-flow/add-template-settings.tsx:208
msgid "Recipient action authentication"
msgstr "Recipient action authentication"
@ -565,11 +846,27 @@ msgstr "Recipient action authentication"
msgid "Red"
msgstr "Red"
#: packages/ui/primitives/document-flow/add-settings.tsx:329
#: packages/ui/primitives/template-flow/add-template-settings.tsx:332
#: packages/ui/primitives/document-flow/add-settings.tsx:371
#: packages/ui/primitives/template-flow/add-template-settings.tsx:371
msgid "Redirect URL"
msgstr "Redirect URL"
#: packages/lib/server-only/document/resend-document.tsx:165
msgid "Reminder: {0}"
msgstr "Reminder: {0}"
#: packages/lib/server-only/document/resend-document.tsx:118
msgid "Reminder: {0} invited you to {recipientActionVerb} a document"
msgstr "Reminder: {0} invited you to {recipientActionVerb} a document"
#: packages/lib/server-only/document/resend-document.tsx:110
msgid "Reminder: Please {recipientActionVerb} this document"
msgstr "Reminder: Please {recipientActionVerb} this document"
#: packages/lib/server-only/document/resend-document.tsx:114
msgid "Reminder: Please {recipientActionVerb} your document"
msgstr "Reminder: Please {recipientActionVerb} your document"
#: packages/ui/primitives/document-flow/add-fields.tsx:1110
msgid "Remove"
msgstr "Remove"
@ -582,6 +879,10 @@ msgstr "Remove"
msgid "Required field"
msgstr "Required field"
#: packages/email/template-components/template-forgot-password.tsx:33
msgid "Reset Password"
msgstr "Reset Password"
#: packages/ui/components/document/document-share-button.tsx:147
msgid "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!"
msgstr "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!"
@ -649,6 +950,10 @@ msgstr "Show advanced settings"
msgid "Sign"
msgstr "Sign"
#: packages/email/template-components/template-reset-password.tsx:34
msgid "Sign In"
msgstr "Sign In"
#: packages/ui/primitives/document-flow/add-fields.tsx:823
#: packages/ui/primitives/document-flow/add-signature.tsx:323
#: packages/ui/primitives/document-flow/field-icon.tsx:52
@ -677,6 +982,15 @@ msgstr "Signers must have unique emails"
msgid "Signing"
msgstr "Signing"
#: packages/lib/server-only/document/send-completed-email.ts:93
#: packages/lib/server-only/document/send-completed-email.ts:161
msgid "Signing Complete!"
msgstr "Signing Complete!"
#: packages/lib/constants/recipient-roles.ts:66
#~ msgid "SIGNING_REQUEST"
#~ msgstr "SIGNING_REQUEST"
#: 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 "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
@ -699,7 +1013,7 @@ msgid "Step <0>{step} of {maxStep}</0>"
msgstr "Step <0>{step} of {maxStep}</0>"
#: packages/ui/primitives/document-flow/add-subject.tsx:78
#: packages/ui/primitives/template-flow/add-template-settings.tsx:195
#: packages/ui/primitives/template-flow/add-template-settings.tsx:234
msgid "Subject <0>(Optional)</0>"
msgstr "Subject <0>(Optional)</0>"
@ -707,7 +1021,19 @@ msgstr "Subject <0>(Optional)</0>"
msgid "Submit"
msgstr "Submit"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:134
#: packages/lib/server-only/team/delete-team-email.ts:96
msgid "Team email has been revoked for {0}"
msgstr "Team email has been revoked for {0}"
#: packages/email/templates/team-email-removed.tsx:53
msgid "Team email removed"
msgstr "Team email removed"
#: packages/email/templates/team-email-removed.tsx:27
msgid "Team email removed for {teamName} on Documenso"
msgstr "Team email removed for {teamName} on Documenso"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:133
msgid "Template title"
msgstr "Template title"
@ -717,6 +1043,10 @@ msgstr "Template title"
msgid "Text"
msgstr "Text"
#: packages/email/template-components/template-forgot-password.tsx:25
msgid "That's okay, it happens! Click the button below to reset your password."
msgstr "That's okay, it happens! Click the button below to reset your password."
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:44
msgid "The authentication required for recipients to sign fields"
msgstr "The authentication required for recipients to sign fields"
@ -733,10 +1063,22 @@ msgstr "The authentication required for recipients to view the document."
msgid "The document's name"
msgstr "The document's name"
#: packages/email/templates/team-delete.tsx:35
msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents"
msgstr "The following team has been deleted by its owner. You will no longer be able to access this team and its documents"
#: packages/email/templates/team-delete.tsx:34
msgid "The following team has been deleted by you"
msgstr "The following team has been deleted by you"
#: packages/ui/primitives/document-password-dialog.tsx:52
msgid "The password you have entered is incorrect. Please try again."
msgstr "The password you have entered is incorrect. Please try again."
#: packages/email/template-components/template-document-super-delete.tsx:38
msgid "The reason provided for deletion is the following:"
msgstr "The reason provided for deletion is the following:"
#: 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 "The recipient is not required to take any action and receives a copy of the document after it is completed."
@ -769,10 +1111,18 @@ msgstr "The signer's email"
msgid "The signer's name"
msgstr "The signer's name"
#: packages/email/templates/team-email-removed.tsx:57
msgid "The team email <0>{teamEmail}</0> has been removed from the following team"
msgstr "The team email <0>{teamEmail}</0> has been removed from the following team"
#: 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 "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
#: packages/email/template-components/template-document-super-delete.tsx:31
msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support."
msgstr "This document can not be recovered, if you would like to dispute the reason for future documents please contact support."
#: packages/ui/primitives/document-flow/add-fields.tsx:757
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."
@ -781,6 +1131,10 @@ msgstr "This document has already been sent to this recipient. You can no longer
msgid "This document is password protected. Please enter the password to view the document."
msgstr "This document is password protected. Please enter the password to view the document."
#: packages/email/template-components/template-footer.tsx:14
msgid "This document was sent using <0>Documenso.</0>"
msgstr "This document was sent using <0>Documenso.</0>"
#: 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 "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."
@ -797,12 +1151,12 @@ msgstr "This signer has already signed the document."
msgid "This will override any global settings."
msgstr "This will override any global settings."
#: packages/ui/primitives/document-flow/add-settings.tsx:305
#: packages/ui/primitives/template-flow/add-template-settings.tsx:309
#: packages/ui/primitives/document-flow/add-settings.tsx:347
#: packages/ui/primitives/template-flow/add-template-settings.tsx:348
msgid "Time Zone"
msgstr "Time Zone"
#: packages/ui/primitives/document-flow/add-settings.tsx:153
#: packages/ui/primitives/document-flow/add-settings.tsx:155
msgid "Title"
msgstr "Title"
@ -841,6 +1195,18 @@ msgstr "Value"
msgid "View"
msgstr "View"
#: packages/email/templates/document-created-from-direct-template.tsx:69
msgid "View document"
msgstr "View document"
#: packages/email/template-components/template-document-self-signed.tsx:79
msgid "View plans"
msgstr "View plans"
#: packages/lib/constants/recipient-roles.ts:67
#~ msgid "VIEW_REQUEST"
#~ msgstr "VIEW_REQUEST"
#: packages/lib/constants/recipient-roles.ts:27
msgid "Viewed"
msgstr "Viewed"
@ -857,10 +1223,34 @@ msgstr "Viewers"
msgid "Viewing"
msgstr "Viewing"
#: packages/email/template-components/template-document-pending.tsx:31
msgid "Waiting for others"
msgstr "Waiting for others"
#: packages/lib/server-only/document/send-pending-email.ts:73
msgid "Waiting for others to complete signing."
msgstr "Waiting for others to complete signing."
#: packages/email/template-components/template-document-pending.tsx:41
msgid "We're still waiting for other signers to sign this document.<0/>We'll notify you as soon as it's ready."
msgstr "We're still waiting for other signers to sign this document.<0/>We'll notify you as soon as it's ready."
#: packages/email/templates/reset-password.tsx:59
msgid "We've changed your password as you asked. You can now sign in with your new password."
msgstr "We've changed your password as you asked. You can now sign in with your new password."
#: packages/email/template-components/template-confirmation-email.tsx:24
msgid "Welcome to Documenso!"
msgstr "Welcome to Documenso!"
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:44
msgid "You are about to send this document to the recipients. Are you sure you want to continue?"
msgstr "You are about to send this document to the recipients. Are you sure you want to continue?"
#: packages/email/template-components/template-confirmation-email.tsx:41
msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)"
msgstr "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)"
#: packages/ui/components/document/document-send-email-message-helper.tsx:11
msgid "You can use the following variables in your message:"
msgstr "You can use the following variables in your message:"
@ -869,6 +1259,48 @@ msgstr "You can use the following variables in your message:"
msgid "You cannot upload documents at this time."
msgstr "You cannot upload documents at this time."
#: packages/email/template-components/template-document-cancel.tsx:35
msgid "You don't need to sign it anymore."
msgstr "You don't need to sign it anymore."
#: packages/lib/server-only/team/create-team-member-invites.ts:168
msgid "You have been invited to join {0} on Documenso"
msgstr "You have been invited to join {0} on Documenso"
#: packages/email/templates/team-invite.tsx:59
msgid "You have been invited to join the following team"
msgstr "You have been invited to join the following team"
#: packages/lib/server-only/recipient/set-recipients-for-document.ts:314
msgid "You have been removed from a document"
msgstr "You have been removed from a document"
#: packages/lib/server-only/team/request-team-ownership-transfer.ts:114
msgid "You have been requested to take ownership of team {0} on Documenso"
msgstr "You have been requested to take ownership of team {0} on Documenso"
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:102
#: packages/lib/server-only/document/resend-document.tsx:113
msgid "You have initiated the document {0} that requires you to {recipientActionVerb} it."
msgstr "You have initiated the document {0} that requires you to {recipientActionVerb} it."
#: packages/ui/primitives/document-dropzone.tsx:69
msgid "You have reached your document limit."
msgstr "You have reached your document limit."
#: packages/email/template-components/template-document-self-signed.tsx:42
msgid "You have signed “{documentName}”"
msgstr "You have signed “{documentName}”"
#: packages/email/template-components/template-document-super-delete.tsx:23
msgid "Your document has been deleted by an admin!"
msgstr "Your document has been deleted by an admin!"
#: packages/email/template-components/template-reset-password.tsx:26
msgid "Your password has been updated."
msgstr "Your password has been updated."
#: packages/email/templates/team-delete.tsx:26
#: packages/email/templates/team-delete.tsx:30
msgid "Your team has been deleted"
msgstr "Your team has been deleted"

View File

@ -37,7 +37,7 @@ msgstr "Add document"
msgid "Add More Users for {0}"
msgstr "Add More Users for {0}"
#: apps/marketing/src/app/(marketing)/open/page.tsx:165
#: apps/marketing/src/app/(marketing)/open/page.tsx:164
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 "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>"
@ -85,7 +85,7 @@ msgstr "Changelog"
msgid "Choose a template from the community app store. Or submit your own template for others to use."
msgstr "Choose a template from the community app store. Or submit your own template for others to use."
#: apps/marketing/src/app/(marketing)/open/page.tsx:219
#: apps/marketing/src/app/(marketing)/open/page.tsx:218
msgid "Community"
msgstr "Community"
@ -188,7 +188,7 @@ msgstr "Fast."
msgid "Faster, smarter and more beautiful."
msgstr "Faster, smarter and more beautiful."
#: apps/marketing/src/app/(marketing)/open/page.tsx:210
#: apps/marketing/src/app/(marketing)/open/page.tsx:209
msgid "Finances"
msgstr "Finances"
@ -241,15 +241,15 @@ msgstr "Get started today."
msgid "Get the latest news from Documenso, including product updates, team announcements and more!"
msgstr "Get the latest news from Documenso, including product updates, team announcements and more!"
#: apps/marketing/src/app/(marketing)/open/page.tsx:233
#: apps/marketing/src/app/(marketing)/open/page.tsx:232
msgid "GitHub: Total Merged PRs"
msgstr "GitHub: Total Merged PRs"
#: apps/marketing/src/app/(marketing)/open/page.tsx:251
#: apps/marketing/src/app/(marketing)/open/page.tsx:250
msgid "GitHub: Total Open Issues"
msgstr "GitHub: Total Open Issues"
#: apps/marketing/src/app/(marketing)/open/page.tsx:225
#: apps/marketing/src/app/(marketing)/open/page.tsx:224
msgid "GitHub: Total Stars"
msgstr "GitHub: Total Stars"
@ -257,7 +257,7 @@ msgstr "GitHub: Total Stars"
msgid "Global Salary Bands"
msgstr "Global Salary Bands"
#: apps/marketing/src/app/(marketing)/open/page.tsx:261
#: apps/marketing/src/app/(marketing)/open/page.tsx:260
msgid "Growth"
msgstr "Growth"
@ -281,7 +281,7 @@ msgstr "Integrated payments with Stripe so you dont have to worry about getti
msgid "Integrates with all your favourite tools."
msgstr "Integrates with all your favourite tools."
#: apps/marketing/src/app/(marketing)/open/page.tsx:289
#: apps/marketing/src/app/(marketing)/open/page.tsx:288
msgid "Is there more?"
msgstr "Is there more?"
@ -305,11 +305,11 @@ msgstr "Location"
msgid "Make it your own through advanced customization and adjustability."
msgstr "Make it your own through advanced customization and adjustability."
#: apps/marketing/src/app/(marketing)/open/page.tsx:199
#: apps/marketing/src/app/(marketing)/open/page.tsx:198
msgid "Merged PR's"
msgstr "Merged PR's"
#: apps/marketing/src/app/(marketing)/open/page.tsx:234
#: apps/marketing/src/app/(marketing)/open/page.tsx:233
msgid "Merged PRs"
msgstr "Merged PRs"
@ -340,8 +340,8 @@ msgstr "No Credit Card required"
msgid "None of these work for you? Try self-hosting!"
msgstr "None of these work for you? Try self-hosting!"
#: apps/marketing/src/app/(marketing)/open/page.tsx:194
#: apps/marketing/src/app/(marketing)/open/page.tsx:252
#: apps/marketing/src/app/(marketing)/open/page.tsx:193
#: apps/marketing/src/app/(marketing)/open/page.tsx:251
msgid "Open Issues"
msgstr "Open Issues"
@ -349,7 +349,7 @@ msgstr "Open Issues"
msgid "Open Source or Hosted."
msgstr "Open Source or Hosted."
#: apps/marketing/src/app/(marketing)/open/page.tsx:161
#: apps/marketing/src/app/(marketing)/open/page.tsx:160
#: 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
@ -461,7 +461,7 @@ msgstr "Smart."
msgid "Star on GitHub"
msgstr "Star on GitHub"
#: apps/marketing/src/app/(marketing)/open/page.tsx:226
#: apps/marketing/src/app/(marketing)/open/page.tsx:225
msgid "Stars"
msgstr "Stars"
@ -496,7 +496,7 @@ msgstr "Template Store (Soon)."
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 "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 ❤️"
#: apps/marketing/src/app/(marketing)/open/page.tsx:293
#: apps/marketing/src/app/(marketing)/open/page.tsx:292
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 "This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share."
@ -509,8 +509,8 @@ msgstr "Title"
msgid "Total Completed Documents"
msgstr "Total Completed Documents"
#: apps/marketing/src/app/(marketing)/open/page.tsx:266
#: apps/marketing/src/app/(marketing)/open/page.tsx:267
#: apps/marketing/src/app/(marketing)/open/page.tsx:268
msgid "Total Customers"
msgstr "Total Customers"

View File

@ -255,12 +255,12 @@ msgstr "Active Subscriptions"
msgid "Add"
msgstr "Add"
#: 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)/documents/[id]/edit-document.tsx:176
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:88
msgid "Add all relevant fields for each recipient."
msgstr "Add all relevant fields for each recipient."
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:83
msgid "Add all relevant placeholders for each recipient."
msgstr "Add all relevant placeholders for each recipient."
@ -276,8 +276,8 @@ msgstr "Add an authenticator to serve as a secondary authentication method when
msgid "Add email"
msgstr "Add email"
#: 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)/documents/[id]/edit-document.tsx:175
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
msgid "Add Fields"
msgstr "Add Fields"
@ -290,15 +290,15 @@ msgstr "Add more"
msgid "Add passkey"
msgstr "Add passkey"
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:81
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82
msgid "Add Placeholders"
msgstr "Add Placeholders"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
msgid "Add Signers"
msgstr "Add Signers"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180
msgid "Add Subject"
msgstr "Add Subject"
@ -306,7 +306,7 @@ msgstr "Add Subject"
msgid "Add team email"
msgstr "Add team email"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:171
msgid "Add the people who will sign the document."
msgstr "Add the people who will sign the document."
@ -314,7 +314,7 @@ msgstr "Add the people who will sign the document."
msgid "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:180
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181
msgid "Add the subject and message you wish to send to signers."
msgstr "Add the subject and message you wish to send to signers."
@ -409,13 +409,13 @@ msgstr "An email requesting the transfer of this team has been sent."
msgid "An error occurred"
msgstr "An error occurred"
#: 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:231
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:268
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:201
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:235
msgid "An error occurred while adding signers."
msgstr "An error occurred while adding signers."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303
msgid "An error occurred while adding the fields."
msgstr "An error occurred while adding the fields."
@ -477,7 +477,7 @@ msgstr "An error occurred while removing the signature."
msgid "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:332
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:334
msgid "An error occurred while sending the document."
msgstr "An error occurred while sending the document."
@ -502,8 +502,8 @@ msgstr "An error occurred while signing the document."
msgid "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:232
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:234
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:170
msgid "An error occurred while updating the document settings."
msgstr "An error occurred while updating the document settings."
@ -864,11 +864,11 @@ msgstr "Completed documents"
msgid "Completed Documents"
msgstr "Completed Documents"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:166
msgid "Configure general settings for the document."
msgstr "Configure general settings for the document."
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:78
msgid "Configure general settings for the template."
msgstr "Configure general settings for the template."
@ -1345,7 +1345,7 @@ msgstr "Document re-sent"
msgid "Document resealed"
msgstr "Document resealed"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:323
msgid "Document sent"
msgstr "Document sent"
@ -1574,16 +1574,16 @@ msgstr "Enter your text here"
#: 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)/documents/[id]/edit-document.tsx:231
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:233
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:267
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:302
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:333
#: 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:112
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:165
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:196
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:230
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:169
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:200
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:234
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:160
@ -1674,8 +1674,8 @@ msgstr "Forgot your password?"
msgid "Full Name"
msgstr "Full Name"
#: 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)/documents/[id]/edit-document.tsx:165
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77
#: 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/mobile-nav.tsx:51
@ -3239,7 +3239,7 @@ msgstr "Template has been updated."
msgid "Template moved"
msgstr "Template moved"
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:219
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:223
msgid "Template saved"
msgstr "Template saved"
@ -4516,7 +4516,7 @@ msgstr "Your document has been created from the template successfully."
msgid "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:322
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:324
msgid "Your document has been sent successfully."
msgstr "Your document has been sent successfully."
@ -4607,7 +4607,7 @@ msgstr "Your template has been successfully deleted."
msgid "Your template will be duplicated."
msgstr "Your template will be duplicated."
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:220
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:224
msgid "Your templates has been saved successfully."
msgstr "Your templates has been saved successfully."

View File

@ -18,14 +18,104 @@ msgstr ""
"X-Crowdin-File: common.po\n"
"X-Crowdin-File-ID: 4\n"
#: packages/email/template-components/template-document-super-delete.tsx:27
msgid "\"{documentName}\" has been deleted by an admin."
msgstr ""
#: packages/email/template-components/template-document-pending.tsx:37
msgid "“{documentName}” has been signed"
msgstr ""
#: packages/email/template-components/template-document-completed.tsx:41
#: packages/lib/server-only/document/resend-document.tsx:109
msgid "{0}"
msgstr ""
#: packages/email/template-components/template-document-invite.tsx:74
msgid "{0} Document"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:117
msgid "{0} invited you to {recipientActionVerb} a document"
msgstr ""
#: packages/email/templates/team-join.tsx:55
msgid "{0} joined the team {teamName} on Documenso"
msgstr ""
#: packages/email/templates/team-leave.tsx:55
msgid "{0} left the team {teamName} on Documenso"
msgstr ""
#: packages/ui/primitives/data-table-pagination.tsx:30
msgid "{0} of {1} row(s) selected."
msgstr "{0} de {1} fila(s) seleccionada."
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:119
#: packages/lib/server-only/document/resend-document.tsx:119
msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr ""
#: packages/email/templates/document-invite.tsx:79
msgid "{inviterName} <0>({inviterEmail})</0>"
msgstr ""
#: packages/email/templates/document-cancel.tsx:19
msgid "{inviterName} has cancelled the document {documentName}, you don't need to sign it anymore."
msgstr ""
#: packages/email/template-components/template-document-cancel.tsx:24
msgid "{inviterName} has cancelled the document<0/>\"{documentName}\""
msgstr ""
#: packages/email/template-components/template-document-invite.tsx:57
msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\""
msgstr ""
#: packages/email/templates/document-invite.tsx:41
msgid "{inviterName} has invited you to {action} {documentName}"
msgstr ""
#: packages/email/templates/recipient-removed-from-document.tsx:18
msgid "{inviterName} has removed you from the document {documentName}."
msgstr ""
#: packages/email/template-components/template-document-invite.tsx:49
msgid "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\""
msgstr ""
#: packages/email/templates/document-invite.tsx:40
msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
msgstr ""
#: packages/email/templates/team-join.tsx:61
msgid "{memberEmail} joined the following team"
msgstr ""
#: packages/email/templates/team-leave.tsx:61
msgid "{memberEmail} left the following team"
msgstr ""
#: packages/email/templates/document-created-from-direct-template.tsx:55
msgid "{recipientName} {action} a document by using one of your direct links"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:55
msgid "{teamName} ownership transfer request"
msgstr ""
#: 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/email/templates/document-invite.tsx:91
msgid "`${inviterName} has invited you to ${action} the document \"${documentName}\".`"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:59
msgid "<0>{senderName}</0> has requested that you take ownership of the following team"
msgstr ""
#: 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\""
@ -56,20 +146,66 @@ msgstr "<0>Requerir cuenta</0> - El destinatario debe haber iniciado sesión par
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/lib/jobs/definitions/emails/send-signing-email.ts:109
msgid "A document was created by your direct template that requires you to {recipientActionVerb} it."
msgstr ""
#: packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts:90
msgid "A new member has joined your team"
msgstr ""
#: packages/lib/server-only/team/create-team-email-verification.ts:142
msgid "A request to use your email has been initiated by {teamName} on Documenso"
msgstr ""
#: packages/email/templates/team-join.tsx:29
msgid "A team member has joined a team on Documenso"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-team-member-left-email.ts:79
msgid "A team member has left {0}"
msgstr ""
#: packages/email/templates/team-leave.tsx:29
msgid "A team member has left a team on Documenso"
msgstr ""
#: packages/email/templates/team-delete.tsx:27
#: packages/email/templates/team-delete.tsx:31
msgid "A team you were a part of has been deleted"
msgstr ""
#: packages/email/templates/team-invite.tsx:77
#: packages/email/templates/team-transfer-request.tsx:81
msgid "Accept"
msgstr ""
#: packages/email/templates/team-invite.tsx:29
msgid "Accept invitation to join a team on Documenso"
msgstr ""
#: packages/email/templates/confirm-team-email.tsx:38
msgid "Accept team email request for {teamName} on Documenso"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:29
msgid "Accept team transfer request on Documenso"
msgstr ""
#: 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
#: packages/ui/primitives/document-flow/add-settings.tsx:378
#: packages/ui/primitives/template-flow/add-template-settings.tsx:378
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
#: packages/ui/primitives/document-flow/add-settings.tsx:290
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
#: packages/ui/primitives/template-flow/add-template-settings.tsx:295
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."
@ -110,8 +246,8 @@ msgstr "Agregar texto al campo"
msgid "Admin"
msgstr "Admin"
#: packages/ui/primitives/document-flow/add-settings.tsx:230
#: packages/ui/primitives/template-flow/add-template-settings.tsx:238
#: packages/ui/primitives/document-flow/add-settings.tsx:272
#: packages/ui/primitives/template-flow/add-template-settings.tsx:277
msgid "Advanced Options"
msgstr "Opciones avanzadas"
@ -124,6 +260,14 @@ msgstr "Configuraciones avanzadas"
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/email/template-components/template-document-cancel.tsx:31
msgid "All signatures have been voided."
msgstr ""
#: packages/email/templates/document-super-delete.tsx:20
msgid "An admin has deleted your document \"{documentName}\"."
msgstr ""
#: packages/ui/primitives/pdf-viewer.tsx:167
msgid "An error occurred while loading the document."
msgstr "Se produjo un error al cargar el documento."
@ -132,6 +276,10 @@ msgstr "Se produjo un error al cargar el documento."
msgid "Approve"
msgstr "Aprobar"
#: packages/lib/constants/recipient-roles.ts:68
#~ msgid "APPROVE_REQUEST"
#~ msgstr ""
#: packages/lib/constants/recipient-roles.ts:9
msgid "Approved"
msgstr "Aprobado"
@ -148,6 +296,10 @@ msgstr "Aprobadores"
msgid "Approving"
msgstr "Aprobando"
#: packages/email/template-components/template-confirmation-email.tsx:28
msgid "Before you get started, please confirm your email address by clicking the button below:"
msgstr ""
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
msgid "Black"
msgstr "Negro"
@ -156,6 +308,14 @@ msgstr "Negro"
msgid "Blue"
msgstr "Azul"
#: packages/email/templates/team-invite.tsx:67
msgid "by <0>{senderName}</0>"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:70
msgid "By accepting this request, you will take responsibility for any billing items associated with this team."
msgstr ""
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58
msgid "Cancel"
@ -206,6 +366,16 @@ msgstr "Haga clic para insertar campo"
msgid "Close"
msgstr "Cerrar"
#: packages/email/template-components/template-document-completed.tsx:35
#: packages/email/template-components/template-document-self-signed.tsx:36
msgid "Completed"
msgstr ""
#: packages/email/templates/document-completed.tsx:21
#: packages/email/templates/document-self-signed.tsx:17
msgid "Completed Document"
msgstr ""
#: packages/lib/constants/template.ts:12
msgid "Configure Direct Recipient"
msgstr "Configurar destinatario directo"
@ -215,10 +385,22 @@ msgstr "Configurar destinatario directo"
msgid "Configure the {0} field"
msgstr "Configurar el campo {0}"
#: packages/email/template-components/template-confirmation-email.tsx:38
msgid "Confirm email"
msgstr ""
#: packages/ui/primitives/document-flow/document-flow-root.tsx:141
msgid "Continue"
msgstr "Continuar"
#: packages/email/template-components/template-document-invite.tsx:66
msgid "Continue by {0} the document."
msgstr ""
#: packages/email/template-components/template-document-completed.tsx:45
msgid "Continue by downloading the document."
msgstr ""
#: packages/ui/components/document/document-share-button.tsx:46
msgid "Copied to clipboard"
msgstr "Copiado al portapapeles"
@ -227,6 +409,14 @@ msgstr "Copiado al portapapeles"
msgid "Copy Link"
msgstr "Copiar enlace"
#: packages/email/template-components/template-document-self-signed.tsx:46
msgid "Create a <0>free account</0> to access your signed documents at any time."
msgstr ""
#: packages/email/template-components/template-document-self-signed.tsx:68
msgid "Create account"
msgstr ""
#: packages/ui/primitives/document-flow/add-signature.tsx:360
msgid "Custom Text"
msgstr "Texto personalizado"
@ -237,25 +427,47 @@ msgstr "Texto personalizado"
msgid "Date"
msgstr "Fecha"
#: packages/ui/primitives/document-flow/add-settings.tsx:271
#: packages/ui/primitives/template-flow/add-template-settings.tsx:279
#: packages/ui/primitives/document-flow/add-settings.tsx:313
#: packages/ui/primitives/template-flow/add-template-settings.tsx:318
msgid "Date Format"
msgstr "Formato de fecha"
#: packages/email/templates/team-invite.tsx:83
msgid "Decline"
msgstr ""
#: packages/email/templates/reset-password.tsx:65
msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us.</0>"
msgstr ""
#: 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
#: packages/ui/primitives/document-flow/add-settings.tsx:216
#: packages/ui/primitives/template-flow/add-template-settings.tsx:190
msgid "Document access"
msgstr "Acceso al documento"
#: packages/lib/server-only/document/super-delete-document.ts:75
msgid "Document Cancelled"
msgstr ""
#: packages/email/templates/document-created-from-direct-template.tsx:30
#: packages/lib/server-only/template/create-document-from-direct-template.ts:554
msgid "Document created from direct template"
msgstr ""
#: packages/lib/constants/template.ts:20
msgid "Document Creation"
msgstr "Creación de documento"
#: packages/lib/server-only/document/send-delete-email.ts:58
msgid "Document Deleted!"
msgstr ""
#: packages/email/template-components/template-document-completed.tsx:64
#: packages/ui/components/document/document-download-button.tsx:68
msgid "Download"
msgstr "Descargar"
@ -288,7 +500,7 @@ msgstr "Correo electrónico"
msgid "Email is required"
msgstr "Se requiere email"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:184
#: packages/ui/primitives/template-flow/add-template-settings.tsx:223
msgid "Email Options"
msgstr "Opciones de correo electrónico"
@ -318,8 +530,8 @@ msgstr "Ingrese la contraseña"
msgid "Error"
msgstr "Error"
#: packages/ui/primitives/document-flow/add-settings.tsx:241
#: packages/ui/primitives/template-flow/add-template-settings.tsx:249
#: packages/ui/primitives/document-flow/add-settings.tsx:283
#: packages/ui/primitives/template-flow/add-template-settings.tsx:288
msgid "External ID"
msgstr "ID externo"
@ -361,6 +573,14 @@ msgstr "Marcador de posición de campo"
msgid "Font Size"
msgstr "Tamaño de fuente"
#: packages/lib/server-only/auth/send-forgot-password.ts:61
msgid "Forgot Password?"
msgstr ""
#: packages/email/template-components/template-forgot-password.tsx:21
msgid "Forgot your password?"
msgstr ""
#: packages/ui/primitives/document-flow/types.ts:50
msgid "Free Signature"
msgstr "Firma gratuita"
@ -377,6 +597,10 @@ msgstr "Regresar"
msgid "Green"
msgstr "Verde"
#: packages/email/templates/reset-password.tsx:50
msgid "Hi, {userName} <0>({userEmail})</0>"
msgstr ""
#: packages/lib/constants/recipient-roles.ts:76
msgid "I am a signer of this document"
msgstr "Soy un firmante de este documento"
@ -410,12 +634,25 @@ msgstr "Email inválido"
msgid "Invalid email address"
msgstr "Dirección de email inválida"
#: packages/email/templates/team-invite.tsx:55
msgid "Join {teamName} on Documenso"
msgstr ""
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48
msgid "Label"
msgstr "Etiqueta"
#: packages/ui/primitives/document-flow/add-settings.tsx:176
#: packages/ui/primitives/template-flow/add-template-settings.tsx:150
msgid "Language"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:87
msgid "Link expires in 1 hour."
msgstr ""
#: packages/ui/primitives/lazy-pdf-viewer.tsx:15
#: packages/ui/primitives/pdf-viewer.tsx:44
msgid "Loading document..."
@ -434,7 +671,7 @@ msgid "Member"
msgstr "Miembro"
#: packages/ui/primitives/document-flow/add-subject.tsx:95
#: packages/ui/primitives/template-flow/add-template-settings.tsx:215
#: packages/ui/primitives/template-flow/add-template-settings.tsx:254
msgid "Message <0>(Optional)</0>"
msgstr "Mensaje <0>(Opcional)</0>"
@ -525,6 +762,22 @@ msgstr "Página {0} de {numPages}"
msgid "Password Required"
msgstr "Se requiere contraseña"
#: packages/email/templates/forgot-password.tsx:17
msgid "Password Reset Requested"
msgstr ""
#: packages/email/templates/reset-password.tsx:18
msgid "Password Reset Successful"
msgstr ""
#: packages/email/template-components/template-reset-password.tsx:22
msgid "Password updated!"
msgstr ""
#: packages/email/templates/document-pending.tsx:17
msgid "Pending Document"
msgstr ""
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156
msgid "Pick a number"
msgstr "Seleccione un número"
@ -535,6 +788,34 @@ msgstr "Seleccione un número"
msgid "Placeholder"
msgstr "Marcador de posición"
#: packages/email/template-components/template-document-invite.tsx:43
msgid "Please {0} your document<0/>\"{documentName}\""
msgstr ""
#: packages/email/templates/document-invite.tsx:38
msgid "Please {action} your document {documentName}"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:98
msgid "Please {recipientActionVerb} this document"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:112
msgid "Please {recipientActionVerb} this document created by your direct template"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:104
msgid "Please {recipientActionVerb} your document"
msgstr ""
#: packages/lib/server-only/auth/send-confirmation-email.ts:67
msgid "Please confirm your email"
msgstr ""
#: packages/email/templates/confirm-email.tsx:15
msgid "Please confirm your email address"
msgstr ""
#: packages/ui/primitives/pdf-viewer.tsx:223
#: packages/ui/primitives/pdf-viewer.tsx:238
msgid "Please try again or contact our support."
@ -561,8 +842,8 @@ 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
#: packages/ui/primitives/document-flow/add-settings.tsx:257
#: packages/ui/primitives/template-flow/add-template-settings.tsx:208
msgid "Recipient action authentication"
msgstr "Autenticación de acción de destinatario"
@ -570,11 +851,27 @@ msgstr "Autenticación de acción de destinatario"
msgid "Red"
msgstr "Rojo"
#: packages/ui/primitives/document-flow/add-settings.tsx:329
#: packages/ui/primitives/template-flow/add-template-settings.tsx:332
#: packages/ui/primitives/document-flow/add-settings.tsx:371
#: packages/ui/primitives/template-flow/add-template-settings.tsx:371
msgid "Redirect URL"
msgstr "URL de redirección"
#: packages/lib/server-only/document/resend-document.tsx:165
msgid "Reminder: {0}"
msgstr ""
#: packages/lib/server-only/document/resend-document.tsx:118
msgid "Reminder: {0} invited you to {recipientActionVerb} a document"
msgstr ""
#: packages/lib/server-only/document/resend-document.tsx:110
msgid "Reminder: Please {recipientActionVerb} this document"
msgstr ""
#: packages/lib/server-only/document/resend-document.tsx:114
msgid "Reminder: Please {recipientActionVerb} your document"
msgstr ""
#: packages/ui/primitives/document-flow/add-fields.tsx:1110
msgid "Remove"
msgstr "Eliminar"
@ -587,6 +884,10 @@ msgstr "Eliminar"
msgid "Required field"
msgstr "Campo obligatorio"
#: packages/email/template-components/template-forgot-password.tsx:33
msgid "Reset Password"
msgstr ""
#: packages/ui/components/document/document-share-button.tsx:147
msgid "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!"
msgstr "Ten la seguridad de que tu documento es estrictamente confidencial y nunca será compartido. Solo se destacará tu experiencia de firma. ¡Comparte tu tarjeta de firma personalizada para mostrar tu firma!"
@ -654,6 +955,10 @@ msgstr "Mostrar configuraciones avanzadas"
msgid "Sign"
msgstr "Firmar"
#: packages/email/template-components/template-reset-password.tsx:34
msgid "Sign In"
msgstr ""
#: packages/ui/primitives/document-flow/add-fields.tsx:823
#: packages/ui/primitives/document-flow/add-signature.tsx:323
#: packages/ui/primitives/document-flow/field-icon.tsx:52
@ -682,6 +987,15 @@ msgstr "Los firmantes deben tener correos electrónicos únicos"
msgid "Signing"
msgstr "Firmando"
#: packages/lib/server-only/document/send-completed-email.ts:93
#: packages/lib/server-only/document/send-completed-email.ts:161
msgid "Signing Complete!"
msgstr ""
#: packages/lib/constants/recipient-roles.ts:66
#~ msgid "SIGNING_REQUEST"
#~ msgstr ""
#: 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."
@ -704,7 +1018,7 @@ 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
#: packages/ui/primitives/template-flow/add-template-settings.tsx:234
msgid "Subject <0>(Optional)</0>"
msgstr "Asunto <0>(Opcional)</0>"
@ -712,7 +1026,19 @@ msgstr "Asunto <0>(Opcional)</0>"
msgid "Submit"
msgstr "Enviar"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:134
#: packages/lib/server-only/team/delete-team-email.ts:96
msgid "Team email has been revoked for {0}"
msgstr ""
#: packages/email/templates/team-email-removed.tsx:53
msgid "Team email removed"
msgstr ""
#: packages/email/templates/team-email-removed.tsx:27
msgid "Team email removed for {teamName} on Documenso"
msgstr ""
#: packages/ui/primitives/template-flow/add-template-settings.tsx:133
msgid "Template title"
msgstr "Título de plantilla"
@ -722,6 +1048,10 @@ msgstr "Título de plantilla"
msgid "Text"
msgstr "Texto"
#: packages/email/template-components/template-forgot-password.tsx:25
msgid "That's okay, it happens! Click the button below to reset your password."
msgstr ""
#: 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"
@ -738,10 +1068,22 @@ msgstr "La autenticación requerida para que los destinatarios vean el documento
msgid "The document's name"
msgstr "El nombre del documento"
#: packages/email/templates/team-delete.tsx:35
msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents"
msgstr ""
#: packages/email/templates/team-delete.tsx:34
msgid "The following team has been deleted by you"
msgstr ""
#: 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/email/template-components/template-document-super-delete.tsx:38
msgid "The reason provided for deletion is the following:"
msgstr ""
#: 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."
@ -774,10 +1116,18 @@ msgstr "El correo electrónico del firmante"
msgid "The signer's name"
msgstr "El nombre del firmante"
#: packages/email/templates/team-email-removed.tsx:57
msgid "The team email <0>{teamEmail}</0> has been removed from the following team"
msgstr ""
#: 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/email/template-components/template-document-super-delete.tsx:31
msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support."
msgstr ""
#: packages/ui/primitives/document-flow/add-fields.tsx:757
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
msgstr "Este documento ya ha sido enviado a este destinatario. Ya no puede editar a este destinatario."
@ -786,6 +1136,10 @@ msgstr "Este documento ya ha sido enviado a este destinatario. Ya no puede edita
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/email/template-components/template-footer.tsx:14
msgid "This document was sent using <0>Documenso.</0>"
msgstr ""
#: 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."
@ -802,12 +1156,12 @@ msgstr "Este firmante ya ha firmado el documento."
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
#: packages/ui/primitives/document-flow/add-settings.tsx:347
#: packages/ui/primitives/template-flow/add-template-settings.tsx:348
msgid "Time Zone"
msgstr "Zona horaria"
#: packages/ui/primitives/document-flow/add-settings.tsx:153
#: packages/ui/primitives/document-flow/add-settings.tsx:155
msgid "Title"
msgstr "Título"
@ -846,6 +1200,18 @@ msgstr "Valor"
msgid "View"
msgstr "Ver"
#: packages/email/templates/document-created-from-direct-template.tsx:69
msgid "View document"
msgstr ""
#: packages/email/template-components/template-document-self-signed.tsx:79
msgid "View plans"
msgstr ""
#: packages/lib/constants/recipient-roles.ts:67
#~ msgid "VIEW_REQUEST"
#~ msgstr ""
#: packages/lib/constants/recipient-roles.ts:27
msgid "Viewed"
msgstr "Visto"
@ -862,10 +1228,34 @@ msgstr "Espectadores"
msgid "Viewing"
msgstr "Viendo"
#: packages/email/template-components/template-document-pending.tsx:31
msgid "Waiting for others"
msgstr ""
#: packages/lib/server-only/document/send-pending-email.ts:73
msgid "Waiting for others to complete signing."
msgstr ""
#: packages/email/template-components/template-document-pending.tsx:41
msgid "We're still waiting for other signers to sign this document.<0/>We'll notify you as soon as it's ready."
msgstr ""
#: packages/email/templates/reset-password.tsx:59
msgid "We've changed your password as you asked. You can now sign in with your new password."
msgstr ""
#: packages/email/template-components/template-confirmation-email.tsx:24
msgid "Welcome to Documenso!"
msgstr ""
#: 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/email/template-components/template-confirmation-email.tsx:41
msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)"
msgstr ""
#: 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:"
@ -874,7 +1264,48 @@ msgstr "Puede usar las siguientes variables en su mensaje:"
msgid "You cannot upload documents at this time."
msgstr "No puede cargar documentos en este momento."
#: packages/email/template-components/template-document-cancel.tsx:35
msgid "You don't need to sign it anymore."
msgstr ""
#: packages/lib/server-only/team/create-team-member-invites.ts:168
msgid "You have been invited to join {0} on Documenso"
msgstr ""
#: packages/email/templates/team-invite.tsx:59
msgid "You have been invited to join the following team"
msgstr ""
#: packages/lib/server-only/recipient/set-recipients-for-document.ts:314
msgid "You have been removed from a document"
msgstr ""
#: packages/lib/server-only/team/request-team-ownership-transfer.ts:114
msgid "You have been requested to take ownership of team {0} on Documenso"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:102
#: packages/lib/server-only/document/resend-document.tsx:113
msgid "You have initiated the document {0} that requires you to {recipientActionVerb} it."
msgstr ""
#: packages/ui/primitives/document-dropzone.tsx:69
msgid "You have reached your document limit."
msgstr "Ha alcanzado su límite de documentos."
#: packages/email/template-components/template-document-self-signed.tsx:42
msgid "You have signed “{documentName}”"
msgstr ""
#: packages/email/template-components/template-document-super-delete.tsx:23
msgid "Your document has been deleted by an admin!"
msgstr ""
#: packages/email/template-components/template-reset-password.tsx:26
msgid "Your password has been updated."
msgstr ""
#: packages/email/templates/team-delete.tsx:26
#: packages/email/templates/team-delete.tsx:30
msgid "Your team has been deleted"
msgstr ""

View File

@ -42,7 +42,7 @@ msgstr "Agregar documento"
msgid "Add More Users for {0}"
msgstr "Agregar más usuarios por {0}"
#: apps/marketing/src/app/(marketing)/open/page.tsx:165
#: apps/marketing/src/app/(marketing)/open/page.tsx:164
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>"
@ -90,7 +90,7 @@ msgstr "Registro de cambios"
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
#: apps/marketing/src/app/(marketing)/open/page.tsx:218
msgid "Community"
msgstr "Comunidad"
@ -193,7 +193,7 @@ msgstr "Rápido."
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
#: apps/marketing/src/app/(marketing)/open/page.tsx:209
msgid "Finances"
msgstr "Finanzas"
@ -246,15 +246,15 @@ msgstr "Comienza hoy."
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
#: apps/marketing/src/app/(marketing)/open/page.tsx:232
msgid "GitHub: Total Merged PRs"
msgstr "GitHub: Total de PRs fusionados"
#: apps/marketing/src/app/(marketing)/open/page.tsx:251
#: apps/marketing/src/app/(marketing)/open/page.tsx:250
msgid "GitHub: Total Open Issues"
msgstr "GitHub: Total de problemas abiertos"
#: apps/marketing/src/app/(marketing)/open/page.tsx:225
#: apps/marketing/src/app/(marketing)/open/page.tsx:224
msgid "GitHub: Total Stars"
msgstr "GitHub: Total de estrellas"
@ -262,7 +262,7 @@ msgstr "GitHub: Total de estrellas"
msgid "Global Salary Bands"
msgstr "Bandas salariales globales"
#: apps/marketing/src/app/(marketing)/open/page.tsx:261
#: apps/marketing/src/app/(marketing)/open/page.tsx:260
msgid "Growth"
msgstr "Crecimiento"
@ -286,7 +286,7 @@ msgstr "Pagos integrados con Stripe para que no tengas que preocuparte por cobra
msgid "Integrates with all your favourite tools."
msgstr "Se integra con todas tus herramientas favoritas."
#: apps/marketing/src/app/(marketing)/open/page.tsx:289
#: apps/marketing/src/app/(marketing)/open/page.tsx:288
msgid "Is there more?"
msgstr "¿Hay más?"
@ -310,11 +310,11 @@ msgstr "Ubicación"
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
#: apps/marketing/src/app/(marketing)/open/page.tsx:198
msgid "Merged PR's"
msgstr "PRs fusionados"
#: apps/marketing/src/app/(marketing)/open/page.tsx:234
#: apps/marketing/src/app/(marketing)/open/page.tsx:233
msgid "Merged PRs"
msgstr "PRs fusionados"
@ -345,8 +345,8 @@ msgstr "No se requiere tarjeta de crédito"
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
#: apps/marketing/src/app/(marketing)/open/page.tsx:193
#: apps/marketing/src/app/(marketing)/open/page.tsx:251
msgid "Open Issues"
msgstr "Problemas Abiertos"
@ -354,7 +354,7 @@ msgstr "Problemas Abiertos"
msgid "Open Source or Hosted."
msgstr "Código Abierto o Alojado."
#: apps/marketing/src/app/(marketing)/open/page.tsx:161
#: apps/marketing/src/app/(marketing)/open/page.tsx:160
#: 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
@ -466,7 +466,7 @@ msgstr "Inteligente."
msgid "Star on GitHub"
msgstr "Estrella en GitHub"
#: apps/marketing/src/app/(marketing)/open/page.tsx:226
#: apps/marketing/src/app/(marketing)/open/page.tsx:225
msgid "Stars"
msgstr "Estrellas"
@ -501,7 +501,7 @@ msgstr "Tienda de Plantillas (Pronto)."
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
#: apps/marketing/src/app/(marketing)/open/page.tsx:292
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."
@ -514,8 +514,8 @@ msgstr "Título"
msgid "Total Completed Documents"
msgstr "Total de Documentos Completados"
#: apps/marketing/src/app/(marketing)/open/page.tsx:266
#: 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"
@ -602,4 +602,3 @@ msgstr "Puedes autoalojar Documenso de forma gratuita o usar nuestra versión al
#: 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."

View File

@ -260,12 +260,12 @@ msgstr "Suscripciones Activas"
msgid "Add"
msgstr "Agregar"
#: 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)/documents/[id]/edit-document.tsx:176
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:88
msgid "Add all relevant fields for each recipient."
msgstr "Agrega todos los campos relevantes para cada destinatario."
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:83
msgid "Add all relevant placeholders for each recipient."
msgstr "Agrega todos los marcadores de posición relevantes para cada destinatario."
@ -281,8 +281,8 @@ msgstr "Agrega un autenticador para servir como método de autenticación secund
msgid "Add email"
msgstr "Agregar correo electrónico"
#: 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)/documents/[id]/edit-document.tsx:175
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
msgid "Add Fields"
msgstr "Agregar Campos"
@ -295,15 +295,15 @@ msgstr "Agregar más"
msgid "Add passkey"
msgstr "Agregar clave"
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:81
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82
msgid "Add Placeholders"
msgstr "Agregar Marcadores de posición"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
msgid "Add Signers"
msgstr "Agregar Firmantes"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180
msgid "Add Subject"
msgstr "Agregar Asunto"
@ -311,7 +311,7 @@ msgstr "Agregar Asunto"
msgid "Add team email"
msgstr "Agregar correo electrónico del equipo"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:171
msgid "Add the people who will sign the document."
msgstr "Agrega a las personas que firmarán el documento."
@ -319,7 +319,7 @@ msgstr "Agrega a las personas que firmarán el documento."
msgid "Add the recipients to create the document with"
msgstr "Agrega los destinatarios con los que crear el documento"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181
msgid "Add the subject and message you wish to send to signers."
msgstr "Agrega el asunto y el mensaje que deseas enviar a los firmantes."
@ -414,13 +414,13 @@ msgstr "Se ha enviado un correo electrónico solicitando la transferencia de est
msgid "An error occurred"
msgstr "Ocurrió un error"
#: 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:231
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:268
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:201
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:235
msgid "An error occurred while adding signers."
msgstr "Ocurrió un error al agregar firmantes."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303
msgid "An error occurred while adding the fields."
msgstr "Ocurrió un error al agregar los campos."
@ -482,7 +482,7 @@ msgstr "Ocurrió un error al eliminar la firma."
msgid "An error occurred while removing the text."
msgstr "Ocurrió un error al eliminar el texto."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:332
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:334
msgid "An error occurred while sending the document."
msgstr "Ocurrió un error al enviar el documento."
@ -507,8 +507,8 @@ msgstr "Ocurrió un error al firmar el documento."
msgid "An error occurred while trying to create a checkout session."
msgstr "Ocurrió un error al intentar crear una sesión de pago."
#: 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)/documents/[id]/edit-document.tsx:234
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:170
msgid "An error occurred while updating the document settings."
msgstr "Ocurrió un error al actualizar la configuración del documento."
@ -869,11 +869,11 @@ msgstr "Documentos completados"
msgid "Completed Documents"
msgstr "Documentos Completados"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:166
msgid "Configure general settings for the document."
msgstr "Configurar ajustes generales para el documento."
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:78
msgid "Configure general settings for the template."
msgstr "Configurar ajustes generales para la plantilla."
@ -1350,7 +1350,7 @@ msgstr "Documento reenviado"
msgid "Document resealed"
msgstr "Documento sellado nuevamente"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:323
msgid "Document sent"
msgstr "Documento enviado"
@ -1579,16 +1579,16 @@ msgstr "Ingresa tu texto aquí"
#: 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)/documents/[id]/edit-document.tsx:231
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:233
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:267
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:302
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:333
#: 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:112
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:165
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:196
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:230
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:169
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:200
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:234
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:160
@ -1679,8 +1679,8 @@ msgstr "¿Olvidaste tu contraseña?"
msgid "Full Name"
msgstr "Nombre completo"
#: 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)/documents/[id]/edit-document.tsx:165
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77
#: 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/mobile-nav.tsx:51
@ -3244,7 +3244,7 @@ msgstr "La plantilla ha sido actualizada."
msgid "Template moved"
msgstr "Plantilla movida"
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:219
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:223
msgid "Template saved"
msgstr "Plantilla guardada"
@ -4521,7 +4521,7 @@ msgstr "Tu documento se ha creado exitosamente a partir de la plantilla."
msgid "Your document has been re-sent successfully."
msgstr "Tu documento ha sido reenviado con éxito."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:322
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:324
msgid "Your document has been sent successfully."
msgstr "Tu documento ha sido enviado con éxito."
@ -4612,7 +4612,7 @@ msgstr "Tu plantilla ha sido eliminada con éxito."
msgid "Your template will be duplicated."
msgstr "Tu plantilla será duplicada."
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:220
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:224
msgid "Your templates has been saved successfully."
msgstr "Tus plantillas han sido guardadas con éxito."
@ -4628,4 +4628,3 @@ msgstr "¡Tu token se creó con éxito! ¡Asegúrate de copiarlo porque no podr
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86
msgid "Your tokens will be shown here once you create them."
msgstr "Tus tokens se mostrarán aquí una vez que los crees."

View File

@ -18,14 +18,104 @@ msgstr ""
"X-Crowdin-File: common.po\n"
"X-Crowdin-File-ID: 4\n"
#: packages/email/template-components/template-document-super-delete.tsx:27
msgid "\"{documentName}\" has been deleted by an admin."
msgstr ""
#: packages/email/template-components/template-document-pending.tsx:37
msgid "“{documentName}” has been signed"
msgstr ""
#: packages/email/template-components/template-document-completed.tsx:41
#: packages/lib/server-only/document/resend-document.tsx:109
msgid "{0}"
msgstr ""
#: packages/email/template-components/template-document-invite.tsx:74
msgid "{0} Document"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:117
msgid "{0} invited you to {recipientActionVerb} a document"
msgstr ""
#: packages/email/templates/team-join.tsx:55
msgid "{0} joined the team {teamName} on Documenso"
msgstr ""
#: packages/email/templates/team-leave.tsx:55
msgid "{0} left the team {teamName} on Documenso"
msgstr ""
#: packages/ui/primitives/data-table-pagination.tsx:30
msgid "{0} of {1} row(s) selected."
msgstr "{0} sur {1} ligne(s) sélectionnée(s)."
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:119
#: packages/lib/server-only/document/resend-document.tsx:119
msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr ""
#: packages/email/templates/document-invite.tsx:79
msgid "{inviterName} <0>({inviterEmail})</0>"
msgstr ""
#: packages/email/templates/document-cancel.tsx:19
msgid "{inviterName} has cancelled the document {documentName}, you don't need to sign it anymore."
msgstr ""
#: packages/email/template-components/template-document-cancel.tsx:24
msgid "{inviterName} has cancelled the document<0/>\"{documentName}\""
msgstr ""
#: packages/email/template-components/template-document-invite.tsx:57
msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\""
msgstr ""
#: packages/email/templates/document-invite.tsx:41
msgid "{inviterName} has invited you to {action} {documentName}"
msgstr ""
#: packages/email/templates/recipient-removed-from-document.tsx:18
msgid "{inviterName} has removed you from the document {documentName}."
msgstr ""
#: packages/email/template-components/template-document-invite.tsx:49
msgid "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\""
msgstr ""
#: packages/email/templates/document-invite.tsx:40
msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
msgstr ""
#: packages/email/templates/team-join.tsx:61
msgid "{memberEmail} joined the following team"
msgstr ""
#: packages/email/templates/team-leave.tsx:61
msgid "{memberEmail} left the following team"
msgstr ""
#: packages/email/templates/document-created-from-direct-template.tsx:55
msgid "{recipientName} {action} a document by using one of your direct links"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:55
msgid "{teamName} ownership transfer request"
msgstr ""
#: packages/ui/primitives/data-table-pagination.tsx:41
msgid "{visibleRows, plural, one {Showing # result.} other {Showing # results.}}"
msgstr "{visibleRows, plural, one {Affichage de # résultat.} other {Affichage de # résultats.}}"
#: packages/email/templates/document-invite.tsx:91
msgid "`${inviterName} has invited you to ${action} the document \"${documentName}\".`"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:59
msgid "<0>{senderName}</0> has requested that you take ownership of the following team"
msgstr ""
#: 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>Hériter du méthode d'authentification</0> - Utiliser la méthode d'authentification de signature d'action globale configurée dans l'étape \"Paramètres Générales\""
@ -56,20 +146,66 @@ msgstr "<0>Exiger un compte</0> - Le destinataire doit être connecté pour voir
msgid "<0>Require passkey</0> - The recipient must have an account and passkey configured via their settings"
msgstr "<0>Exiger une clé d'accès</0> - Le destinataire doit avoir un compte et une clé d'accès configurée via ses paramètres"
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:109
msgid "A document was created by your direct template that requires you to {recipientActionVerb} it."
msgstr ""
#: packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts:90
msgid "A new member has joined your team"
msgstr ""
#: packages/lib/server-only/team/create-team-email-verification.ts:142
msgid "A request to use your email has been initiated by {teamName} on Documenso"
msgstr ""
#: packages/email/templates/team-join.tsx:29
msgid "A team member has joined a team on Documenso"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-team-member-left-email.ts:79
msgid "A team member has left {0}"
msgstr ""
#: packages/email/templates/team-leave.tsx:29
msgid "A team member has left a team on Documenso"
msgstr ""
#: packages/email/templates/team-delete.tsx:27
#: packages/email/templates/team-delete.tsx:31
msgid "A team you were a part of has been deleted"
msgstr ""
#: packages/email/templates/team-invite.tsx:77
#: packages/email/templates/team-transfer-request.tsx:81
msgid "Accept"
msgstr ""
#: packages/email/templates/team-invite.tsx:29
msgid "Accept invitation to join a team on Documenso"
msgstr ""
#: packages/email/templates/confirm-team-email.tsx:38
msgid "Accept team email request for {teamName} on Documenso"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:29
msgid "Accept team transfer request on Documenso"
msgstr ""
#: packages/ui/primitives/document-dropzone.tsx:69
msgid "Add a document"
msgstr "Ajouter un document"
#: packages/ui/primitives/document-flow/add-settings.tsx:336
#: packages/ui/primitives/template-flow/add-template-settings.tsx:339
#: packages/ui/primitives/document-flow/add-settings.tsx:378
#: packages/ui/primitives/template-flow/add-template-settings.tsx:378
msgid "Add a URL to redirect the user to once the document is signed"
msgstr "Ajouter une URL pour rediriger l'utilisateur une fois le document signé"
#: packages/ui/primitives/document-flow/add-settings.tsx:248
#: packages/ui/primitives/document-flow/add-settings.tsx:290
msgid "Add an external ID to the document. This can be used to identify the document in external systems."
msgstr "Ajouter un ID externe au document. Cela peut être utilisé pour identifier le document dans des systèmes externes."
#: packages/ui/primitives/template-flow/add-template-settings.tsx:256
#: packages/ui/primitives/template-flow/add-template-settings.tsx:295
msgid "Add an external ID to the template. This can be used to identify in external systems."
msgstr "Ajouter un ID externe au modèle. Cela peut être utilisé pour identifier dans des systèmes externes."
@ -110,8 +246,8 @@ msgstr "Ajouter du texte au champ"
msgid "Admin"
msgstr "Administrateur"
#: packages/ui/primitives/document-flow/add-settings.tsx:230
#: packages/ui/primitives/template-flow/add-template-settings.tsx:238
#: packages/ui/primitives/document-flow/add-settings.tsx:272
#: packages/ui/primitives/template-flow/add-template-settings.tsx:277
msgid "Advanced Options"
msgstr "Options avancées"
@ -124,6 +260,14 @@ msgstr "Paramètres avancés"
msgid "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email."
msgstr "Après soumission, un document sera automatiquement généré et ajouté à votre page de documents. Vous recevrez également une notification par email."
#: packages/email/template-components/template-document-cancel.tsx:31
msgid "All signatures have been voided."
msgstr ""
#: packages/email/templates/document-super-delete.tsx:20
msgid "An admin has deleted your document \"{documentName}\"."
msgstr ""
#: packages/ui/primitives/pdf-viewer.tsx:167
msgid "An error occurred while loading the document."
msgstr "Une erreur s'est produite lors du chargement du document."
@ -132,6 +276,10 @@ msgstr "Une erreur s'est produite lors du chargement du document."
msgid "Approve"
msgstr "Approuver"
#: packages/lib/constants/recipient-roles.ts:68
#~ msgid "APPROVE_REQUEST"
#~ msgstr ""
#: packages/lib/constants/recipient-roles.ts:9
msgid "Approved"
msgstr "Approuvé"
@ -148,6 +296,10 @@ msgstr "Approbateurs"
msgid "Approving"
msgstr "En attente d'approbation"
#: packages/email/template-components/template-confirmation-email.tsx:28
msgid "Before you get started, please confirm your email address by clicking the button below:"
msgstr ""
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
msgid "Black"
msgstr "Noir"
@ -156,6 +308,14 @@ msgstr "Noir"
msgid "Blue"
msgstr "Bleu"
#: packages/email/templates/team-invite.tsx:67
msgid "by <0>{senderName}</0>"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:70
msgid "By accepting this request, you will take responsibility for any billing items associated with this team."
msgstr ""
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58
msgid "Cancel"
@ -206,6 +366,16 @@ msgstr "Cliquez pour insérer un champ"
msgid "Close"
msgstr "Fermer"
#: packages/email/template-components/template-document-completed.tsx:35
#: packages/email/template-components/template-document-self-signed.tsx:36
msgid "Completed"
msgstr ""
#: packages/email/templates/document-completed.tsx:21
#: packages/email/templates/document-self-signed.tsx:17
msgid "Completed Document"
msgstr ""
#: packages/lib/constants/template.ts:12
msgid "Configure Direct Recipient"
msgstr "Configurer le destinataire direct"
@ -215,10 +385,22 @@ msgstr "Configurer le destinataire direct"
msgid "Configure the {0} field"
msgstr "Configurer le champ {0}"
#: packages/email/template-components/template-confirmation-email.tsx:38
msgid "Confirm email"
msgstr ""
#: packages/ui/primitives/document-flow/document-flow-root.tsx:141
msgid "Continue"
msgstr "Continuer"
#: packages/email/template-components/template-document-invite.tsx:66
msgid "Continue by {0} the document."
msgstr ""
#: packages/email/template-components/template-document-completed.tsx:45
msgid "Continue by downloading the document."
msgstr ""
#: packages/ui/components/document/document-share-button.tsx:46
msgid "Copied to clipboard"
msgstr "Copié dans le presse-papiers"
@ -227,6 +409,14 @@ msgstr "Copié dans le presse-papiers"
msgid "Copy Link"
msgstr "Copier le lien"
#: packages/email/template-components/template-document-self-signed.tsx:46
msgid "Create a <0>free account</0> to access your signed documents at any time."
msgstr ""
#: packages/email/template-components/template-document-self-signed.tsx:68
msgid "Create account"
msgstr ""
#: packages/ui/primitives/document-flow/add-signature.tsx:360
msgid "Custom Text"
msgstr "Texte personnalisé"
@ -237,25 +427,47 @@ msgstr "Texte personnalisé"
msgid "Date"
msgstr "Date"
#: packages/ui/primitives/document-flow/add-settings.tsx:271
#: packages/ui/primitives/template-flow/add-template-settings.tsx:279
#: packages/ui/primitives/document-flow/add-settings.tsx:313
#: packages/ui/primitives/template-flow/add-template-settings.tsx:318
msgid "Date Format"
msgstr "Format de date"
#: packages/email/templates/team-invite.tsx:83
msgid "Decline"
msgstr ""
#: packages/email/templates/reset-password.tsx:65
msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us.</0>"
msgstr ""
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570
msgid "Direct link receiver"
msgstr "Receveur de lien direct"
#: 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
#: packages/ui/primitives/document-flow/add-settings.tsx:216
#: packages/ui/primitives/template-flow/add-template-settings.tsx:190
msgid "Document access"
msgstr "Accès au document"
#: packages/lib/server-only/document/super-delete-document.ts:75
msgid "Document Cancelled"
msgstr ""
#: packages/email/templates/document-created-from-direct-template.tsx:30
#: packages/lib/server-only/template/create-document-from-direct-template.ts:554
msgid "Document created from direct template"
msgstr ""
#: packages/lib/constants/template.ts:20
msgid "Document Creation"
msgstr "Création de document"
#: packages/lib/server-only/document/send-delete-email.ts:58
msgid "Document Deleted!"
msgstr ""
#: packages/email/template-components/template-document-completed.tsx:64
#: packages/ui/components/document/document-download-button.tsx:68
msgid "Download"
msgstr "Télécharger"
@ -288,7 +500,7 @@ msgstr "Email"
msgid "Email is required"
msgstr "L'email est requis"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:184
#: packages/ui/primitives/template-flow/add-template-settings.tsx:223
msgid "Email Options"
msgstr "Options d'email"
@ -318,8 +530,8 @@ msgstr "Entrez le mot de passe"
msgid "Error"
msgstr "Erreur"
#: packages/ui/primitives/document-flow/add-settings.tsx:241
#: packages/ui/primitives/template-flow/add-template-settings.tsx:249
#: packages/ui/primitives/document-flow/add-settings.tsx:283
#: packages/ui/primitives/template-flow/add-template-settings.tsx:288
msgid "External ID"
msgstr "ID externe"
@ -361,6 +573,14 @@ msgstr "Espace réservé du champ"
msgid "Font Size"
msgstr "Taille de Police"
#: packages/lib/server-only/auth/send-forgot-password.ts:61
msgid "Forgot Password?"
msgstr ""
#: packages/email/template-components/template-forgot-password.tsx:21
msgid "Forgot your password?"
msgstr ""
#: packages/ui/primitives/document-flow/types.ts:50
msgid "Free Signature"
msgstr "Signature gratuite"
@ -377,6 +597,10 @@ msgstr "Retourner"
msgid "Green"
msgstr "Vert"
#: packages/email/templates/reset-password.tsx:50
msgid "Hi, {userName} <0>({userEmail})</0>"
msgstr ""
#: packages/lib/constants/recipient-roles.ts:76
msgid "I am a signer of this document"
msgstr "Je suis un signataire de ce document"
@ -410,12 +634,25 @@ msgstr "Email invalide"
msgid "Invalid email address"
msgstr "Adresse email invalide"
#: packages/email/templates/team-invite.tsx:55
msgid "Join {teamName} on Documenso"
msgstr ""
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48
msgid "Label"
msgstr "Étiquette"
#: packages/ui/primitives/document-flow/add-settings.tsx:176
#: packages/ui/primitives/template-flow/add-template-settings.tsx:150
msgid "Language"
msgstr ""
#: packages/email/templates/team-transfer-request.tsx:87
msgid "Link expires in 1 hour."
msgstr ""
#: packages/ui/primitives/lazy-pdf-viewer.tsx:15
#: packages/ui/primitives/pdf-viewer.tsx:44
msgid "Loading document..."
@ -434,7 +671,7 @@ msgid "Member"
msgstr "Membre"
#: packages/ui/primitives/document-flow/add-subject.tsx:95
#: packages/ui/primitives/template-flow/add-template-settings.tsx:215
#: packages/ui/primitives/template-flow/add-template-settings.tsx:254
msgid "Message <0>(Optional)</0>"
msgstr "Message <0>(Optionnel)</0>"
@ -525,6 +762,22 @@ msgstr "Page {0} sur {numPages}"
msgid "Password Required"
msgstr "Mot de passe requis"
#: packages/email/templates/forgot-password.tsx:17
msgid "Password Reset Requested"
msgstr ""
#: packages/email/templates/reset-password.tsx:18
msgid "Password Reset Successful"
msgstr ""
#: packages/email/template-components/template-reset-password.tsx:22
msgid "Password updated!"
msgstr ""
#: packages/email/templates/document-pending.tsx:17
msgid "Pending Document"
msgstr ""
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156
msgid "Pick a number"
msgstr "Choisissez un numéro"
@ -535,6 +788,34 @@ msgstr "Choisissez un numéro"
msgid "Placeholder"
msgstr "Espace réservé"
#: packages/email/template-components/template-document-invite.tsx:43
msgid "Please {0} your document<0/>\"{documentName}\""
msgstr ""
#: packages/email/templates/document-invite.tsx:38
msgid "Please {action} your document {documentName}"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:98
msgid "Please {recipientActionVerb} this document"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:112
msgid "Please {recipientActionVerb} this document created by your direct template"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:104
msgid "Please {recipientActionVerb} your document"
msgstr ""
#: packages/lib/server-only/auth/send-confirmation-email.ts:67
msgid "Please confirm your email"
msgstr ""
#: packages/email/templates/confirm-email.tsx:15
msgid "Please confirm your email address"
msgstr ""
#: packages/ui/primitives/pdf-viewer.tsx:223
#: packages/ui/primitives/pdf-viewer.tsx:238
msgid "Please try again or contact our support."
@ -561,8 +842,8 @@ msgid "Receives copy"
msgstr "Recevoir une copie"
#: 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
#: packages/ui/primitives/document-flow/add-settings.tsx:257
#: packages/ui/primitives/template-flow/add-template-settings.tsx:208
msgid "Recipient action authentication"
msgstr "Authentification d'action de destinataire"
@ -570,11 +851,27 @@ msgstr "Authentification d'action de destinataire"
msgid "Red"
msgstr "Rouge"
#: packages/ui/primitives/document-flow/add-settings.tsx:329
#: packages/ui/primitives/template-flow/add-template-settings.tsx:332
#: packages/ui/primitives/document-flow/add-settings.tsx:371
#: packages/ui/primitives/template-flow/add-template-settings.tsx:371
msgid "Redirect URL"
msgstr "URL de redirection"
#: packages/lib/server-only/document/resend-document.tsx:165
msgid "Reminder: {0}"
msgstr ""
#: packages/lib/server-only/document/resend-document.tsx:118
msgid "Reminder: {0} invited you to {recipientActionVerb} a document"
msgstr ""
#: packages/lib/server-only/document/resend-document.tsx:110
msgid "Reminder: Please {recipientActionVerb} this document"
msgstr ""
#: packages/lib/server-only/document/resend-document.tsx:114
msgid "Reminder: Please {recipientActionVerb} your document"
msgstr ""
#: packages/ui/primitives/document-flow/add-fields.tsx:1110
msgid "Remove"
msgstr "Retirer"
@ -587,6 +884,10 @@ msgstr "Retirer"
msgid "Required field"
msgstr "Champ requis"
#: packages/email/template-components/template-forgot-password.tsx:33
msgid "Reset Password"
msgstr ""
#: packages/ui/components/document/document-share-button.tsx:147
msgid "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!"
msgstr "Soyez assuré, votre document eststrictement confidentiel et ne sera jamais partagé. Seule votre expérience de signature sera mise en avant. Partagez votre carte de signature personnalisée pour mettre en valeur votre signature !"
@ -654,6 +955,10 @@ msgstr "Afficher les paramètres avancés"
msgid "Sign"
msgstr "Signer"
#: packages/email/template-components/template-reset-password.tsx:34
msgid "Sign In"
msgstr ""
#: packages/ui/primitives/document-flow/add-fields.tsx:823
#: packages/ui/primitives/document-flow/add-signature.tsx:323
#: packages/ui/primitives/document-flow/field-icon.tsx:52
@ -682,6 +987,15 @@ msgstr "Les signataires doivent avoir des e-mails uniques"
msgid "Signing"
msgstr "Signature en cours"
#: packages/lib/server-only/document/send-completed-email.ts:93
#: packages/lib/server-only/document/send-completed-email.ts:161
msgid "Signing Complete!"
msgstr ""
#: packages/lib/constants/recipient-roles.ts:66
#~ msgid "SIGNING_REQUEST"
#~ msgstr ""
#: 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 "Certains signataires n'ont pas été assignés à un champ de signature. Veuillez assigner au moins 1 champ de signature à chaque signataire avant de continuer."
@ -704,7 +1018,7 @@ msgid "Step <0>{step} of {maxStep}</0>"
msgstr "Étape <0>{step} sur {maxStep}</0>"
#: packages/ui/primitives/document-flow/add-subject.tsx:78
#: packages/ui/primitives/template-flow/add-template-settings.tsx:195
#: packages/ui/primitives/template-flow/add-template-settings.tsx:234
msgid "Subject <0>(Optional)</0>"
msgstr "Objet <0>(Optionnel)</0>"
@ -712,7 +1026,19 @@ msgstr "Objet <0>(Optionnel)</0>"
msgid "Submit"
msgstr "Soumettre"
#: packages/ui/primitives/template-flow/add-template-settings.tsx:134
#: packages/lib/server-only/team/delete-team-email.ts:96
msgid "Team email has been revoked for {0}"
msgstr ""
#: packages/email/templates/team-email-removed.tsx:53
msgid "Team email removed"
msgstr ""
#: packages/email/templates/team-email-removed.tsx:27
msgid "Team email removed for {teamName} on Documenso"
msgstr ""
#: packages/ui/primitives/template-flow/add-template-settings.tsx:133
msgid "Template title"
msgstr "Titre du modèle"
@ -722,6 +1048,10 @@ msgstr "Titre du modèle"
msgid "Text"
msgstr "Texte"
#: packages/email/template-components/template-forgot-password.tsx:25
msgid "That's okay, it happens! Click the button below to reset your password."
msgstr ""
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:44
msgid "The authentication required for recipients to sign fields"
msgstr "L'authentification requise pour que les destinataires signent des champs"
@ -738,10 +1068,22 @@ msgstr "L'authentification requise pour que les destinataires visualisent le doc
msgid "The document's name"
msgstr "Le nom du document"
#: packages/email/templates/team-delete.tsx:35
msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents"
msgstr ""
#: packages/email/templates/team-delete.tsx:34
msgid "The following team has been deleted by you"
msgstr ""
#: packages/ui/primitives/document-password-dialog.tsx:52
msgid "The password you have entered is incorrect. Please try again."
msgstr "Le mot de passe que vous avez entré est incorrect. Veuillez réessayer."
#: packages/email/template-components/template-document-super-delete.tsx:38
msgid "The reason provided for deletion is the following:"
msgstr ""
#: 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 "Le destinataire n'est pas tenu de prendre des mesures et reçoit une copie du document après son achèvement."
@ -774,10 +1116,18 @@ msgstr "L'email du signataire"
msgid "The signer's name"
msgstr "Le nom du signataire"
#: packages/email/templates/team-email-removed.tsx:57
msgid "The team email <0>{teamEmail}</0> has been removed from the following team"
msgstr ""
#: 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 "Cela peut être remplacé par le paramétrage direct des exigences d'authentification pour chaque destinataire à l'étape suivante."
#: packages/email/template-components/template-document-super-delete.tsx:31
msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support."
msgstr ""
#: packages/ui/primitives/document-flow/add-fields.tsx:757
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
msgstr "Ce document a déjà été envoyé à ce destinataire. Vous ne pouvez plus modifier ce destinataire."
@ -786,6 +1136,10 @@ msgstr "Ce document a déjà été envoyé à ce destinataire. Vous ne pouvez pl
msgid "This document is password protected. Please enter the password to view the document."
msgstr "Ce document est protégé par mot de passe. Veuillez entrer le mot de passe pour visualiser le document."
#: packages/email/template-components/template-footer.tsx:14
msgid "This document was sent using <0>Documenso.</0>"
msgstr "Ce document a été envoyé via <0>Documenso.</0>"
#: 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 "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."
@ -802,12 +1156,12 @@ msgstr "Ce signataire a déjà signé le document."
msgid "This will override any global settings."
msgstr "Cela remplacera tous les paramètres globaux."
#: packages/ui/primitives/document-flow/add-settings.tsx:305
#: packages/ui/primitives/template-flow/add-template-settings.tsx:309
#: packages/ui/primitives/document-flow/add-settings.tsx:347
#: packages/ui/primitives/template-flow/add-template-settings.tsx:348
msgid "Time Zone"
msgstr "Fuseau horaire"
#: packages/ui/primitives/document-flow/add-settings.tsx:153
#: packages/ui/primitives/document-flow/add-settings.tsx:155
msgid "Title"
msgstr "Titre"
@ -844,7 +1198,19 @@ msgstr "Valeur"
#: packages/lib/constants/recipient-roles.ts:26
msgid "View"
msgstr "Vue"
msgstr "Voir"
#: packages/email/templates/document-created-from-direct-template.tsx:69
msgid "View document"
msgstr "Voir le document"
#: packages/email/template-components/template-document-self-signed.tsx:79
msgid "View plans"
msgstr "Voir les forfaits"
#: packages/lib/constants/recipient-roles.ts:67
#~ msgid "VIEW_REQUEST"
#~ msgstr "DEMANDE_DE_CONSULTATION"
#: packages/lib/constants/recipient-roles.ts:27
msgid "Viewed"
@ -860,12 +1226,36 @@ msgstr "Spectateurs"
#: packages/lib/constants/recipient-roles.ts:28
msgid "Viewing"
msgstr "Visionnage"
msgstr "Consultation"
#: packages/email/template-components/template-document-pending.tsx:31
msgid "Waiting for others"
msgstr "En attente des autres"
#: packages/lib/server-only/document/send-pending-email.ts:73
msgid "Waiting for others to complete signing."
msgstr ""
#: packages/email/template-components/template-document-pending.tsx:41
msgid "We're still waiting for other signers to sign this document.<0/>We'll notify you as soon as it's ready."
msgstr "Nous attendons encore que d'autres signataires signent ce document.<0/>Nous vous préviendrons dès qu'il sera prêt."
#: packages/email/templates/reset-password.tsx:59
msgid "We've changed your password as you asked. You can now sign in with your new password."
msgstr "Nous avons changé votre mot de passe comme demandé. Vous pouvez maintenant vous connecter avec votre nouveau mot de passe."
#: packages/email/template-components/template-confirmation-email.tsx:24
msgid "Welcome to Documenso!"
msgstr ""
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:44
msgid "You are about to send this document to the recipients. Are you sure you want to continue?"
msgstr "Vous êtes sur le point d'envoyer ce document aux destinataires. Êtes-vous sûr de vouloir continuer ?"
#: packages/email/template-components/template-confirmation-email.tsx:41
msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)"
msgstr ""
#: packages/ui/components/document/document-send-email-message-helper.tsx:11
msgid "You can use the following variables in your message:"
msgstr "Vous pouvez utiliser les variables suivantes dans votre message :"
@ -874,7 +1264,52 @@ msgstr "Vous pouvez utiliser les variables suivantes dans votre message :"
msgid "You cannot upload documents at this time."
msgstr "Vous ne pouvez pas télécharger de documents pour le moment."
#: packages/email/template-components/template-document-cancel.tsx:35
msgid "You don't need to sign it anymore."
msgstr "Vous n'avez plus besoin de le signer."
#: packages/lib/server-only/team/create-team-member-invites.ts:168
msgid "You have been invited to join {0} on Documenso"
msgstr ""
#: packages/email/templates/team-invite.tsx:59
msgid "You have been invited to join the following team"
msgstr "Vous avez été invité à rejoindre l'équipe suivante"
#: packages/lib/server-only/recipient/set-recipients-for-document.ts:314
msgid "You have been removed from a document"
msgstr ""
#: packages/lib/server-only/team/request-team-ownership-transfer.ts:114
msgid "You have been requested to take ownership of team {0} on Documenso"
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:102
#: packages/lib/server-only/document/resend-document.tsx:113
msgid "You have initiated the document {0} that requires you to {recipientActionVerb} it."
msgstr ""
#: packages/ui/primitives/document-dropzone.tsx:69
msgid "You have reached your document limit."
msgstr "Vous avez atteint votre limite de documents."
#: packages/email/template-components/template-document-self-signed.tsx:42
#~ msgid "You have signed \"{documentName}\""
#~ msgstr "Vous avez signé \"{documentName}\""
#: packages/email/template-components/template-document-self-signed.tsx:42
msgid "You have signed “{documentName}”"
msgstr ""
#: packages/email/template-components/template-document-super-delete.tsx:23
msgid "Your document has been deleted by an admin!"
msgstr "Votre document a été supprimé par un administrateur !"
#: packages/email/template-components/template-reset-password.tsx:26
msgid "Your password has been updated."
msgstr "Votre mot de passe a été mis à jour."
#: packages/email/templates/team-delete.tsx:26
#: packages/email/templates/team-delete.tsx:30
msgid "Your team has been deleted"
msgstr "Votre équipe a été supprimée"

View File

@ -42,7 +42,7 @@ msgstr "Ajouter un document"
msgid "Add More Users for {0}"
msgstr "Ajouter plus d'utilisateurs pour {0}"
#: apps/marketing/src/app/(marketing)/open/page.tsx:165
#: apps/marketing/src/app/(marketing)/open/page.tsx:164
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 "Tous nos indicateurs, finances et apprentissages sont publics. Nous croyons en la transparence et souhaitons partager notre parcours avec vous. Vous pouvez en lire plus sur pourquoi ici : <0>Annonce de Open Metrics</0>"
@ -90,7 +90,7 @@ msgstr "Changelog"
msgid "Choose a template from the community app store. Or submit your own template for others to use."
msgstr "Choisissez un modèle dans la boutique d'applications communautaires. Ou soumettez votre propre modèle pour que d'autres puissent l'utiliser."
#: apps/marketing/src/app/(marketing)/open/page.tsx:219
#: apps/marketing/src/app/(marketing)/open/page.tsx:218
msgid "Community"
msgstr "Communauté"
@ -193,7 +193,7 @@ msgstr "Rapide."
msgid "Faster, smarter and more beautiful."
msgstr "Plus rapide, plus intelligent et plus beau."
#: apps/marketing/src/app/(marketing)/open/page.tsx:210
#: apps/marketing/src/app/(marketing)/open/page.tsx:209
msgid "Finances"
msgstr "Finances"
@ -246,15 +246,15 @@ msgstr "Commencez aujourd'hui."
msgid "Get the latest news from Documenso, including product updates, team announcements and more!"
msgstr "Obtenez les dernières nouvelles de Documenso, y compris les mises à jour de produits, les annonces d'équipe et plus encore !"
#: apps/marketing/src/app/(marketing)/open/page.tsx:233
#: apps/marketing/src/app/(marketing)/open/page.tsx:232
msgid "GitHub: Total Merged PRs"
msgstr "GitHub : Total des PRs fusionnées"
#: apps/marketing/src/app/(marketing)/open/page.tsx:251
#: apps/marketing/src/app/(marketing)/open/page.tsx:250
msgid "GitHub: Total Open Issues"
msgstr "GitHub : Total des problèmes ouverts"
#: apps/marketing/src/app/(marketing)/open/page.tsx:225
#: apps/marketing/src/app/(marketing)/open/page.tsx:224
msgid "GitHub: Total Stars"
msgstr "GitHub : Nombre total d'étoiles"
@ -262,7 +262,7 @@ msgstr "GitHub : Nombre total d'étoiles"
msgid "Global Salary Bands"
msgstr "Bandes de salaire globales"
#: apps/marketing/src/app/(marketing)/open/page.tsx:261
#: apps/marketing/src/app/(marketing)/open/page.tsx:260
msgid "Growth"
msgstr "Croissance"
@ -286,7 +286,7 @@ msgstr "Paiements intégrés avec Stripe afin que vous n'ayez pas à vous soucie
msgid "Integrates with all your favourite tools."
msgstr "S'intègre à tous vos outils préférés."
#: apps/marketing/src/app/(marketing)/open/page.tsx:289
#: apps/marketing/src/app/(marketing)/open/page.tsx:288
msgid "Is there more?"
msgstr "Y a-t-il plus ?"
@ -310,11 +310,11 @@ msgstr "Emplacement"
msgid "Make it your own through advanced customization and adjustability."
msgstr "Faites-en votre propre grâce à une personnalisation avancée et un ajustement."
#: apps/marketing/src/app/(marketing)/open/page.tsx:199
#: apps/marketing/src/app/(marketing)/open/page.tsx:198
msgid "Merged PR's"
msgstr "PRs fusionnées"
#: apps/marketing/src/app/(marketing)/open/page.tsx:234
#: apps/marketing/src/app/(marketing)/open/page.tsx:233
msgid "Merged PRs"
msgstr "PRs fusionnées"
@ -345,8 +345,8 @@ msgstr "Aucune carte de crédit requise"
msgid "None of these work for you? Try self-hosting!"
msgstr "Aucune de ces options ne fonctionne pour vous ? Essayez l'hébergement autonome !"
#: apps/marketing/src/app/(marketing)/open/page.tsx:194
#: apps/marketing/src/app/(marketing)/open/page.tsx:252
#: apps/marketing/src/app/(marketing)/open/page.tsx:193
#: apps/marketing/src/app/(marketing)/open/page.tsx:251
msgid "Open Issues"
msgstr "Problèmes ouverts"
@ -354,7 +354,7 @@ msgstr "Problèmes ouverts"
msgid "Open Source or Hosted."
msgstr "Open Source ou hébergé."
#: apps/marketing/src/app/(marketing)/open/page.tsx:161
#: apps/marketing/src/app/(marketing)/open/page.tsx:160
#: 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
@ -466,7 +466,7 @@ msgstr "Intelligent."
msgid "Star on GitHub"
msgstr "Étoile sur GitHub"
#: apps/marketing/src/app/(marketing)/open/page.tsx:226
#: apps/marketing/src/app/(marketing)/open/page.tsx:225
msgid "Stars"
msgstr "Étoiles"
@ -501,7 +501,7 @@ msgstr "Boutique de modèles (Bientôt)."
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 "C'est génial. Vous pouvez consulter les <0>Problèmes</0> actuels et rejoindre notre <1>Communauté Discord</1> pour rester à jour sur ce qui est actuellement prioritaire. Dans tous les cas, nous sommes une communauté ouverte et accueillons toutes les contributions, techniques et non techniques ❤️"
#: apps/marketing/src/app/(marketing)/open/page.tsx:293
#: apps/marketing/src/app/(marketing)/open/page.tsx:292
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 "Cette page évolue à mesure que nous apprenons ce qui fait une grande entreprise de signature. Nous la mettrons à jour lorsque nous aurons plus à partager."
@ -514,8 +514,8 @@ msgstr "Titre"
msgid "Total Completed Documents"
msgstr "Documents totalisés complétés"
#: apps/marketing/src/app/(marketing)/open/page.tsx:266
#: apps/marketing/src/app/(marketing)/open/page.tsx:267
#: apps/marketing/src/app/(marketing)/open/page.tsx:268
msgid "Total Customers"
msgstr "Total des clients"
@ -602,4 +602,3 @@ msgstr "Vous pouvez auto-héberger Documenso gratuitement ou utiliser notre vers
#: apps/marketing/src/components/(marketing)/carousel.tsx:272
msgid "Your browser does not support the video tag."
msgstr "Votre navigateur ne prend pas en charge la balise vidéo."

View File

@ -260,12 +260,12 @@ msgstr "Abonnements actifs"
msgid "Add"
msgstr "Ajouter"
#: 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)/documents/[id]/edit-document.tsx:176
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:88
msgid "Add all relevant fields for each recipient."
msgstr "Ajouter tous les champs pertinents pour chaque destinataire."
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:83
msgid "Add all relevant placeholders for each recipient."
msgstr "Ajouter tous les espaces réservés pertinents pour chaque destinataire."
@ -281,8 +281,8 @@ msgstr "Ajouter un authentificateur pour servir de méthode d'authentification s
msgid "Add email"
msgstr "Ajouter un e-mail"
#: 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)/documents/[id]/edit-document.tsx:175
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
msgid "Add Fields"
msgstr "Ajouter des champs"
@ -295,15 +295,15 @@ msgstr "Ajouter davantage"
msgid "Add passkey"
msgstr "Ajouter une clé de passe"
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:81
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82
msgid "Add Placeholders"
msgstr "Ajouter des espaces réservés"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
msgid "Add Signers"
msgstr "Ajouter des signataires"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180
msgid "Add Subject"
msgstr "Ajouter un sujet"
@ -311,7 +311,7 @@ msgstr "Ajouter un sujet"
msgid "Add team email"
msgstr "Ajouter un e-mail d'équipe"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:171
msgid "Add the people who will sign the document."
msgstr "Ajouter les personnes qui signeront le document."
@ -319,7 +319,7 @@ msgstr "Ajouter les personnes qui signeront le document."
msgid "Add the recipients to create the document with"
msgstr "Ajouter les destinataires pour créer le document avec"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181
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."
@ -414,13 +414,13 @@ msgstr "Un e-mail demandant le transfert de cette équipe a été envoyé."
msgid "An error occurred"
msgstr "Une erreur est survenue"
#: 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:231
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:268
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:201
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:235
msgid "An error occurred while adding signers."
msgstr "Une erreur est survenue lors de l'ajout de signataires."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303
msgid "An error occurred while adding the fields."
msgstr "Une erreur est survenue lors de l'ajout des champs."
@ -482,7 +482,7 @@ msgstr "Une erreur est survenue lors de la suppression de la signature."
msgid "An error occurred while removing the text."
msgstr "Une erreur est survenue lors de la suppression du texte."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:332
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:334
msgid "An error occurred while sending the document."
msgstr "Une erreur est survenue lors de l'envoi du document."
@ -507,8 +507,8 @@ msgstr "Une erreur est survenue lors de la signature du document."
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."
#: 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)/documents/[id]/edit-document.tsx:234
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:170
msgid "An error occurred while updating the document settings."
msgstr "Une erreur est survenue lors de la mise à jour des paramètres du document."
@ -869,11 +869,11 @@ msgstr "Documents complétés"
msgid "Completed Documents"
msgstr "Documents Complétés"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:166
msgid "Configure general settings for the document."
msgstr "Configurer les paramètres généraux pour le document."
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:78
msgid "Configure general settings for the template."
msgstr "Configurer les paramètres généraux pour le modèle."
@ -1350,7 +1350,7 @@ msgstr "Document renvoyé"
msgid "Document resealed"
msgstr "Document resealé"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:323
msgid "Document sent"
msgstr "Document envoyé"
@ -1579,16 +1579,16 @@ msgstr "Entrez votre texte ici"
#: 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)/documents/[id]/edit-document.tsx:231
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:233
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:267
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:302
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:333
#: 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:112
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:165
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:196
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:230
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:169
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:200
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:234
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:160
@ -1679,8 +1679,8 @@ msgstr "Mot de passe oublié ?"
msgid "Full Name"
msgstr "Nom complet"
#: 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)/documents/[id]/edit-document.tsx:165
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77
#: 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/mobile-nav.tsx:51
@ -3244,7 +3244,7 @@ msgstr "Le modèle a été mis à jour."
msgid "Template moved"
msgstr "Modèle déplacé"
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:219
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:223
msgid "Template saved"
msgstr "Modèle enregistré"
@ -4521,7 +4521,7 @@ msgstr "Votre document a été créé à partir du modèle avec succès."
msgid "Your document has been re-sent successfully."
msgstr "Votre document a été renvoyé avec succès."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:322
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:324
msgid "Your document has been sent successfully."
msgstr "Votre document a été envoyé avec succès."
@ -4612,7 +4612,7 @@ msgstr "Votre modèle a été supprimé avec succès."
msgid "Your template will be duplicated."
msgstr "Votre modèle sera dupliqué."
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:220
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:224
msgid "Your templates has been saved successfully."
msgstr "Vos modèles ont été enregistrés avec succès."
@ -4628,4 +4628,3 @@ 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
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."

View File

@ -4,7 +4,6 @@ export const isValidRedirectUrl = (value: string) => {
try {
const url = new URL(value);
console.log({ protocol: url.protocol });
if (!ALLOWED_PROTOCOLS.includes(url.protocol.slice(0, -1).toLowerCase())) {
return false;
}

View File

@ -0,0 +1,18 @@
declare global {
// eslint-disable-next-line no-var, @typescript-eslint/no-explicit-any
var __documenso_util_remember: Map<string, any>;
}
export function remember<T>(name: string, getValue: () => T): T {
const thusly = globalThis;
if (!thusly.__documenso_util_remember) {
thusly.__documenso_util_remember = new Map();
}
if (!thusly.__documenso_util_remember.has(name)) {
thusly.__documenso_util_remember.set(name, getValue());
}
return thusly.__documenso_util_remember.get(name);
}

View File

@ -0,0 +1,36 @@
import { I18nProvider } from '@lingui/react';
import { render } from '@documenso/email/render';
import { getI18nInstance } from '../client-only/providers/i18n.server';
import {
APP_I18N_OPTIONS,
type SupportedLanguageCodes,
isValidLanguageCode,
} from '../constants/i18n';
export const renderEmailWithI18N = async (
component: React.ReactElement,
options?: {
plainText?: boolean;
// eslint-disable-next-line @typescript-eslint/ban-types
lang?: SupportedLanguageCodes | (string & {});
},
) => {
try {
const providedLang = options?.lang;
const lang = isValidLanguageCode(providedLang) ? providedLang : APP_I18N_OPTIONS.sourceLang;
const i18n = await getI18nInstance(lang);
i18n.activate(lang);
return render(<I18nProvider i18n={i18n}>{component}</I18nProvider>, {
plainText: options?.plainText,
});
} catch (err) {
console.error(err);
throw new Error('Failed to render email');
}
};

View File

@ -0,0 +1,5 @@
-- AlterTable
ALTER TABLE "DocumentMeta" ADD COLUMN "language" TEXT NOT NULL DEFAULT 'en';
-- AlterTable
ALTER TABLE "TemplateMeta" ADD COLUMN "language" TEXT NOT NULL DEFAULT 'en';

View File

@ -370,6 +370,7 @@ model DocumentMeta {
redirectUrl String?
signingOrder DocumentSigningOrder @default(PARALLEL)
typedSignatureEnabled Boolean @default(false)
language String @default("en")
}
enum ReadStatus {
@ -612,6 +613,7 @@ model TemplateMeta {
templateId Int @unique
template Template @relation(fields: [templateId], references: [id], onDelete: Cascade)
redirectUrl String?
language String @default("en")
}
model Template {

View File

@ -232,6 +232,7 @@ export const documentRouter = router({
dateFormat: meta.dateFormat,
timezone: meta.timezone,
redirectUrl: meta.redirectUrl,
language: meta.language,
userId: ctx.user.id,
requestMetadata,
});

View File

@ -1,5 +1,6 @@
import { z } from 'zod';
import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n';
import {
ZDocumentAccessAuthTypesSchema,
ZDocumentActionAuthTypesSchema,
@ -70,6 +71,7 @@ export const ZSetSettingsForDocumentMutationSchema = z.object({
message:
'Please enter a valid URL, make sure you include http:// or https:// part of the url.',
}),
language: z.enum(SUPPORTED_LANGUAGE_CODES).optional(),
}),
});

View File

@ -3,7 +3,6 @@ import { createElement } from 'react';
import { PDFDocument } from 'pdf-lib';
import { mailer } from '@documenso/email/mailer';
import { renderAsync } from '@documenso/email/render';
import { DocumentSelfSignedEmailTemplate } from '@documenso/email/templates/document-self-signed';
import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app';
import { FROM_ADDRESS, FROM_NAME, SERVICE_USER_EMAIL } from '@documenso/lib/constants/email';
@ -11,6 +10,7 @@ import { insertFieldInPDF } from '@documenso/lib/server-only/pdf/insert-field-in
import { alphaid } from '@documenso/lib/universal/id';
import { getFile } from '@documenso/lib/universal/upload/get-file';
import { putPdfFile } from '@documenso/lib/universal/upload/put-file';
import { renderEmailWithI18N } from '@documenso/lib/utils/render-email-with-i18n';
import { prisma } from '@documenso/prisma';
import {
DocumentSource,
@ -158,8 +158,8 @@ export const singleplayerRouter = router({
});
const [html, text] = await Promise.all([
renderAsync(template),
renderAsync(template, { plainText: true }),
renderEmailWithI18N(template),
renderEmailWithI18N(template, { plainText: true }),
]);
// Send email to signer.

View File

@ -1,6 +1,7 @@
import { TRPCError } from '@trpc/server';
import { getServerLimits } from '@documenso/ee/server-only/limits/server';
import { isValidLanguageCode } from '@documenso/lib/constants/i18n';
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
import { sendDocument } from '@documenso/lib/server-only/document/send-document';
import { createDocumentFromDirectTemplate } from '@documenso/lib/server-only/template/create-document-from-direct-template';
@ -214,7 +215,10 @@ export const templateRouter = router({
teamId,
templateId,
data,
meta,
meta: {
...meta,
language: isValidLanguageCode(meta?.language) ? meta?.language : undefined,
},
requestMetadata,
});
} catch (err) {

View File

@ -1,5 +1,6 @@
import { z } from 'zod';
import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n';
import {
ZDocumentAccessAuthTypesSchema,
ZDocumentActionAuthTypesSchema,
@ -87,6 +88,10 @@ export const ZUpdateTemplateSettingsMutationSchema = z.object({
.max(MAX_TEMPLATE_PUBLIC_DESCRIPTION_LENGTH)
.optional(),
type: z.nativeEnum(TemplateType).optional(),
language: z
.union([z.string(), z.enum(SUPPORTED_LANGUAGE_CODES)])
.optional()
.default('en'),
}),
meta: z
.object({
@ -101,6 +106,7 @@ export const ZUpdateTemplateSettingsMutationSchema = z.object({
message:
'Please enter a valid URL, make sure you include http:// or https:// part of the url.',
}),
language: z.enum(SUPPORTED_LANGUAGE_CODES).optional(),
})
.optional(),
});

View File

@ -8,6 +8,7 @@ import { InfoIcon } from 'lucide-react';
import { useForm } from 'react-hook-form';
import { DATE_FORMATS, DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats';
import { SUPPORTED_LANGUAGES } from '@documenso/lib/constants/i18n';
import { DEFAULT_DOCUMENT_TIME_ZONE, TIME_ZONES } from '@documenso/lib/constants/time-zones';
import { extractDocumentAuthMethods } from '@documenso/lib/utils/document-auth';
import type { TeamMemberRole } from '@documenso/prisma/client';
@ -98,6 +99,7 @@ export const AddSettingsFormPartial = ({
DATE_FORMATS.find((format) => format.value === document.documentMeta?.dateFormat)
?.value ?? DEFAULT_DOCUMENT_DATE_FORMAT,
redirectUrl: document.documentMeta?.redirectUrl ?? '',
language: document.documentMeta?.language ?? 'en',
},
},
});
@ -165,6 +167,46 @@ export const AddSettingsFormPartial = ({
)}
/>
<FormField
control={form.control}
name="meta.language"
render={({ field }) => (
<FormItem>
<FormLabel className="inline-flex items-center">
<Trans>Language</Trans>
<Tooltip>
<TooltipTrigger>
<InfoIcon className="mx-2 h-4 w-4" />
</TooltipTrigger>
<TooltipContent className="text-foreground max-w-md space-y-2 p-4">
Controls the language for the document, including the language to be used
for email notifications, and the final certificate that is generated and
attached to the document.
</TooltipContent>
</Tooltip>
</FormLabel>
<FormControl>
<Select {...field} onValueChange={field.onChange}>
<SelectTrigger className="bg-background">
<SelectValue />
</SelectTrigger>
<SelectContent>
{Object.entries(SUPPORTED_LANGUAGES).map(([code, language]) => (
<SelectItem key={code} value={code}>
{language.full}
</SelectItem>
))}
</SelectContent>
</Select>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="globalAccessAuth"

View File

@ -1,6 +1,7 @@
import { z } from 'zod';
import { DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats';
import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n';
import { DEFAULT_DOCUMENT_TIME_ZONE } from '@documenso/lib/constants/time-zones';
import {
ZDocumentAccessAuthTypesSchema,
@ -39,6 +40,10 @@ export const ZAddSettingsFormSchema = z.object({
message:
'Please enter a valid URL, make sure you include http:// or https:// part of the url.',
}),
language: z
.union([z.string(), z.enum(SUPPORTED_LANGUAGE_CODES)])
.optional()
.default('en'),
}),
});

View File

@ -8,6 +8,7 @@ import { InfoIcon } from 'lucide-react';
import { useForm } from 'react-hook-form';
import { DATE_FORMATS, DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats';
import { SUPPORTED_LANGUAGES } from '@documenso/lib/constants/i18n';
import { DEFAULT_DOCUMENT_TIME_ZONE, TIME_ZONES } from '@documenso/lib/constants/time-zones';
import { extractDocumentAuthMethods } from '@documenso/lib/utils/document-auth';
import { type Field, type Recipient } from '@documenso/prisma/client';
@ -90,6 +91,7 @@ export const AddTemplateSettingsFormPartial = ({
timezone: template.templateMeta?.timezone ?? DEFAULT_DOCUMENT_TIME_ZONE,
dateFormat: template.templateMeta?.dateFormat ?? DEFAULT_DOCUMENT_DATE_FORMAT,
redirectUrl: template.templateMeta?.redirectUrl ?? '',
language: template.templateMeta?.language ?? 'en',
},
},
});
@ -139,6 +141,46 @@ export const AddTemplateSettingsFormPartial = ({
)}
/>
<FormField
control={form.control}
name="meta.language"
render={({ field }) => (
<FormItem>
<FormLabel className="inline-flex items-center">
<Trans>Language</Trans>
<Tooltip>
<TooltipTrigger>
<InfoIcon className="mx-2 h-4 w-4" />
</TooltipTrigger>
<TooltipContent className="text-foreground max-w-md space-y-2 p-4">
Controls the language for the document, including the language to be used
for email notifications, and the final certificate that is generated and
attached to the document.
</TooltipContent>
</Tooltip>
</FormLabel>
<FormControl>
<Select {...field} onValueChange={field.onChange}>
<SelectTrigger className="bg-background">
<SelectValue />
</SelectTrigger>
<SelectContent>
{Object.entries(SUPPORTED_LANGUAGES).map(([code, language]) => (
<SelectItem key={code} value={code}>
{language.full}
</SelectItem>
))}
</SelectContent>
</Select>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="globalAccessAuth"

View File

@ -1,6 +1,7 @@
import { z } from 'zod';
import { DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats';
import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n';
import { DEFAULT_DOCUMENT_TIME_ZONE } from '@documenso/lib/constants/time-zones';
import {
ZDocumentAccessAuthTypesSchema,
@ -31,6 +32,10 @@ export const ZAddTemplateSettingsFormSchema = z.object({
message:
'Please enter a valid URL, make sure you include http:// or https:// part of the url.',
}),
language: z
.union([z.string(), z.enum(SUPPORTED_LANGUAGE_CODES)])
.optional()
.default('en'),
}),
});