diff --git a/apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx b/apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
index 0d9c3fc9e..dbca5a8ea 100644
--- a/apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+++ b/apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
@@ -4,8 +4,9 @@ import { msg } from '@lingui/core/macro';
import { useLingui } from '@lingui/react';
import { Trans } from '@lingui/react/macro';
import { Loader } from 'lucide-react';
-import { useDropzone } from 'react-dropzone';
+import { ErrorCode, type FileRejection, useDropzone } from 'react-dropzone';
import { useNavigate, useParams } from 'react-router';
+import { match } from 'ts-pattern';
import { APP_DOCUMENT_UPLOAD_SIZE_LIMIT } from '@documenso/lib/constants/app';
import { megabytesToBytes } from '@documenso/lib/universal/unit-convertions';
@@ -67,10 +68,47 @@ export const TemplateDropZoneWrapper = ({ children, className }: TemplateDropZon
}
};
- const onFileDropRejected = () => {
+ const onFileDropRejected = (fileRejections: FileRejection[]) => {
+ if (!fileRejections.length) {
+ return;
+ }
+
+ // Since users can only upload only one file (no multi-upload), we only handle the first file rejection
+ const { file, errors } = fileRejections[0];
+
+ if (!errors.length) {
+ return;
+ }
+
+ const errorNodes = errors.map((error, index) => (
+
+ {match(error.code)
+ .with(ErrorCode.FileTooLarge, () => (
+ File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB
+ ))
+ .with(ErrorCode.FileInvalidType, () => Only PDF files are allowed )
+ .with(ErrorCode.FileTooSmall, () => File is too small )
+ .with(ErrorCode.TooManyFiles, () => (
+ Only one file can be uploaded at a time
+ ))
+ .otherwise(() => (
+ Unknown error
+ ))}
+
+ ));
+
+ const description = (
+ <>
+
+ {file.name} couldn't be uploaded:
+
+ {errorNodes}
+ >
+ );
+
toast({
- title: _(msg`Your template failed to upload.`),
- description: _(msg`File cannot be larger than ${APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB`),
+ title: _(msg`Upload failed`),
+ description,
duration: 5000,
variant: 'destructive',
});
@@ -88,8 +126,8 @@ export const TemplateDropZoneWrapper = ({ children, className }: TemplateDropZon
void onFileDrop(acceptedFile);
}
},
- onDropRejected: () => {
- void onFileDropRejected();
+ onDropRejected: (fileRejections) => {
+ onFileDropRejected(fileRejections);
},
noClick: true,
noDragEventsBubbling: true,
diff --git a/apps/remix/app/components/general/template/template-edit-form.tsx b/apps/remix/app/components/general/template/template-edit-form.tsx
index 17d7a45a1..41002b54e 100644
--- a/apps/remix/app/components/general/template/template-edit-form.tsx
+++ b/apps/remix/app/components/general/template/template-edit-form.tsx
@@ -182,7 +182,7 @@ export const TemplateEditForm = ({
};
const saveTemplatePlaceholderData = async (data: TAddTemplatePlacholderRecipientsFormSchema) => {
- return Promise.all([
+ const [, recipients] = await Promise.all([
updateTemplateSettings({
templateId: template.id,
meta: {
@@ -196,6 +196,8 @@ export const TemplateEditForm = ({
recipients: data.signers,
}),
]);
+
+ return recipients;
};
const onAddTemplatePlaceholderFormSubmit = async (
@@ -218,7 +220,7 @@ export const TemplateEditForm = ({
data: TAddTemplatePlacholderRecipientsFormSchema,
) => {
try {
- await saveTemplatePlaceholderData(data);
+ return await saveTemplatePlaceholderData(data);
} catch (err) {
console.error(err);
@@ -227,6 +229,8 @@ export const TemplateEditForm = ({
description: _(msg`An error occurred while auto-saving the template placeholders.`),
variant: 'destructive',
});
+
+ throw err;
}
};
diff --git a/apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx b/apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
index 0a93d2d66..5aa188895 100644
--- a/apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+++ b/apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
@@ -71,6 +71,23 @@ export default function OrganisationGroupSettingsPage({ params }: Route.Componen
},
});
+ const { mutateAsync: promoteToOwner, isPending: isPromotingToOwner } =
+ trpc.admin.organisationMember.promoteToOwner.useMutation({
+ onSuccess: () => {
+ toast({
+ title: t`Success`,
+ description: t`Member promoted to owner successfully`,
+ });
+ },
+ onError: () => {
+ toast({
+ title: t`Error`,
+ description: t`We couldn't promote the member to owner. Please try again.`,
+ variant: 'destructive',
+ });
+ },
+ });
+
const teamsColumns = useMemo(() => {
return [
{
@@ -101,6 +118,26 @@ export default function OrganisationGroupSettingsPage({ params }: Route.Componen
{row.original.user.email}
),
},
+ {
+ header: t`Actions`,
+ cell: ({ row }) => (
+
+
+ promoteToOwner({
+ organisationId,
+ userId: row.original.userId,
+ })
+ }
+ >
+ Promote to owner
+
+
+ ),
+ },
] satisfies DataTableColumnDef
[];
}, [organisation]);
diff --git a/apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx b/apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
index c415a0e13..ff14ccd32 100644
--- a/apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
+++ b/apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
@@ -151,6 +151,7 @@ export default function SigningCertificate({ loaderData }: Route.ComponentProps)
authLevel = match(accessAuthMethod)
.with('ACCOUNT', () => _(msg`Account Authentication`))
+ .with('TWO_FACTOR_AUTH', () => _(msg`Two-Factor Authentication`))
.with(undefined, () => _(msg`Email`))
.exhaustive();
}
diff --git a/apps/remix/app/routes/_recipient+/d.$token+/_index.tsx b/apps/remix/app/routes/_recipient+/d.$token+/_index.tsx
index ee37e5d0b..f7e495477 100644
--- a/apps/remix/app/routes/_recipient+/d.$token+/_index.tsx
+++ b/apps/remix/app/routes/_recipient+/d.$token+/_index.tsx
@@ -47,10 +47,12 @@ export async function loader({ params, request }: Route.LoaderArgs) {
});
// Ensure typesafety when we add more options.
- const isAccessAuthValid = match(derivedRecipientAccessAuth.at(0))
- .with(DocumentAccessAuth.ACCOUNT, () => Boolean(session.user))
- .with(undefined, () => true)
- .exhaustive();
+ const isAccessAuthValid = derivedRecipientAccessAuth.every((auth) =>
+ match(auth)
+ .with(DocumentAccessAuth.ACCOUNT, () => Boolean(session.user))
+ .with(DocumentAccessAuth.TWO_FACTOR_AUTH, () => true)
+ .exhaustive(),
+ );
if (!isAccessAuthValid) {
return superLoaderJson({
diff --git a/apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx b/apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
index d9c8b9c4c..06d3018cc 100644
--- a/apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
+++ b/apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
@@ -3,12 +3,12 @@ import { DocumentSigningOrder, DocumentStatus, RecipientRole, SigningStatus } fr
import { Clock8 } from 'lucide-react';
import { Link, redirect } from 'react-router';
import { getOptionalLoaderContext } from 'server/utils/get-loader-session';
+import { match } from 'ts-pattern';
import signingCelebration from '@documenso/assets/images/signing-celebration.png';
import { getOptionalSession } from '@documenso/auth/server/lib/utils/get-session';
import { useOptionalSession } from '@documenso/lib/client-only/providers/session';
import { getDocumentAndSenderByToken } from '@documenso/lib/server-only/document/get-document-by-token';
-import { isRecipientAuthorized } from '@documenso/lib/server-only/document/is-recipient-authorized';
import { viewedDocument } from '@documenso/lib/server-only/document/viewed-document';
import { getCompletedFieldsForToken } from '@documenso/lib/server-only/field/get-completed-fields-for-token';
import { getFieldsForToken } from '@documenso/lib/server-only/field/get-fields-for-token';
@@ -19,6 +19,7 @@ import { getRecipientSignatures } from '@documenso/lib/server-only/recipient/get
import { getRecipientsForAssistant } from '@documenso/lib/server-only/recipient/get-recipients-for-assistant';
import { getTeamSettings } from '@documenso/lib/server-only/team/get-team-settings';
import { getUserByEmail } from '@documenso/lib/server-only/user/get-user-by-email';
+import { DocumentAccessAuth } from '@documenso/lib/types/document-auth';
import { extractDocumentAuthMethods } from '@documenso/lib/utils/document-auth';
import { SigningCard3D } from '@documenso/ui/components/signing-card';
@@ -98,16 +99,16 @@ export async function loader({ params, request }: Route.LoaderArgs) {
recipientAuth: recipient.authOptions,
});
- const isDocumentAccessValid = await isRecipientAuthorized({
- type: 'ACCESS',
- documentAuthOptions: document.authOptions,
- recipient,
- userId: user?.id,
- });
+ const isAccessAuthValid = derivedRecipientAccessAuth.every((accesssAuth) =>
+ match(accesssAuth)
+ .with(DocumentAccessAuth.ACCOUNT, () => user && user.email === recipient.email)
+ .with(DocumentAccessAuth.TWO_FACTOR_AUTH, () => true) // Allow without account requirement
+ .exhaustive(),
+ );
let recipientHasAccount: boolean | null = null;
- if (!isDocumentAccessValid) {
+ if (!isAccessAuthValid) {
recipientHasAccount = await getUserByEmail({ email: recipient.email })
.then((user) => !!user)
.catch(() => false);
diff --git a/apps/remix/app/routes/api+/health.ts b/apps/remix/app/routes/api+/health.ts
index 1ebdfbadb..c43ac1478 100644
--- a/apps/remix/app/routes/api+/health.ts
+++ b/apps/remix/app/routes/api+/health.ts
@@ -23,10 +23,12 @@ export const loader = async () => {
try {
const certStatus = getCertificateStatus();
+
if (certStatus.isAvailable) {
checks.certificate = { status: 'ok' };
} else {
checks.certificate = { status: 'warning' };
+
if (overallStatus === 'ok') {
overallStatus = 'warning';
}
diff --git a/apps/remix/app/routes/embed+/_v0+/direct.$url.tsx b/apps/remix/app/routes/embed+/_v0+/direct.$url.tsx
index 5c3d1d916..4c61d9cea 100644
--- a/apps/remix/app/routes/embed+/_v0+/direct.$url.tsx
+++ b/apps/remix/app/routes/embed+/_v0+/direct.$url.tsx
@@ -58,10 +58,12 @@ export async function loader({ params, request }: Route.LoaderArgs) {
documentAuth: template.authOptions,
});
- const isAccessAuthValid = match(derivedRecipientAccessAuth.at(0))
- .with(DocumentAccessAuth.ACCOUNT, () => !!user)
- .with(undefined, () => true)
- .exhaustive();
+ const isAccessAuthValid = derivedRecipientAccessAuth.every((auth) =>
+ match(auth)
+ .with(DocumentAccessAuth.ACCOUNT, () => !!user)
+ .with(DocumentAccessAuth.TWO_FACTOR_AUTH, () => false) // Not supported for direct links
+ .exhaustive(),
+ );
if (!isAccessAuthValid) {
throw data(
diff --git a/apps/remix/app/routes/embed+/_v0+/sign.$url.tsx b/apps/remix/app/routes/embed+/_v0+/sign.$url.tsx
index 88c3b7745..c4eb156b4 100644
--- a/apps/remix/app/routes/embed+/_v0+/sign.$url.tsx
+++ b/apps/remix/app/routes/embed+/_v0+/sign.$url.tsx
@@ -1,10 +1,12 @@
import { RecipientRole } from '@prisma/client';
import { data } from 'react-router';
+import { getOptionalLoaderContext } from 'server/utils/get-loader-session';
import { match } from 'ts-pattern';
import { getOptionalSession } from '@documenso/auth/server/lib/utils/get-session';
import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app';
import { getDocumentAndSenderByToken } from '@documenso/lib/server-only/document/get-document-by-token';
+import { viewedDocument } from '@documenso/lib/server-only/document/viewed-document';
import { getCompletedFieldsForToken } from '@documenso/lib/server-only/field/get-completed-fields-for-token';
import { getFieldsForToken } from '@documenso/lib/server-only/field/get-fields-for-token';
import { getOrganisationClaimByTeamId } from '@documenso/lib/server-only/organisation/get-organisation-claims';
@@ -23,6 +25,8 @@ import { superLoaderJson, useSuperLoaderData } from '~/utils/super-json-loader';
import type { Route } from './+types/sign.$url';
export async function loader({ params, request }: Route.LoaderArgs) {
+ const { requestMetadata } = getOptionalLoaderContext();
+
if (!params.url) {
throw new Response('Not found', { status: 404 });
}
@@ -71,10 +75,12 @@ export async function loader({ params, request }: Route.LoaderArgs) {
documentAuth: document.authOptions,
});
- const isAccessAuthValid = match(derivedRecipientAccessAuth.at(0))
- .with(DocumentAccessAuth.ACCOUNT, () => user && user.email === recipient.email)
- .with(undefined, () => true)
- .exhaustive();
+ const isAccessAuthValid = derivedRecipientAccessAuth.every((accesssAuth) =>
+ match(accesssAuth)
+ .with(DocumentAccessAuth.ACCOUNT, () => user && user.email === recipient.email)
+ .with(DocumentAccessAuth.TWO_FACTOR_AUTH, () => true) // Allow without account requirement
+ .exhaustive(),
+ );
if (!isAccessAuthValid) {
throw data(
@@ -102,6 +108,12 @@ export async function loader({ params, request }: Route.LoaderArgs) {
);
}
+ await viewedDocument({
+ token,
+ requestMetadata,
+ recipientAccessAuth: derivedRecipientAccessAuth,
+ });
+
const allRecipients =
recipient.role === RecipientRole.ASSISTANT
? await getRecipientsForAssistant({
diff --git a/apps/remix/package.json b/apps/remix/package.json
index a97fff5f3..832bbde71 100644
--- a/apps/remix/package.json
+++ b/apps/remix/package.json
@@ -101,5 +101,5 @@
"vite-plugin-babel-macros": "^1.0.6",
"vite-tsconfig-paths": "^5.1.4"
},
- "version": "1.12.2-rc.6"
+ "version": "1.12.10"
}
diff --git a/package-lock.json b/package-lock.json
index 647e4c43c..f40167d8c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@documenso/root",
- "version": "1.12.2-rc.6",
+ "version": "1.12.10",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@documenso/root",
- "version": "1.12.2-rc.6",
+ "version": "1.12.10",
"workspaces": [
"apps/*",
"packages/*"
@@ -89,7 +89,7 @@
},
"apps/remix": {
"name": "@documenso/remix",
- "version": "1.12.2-rc.6",
+ "version": "1.12.10",
"dependencies": {
"@documenso/api": "*",
"@documenso/assets": "*",
diff --git a/package.json b/package.json
index 9e6654c0e..f8f8ba379 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"private": true,
- "version": "1.12.2-rc.6",
+ "version": "1.12.10",
"scripts": {
"build": "turbo run build",
"dev": "turbo run dev --filter=@documenso/remix",
diff --git a/packages/api/v1/schema.ts b/packages/api/v1/schema.ts
index b8e31bfe0..5b4b33f7b 100644
--- a/packages/api/v1/schema.ts
+++ b/packages/api/v1/schema.ts
@@ -310,12 +310,11 @@ export const ZGenerateDocumentFromTemplateMutationSchema = z.object({
)
.refine(
(schema) => {
- const emails = schema.map((signer) => signer.email.toLowerCase());
const ids = schema.map((signer) => signer.id);
- return new Set(emails).size === emails.length && new Set(ids).size === ids.length;
+ return new Set(ids).size === ids.length;
},
- { message: 'Recipient IDs and emails must be unique' },
+ { message: 'Recipient IDs must be unique' },
),
meta: z
.object({
diff --git a/packages/app-tests/e2e/admin/organisations/promote-member-to-owner.spec.ts b/packages/app-tests/e2e/admin/organisations/promote-member-to-owner.spec.ts
new file mode 100644
index 000000000..86edeac2b
--- /dev/null
+++ b/packages/app-tests/e2e/admin/organisations/promote-member-to-owner.spec.ts
@@ -0,0 +1,435 @@
+import { expect, test } from '@playwright/test';
+
+import { nanoid } from '@documenso/lib/universal/id';
+import { seedOrganisationMembers } from '@documenso/prisma/seed/organisations';
+import { seedUser } from '@documenso/prisma/seed/users';
+
+import { apiSignin } from '../../fixtures/authentication';
+
+test('[ADMIN]: promote member to owner', async ({ page }) => {
+ // Create an admin user who can access the admin panel
+ const { user: adminUser } = await seedUser({
+ isAdmin: true,
+ });
+
+ // Create an organisation owner
+ const { user: ownerUser, organisation } = await seedUser({
+ isPersonalOrganisation: false,
+ });
+
+ // Create organisation members with different roles
+ const memberEmail = `member-${nanoid()}@test.documenso.com`;
+ const managerEmail = `manager-${nanoid()}@test.documenso.com`;
+ const adminMemberEmail = `admin-member-${nanoid()}@test.documenso.com`;
+
+ const [memberUser, managerUser, adminMemberUser] = await seedOrganisationMembers({
+ members: [
+ {
+ email: memberEmail,
+ name: 'Test Member',
+ organisationRole: 'MEMBER',
+ },
+ {
+ email: managerEmail,
+ name: 'Test Manager',
+ organisationRole: 'MANAGER',
+ },
+ {
+ email: adminMemberEmail,
+ name: 'Test Admin Member',
+ organisationRole: 'ADMIN',
+ },
+ ],
+ organisationId: organisation.id,
+ });
+
+ // Sign in as admin and navigate to the organisation admin page
+ await apiSignin({
+ page,
+ email: adminUser.email,
+ redirectPath: `/admin/organisations/${organisation.id}`,
+ });
+
+ // Verify we're on the admin organisation page
+ await expect(page.getByText(`Manage organisation`)).toBeVisible();
+
+ await expect(page.getByLabel('Organisation Name')).toHaveValue(organisation.name);
+
+ // Check that the organisation members table shows the correct roles
+ const ownerRow = page.getByRole('row', { name: ownerUser.email });
+
+ await expect(ownerRow).toBeVisible();
+ await expect(ownerRow.getByRole('status').filter({ hasText: 'Owner' })).toBeVisible();
+
+ await expect(page.getByRole('row', { name: memberUser.email })).toBeVisible();
+ await expect(page.getByRole('row', { name: adminMemberUser.email })).toBeVisible();
+ await expect(page.getByRole('row', { name: managerUser.email })).toBeVisible();
+
+ // Test promoting a MEMBER to owner
+ const memberRow = page.getByRole('row', { name: memberUser.email });
+
+ // Find and click the "Promote to owner" button for the member
+ const promoteButton = memberRow.getByRole('button', { name: 'Promote to owner' });
+ await expect(promoteButton).toBeVisible();
+ await expect(promoteButton).not.toBeDisabled();
+
+ await promoteButton.click();
+
+ // Verify success toast appears
+ await expect(page.getByText('Member promoted to owner successfully').first()).toBeVisible();
+
+ // Reload the page to see the changes
+ await page.reload();
+
+ // Verify that the member is now the owner
+ const newOwnerRow = page.getByRole('row', { name: memberUser.email });
+ await expect(newOwnerRow.getByRole('status').filter({ hasText: 'Owner' })).toBeVisible();
+
+ // Verify that the previous owner is no longer marked as owner
+ const previousOwnerRow = page.getByRole('row', { name: ownerUser.email });
+ await expect(previousOwnerRow.getByRole('status').filter({ hasText: 'Owner' })).not.toBeVisible();
+
+ // Verify that the promote button is now disabled for the new owner
+ const newOwnerPromoteButton = newOwnerRow.getByRole('button', { name: 'Promote to owner' });
+ await expect(newOwnerPromoteButton).toBeDisabled();
+
+ // Test that we can't promote the current owner (button should be disabled)
+ await expect(newOwnerPromoteButton).toHaveAttribute('disabled');
+});
+
+test('[ADMIN]: promote manager to owner', async ({ page }) => {
+ // Create an admin user who can access the admin panel
+ const { user: adminUser } = await seedUser({
+ isAdmin: true,
+ });
+
+ // Create an organisation with owner and manager
+ const { organisation } = await seedUser({
+ isPersonalOrganisation: false,
+ });
+
+ const managerEmail = `manager-${nanoid()}@test.documenso.com`;
+
+ const [managerUser] = await seedOrganisationMembers({
+ members: [
+ {
+ email: managerEmail,
+ name: 'Test Manager',
+ organisationRole: 'MANAGER',
+ },
+ ],
+ organisationId: organisation.id,
+ });
+
+ // Sign in as admin
+ await apiSignin({
+ page,
+ email: adminUser.email,
+ redirectPath: `/admin/organisations/${organisation.id}`,
+ });
+
+ // Promote the manager to owner
+ const managerRow = page.getByRole('row', { name: managerUser.email });
+ const promoteButton = managerRow.getByRole('button', { name: 'Promote to owner' });
+
+ await promoteButton.click();
+ await expect(page.getByText('Member promoted to owner successfully').first()).toBeVisible();
+
+ // Reload and verify the change
+ await page.reload();
+ await expect(managerRow.getByRole('status').filter({ hasText: 'Owner' })).toBeVisible();
+});
+
+test('[ADMIN]: promote admin member to owner', async ({ page }) => {
+ // Create an admin user who can access the admin panel
+ const { user: adminUser } = await seedUser({
+ isAdmin: true,
+ });
+
+ // Create an organisation with owner and admin member
+ const { organisation } = await seedUser({
+ isPersonalOrganisation: false,
+ });
+
+ const adminMemberEmail = `admin-member-${nanoid()}@test.documenso.com`;
+
+ const [adminMemberUser] = await seedOrganisationMembers({
+ members: [
+ {
+ email: adminMemberEmail,
+ name: 'Test Admin Member',
+ organisationRole: 'ADMIN',
+ },
+ ],
+ organisationId: organisation.id,
+ });
+
+ // Sign in as admin
+ await apiSignin({
+ page,
+ email: adminUser.email,
+ redirectPath: `/admin/organisations/${organisation.id}`,
+ });
+
+ // Promote the admin member to owner
+ const adminMemberRow = page.getByRole('row', { name: adminMemberUser.email });
+ const promoteButton = adminMemberRow.getByRole('button', { name: 'Promote to owner' });
+
+ await promoteButton.click();
+
+ await expect(page.getByText('Member promoted to owner successfully').first()).toBeVisible({
+ timeout: 10_000,
+ });
+
+ // Reload and verify the change
+ await page.reload();
+ await expect(adminMemberRow.getByRole('status').filter({ hasText: 'Owner' })).toBeVisible();
+});
+
+test('[ADMIN]: cannot promote non-existent user', async ({ page }) => {
+ // Create an admin user
+ const { user: adminUser } = await seedUser({
+ isAdmin: true,
+ });
+
+ // Create an organisation
+ const { organisation } = await seedUser({
+ isPersonalOrganisation: false,
+ });
+
+ // Sign in as admin
+ await apiSignin({
+ page,
+ email: adminUser.email,
+ redirectPath: `/admin/organisations/${organisation.id}`,
+ });
+
+ // Try to manually call the API with invalid data - this should be handled by the UI validation
+ // In a real scenario, the promote button wouldn't be available for non-existent users
+ // But we can test that the API properly handles invalid requests
+
+ // For now, just verify that non-existent users don't show up in the members table
+ await expect(page.getByRole('row', { name: 'Non Existent User' })).not.toBeVisible();
+});
+
+test('[ADMIN]: verify role hierarchy after promotion', async ({ page }) => {
+ // Create an admin user
+ const { user: adminUser } = await seedUser({
+ isAdmin: true,
+ });
+
+ // Create organisation with a member
+ const { organisation } = await seedUser({
+ isPersonalOrganisation: false,
+ });
+
+ const memberEmail = `member-${nanoid()}@test.documenso.com`;
+
+ const [memberUser] = await seedOrganisationMembers({
+ members: [
+ {
+ email: memberEmail,
+ name: 'Test Member',
+ organisationRole: 'MEMBER',
+ },
+ ],
+ organisationId: organisation.id,
+ });
+
+ // Sign in as admin
+ await apiSignin({
+ page,
+ email: adminUser.email,
+ redirectPath: `/admin/organisations/${organisation.id}`,
+ });
+
+ // Before promotion - verify member has MEMBER role
+ let memberRow = page.getByRole('row', { name: memberUser.email });
+ await expect(memberRow).toBeVisible();
+ await expect(memberRow.getByRole('status').filter({ hasText: 'Owner' })).not.toBeVisible();
+
+ // Promote member to owner
+ const promoteButton = memberRow.getByRole('button', { name: 'Promote to owner' });
+ await promoteButton.click();
+ await expect(page.getByText('Member promoted to owner successfully').first()).toBeVisible({
+ timeout: 10_000,
+ });
+
+ // Reload page to see updated state
+ await page.reload();
+
+ // After promotion - verify member is now owner and has admin permissions
+ memberRow = page.getByRole('row', { name: memberUser.email });
+ await expect(memberRow.getByRole('status').filter({ hasText: 'Owner' })).toBeVisible();
+
+ // Verify the promote button is now disabled for the new owner
+ const newOwnerPromoteButton = memberRow.getByRole('button', { name: 'Promote to owner' });
+ await expect(newOwnerPromoteButton).toBeDisabled();
+
+ // Sign in as the newly promoted user to verify they have owner permissions
+ await apiSignin({
+ page,
+ email: memberUser.email,
+ redirectPath: `/o/${organisation.url}/settings/general`,
+ });
+
+ // Verify they can access organisation settings (owner permission)
+ await expect(page.getByText('Organisation Settings')).toBeVisible();
+ await expect(page.getByRole('button', { name: 'Delete' })).toBeVisible();
+});
+
+test('[ADMIN]: error handling for invalid organisation', async ({ page }) => {
+ // Create an admin user
+ const { user: adminUser } = await seedUser({
+ isAdmin: true,
+ });
+
+ // Sign in as admin and try to access non-existent organisation
+ await apiSignin({
+ page,
+ email: adminUser.email,
+ redirectPath: `/admin/organisations/non-existent-org-id`,
+ });
+
+ // Should show 404 error
+ await expect(page.getByRole('heading', { name: 'Organisation not found' })).toBeVisible({
+ timeout: 10_000,
+ });
+});
+
+test('[ADMIN]: multiple promotions in sequence', async ({ page }) => {
+ // Create an admin user
+ const { user: adminUser } = await seedUser({
+ isAdmin: true,
+ });
+
+ // Create organisation with multiple members
+ const { organisation } = await seedUser({
+ isPersonalOrganisation: false,
+ });
+
+ const member1Email = `member1-${nanoid()}@test.documenso.com`;
+ const member2Email = `member2-${nanoid()}@test.documenso.com`;
+
+ const [member1User, member2User] = await seedOrganisationMembers({
+ members: [
+ {
+ email: member1Email,
+ name: 'Test Member 1',
+ organisationRole: 'MEMBER',
+ },
+ {
+ email: member2Email,
+ name: 'Test Member 2',
+ organisationRole: 'MANAGER',
+ },
+ ],
+ organisationId: organisation.id,
+ });
+
+ // Sign in as admin
+ await apiSignin({
+ page,
+ email: adminUser.email,
+ redirectPath: `/admin/organisations/${organisation.id}`,
+ });
+
+ // First promotion: Member 1 becomes owner
+ let member1Row = page.getByRole('row', { name: member1User.email });
+ let promoteButton1 = member1Row.getByRole('button', { name: 'Promote to owner' });
+ await promoteButton1.click();
+ await expect(page.getByText('Member promoted to owner successfully').first()).toBeVisible({
+ timeout: 10_000,
+ });
+
+ await page.reload();
+
+ // Verify Member 1 is now owner and button is disabled
+ member1Row = page.getByRole('row', { name: member1User.email });
+ await expect(member1Row.getByRole('status').filter({ hasText: 'Owner' })).toBeVisible();
+ promoteButton1 = member1Row.getByRole('button', { name: 'Promote to owner' });
+ await expect(promoteButton1).toBeDisabled();
+
+ // Second promotion: Member 2 becomes the new owner
+ const member2Row = page.getByRole('row', { name: member2User.email });
+ const promoteButton2 = member2Row.getByRole('button', { name: 'Promote to owner' });
+ await expect(promoteButton2).not.toBeDisabled();
+ await promoteButton2.click();
+ await expect(page.getByText('Member promoted to owner successfully').first()).toBeVisible({
+ timeout: 10_000,
+ });
+
+ await page.reload();
+
+ // Verify Member 2 is now owner and Member 1 is no longer owner
+ await expect(member2Row.getByRole('status').filter({ hasText: 'Owner' })).toBeVisible();
+ await expect(member1Row.getByRole('status').filter({ hasText: 'Owner' })).not.toBeVisible();
+
+ // Verify Member 1's promote button is now enabled again
+ const newPromoteButton1 = member1Row.getByRole('button', { name: 'Promote to owner' });
+ await expect(newPromoteButton1).not.toBeDisabled();
+});
+
+test('[ADMIN]: verify organisation access after ownership change', async ({ page }) => {
+ // Create admin user
+ const { user: adminUser } = await seedUser({
+ isAdmin: true,
+ });
+
+ // Create organisation with owner and member
+ const { user: originalOwner, organisation } = await seedUser({
+ isPersonalOrganisation: false,
+ });
+
+ const memberEmail = `member-${nanoid()}@test.documenso.com`;
+
+ const [memberUser] = await seedOrganisationMembers({
+ members: [
+ {
+ email: memberEmail,
+ name: 'Test Member',
+ organisationRole: 'MEMBER',
+ },
+ ],
+ organisationId: organisation.id,
+ });
+
+ // Sign in as admin and promote member to owner
+ await apiSignin({
+ page,
+ email: adminUser.email,
+ redirectPath: `/admin/organisations/${organisation.id}`,
+ });
+
+ const memberRow = page.getByRole('row', { name: memberUser.email });
+ const promoteButton = memberRow.getByRole('button', { name: 'Promote to owner' });
+ await promoteButton.click();
+ await expect(page.getByText('Member promoted to owner successfully').first()).toBeVisible({
+ timeout: 10_000,
+ });
+
+ // Test that the new owner can access organisation settings
+ await apiSignin({
+ page,
+ email: memberUser.email,
+ redirectPath: `/o/${organisation.url}/settings/general`,
+ });
+
+ // Should be able to access organisation settings
+ await expect(page.getByText('Organisation Settings')).toBeVisible();
+ await expect(page.getByLabel('Organisation Name*')).toBeVisible();
+ await expect(page.getByRole('button', { name: 'Update organisation' })).toBeVisible();
+
+ // Should have delete permissions
+ await expect(page.getByRole('button', { name: 'Delete' })).toBeVisible();
+
+ // Test that the original owner no longer has owner-level access
+ await apiSignin({
+ page,
+ email: originalOwner.email,
+ redirectPath: `/o/${organisation.url}/settings/general`,
+ });
+
+ // Should still be able to access settings (as they should now be an admin)
+ await expect(page.getByText('Organisation Settings')).toBeVisible();
+});
diff --git a/packages/app-tests/e2e/document-flow/autosave-fields-step.spec.ts b/packages/app-tests/e2e/document-flow/autosave-fields-step.spec.ts
index 247f87319..73859de20 100644
--- a/packages/app-tests/e2e/document-flow/autosave-fields-step.spec.ts
+++ b/packages/app-tests/e2e/document-flow/autosave-fields-step.spec.ts
@@ -33,7 +33,7 @@ const setupDocumentAndNavigateToFieldsStep = async (page: Page) => {
};
const triggerAutosave = async (page: Page) => {
- await page.locator('#document-flow-form-container').click();
+ await page.locator('body').click({ position: { x: 0, y: 0 } });
await page.locator('#document-flow-form-container').blur();
await page.waitForTimeout(5000);
@@ -70,7 +70,7 @@ test.describe('AutoSave Fields Step', () => {
await triggerAutosave(page);
- await page.getByRole('combobox').click();
+ await page.getByRole('combobox').first().click();
await page.getByRole('option', { name: 'Recipient 2 (recipient2@documenso.com)' }).click();
await page.getByRole('button', { name: 'Signature' }).click();
@@ -127,7 +127,7 @@ test.describe('AutoSave Fields Step', () => {
await triggerAutosave(page);
- await page.getByRole('combobox').click();
+ await page.getByRole('combobox').first().click();
await page.getByRole('option', { name: 'Recipient 2 (recipient2@documenso.com)' }).click();
await page.getByRole('button', { name: 'Signature' }).click();
@@ -140,7 +140,7 @@ test.describe('AutoSave Fields Step', () => {
await triggerAutosave(page);
- await page.getByRole('combobox').click();
+ await page.getByRole('combobox').first().click();
await page.getByRole('option', { name: 'Recipient 1 (recipient1@documenso.com)' }).click();
await page.getByText('Text').nth(1).click();
@@ -191,7 +191,7 @@ test.describe('AutoSave Fields Step', () => {
await triggerAutosave(page);
- await page.getByRole('combobox').click();
+ await page.getByRole('combobox').first().click();
await page.getByRole('option', { name: 'Recipient 2 (recipient2@documenso.com)' }).click();
await page.getByRole('button', { name: 'Signature' }).click();
@@ -204,7 +204,7 @@ test.describe('AutoSave Fields Step', () => {
await triggerAutosave(page);
- await page.getByRole('combobox').click();
+ await page.getByRole('combobox').first().click();
await page.getByRole('option', { name: 'Recipient 1 (recipient1@documenso.com)' }).click();
await page.getByText('Signature').nth(1).click();
diff --git a/packages/app-tests/e2e/document-flow/autosave-settings-step.spec.ts b/packages/app-tests/e2e/document-flow/autosave-settings-step.spec.ts
index e34f2c104..bd999b79b 100644
--- a/packages/app-tests/e2e/document-flow/autosave-settings-step.spec.ts
+++ b/packages/app-tests/e2e/document-flow/autosave-settings-step.spec.ts
@@ -24,7 +24,7 @@ const setupDocument = async (page: Page) => {
};
const triggerAutosave = async (page: Page) => {
- await page.locator('#document-flow-form-container').click();
+ await page.locator('body').click({ position: { x: 0, y: 0 } });
await page.locator('#document-flow-form-container').blur();
await page.waitForTimeout(5000);
diff --git a/packages/app-tests/e2e/document-flow/autosave-signers-step.spec.ts b/packages/app-tests/e2e/document-flow/autosave-signers-step.spec.ts
index e4d255750..49836bfb7 100644
--- a/packages/app-tests/e2e/document-flow/autosave-signers-step.spec.ts
+++ b/packages/app-tests/e2e/document-flow/autosave-signers-step.spec.ts
@@ -26,7 +26,7 @@ const setupDocumentAndNavigateToSignersStep = async (page: Page) => {
};
const triggerAutosave = async (page: Page) => {
- await page.locator('#document-flow-form-container').click();
+ await page.locator('body').click({ position: { x: 0, y: 0 } });
await page.locator('#document-flow-form-container').blur();
await page.waitForTimeout(5000);
@@ -92,7 +92,7 @@ test.describe('AutoSave Signers Step', () => {
await triggerAutosave(page);
- await page.getByRole('combobox').click();
+ await page.getByRole('combobox').first().click();
await page.getByRole('option', { name: 'Receives copy' }).click();
await triggerAutosave(page);
@@ -160,9 +160,20 @@ test.describe('AutoSave Signers Step', () => {
expect(retrievedDocumentData.documentMeta?.signingOrder).toBe('SEQUENTIAL');
expect(retrievedDocumentData.documentMeta?.allowDictateNextSigner).toBe(true);
expect(retrievedRecipients.length).toBe(3);
- expect(retrievedRecipients[0].signingOrder).toBe(2);
- expect(retrievedRecipients[1].signingOrder).toBe(3);
- expect(retrievedRecipients[2].signingOrder).toBe(1);
+
+ const firstRecipient = retrievedRecipients.find(
+ (r) => r.email === 'recipient1@documenso.com',
+ );
+ const secondRecipient = retrievedRecipients.find(
+ (r) => r.email === 'recipient2@documenso.com',
+ );
+ const thirdRecipient = retrievedRecipients.find(
+ (r) => r.email === 'recipient3@documenso.com',
+ );
+
+ expect(firstRecipient?.signingOrder).toBe(2);
+ expect(secondRecipient?.signingOrder).toBe(3);
+ expect(thirdRecipient?.signingOrder).toBe(1);
}).toPass();
});
});
diff --git a/packages/app-tests/e2e/document-flow/autosave-subject-step.spec.ts b/packages/app-tests/e2e/document-flow/autosave-subject-step.spec.ts
index 270a31d8e..3ba3ee5d9 100644
--- a/packages/app-tests/e2e/document-flow/autosave-subject-step.spec.ts
+++ b/packages/app-tests/e2e/document-flow/autosave-subject-step.spec.ts
@@ -42,7 +42,7 @@ export const setupDocumentAndNavigateToSubjectStep = async (page: Page) => {
};
export const triggerAutosave = async (page: Page) => {
- await page.locator('#document-flow-form-container').click();
+ await page.locator('body').click({ position: { x: 0, y: 0 } });
await page.locator('#document-flow-form-container').blur();
await page.waitForTimeout(5000);
diff --git a/packages/app-tests/e2e/document-flow/duplicate-recipients-simple.spec.ts b/packages/app-tests/e2e/document-flow/duplicate-recipients-simple.spec.ts
new file mode 100644
index 000000000..02674af1d
--- /dev/null
+++ b/packages/app-tests/e2e/document-flow/duplicate-recipients-simple.spec.ts
@@ -0,0 +1,56 @@
+import { expect, test } from '@playwright/test';
+
+import { seedBlankDocument } from '@documenso/prisma/seed/documents';
+import { seedUser } from '@documenso/prisma/seed/users';
+
+import { apiSignin } from '../fixtures/authentication';
+
+test('[DOCUMENT_FLOW]: Simple duplicate recipients test', async ({ page }) => {
+ const { user, team } = await seedUser();
+ const document = await seedBlankDocument(user, team.id);
+
+ await apiSignin({
+ page,
+ email: user.email,
+ redirectPath: `/t/${team.url}/documents/${document.id}/edit`,
+ });
+
+ // Step 1: Settings - Continue with defaults
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Add Signers' })).toBeVisible();
+
+ // Step 2: Add duplicate recipients
+ await page.getByPlaceholder('Email').fill('duplicate@example.com');
+ await page.getByPlaceholder('Name').fill('Duplicate 1');
+
+ await page.getByRole('button', { name: 'Add Signer' }).click();
+ await page.getByLabel('Email').nth(1).fill('duplicate@example.com');
+ await page.getByLabel('Name').nth(1).fill('Duplicate 2');
+
+ // Continue to fields
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Add Fields' })).toBeVisible();
+
+ // Step 3: Add fields
+ await page.getByRole('button', { name: 'Signature' }).click();
+ await page.locator('canvas').click({ position: { x: 100, y: 100 } });
+
+ await page.getByRole('combobox').first().click();
+
+ // Switch to second duplicate and add field
+ await page.getByText('Duplicate 2 (duplicate@example.com)').first().click();
+ await page.getByRole('button', { name: 'Signature' }).click();
+ await page.locator('canvas').click({ position: { x: 200, y: 100 } });
+
+ // Continue to send
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Distribute Document' })).toBeVisible();
+
+ // Send document
+ await page.waitForTimeout(2500);
+ await page.getByRole('button', { name: 'Send' }).click();
+
+ await page.waitForURL(new RegExp(`/t/${team.url}/documents/\\d+`));
+
+ await expect(page.getByRole('link', { name: document.title })).toBeVisible();
+});
diff --git a/packages/app-tests/e2e/document-flow/duplicate-recipients.spec.ts b/packages/app-tests/e2e/document-flow/duplicate-recipients.spec.ts
new file mode 100644
index 000000000..0f23d6ac7
--- /dev/null
+++ b/packages/app-tests/e2e/document-flow/duplicate-recipients.spec.ts
@@ -0,0 +1,355 @@
+import { type Page, expect, test } from '@playwright/test';
+import type { Document, Team } from '@prisma/client';
+
+import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer';
+import { prisma } from '@documenso/prisma';
+import { seedBlankDocument } from '@documenso/prisma/seed/documents';
+import { seedUser } from '@documenso/prisma/seed/users';
+
+import { apiSignin } from '../fixtures/authentication';
+import { signSignaturePad } from '../fixtures/signature';
+
+/**
+ * Test helper to complete the document creation flow with duplicate recipients
+ */
+const completeDocumentFlowWithDuplicateRecipients = async (options: {
+ page: Page;
+ team: Team;
+ document: Document;
+}) => {
+ const { page, team, document } = options;
+
+ // Step 1: Settings - Continue with defaults
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Add Signers' })).toBeVisible();
+
+ // Step 2: Add duplicate recipients
+ await page.getByPlaceholder('Email').fill('duplicate@example.com');
+ await page.getByPlaceholder('Name').fill('Duplicate Recipient 1');
+
+ // Add second signer with same email
+ await page.getByRole('button', { name: 'Add Signer' }).click();
+ await page.getByLabel('Email').nth(1).fill('duplicate@example.com');
+ await page.getByLabel('Name').nth(1).fill('Duplicate Recipient 2');
+
+ // Add third signer with different email for comparison
+ await page.getByRole('button', { name: 'Add Signer' }).click();
+ await page.getByLabel('Email').nth(2).fill('unique@example.com');
+ await page.getByLabel('Name').nth(2).fill('Unique Recipient');
+
+ // Continue to fields
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Add Fields' })).toBeVisible();
+
+ // Step 3: Add fields for each recipient
+ // Add signature field for first duplicate recipient
+ await page.getByRole('button', { name: 'Signature' }).click();
+ await page.locator('canvas').click({ position: { x: 100, y: 100 } });
+
+ await page.getByText('Duplicate Recipient 1 (duplicate@example.com)').click();
+
+ // Switch to second duplicate recipient and add their field
+ await page.getByText('Duplicate Recipient 2 (duplicate@example.com)').click();
+ await page.getByRole('button', { name: 'Signature' }).click();
+ await page.locator('canvas').click({ position: { x: 200, y: 100 } });
+
+ await page.getByText('Duplicate Recipient 2 (duplicate@example.com)').click();
+
+ // Switch to unique recipient and add their field
+ await page.getByText('Unique Recipient (unique@example.com)').click();
+ await page.getByRole('button', { name: 'Signature' }).click();
+ await page.locator('canvas').click({ position: { x: 300, y: 100 } });
+
+ // Continue to subject
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Distribute Document' })).toBeVisible();
+
+ // Step 4: Complete with subject and send
+ await page.waitForTimeout(2500);
+ await page.getByRole('button', { name: 'Send' }).click();
+
+ // Wait for send confirmation
+ await page.waitForURL(new RegExp(`/t/${team.url}/documents/\\d+`));
+
+ await expect(page.getByRole('link', { name: document.title })).toBeVisible();
+};
+
+test.describe('[DOCUMENT_FLOW]: Duplicate Recipients', () => {
+ test('should allow creating document with duplicate recipient emails', async ({ page }) => {
+ const { user, team } = await seedUser();
+
+ const document = await seedBlankDocument(user, team.id);
+
+ await apiSignin({
+ page,
+ email: user.email,
+ redirectPath: `/t/${team.url}/documents/${document.id}/edit`,
+ });
+
+ // Complete the flow
+ await completeDocumentFlowWithDuplicateRecipients({
+ page,
+ team,
+ document,
+ });
+
+ // Verify document was created successfully
+ await expect(page).toHaveURL(new RegExp(`/t/${team.url}/documents`));
+ });
+
+ test('should allow adding duplicate recipient after saving document initially', async ({
+ page,
+ }) => {
+ const { user, team } = await seedUser();
+ const document = await seedBlankDocument(user, team.id);
+
+ await apiSignin({
+ page,
+ email: user.email,
+ redirectPath: `/t/${team.url}/documents/${document.id}/edit`,
+ });
+
+ // Step 1: Settings - Continue with defaults
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Add Signers' })).toBeVisible();
+
+ // Step 2: Add initial recipient
+ await page.getByPlaceholder('Email').fill('test@example.com');
+ await page.getByPlaceholder('Name').fill('Test Recipient');
+
+ // Continue to fields and add a field
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Add Fields' })).toBeVisible();
+
+ await page.getByRole('button', { name: 'Signature' }).click();
+ await page.locator('canvas').click({ position: { x: 100, y: 100 } });
+
+ // Save the document by going to subject
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Distribute Document' })).toBeVisible();
+
+ // Navigate back to signers to add duplicate
+ await page.getByRole('button', { name: 'Go Back' }).click();
+ await page.getByRole('button', { name: 'Go Back' }).click();
+ await expect(page.getByRole('heading', { name: 'Add Signers' })).toBeVisible();
+
+ // Add duplicate recipient
+ await page.getByRole('button', { name: 'Add Signer' }).click();
+ await page.getByLabel('Email').nth(1).fill('test@example.com');
+ await page.getByLabel('Name').nth(1).fill('Test Recipient Duplicate');
+
+ // Continue and add field for duplicate
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Add Fields' })).toBeVisible();
+
+ await page.waitForTimeout(1000);
+
+ // Switch to duplicate recipient and add field
+ await page.getByRole('combobox').first().click();
+ await page.getByText('Test Recipient Duplicate (test@example.com)').first().click();
+
+ await page.getByRole('button', { name: 'Signature' }).click();
+ await page.locator('canvas').click({ position: { x: 200, y: 100 } });
+
+ // Complete the flow
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Distribute Document' })).toBeVisible();
+ await page.waitForTimeout(2500);
+ await page.getByRole('button', { name: 'Send' }).click();
+
+ await page.waitForURL(new RegExp(`/t/${team.url}/documents/\\d+`));
+
+ await expect(page.getByRole('link', { name: document.title })).toBeVisible();
+ });
+
+ test('should isolate fields per recipient token even with duplicate emails', async ({
+ page,
+ context,
+ }) => {
+ const { user, team } = await seedUser();
+
+ const document = await seedBlankDocument(user, team.id);
+
+ await apiSignin({
+ page,
+ email: user.email,
+ redirectPath: `/t/${team.url}/documents/${document.id}/edit`,
+ });
+
+ // Complete the document flow
+ await completeDocumentFlowWithDuplicateRecipients({
+ page,
+ team,
+ document,
+ });
+
+ // Navigate to documents list and get the document
+ await expect(page).toHaveURL(new RegExp(`/t/${team.url}/documents`));
+
+ const recipients = await prisma.recipient.findMany({
+ where: {
+ documentId: document.id,
+ },
+ });
+
+ expect(recipients).toHaveLength(3);
+
+ const tokens = recipients.map((r) => r.token);
+
+ expect(new Set(tokens).size).toBe(3); // All tokens should be unique
+
+ // Test each signing experience in separate browser contexts
+ for (const recipient of recipients) {
+ // Navigate to signing URL
+ await page.goto(`/sign/${recipient.token}`, {
+ waitUntil: 'networkidle',
+ });
+
+ await page.waitForSelector(PDF_VIEWER_PAGE_SELECTOR);
+
+ // Verify only one signature field is visible for this recipient
+ expect(
+ await page.locator(`[data-field-type="SIGNATURE"]:not([data-readonly="true"])`).all(),
+ ).toHaveLength(1);
+
+ // Verify recipient name is correct
+ await expect(page.getByLabel('Full Name')).toHaveValue(recipient.name);
+
+ // Sign the document
+ await signSignaturePad(page);
+
+ await page
+ .locator('[data-field-type="SIGNATURE"]:not([data-readonly="true"])')
+ .first()
+ .click();
+
+ await page.getByRole('button', { name: 'Complete' }).click();
+ await page.getByRole('button', { name: 'Sign' }).click();
+
+ // Verify completion
+ await page.waitForURL(`/sign/${recipient?.token}/complete`);
+ await expect(page.getByText('Document Signed')).toBeVisible();
+ }
+ });
+
+ test('should handle duplicate recipient workflow with different field types', async ({
+ page,
+ }) => {
+ const { user, team } = await seedUser();
+ const document = await seedBlankDocument(user, team.id);
+
+ await apiSignin({
+ page,
+ email: user.email,
+ redirectPath: `/t/${team.url}/documents/${document.id}/edit`,
+ });
+
+ // Step 1: Settings
+ await page.getByRole('button', { name: 'Continue' }).click();
+
+ // Step 2: Add duplicate recipients with different roles
+ await page.getByPlaceholder('Email').fill('signer@example.com');
+ await page.getByPlaceholder('Name').fill('Signer Role');
+
+ await page.getByRole('button', { name: 'Add Signer' }).click();
+ await page.getByLabel('Email').nth(1).fill('signer@example.com');
+ await page.getByLabel('Name').nth(1).fill('Approver Role');
+
+ // Change second recipient role if role selector is available
+ const roleDropdown = page.getByLabel('Role').nth(1);
+
+ if (await roleDropdown.isVisible()) {
+ await roleDropdown.click();
+ await page.getByText('Approver').click();
+ }
+
+ // Step 3: Add different field types for each duplicate
+ await page.getByRole('button', { name: 'Continue' }).click();
+
+ // Add signature for first recipient
+ await page.getByRole('button', { name: 'Signature' }).click();
+ await page.locator('canvas').click({ position: { x: 100, y: 100 } });
+
+ // Add name field for second recipient
+ await page.getByRole('combobox').first().click();
+
+ await page.getByText('Approver Role (signer@example.com)').first().click();
+ await page.getByRole('button', { name: 'Name' }).click();
+ await page.locator('canvas').click({ position: { x: 200, y: 100 } });
+
+ // Add date field for second recipient
+ await page.getByRole('button', { name: 'Date' }).click();
+ await page.locator('canvas').click({ position: { x: 200, y: 150 } });
+
+ // Complete the document
+ await page.getByRole('button', { name: 'Continue' }).click();
+
+ await page.getByRole('button', { name: 'Send' }).click();
+
+ await page.waitForURL(new RegExp(`/t/${team.url}/documents/\\d+`));
+
+ await expect(page.getByRole('link', { name: document.title })).toBeVisible();
+ });
+
+ test('should preserve field assignments when editing document with duplicates', async ({
+ page,
+ }) => {
+ const { user, team } = await seedUser();
+ const document = await seedBlankDocument(user, team.id);
+
+ await apiSignin({
+ page,
+ email: user.email,
+ redirectPath: `/t/${team.url}/documents/${document.id}/edit`,
+ });
+
+ // Create document with duplicates and fields
+ await completeDocumentFlowWithDuplicateRecipients({
+ page,
+ team,
+ document,
+ });
+
+ // Navigate back to edit the document
+ await page.goto(`/t/${team.url}/documents/${document.id}/edit`);
+
+ // Go to fields step
+ await page.getByRole('button', { name: 'Continue' }).click(); // Settings
+ await page.getByRole('button', { name: 'Continue' }).click(); // Signers
+
+ // Verify fields are assigned to correct recipients
+ await expect(page.getByRole('heading', { name: 'Add Fields' })).toBeVisible();
+
+ // Click on first duplicate recipient
+ await page.getByText('Duplicate Recipient 1 (duplicate@example.com)').click();
+
+ // Verify their field is visible and can be selected
+ const firstRecipientFields = await page
+ .locator(`[data-field-type="SIGNATURE"]:not(:disabled)`)
+ .all();
+ expect(firstRecipientFields.length).toBeGreaterThan(0);
+
+ // Switch to second duplicate recipient
+ await page.getByText('Duplicate Recipient 2 (duplicate@example.com)').click();
+
+ // Verify they have their own field
+ const secondRecipientFields = await page
+ .locator(`[data-field-type="SIGNATURE"]:not(:disabled)`)
+ .all();
+ expect(secondRecipientFields.length).toBeGreaterThan(0);
+
+ // Add another field to the second duplicate
+ await page.getByRole('button', { name: 'Name' }).click();
+ await page.locator('canvas').click({ position: { x: 250, y: 150 } });
+
+ // Save changes
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Distribute Document' })).toBeVisible();
+ await page.waitForTimeout(2500);
+ await page.getByRole('button', { name: 'Send' }).click();
+
+ await page.waitForURL(new RegExp(`/t/${team.url}/documents/\\d+`));
+
+ await expect(page.getByRole('link', { name: document.title })).toBeVisible();
+ });
+});
diff --git a/packages/app-tests/e2e/document-flow/stepper-component.spec.ts b/packages/app-tests/e2e/document-flow/stepper-component.spec.ts
index 1e1a70288..06251175e 100644
--- a/packages/app-tests/e2e/document-flow/stepper-component.spec.ts
+++ b/packages/app-tests/e2e/document-flow/stepper-component.spec.ts
@@ -573,6 +573,7 @@ test('[DOCUMENT_FLOW]: should be able to create and sign a document with 3 recip
y: 100 * i,
},
});
+
await page.getByText(`User ${i} (user${i}@example.com)`).click();
}
diff --git a/packages/app-tests/e2e/folders/team-account-folders.spec.ts b/packages/app-tests/e2e/folders/team-account-folders.spec.ts
index 71649be8d..281848adb 100644
--- a/packages/app-tests/e2e/folders/team-account-folders.spec.ts
+++ b/packages/app-tests/e2e/folders/team-account-folders.spec.ts
@@ -277,13 +277,13 @@ test('[TEAMS]: document folder and its contents can be deleted', async ({ page }
await page.goto(`/t/${team.url}/documents`);
- await expect(page.locator('div').filter({ hasText: folder.name })).not.toBeVisible();
+ await expect(page.locator(`[data-folder-id="${folder.id}"]`)).not.toBeVisible();
await expect(page.getByText(proposal.title)).not.toBeVisible();
await page.goto(`/t/${team.url}/documents/f/${folder.id}`);
await expect(page.getByText(report.title)).not.toBeVisible();
- await expect(page.locator('div').filter({ hasText: reportsFolder.name })).not.toBeVisible();
+ await expect(page.locator(`[data-folder-id="${reportsFolder.id}"]`)).not.toBeVisible();
});
test('[TEAMS]: create folder button is visible on templates page', async ({ page }) => {
@@ -318,9 +318,7 @@ test('[TEAMS]: can create a template folder', async ({ page }) => {
await expect(page.getByText('Team template folder')).toBeVisible();
await page.goto(`/t/${team.url}/templates`);
- await expect(
- page.locator('div').filter({ hasText: 'Team template folder' }).nth(3),
- ).toBeVisible();
+ await expect(page.locator(`[data-folder-name="Team template folder"]`)).toBeVisible();
});
test('[TEAMS]: can create a template subfolder inside a template folder', async ({ page }) => {
@@ -374,11 +372,8 @@ test('[TEAMS]: can create a template inside a template folder', async ({ page })
await page.getByRole('button', { name: 'New Template' }).click();
- await page
- .locator('div')
- .filter({ hasText: /^Upload Template DocumentDrag & drop your PDF here\.$/ })
- .nth(2)
- .click();
+ await page.getByText('Upload Template Document').click();
+
await page.locator('input[type="file"]').nth(0).waitFor({ state: 'attached' });
await page
@@ -537,7 +532,7 @@ test('[TEAMS]: template folder can be moved to another template folder', async (
await expect(page.getByText('Team Contract Templates')).toBeVisible();
});
-test('[TEAMS]: template folder and its contents can be deleted', async ({ page }) => {
+test('[TEAMS]: template folder can be deleted', async ({ page }) => {
const { team, teamOwner } = await seedTeamDocuments();
const folder = await seedBlankFolder(teamOwner, team.id, {
@@ -585,13 +580,16 @@ test('[TEAMS]: template folder and its contents can be deleted', async ({ page }
await page.goto(`/t/${team.url}/templates`);
- await expect(page.locator('div').filter({ hasText: folder.name })).not.toBeVisible();
- await expect(page.getByText(template.title)).not.toBeVisible();
+ await page.waitForTimeout(1000);
+
+ // !: This is no longer the case, when deleting a folder its contents will be moved to the root folder.
+ // await expect(page.locator(`[data-folder-id="${folder.id}"]`)).not.toBeVisible();
+ // await expect(page.getByText(template.title)).not.toBeVisible();
await page.goto(`/t/${team.url}/templates/f/${folder.id}`);
await expect(page.getByText(reportTemplate.title)).not.toBeVisible();
- await expect(page.locator('div').filter({ hasText: subfolder.name })).not.toBeVisible();
+ await expect(page.locator(`[data-folder-id="${subfolder.id}"]`)).not.toBeVisible();
});
test('[TEAMS]: can navigate between template folders', async ({ page }) => {
@@ -843,10 +841,15 @@ test('[TEAMS]: documents inherit folder visibility', async ({ page }) => {
await page.getByText('Admin Only Folder').click();
- const fileInput = page.locator('input[type="file"]').nth(1);
- await fileInput.waitFor({ state: 'attached' });
+ await page.waitForURL(new RegExp(`/t/${team.url}/documents/f/.+`));
- await fileInput.setInputFiles(
+ // Upload document.
+ const [fileChooser] = await Promise.all([
+ page.waitForEvent('filechooser'),
+ page.getByRole('button', { name: 'Upload Document' }).click(),
+ ]);
+
+ await fileChooser.setFiles(
path.join(__dirname, '../../../assets/documenso-supporter-pledge.pdf'),
);
diff --git a/packages/app-tests/e2e/organisations/organisation-team-preferences.spec.ts b/packages/app-tests/e2e/organisations/organisation-team-preferences.spec.ts
index 90cb6ae34..f577ab3e1 100644
--- a/packages/app-tests/e2e/organisations/organisation-team-preferences.spec.ts
+++ b/packages/app-tests/e2e/organisations/organisation-team-preferences.spec.ts
@@ -30,8 +30,8 @@ test('[ORGANISATIONS]: manage document preferences', async ({ page }) => {
await page.getByRole('option', { name: 'Australia/Perth' }).click();
// Set default date
- await page.getByRole('combobox').filter({ hasText: 'yyyy-MM-dd hh:mm a' }).click();
- await page.getByRole('option', { name: 'DD/MM/YYYY' }).click();
+ await page.getByRole('combobox').filter({ hasText: 'yyyy-MM-dd hh:mm AM/PM' }).click();
+ await page.getByRole('option', { name: 'DD/MM/YYYY', exact: true }).click();
await page.getByTestId('signature-types-trigger').click();
await page.getByRole('option', { name: 'Draw' }).click();
@@ -51,7 +51,7 @@ test('[ORGANISATIONS]: manage document preferences', async ({ page }) => {
expect(teamSettings.documentVisibility).toEqual(DocumentVisibility.MANAGER_AND_ABOVE);
expect(teamSettings.documentLanguage).toEqual('de');
expect(teamSettings.documentTimezone).toEqual('Australia/Perth');
- expect(teamSettings.documentDateFormat).toEqual('dd/MM/yyyy hh:mm a');
+ expect(teamSettings.documentDateFormat).toEqual('dd/MM/yyyy');
expect(teamSettings.includeSenderDetails).toEqual(false);
expect(teamSettings.includeSigningCertificate).toEqual(false);
expect(teamSettings.typedSignatureEnabled).toEqual(true);
@@ -72,7 +72,7 @@ test('[ORGANISATIONS]: manage document preferences', async ({ page }) => {
// Override team date format settings
await page.getByTestId('document-date-format-trigger').click();
- await page.getByRole('option', { name: 'MM/DD/YYYY' }).click();
+ await page.getByRole('option', { name: 'MM/DD/YYYY', exact: true }).click();
await page.getByRole('button', { name: 'Update' }).first().click();
await expect(page.getByText('Your document preferences have been updated').first()).toBeVisible();
@@ -85,7 +85,7 @@ test('[ORGANISATIONS]: manage document preferences', async ({ page }) => {
expect(updatedTeamSettings.documentVisibility).toEqual(DocumentVisibility.EVERYONE);
expect(updatedTeamSettings.documentLanguage).toEqual('pl');
expect(updatedTeamSettings.documentTimezone).toEqual('Europe/London');
- expect(updatedTeamSettings.documentDateFormat).toEqual('MM/dd/yyyy hh:mm a');
+ expect(updatedTeamSettings.documentDateFormat).toEqual('MM/dd/yyyy');
expect(updatedTeamSettings.includeSenderDetails).toEqual(false);
expect(updatedTeamSettings.includeSigningCertificate).toEqual(false);
expect(updatedTeamSettings.typedSignatureEnabled).toEqual(true);
@@ -108,7 +108,7 @@ test('[ORGANISATIONS]: manage document preferences', async ({ page }) => {
expect(documentMeta.drawSignatureEnabled).toEqual(false);
expect(documentMeta.language).toEqual('pl');
expect(documentMeta.timezone).toEqual('Europe/London');
- expect(documentMeta.dateFormat).toEqual('MM/dd/yyyy hh:mm a');
+ expect(documentMeta.dateFormat).toEqual('MM/dd/yyyy');
});
test('[ORGANISATIONS]: manage branding preferences', async ({ page }) => {
diff --git a/packages/app-tests/e2e/templates-flow/duplicate-recipients.spec.ts b/packages/app-tests/e2e/templates-flow/duplicate-recipients.spec.ts
new file mode 100644
index 000000000..98056ab82
--- /dev/null
+++ b/packages/app-tests/e2e/templates-flow/duplicate-recipients.spec.ts
@@ -0,0 +1,283 @@
+import { type Page, expect, test } from '@playwright/test';
+import type { Team, Template } from '@prisma/client';
+
+import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer';
+import { prisma } from '@documenso/prisma';
+import { seedBlankTemplate } from '@documenso/prisma/seed/templates';
+import { seedUser } from '@documenso/prisma/seed/users';
+
+import { apiSignin } from '../fixtures/authentication';
+
+/**
+ * Test helper to complete template creation with duplicate recipients
+ */
+const completeTemplateFlowWithDuplicateRecipients = async (options: {
+ page: Page;
+ team: Team;
+ template: Template;
+}) => {
+ const { page, team, template } = options;
+ // Step 1: Settings - Continue with defaults
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Add Placeholders' })).toBeVisible();
+
+ // Step 2: Add duplicate recipients with real emails for testing
+ await page.getByPlaceholder('Email').fill('duplicate@example.com');
+ await page.getByPlaceholder('Name').fill('First Instance');
+
+ // Add second signer with same email
+ await page.getByRole('button', { name: 'Add Placeholder Recipient' }).click();
+ await page.getByPlaceholder('Email').nth(1).fill('duplicate@example.com');
+ await page.getByPlaceholder('Name').nth(1).fill('Second Instance');
+
+ // Add third signer with different email
+ await page.getByRole('button', { name: 'Add Placeholder Recipient' }).click();
+ await page.getByPlaceholder('Email').nth(2).fill('unique@example.com');
+ await page.getByPlaceholder('Name').nth(2).fill('Different Recipient');
+
+ // Continue to fields
+ await page.getByRole('button', { name: 'Continue' }).click();
+ await expect(page.getByRole('heading', { name: 'Add Fields' })).toBeVisible();
+
+ // Step 3: Add fields for each recipient instance
+ // Add signature field for first instance
+ await page.getByRole('button', { name: 'Signature' }).click();
+ await page.locator('canvas').click({ position: { x: 100, y: 100 } });
+
+ // Switch to second instance and add their field
+ await page.getByRole('combobox').first().click();
+ await page.getByText('Second Instance').first().click();
+ await page.getByRole('button', { name: 'Signature' }).click();
+ await page.locator('canvas').click({ position: { x: 200, y: 100 } });
+
+ // Switch to different recipient and add their field
+ await page.getByRole('combobox').first().click();
+ await page.getByText('Different Recipient').first().click();
+ await page.getByRole('button', { name: 'Name' }).click();
+ await page.locator('canvas').click({ position: { x: 300, y: 100 } });
+
+ // Save template
+ await page.getByRole('button', { name: 'Save Template' }).click();
+
+ // Wait for creation confirmation
+ await page.waitForURL(`/t/${team.url}/templates`);
+ await expect(page.getByRole('link', { name: template.title })).toBeVisible();
+};
+
+test.describe('[TEMPLATE_FLOW]: Duplicate Recipients', () => {
+ test('should allow creating template with duplicate recipient emails', async ({ page }) => {
+ const { user, team } = await seedUser();
+
+ const template = await seedBlankTemplate(user, team.id);
+
+ await apiSignin({
+ page,
+ email: user.email,
+ redirectPath: `/t/${team.url}/templates/${template.id}/edit`,
+ });
+
+ // Complete the template flow
+ await completeTemplateFlowWithDuplicateRecipients({ page, team, template });
+
+ // Verify template was created successfully
+ await expect(page).toHaveURL(`/t/${team.url}/templates`);
+ });
+
+ test('should create document from template with duplicate recipients using same email', async ({
+ page,
+ context,
+ }) => {
+ const { user, team } = await seedUser();
+
+ const template = await seedBlankTemplate(user, team.id);
+
+ await apiSignin({
+ page,
+ email: user.email,
+ redirectPath: `/t/${team.url}/templates/${template.id}/edit`,
+ });
+
+ // Complete template creation
+ await completeTemplateFlowWithDuplicateRecipients({ page, team, template });
+
+ // Navigate to template and create document
+ await page.goto(`/t/${team.url}/templates`);
+
+ await page
+ .getByRole('row', { name: template.title })
+ .getByRole('button', { name: 'Use Template' })
+ .click();
+
+ // Fill recipient information with same email for both instances
+ await expect(page.getByRole('heading', { name: 'Create document' })).toBeVisible();
+
+ // Set same email for both recipient instances
+ const emailInputs = await page.locator('[aria-label="Email"]').all();
+ const nameInputs = await page.locator('[aria-label="Name"]').all();
+
+ // First instance
+ await emailInputs[0].fill('same@example.com');
+ await nameInputs[0].fill('John Doe - Role 1');
+
+ // Second instance (same email)
+ await emailInputs[1].fill('same@example.com');
+ await nameInputs[1].fill('John Doe - Role 2');
+
+ // Different recipient
+ await emailInputs[2].fill('different@example.com');
+ await nameInputs[2].fill('Jane Smith');
+
+ await page.getByLabel('Send document').click();
+
+ // Create document
+ await page.getByRole('button', { name: 'Create and send' }).click();
+ await page.waitForURL(new RegExp(`/t/${team.url}/documents/\\d+`));
+
+ // Get the document ID from URL for database queries
+ const url = page.url();
+ const documentIdMatch = url.match(/\/documents\/(\d+)/);
+
+ const documentId = documentIdMatch ? parseInt(documentIdMatch[1]) : null;
+
+ expect(documentId).not.toBeNull();
+
+ // Get recipients directly from database
+ const recipients = await prisma.recipient.findMany({
+ where: {
+ documentId: documentId!,
+ },
+ });
+
+ expect(recipients).toHaveLength(3);
+
+ // Verify all tokens are unique
+ const tokens = recipients.map((r) => r.token);
+ expect(new Set(tokens).size).toBe(3);
+
+ // Test signing experience for duplicate email recipients
+ const duplicateRecipients = recipients.filter((r) => r.email === 'same@example.com');
+ expect(duplicateRecipients).toHaveLength(2);
+
+ for (const recipient of duplicateRecipients) {
+ // Navigate to signing URL
+ await page.goto(`/sign/${recipient.token}`, {
+ waitUntil: 'networkidle',
+ });
+
+ await page.waitForSelector(PDF_VIEWER_PAGE_SELECTOR);
+
+ // Verify correct recipient name is shown
+ await expect(page.getByLabel('Full Name')).toHaveValue(recipient.name);
+
+ // Verify only one signature field is visible for this recipient
+ expect(
+ await page.locator(`[data-field-type="SIGNATURE"]:not([data-readonly="true"])`).all(),
+ ).toHaveLength(1);
+ }
+ });
+
+ test('should handle template with different types of duplicate emails', async ({ page }) => {
+ const { user, team } = await seedUser();
+
+ const template = await seedBlankTemplate(user, team.id);
+
+ await apiSignin({
+ page,
+ email: user.email,
+ redirectPath: `/t/${team.url}/templates/${template.id}/edit`,
+ });
+
+ // Step 1: Settings
+ await page.getByRole('button', { name: 'Continue' }).click();
+
+ // Step 2: Add multiple recipients with duplicate emails
+ await page.getByPlaceholder('Email').fill('duplicate@example.com');
+ await page.getByPlaceholder('Name').fill('Duplicate Recipient 1');
+
+ await page.getByRole('button', { name: 'Add Placeholder Recipient' }).click();
+ await page.getByPlaceholder('Email').nth(1).fill('duplicate@example.com');
+ await page.getByPlaceholder('Name').nth(1).fill('Duplicate Recipient 2');
+
+ await page.getByRole('button', { name: 'Add Placeholder Recipient' }).click();
+ await page.getByPlaceholder('Email').nth(2).fill('different@example.com');
+ await page.getByPlaceholder('Name').nth(2).fill('Different Recipient');
+
+ // Continue and add fields
+ await page.getByRole('button', { name: 'Continue' }).click();
+
+ // Add fields for each recipient
+ await page.getByRole('button', { name: 'Signature' }).click();
+ await page.locator('canvas').click({ position: { x: 100, y: 100 } });
+
+ await page.getByRole('combobox').first().click();
+ await page.getByText('Duplicate Recipient 2').first().click();
+ await page.getByRole('button', { name: 'Date' }).click();
+ await page.locator('canvas').click({ position: { x: 200, y: 100 } });
+
+ await page.getByRole('combobox').first().click();
+ await page.getByText('Different Recipient').first().click();
+ await page.getByRole('button', { name: 'Name' }).click();
+ await page.locator('canvas').click({ position: { x: 100, y: 200 } });
+
+ // Save template
+ await page.getByRole('button', { name: 'Save Template' }).click();
+
+ await page.waitForURL(`/t/${team.url}/templates`);
+
+ await expect(page.getByRole('link', { name: template.title })).toBeVisible();
+ });
+
+ test('should validate field assignments per recipient in template editing', async ({ page }) => {
+ const { user, team } = await seedUser();
+
+ const template = await seedBlankTemplate(user, team.id);
+
+ await apiSignin({
+ page,
+ email: user.email,
+ redirectPath: `/t/${team.url}/templates/${template.id}/edit`,
+ });
+
+ // Create template with duplicates
+ await completeTemplateFlowWithDuplicateRecipients({ page, team, template });
+
+ // Navigate back to edit the template
+ await page.goto(`/t/${team.url}/templates/${template.id}/edit`);
+
+ // Go to fields step
+ await page.getByRole('button', { name: 'Continue' }).click(); // Settings
+ await page.getByRole('button', { name: 'Continue' }).click(); // Signers
+
+ await expect(page.getByRole('heading', { name: 'Add Fields' })).toBeVisible();
+
+ // Verify fields are correctly assigned to each recipient instance
+ await page.getByRole('combobox').first().click();
+ await page.getByRole('option', { name: 'First Instance' }).first().click();
+ let visibleFields = await page.locator(`[data-field-type="SIGNATURE"]:not(:disabled)`).all();
+ expect(visibleFields.length).toBeGreaterThan(0);
+
+ await page.getByRole('combobox').first().click();
+ await page.getByRole('option', { name: 'Second Instance' }).first().click();
+ visibleFields = await page.locator(`[data-field-type="SIGNATURE"]:not(:disabled)`).all();
+ expect(visibleFields.length).toBeGreaterThan(0);
+
+ await page.getByRole('combobox').first().click();
+ await page.getByRole('option', { name: 'Different Recipient' }).first().click();
+ const nameFields = await page.locator(`[data-field-type="NAME"]:not(:disabled)`).all();
+ expect(nameFields.length).toBeGreaterThan(0);
+
+ // Add additional field to verify proper assignment
+ await page.getByRole('combobox').first().click();
+ await page.getByRole('option', { name: 'First Instance' }).first().click();
+ await page.getByRole('button', { name: 'Name' }).click();
+ await page.locator('canvas').click({ position: { x: 100, y: 300 } });
+
+ await page.waitForTimeout(2500);
+
+ // Save changes
+ await page.getByRole('button', { name: 'Save Template' }).click();
+
+ await page.waitForURL(`/t/${team.url}/templates`);
+ await expect(page.getByRole('link', { name: template.title })).toBeVisible();
+ });
+});
diff --git a/packages/app-tests/e2e/templates-flow/template-autosave-fields-step.spec.ts b/packages/app-tests/e2e/templates-flow/template-autosave-fields-step.spec.ts
index 5a167340a..0680d3e40 100644
--- a/packages/app-tests/e2e/templates-flow/template-autosave-fields-step.spec.ts
+++ b/packages/app-tests/e2e/templates-flow/template-autosave-fields-step.spec.ts
@@ -33,7 +33,7 @@ const setupTemplateAndNavigateToFieldsStep = async (page: Page) => {
};
const triggerAutosave = async (page: Page) => {
- await page.locator('#document-flow-form-container').click();
+ await page.locator('body').click({ position: { x: 0, y: 0 } });
await page.locator('#document-flow-form-container').blur();
await page.waitForTimeout(5000);
@@ -70,7 +70,7 @@ test.describe('AutoSave Fields Step', () => {
await triggerAutosave(page);
- await page.getByRole('combobox').click();
+ await page.getByRole('combobox').first().click();
await page.getByRole('option', { name: 'Recipient 2 (recipient2@documenso.com)' }).click();
await page.getByRole('button', { name: 'Signature' }).click();
@@ -129,7 +129,7 @@ test.describe('AutoSave Fields Step', () => {
await triggerAutosave(page);
- await page.getByRole('combobox').click();
+ await page.getByRole('combobox').first().click();
await page.getByRole('option', { name: 'Recipient 2 (recipient2@documenso.com)' }).click();
await page.getByRole('button', { name: 'Signature' }).click();
@@ -142,7 +142,7 @@ test.describe('AutoSave Fields Step', () => {
await triggerAutosave(page);
- await page.getByRole('combobox').click();
+ await page.getByRole('combobox').first().click();
await page.getByRole('option', { name: 'Recipient 1 (recipient1@documenso.com)' }).click();
await page.getByText('Text').nth(1).click();
@@ -195,7 +195,7 @@ test.describe('AutoSave Fields Step', () => {
await triggerAutosave(page);
- await page.getByRole('combobox').click();
+ await page.getByRole('combobox').first().click();
await page.getByRole('option', { name: 'Recipient 2 (recipient2@documenso.com)' }).click();
await page.getByRole('button', { name: 'Signature' }).click();
@@ -208,7 +208,7 @@ test.describe('AutoSave Fields Step', () => {
await triggerAutosave(page);
- await page.getByRole('combobox').click();
+ await page.getByRole('combobox').first().click();
await page.getByRole('option', { name: 'Recipient 1 (recipient1@documenso.com)' }).click();
await page.getByText('Signature').nth(1).click();
diff --git a/packages/app-tests/e2e/templates-flow/template-autosave-settings-step.spec.ts b/packages/app-tests/e2e/templates-flow/template-autosave-settings-step.spec.ts
index af12e7290..620fb93db 100644
--- a/packages/app-tests/e2e/templates-flow/template-autosave-settings-step.spec.ts
+++ b/packages/app-tests/e2e/templates-flow/template-autosave-settings-step.spec.ts
@@ -23,7 +23,7 @@ const setupTemplate = async (page: Page) => {
};
const triggerAutosave = async (page: Page) => {
- await page.locator('#document-flow-form-container').click();
+ await page.locator('body').click({ position: { x: 0, y: 0 } });
await page.locator('#document-flow-form-container').blur();
await page.waitForTimeout(5000);
diff --git a/packages/app-tests/e2e/templates-flow/template-autosave-signers-step.spec.ts b/packages/app-tests/e2e/templates-flow/template-autosave-signers-step.spec.ts
index f5bd07e94..943b6834f 100644
--- a/packages/app-tests/e2e/templates-flow/template-autosave-signers-step.spec.ts
+++ b/packages/app-tests/e2e/templates-flow/template-autosave-signers-step.spec.ts
@@ -26,7 +26,7 @@ const setupTemplateAndNavigateToSignersStep = async (page: Page) => {
};
const triggerAutosave = async (page: Page) => {
- await page.locator('#document-flow-form-container').click();
+ await page.locator('body').click({ position: { x: 0, y: 0 } });
await page.locator('#document-flow-form-container').blur();
await page.waitForTimeout(5000);
diff --git a/packages/app-tests/e2e/templates/create-document-from-template.spec.ts b/packages/app-tests/e2e/templates/create-document-from-template.spec.ts
index 1db744603..df5d1aa87 100644
--- a/packages/app-tests/e2e/templates/create-document-from-template.spec.ts
+++ b/packages/app-tests/e2e/templates/create-document-from-template.spec.ts
@@ -47,8 +47,8 @@ test('[TEMPLATE]: should create a document from a template', async ({ page }) =>
// Set advanced options.
await page.getByRole('button', { name: 'Advanced Options' }).click();
- await page.locator('button').filter({ hasText: 'YYYY-MM-DD HH:mm a' }).click();
- await page.getByLabel('DD/MM/YYYY').click();
+ await page.locator('button').filter({ hasText: 'YYYY-MM-DD hh:mm AM/PM' }).click();
+ await page.getByLabel('DD/MM/YYYY HH:mm', { exact: true }).click();
await page.locator('.time-zone-field').click();
await page.getByRole('option', { name: 'Etc/UTC' }).click();
@@ -96,7 +96,7 @@ test('[TEMPLATE]: should create a document from a template', async ({ page }) =>
expect(document.title).toEqual('TEMPLATE_TITLE');
expect(documentAuth.documentAuthOption.globalAccessAuth).toContain('ACCOUNT');
- expect(document.documentMeta?.dateFormat).toEqual('dd/MM/yyyy hh:mm a');
+ expect(document.documentMeta?.dateFormat).toEqual('dd/MM/yyyy HH:mm');
expect(document.documentMeta?.message).toEqual('MESSAGE');
expect(document.documentMeta?.redirectUrl).toEqual('https://documenso.com');
expect(document.documentMeta?.subject).toEqual('SUBJECT');
@@ -150,8 +150,8 @@ test('[TEMPLATE]: should create a team document from a team template', async ({
// Set advanced options.
await page.getByRole('button', { name: 'Advanced Options' }).click();
- await page.locator('button').filter({ hasText: 'YYYY-MM-DD HH:mm a' }).click();
- await page.getByLabel('DD/MM/YYYY').click();
+ await page.locator('button').filter({ hasText: 'YYYY-MM-DD hh:mm AM/PM' }).click();
+ await page.getByLabel('DD/MM/YYYY HH:mm', { exact: true }).click();
await page.locator('.time-zone-field').click();
await page.getByRole('option', { name: 'Etc/UTC' }).click();
@@ -200,7 +200,7 @@ test('[TEMPLATE]: should create a team document from a team template', async ({
expect(document.title).toEqual('TEMPLATE_TITLE');
expect(documentAuth.documentAuthOption.globalAccessAuth).toContain('ACCOUNT');
- expect(document.documentMeta?.dateFormat).toEqual('dd/MM/yyyy hh:mm a');
+ expect(document.documentMeta?.dateFormat).toEqual('dd/MM/yyyy HH:mm');
expect(document.documentMeta?.message).toEqual('MESSAGE');
expect(document.documentMeta?.redirectUrl).toEqual('https://documenso.com');
expect(document.documentMeta?.subject).toEqual('SUBJECT');
diff --git a/packages/app-tests/playwright.config.ts b/packages/app-tests/playwright.config.ts
index 3536e340d..53a4aa51a 100644
--- a/packages/app-tests/playwright.config.ts
+++ b/packages/app-tests/playwright.config.ts
@@ -17,7 +17,7 @@ export default defineConfig({
testDir: './e2e',
/* Run tests in files in parallel */
fullyParallel: false,
- workers: 4,
+ workers: 2,
maxFailures: process.env.CI ? 1 : undefined,
/* Fail the build on CI if you accidentally left test.only in the source code. */
forbidOnly: !!process.env.CI,
@@ -33,7 +33,7 @@ export default defineConfig({
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: 'on',
- video: 'retain-on-failure',
+ video: 'on-first-retry',
/* Add explicit timeouts for actions */
actionTimeout: 15_000,
@@ -48,7 +48,7 @@ export default defineConfig({
name: 'chromium',
use: {
...devices['Desktop Chrome'],
- viewport: { width: 1920, height: 1080 },
+ viewport: { width: 1920, height: 1200 },
},
},
diff --git a/packages/auth/server/lib/utils/handle-oauth-authorize-url.ts b/packages/auth/server/lib/utils/handle-oauth-authorize-url.ts
index 6c2df1a07..d0fa72d1d 100644
--- a/packages/auth/server/lib/utils/handle-oauth-authorize-url.ts
+++ b/packages/auth/server/lib/utils/handle-oauth-authorize-url.ts
@@ -23,12 +23,17 @@ type HandleOAuthAuthorizeUrlOptions = {
* Optional redirect path to redirect the user somewhere on the app after authorization.
*/
redirectPath?: string;
+
+ /**
+ * Optional prompt to pass to the authorization endpoint.
+ */
+ prompt?: 'login' | 'consent' | 'select_account';
};
const oauthCookieMaxAge = 60 * 10; // 10 minutes.
export const handleOAuthAuthorizeUrl = async (options: HandleOAuthAuthorizeUrlOptions) => {
- const { c, clientOptions, redirectPath } = options;
+ const { c, clientOptions, redirectPath, prompt = 'login' } = options;
if (!clientOptions.clientId || !clientOptions.clientSecret) {
throw new AppError(AppErrorCode.NOT_SETUP);
@@ -57,8 +62,8 @@ export const handleOAuthAuthorizeUrl = async (options: HandleOAuthAuthorizeUrlOp
scopes,
);
- // Allow user to select account during login.
- url.searchParams.append('prompt', 'login');
+ // Pass the prompt to the authorization endpoint.
+ url.searchParams.append('prompt', prompt);
setCookie(c, `${clientOptions.id}_oauth_state`, state, {
...sessionCookieOptions,
diff --git a/packages/auth/server/routes/oauth.ts b/packages/auth/server/routes/oauth.ts
index 4a8346ba9..9ac0f89fc 100644
--- a/packages/auth/server/routes/oauth.ts
+++ b/packages/auth/server/routes/oauth.ts
@@ -50,5 +50,6 @@ export const oauthRoute = new Hono()
return await handleOAuthAuthorizeUrl({
c,
clientOptions,
+ prompt: 'select_account',
});
});
diff --git a/packages/email/template-components/template-access-auth-2fa.tsx b/packages/email/template-components/template-access-auth-2fa.tsx
new file mode 100644
index 000000000..edaa4df7e
--- /dev/null
+++ b/packages/email/template-components/template-access-auth-2fa.tsx
@@ -0,0 +1,60 @@
+import { Trans } from '@lingui/react/macro';
+
+import { Heading, Img, Section, Text } from '../components';
+
+export type TemplateAccessAuth2FAProps = {
+ documentTitle: string;
+ code: string;
+ userEmail: string;
+ userName: string;
+ expiresInMinutes: number;
+ assetBaseUrl?: string;
+};
+
+export const TemplateAccessAuth2FA = ({
+ documentTitle,
+ code,
+ userName,
+ expiresInMinutes,
+ assetBaseUrl = 'http://localhost:3002',
+}: TemplateAccessAuth2FAProps) => {
+ const getAssetUrl = (path: string) => {
+ return new URL(path, assetBaseUrl).toString();
+ };
+
+ return (
+
+
+
+
+
+ Verification Code Required
+
+
+
+
+ Hi {userName}, you need to enter a verification code to complete the document "
+ {documentTitle}".
+
+
+
+
+
+ Your verification code:
+
+ {code}
+
+
+
+ This code will expire in {expiresInMinutes} minutes.
+
+
+
+
+ If you didn't request this verification code, you can safely ignore this email.
+
+
+
+
+ );
+};
diff --git a/packages/email/template-components/template-document-invite.tsx b/packages/email/template-components/template-document-invite.tsx
index 2c52bf441..5fec7e624 100644
--- a/packages/email/template-components/template-document-invite.tsx
+++ b/packages/email/template-components/template-document-invite.tsx
@@ -1,5 +1,3 @@
-import { useMemo } from 'react';
-
import { useLingui } from '@lingui/react';
import { Trans } from '@lingui/react/macro';
import { OrganisationType, RecipientRole } from '@prisma/client';
@@ -38,12 +36,6 @@ export const TemplateDocumentInvite = ({
const { actionVerb } = RECIPIENT_ROLES_DESCRIPTION[role];
- const rejectDocumentLink = useMemo(() => {
- const url = new URL(signDocumentLink);
- url.searchParams.set('reject', 'true');
- return url.toString();
- }, [signDocumentLink]);
-
return (
<>
@@ -99,22 +91,15 @@ export const TemplateDocumentInvite = ({
- Reject Document
-
-
-
{match(role)
- .with(RecipientRole.SIGNER, () => Sign Document )
+ .with(RecipientRole.SIGNER, () => View Document to sign )
.with(RecipientRole.VIEWER, () => View Document )
- .with(RecipientRole.APPROVER, () => Approve Document )
+ .with(RecipientRole.APPROVER, () => View Document to approve )
.with(RecipientRole.CC, () => '')
- .with(RecipientRole.ASSISTANT, () => Assist Document )
+ .with(RecipientRole.ASSISTANT, () => View Document to assist )
.exhaustive()}
diff --git a/packages/email/templates/access-auth-2fa.tsx b/packages/email/templates/access-auth-2fa.tsx
new file mode 100644
index 000000000..a635da3cb
--- /dev/null
+++ b/packages/email/templates/access-auth-2fa.tsx
@@ -0,0 +1,77 @@
+import { msg } from '@lingui/core/macro';
+import { useLingui } from '@lingui/react';
+
+import { Body, Container, Head, Html, Img, Preview, Section } from '../components';
+import { useBranding } from '../providers/branding';
+import { TemplateAccessAuth2FA } from '../template-components/template-access-auth-2fa';
+import { TemplateFooter } from '../template-components/template-footer';
+
+export type AccessAuth2FAEmailTemplateProps = {
+ documentTitle: string;
+ code: string;
+ userEmail: string;
+ userName: string;
+ expiresInMinutes: number;
+ assetBaseUrl?: string;
+};
+
+export const AccessAuth2FAEmailTemplate = ({
+ documentTitle,
+ code,
+ userEmail,
+ userName,
+ expiresInMinutes,
+ assetBaseUrl = 'http://localhost:3002',
+}: AccessAuth2FAEmailTemplateProps) => {
+ const { _ } = useLingui();
+
+ const branding = useBranding();
+
+ const previewText = msg`Your verification code is ${code}`;
+
+ const getAssetUrl = (path: string) => {
+ return new URL(path, assetBaseUrl).toString();
+ };
+
+ return (
+
+
+ {_(previewText)}
+
+
+
+
+
+ {branding.brandingEnabled && branding.brandingLogo ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default AccessAuth2FAEmailTemplate;
diff --git a/packages/lib/client-only/hooks/use-autosave.ts b/packages/lib/client-only/hooks/use-autosave.ts
index 5c9b3db62..025c285d5 100644
--- a/packages/lib/client-only/hooks/use-autosave.ts
+++ b/packages/lib/client-only/hooks/use-autosave.ts
@@ -1,23 +1,56 @@
import { useCallback, useEffect, useRef } from 'react';
-export const useAutoSave = (onSave: (data: T) => Promise) => {
- const saveTimeoutRef = useRef();
+type SaveRequest = {
+ data: T;
+ onResponse?: (response: R) => void;
+};
- const saveFormData = async (data: T) => {
- try {
- await onSave(data);
- } catch (error) {
- console.error('Auto-save failed:', error);
+export const useAutoSave = (
+ onSave: (data: T) => Promise,
+ options: { delay?: number } = {},
+) => {
+ const { delay = 2000 } = options;
+
+ const saveTimeoutRef = useRef();
+ const saveQueueRef = useRef[]>([]);
+ const isProcessingRef = useRef(false);
+
+ const processQueue = async () => {
+ if (isProcessingRef.current || saveQueueRef.current.length === 0) {
+ return;
}
+
+ isProcessingRef.current = true;
+
+ while (saveQueueRef.current.length > 0) {
+ const request = saveQueueRef.current.shift()!;
+
+ try {
+ const response = await onSave(request.data);
+ request.onResponse?.(response);
+ } catch (error) {
+ console.error('Auto-save failed:', error);
+ }
+ }
+
+ isProcessingRef.current = false;
};
- const scheduleSave = useCallback((data: T) => {
- if (saveTimeoutRef.current) {
- clearTimeout(saveTimeoutRef.current);
- }
+ const saveFormData = async (data: T, onResponse?: (response: R) => void) => {
+ saveQueueRef.current.push({ data, onResponse });
+ await processQueue();
+ };
- saveTimeoutRef.current = setTimeout(() => void saveFormData(data), 2000);
- }, []);
+ const scheduleSave = useCallback(
+ (data: T, onResponse?: (response: R) => void) => {
+ if (saveTimeoutRef.current) {
+ clearTimeout(saveTimeoutRef.current);
+ }
+
+ saveTimeoutRef.current = setTimeout(() => void saveFormData(data, onResponse), delay);
+ },
+ [delay],
+ );
useEffect(() => {
return () => {
diff --git a/packages/lib/constants/date-formats.ts b/packages/lib/constants/date-formats.ts
index 95a254705..1f9b75929 100644
--- a/packages/lib/constants/date-formats.ts
+++ b/packages/lib/constants/date-formats.ts
@@ -7,14 +7,25 @@ export const DEFAULT_DOCUMENT_DATE_FORMAT = 'yyyy-MM-dd hh:mm a';
export const VALID_DATE_FORMAT_VALUES = [
DEFAULT_DOCUMENT_DATE_FORMAT,
'yyyy-MM-dd',
+ 'dd/MM/yyyy',
+ 'MM/dd/yyyy',
+ 'yy-MM-dd',
+ 'MMMM dd, yyyy',
+ 'EEEE, MMMM dd, yyyy',
'dd/MM/yyyy hh:mm a',
+ 'dd/MM/yyyy HH:mm',
'MM/dd/yyyy hh:mm a',
+ 'MM/dd/yyyy HH:mm',
+ 'dd.MM.yyyy',
'dd.MM.yyyy HH:mm',
'yyyy-MM-dd HH:mm',
'yy-MM-dd hh:mm a',
+ 'yy-MM-dd HH:mm',
'yyyy-MM-dd HH:mm:ss',
'MMMM dd, yyyy hh:mm a',
+ 'MMMM dd, yyyy HH:mm',
'EEEE, MMMM dd, yyyy hh:mm a',
+ 'EEEE, MMMM dd, yyyy HH:mm',
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX",
] as const;
@@ -22,10 +33,80 @@ export type ValidDateFormat = (typeof VALID_DATE_FORMAT_VALUES)[number];
export const DATE_FORMATS = [
{
- key: 'yyyy-MM-dd_hh:mm_a',
- label: 'YYYY-MM-DD HH:mm a',
+ key: 'yyyy-MM-dd_HH:mm_12H',
+ label: 'YYYY-MM-DD hh:mm AM/PM',
value: DEFAULT_DOCUMENT_DATE_FORMAT,
},
+ {
+ key: 'yyyy-MM-dd_HH:mm',
+ label: 'YYYY-MM-DD HH:mm',
+ value: 'yyyy-MM-dd HH:mm',
+ },
+ {
+ key: 'DDMMYYYY_TIME',
+ label: 'DD/MM/YYYY HH:mm',
+ value: 'dd/MM/yyyy HH:mm',
+ },
+ {
+ key: 'DDMMYYYY_TIME_12H',
+ label: 'DD/MM/YYYY HH:mm AM/PM',
+ value: 'dd/MM/yyyy hh:mm a',
+ },
+ {
+ key: 'MMDDYYYY_TIME',
+ label: 'MM/DD/YYYY HH:mm',
+ value: 'MM/dd/yyyy HH:mm',
+ },
+ {
+ key: 'MMDDYYYY_TIME_12H',
+ label: 'MM/DD/YYYY HH:mm AM/PM',
+ value: 'MM/dd/yyyy hh:mm a',
+ },
+ {
+ key: 'DDMMYYYYHHMM',
+ label: 'DD.MM.YYYY HH:mm',
+ value: 'dd.MM.yyyy HH:mm',
+ },
+ {
+ key: 'YYMMDD_TIME',
+ label: 'YY-MM-DD HH:mm',
+ value: 'yy-MM-dd HH:mm',
+ },
+ {
+ key: 'YYMMDD_TIME_12H',
+ label: 'YY-MM-DD HH:mm AM/PM',
+ value: 'yy-MM-dd hh:mm a',
+ },
+ {
+ key: 'YYYY_MM_DD_HH_MM_SS',
+ label: 'YYYY-MM-DD HH:mm:ss',
+ value: 'yyyy-MM-dd HH:mm:ss',
+ },
+ {
+ key: 'MonthDateYear_TIME',
+ label: 'Month Date, Year HH:mm',
+ value: 'MMMM dd, yyyy HH:mm',
+ },
+ {
+ key: 'MonthDateYear_TIME_12H',
+ label: 'Month Date, Year HH:mm AM/PM',
+ value: 'MMMM dd, yyyy hh:mm a',
+ },
+ {
+ key: 'DayMonthYear_TIME',
+ label: 'Day, Month Year HH:mm',
+ value: 'EEEE, MMMM dd, yyyy HH:mm',
+ },
+ {
+ key: 'DayMonthYear_TIME_12H',
+ label: 'Day, Month Year HH:mm AM/PM',
+ value: 'EEEE, MMMM dd, yyyy hh:mm a',
+ },
+ {
+ key: 'ISO8601',
+ label: 'ISO 8601',
+ value: "yyyy-MM-dd'T'HH:mm:ss.SSSXXX",
+ },
{
key: 'YYYYMMDD',
label: 'YYYY-MM-DD',
@@ -34,47 +115,32 @@ export const DATE_FORMATS = [
{
key: 'DDMMYYYY',
label: 'DD/MM/YYYY',
- value: 'dd/MM/yyyy hh:mm a',
+ value: 'dd/MM/yyyy',
},
{
key: 'MMDDYYYY',
label: 'MM/DD/YYYY',
- value: 'MM/dd/yyyy hh:mm a',
+ value: 'MM/dd/yyyy',
},
{
- key: 'DDMMYYYYHHMM',
- label: 'DD.MM.YYYY HH:mm',
- value: 'dd.MM.yyyy HH:mm',
- },
- {
- key: 'YYYYMMDDHHmm',
- label: 'YYYY-MM-DD HH:mm',
- value: 'yyyy-MM-dd HH:mm',
+ key: 'DDMMYYYY_DOT',
+ label: 'DD.MM.YYYY',
+ value: 'dd.MM.yyyy',
},
{
key: 'YYMMDD',
label: 'YY-MM-DD',
- value: 'yy-MM-dd hh:mm a',
- },
- {
- key: 'YYYYMMDDhhmmss',
- label: 'YYYY-MM-DD HH:mm:ss',
- value: 'yyyy-MM-dd HH:mm:ss',
+ value: 'yy-MM-dd',
},
{
key: 'MonthDateYear',
label: 'Month Date, Year',
- value: 'MMMM dd, yyyy hh:mm a',
+ value: 'MMMM dd, yyyy',
},
{
key: 'DayMonthYear',
label: 'Day, Month Year',
- value: 'EEEE, MMMM dd, yyyy hh:mm a',
- },
- {
- key: 'ISO8601',
- label: 'ISO 8601',
- value: "yyyy-MM-dd'T'HH:mm:ss.SSSXXX",
+ value: 'EEEE, MMMM dd, yyyy',
},
] satisfies {
key: string;
diff --git a/packages/lib/errors/app-error.ts b/packages/lib/errors/app-error.ts
index ad78e3417..ee82bcd91 100644
--- a/packages/lib/errors/app-error.ts
+++ b/packages/lib/errors/app-error.ts
@@ -17,6 +17,7 @@ export enum AppErrorCode {
'RETRY_EXCEPTION' = 'RETRY_EXCEPTION',
'SCHEMA_FAILED' = 'SCHEMA_FAILED',
'TOO_MANY_REQUESTS' = 'TOO_MANY_REQUESTS',
+ 'TWO_FACTOR_AUTH_FAILED' = 'TWO_FACTOR_AUTH_FAILED',
}
export const genericErrorCodeToTrpcErrorCodeMap: Record =
@@ -32,6 +33,7 @@ export const genericErrorCodeToTrpcErrorCodeMap: Record {
+ if (!DOCUMENSO_ENCRYPTION_KEY) {
+ throw new Error('Missing DOCUMENSO_ENCRYPTION_KEY');
+ }
+
+ const identity = `email-2fa|v1|email:${email}|id:${documentId}`;
+
+ const secret = hmac(sha256, DOCUMENSO_ENCRYPTION_KEY, identity);
+
+ const uri = createTOTPKeyURI(ISSUER, email, secret);
+
+ return {
+ uri,
+ secret,
+ };
+};
diff --git a/packages/lib/server-only/2fa/email/generate-2fa-token-from-email.ts b/packages/lib/server-only/2fa/email/generate-2fa-token-from-email.ts
new file mode 100644
index 000000000..9e5328291
--- /dev/null
+++ b/packages/lib/server-only/2fa/email/generate-2fa-token-from-email.ts
@@ -0,0 +1,23 @@
+import { generateHOTP } from 'oslo/otp';
+
+import { generateTwoFactorCredentialsFromEmail } from './generate-2fa-credentials-from-email';
+
+export type GenerateTwoFactorTokenFromEmailOptions = {
+ documentId: number;
+ email: string;
+ period?: number;
+};
+
+export const generateTwoFactorTokenFromEmail = async ({
+ email,
+ documentId,
+ period = 30_000,
+}: GenerateTwoFactorTokenFromEmailOptions) => {
+ const { secret } = generateTwoFactorCredentialsFromEmail({ email, documentId });
+
+ const counter = Math.floor(Date.now() / period);
+
+ const token = await generateHOTP(secret, counter);
+
+ return token;
+};
diff --git a/packages/lib/server-only/2fa/email/send-2fa-token-email.ts b/packages/lib/server-only/2fa/email/send-2fa-token-email.ts
new file mode 100644
index 000000000..64e52ab5c
--- /dev/null
+++ b/packages/lib/server-only/2fa/email/send-2fa-token-email.ts
@@ -0,0 +1,124 @@
+import { createElement } from 'react';
+
+import { msg } from '@lingui/core/macro';
+
+import { mailer } from '@documenso/email/mailer';
+import { AccessAuth2FAEmailTemplate } from '@documenso/email/templates/access-auth-2fa';
+import { prisma } from '@documenso/prisma';
+
+import { getI18nInstance } from '../../../client-only/providers/i18n-server';
+import { NEXT_PUBLIC_WEBAPP_URL } from '../../../constants/app';
+import { AppError, AppErrorCode } from '../../../errors/app-error';
+import { DOCUMENT_AUDIT_LOG_TYPE } from '../../../types/document-audit-logs';
+import { createDocumentAuditLogData } from '../../../utils/document-audit-logs';
+import { renderEmailWithI18N } from '../../../utils/render-email-with-i18n';
+import { getEmailContext } from '../../email/get-email-context';
+import { TWO_FACTOR_EMAIL_EXPIRATION_MINUTES } from './constants';
+import { generateTwoFactorTokenFromEmail } from './generate-2fa-token-from-email';
+
+export type Send2FATokenEmailOptions = {
+ token: string;
+ documentId: number;
+};
+
+export const send2FATokenEmail = async ({ token, documentId }: Send2FATokenEmailOptions) => {
+ const document = await prisma.document.findFirst({
+ where: {
+ id: documentId,
+ recipients: {
+ some: {
+ token,
+ },
+ },
+ },
+ include: {
+ recipients: {
+ where: {
+ token,
+ },
+ },
+ documentMeta: true,
+ team: {
+ select: {
+ teamEmail: true,
+ name: true,
+ },
+ },
+ },
+ });
+
+ if (!document) {
+ throw new AppError(AppErrorCode.NOT_FOUND, {
+ message: 'Document not found',
+ });
+ }
+
+ const [recipient] = document.recipients;
+
+ if (!recipient) {
+ throw new AppError(AppErrorCode.NOT_FOUND, {
+ message: 'Recipient not found',
+ });
+ }
+
+ const twoFactorTokenToken = await generateTwoFactorTokenFromEmail({
+ documentId,
+ email: recipient.email,
+ });
+
+ const { branding, emailLanguage, senderEmail, replyToEmail } = await getEmailContext({
+ emailType: 'RECIPIENT',
+ source: {
+ type: 'team',
+ teamId: document.teamId,
+ },
+ meta: document.documentMeta,
+ });
+
+ const i18n = await getI18nInstance(emailLanguage);
+
+ const subject = i18n._(msg`Your two-factor authentication code`);
+
+ const template = createElement(AccessAuth2FAEmailTemplate, {
+ documentTitle: document.title,
+ userName: recipient.name,
+ userEmail: recipient.email,
+ code: twoFactorTokenToken,
+ expiresInMinutes: TWO_FACTOR_EMAIL_EXPIRATION_MINUTES,
+ assetBaseUrl: NEXT_PUBLIC_WEBAPP_URL(),
+ });
+
+ const [html, text] = await Promise.all([
+ renderEmailWithI18N(template, { lang: emailLanguage, branding }),
+ renderEmailWithI18N(template, { lang: emailLanguage, branding, plainText: true }),
+ ]);
+
+ await prisma.$transaction(
+ async (tx) => {
+ await mailer.sendMail({
+ to: {
+ address: recipient.email,
+ name: recipient.name,
+ },
+ from: senderEmail,
+ replyTo: replyToEmail,
+ subject,
+ html,
+ text,
+ });
+
+ await tx.documentAuditLog.create({
+ data: createDocumentAuditLogData({
+ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_ACCESS_AUTH_2FA_REQUESTED,
+ documentId: document.id,
+ data: {
+ recipientEmail: recipient.email,
+ recipientName: recipient.name,
+ recipientId: recipient.id,
+ },
+ }),
+ });
+ },
+ { timeout: 30_000 },
+ );
+};
diff --git a/packages/lib/server-only/2fa/email/validate-2fa-token-from-email.ts b/packages/lib/server-only/2fa/email/validate-2fa-token-from-email.ts
new file mode 100644
index 000000000..c278812ea
--- /dev/null
+++ b/packages/lib/server-only/2fa/email/validate-2fa-token-from-email.ts
@@ -0,0 +1,37 @@
+import { generateHOTP } from 'oslo/otp';
+
+import { generateTwoFactorCredentialsFromEmail } from './generate-2fa-credentials-from-email';
+
+export type ValidateTwoFactorTokenFromEmailOptions = {
+ documentId: number;
+ email: string;
+ code: string;
+ period?: number;
+ window?: number;
+};
+
+export const validateTwoFactorTokenFromEmail = async ({
+ documentId,
+ email,
+ code,
+ period = 30_000,
+ window = 1,
+}: ValidateTwoFactorTokenFromEmailOptions) => {
+ const { secret } = generateTwoFactorCredentialsFromEmail({ email, documentId });
+
+ let now = Date.now();
+
+ for (let i = 0; i < window; i++) {
+ const counter = Math.floor(now / period);
+
+ const hotp = await generateHOTP(secret, counter);
+
+ if (code === hotp) {
+ return true;
+ }
+
+ now -= period;
+ }
+
+ return false;
+};
diff --git a/packages/lib/server-only/cert/cert-status.ts b/packages/lib/server-only/cert/cert-status.ts
index cf5387dcd..ad0e336bd 100644
--- a/packages/lib/server-only/cert/cert-status.ts
+++ b/packages/lib/server-only/cert/cert-status.ts
@@ -2,18 +2,25 @@ import * as fs from 'node:fs';
import { env } from '@documenso/lib/utils/env';
-export type CertificateStatus = {
- isAvailable: boolean;
-};
+export const getCertificateStatus = () => {
+ if (env('NEXT_PRIVATE_SIGNING_TRANSPORT') !== 'local') {
+ return { isAvailable: true };
+ }
+
+ if (env('NEXT_PRIVATE_SIGNING_LOCAL_FILE_CONTENTS')) {
+ return { isAvailable: true };
+ }
-export const getCertificateStatus = (): CertificateStatus => {
const defaultPath =
env('NODE_ENV') === 'production' ? '/opt/documenso/cert.p12' : './example/cert.p12';
+
const filePath = env('NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH') || defaultPath;
try {
fs.accessSync(filePath, fs.constants.F_OK | fs.constants.R_OK);
+
const stats = fs.statSync(filePath);
+
return { isAvailable: stats.size > 0 };
} catch {
return { isAvailable: false };
diff --git a/packages/lib/server-only/document/complete-document-with-token.ts b/packages/lib/server-only/document/complete-document-with-token.ts
index 92d304c2f..b143b2645 100644
--- a/packages/lib/server-only/document/complete-document-with-token.ts
+++ b/packages/lib/server-only/document/complete-document-with-token.ts
@@ -18,7 +18,8 @@ import { prisma } from '@documenso/prisma';
import { AppError, AppErrorCode } from '../../errors/app-error';
import { jobs } from '../../jobs/client';
-import type { TRecipientActionAuth } from '../../types/document-auth';
+import type { TRecipientAccessAuth, TRecipientActionAuth } from '../../types/document-auth';
+import { DocumentAuth } from '../../types/document-auth';
import {
ZWebhookDocumentSchema,
mapDocumentToWebhookDocumentPayload,
@@ -26,6 +27,7 @@ import {
import { extractDocumentAuthMethods } from '../../utils/document-auth';
import { getIsRecipientsTurnToSign } from '../recipient/get-is-recipient-turn';
import { triggerWebhook } from '../webhooks/trigger/trigger-webhook';
+import { isRecipientAuthorized } from './is-recipient-authorized';
import { sendPendingEmail } from './send-pending-email';
export type CompleteDocumentWithTokenOptions = {
@@ -33,6 +35,7 @@ export type CompleteDocumentWithTokenOptions = {
documentId: number;
userId?: number;
authOptions?: TRecipientActionAuth;
+ accessAuthOptions?: TRecipientAccessAuth;
requestMetadata?: RequestMetadata;
nextSigner?: {
email: string;
@@ -64,6 +67,8 @@ const getDocument = async ({ token, documentId }: CompleteDocumentWithTokenOptio
export const completeDocumentWithToken = async ({
token,
documentId,
+ userId,
+ accessAuthOptions,
requestMetadata,
nextSigner,
}: CompleteDocumentWithTokenOptions) => {
@@ -111,24 +116,57 @@ export const completeDocumentWithToken = async ({
throw new Error(`Recipient ${recipient.id} has unsigned fields`);
}
- // Document reauth for completing documents is currently not required.
+ // Check ACCESS AUTH 2FA validation during document completion
+ const { derivedRecipientAccessAuth } = extractDocumentAuthMethods({
+ documentAuth: document.authOptions,
+ recipientAuth: recipient.authOptions,
+ });
- // const { derivedRecipientActionAuth } = extractDocumentAuthMethods({
- // documentAuth: document.authOptions,
- // recipientAuth: recipient.authOptions,
- // });
+ if (derivedRecipientAccessAuth.includes(DocumentAuth.TWO_FACTOR_AUTH)) {
+ if (!accessAuthOptions) {
+ throw new AppError(AppErrorCode.UNAUTHORIZED, {
+ message: 'Access authentication required',
+ });
+ }
- // const isValid = await isRecipientAuthorized({
- // type: 'ACTION',
- // document: document,
- // recipient: recipient,
- // userId,
- // authOptions,
- // });
+ const isValid = await isRecipientAuthorized({
+ type: 'ACCESS_2FA',
+ documentAuthOptions: document.authOptions,
+ recipient: recipient,
+ userId, // Can be undefined for non-account recipients
+ authOptions: accessAuthOptions,
+ });
- // if (!isValid) {
- // throw new AppError(AppErrorCode.UNAUTHORIZED, 'Invalid authentication values');
- // }
+ if (!isValid) {
+ await prisma.documentAuditLog.create({
+ data: createDocumentAuditLogData({
+ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_ACCESS_AUTH_2FA_FAILED,
+ documentId: document.id,
+ data: {
+ recipientId: recipient.id,
+ recipientName: recipient.name,
+ recipientEmail: recipient.email,
+ },
+ }),
+ });
+
+ throw new AppError(AppErrorCode.TWO_FACTOR_AUTH_FAILED, {
+ message: 'Invalid 2FA authentication',
+ });
+ }
+
+ await prisma.documentAuditLog.create({
+ data: createDocumentAuditLogData({
+ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_ACCESS_AUTH_2FA_VALIDATED,
+ documentId: document.id,
+ data: {
+ recipientId: recipient.id,
+ recipientName: recipient.name,
+ recipientEmail: recipient.email,
+ },
+ }),
+ });
+ }
await prisma.$transaction(async (tx) => {
await tx.recipient.update({
diff --git a/packages/lib/server-only/document/get-document-by-token.ts b/packages/lib/server-only/document/get-document-by-token.ts
index 4afaf1914..70269fcb4 100644
--- a/packages/lib/server-only/document/get-document-by-token.ts
+++ b/packages/lib/server-only/document/get-document-by-token.ts
@@ -92,6 +92,12 @@ export const getDocumentAndSenderByToken = async ({
select: {
name: true,
teamEmail: true,
+ teamGlobalSettings: {
+ select: {
+ brandingEnabled: true,
+ brandingLogo: true,
+ },
+ },
},
},
},
diff --git a/packages/lib/server-only/document/is-recipient-authorized.ts b/packages/lib/server-only/document/is-recipient-authorized.ts
index 873b087e1..c8d54d2a4 100644
--- a/packages/lib/server-only/document/is-recipient-authorized.ts
+++ b/packages/lib/server-only/document/is-recipient-authorized.ts
@@ -4,6 +4,7 @@ import { match } from 'ts-pattern';
import { prisma } from '@documenso/prisma';
+import { validateTwoFactorTokenFromEmail } from '../2fa/email/validate-2fa-token-from-email';
import { verifyTwoFactorAuthenticationToken } from '../2fa/verify-2fa-token';
import { verifyPassword } from '../2fa/verify-password';
import { AppError, AppErrorCode } from '../../errors/app-error';
@@ -14,9 +15,10 @@ import { getAuthenticatorOptions } from '../../utils/authenticator';
import { extractDocumentAuthMethods } from '../../utils/document-auth';
type IsRecipientAuthorizedOptions = {
- type: 'ACCESS' | 'ACTION';
+ // !: Probably find a better name than 'ACCESS_2FA' if requirements change.
+ type: 'ACCESS' | 'ACCESS_2FA' | 'ACTION';
documentAuthOptions: Document['authOptions'];
- recipient: Pick;
+ recipient: Pick;
/**
* The ID of the user who initiated the request.
@@ -61,8 +63,11 @@ export const isRecipientAuthorized = async ({
recipientAuth: recipient.authOptions,
});
- const authMethods: TDocumentAuth[] =
- type === 'ACCESS' ? derivedRecipientAccessAuth : derivedRecipientActionAuth;
+ const authMethods: TDocumentAuth[] = match(type)
+ .with('ACCESS', () => derivedRecipientAccessAuth)
+ .with('ACCESS_2FA', () => derivedRecipientAccessAuth)
+ .with('ACTION', () => derivedRecipientActionAuth)
+ .exhaustive();
// Early true return when auth is not required.
if (
@@ -72,6 +77,11 @@ export const isRecipientAuthorized = async ({
return true;
}
+ // Early true return for ACCESS auth if all methods are 2FA since validation happens in ACCESS_2FA.
+ if (type === 'ACCESS' && authMethods.every((method) => method === DocumentAuth.TWO_FACTOR_AUTH)) {
+ return true;
+ }
+
// Create auth options when none are passed for account.
if (!authOptions && authMethods.some((method) => method === DocumentAuth.ACCOUNT)) {
authOptions = {
@@ -80,12 +90,16 @@ export const isRecipientAuthorized = async ({
}
// Authentication required does not match provided method.
- if (!authOptions || !authMethods.includes(authOptions.type) || !userId) {
+ if (!authOptions || !authMethods.includes(authOptions.type)) {
return false;
}
return await match(authOptions)
.with({ type: DocumentAuth.ACCOUNT }, async () => {
+ if (!userId) {
+ return false;
+ }
+
const recipientUser = await getUserByEmail(recipient.email);
if (!recipientUser) {
@@ -95,13 +109,40 @@ export const isRecipientAuthorized = async ({
return recipientUser.id === userId;
})
.with({ type: DocumentAuth.PASSKEY }, async ({ authenticationResponse, tokenReference }) => {
+ if (!userId) {
+ return false;
+ }
+
return await isPasskeyAuthValid({
userId,
authenticationResponse,
tokenReference,
});
})
- .with({ type: DocumentAuth.TWO_FACTOR_AUTH }, async ({ token }) => {
+ .with({ type: DocumentAuth.TWO_FACTOR_AUTH }, async ({ token, method }) => {
+ if (type === 'ACCESS') {
+ return true;
+ }
+
+ if (type === 'ACCESS_2FA' && method === 'email') {
+ if (!recipient.documentId) {
+ throw new AppError(AppErrorCode.NOT_FOUND, {
+ message: 'Document ID is required for email 2FA verification',
+ });
+ }
+
+ return await validateTwoFactorTokenFromEmail({
+ documentId: recipient.documentId,
+ email: recipient.email,
+ code: token,
+ window: 10, // 5 minutes worth of tokens
+ });
+ }
+
+ if (!userId) {
+ return false;
+ }
+
const user = await prisma.user.findFirst({
where: {
id: userId,
@@ -115,6 +156,7 @@ export const isRecipientAuthorized = async ({
});
}
+ // For ACTION auth or authenticator method, use TOTP
return await verifyTwoFactorAuthenticationToken({
user,
totpCode: token,
@@ -122,6 +164,10 @@ export const isRecipientAuthorized = async ({
});
})
.with({ type: DocumentAuth.PASSWORD }, async ({ password }) => {
+ if (!userId) {
+ return false;
+ }
+
return await verifyPassword({
userId,
password,
diff --git a/packages/lib/server-only/document/search-documents-with-keyword.ts b/packages/lib/server-only/document/search-documents-with-keyword.ts
index fc9fed866..600d07df9 100644
--- a/packages/lib/server-only/document/search-documents-with-keyword.ts
+++ b/packages/lib/server-only/document/search-documents-with-keyword.ts
@@ -1,6 +1,5 @@
-import { DocumentStatus } from '@prisma/client';
import type { Document, Recipient, User } from '@prisma/client';
-import { DocumentVisibility, TeamMemberRole } from '@prisma/client';
+import { DocumentStatus, DocumentVisibility, TeamMemberRole } from '@prisma/client';
import { match } from 'ts-pattern';
import {
@@ -19,7 +18,7 @@ export type SearchDocumentsWithKeywordOptions = {
export const searchDocumentsWithKeyword = async ({
query,
userId,
- limit = 5,
+ limit = 20,
}: SearchDocumentsWithKeywordOptions) => {
const user = await prisma.user.findFirstOrThrow({
where: {
@@ -122,6 +121,7 @@ export const searchDocumentsWithKeyword = async ({
},
},
},
+ distinct: ['id'],
orderBy: {
createdAt: 'desc',
},
@@ -129,6 +129,7 @@ export const searchDocumentsWithKeyword = async ({
});
const isOwner = (document: Document, user: User) => document.userId === user.id;
+
const getSigningLink = (recipients: Recipient[], user: User) =>
`/sign/${recipients.find((r) => r.email === user.email)?.token}`;
@@ -164,7 +165,7 @@ export const searchDocumentsWithKeyword = async ({
if (isOwner(document, user)) {
documentPath = `${formatDocumentsPath(document.team?.url)}/${document.id}`;
- } else if (document.teamId && document.team) {
+ } else if (document.teamId && document.team.teamGroups.length > 0) {
documentPath = `${formatDocumentsPath(document.team.url)}/${document.id}`;
} else {
documentPath = getSigningLink(recipients, user);
diff --git a/packages/lib/server-only/document/validate-field-auth.ts b/packages/lib/server-only/document/validate-field-auth.ts
index 8dfc0ab48..cbb9bf55f 100644
--- a/packages/lib/server-only/document/validate-field-auth.ts
+++ b/packages/lib/server-only/document/validate-field-auth.ts
@@ -7,7 +7,7 @@ import { isRecipientAuthorized } from './is-recipient-authorized';
export type ValidateFieldAuthOptions = {
documentAuthOptions: Document['authOptions'];
- recipient: Pick;
+ recipient: Pick;
field: Field;
userId?: number;
authOptions?: TRecipientActionAuth;
diff --git a/packages/lib/server-only/field/set-fields-for-document.ts b/packages/lib/server-only/field/set-fields-for-document.ts
index 7ec75796a..497f01078 100644
--- a/packages/lib/server-only/field/set-fields-for-document.ts
+++ b/packages/lib/server-only/field/set-fields-for-document.ts
@@ -84,9 +84,7 @@ export const setFieldsForDocument = async ({
const linkedFields = fields.map((field) => {
const existing = existingFields.find((existingField) => existingField.id === field.id);
- const recipient = document.recipients.find(
- (recipient) => recipient.email.toLowerCase() === field.signerEmail.toLowerCase(),
- );
+ const recipient = document.recipients.find((recipient) => recipient.id === field.recipientId);
// Each field MUST have a recipient associated with it.
if (!recipient) {
@@ -226,10 +224,8 @@ export const setFieldsForDocument = async ({
},
recipient: {
connect: {
- documentId_email: {
- documentId,
- email: fieldSignerEmail,
- },
+ id: field.recipientId,
+ documentId,
},
},
},
@@ -330,6 +326,7 @@ type FieldData = {
id?: number | null;
type: FieldType;
signerEmail: string;
+ recipientId: number;
pageNumber: number;
pageX: number;
pageY: number;
diff --git a/packages/lib/server-only/field/set-fields-for-template.ts b/packages/lib/server-only/field/set-fields-for-template.ts
index 285e26e69..a116c6275 100644
--- a/packages/lib/server-only/field/set-fields-for-template.ts
+++ b/packages/lib/server-only/field/set-fields-for-template.ts
@@ -26,6 +26,7 @@ export type SetFieldsForTemplateOptions = {
id?: number | null;
type: FieldType;
signerEmail: string;
+ recipientId: number;
pageNumber: number;
pageX: number;
pageY: number;
@@ -169,10 +170,8 @@ export const setFieldsForTemplate = async ({
},
recipient: {
connect: {
- templateId_email: {
- templateId,
- email: field.signerEmail.toLowerCase(),
- },
+ id: field.recipientId,
+ templateId,
},
},
},
diff --git a/packages/lib/server-only/recipient/create-document-recipients.ts b/packages/lib/server-only/recipient/create-document-recipients.ts
index cf584a874..4baac9f1c 100644
--- a/packages/lib/server-only/recipient/create-document-recipients.ts
+++ b/packages/lib/server-only/recipient/create-document-recipients.ts
@@ -85,20 +85,6 @@ export const createDocumentRecipients = async ({
email: recipient.email.toLowerCase(),
}));
- const duplicateRecipients = normalizedRecipients.filter((newRecipient) => {
- const existingRecipient = document.recipients.find(
- (existingRecipient) => existingRecipient.email === newRecipient.email,
- );
-
- return existingRecipient !== undefined;
- });
-
- if (duplicateRecipients.length > 0) {
- throw new AppError(AppErrorCode.INVALID_REQUEST, {
- message: `Duplicate recipient(s) found for ${duplicateRecipients.map((recipient) => recipient.email).join(', ')}`,
- });
- }
-
const createdRecipients = await prisma.$transaction(async (tx) => {
return await Promise.all(
normalizedRecipients.map(async (recipient) => {
diff --git a/packages/lib/server-only/recipient/create-template-recipients.ts b/packages/lib/server-only/recipient/create-template-recipients.ts
index 34d61ef66..1621e87b7 100644
--- a/packages/lib/server-only/recipient/create-template-recipients.ts
+++ b/packages/lib/server-only/recipient/create-template-recipients.ts
@@ -71,20 +71,6 @@ export const createTemplateRecipients = async ({
email: recipient.email.toLowerCase(),
}));
- const duplicateRecipients = normalizedRecipients.filter((newRecipient) => {
- const existingRecipient = template.recipients.find(
- (existingRecipient) => existingRecipient.email === newRecipient.email,
- );
-
- return existingRecipient !== undefined;
- });
-
- if (duplicateRecipients.length > 0) {
- throw new AppError(AppErrorCode.INVALID_REQUEST, {
- message: `Duplicate recipient(s) found for ${duplicateRecipients.map((recipient) => recipient.email).join(', ')}`,
- });
- }
-
const createdRecipients = await prisma.$transaction(async (tx) => {
return await Promise.all(
normalizedRecipients.map(async (recipient) => {
diff --git a/packages/lib/server-only/recipient/set-document-recipients.ts b/packages/lib/server-only/recipient/set-document-recipients.ts
index bfdbca552..fd9ba5730 100644
--- a/packages/lib/server-only/recipient/set-document-recipients.ts
+++ b/packages/lib/server-only/recipient/set-document-recipients.ts
@@ -122,16 +122,12 @@ export const setDocumentRecipients = async ({
const removedRecipients = existingRecipients.filter(
(existingRecipient) =>
- !normalizedRecipients.find(
- (recipient) =>
- recipient.id === existingRecipient.id || recipient.email === existingRecipient.email,
- ),
+ !normalizedRecipients.find((recipient) => recipient.id === existingRecipient.id),
);
const linkedRecipients = normalizedRecipients.map((recipient) => {
const existing = existingRecipients.find(
- (existingRecipient) =>
- existingRecipient.id === recipient.id || existingRecipient.email === recipient.email,
+ (existingRecipient) => existingRecipient.id === recipient.id,
);
const canPersistedRecipientBeModified =
diff --git a/packages/lib/server-only/recipient/set-template-recipients.ts b/packages/lib/server-only/recipient/set-template-recipients.ts
index f09968585..955ff94f1 100644
--- a/packages/lib/server-only/recipient/set-template-recipients.ts
+++ b/packages/lib/server-only/recipient/set-template-recipients.ts
@@ -94,10 +94,7 @@ export const setTemplateRecipients = async ({
const removedRecipients = existingRecipients.filter(
(existingRecipient) =>
- !normalizedRecipients.find(
- (recipient) =>
- recipient.id === existingRecipient.id || recipient.email === existingRecipient.email,
- ),
+ !normalizedRecipients.find((recipient) => recipient.id === existingRecipient.id),
);
if (template.directLink !== null) {
@@ -124,8 +121,7 @@ export const setTemplateRecipients = async ({
const linkedRecipients = normalizedRecipients.map((recipient) => {
const existing = existingRecipients.find(
- (existingRecipient) =>
- existingRecipient.id === recipient.id || existingRecipient.email === recipient.email,
+ (existingRecipient) => existingRecipient.id === recipient.id,
);
return {
diff --git a/packages/lib/server-only/recipient/update-document-recipients.ts b/packages/lib/server-only/recipient/update-document-recipients.ts
index 639c968f1..6372f56a2 100644
--- a/packages/lib/server-only/recipient/update-document-recipients.ts
+++ b/packages/lib/server-only/recipient/update-document-recipients.ts
@@ -91,17 +91,6 @@ export const updateDocumentRecipients = async ({
});
}
- const duplicateRecipientWithSameEmail = document.recipients.find(
- (existingRecipient) =>
- existingRecipient.email === recipient.email && existingRecipient.id !== recipient.id,
- );
-
- if (duplicateRecipientWithSameEmail) {
- throw new AppError(AppErrorCode.INVALID_REQUEST, {
- message: `Duplicate recipient with the same email found: ${duplicateRecipientWithSameEmail.email}`,
- });
- }
-
if (!canRecipientBeModified(originalRecipient, document.fields)) {
throw new AppError(AppErrorCode.INVALID_REQUEST, {
message: 'Cannot modify a recipient who has already interacted with the document',
diff --git a/packages/lib/server-only/recipient/update-template-recipients.ts b/packages/lib/server-only/recipient/update-template-recipients.ts
index 5867e85ab..aca4520f8 100644
--- a/packages/lib/server-only/recipient/update-template-recipients.ts
+++ b/packages/lib/server-only/recipient/update-template-recipients.ts
@@ -80,17 +80,6 @@ export const updateTemplateRecipients = async ({
});
}
- const duplicateRecipientWithSameEmail = template.recipients.find(
- (existingRecipient) =>
- existingRecipient.email === recipient.email && existingRecipient.id !== recipient.id,
- );
-
- if (duplicateRecipientWithSameEmail) {
- throw new AppError(AppErrorCode.INVALID_REQUEST, {
- message: `Duplicate recipient with the same email found: ${duplicateRecipientWithSameEmail.email}`,
- });
- }
-
return {
originalRecipient,
recipientUpdateData: recipient,
diff --git a/packages/lib/server-only/template/create-document-from-direct-template.ts b/packages/lib/server-only/template/create-document-from-direct-template.ts
index a7afd8a1a..b223dd49f 100644
--- a/packages/lib/server-only/template/create-document-from-direct-template.ts
+++ b/packages/lib/server-only/template/create-document-from-direct-template.ts
@@ -159,6 +159,7 @@ export const createDocumentFromDirectTemplate = async ({
// Ensure typesafety when we add more options.
const isAccessAuthValid = match(derivedRecipientAccessAuth.at(0))
.with(DocumentAccessAuth.ACCOUNT, () => user && user?.email === directRecipientEmail)
+ .with(DocumentAccessAuth.TWO_FACTOR_AUTH, () => false) // Not supported for direct templates
.with(undefined, () => true)
.exhaustive();
@@ -205,6 +206,7 @@ export const createDocumentFromDirectTemplate = async ({
recipient: {
authOptions: directTemplateRecipient.authOptions,
email: directRecipientEmail,
+ documentId: template.id,
},
field: templateField,
userId: user?.id,
diff --git a/packages/lib/server-only/template/create-document-from-template-legacy.ts b/packages/lib/server-only/template/create-document-from-template-legacy.ts
index e0a20f55e..6bc83c667 100644
--- a/packages/lib/server-only/template/create-document-from-template-legacy.ts
+++ b/packages/lib/server-only/template/create-document-from-template-legacy.ts
@@ -19,6 +19,8 @@ export type CreateDocumentFromTemplateLegacyOptions = {
}[];
};
+// !TODO: Make this work
+
/**
* Legacy server function for /api/v1
*/
@@ -58,6 +60,15 @@ export const createDocumentFromTemplateLegacy = async ({
},
});
+ const recipientsToCreate = template.recipients.map((recipient) => ({
+ id: recipient.id,
+ email: recipient.email,
+ name: recipient.name,
+ role: recipient.role,
+ signingOrder: recipient.signingOrder,
+ token: nanoid(),
+ }));
+
const document = await prisma.document.create({
data: {
qrToken: prefixedId('qr'),
@@ -70,12 +81,12 @@ export const createDocumentFromTemplateLegacy = async ({
documentDataId: documentData.id,
useLegacyFieldInsertion: template.useLegacyFieldInsertion ?? false,
recipients: {
- create: template.recipients.map((recipient) => ({
+ create: recipientsToCreate.map((recipient) => ({
email: recipient.email,
name: recipient.name,
role: recipient.role,
signingOrder: recipient.signingOrder,
- token: nanoid(),
+ token: recipient.token,
})),
},
documentMeta: {
@@ -95,9 +106,11 @@ export const createDocumentFromTemplateLegacy = async ({
await prisma.field.createMany({
data: template.fields.map((field) => {
- const recipient = template.recipients.find((recipient) => recipient.id === field.recipientId);
+ const recipient = recipientsToCreate.find((recipient) => recipient.id === field.recipientId);
- const documentRecipient = document.recipients.find((doc) => doc.email === recipient?.email);
+ const documentRecipient = document.recipients.find(
+ (documentRecipient) => documentRecipient.token === recipient?.token,
+ );
if (!documentRecipient) {
throw new Error('Recipient not found.');
@@ -118,28 +131,32 @@ export const createDocumentFromTemplateLegacy = async ({
}),
});
+ // Replicate the old logic, get by index and create if we exceed the number of existing recipients.
if (recipients && recipients.length > 0) {
- document.recipients = await Promise.all(
+ await Promise.all(
recipients.map(async (recipient, index) => {
const existingRecipient = document.recipients.at(index);
- return await prisma.recipient.upsert({
- where: {
- documentId_email: {
+ if (existingRecipient) {
+ return await prisma.recipient.update({
+ where: {
+ id: existingRecipient.id,
documentId: document.id,
- email: existingRecipient?.email ?? recipient.email,
},
- },
- update: {
- name: recipient.name,
- email: recipient.email,
- role: recipient.role,
- signingOrder: recipient.signingOrder,
- },
- create: {
+ data: {
+ name: recipient.name,
+ email: recipient.email,
+ role: recipient.role,
+ signingOrder: recipient.signingOrder,
+ },
+ });
+ }
+
+ return await prisma.recipient.create({
+ data: {
documentId: document.id,
- email: recipient.email,
name: recipient.name,
+ email: recipient.email,
role: recipient.role,
signingOrder: recipient.signingOrder,
token: nanoid(),
@@ -149,5 +166,18 @@ export const createDocumentFromTemplateLegacy = async ({
);
}
- return document;
+ // Gross but we need to do the additional fetch since we mutate above.
+ const updatedRecipients = await prisma.recipient.findMany({
+ where: {
+ documentId: document.id,
+ },
+ orderBy: {
+ id: 'asc',
+ },
+ });
+
+ return {
+ ...document,
+ recipients: updatedRecipients,
+ };
};
diff --git a/packages/lib/server-only/template/create-document-from-template.ts b/packages/lib/server-only/template/create-document-from-template.ts
index 10060da14..6612bb408 100644
--- a/packages/lib/server-only/template/create-document-from-template.ts
+++ b/packages/lib/server-only/template/create-document-from-template.ts
@@ -53,7 +53,7 @@ import { triggerWebhook } from '../webhooks/trigger/trigger-webhook';
type FinalRecipient = Pick<
Recipient,
- 'name' | 'email' | 'role' | 'authOptions' | 'signingOrder'
+ 'name' | 'email' | 'role' | 'authOptions' | 'signingOrder' | 'token'
> & {
templateRecipientId: number;
fields: Field[];
@@ -351,6 +351,7 @@ export const createDocumentFromTemplate = async ({
role: templateRecipient.role,
signingOrder: foundRecipient?.signingOrder ?? templateRecipient.signingOrder,
authOptions: templateRecipient.authOptions,
+ token: nanoid(),
};
});
@@ -451,7 +452,7 @@ export const createDocumentFromTemplate = async ({
? SigningStatus.SIGNED
: SigningStatus.NOT_SIGNED,
signingOrder: recipient.signingOrder,
- token: nanoid(),
+ token: recipient.token,
};
}),
},
@@ -510,8 +511,8 @@ export const createDocumentFromTemplate = async ({
}
}
- Object.values(finalRecipients).forEach(({ email, fields }) => {
- const recipient = document.recipients.find((recipient) => recipient.email === email);
+ Object.values(finalRecipients).forEach(({ token, fields }) => {
+ const recipient = document.recipients.find((recipient) => recipient.token === token);
if (!recipient) {
throw new Error('Recipient not found.');
diff --git a/packages/lib/translations/de/web.po b/packages/lib/translations/de/web.po
index 1f8b34d28..b3a8af9e0 100644
--- a/packages/lib/translations/de/web.po
+++ b/packages/lib/translations/de/web.po
@@ -414,14 +414,30 @@ msgstr "{visibleRows, plural, one {Eine # Ergebnis wird angezeigt.} other {# Erg
msgid "<0>\"{0}\"0>is no longer available to sign"
msgstr "<0>\"{0}\"0> steht nicht mehr zur Unterschrift zur Verfügung"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "<0>{organisationName}0> has requested to create an account on your behalf."
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "<0>{organisationName}0> has requested to link your current Documenso account to their organisation."
+msgstr ""
+
#: packages/email/templates/confirm-team-email.tsx
msgid "<0>{teamName}0> has requested to use your email address for their team on Documenso."
msgstr "<0>{teamName}0> hat angefragt, Ihre E-Mail-Adresse für ihr Team bei Documenso zu verwenden."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Account management:0> Modify your account settings, permissions, and preferences"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "<0>Click to upload0> or drag and drop"
msgstr "<0>Klicken Sie hier, um hochzuladen0> oder ziehen Sie die Datei per Drag & Drop"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Data access:0> Access all data associated with your account"
+msgstr ""
+
#: packages/ui/components/document/document-signature-settings-tooltip.tsx
msgid "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
msgstr "<0>Gezeichnet0> - Eine Signatur, die mit einer Maus oder einem Stift gezeichnet wird."
@@ -430,6 +446,10 @@ msgstr "<0>Gezeichnet0> - Eine Signatur, die mit einer Maus oder einem Stift g
msgid "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
msgstr "<0>E-Mail0> - Der Empfänger erhält das Dokument zur Unterschrift, Genehmigung usw."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Full account access:0> View all your profile information, settings, and activity"
+msgstr ""
+
#: packages/ui/components/recipient/recipient-action-auth-select.tsx
msgid "<0>Inherit authentication method0> - Use the global action signing authentication method configured in the \"General Settings\" step"
msgstr "<0>Authentifizierungsmethode erben0> - Verwenden Sie die in den \"Allgemeinen Einstellungen\" konfigurierte globale Aktionssignatur-Authentifizierungsmethode"
@@ -517,10 +537,18 @@ msgstr "12 Monate"
msgid "2FA"
msgstr "2FA"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "2FA Reset"
+msgstr ""
+
#: apps/remix/app/components/forms/token.tsx
msgid "3 months"
msgstr "3 Monate"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "400 Error"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
msgid "401 Unauthorized"
@@ -534,6 +562,10 @@ msgstr "404 E-Mail-Domain nicht gefunden"
msgid "404 not found"
msgstr "404 nicht gefunden"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "404 Not Found"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "404 Organisation group not found"
msgstr "404 Organisationsgruppe nicht gefunden"
@@ -597,16 +629,19 @@ msgid "A draft document will be created"
msgstr "Ein Entwurf wird erstellt"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was added"
-msgstr "Ein Feld wurde hinzugefügt"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was removed"
-msgstr "Ein Feld wurde entfernt"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was updated"
-msgstr "Ein Feld wurde aktualisiert"
+msgstr ""
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "A means to print or download documents for your records"
@@ -646,16 +681,27 @@ msgid "A password reset email has been sent, if you have an account you should s
msgstr "Eine E-Mail zum Zurücksetzen des Passworts wurde gesendet, wenn du ein Konto hast, solltest du sie in Kürze in deinem Posteingang sehen."
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was added"
-msgstr "Ein Empfänger wurde hinzugefügt"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was removed"
-msgstr "Ein Empfänger wurde entfernt"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was updated"
-msgstr "Ein Empfänger wurde aktualisiert"
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "A request has been made to create an account for you"
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "A request has been made to link your Documenso account"
+msgstr ""
#. placeholder {0}: team.name
#: packages/lib/server-only/team/create-team-email-verification.ts
@@ -706,6 +752,10 @@ msgstr "Eine Bestätigungs-E-Mail wird an die angegebene E-Mail-Adresse gesendet
msgid "Accept"
msgstr "Akzeptieren"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Accept & Link Account"
+msgstr ""
+
#: packages/email/templates/organisation-invite.tsx
msgid "Accept invitation to join an organisation on Documenso"
msgstr "Einladung annehmen, um einer Organisation auf Documenso beizutreten"
@@ -726,6 +776,7 @@ msgstr "Zugriff deaktiviert"
msgid "Access enabled"
msgstr "Zugang aktiviert"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/general/org-menu-switcher.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
msgid "Account"
@@ -735,6 +786,14 @@ msgstr "Konto"
msgid "Account Authentication"
msgstr "Kontowauthentifizierung"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Account creation request"
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Account Creation Request"
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
msgid "Account deleted"
@@ -748,10 +807,18 @@ msgstr "Konto deaktiviert"
msgid "Account enabled"
msgstr "Konto aktiviert"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Account Linking Request"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Account Re-Authentication"
msgstr "Kontowiederauthentifizierung"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Account unlinked"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "Acknowledgment"
msgstr "Bestätigung"
@@ -766,6 +833,7 @@ msgstr "Aktion"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/team-members-table.tsx
#: apps/remix/app/components/tables/team-members-table.tsx
@@ -804,6 +872,10 @@ msgstr "Aktive Abonnements"
msgid "Add"
msgstr "Hinzufügen"
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "Add 2 or more signers to enable signing order."
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-domain-create-dialog.tsx
msgid "Add a custom domain to send emails on behalf of your organisation. We'll generate DKIM records that you need to add to your DNS provider."
msgstr "Fügen Sie eine benutzerdefinierte Domain hinzu, um E-Mails im Namen Ihrer Organisation zu senden. Wir generieren DKIM-Einträge, die Sie Ihrem DNS-Anbieter hinzufügen müssen."
@@ -961,6 +1033,10 @@ msgstr "Fügen Sie die Empfänger hinzu, um das Dokument zu erstellen"
msgid "Add these DNS records to verify your domain ownership"
msgstr "Fügen Sie diese DNS-Einträge hinzu, um den Besitz Ihrer Domain zu verifizieren"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Add this URL to your provider's allowed redirect URIs"
+msgstr ""
+
#: apps/remix/app/components/forms/branding-preferences-form.tsx
msgid "Additional brand information to display at the bottom of emails"
msgstr "Zusätzliche Markeninformationen, die am Ende von E-Mails angezeigt werden sollen"
@@ -1078,6 +1154,10 @@ msgstr "Erlauben Sie den Dokumentempfängern, direkt an diese E-Mail-Adresse zu
msgid "Allow signers to dictate next signer"
msgstr "Unterzeichner können nächsten Unterzeichner bestimmen"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Allowed Email Domains"
+msgstr ""
+
#: apps/remix/app/components/embed/authoring/configure-document-advanced-settings.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
@@ -1120,6 +1200,7 @@ msgstr "Eine E-Mail mit einer Einladung wird an jedes Mitglied gesendet."
msgid "An email with this address already exists."
msgstr "Eine E-Mail mit dieser Adresse existiert bereits."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
@@ -1139,6 +1220,7 @@ msgstr "Ein Fehler ist aufgetreten beim Hinzufügen von Feldern."
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "An error occurred while adding signers."
msgstr "Ein Fehler ist aufgetreten, während Unterzeichner hinzugefügt wurden."
@@ -1146,6 +1228,30 @@ msgstr "Ein Fehler ist aufgetreten, während Unterzeichner hinzugefügt wurden."
msgid "An error occurred while adding the fields."
msgstr "Ein Fehler ist aufgetreten, während die Felder hinzugefügt wurden."
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the document settings."
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the fields."
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the subject form."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template fields."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template placeholders."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template settings."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx
msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields."
msgstr "Beim automatischen Signieren des Dokuments ist ein Fehler aufgetreten, einige Felder wurden möglicherweise nicht signiert. Bitte überprüfen Sie und signieren Sie alle verbleibenden Felder manuell."
@@ -1224,6 +1330,10 @@ msgstr "Beim Entfernen der Auswahl ist ein Fehler aufgetreten."
msgid "An error occurred while removing the signature."
msgstr "Ein Fehler ist aufgetreten, während die Unterschrift entfernt wurde."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "An error occurred while resetting two factor authentication for the user."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "An error occurred while sending the document."
msgstr "Ein Fehler ist aufgetreten, während das Dokument gesendet wurde."
@@ -1281,10 +1391,23 @@ msgstr "Ein Fehler ist aufgetreten, während dein Profil aktualisiert wurde."
msgid "An error occurred while uploading your document."
msgstr "Ein Fehler ist aufgetreten, während dein Dokument hochgeladen wurde."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "An error occurred. Please try again later."
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "An organisation wants to create an account for you. Please review the details below."
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "An organisation wants to link your account. Please review the details below."
+msgstr ""
+
#: apps/remix/app/components/general/generic-error-layout.tsx
msgid "An unexpected error occurred."
msgstr "Ein unerwarteter Fehler ist aufgetreten."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
#: apps/remix/app/components/general/app-command-menu.tsx
#: apps/remix/app/components/forms/team-update-form.tsx
@@ -1364,37 +1487,48 @@ msgstr "API-Token"
msgid "App Version"
msgstr "App-Version"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "Approve"
+msgstr ""
+
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table-action-dropdown.tsx
#: apps/remix/app/components/tables/documents-table-action-button.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document/document-page-view-button.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Approve"
msgstr "Genehmigen"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Approve Document"
msgstr "Dokument genehmigen"
-#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Approved"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Approved"
msgstr "Genehmigt"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Approver"
-msgstr "Genehmiger"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Approvers"
-msgstr "Genehmigende"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Approving"
-msgstr "Genehmigung"
+msgstr ""
#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Are you sure you want to complete the document? This action cannot be undone. Please ensure that you have completed prefilling all relevant fields before proceeding."
@@ -1428,6 +1562,7 @@ msgstr "Sind Sie sicher, dass Sie diese Organisation löschen möchten?"
msgid "Are you sure you wish to delete this team?"
msgstr "Bist du dir sicher, dass du dieses Team löschen möchtest?"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: apps/remix/app/components/dialogs/team-member-delete-dialog.tsx
@@ -1450,10 +1585,11 @@ msgid "Assigned Teams"
msgstr "Zugewiesene Teams"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
msgid "Assist"
-msgstr "Hilfe"
+msgstr ""
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Assist Document"
msgstr "Dokumentassistenz"
@@ -1463,29 +1599,36 @@ msgid "Assist with signing"
msgstr "Unterstützung beim Unterschreiben"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Assistant"
-msgstr "Assistent"
+msgstr ""
#: packages/ui/components/recipient/recipient-role-select.tsx
msgid "Assistant role is only available when the document is in sequential signing mode."
msgstr "Die Rolle des Assistenten ist nur verfügbar, wenn das Dokument im sequentiellen Unterschriftsmodus ist."
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Assistants"
-msgstr "Assistenten"
+msgstr ""
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
msgid "Assistants and Copy roles are currently not compatible with the multi-sign experience."
msgstr "Assistenten- und Kopierollen sind derzeit nicht mit der Multi-Signatur-Erfahrung kompatibel."
-#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Assisted"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Assisted"
msgstr "Unterstützt"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Assisting"
-msgstr "Unterstützend"
+msgstr ""
#: apps/remix/app/components/forms/document-preferences-form.tsx
#: packages/ui/primitives/template-flow/add-template-settings.types.tsx
@@ -1510,6 +1653,10 @@ msgstr "Protokolle"
msgid "Authentication Level"
msgstr "Authentifizierungsstufe"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Authentication Portal Not Found"
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-auth-page.tsx
#: apps/remix/app/components/general/direct-template/direct-template-signing-auth-page.tsx
msgid "Authentication required"
@@ -1640,6 +1787,11 @@ msgstr "Massenversand per CSV"
msgid "by <0>{senderName}0>"
msgstr "von <0>{senderName}0>"
+#. placeholder {0}: organisation.name
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "By accepting this request, you grant {0} the following permissions:"
+msgstr ""
+
#: packages/email/templates/confirm-team-email.tsx
msgid "By accepting this request, you will be granting <0>{teamName}0> access to:"
msgstr "Durch die Annahme dieser Anfrage gewähren Sie <0>{teamName}0> Zugriff auf:"
@@ -1672,6 +1824,7 @@ msgstr "Durch die Verwendung der elektronischen Unterschriftsfunktion stimmen Si
msgid "Can prepare"
msgstr "Kann vorbereiten"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
@@ -1763,21 +1916,29 @@ msgid "Cannot remove signer"
msgstr "Unterzeichner kann nicht entfernt werden"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Cc"
-msgstr "Cc"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
-#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
msgid "CC"
-msgstr "CC"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
+msgid "CC"
+msgstr ""
+
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
msgid "CC'd"
-msgstr "CC'd"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Ccers"
-msgstr "Kohlenstoffkopierer"
+msgstr ""
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
msgid "Character Limit"
@@ -1872,10 +2033,27 @@ msgstr "Klicken Sie, um den Signatur-Link zu kopieren, um ihn an den Empfänger
msgid "Click to insert field"
msgstr "Klicken, um das Feld auszufüllen"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client ID"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client ID is required"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client Secret"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client secret is required"
+msgstr ""
+
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-passkey.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-2fa.tsx
#: apps/remix/app/components/general/document/document-recipient-link-copy-dialog.tsx
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
#: apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
@@ -1902,6 +2080,8 @@ msgstr "Vergleichen Sie alle Pläne und Funktionen im Detail"
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/forms/signup.tsx
#: apps/remix/app/components/embed/embed-document-signing-page.tsx
+#: apps/remix/app/components/embed/embed-document-signing-page.tsx
+#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
msgid "Complete"
@@ -1923,9 +2103,9 @@ msgstr "Dokument abschließen"
msgid "Complete Signing"
msgstr "Unterzeichnung abschließen"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-msgid "Complete the fields for the following signers. Once reviewed, they will inform you if any modifications are needed."
-msgstr "Füllen Sie die Felder für die folgenden Unterzeichner aus. Nach der Überprüfung werden sie Sie informieren, ob Änderungen erforderlich sind."
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
+msgid "Complete the fields for the following signers."
+msgstr ""
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
@@ -2045,6 +2225,7 @@ msgstr "Bestätigung der Löschung"
msgid "Confirm email"
msgstr "E-Mail bestätigen"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/send-confirmation-email.tsx
msgid "Confirmation email sent"
msgstr "Bestätigungs-E-Mail gesendet"
@@ -2061,6 +2242,10 @@ msgstr "Kontaktinformationen"
msgid "Contact sales here"
msgstr "Vertrieb hier kontaktieren"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Contact us"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
msgid "Content"
msgstr "Inhalt"
@@ -2141,6 +2326,8 @@ msgstr "Bestimmt, welche Signaturen beim Unterschreiben eines Dokuments verwende
msgid "Copied"
msgstr "Kopiert"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/components/tables/settings-public-profile-templates-table.tsx
#: apps/remix/app/components/general/avatar-with-recipient.tsx
#: apps/remix/app/components/general/template/template-direct-link-badge.tsx
@@ -2182,6 +2369,11 @@ msgstr "Signierlinks kopieren"
msgid "Copy token"
msgstr "Token kopieren"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "couldn't be uploaded:"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
@@ -2208,6 +2400,10 @@ msgstr "Erstellen Sie eine neue E-Mail-Adresse für Ihre Organisation mit der Do
msgid "Create a new organisation with {planName} plan. Keep your current organisation on it's current plan"
msgstr "Erstellen Sie eine neue Organisation mit dem {planName} Plan. Behalten Sie Ihre aktuelle Organisation auf dem aktuellen Plan"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Create a support ticket"
+msgstr ""
+
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Create a team to collaborate with your team members."
msgstr "Ein Team erstellen, um mit Ihren Teammitgliedern zusammenzuarbeiten."
@@ -2466,6 +2662,7 @@ msgstr "Erstellungsdatum"
msgid "Date Format"
msgstr "Datumsformat"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/general/organisations/organisation-invitations.tsx
#: packages/email/templates/organisation-invite.tsx
msgid "Decline"
@@ -2491,6 +2688,10 @@ msgstr "Standard-E-Mail"
msgid "Default Email Settings"
msgstr "Standard-E-Mail-Einstellungen"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Default Organisation Role for New Users"
+msgstr ""
+
#: apps/remix/app/components/forms/document-preferences-form.tsx
msgid "Default Signature Settings"
msgstr "Standard-Signatureinstellungen"
@@ -2752,6 +2953,10 @@ msgstr "Das Deaktivieren der direkten Link-Signatur verhindert, dass jemand auf
msgid "Disabling the user results in the user not being able to use the account. It also disables all the related contents such as subscription, webhooks, teams, and API keys."
msgstr "Das Deaktivieren des Benutzers führt dazu, dass der Benutzer das Konto nicht mehr nutzen kann. Es werden auch alle zugehörigen Inhalte wie Abonnements, Webhooks, Teams und API-Schlüssel deaktiviert."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Discord"
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "Display Name"
@@ -2820,8 +3025,9 @@ msgid "Document access"
msgstr "Dokumentenzugriff"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document access auth updated"
-msgstr "Die Authentifizierung für den Dokumentenzugriff wurde aktualisiert"
+msgstr ""
#: apps/remix/app/components/general/document/document-status.tsx
msgid "Document All"
@@ -2837,9 +3043,13 @@ msgstr "Dokument genehmigt"
msgid "Document Cancelled"
msgstr "Dokument storniert"
+#: packages/lib/utils/document-audit-logs.ts
+#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document completed"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-status.tsx
-#: packages/lib/utils/document-audit-logs.ts
-#: packages/lib/utils/document-audit-logs.ts
msgid "Document completed"
msgstr "Dokument abgeschlossen"
@@ -2852,8 +3062,12 @@ msgstr "E-Mail zum Abschluss des Dokuments"
msgid "Document Completed!"
msgstr "Dokument abgeschlossen!"
-#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document created"
+msgstr ""
+
+#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "Document created"
msgstr "Dokument erstellt"
@@ -2879,10 +3093,14 @@ msgstr "Dokument erstellt mit einem <0>direkten Link0>"
msgid "Document Creation"
msgstr "Dokumenterstellung"
+#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document deleted"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
#: apps/remix/app/components/dialogs/admin-document-delete-dialog.tsx
-#: packages/lib/utils/document-audit-logs.ts
msgid "Document deleted"
msgstr "Dokument gelöscht"
@@ -2908,8 +3126,9 @@ msgid "Document Duplicated"
msgstr "Dokument dupliziert"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document external ID updated"
-msgstr "Externe ID des Dokuments aktualisiert"
+msgstr ""
#: apps/remix/app/components/general/document/document-certificate-qr-view.tsx
msgid "Document found in your account"
@@ -2945,16 +3164,18 @@ msgid "Document moved"
msgstr "Dokument verschoben"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document moved to team"
-msgstr "Dokument ins Team verschoben"
+msgstr ""
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
msgid "Document no longer available to sign"
msgstr "Dokument steht nicht mehr zur Unterschrift zur Verfügung"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document opened"
-msgstr "Dokument geöffnet"
+msgstr ""
#: apps/remix/app/components/general/document/document-status.tsx
msgid "Document pending"
@@ -2993,8 +3214,12 @@ msgstr "Dokument Abgelehnt"
msgid "Document resealed"
msgstr "Dokument wieder versiegelt"
-#: apps/remix/app/components/general/document/document-edit-form.tsx
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document sent"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "Document sent"
msgstr "Dokument gesendet"
@@ -3003,8 +3228,9 @@ msgid "Document Signed"
msgstr "Dokument signiert"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document signing auth updated"
-msgstr "Dokument unterzeichnen Authentifizierung aktualisiert"
+msgstr ""
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document signing process will be cancelled"
@@ -3019,12 +3245,14 @@ msgid "Document title"
msgstr "Dokumenttitel"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document title updated"
-msgstr "Dokumenttitel aktualisiert"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document updated"
-msgstr "Dokument aktualisiert"
+msgstr ""
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
msgid "Document updated successfully"
@@ -3040,21 +3268,27 @@ msgid "Document uploaded"
msgstr "Dokument hochgeladen"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document viewed"
-msgstr "Dokument angezeigt"
+msgstr ""
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
msgid "Document Viewed"
msgstr "Dokument angesehen"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document visibility updated"
-msgstr "Sichtbarkeit des Dokuments aktualisiert"
+msgstr ""
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document will be permanently deleted"
msgstr "Dokument wird dauerhaft gelöscht"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Documentation"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx
@@ -3165,6 +3399,11 @@ msgid "Drag and drop your PDF file here"
msgstr "Ziehen Sie Ihre PDF-Datei hierher"
#: packages/lib/constants/document.ts
+msgctxt "Draw signatute type"
+msgid "Draw"
+msgstr ""
+
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Draw"
msgstr "Zeichnen"
@@ -3411,6 +3650,10 @@ msgstr "Direktlink-Signierung aktivieren"
msgid "Enable signing order"
msgstr "Aktiviere die Signaturreihenfolge"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Enable SSO portal"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
@@ -3475,13 +3718,18 @@ msgstr "Unternehmen"
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
#: apps/remix/app/components/general/verify-email-banner.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
@@ -3510,6 +3758,10 @@ msgstr "Unternehmen"
#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
@@ -3521,6 +3773,7 @@ msgstr "Unternehmen"
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -3579,6 +3832,10 @@ msgstr "Ordner konnte nicht erstellt werden"
msgid "Failed to create subscription claim."
msgstr "Fehler beim Erstellen des Abonnementsanspruchs."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Failed to create support ticket"
+msgstr ""
+
#: apps/remix/app/components/dialogs/folder-delete-dialog.tsx
msgid "Failed to delete folder"
msgstr "Ordner konnte nicht gelöscht werden"
@@ -3611,6 +3868,10 @@ msgstr "Einstellungen konnten nicht gespeichert werden."
msgid "Failed to sign out all sessions"
msgstr "Fehler beim Abmelden aller Sitzungen"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Failed to unlink account"
+msgstr ""
+
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
msgid "Failed to update document"
msgstr "Dokument konnte nicht aktualisiert werden"
@@ -3669,16 +3930,19 @@ msgid "Field placeholder"
msgstr "Feldplatzhalter"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field prefilled by assistant"
-msgstr "Feld vorab ausgefüllt durch Assistenten"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field signed"
-msgstr "Feld unterschrieben"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field unsigned"
-msgstr "Feld nicht unterschrieben"
+msgstr ""
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
msgid "Fields"
@@ -3688,13 +3952,21 @@ msgstr "Felder"
msgid "Fields updated"
msgstr "Felder aktualisiert"
-#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-upload.tsx
-#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "Die Datei darf nicht größer als {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB sein"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "File is too small"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB"
msgstr "Dateigröße überschreitet das Limit von {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB"
@@ -3810,6 +4082,7 @@ msgstr "Links generieren"
msgid "Global recipient action authentication"
msgstr "Globale Empfängerauthentifizierung"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
@@ -4000,6 +4273,10 @@ msgstr "Startseite (kein Ordner)"
msgid "Horizontal"
msgstr "Horizontal"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "I agree to link my account with this organization"
+msgstr ""
+
#: packages/lib/constants/recipient-roles.ts
msgid "I am a signer of this document"
msgstr "Ich bin ein Unterzeichner dieses Dokuments"
@@ -4024,6 +4301,10 @@ msgstr "Ich bin verpflichtet, eine Kopie dieses Dokuments zu erhalten"
msgid "I am the owner of this document"
msgstr "Ich bin der Besitzer dieses Dokuments"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "I understand that I am providing my credentials to a 3rd party service configured by this organisation"
+msgstr ""
+
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx
#: apps/remix/app/components/dialogs/token-delete-dialog.tsx
msgid "I'm sure! Delete it"
@@ -4053,6 +4334,10 @@ msgstr "Wenn Sie den Bestätigungslink nicht in Ihrem Posteingang finden, könne
msgid "If your authenticator app does not support QR codes, you can use the following code instead:"
msgstr "Wenn Ihre Authenticator-App keine QR-Codes unterstützt, können Sie stattdessen den folgenden Code verwenden:"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Important: What This Means"
+msgstr ""
+
#: apps/remix/app/components/general/app-nav-mobile.tsx
#: apps/remix/app/components/general/app-nav-mobile.tsx
#: apps/remix/app/components/general/document/document-status.tsx
@@ -4120,6 +4405,10 @@ msgstr "Instanzstatistiken"
msgid "Invalid code. Please try again."
msgstr "Ungültiger Code. Bitte versuchen Sie es erneut."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Invalid domains"
+msgstr ""
+
#: packages/ui/primitives/document-flow/add-signers.types.ts
msgid "Invalid email"
msgstr "Ungültige E-Mail"
@@ -4133,6 +4422,10 @@ msgstr "Ungültiger Link"
msgid "Invalid token"
msgstr "Ungültiges Token"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Invalid Token"
+msgstr ""
+
#: apps/remix/app/components/forms/reset-password.tsx
msgid "Invalid token provided. Please try again."
msgstr "Ungültiges Token bereitgestellt. Bitte versuchen Sie es erneut."
@@ -4192,6 +4485,10 @@ msgstr "Rechnung"
msgid "IP Address"
msgstr "IP-Adresse"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Issuer URL"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "It is crucial to keep your contact information, especially your email address, up to date with us. Please notify us immediately of any changes to ensure that you continue to receive all necessary communications."
msgstr "Es ist entscheidend, dass Sie Ihre Kontaktinformationen, insbesondere Ihre E-Mail-Adresse, aktuell halten. Bitte informieren Sie uns sofort über Änderungen, damit Sie weiterhin alle notwendigen Mitteilungen erhalten."
@@ -4225,6 +4522,10 @@ msgstr "Es ist derzeit nicht deine Reihe zu unterschreiben. Du erhältst eine E-
msgid "Join {organisationName} on Documenso"
msgstr "Tritt {organisationName} auf Documenso bei"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Join our community on <0>Discord0> for community support and discussion."
+msgstr ""
+
#. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' })
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "Joined {0}"
@@ -4319,10 +4620,27 @@ msgstr "Möchten Sie Ihr eigenes öffentliches Profil mit Vereinbarungen haben?"
msgid "Link expires in 1 hour."
msgstr "Link läuft in 1 Stunde ab."
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Link expires in 30 minutes."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.public-profile.tsx
msgid "Link template"
msgstr "Vorlage verlinken"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Link your Documenso account"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "Linked Accounts"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Linked At"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "Links Generated"
msgstr "Links generiert"
@@ -4347,6 +4665,10 @@ msgstr "Lade Dokument..."
msgid "Loading Document..."
msgstr "Dokument wird geladen..."
+#: packages/ui/components/recipient/recipient-autocomplete-input.tsx
+msgid "Loading suggestions..."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-page-view-recent-activity.tsx
msgid "Loading..."
msgstr "Wird geladen..."
@@ -4372,6 +4694,10 @@ msgstr "Verwalten"
msgid "Manage {0}'s profile"
msgstr "Verwalten Sie das Profil von {0}"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Manage a custom SSO login portal for your organisation."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/organisations.tsx
msgid "Manage all organisations you are currently associated with."
msgstr "Verwalten Sie alle Organisationen, mit denen Sie derzeit verbunden sind."
@@ -4404,6 +4730,10 @@ msgstr "Direktlink verwalten"
msgid "Manage documents"
msgstr "Dokumente verwalten"
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "Manage linked accounts"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "Manage organisation"
msgstr "Organisation verwalten"
@@ -4539,6 +4869,10 @@ msgstr "Mitglied"
msgid "Member Count"
msgstr "Mitgliederanzahl"
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "Member promoted to owner successfully"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-members-table.tsx
msgid "Member Since"
msgstr "Mitglied seit"
@@ -4554,6 +4888,7 @@ msgstr "Mitglied seit"
msgid "Members"
msgstr "Mitglieder"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Message"
@@ -4789,6 +5124,10 @@ msgstr "Kein Unterschriftsfeld gefunden"
msgid "No Stripe customer attached"
msgstr "Kein Stripe-Kunde angehängt"
+#: packages/ui/components/recipient/recipient-autocomplete-input.tsx
+msgid "No suggestions found"
+msgstr ""
+
#: apps/remix/app/components/tables/team-groups-table.tsx
msgid "No team groups found"
msgstr "Keine Teamgruppen gefunden"
@@ -4919,6 +5258,16 @@ msgstr "Nur Administratoren können auf das Dokument zugreifen und es anzeigen"
msgid "Only managers and above can access and view the document"
msgstr "Nur Manager und darüber können auf das Dokument zugreifen und es anzeigen"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Only one file can be uploaded at a time"
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Only PDF files are allowed"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/general/generic-error-layout.tsx
#: apps/remix/app/components/general/generic-error-layout.tsx
@@ -4934,10 +5283,15 @@ msgstr "Geöffnet"
msgid "Or"
msgstr "Oder"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "OR"
+msgstr ""
+
#: apps/remix/app/components/forms/signin.tsx
msgid "Or continue with"
msgstr "Oder fahren Sie fort mit"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/tables/user-organisations-table.tsx
#: apps/remix/app/components/tables/admin-organisations-table.tsx
msgid "Organisation"
@@ -4947,6 +5301,10 @@ msgstr "Organisation"
msgid "Organisation Admin"
msgstr "Organisationsadministrator"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Organisation authentication portal URL"
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-organisation-create-dialog.tsx
msgid "Organisation created"
msgstr "Organisation erstellt"
@@ -5017,6 +5375,10 @@ msgstr "Organisationseinstellungen"
msgid "Organisation Settings"
msgstr "Organisationseinstellungen"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Organisation SSO Portal"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "Organisation Teams"
msgstr "Organisationsteams"
@@ -5309,9 +5671,13 @@ msgstr "Bitte geben Sie einen aussagekräftigen Namen für Ihr Token ein. Dies w
msgid "Please enter a valid name."
msgstr "Bitte geben Sie einen gültigen Namen ein."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-msgid "Please mark as viewed to complete"
-msgstr "Bitte als angesehen markieren, um abzuschließen"
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
+msgid "Please mark as viewed to complete."
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Please note that anyone who signs in through your portal will be added to your organisation as a member."
+msgstr ""
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid "Please note that proceeding will remove direct linking recipient and turn it into a placeholder."
@@ -5349,11 +5715,11 @@ msgstr "Bitte geben Sie ein Token von der Authentifizierungs-App oder einen Back
msgid "Please provide a token from your authenticator, or a backup code."
msgstr "Bitte geben Sie ein Token von Ihrem Authentifizierer oder einen Backup-Code an."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
msgid "Please review the document before approving."
msgstr "Bitte überprüfen Sie das Dokument, bevor Sie es genehmigen."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
msgid "Please review the document before signing."
msgstr "Bitte überprüfen Sie das Dokument vor der Unterzeichnung."
@@ -5449,6 +5815,18 @@ msgstr "Profil aktualisiert"
msgid "Progress"
msgstr "Fortschritt"
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "Promote to owner"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Provider"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Provider has been updated successfully"
+msgstr ""
+
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/general/template/template-type.tsx
msgid "Public"
@@ -5485,6 +5863,10 @@ msgstr "Radio-Werte"
msgid "Read only"
msgstr "Nur lesen"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Read our documentation to get started with Documenso."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-disclosure.tsx
msgid "Read the full <0>signature disclosure0>."
msgstr "Lesen Sie die vollständige <0>Offenlegung der Unterschrift0>."
@@ -5601,6 +5983,10 @@ msgstr "Wiederherstellungscodes"
msgid "Red"
msgstr "Rot"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Redirect URI"
+msgstr ""
+
#: apps/remix/app/components/embed/authoring/configure-document-advanced-settings.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
@@ -5714,6 +6100,10 @@ msgstr "Auf E-Mail antworten"
msgid "Reply To Email"
msgstr "Antworten auf E-Mail"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Requesting Organisation"
+msgstr ""
+
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx
@@ -5722,6 +6112,10 @@ msgstr "Antworten auf E-Mail"
msgid "Required field"
msgstr "Pflichtfeld"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Required scopes"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
msgid "Reseal document"
msgstr "Dokument wieder versiegeln"
@@ -5746,6 +6140,11 @@ msgstr "Bestätigung erneut senden"
msgid "Reset"
msgstr "Zurücksetzen"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset 2FA"
+msgstr ""
+
#: apps/remix/app/components/forms/forgot-password.tsx
msgid "Reset email sent"
msgstr "Zurücksetzungs-E-Mail gesendet"
@@ -5757,6 +6156,14 @@ msgstr "Zurücksetzungs-E-Mail gesendet"
msgid "Reset Password"
msgstr "Passwort zurücksetzen"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset the users two factor authentication. This action is irreversible and will disable two factor authentication for the user."
+msgstr ""
+
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset Two Factor Authentication"
+msgstr ""
+
#: apps/remix/app/components/forms/reset-password.tsx
msgid "Resetting Password..."
msgstr "Passwort wird zurückgesetzt..."
@@ -5788,9 +6195,14 @@ msgstr "Wiederholen"
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
msgid "Return"
msgstr "Zurück"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Return to Documenso sign in page here"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
msgid "Return to Home"
msgstr "Zurück zur Startseite"
@@ -5800,6 +6212,10 @@ msgstr "Zurück zur Startseite"
msgid "Return to sign in"
msgstr "Zurück zur Anmeldung"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Review request"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
msgid "Revoke"
@@ -5974,6 +6390,10 @@ msgstr "Authentifizierungsmethoden auswählen"
msgid "Select default option"
msgstr "Standardoption auswählen"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Select default role"
+msgstr ""
+
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx
msgid "Select direction"
msgstr "Richtung auswählen"
@@ -6189,6 +6609,11 @@ msgstr "Erweiterte Einstellungen anzeigen"
msgid "Show templates in your public profile for your audience to sign and get started quickly"
msgstr "Vorlagen in Ihrem öffentlichen Profil anzeigen, damit Ihre Zielgruppe unterschreiben und schnell loslegen kann"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "Sign"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table-action-dropdown.tsx
@@ -6202,7 +6627,6 @@ msgstr "Vorlagen in Ihrem öffentlichen Profil anzeigen, damit Ihre Zielgruppe u
#: apps/remix/app/components/general/document-signing/document-signing-auth-password.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-2fa.tsx
#: apps/remix/app/components/general/document/document-page-view-button.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Sign"
msgstr "Unterschreiben"
@@ -6224,7 +6648,7 @@ msgstr "Unterzeichnen als<0>{0} <1>({1})1>0>"
msgid "Sign document"
msgstr "Dokument unterschreiben"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Sign Document"
msgstr "Dokument signieren"
@@ -6242,6 +6666,7 @@ msgstr "Unterzeichnen-Feld"
msgid "Sign Here"
msgstr "Hier unterzeichnen"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: packages/email/template-components/template-reset-password.tsx
@@ -6249,6 +6674,7 @@ msgid "Sign In"
msgstr "Anmelden"
#: apps/remix/app/routes/_unauthenticated+/signin.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
msgid "Sign in to your account"
msgstr "Melden Sie sich bei Ihrem Konto an"
@@ -6316,32 +6742,35 @@ msgstr "Gesammelte Unterschriften"
msgid "Signatures will appear once the document has been completed"
msgstr "Unterschriften erscheinen, sobald das Dokument abgeschlossen ist"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Signed"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/ui/components/document/document-read-only-fields.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Signed"
msgstr "Unterzeichnet"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Signer"
-msgstr "Unterzeichner"
+msgstr ""
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Signer Events"
msgstr "Signer-Ereignisse"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Signers"
-msgstr "Unterzeichner"
-
-#: packages/ui/primitives/document-flow/add-signers.types.ts
-msgid "Signers must have unique emails"
-msgstr "Unterzeichner müssen eindeutige E-Mails haben"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Signing"
-msgstr "Unterzeichnung"
+msgstr ""
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Signing Certificate"
@@ -6512,6 +6941,14 @@ msgstr "Entschuldigung, wir konnten das Zertifikat nicht herunterladen. Bitte ve
msgid "Source"
msgstr "Quelle"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Space-separated list of domains. Leave empty to allow all domains."
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
+msgid "SSO"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
msgid "Stats"
msgstr "Statistiken"
@@ -6543,6 +6980,7 @@ msgstr "Stripe-Kunde erfolgreich erstellt"
msgid "Stripe Customer ID"
msgstr "Stripe-Kunden-ID"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Subject"
msgstr "Betreff"
@@ -6552,6 +6990,10 @@ msgstr "Betreff"
msgid "Subject <0>(Optional)0>"
msgstr "Betreff <0>(Optional)0>"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Submit"
+msgstr ""
+
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx
@@ -6585,10 +7027,12 @@ msgstr "Abonnement ungültig"
#: apps/remix/app/routes/embed+/v1+/authoring+/template.edit.$id.tsx
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
@@ -6646,6 +7090,15 @@ msgstr "Erfolgreich erstellt: {successCount}"
msgid "Summary:"
msgstr "Zusammenfassung:"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+#: apps/remix/app/components/general/org-menu-switcher.tsx
+msgid "Support"
+msgstr ""
+
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Support ticket created"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
msgid "Sync"
msgstr "Synchronisieren"
@@ -7009,7 +7462,8 @@ msgid "The email address which will show up in the \"Reply To\" field in emails"
msgstr "Die E-Mail-Adresse, die im \"Antwort an\"-Feld in E-Mails angezeigt wird"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
-msgid "The email domain you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The email domain you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Die gesuchte E-Mail-Domain wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
@@ -7050,12 +7504,21 @@ msgstr "Die folgenden Fehler sind aufgetreten:"
msgid "The following team has been deleted. You will no longer be able to access this team and its documents"
msgstr "Das folgende Team wurde gelöscht. Sie können nicht mehr auf dieses Team und seine Dokumente zugreifen."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "The OpenID discovery endpoint URL for your provider"
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "The organisation authentication portal does not exist, or is not configured"
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "The organisation email has been created successfully."
msgstr "Die E-Mail der Organisation wurde erfolgreich erstellt."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
-msgid "The organisation group you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation group you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Die Organisationsgruppe, nach der Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
@@ -7064,12 +7527,14 @@ msgid "The organisation role that will be applied to all members in this group."
msgstr "Die Organisationsrolle, die auf alle Mitglieder in dieser Gruppe angewendet wird."
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
-msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Die Organisation, nach der Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
#: apps/remix/app/routes/_authenticated+/_layout.tsx
-msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Die Organisation, nach der Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
@@ -7158,12 +7623,14 @@ msgid "The team email <0>{teamEmail}0> has been removed from the following tea
msgstr "Die Team-E-Mail <0>{teamEmail}0> wurde aus dem folgenden Team entfernt"
#: apps/remix/app/routes/_authenticated+/_layout.tsx
-msgid "The team you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The team you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Das Team, das Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
-msgid "The team you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The team you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Das Team, das Sie suchen, könnte entfernt, umbenannt oder nie existiert haben."
@@ -7179,6 +7646,10 @@ msgstr "Die Vorlage wird von Ihrem Profil entfernt"
msgid "The test webhook has been successfully sent to your endpoint."
msgstr "Das Test-Webhook wurde erfolgreich an Ihren Endpunkt gesendet."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "The token is invalid or has expired."
+msgstr ""
+
#: apps/remix/app/components/forms/token.tsx
msgid "The token was copied to your clipboard."
msgstr "Der Token wurde in die Zwischenablage kopiert."
@@ -7205,10 +7676,15 @@ msgid "The URL for Documenso to send webhook events to."
msgstr "Die URL für Documenso, um Webhook-Ereignisse zu senden."
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
-msgid "The user you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The user you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Der Benutzer, nach dem Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "The user's two factor authentication has been reset successfully."
+msgstr ""
+
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx
msgid "The webhook has been successfully deleted."
msgstr "Das Webhook wurde erfolgreich gelöscht."
@@ -7222,7 +7698,8 @@ msgid "The webhook was successfully created."
msgstr "Der Webhook wurde erfolgreich erstellt."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
-msgid "The webhook you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The webhook you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Das gesuchte Webhook wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
@@ -7258,6 +7735,10 @@ msgstr "Dieses Konto wurde deaktiviert. Bitte kontaktieren Sie den Support."
msgid "This account has not been verified. Please verify your account before signing in."
msgstr "Dieses Konto wurde nicht verifiziert. Bitte verifizieren Sie Ihr Konto, bevor Sie sich anmelden."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "This action is irreversible. Please ensure you have informed the user before proceeding."
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
#: apps/remix/app/components/dialogs/admin-document-delete-dialog.tsx
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
@@ -7376,10 +7857,22 @@ msgstr "So wird das Dokument die Empfänger erreichen, sobald es zum Unterschrei
msgid "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
msgstr "Dies ist der Anspruch, mit dem diese Organisation ursprünglich erstellt wurde. Alle Änderungen an Funktionsflags für diesen Anspruch werden in diese Organisation übernommen."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "This is the required scopes you must set in your provider's settings"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "This is the URL which users will use to sign in to your organisation."
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
msgid "This link is invalid or has expired. Please contact your team to resend a verification."
msgstr "Dieser Link ist ungültig oder abgelaufen. Bitte kontaktieren Sie Ihr Team, um eine neue Bestätigungsanfrage zu senden."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "This organisation will have administrative control over your account. You can revoke this access later, but they will retain access to any data they've already collected."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.general.tsx
msgid "This organisation, and any associated data will be permanently deleted."
msgstr "Diese Organisation und alle damit verbundenen Daten werden dauerhaft gelöscht."
@@ -7499,9 +7992,10 @@ msgstr "Um Mitglieder zu einem Team hinzufügen zu können, müssen Sie sie zuer
msgid "To change the email you must remove and add a new email address."
msgstr "Um die E-Mail zu ändern, müssen Sie die aktuelle entfernen und eine neue hinzufügen."
+#. placeholder {0}: user.email
#. placeholder {0}: userToEnable.email
#. placeholder {0}: userToDisable.email
-#. placeholder {0}: user.email
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -7517,6 +8011,7 @@ msgid "To enable two-factor authentication, scan the following QR code using you
msgstr "Um die Zwei-Faktor-Authentifizierung zu aktivieren, scannen Sie den folgenden QR-Code mit Ihrer Authentifizierungs-App."
#: apps/remix/app/routes/_unauthenticated+/unverified-account.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
msgid "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
msgstr "Um Zugang zu Ihrem Konto zu erhalten, bestätigen Sie bitte Ihre E-Mail-Adresse, indem Sie auf den Bestätigungslink in Ihrem Posteingang klicken."
@@ -7633,9 +8128,14 @@ msgstr "Die Zwei-Faktor-Authentifizierung wurde für Ihr Konto deaktiviert. Sie
msgid "Two-Factor Re-Authentication"
msgstr "Zwei-Faktor-Wiederauthentifizierung"
+#: packages/lib/constants/document.ts
+msgctxt "Type signatute type"
+msgid "Type"
+msgstr ""
+
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
-#: packages/lib/constants/document.ts
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Type"
msgstr "Typ"
@@ -7749,9 +8249,15 @@ msgstr "Unvollendet"
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
msgid "Unknown"
msgstr "Unbekannt"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Unknown error"
+msgstr ""
+
#: apps/remix/app/components/tables/admin-claims-table.tsx
msgid "Unlimited"
msgstr "Unbegrenzt"
@@ -7760,6 +8266,11 @@ msgstr "Unbegrenzt"
msgid "Unlimited documents, API and more"
msgstr "Unbegrenzte Dokumente, API und mehr"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Unlink"
+msgstr ""
+
#: apps/remix/app/components/general/folder/folder-card.tsx
msgid "Unpin"
msgstr "Lösen"
@@ -7768,6 +8279,7 @@ msgstr "Lösen"
msgid "Untitled Group"
msgstr "Unbetitelte Gruppe"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
@@ -7907,6 +8419,11 @@ msgid "Upgrade your plan to upload more documents"
msgstr "Aktualisieren Sie Ihren Tarif, um mehr Dokumente hochzuladen"
#: packages/lib/constants/document.ts
+msgctxt "Upload signatute type"
+msgid "Upload"
+msgstr ""
+
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Upload"
msgstr "Hochladen"
@@ -7940,6 +8457,11 @@ msgstr "Benutzerdefiniertes Dokument hochladen"
msgid "Upload Document"
msgstr "Dokument hochladen"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Upload failed"
+msgstr ""
+
#: packages/ui/primitives/signature-pad/signature-pad-upload.tsx
msgid "Upload Signature"
msgstr "Signatur hochladen"
@@ -8021,6 +8543,7 @@ msgstr "Benutzer hat kein Passwort."
msgid "User not found"
msgstr "Benutzer nicht gefunden"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -8094,6 +8617,11 @@ msgstr "Überprüfen Sie Ihre Team-E-Mail-Adresse"
msgid "Vertical"
msgstr "Vertikal"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "View"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
@@ -8103,7 +8631,6 @@ msgstr "Vertikal"
#: apps/remix/app/components/general/document/document-page-view-button.tsx
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "View"
msgstr "Betrachten"
@@ -8136,6 +8663,11 @@ msgstr "Sehen Sie sich alle Sicherheitsaktivitäten in Ihrem Konto an."
msgid "View and manage all active sessions for your account."
msgstr "Alle aktiven Sitzungen Ihres Kontos anzeigen und verwalten."
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "View and manage all login methods linked to your account."
+msgstr ""
+
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
msgid "View Codes"
msgstr "Codes ansehen"
@@ -8148,7 +8680,7 @@ msgstr "DNS-Datensätze anzeigen"
msgid "View document"
msgstr "Dokument anzeigen"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
@@ -8198,24 +8730,31 @@ msgstr "Teams ansehen"
msgid "View the DNS records for this email domain"
msgstr "DNS-Datensätze für diese E-Mail-Domain anzeigen"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Viewed"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Viewed"
msgstr "Betrachtet"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Viewer"
-msgstr "Betrachter"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Viewers"
-msgstr "Betrachter"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Viewing"
-msgstr "Betrachten"
+msgstr ""
#: apps/remix/app/components/dialogs/folder-update-dialog.tsx
msgid "Visibility"
@@ -8276,6 +8815,10 @@ msgstr "Wir können diesen Schlüssel im Moment nicht aktualisieren. Bitte versu
msgid "We couldn't create a Stripe customer. Please try again."
msgstr "Wir konnten keinen Stripe-Kunden erstellen. Bitte versuchen Sie es erneut."
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "We couldn't promote the member to owner. Please try again."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "We couldn't update the group. Please try again."
msgstr "Wir konnten die Gruppe nicht aktualisieren. Bitte versuchen Sie es erneut."
@@ -8285,6 +8828,10 @@ msgstr "Wir konnten die Gruppe nicht aktualisieren. Bitte versuchen Sie es erneu
msgid "We couldn't update the organisation. Please try again."
msgstr "Wir konnten die Organisation nicht aktualisieren. Bitte versuchen Sie es erneut."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "We couldn't update the provider. Please try again."
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "We encountered an error while creating the email. Please try again later."
msgstr "Wir haben beim Erstellen der E-Mail einen Fehler festgestellt. Bitte versuchen Sie es später noch einmal."
@@ -8393,6 +8940,7 @@ msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht h
msgid "We encountered an unknown error while attempting to revoke access. Please try again or contact support."
msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht haben, den Zugriff zu widerrufen. Bitte versuchen Sie es später oder kontaktieren Sie den Support."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/signin.tsx
msgid "We encountered an unknown error while attempting to sign you In. Please try again later."
@@ -8528,6 +9076,10 @@ msgstr "Wir werden Unterzeichnungslinks für Sie erstellen, die Sie an die Empf
msgid "We won't send anything to notify recipients."
msgstr "Wir werden nichts senden, um die Empfänger zu benachrichtigen."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "We'll get back to you as soon as possible via email."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates._index.tsx
#: apps/remix/app/components/tables/documents-table-empty-state.tsx
msgid "We're all empty"
@@ -8585,10 +9137,18 @@ msgstr "Willkommen zurück, wir freuen uns, Sie zu haben."
msgid "Welcome back! Here's an overview of your account."
msgstr "Willkommen zurück! Hier ist ein Überblick über Ihr Konto."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Welcome to {organisationName}"
+msgstr ""
+
#: packages/email/template-components/template-confirmation-email.tsx
msgid "Welcome to Documenso!"
msgstr "Willkommen bei Documenso!"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Well-known URL is required"
+msgstr ""
+
#: apps/remix/app/routes/_recipient+/sign.$token+/waiting.tsx
msgid "Were you trying to edit this document instead?"
msgstr "Hast du stattdessen versucht, dieses Dokument zu bearbeiten?"
@@ -8615,6 +9175,10 @@ msgstr "Wenn Sie ein Dokument unterschreiben, können wir die folgenden Felder a
msgid "When you use our platform to affix your electronic signature to documents, you are consenting to do so under the Electronic Signatures in Global and National Commerce Act (E-Sign Act) and other applicable laws. This action indicates your agreement to use electronic means to sign documents and receive notifications."
msgstr "Wenn Sie unsere Plattform nutzen, um Ihre elektronische Unterschrift auf Dokumente anzubringen, stimmen Sie zu, dies unter dem Gesetz über elektronische Unterschriften im globalen und nationalen Handel (E-Sign-Gesetz) und anderen anwendbaren Gesetzen zu tun. Diese Handlung zeigt Ihre Zustimmung zur Verwendung elektronischer Mittel zum Unterzeichnen von Dokumenten und zum Empfang von Benachrichtigungen an."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Whether to enable the SSO portal for your organisation"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
msgid "While waiting for them to do so you can create your own Documenso account and get started with document signing right away."
msgstr "Während Sie darauf warten, können Sie Ihr eigenes Documenso-Konto erstellen und sofort mit der Dokumentenunterzeichnung beginnen."
@@ -8682,6 +9246,10 @@ msgstr "Sie verlassen gleich die folgende Organisation."
msgid "You are about to remove default access to this team for all organisation members. Any members not explicitly added to this team will no longer have access."
msgstr "Sie sind dabei, den Standardzugriff auf dieses Team für alle Organisationsmitglieder zu entfernen. Alle Mitglieder, die diesem Team nicht ausdrücklich hinzugefügt wurden, haben keinen Zugriff mehr."
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "You are about to remove the <0>{provider}0> login method from your account."
+msgstr ""
+
#. placeholder {0}: organisation.name
#: apps/remix/app/components/dialogs/organisation-email-domain-delete-dialog.tsx
msgid "You are about to remove the email domain <0>{emailDomain}0> from <1>{0}1>. All emails associated with this domain will be deleted."
@@ -8768,6 +9336,10 @@ msgstr "Sie sind nicht berechtigt, diesen Benutzer zu deaktivieren."
msgid "You are not authorized to enable this user."
msgstr "Sie sind nicht berechtigt, diesen Benutzer zu aktivieren."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "You are not authorized to reset two factor authentcation for this user."
+msgstr ""
+
#: packages/email/template-components/template-confirmation-email.tsx
msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)"
msgstr "Du kannst diesen Link auch kopieren und in deinen Browser einfügen: {confirmationLink} (Link läuft in 1 Stunde ab)"
@@ -9058,6 +9630,10 @@ msgstr "Sie müssen bei der Anmeldung jetzt einen Code von Ihrer Authenticator-A
msgid "You will receive an Email copy of the signed document once everyone has signed."
msgstr "Sie erhalten eine E-Mail-Kopie des unterzeichneten Dokuments, sobald alle unterschrieben haben."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Your Account"
+msgstr ""
+
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
msgid "Your account has been deleted successfully."
msgstr "Ihr Konto wurde erfolgreich gelöscht."
@@ -9091,6 +9667,10 @@ msgstr "Ihre Massenversandoperation für Vorlage \"{templateName}\" ist abgeschl
msgid "Your current {currentProductName} plan is past due. Please update your payment information."
msgstr "Ihr aktueller {currentProductName} Plan ist überfällig. Bitte aktualisieren Sie Ihre Zahlungsinformationen."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Your current plan includes the following support channels:"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.billing.tsx
msgid "Your current plan is inactive."
msgstr "Ihr aktueller Plan ist inaktiv."
@@ -9104,7 +9684,6 @@ msgid "Your direct signing templates"
msgstr "Ihre direkten Unterzeichnungsvorlagen"
#: apps/remix/app/components/general/document/document-upload.tsx
-#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "Your document failed to upload."
msgstr "Ihr Dokument konnte nicht hochgeladen werden."
@@ -9237,6 +9816,10 @@ msgstr "Ihr Wiederherstellungscode wurde in die Zwischenablage kopiert."
msgid "Your recovery codes are listed below. Please store them in a safe place."
msgstr "Ihre Wiederherstellungscodes sind unten aufgeführt. Bitte bewahren Sie sie an einem sicheren Ort auf."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Your support request has been submitted. We'll get back to you soon!"
+msgstr ""
+
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Your team has been created."
msgstr "Ihr Team wurde erstellt."
@@ -9249,10 +9832,6 @@ msgstr "Ihr Team wurde erfolgreich gelöscht."
msgid "Your team has been successfully updated."
msgstr "Ihr Team wurde erfolgreich aktualisiert."
-#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
-msgid "Your template failed to upload."
-msgstr "Ihre Vorlage konnte nicht hochgeladen werden."
-
#: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx
msgid "Your template has been created successfully"
msgstr "Ihre Vorlage wurde erfolgreich erstellt"
@@ -9289,3 +9868,6 @@ msgstr "Ihr Token wurde erfolgreich erstellt! Stellen Sie sicher, dass Sie es ko
msgid "Your tokens will be shown here once you create them."
msgstr "Ihre Tokens werden hier angezeigt, sobald Sie sie erstellt haben."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "your-domain.com another-domain.com"
+msgstr ""
diff --git a/packages/lib/translations/en/web.po b/packages/lib/translations/en/web.po
index fbba21fd0..bf2b40730 100644
--- a/packages/lib/translations/en/web.po
+++ b/packages/lib/translations/en/web.po
@@ -409,14 +409,30 @@ msgstr "{visibleRows, plural, one {Showing # result.} other {Showing # results.}
msgid "<0>\"{0}\"0>is no longer available to sign"
msgstr "<0>\"{0}\"0>is no longer available to sign"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "<0>{organisationName}0> has requested to create an account on your behalf."
+msgstr "<0>{organisationName}0> has requested to create an account on your behalf."
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "<0>{organisationName}0> has requested to link your current Documenso account to their organisation."
+msgstr "<0>{organisationName}0> has requested to link your current Documenso account to their organisation."
+
#: packages/email/templates/confirm-team-email.tsx
msgid "<0>{teamName}0> has requested to use your email address for their team on Documenso."
msgstr "<0>{teamName}0> has requested to use your email address for their team on Documenso."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Account management:0> Modify your account settings, permissions, and preferences"
+msgstr "<0>Account management:0> Modify your account settings, permissions, and preferences"
+
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "<0>Click to upload0> or drag and drop"
msgstr "<0>Click to upload0> or drag and drop"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Data access:0> Access all data associated with your account"
+msgstr "<0>Data access:0> Access all data associated with your account"
+
#: packages/ui/components/document/document-signature-settings-tooltip.tsx
msgid "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
msgstr "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
@@ -425,6 +441,10 @@ msgstr "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
msgid "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
msgstr "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Full account access:0> View all your profile information, settings, and activity"
+msgstr "<0>Full account access:0> View all your profile information, settings, and activity"
+
#: packages/ui/components/recipient/recipient-action-auth-select.tsx
msgid "<0>Inherit authentication method0> - Use the global action signing authentication method configured in the \"General Settings\" step"
msgstr "<0>Inherit authentication method0> - Use the global action signing authentication method configured in the \"General Settings\" step"
@@ -512,10 +532,18 @@ msgstr "12 months"
msgid "2FA"
msgstr "2FA"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "2FA Reset"
+msgstr "2FA Reset"
+
#: apps/remix/app/components/forms/token.tsx
msgid "3 months"
msgstr "3 months"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "400 Error"
+msgstr "400 Error"
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
msgid "401 Unauthorized"
@@ -529,6 +557,10 @@ msgstr "404 Email domain not found"
msgid "404 not found"
msgstr "404 not found"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "404 Not Found"
+msgstr "404 Not Found"
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "404 Organisation group not found"
msgstr "404 Organisation group not found"
@@ -592,14 +624,17 @@ msgid "A draft document will be created"
msgstr "A draft document will be created"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was added"
msgstr "A field was added"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was removed"
msgstr "A field was removed"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was updated"
msgstr "A field was updated"
@@ -641,17 +676,28 @@ msgid "A password reset email has been sent, if you have an account you should s
msgstr "A password reset email has been sent, if you have an account you should see it in your inbox shortly."
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was added"
msgstr "A recipient was added"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was removed"
msgstr "A recipient was removed"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was updated"
msgstr "A recipient was updated"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "A request has been made to create an account for you"
+msgstr "A request has been made to create an account for you"
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "A request has been made to link your Documenso account"
+msgstr "A request has been made to link your Documenso account"
+
#. placeholder {0}: team.name
#: packages/lib/server-only/team/create-team-email-verification.ts
msgid "A request to use your email has been initiated by {0} on Documenso"
@@ -701,6 +747,10 @@ msgstr "A verification email will be sent to the provided email."
msgid "Accept"
msgstr "Accept"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Accept & Link Account"
+msgstr "Accept & Link Account"
+
#: packages/email/templates/organisation-invite.tsx
msgid "Accept invitation to join an organisation on Documenso"
msgstr "Accept invitation to join an organisation on Documenso"
@@ -721,6 +771,7 @@ msgstr "Access disabled"
msgid "Access enabled"
msgstr "Access enabled"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/general/org-menu-switcher.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
msgid "Account"
@@ -730,6 +781,14 @@ msgstr "Account"
msgid "Account Authentication"
msgstr "Account Authentication"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Account creation request"
+msgstr "Account creation request"
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Account Creation Request"
+msgstr "Account Creation Request"
+
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
msgid "Account deleted"
@@ -743,10 +802,18 @@ msgstr "Account disabled"
msgid "Account enabled"
msgstr "Account enabled"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Account Linking Request"
+msgstr "Account Linking Request"
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Account Re-Authentication"
msgstr "Account Re-Authentication"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Account unlinked"
+msgstr "Account unlinked"
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "Acknowledgment"
msgstr "Acknowledgment"
@@ -761,6 +828,7 @@ msgstr "Action"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/team-members-table.tsx
#: apps/remix/app/components/tables/team-members-table.tsx
@@ -799,6 +867,10 @@ msgstr "Active Subscriptions"
msgid "Add"
msgstr "Add"
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "Add 2 or more signers to enable signing order."
+msgstr "Add 2 or more signers to enable signing order."
+
#: apps/remix/app/components/dialogs/organisation-email-domain-create-dialog.tsx
msgid "Add a custom domain to send emails on behalf of your organisation. We'll generate DKIM records that you need to add to your DNS provider."
msgstr "Add a custom domain to send emails on behalf of your organisation. We'll generate DKIM records that you need to add to your DNS provider."
@@ -956,6 +1028,10 @@ msgstr "Add the recipients to create the document with"
msgid "Add these DNS records to verify your domain ownership"
msgstr "Add these DNS records to verify your domain ownership"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Add this URL to your provider's allowed redirect URIs"
+msgstr "Add this URL to your provider's allowed redirect URIs"
+
#: apps/remix/app/components/forms/branding-preferences-form.tsx
msgid "Additional brand information to display at the bottom of emails"
msgstr "Additional brand information to display at the bottom of emails"
@@ -1073,6 +1149,10 @@ msgstr "Allow document recipients to reply directly to this email address"
msgid "Allow signers to dictate next signer"
msgstr "Allow signers to dictate next signer"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Allowed Email Domains"
+msgstr "Allowed Email Domains"
+
#: apps/remix/app/components/embed/authoring/configure-document-advanced-settings.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
@@ -1115,6 +1195,7 @@ msgstr "An email containing an invitation will be sent to each member."
msgid "An email with this address already exists."
msgstr "An email with this address already exists."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
@@ -1134,6 +1215,7 @@ msgstr "An error occurred while adding fields."
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "An error occurred while adding signers."
msgstr "An error occurred while adding signers."
@@ -1141,6 +1223,30 @@ msgstr "An error occurred while adding signers."
msgid "An error occurred while adding the fields."
msgstr "An error occurred while adding the fields."
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the document settings."
+msgstr "An error occurred while auto-saving the document settings."
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the fields."
+msgstr "An error occurred while auto-saving the fields."
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the subject form."
+msgstr "An error occurred while auto-saving the subject form."
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template fields."
+msgstr "An error occurred while auto-saving the template fields."
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template placeholders."
+msgstr "An error occurred while auto-saving the template placeholders."
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template settings."
+msgstr "An error occurred while auto-saving the template settings."
+
#: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx
msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields."
msgstr "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields."
@@ -1219,6 +1325,10 @@ msgstr "An error occurred while removing the selection."
msgid "An error occurred while removing the signature."
msgstr "An error occurred while removing the signature."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "An error occurred while resetting two factor authentication for the user."
+msgstr "An error occurred while resetting two factor authentication for the user."
+
#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "An error occurred while sending the document."
msgstr "An error occurred while sending the document."
@@ -1276,10 +1386,23 @@ msgstr "An error occurred while updating your profile."
msgid "An error occurred while uploading your document."
msgstr "An error occurred while uploading your document."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "An error occurred. Please try again later."
+msgstr "An error occurred. Please try again later."
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "An organisation wants to create an account for you. Please review the details below."
+msgstr "An organisation wants to create an account for you. Please review the details below."
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "An organisation wants to link your account. Please review the details below."
+msgstr "An organisation wants to link your account. Please review the details below."
+
#: apps/remix/app/components/general/generic-error-layout.tsx
msgid "An unexpected error occurred."
msgstr "An unexpected error occurred."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
#: apps/remix/app/components/general/app-command-menu.tsx
#: apps/remix/app/components/forms/team-update-form.tsx
@@ -1359,35 +1482,46 @@ msgstr "API Tokens"
msgid "App Version"
msgstr "App Version"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "Approve"
+msgstr "Approve"
+
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table-action-dropdown.tsx
#: apps/remix/app/components/tables/documents-table-action-button.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document/document-page-view-button.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Approve"
msgstr "Approve"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Approve Document"
msgstr "Approve Document"
-#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Approved"
+msgstr "Approved"
+
+#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Approved"
msgstr "Approved"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Approver"
msgstr "Approver"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Approvers"
msgstr "Approvers"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Approving"
msgstr "Approving"
@@ -1423,6 +1557,7 @@ msgstr "Are you sure you wish to delete this organisation?"
msgid "Are you sure you wish to delete this team?"
msgstr "Are you sure you wish to delete this team?"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: apps/remix/app/components/dialogs/team-member-delete-dialog.tsx
@@ -1445,10 +1580,11 @@ msgid "Assigned Teams"
msgstr "Assigned Teams"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
msgid "Assist"
msgstr "Assist"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Assist Document"
msgstr "Assist Document"
@@ -1458,6 +1594,7 @@ msgid "Assist with signing"
msgstr "Assist with signing"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Assistant"
msgstr "Assistant"
@@ -1466,6 +1603,7 @@ msgid "Assistant role is only available when the document is in sequential signi
msgstr "Assistant role is only available when the document is in sequential signing mode."
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Assistants"
msgstr "Assistants"
@@ -1473,12 +1611,17 @@ msgstr "Assistants"
msgid "Assistants and Copy roles are currently not compatible with the multi-sign experience."
msgstr "Assistants and Copy roles are currently not compatible with the multi-sign experience."
-#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Assisted"
+msgstr "Assisted"
+
+#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Assisted"
msgstr "Assisted"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Assisting"
msgstr "Assisting"
@@ -1505,6 +1648,10 @@ msgstr "Audit Logs"
msgid "Authentication Level"
msgstr "Authentication Level"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Authentication Portal Not Found"
+msgstr "Authentication Portal Not Found"
+
#: apps/remix/app/components/general/document-signing/document-signing-auth-page.tsx
#: apps/remix/app/components/general/direct-template/direct-template-signing-auth-page.tsx
msgid "Authentication required"
@@ -1635,6 +1782,11 @@ msgstr "Bulk Send via CSV"
msgid "by <0>{senderName}0>"
msgstr "by <0>{senderName}0>"
+#. placeholder {0}: organisation.name
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "By accepting this request, you grant {0} the following permissions:"
+msgstr "By accepting this request, you grant {0} the following permissions:"
+
#: packages/email/templates/confirm-team-email.tsx
msgid "By accepting this request, you will be granting <0>{teamName}0> access to:"
msgstr "By accepting this request, you will be granting <0>{teamName}0> access to:"
@@ -1667,6 +1819,7 @@ msgstr "By using the electronic signature feature, you are consenting to conduct
msgid "Can prepare"
msgstr "Can prepare"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
@@ -1758,19 +1911,27 @@ msgid "Cannot remove signer"
msgstr "Cannot remove signer"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Cc"
msgstr "Cc"
#: packages/lib/constants/recipient-roles.ts
-#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
msgid "CC"
msgstr "CC"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
+msgid "CC"
+msgstr "CC"
+
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
msgid "CC'd"
msgstr "CC'd"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Ccers"
msgstr "Ccers"
@@ -1867,10 +2028,27 @@ msgstr "Click to copy signing link for sending to recipient"
msgid "Click to insert field"
msgstr "Click to insert field"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client ID"
+msgstr "Client ID"
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client ID is required"
+msgstr "Client ID is required"
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client Secret"
+msgstr "Client Secret"
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client secret is required"
+msgstr "Client secret is required"
+
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-passkey.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-2fa.tsx
#: apps/remix/app/components/general/document/document-recipient-link-copy-dialog.tsx
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
#: apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
@@ -1897,6 +2075,8 @@ msgstr "Compare all plans and features in detail"
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/forms/signup.tsx
#: apps/remix/app/components/embed/embed-document-signing-page.tsx
+#: apps/remix/app/components/embed/embed-document-signing-page.tsx
+#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
msgid "Complete"
@@ -1918,9 +2098,9 @@ msgstr "Complete Document"
msgid "Complete Signing"
msgstr "Complete Signing"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-msgid "Complete the fields for the following signers. Once reviewed, they will inform you if any modifications are needed."
-msgstr "Complete the fields for the following signers. Once reviewed, they will inform you if any modifications are needed."
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
+msgid "Complete the fields for the following signers."
+msgstr "Complete the fields for the following signers."
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
@@ -2040,6 +2220,7 @@ msgstr "Confirm Deletion"
msgid "Confirm email"
msgstr "Confirm email"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/send-confirmation-email.tsx
msgid "Confirmation email sent"
msgstr "Confirmation email sent"
@@ -2056,6 +2237,10 @@ msgstr "Contact Information"
msgid "Contact sales here"
msgstr "Contact sales here"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Contact us"
+msgstr "Contact us"
+
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
msgid "Content"
msgstr "Content"
@@ -2136,6 +2321,8 @@ msgstr "Controls which signatures are allowed to be used when signing a document
msgid "Copied"
msgstr "Copied"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/components/tables/settings-public-profile-templates-table.tsx
#: apps/remix/app/components/general/avatar-with-recipient.tsx
#: apps/remix/app/components/general/template/template-direct-link-badge.tsx
@@ -2177,6 +2364,11 @@ msgstr "Copy Signing Links"
msgid "Copy token"
msgstr "Copy token"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "couldn't be uploaded:"
+msgstr "couldn't be uploaded:"
+
#: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
@@ -2203,6 +2395,10 @@ msgstr "Create a new email address for your organisation using the domain <0>{0}
msgid "Create a new organisation with {planName} plan. Keep your current organisation on it's current plan"
msgstr "Create a new organisation with {planName} plan. Keep your current organisation on it's current plan"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Create a support ticket"
+msgstr "Create a support ticket"
+
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Create a team to collaborate with your team members."
msgstr "Create a team to collaborate with your team members."
@@ -2461,6 +2657,7 @@ msgstr "Date created"
msgid "Date Format"
msgstr "Date Format"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/general/organisations/organisation-invitations.tsx
#: packages/email/templates/organisation-invite.tsx
msgid "Decline"
@@ -2486,6 +2683,10 @@ msgstr "Default Email"
msgid "Default Email Settings"
msgstr "Default Email Settings"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Default Organisation Role for New Users"
+msgstr "Default Organisation Role for New Users"
+
#: apps/remix/app/components/forms/document-preferences-form.tsx
msgid "Default Signature Settings"
msgstr "Default Signature Settings"
@@ -2747,6 +2948,10 @@ msgstr "Disabling direct link signing will prevent anyone from accessing the lin
msgid "Disabling the user results in the user not being able to use the account. It also disables all the related contents such as subscription, webhooks, teams, and API keys."
msgstr "Disabling the user results in the user not being able to use the account. It also disables all the related contents such as subscription, webhooks, teams, and API keys."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Discord"
+msgstr "Discord"
+
#: apps/remix/app/components/dialogs/organisation-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "Display Name"
@@ -2815,6 +3020,7 @@ msgid "Document access"
msgstr "Document access"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document access auth updated"
msgstr "Document access auth updated"
@@ -2832,9 +3038,13 @@ msgstr "Document Approved"
msgid "Document Cancelled"
msgstr "Document Cancelled"
+#: packages/lib/utils/document-audit-logs.ts
+#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document completed"
+msgstr "Document completed"
+
#: apps/remix/app/components/general/document/document-status.tsx
-#: packages/lib/utils/document-audit-logs.ts
-#: packages/lib/utils/document-audit-logs.ts
msgid "Document completed"
msgstr "Document completed"
@@ -2847,8 +3057,12 @@ msgstr "Document completed email"
msgid "Document Completed!"
msgstr "Document Completed!"
-#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document created"
+msgstr "Document created"
+
+#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "Document created"
msgstr "Document created"
@@ -2874,10 +3088,14 @@ msgstr "Document created using a <0>direct link0>"
msgid "Document Creation"
msgstr "Document Creation"
+#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document deleted"
+msgstr "Document deleted"
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
#: apps/remix/app/components/dialogs/admin-document-delete-dialog.tsx
-#: packages/lib/utils/document-audit-logs.ts
msgid "Document deleted"
msgstr "Document deleted"
@@ -2903,6 +3121,7 @@ msgid "Document Duplicated"
msgstr "Document Duplicated"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document external ID updated"
msgstr "Document external ID updated"
@@ -2940,6 +3159,7 @@ msgid "Document moved"
msgstr "Document moved"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document moved to team"
msgstr "Document moved to team"
@@ -2948,6 +3168,7 @@ msgid "Document no longer available to sign"
msgstr "Document no longer available to sign"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document opened"
msgstr "Document opened"
@@ -2988,8 +3209,12 @@ msgstr "Document Rejected"
msgid "Document resealed"
msgstr "Document resealed"
-#: apps/remix/app/components/general/document/document-edit-form.tsx
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document sent"
+msgstr "Document sent"
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "Document sent"
msgstr "Document sent"
@@ -2998,6 +3223,7 @@ msgid "Document Signed"
msgstr "Document Signed"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document signing auth updated"
msgstr "Document signing auth updated"
@@ -3014,10 +3240,12 @@ msgid "Document title"
msgstr "Document title"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document title updated"
msgstr "Document title updated"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document updated"
msgstr "Document updated"
@@ -3035,6 +3263,7 @@ msgid "Document uploaded"
msgstr "Document uploaded"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document viewed"
msgstr "Document viewed"
@@ -3043,6 +3272,7 @@ msgid "Document Viewed"
msgstr "Document Viewed"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document visibility updated"
msgstr "Document visibility updated"
@@ -3050,6 +3280,10 @@ msgstr "Document visibility updated"
msgid "Document will be permanently deleted"
msgstr "Document will be permanently deleted"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Documentation"
+msgstr "Documentation"
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx
@@ -3160,6 +3394,11 @@ msgid "Drag and drop your PDF file here"
msgstr "Drag and drop your PDF file here"
#: packages/lib/constants/document.ts
+msgctxt "Draw signatute type"
+msgid "Draw"
+msgstr "Draw"
+
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Draw"
msgstr "Draw"
@@ -3406,6 +3645,10 @@ msgstr "Enable Direct Link Signing"
msgid "Enable signing order"
msgstr "Enable signing order"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Enable SSO portal"
+msgstr "Enable SSO portal"
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
@@ -3470,13 +3713,18 @@ msgstr "Enterprise"
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
#: apps/remix/app/components/general/verify-email-banner.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
@@ -3505,6 +3753,10 @@ msgstr "Enterprise"
#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
@@ -3516,6 +3768,7 @@ msgstr "Enterprise"
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -3574,6 +3827,10 @@ msgstr "Failed to create folder"
msgid "Failed to create subscription claim."
msgstr "Failed to create subscription claim."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Failed to create support ticket"
+msgstr "Failed to create support ticket"
+
#: apps/remix/app/components/dialogs/folder-delete-dialog.tsx
msgid "Failed to delete folder"
msgstr "Failed to delete folder"
@@ -3606,6 +3863,10 @@ msgstr "Failed to save settings."
msgid "Failed to sign out all sessions"
msgstr "Failed to sign out all sessions"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Failed to unlink account"
+msgstr "Failed to unlink account"
+
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
msgid "Failed to update document"
msgstr "Failed to update document"
@@ -3664,14 +3925,17 @@ msgid "Field placeholder"
msgstr "Field placeholder"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field prefilled by assistant"
msgstr "Field prefilled by assistant"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field signed"
msgstr "Field signed"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field unsigned"
msgstr "Field unsigned"
@@ -3683,13 +3947,21 @@ msgstr "Fields"
msgid "Fields updated"
msgstr "Fields updated"
-#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-upload.tsx
-#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
+msgstr "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
+
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "File is too small"
+msgstr "File is too small"
+
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB"
msgstr "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB"
@@ -3805,6 +4077,7 @@ msgstr "Generate Links"
msgid "Global recipient action authentication"
msgstr "Global recipient action authentication"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
@@ -3995,6 +4268,10 @@ msgstr "Home (No Folder)"
msgid "Horizontal"
msgstr "Horizontal"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "I agree to link my account with this organization"
+msgstr "I agree to link my account with this organization"
+
#: packages/lib/constants/recipient-roles.ts
msgid "I am a signer of this document"
msgstr "I am a signer of this document"
@@ -4019,6 +4296,10 @@ msgstr "I am required to receive a copy of this document"
msgid "I am the owner of this document"
msgstr "I am the owner of this document"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "I understand that I am providing my credentials to a 3rd party service configured by this organisation"
+msgstr "I understand that I am providing my credentials to a 3rd party service configured by this organisation"
+
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx
#: apps/remix/app/components/dialogs/token-delete-dialog.tsx
msgid "I'm sure! Delete it"
@@ -4048,6 +4329,10 @@ msgstr "If you don't find the confirmation link in your inbox, you can request a
msgid "If your authenticator app does not support QR codes, you can use the following code instead:"
msgstr "If your authenticator app does not support QR codes, you can use the following code instead:"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Important: What This Means"
+msgstr "Important: What This Means"
+
#: apps/remix/app/components/general/app-nav-mobile.tsx
#: apps/remix/app/components/general/app-nav-mobile.tsx
#: apps/remix/app/components/general/document/document-status.tsx
@@ -4115,6 +4400,10 @@ msgstr "Instance Stats"
msgid "Invalid code. Please try again."
msgstr "Invalid code. Please try again."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Invalid domains"
+msgstr "Invalid domains"
+
#: packages/ui/primitives/document-flow/add-signers.types.ts
msgid "Invalid email"
msgstr "Invalid email"
@@ -4128,6 +4417,10 @@ msgstr "Invalid link"
msgid "Invalid token"
msgstr "Invalid token"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Invalid Token"
+msgstr "Invalid Token"
+
#: apps/remix/app/components/forms/reset-password.tsx
msgid "Invalid token provided. Please try again."
msgstr "Invalid token provided. Please try again."
@@ -4187,6 +4480,10 @@ msgstr "Invoice"
msgid "IP Address"
msgstr "IP Address"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Issuer URL"
+msgstr "Issuer URL"
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "It is crucial to keep your contact information, especially your email address, up to date with us. Please notify us immediately of any changes to ensure that you continue to receive all necessary communications."
msgstr "It is crucial to keep your contact information, especially your email address, up to date with us. Please notify us immediately of any changes to ensure that you continue to receive all necessary communications."
@@ -4220,6 +4517,10 @@ msgstr "It's currently not your turn to sign. You will receive an email with ins
msgid "Join {organisationName} on Documenso"
msgstr "Join {organisationName} on Documenso"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Join our community on <0>Discord0> for community support and discussion."
+msgstr "Join our community on <0>Discord0> for community support and discussion."
+
#. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' })
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "Joined {0}"
@@ -4314,10 +4615,27 @@ msgstr "Like to have your own public profile with agreements?"
msgid "Link expires in 1 hour."
msgstr "Link expires in 1 hour."
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Link expires in 30 minutes."
+msgstr "Link expires in 30 minutes."
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.public-profile.tsx
msgid "Link template"
msgstr "Link template"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Link your Documenso account"
+msgstr "Link your Documenso account"
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "Linked Accounts"
+msgstr "Linked Accounts"
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Linked At"
+msgstr "Linked At"
+
#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "Links Generated"
msgstr "Links Generated"
@@ -4342,6 +4660,10 @@ msgstr "Loading document..."
msgid "Loading Document..."
msgstr "Loading Document..."
+#: packages/ui/components/recipient/recipient-autocomplete-input.tsx
+msgid "Loading suggestions..."
+msgstr "Loading suggestions..."
+
#: apps/remix/app/components/general/document/document-page-view-recent-activity.tsx
msgid "Loading..."
msgstr "Loading..."
@@ -4367,6 +4689,10 @@ msgstr "Manage"
msgid "Manage {0}'s profile"
msgstr "Manage {0}'s profile"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Manage a custom SSO login portal for your organisation."
+msgstr "Manage a custom SSO login portal for your organisation."
+
#: apps/remix/app/routes/_authenticated+/settings+/organisations.tsx
msgid "Manage all organisations you are currently associated with."
msgstr "Manage all organisations you are currently associated with."
@@ -4399,6 +4725,10 @@ msgstr "Manage Direct Link"
msgid "Manage documents"
msgstr "Manage documents"
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "Manage linked accounts"
+msgstr "Manage linked accounts"
+
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "Manage organisation"
msgstr "Manage organisation"
@@ -4534,6 +4864,10 @@ msgstr "Member"
msgid "Member Count"
msgstr "Member Count"
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "Member promoted to owner successfully"
+msgstr "Member promoted to owner successfully"
+
#: apps/remix/app/components/tables/organisation-members-table.tsx
msgid "Member Since"
msgstr "Member Since"
@@ -4549,6 +4883,7 @@ msgstr "Member Since"
msgid "Members"
msgstr "Members"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Message"
@@ -4784,6 +5119,10 @@ msgstr "No signature field found"
msgid "No Stripe customer attached"
msgstr "No Stripe customer attached"
+#: packages/ui/components/recipient/recipient-autocomplete-input.tsx
+msgid "No suggestions found"
+msgstr "No suggestions found"
+
#: apps/remix/app/components/tables/team-groups-table.tsx
msgid "No team groups found"
msgstr "No team groups found"
@@ -4914,6 +5253,16 @@ msgstr "Only admins can access and view the document"
msgid "Only managers and above can access and view the document"
msgstr "Only managers and above can access and view the document"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Only one file can be uploaded at a time"
+msgstr "Only one file can be uploaded at a time"
+
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Only PDF files are allowed"
+msgstr "Only PDF files are allowed"
+
#: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/general/generic-error-layout.tsx
#: apps/remix/app/components/general/generic-error-layout.tsx
@@ -4929,10 +5278,15 @@ msgstr "Opened"
msgid "Or"
msgstr "Or"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "OR"
+msgstr "OR"
+
#: apps/remix/app/components/forms/signin.tsx
msgid "Or continue with"
msgstr "Or continue with"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/tables/user-organisations-table.tsx
#: apps/remix/app/components/tables/admin-organisations-table.tsx
msgid "Organisation"
@@ -4942,6 +5296,10 @@ msgstr "Organisation"
msgid "Organisation Admin"
msgstr "Organisation Admin"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Organisation authentication portal URL"
+msgstr "Organisation authentication portal URL"
+
#: apps/remix/app/components/dialogs/admin-organisation-create-dialog.tsx
msgid "Organisation created"
msgstr "Organisation created"
@@ -5012,6 +5370,10 @@ msgstr "Organisation settings"
msgid "Organisation Settings"
msgstr "Organisation Settings"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Organisation SSO Portal"
+msgstr "Organisation SSO Portal"
+
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "Organisation Teams"
msgstr "Organisation Teams"
@@ -5304,9 +5666,13 @@ msgstr "Please enter a meaningful name for your token. This will help you identi
msgid "Please enter a valid name."
msgstr "Please enter a valid name."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-msgid "Please mark as viewed to complete"
-msgstr "Please mark as viewed to complete"
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
+msgid "Please mark as viewed to complete."
+msgstr "Please mark as viewed to complete."
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Please note that anyone who signs in through your portal will be added to your organisation as a member."
+msgstr "Please note that anyone who signs in through your portal will be added to your organisation as a member."
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid "Please note that proceeding will remove direct linking recipient and turn it into a placeholder."
@@ -5344,11 +5710,11 @@ msgstr "Please provide a token from the authenticator, or a backup code. If you
msgid "Please provide a token from your authenticator, or a backup code."
msgstr "Please provide a token from your authenticator, or a backup code."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
msgid "Please review the document before approving."
msgstr "Please review the document before approving."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
msgid "Please review the document before signing."
msgstr "Please review the document before signing."
@@ -5444,6 +5810,18 @@ msgstr "Profile updated"
msgid "Progress"
msgstr "Progress"
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "Promote to owner"
+msgstr "Promote to owner"
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Provider"
+msgstr "Provider"
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Provider has been updated successfully"
+msgstr "Provider has been updated successfully"
+
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/general/template/template-type.tsx
msgid "Public"
@@ -5480,6 +5858,10 @@ msgstr "Radio values"
msgid "Read only"
msgstr "Read only"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Read our documentation to get started with Documenso."
+msgstr "Read our documentation to get started with Documenso."
+
#: apps/remix/app/components/general/document-signing/document-signing-disclosure.tsx
msgid "Read the full <0>signature disclosure0>."
msgstr "Read the full <0>signature disclosure0>."
@@ -5596,6 +5978,10 @@ msgstr "Recovery codes"
msgid "Red"
msgstr "Red"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Redirect URI"
+msgstr "Redirect URI"
+
#: apps/remix/app/components/embed/authoring/configure-document-advanced-settings.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
@@ -5709,6 +6095,10 @@ msgstr "Reply to email"
msgid "Reply To Email"
msgstr "Reply To Email"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Requesting Organisation"
+msgstr "Requesting Organisation"
+
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx
@@ -5717,6 +6107,10 @@ msgstr "Reply To Email"
msgid "Required field"
msgstr "Required field"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Required scopes"
+msgstr "Required scopes"
+
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
msgid "Reseal document"
msgstr "Reseal document"
@@ -5741,6 +6135,11 @@ msgstr "Resend verification"
msgid "Reset"
msgstr "Reset"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset 2FA"
+msgstr "Reset 2FA"
+
#: apps/remix/app/components/forms/forgot-password.tsx
msgid "Reset email sent"
msgstr "Reset email sent"
@@ -5752,6 +6151,14 @@ msgstr "Reset email sent"
msgid "Reset Password"
msgstr "Reset Password"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset the users two factor authentication. This action is irreversible and will disable two factor authentication for the user."
+msgstr "Reset the users two factor authentication. This action is irreversible and will disable two factor authentication for the user."
+
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset Two Factor Authentication"
+msgstr "Reset Two Factor Authentication"
+
#: apps/remix/app/components/forms/reset-password.tsx
msgid "Resetting Password..."
msgstr "Resetting Password..."
@@ -5783,9 +6190,14 @@ msgstr "Retry"
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
msgid "Return"
msgstr "Return"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Return to Documenso sign in page here"
+msgstr "Return to Documenso sign in page here"
+
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
msgid "Return to Home"
msgstr "Return to Home"
@@ -5795,6 +6207,10 @@ msgstr "Return to Home"
msgid "Return to sign in"
msgstr "Return to sign in"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Review request"
+msgstr "Review request"
+
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
msgid "Revoke"
@@ -5969,6 +6385,10 @@ msgstr "Select authentication methods"
msgid "Select default option"
msgstr "Select default option"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Select default role"
+msgstr "Select default role"
+
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx
msgid "Select direction"
msgstr "Select direction"
@@ -6184,6 +6604,11 @@ msgstr "Show advanced settings"
msgid "Show templates in your public profile for your audience to sign and get started quickly"
msgstr "Show templates in your public profile for your audience to sign and get started quickly"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "Sign"
+msgstr "Sign"
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table-action-dropdown.tsx
@@ -6197,7 +6622,6 @@ msgstr "Show templates in your public profile for your audience to sign and get
#: apps/remix/app/components/general/document-signing/document-signing-auth-password.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-2fa.tsx
#: apps/remix/app/components/general/document/document-page-view-button.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Sign"
msgstr "Sign"
@@ -6219,7 +6643,7 @@ msgstr "Sign as<0>{0} <1>({1})1>0>"
msgid "Sign document"
msgstr "Sign document"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Sign Document"
msgstr "Sign Document"
@@ -6237,6 +6661,7 @@ msgstr "Sign field"
msgid "Sign Here"
msgstr "Sign Here"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: packages/email/template-components/template-reset-password.tsx
@@ -6244,6 +6669,7 @@ msgid "Sign In"
msgstr "Sign In"
#: apps/remix/app/routes/_unauthenticated+/signin.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
msgid "Sign in to your account"
msgstr "Sign in to your account"
@@ -6311,14 +6737,19 @@ msgstr "Signatures Collected"
msgid "Signatures will appear once the document has been completed"
msgstr "Signatures will appear once the document has been completed"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Signed"
+msgstr "Signed"
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/ui/components/document/document-read-only-fields.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Signed"
msgstr "Signed"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Signer"
msgstr "Signer"
@@ -6327,14 +6758,12 @@ msgid "Signer Events"
msgstr "Signer Events"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Signers"
msgstr "Signers"
-#: packages/ui/primitives/document-flow/add-signers.types.ts
-msgid "Signers must have unique emails"
-msgstr "Signers must have unique emails"
-
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Signing"
msgstr "Signing"
@@ -6507,6 +6936,14 @@ msgstr "Sorry, we were unable to download the certificate. Please try again late
msgid "Source"
msgstr "Source"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Space-separated list of domains. Leave empty to allow all domains."
+msgstr "Space-separated list of domains. Leave empty to allow all domains."
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
+msgid "SSO"
+msgstr "SSO"
+
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
msgid "Stats"
msgstr "Stats"
@@ -6538,6 +6975,7 @@ msgstr "Stripe customer created successfully"
msgid "Stripe Customer ID"
msgstr "Stripe Customer ID"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Subject"
msgstr "Subject"
@@ -6547,6 +6985,10 @@ msgstr "Subject"
msgid "Subject <0>(Optional)0>"
msgstr "Subject <0>(Optional)0>"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Submit"
+msgstr "Submit"
+
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx
@@ -6580,10 +7022,12 @@ msgstr "Subscription invalid"
#: apps/remix/app/routes/embed+/v1+/authoring+/template.edit.$id.tsx
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
@@ -6641,6 +7085,15 @@ msgstr "Successfully created: {successCount}"
msgid "Summary:"
msgstr "Summary:"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+#: apps/remix/app/components/general/org-menu-switcher.tsx
+msgid "Support"
+msgstr "Support"
+
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Support ticket created"
+msgstr "Support ticket created"
+
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
msgid "Sync"
msgstr "Sync"
@@ -7048,6 +7501,14 @@ msgstr "The following errors occurred:"
msgid "The following team has been deleted. You will no longer be able to access this team and its documents"
msgstr "The following team has been deleted. You will no longer be able to access this team and its documents"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "The OpenID discovery endpoint URL for your provider"
+msgstr "The OpenID discovery endpoint URL for your provider"
+
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "The organisation authentication portal does not exist, or is not configured"
+msgstr "The organisation authentication portal does not exist, or is not configured"
+
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "The organisation email has been created successfully."
msgstr "The organisation email has been created successfully."
@@ -7192,6 +7653,10 @@ msgstr "The template will be removed from your profile"
msgid "The test webhook has been successfully sent to your endpoint."
msgstr "The test webhook has been successfully sent to your endpoint."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "The token is invalid or has expired."
+msgstr "The token is invalid or has expired."
+
#: apps/remix/app/components/forms/token.tsx
msgid "The token was copied to your clipboard."
msgstr "The token was copied to your clipboard."
@@ -7225,6 +7690,10 @@ msgstr ""
"The user you are looking for may have been removed, renamed or may have never\n"
" existed."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "The user's two factor authentication has been reset successfully."
+msgstr "The user's two factor authentication has been reset successfully."
+
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx
msgid "The webhook has been successfully deleted."
msgstr "The webhook has been successfully deleted."
@@ -7277,6 +7746,10 @@ msgstr "This account has been disabled. Please contact support."
msgid "This account has not been verified. Please verify your account before signing in."
msgstr "This account has not been verified. Please verify your account before signing in."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "This action is irreversible. Please ensure you have informed the user before proceeding."
+msgstr "This action is irreversible. Please ensure you have informed the user before proceeding."
+
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
#: apps/remix/app/components/dialogs/admin-document-delete-dialog.tsx
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
@@ -7395,10 +7868,22 @@ msgstr "This is how the document will reach the recipients once the document is
msgid "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
msgstr "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "This is the required scopes you must set in your provider's settings"
+msgstr "This is the required scopes you must set in your provider's settings"
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "This is the URL which users will use to sign in to your organisation."
+msgstr "This is the URL which users will use to sign in to your organisation."
+
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
msgid "This link is invalid or has expired. Please contact your team to resend a verification."
msgstr "This link is invalid or has expired. Please contact your team to resend a verification."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "This organisation will have administrative control over your account. You can revoke this access later, but they will retain access to any data they've already collected."
+msgstr "This organisation will have administrative control over your account. You can revoke this access later, but they will retain access to any data they've already collected."
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.general.tsx
msgid "This organisation, and any associated data will be permanently deleted."
msgstr "This organisation, and any associated data will be permanently deleted."
@@ -7518,9 +8003,10 @@ msgstr "To be able to add members to a team, you must first add them to the orga
msgid "To change the email you must remove and add a new email address."
msgstr "To change the email you must remove and add a new email address."
+#. placeholder {0}: user.email
#. placeholder {0}: userToEnable.email
#. placeholder {0}: userToDisable.email
-#. placeholder {0}: user.email
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -7536,6 +8022,7 @@ msgid "To enable two-factor authentication, scan the following QR code using you
msgstr "To enable two-factor authentication, scan the following QR code using your authenticator app."
#: apps/remix/app/routes/_unauthenticated+/unverified-account.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
msgid "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
msgstr "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
@@ -7652,9 +8139,14 @@ msgstr "Two-factor authentication has been disabled for your account. You will n
msgid "Two-Factor Re-Authentication"
msgstr "Two-Factor Re-Authentication"
+#: packages/lib/constants/document.ts
+msgctxt "Type signatute type"
+msgid "Type"
+msgstr "Type"
+
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
-#: packages/lib/constants/document.ts
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Type"
msgstr "Type"
@@ -7768,9 +8260,15 @@ msgstr "Uncompleted"
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
msgid "Unknown"
msgstr "Unknown"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Unknown error"
+msgstr "Unknown error"
+
#: apps/remix/app/components/tables/admin-claims-table.tsx
msgid "Unlimited"
msgstr "Unlimited"
@@ -7779,6 +8277,11 @@ msgstr "Unlimited"
msgid "Unlimited documents, API and more"
msgstr "Unlimited documents, API and more"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Unlink"
+msgstr "Unlink"
+
#: apps/remix/app/components/general/folder/folder-card.tsx
msgid "Unpin"
msgstr "Unpin"
@@ -7787,6 +8290,7 @@ msgstr "Unpin"
msgid "Untitled Group"
msgstr "Untitled Group"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
@@ -7926,6 +8430,11 @@ msgid "Upgrade your plan to upload more documents"
msgstr "Upgrade your plan to upload more documents"
#: packages/lib/constants/document.ts
+msgctxt "Upload signatute type"
+msgid "Upload"
+msgstr "Upload"
+
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Upload"
msgstr "Upload"
@@ -7959,6 +8468,11 @@ msgstr "Upload custom document"
msgid "Upload Document"
msgstr "Upload Document"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Upload failed"
+msgstr "Upload failed"
+
#: packages/ui/primitives/signature-pad/signature-pad-upload.tsx
msgid "Upload Signature"
msgstr "Upload Signature"
@@ -8040,6 +8554,7 @@ msgstr "User has no password."
msgid "User not found"
msgstr "User not found"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -8113,6 +8628,11 @@ msgstr "Verify your team email address"
msgid "Vertical"
msgstr "Vertical"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "View"
+msgstr "View"
+
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
@@ -8122,7 +8642,6 @@ msgstr "Vertical"
#: apps/remix/app/components/general/document/document-page-view-button.tsx
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "View"
msgstr "View"
@@ -8155,6 +8674,11 @@ msgstr "View all security activity related to your account."
msgid "View and manage all active sessions for your account."
msgstr "View and manage all active sessions for your account."
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "View and manage all login methods linked to your account."
+msgstr "View and manage all login methods linked to your account."
+
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
msgid "View Codes"
msgstr "View Codes"
@@ -8167,7 +8691,7 @@ msgstr "View DNS Records"
msgid "View document"
msgstr "View document"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
@@ -8217,22 +8741,29 @@ msgstr "View teams"
msgid "View the DNS records for this email domain"
msgstr "View the DNS records for this email domain"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Viewed"
+msgstr "Viewed"
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Viewed"
msgstr "Viewed"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Viewer"
msgstr "Viewer"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Viewers"
msgstr "Viewers"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Viewing"
msgstr "Viewing"
@@ -8295,6 +8826,10 @@ msgstr "We are unable to update this passkey at the moment. Please try again lat
msgid "We couldn't create a Stripe customer. Please try again."
msgstr "We couldn't create a Stripe customer. Please try again."
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "We couldn't promote the member to owner. Please try again."
+msgstr "We couldn't promote the member to owner. Please try again."
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "We couldn't update the group. Please try again."
msgstr "We couldn't update the group. Please try again."
@@ -8304,6 +8839,10 @@ msgstr "We couldn't update the group. Please try again."
msgid "We couldn't update the organisation. Please try again."
msgstr "We couldn't update the organisation. Please try again."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "We couldn't update the provider. Please try again."
+msgstr "We couldn't update the provider. Please try again."
+
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "We encountered an error while creating the email. Please try again later."
msgstr "We encountered an error while creating the email. Please try again later."
@@ -8412,6 +8951,7 @@ msgstr "We encountered an unknown error while attempting to reset your password.
msgid "We encountered an unknown error while attempting to revoke access. Please try again or contact support."
msgstr "We encountered an unknown error while attempting to revoke access. Please try again or contact support."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/signin.tsx
msgid "We encountered an unknown error while attempting to sign you In. Please try again later."
@@ -8547,6 +9087,10 @@ msgstr "We will generate signing links for you, which you can send to the recipi
msgid "We won't send anything to notify recipients."
msgstr "We won't send anything to notify recipients."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "We'll get back to you as soon as possible via email."
+msgstr "We'll get back to you as soon as possible via email."
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates._index.tsx
#: apps/remix/app/components/tables/documents-table-empty-state.tsx
msgid "We're all empty"
@@ -8604,10 +9148,18 @@ msgstr "Welcome back, we are lucky to have you."
msgid "Welcome back! Here's an overview of your account."
msgstr "Welcome back! Here's an overview of your account."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Welcome to {organisationName}"
+msgstr "Welcome to {organisationName}"
+
#: packages/email/template-components/template-confirmation-email.tsx
msgid "Welcome to Documenso!"
msgstr "Welcome to Documenso!"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Well-known URL is required"
+msgstr "Well-known URL is required"
+
#: apps/remix/app/routes/_recipient+/sign.$token+/waiting.tsx
msgid "Were you trying to edit this document instead?"
msgstr "Were you trying to edit this document instead?"
@@ -8634,6 +9186,10 @@ msgstr "When you sign a document, we can automatically fill in and sign the foll
msgid "When you use our platform to affix your electronic signature to documents, you are consenting to do so under the Electronic Signatures in Global and National Commerce Act (E-Sign Act) and other applicable laws. This action indicates your agreement to use electronic means to sign documents and receive notifications."
msgstr "When you use our platform to affix your electronic signature to documents, you are consenting to do so under the Electronic Signatures in Global and National Commerce Act (E-Sign Act) and other applicable laws. This action indicates your agreement to use electronic means to sign documents and receive notifications."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Whether to enable the SSO portal for your organisation"
+msgstr "Whether to enable the SSO portal for your organisation"
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
msgid "While waiting for them to do so you can create your own Documenso account and get started with document signing right away."
msgstr "While waiting for them to do so you can create your own Documenso account and get started with document signing right away."
@@ -8701,6 +9257,10 @@ msgstr "You are about to leave the following organisation."
msgid "You are about to remove default access to this team for all organisation members. Any members not explicitly added to this team will no longer have access."
msgstr "You are about to remove default access to this team for all organisation members. Any members not explicitly added to this team will no longer have access."
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "You are about to remove the <0>{provider}0> login method from your account."
+msgstr "You are about to remove the <0>{provider}0> login method from your account."
+
#. placeholder {0}: organisation.name
#: apps/remix/app/components/dialogs/organisation-email-domain-delete-dialog.tsx
msgid "You are about to remove the email domain <0>{emailDomain}0> from <1>{0}1>. All emails associated with this domain will be deleted."
@@ -8787,6 +9347,10 @@ msgstr "You are not authorized to disable this user."
msgid "You are not authorized to enable this user."
msgstr "You are not authorized to enable this user."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "You are not authorized to reset two factor authentcation for this user."
+msgstr "You are not authorized to reset two factor authentcation for this user."
+
#: packages/email/template-components/template-confirmation-email.tsx
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)"
@@ -9077,6 +9641,10 @@ msgstr "You will now be required to enter a code from your authenticator app whe
msgid "You will receive an Email copy of the signed document once everyone has signed."
msgstr "You will receive an Email copy of the signed document once everyone has signed."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Your Account"
+msgstr "Your Account"
+
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
msgid "Your account has been deleted successfully."
msgstr "Your account has been deleted successfully."
@@ -9110,6 +9678,10 @@ msgstr "Your bulk send operation for template \"{templateName}\" has completed."
msgid "Your current {currentProductName} plan is past due. Please update your payment information."
msgstr "Your current {currentProductName} plan is past due. Please update your payment information."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Your current plan includes the following support channels:"
+msgstr "Your current plan includes the following support channels:"
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.billing.tsx
msgid "Your current plan is inactive."
msgstr "Your current plan is inactive."
@@ -9123,7 +9695,6 @@ msgid "Your direct signing templates"
msgstr "Your direct signing templates"
#: apps/remix/app/components/general/document/document-upload.tsx
-#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "Your document failed to upload."
msgstr "Your document failed to upload."
@@ -9256,6 +9827,10 @@ msgstr "Your recovery code has been copied to your clipboard."
msgid "Your recovery codes are listed below. Please store them in a safe place."
msgstr "Your recovery codes are listed below. Please store them in a safe place."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Your support request has been submitted. We'll get back to you soon!"
+msgstr "Your support request has been submitted. We'll get back to you soon!"
+
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Your team has been created."
msgstr "Your team has been created."
@@ -9268,10 +9843,6 @@ msgstr "Your team has been successfully deleted."
msgid "Your team has been successfully updated."
msgstr "Your team has been successfully updated."
-#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
-msgid "Your template failed to upload."
-msgstr "Your template failed to upload."
-
#: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx
msgid "Your template has been created successfully"
msgstr "Your template has been created successfully"
@@ -9307,3 +9878,7 @@ msgstr "Your token was created successfully! Make sure to copy it because you wo
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.tokens.tsx
msgid "Your tokens will be shown here once you create them."
msgstr "Your tokens will be shown here once you create them."
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "your-domain.com another-domain.com"
+msgstr "your-domain.com another-domain.com"
diff --git a/packages/lib/translations/es/web.po b/packages/lib/translations/es/web.po
index 1d23791d2..a2520c175 100644
--- a/packages/lib/translations/es/web.po
+++ b/packages/lib/translations/es/web.po
@@ -414,14 +414,30 @@ msgstr "{visibleRows, plural, one {Mostrando # resultado.} other {Mostrando # re
msgid "<0>\"{0}\"0>is no longer available to sign"
msgstr "<0>\"{0}\"0> ya no está disponible para firmar"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "<0>{organisationName}0> has requested to create an account on your behalf."
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "<0>{organisationName}0> has requested to link your current Documenso account to their organisation."
+msgstr ""
+
#: packages/email/templates/confirm-team-email.tsx
msgid "<0>{teamName}0> has requested to use your email address for their team on Documenso."
msgstr "<0>{teamName}0> ha solicitado usar tu dirección de correo electrónico para su equipo en Documenso."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Account management:0> Modify your account settings, permissions, and preferences"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "<0>Click to upload0> or drag and drop"
msgstr "<0>Haga clic para subir0> o arrastre y suelte"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Data access:0> Access all data associated with your account"
+msgstr ""
+
#: packages/ui/components/document/document-signature-settings-tooltip.tsx
msgid "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
msgstr "<0>Dibujado0> - Una firma que se dibuja usando un ratón o un lápiz óptico."
@@ -430,6 +446,10 @@ msgstr "<0>Dibujado0> - Una firma que se dibuja usando un ratón o un lápiz
msgid "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
msgstr "<0>Correo electrónico0> - Al destinatario se le enviará el documento para firmar, aprobar, etc."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Full account access:0> View all your profile information, settings, and activity"
+msgstr ""
+
#: packages/ui/components/recipient/recipient-action-auth-select.tsx
msgid "<0>Inherit authentication method0> - Use the global action signing authentication method configured in the \"General Settings\" step"
msgstr "<0>Heredar método de autenticación0> - Use el método de autenticación de firma de acción global configurado en el paso \"Configuración General\""
@@ -517,10 +537,18 @@ msgstr "12 meses"
msgid "2FA"
msgstr "2FA"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "2FA Reset"
+msgstr ""
+
#: apps/remix/app/components/forms/token.tsx
msgid "3 months"
msgstr "3 meses"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "400 Error"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
msgid "401 Unauthorized"
@@ -534,6 +562,10 @@ msgstr "404 Dominio de correo electrónico no encontrado"
msgid "404 not found"
msgstr "404 no encontrado"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "404 Not Found"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "404 Organisation group not found"
msgstr "404 Grupo de organización no encontrado"
@@ -597,16 +629,19 @@ msgid "A draft document will be created"
msgstr "Se creará un documento borrador"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was added"
-msgstr "Se añadió un campo"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was removed"
-msgstr "Se eliminó un campo"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was updated"
-msgstr "Se actualizó un campo"
+msgstr ""
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "A means to print or download documents for your records"
@@ -646,16 +681,27 @@ msgid "A password reset email has been sent, if you have an account you should s
msgstr "Se ha enviado un correo electrónico para restablecer la contraseña, si tienes una cuenta deberías verlo en tu bandeja de entrada en breve."
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was added"
-msgstr "Se añadió un destinatario"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was removed"
-msgstr "Se eliminó un destinatario"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was updated"
-msgstr "Se actualizó un destinatario"
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "A request has been made to create an account for you"
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "A request has been made to link your Documenso account"
+msgstr ""
#. placeholder {0}: team.name
#: packages/lib/server-only/team/create-team-email-verification.ts
@@ -706,6 +752,10 @@ msgstr "Se enviará un correo electrónico de verificación a la dirección prop
msgid "Accept"
msgstr "Aceptar"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Accept & Link Account"
+msgstr ""
+
#: packages/email/templates/organisation-invite.tsx
msgid "Accept invitation to join an organisation on Documenso"
msgstr "Aceptar invitación para unirse a una organización en Documenso"
@@ -726,6 +776,7 @@ msgstr "Acceso deshabilitado"
msgid "Access enabled"
msgstr "Acceso habilitado"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/general/org-menu-switcher.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
msgid "Account"
@@ -735,6 +786,14 @@ msgstr "Cuenta"
msgid "Account Authentication"
msgstr "Autenticación de Cuenta"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Account creation request"
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Account Creation Request"
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
msgid "Account deleted"
@@ -748,10 +807,18 @@ msgstr "Cuenta deshabilitada"
msgid "Account enabled"
msgstr "Cuenta habilitada"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Account Linking Request"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Account Re-Authentication"
msgstr "Re-autenticación de Cuenta"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Account unlinked"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "Acknowledgment"
msgstr "Reconocimiento"
@@ -766,6 +833,7 @@ msgstr "Acción"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/team-members-table.tsx
#: apps/remix/app/components/tables/team-members-table.tsx
@@ -804,6 +872,10 @@ msgstr "Suscripciones Activas"
msgid "Add"
msgstr "Agregar"
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "Add 2 or more signers to enable signing order."
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-domain-create-dialog.tsx
msgid "Add a custom domain to send emails on behalf of your organisation. We'll generate DKIM records that you need to add to your DNS provider."
msgstr "Agrega un dominio personalizado para enviar correos electrónicos en nombre de tu organización. Generaremos registros DKIM que necesitarás añadir a tu proveedor de DNS."
@@ -961,6 +1033,10 @@ msgstr "Agrega los destinatarios con los que crear el documento"
msgid "Add these DNS records to verify your domain ownership"
msgstr "Añade estos registros DNS para verificar la propiedad de tu dominio"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Add this URL to your provider's allowed redirect URIs"
+msgstr ""
+
#: apps/remix/app/components/forms/branding-preferences-form.tsx
msgid "Additional brand information to display at the bottom of emails"
msgstr "Información adicional de la marca para mostrar al final de los correos electrónicos"
@@ -1078,6 +1154,10 @@ msgstr "Permitir que los destinatarios del documento respondan directamente a es
msgid "Allow signers to dictate next signer"
msgstr "Permitir a los firmantes dictar al siguiente firmante"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Allowed Email Domains"
+msgstr ""
+
#: apps/remix/app/components/embed/authoring/configure-document-advanced-settings.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
@@ -1120,6 +1200,7 @@ msgstr "Un correo electrónico que contiene una invitación se enviará a cada m
msgid "An email with this address already exists."
msgstr "Ya existe un correo electrónico con esta dirección."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
@@ -1139,6 +1220,7 @@ msgstr "Ocurrió un error al agregar campos."
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "An error occurred while adding signers."
msgstr "Ocurrió un error al agregar firmantes."
@@ -1146,6 +1228,30 @@ msgstr "Ocurrió un error al agregar firmantes."
msgid "An error occurred while adding the fields."
msgstr "Ocurrió un error al agregar los campos."
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the document settings."
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the fields."
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the subject form."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template fields."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template placeholders."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template settings."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx
msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields."
msgstr "Se produjo un error al firmar automáticamente el documento, es posible que algunos campos no estén firmados. Por favor, revise y firme manualmente cualquier campo restante."
@@ -1224,6 +1330,10 @@ msgstr "Ocurrió un error al eliminar la selección."
msgid "An error occurred while removing the signature."
msgstr "Ocurrió un error al eliminar la firma."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "An error occurred while resetting two factor authentication for the user."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "An error occurred while sending the document."
msgstr "Ocurrió un error al enviar el documento."
@@ -1281,10 +1391,23 @@ msgstr "Ocurrió un error al actualizar tu perfil."
msgid "An error occurred while uploading your document."
msgstr "Ocurrió un error al subir tu documento."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "An error occurred. Please try again later."
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "An organisation wants to create an account for you. Please review the details below."
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "An organisation wants to link your account. Please review the details below."
+msgstr ""
+
#: apps/remix/app/components/general/generic-error-layout.tsx
msgid "An unexpected error occurred."
msgstr "Ocurrió un error inesperado."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
#: apps/remix/app/components/general/app-command-menu.tsx
#: apps/remix/app/components/forms/team-update-form.tsx
@@ -1364,37 +1487,48 @@ msgstr "Tokens de API"
msgid "App Version"
msgstr "Versión de la Aplicación"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "Approve"
+msgstr ""
+
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table-action-dropdown.tsx
#: apps/remix/app/components/tables/documents-table-action-button.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document/document-page-view-button.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Approve"
msgstr "Aprobar"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Approve Document"
msgstr "Aprobar Documento"
-#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Approved"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Approved"
msgstr "Aprobado"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Approver"
-msgstr "Aprobador"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Approvers"
-msgstr "Aprobadores"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Approving"
-msgstr "Aprobando"
+msgstr ""
#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Are you sure you want to complete the document? This action cannot be undone. Please ensure that you have completed prefilling all relevant fields before proceeding."
@@ -1428,6 +1562,7 @@ msgstr "¿Está seguro de que desea eliminar esta organización?"
msgid "Are you sure you wish to delete this team?"
msgstr "¿Estás seguro de que deseas eliminar este equipo?"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: apps/remix/app/components/dialogs/team-member-delete-dialog.tsx
@@ -1450,10 +1585,11 @@ msgid "Assigned Teams"
msgstr "Equipos asignados"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
msgid "Assist"
-msgstr "Asistir"
+msgstr ""
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Assist Document"
msgstr "Asistir Documento"
@@ -1463,29 +1599,36 @@ msgid "Assist with signing"
msgstr "Asistir con la firma"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Assistant"
-msgstr "Asistente"
+msgstr ""
#: packages/ui/components/recipient/recipient-role-select.tsx
msgid "Assistant role is only available when the document is in sequential signing mode."
msgstr "El rol de asistente solo está disponible cuando el documento está en modo de firma secuencial."
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Assistants"
-msgstr "Asistentes"
+msgstr ""
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
msgid "Assistants and Copy roles are currently not compatible with the multi-sign experience."
msgstr "Los roles de asistentes y copias actualmente no son compatibles con la experiencia de firmar múltiple."
-#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Assisted"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Assisted"
msgstr "Asistido"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Assisting"
-msgstr "Asistiendo"
+msgstr ""
#: apps/remix/app/components/forms/document-preferences-form.tsx
#: packages/ui/primitives/template-flow/add-template-settings.types.tsx
@@ -1510,6 +1653,10 @@ msgstr "Registros de Auditoría"
msgid "Authentication Level"
msgstr "Nivel de Autenticación"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Authentication Portal Not Found"
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-auth-page.tsx
#: apps/remix/app/components/general/direct-template/direct-template-signing-auth-page.tsx
msgid "Authentication required"
@@ -1640,6 +1787,11 @@ msgstr "Envío Masivo vía CSV"
msgid "by <0>{senderName}0>"
msgstr "por <0>{senderName}0>"
+#. placeholder {0}: organisation.name
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "By accepting this request, you grant {0} the following permissions:"
+msgstr ""
+
#: packages/email/templates/confirm-team-email.tsx
msgid "By accepting this request, you will be granting <0>{teamName}0> access to:"
msgstr "Al aceptar esta solicitud, estarás concediendo a <0>{teamName}0> acceso a:"
@@ -1672,6 +1824,7 @@ msgstr "Al utilizar la función de firma electrónica, usted está consintiendo
msgid "Can prepare"
msgstr "Puede preparar"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
@@ -1763,21 +1916,29 @@ msgid "Cannot remove signer"
msgstr "No se puede eliminar el firmante"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Cc"
-msgstr "Copia visible"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
-#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
msgid "CC"
-msgstr "COPIA VISIBLE"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
+msgid "CC"
+msgstr ""
+
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
msgid "CC'd"
-msgstr "Con copia"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Ccers"
-msgstr "Firmantes"
+msgstr ""
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
msgid "Character Limit"
@@ -1872,10 +2033,27 @@ msgstr "Haga clic para copiar el enlace de firma para enviar al destinatario"
msgid "Click to insert field"
msgstr "Haga clic para insertar campo"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client ID"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client ID is required"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client Secret"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client secret is required"
+msgstr ""
+
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-passkey.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-2fa.tsx
#: apps/remix/app/components/general/document/document-recipient-link-copy-dialog.tsx
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
#: apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
@@ -1902,6 +2080,8 @@ msgstr "Compara todos los planes y características en detalle"
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/forms/signup.tsx
#: apps/remix/app/components/embed/embed-document-signing-page.tsx
+#: apps/remix/app/components/embed/embed-document-signing-page.tsx
+#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
msgid "Complete"
@@ -1923,9 +2103,9 @@ msgstr "Documento Completo"
msgid "Complete Signing"
msgstr "Completar Firmado"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-msgid "Complete the fields for the following signers. Once reviewed, they will inform you if any modifications are needed."
-msgstr "Completa los campos para los siguientes firmantes. Una vez revisados, te informarán si se necesitan modificaciones."
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
+msgid "Complete the fields for the following signers."
+msgstr ""
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
@@ -2045,6 +2225,7 @@ msgstr "Confirmar Eliminación"
msgid "Confirm email"
msgstr "Confirmar correo electrónico"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/send-confirmation-email.tsx
msgid "Confirmation email sent"
msgstr "Correo electrónico de confirmación enviado"
@@ -2061,6 +2242,10 @@ msgstr "Información de Contacto"
msgid "Contact sales here"
msgstr "Contactar ventas aquí"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Contact us"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
msgid "Content"
msgstr "Contenido"
@@ -2141,6 +2326,8 @@ msgstr "Controla qué firmas están permitidas al firmar un documento."
msgid "Copied"
msgstr "Copiado"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/components/tables/settings-public-profile-templates-table.tsx
#: apps/remix/app/components/general/avatar-with-recipient.tsx
#: apps/remix/app/components/general/template/template-direct-link-badge.tsx
@@ -2182,6 +2369,11 @@ msgstr "Copiar enlaces de firma"
msgid "Copy token"
msgstr "Copiar token"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "couldn't be uploaded:"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
@@ -2208,6 +2400,10 @@ msgstr "Crea una nueva dirección de correo electrónico para tu organización u
msgid "Create a new organisation with {planName} plan. Keep your current organisation on it's current plan"
msgstr "Crea una nueva organización con el plan {planName}. Mantén tu organización actual en su plan actual"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Create a support ticket"
+msgstr ""
+
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Create a team to collaborate with your team members."
msgstr "Crea un equipo para colaborar con los miembros de tu equipo."
@@ -2466,6 +2662,7 @@ msgstr "Fecha de creación"
msgid "Date Format"
msgstr "Formato de fecha"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/general/organisations/organisation-invitations.tsx
#: packages/email/templates/organisation-invite.tsx
msgid "Decline"
@@ -2491,6 +2688,10 @@ msgstr "Correo predeterminado"
msgid "Default Email Settings"
msgstr "Configuración de correo predeterminada"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Default Organisation Role for New Users"
+msgstr ""
+
#: apps/remix/app/components/forms/document-preferences-form.tsx
msgid "Default Signature Settings"
msgstr "Configuraciones de Firma por Defecto"
@@ -2752,6 +2953,10 @@ msgstr "Deshabilitar la firma de enlace directo evitará que cualquiera acceda a
msgid "Disabling the user results in the user not being able to use the account. It also disables all the related contents such as subscription, webhooks, teams, and API keys."
msgstr "Deshabilitar al usuario implica que no podrá usar la cuenta. También desactiva todos los contenidos relacionados como suscripciones, webhooks, equipos y claves API."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Discord"
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "Display Name"
@@ -2820,8 +3025,9 @@ msgid "Document access"
msgstr "Acceso al documento"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document access auth updated"
-msgstr "Se actualizó la autenticación de acceso al documento"
+msgstr ""
#: apps/remix/app/components/general/document/document-status.tsx
msgid "Document All"
@@ -2837,9 +3043,13 @@ msgstr "Documento Aprobado"
msgid "Document Cancelled"
msgstr "Documento cancelado"
+#: packages/lib/utils/document-audit-logs.ts
+#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document completed"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-status.tsx
-#: packages/lib/utils/document-audit-logs.ts
-#: packages/lib/utils/document-audit-logs.ts
msgid "Document completed"
msgstr "Documento completado"
@@ -2852,8 +3062,12 @@ msgstr "Correo electrónico de documento completado"
msgid "Document Completed!"
msgstr "¡Documento completado!"
-#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document created"
+msgstr ""
+
+#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "Document created"
msgstr "Documento creado"
@@ -2879,10 +3093,14 @@ msgstr "Documento creado usando un <0>enlace directo0>"
msgid "Document Creation"
msgstr "Creación de documento"
+#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document deleted"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
#: apps/remix/app/components/dialogs/admin-document-delete-dialog.tsx
-#: packages/lib/utils/document-audit-logs.ts
msgid "Document deleted"
msgstr "Documento eliminado"
@@ -2908,8 +3126,9 @@ msgid "Document Duplicated"
msgstr "Documento duplicado"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document external ID updated"
-msgstr "ID externo del documento actualizado"
+msgstr ""
#: apps/remix/app/components/general/document/document-certificate-qr-view.tsx
msgid "Document found in your account"
@@ -2945,16 +3164,18 @@ msgid "Document moved"
msgstr "Documento movido"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document moved to team"
-msgstr "Documento movido al equipo"
+msgstr ""
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
msgid "Document no longer available to sign"
msgstr "El documento ya no está disponible para firmar"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document opened"
-msgstr "Documento abierto"
+msgstr ""
#: apps/remix/app/components/general/document/document-status.tsx
msgid "Document pending"
@@ -2993,8 +3214,12 @@ msgstr "Documento Rechazado"
msgid "Document resealed"
msgstr "Documento sellado nuevamente"
-#: apps/remix/app/components/general/document/document-edit-form.tsx
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document sent"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "Document sent"
msgstr "Documento enviado"
@@ -3003,8 +3228,9 @@ msgid "Document Signed"
msgstr "Documento firmado"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document signing auth updated"
-msgstr "Se actualizó la autenticación de firma del documento"
+msgstr ""
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document signing process will be cancelled"
@@ -3019,12 +3245,14 @@ msgid "Document title"
msgstr "Título del documento"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document title updated"
-msgstr "Título del documento actualizado"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document updated"
-msgstr "Documento actualizado"
+msgstr ""
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
msgid "Document updated successfully"
@@ -3040,21 +3268,27 @@ msgid "Document uploaded"
msgstr "Documento subido"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document viewed"
-msgstr "Documento visto"
+msgstr ""
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
msgid "Document Viewed"
msgstr "Documento visto"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document visibility updated"
-msgstr "Visibilidad del documento actualizada"
+msgstr ""
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document will be permanently deleted"
msgstr "El documento será eliminado permanentemente"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Documentation"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx
@@ -3165,6 +3399,11 @@ msgid "Drag and drop your PDF file here"
msgstr "Arrastra y suelta tu archivo PDF aquí"
#: packages/lib/constants/document.ts
+msgctxt "Draw signatute type"
+msgid "Draw"
+msgstr ""
+
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Draw"
msgstr "Dibujar"
@@ -3411,6 +3650,10 @@ msgstr "Habilitar firma de enlace directo"
msgid "Enable signing order"
msgstr "Habilitar orden de firma"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Enable SSO portal"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
@@ -3475,13 +3718,18 @@ msgstr "Enterprise"
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
#: apps/remix/app/components/general/verify-email-banner.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
@@ -3510,6 +3758,10 @@ msgstr "Enterprise"
#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
@@ -3521,6 +3773,7 @@ msgstr "Enterprise"
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -3579,6 +3832,10 @@ msgstr "No se pudo crear la carpeta"
msgid "Failed to create subscription claim."
msgstr "Error al crear reclamación de suscripción."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Failed to create support ticket"
+msgstr ""
+
#: apps/remix/app/components/dialogs/folder-delete-dialog.tsx
msgid "Failed to delete folder"
msgstr "Error al eliminar la carpeta"
@@ -3611,6 +3868,10 @@ msgstr "Fallo al guardar configuraciones."
msgid "Failed to sign out all sessions"
msgstr "Error al cerrar sesión en todas las sesiones"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Failed to unlink account"
+msgstr ""
+
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
msgid "Failed to update document"
msgstr "No se pudo actualizar el documento"
@@ -3669,16 +3930,19 @@ msgid "Field placeholder"
msgstr "Marcador de posición de campo"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field prefilled by assistant"
-msgstr "Campo rellenado por el asistente"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field signed"
-msgstr "Campo firmado"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field unsigned"
-msgstr "Campo no firmado"
+msgstr ""
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
msgid "Fields"
@@ -3688,13 +3952,21 @@ msgstr "Campos"
msgid "Fields updated"
msgstr "Campos actualizados"
-#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-upload.tsx
-#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "El archivo no puede ser mayor a {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "File is too small"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB"
msgstr "El tamaño del archivo excede el límite de {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB"
@@ -3810,6 +4082,7 @@ msgstr "Generar enlaces"
msgid "Global recipient action authentication"
msgstr "Autenticación de acción de destinatario global"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
@@ -4000,6 +4273,10 @@ msgstr "Inicio (Sin Carpeta)"
msgid "Horizontal"
msgstr "Horizontal"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "I agree to link my account with this organization"
+msgstr ""
+
#: packages/lib/constants/recipient-roles.ts
msgid "I am a signer of this document"
msgstr "Soy un firmante de este documento"
@@ -4024,6 +4301,10 @@ msgstr "Se me requiere recibir una copia de este documento"
msgid "I am the owner of this document"
msgstr "Soy el propietario de este documento"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "I understand that I am providing my credentials to a 3rd party service configured by this organisation"
+msgstr ""
+
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx
#: apps/remix/app/components/dialogs/token-delete-dialog.tsx
msgid "I'm sure! Delete it"
@@ -4053,6 +4334,10 @@ msgstr "Si no encuentras el enlace de confirmación en tu bandeja de entrada, pu
msgid "If your authenticator app does not support QR codes, you can use the following code instead:"
msgstr "Si tu aplicación de autenticación no admite códigos QR, puedes usar el siguiente código en su lugar:"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Important: What This Means"
+msgstr ""
+
#: apps/remix/app/components/general/app-nav-mobile.tsx
#: apps/remix/app/components/general/app-nav-mobile.tsx
#: apps/remix/app/components/general/document/document-status.tsx
@@ -4120,6 +4405,10 @@ msgstr "Estadísticas de instancia"
msgid "Invalid code. Please try again."
msgstr "Código inválido. Por favor, intenta nuevamente."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Invalid domains"
+msgstr ""
+
#: packages/ui/primitives/document-flow/add-signers.types.ts
msgid "Invalid email"
msgstr "Email inválido"
@@ -4133,6 +4422,10 @@ msgstr "Enlace inválido"
msgid "Invalid token"
msgstr "Token inválido"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Invalid Token"
+msgstr ""
+
#: apps/remix/app/components/forms/reset-password.tsx
msgid "Invalid token provided. Please try again."
msgstr "Token inválido proporcionado. Por favor, inténtelo nuevamente."
@@ -4192,6 +4485,10 @@ msgstr "Factura"
msgid "IP Address"
msgstr "Dirección IP"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Issuer URL"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "It is crucial to keep your contact information, especially your email address, up to date with us. Please notify us immediately of any changes to ensure that you continue to receive all necessary communications."
msgstr "Es crucial mantener su información de contacto, especialmente su dirección de correo electrónico, actual con nosotros. Por favor, notifíquenos inmediatamente sobre cualquier cambio para asegurarse de seguir recibiendo todas las comunicaciones necesarias."
@@ -4225,6 +4522,10 @@ msgstr "Actualmente no es tu turno para firmar. Recibirás un correo electrónic
msgid "Join {organisationName} on Documenso"
msgstr "Únete a {organisationName} en Documenso"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Join our community on <0>Discord0> for community support and discussion."
+msgstr ""
+
#. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' })
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "Joined {0}"
@@ -4319,10 +4620,27 @@ msgstr "¿Te gustaría tener tu propio perfil público con acuerdos?"
msgid "Link expires in 1 hour."
msgstr "El enlace expira en 1 hora."
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Link expires in 30 minutes."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.public-profile.tsx
msgid "Link template"
msgstr "Enlace de plantilla"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Link your Documenso account"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "Linked Accounts"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Linked At"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "Links Generated"
msgstr "Enlaces generados"
@@ -4347,6 +4665,10 @@ msgstr "Cargando documento..."
msgid "Loading Document..."
msgstr "Cargando Documento..."
+#: packages/ui/components/recipient/recipient-autocomplete-input.tsx
+msgid "Loading suggestions..."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-page-view-recent-activity.tsx
msgid "Loading..."
msgstr "Cargando..."
@@ -4372,6 +4694,10 @@ msgstr "Gestionar"
msgid "Manage {0}'s profile"
msgstr "Gestionar el perfil de {0}"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Manage a custom SSO login portal for your organisation."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/organisations.tsx
msgid "Manage all organisations you are currently associated with."
msgstr "Gestiona todas las organizaciones con las que estás actualmente asociado."
@@ -4404,6 +4730,10 @@ msgstr "Gestionar enlace directo"
msgid "Manage documents"
msgstr "Gestionar documentos"
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "Manage linked accounts"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "Manage organisation"
msgstr "Administrar organización"
@@ -4539,6 +4869,10 @@ msgstr "Miembro"
msgid "Member Count"
msgstr "Conteo de Miembros"
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "Member promoted to owner successfully"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-members-table.tsx
msgid "Member Since"
msgstr "Miembro desde"
@@ -4554,6 +4888,7 @@ msgstr "Miembro desde"
msgid "Members"
msgstr "Miembros"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Message"
@@ -4789,6 +5124,10 @@ msgstr "No se encontró campo de firma"
msgid "No Stripe customer attached"
msgstr "No hay cliente de Stripe adjunto"
+#: packages/ui/components/recipient/recipient-autocomplete-input.tsx
+msgid "No suggestions found"
+msgstr ""
+
#: apps/remix/app/components/tables/team-groups-table.tsx
msgid "No team groups found"
msgstr "No se encontraron grupos de equipo"
@@ -4919,6 +5258,16 @@ msgstr "Solo los administradores pueden acceder y ver el documento"
msgid "Only managers and above can access and view the document"
msgstr "Solo los gerentes y superiores pueden acceder y ver el documento"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Only one file can be uploaded at a time"
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Only PDF files are allowed"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/general/generic-error-layout.tsx
#: apps/remix/app/components/general/generic-error-layout.tsx
@@ -4934,10 +5283,15 @@ msgstr "Abierto"
msgid "Or"
msgstr "O"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "OR"
+msgstr ""
+
#: apps/remix/app/components/forms/signin.tsx
msgid "Or continue with"
msgstr "O continúa con"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/tables/user-organisations-table.tsx
#: apps/remix/app/components/tables/admin-organisations-table.tsx
msgid "Organisation"
@@ -4947,6 +5301,10 @@ msgstr "Organización"
msgid "Organisation Admin"
msgstr "Administrador de Organización"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Organisation authentication portal URL"
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-organisation-create-dialog.tsx
msgid "Organisation created"
msgstr "Organización creada"
@@ -5017,6 +5375,10 @@ msgstr "Ajustes de organización"
msgid "Organisation Settings"
msgstr "Configuraciones de la Organización"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Organisation SSO Portal"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "Organisation Teams"
msgstr "Equipos de Organización"
@@ -5309,9 +5671,13 @@ msgstr "Por favor, ingresa un nombre significativo para tu token. Esto te ayudar
msgid "Please enter a valid name."
msgstr "Por favor, introduce un nombre válido."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-msgid "Please mark as viewed to complete"
-msgstr "Por favor, marca como visto para completar"
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
+msgid "Please mark as viewed to complete."
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Please note that anyone who signs in through your portal will be added to your organisation as a member."
+msgstr ""
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid "Please note that proceeding will remove direct linking recipient and turn it into a placeholder."
@@ -5349,11 +5715,11 @@ msgstr "Por favor, proporciona un token del autenticador o un código de respald
msgid "Please provide a token from your authenticator, or a backup code."
msgstr "Por favor, proporciona un token de tu autenticador, o un código de respaldo."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
msgid "Please review the document before approving."
msgstr "Por favor, revise el documento antes de aprobarlo."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
msgid "Please review the document before signing."
msgstr "Por favor, revise el documento antes de firmar."
@@ -5449,6 +5815,18 @@ msgstr "Perfil actualizado"
msgid "Progress"
msgstr "Progreso"
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "Promote to owner"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Provider"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Provider has been updated successfully"
+msgstr ""
+
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/general/template/template-type.tsx
msgid "Public"
@@ -5485,6 +5863,10 @@ msgstr "Valores de radio"
msgid "Read only"
msgstr "Solo lectura"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Read our documentation to get started with Documenso."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-disclosure.tsx
msgid "Read the full <0>signature disclosure0>."
msgstr "Lea la <0>divulgación de firma0> completa."
@@ -5601,6 +5983,10 @@ msgstr "Códigos de recuperación"
msgid "Red"
msgstr "Rojo"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Redirect URI"
+msgstr ""
+
#: apps/remix/app/components/embed/authoring/configure-document-advanced-settings.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
@@ -5714,6 +6100,10 @@ msgstr "Responder al correo"
msgid "Reply To Email"
msgstr "Responder al correo"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Requesting Organisation"
+msgstr ""
+
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx
@@ -5722,6 +6112,10 @@ msgstr "Responder al correo"
msgid "Required field"
msgstr "Campo obligatorio"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Required scopes"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
msgid "Reseal document"
msgstr "Re-sellar documento"
@@ -5746,6 +6140,11 @@ msgstr "Reenviar verificación"
msgid "Reset"
msgstr "Restablecer"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset 2FA"
+msgstr ""
+
#: apps/remix/app/components/forms/forgot-password.tsx
msgid "Reset email sent"
msgstr "Correo de restablecimiento enviado"
@@ -5757,6 +6156,14 @@ msgstr "Correo de restablecimiento enviado"
msgid "Reset Password"
msgstr "Restablecer contraseña"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset the users two factor authentication. This action is irreversible and will disable two factor authentication for the user."
+msgstr ""
+
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset Two Factor Authentication"
+msgstr ""
+
#: apps/remix/app/components/forms/reset-password.tsx
msgid "Resetting Password..."
msgstr "Restableciendo contraseña..."
@@ -5788,9 +6195,14 @@ msgstr "Reintentar"
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
msgid "Return"
msgstr "Regresar"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Return to Documenso sign in page here"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
msgid "Return to Home"
msgstr "Regresar a la página de inicio"
@@ -5800,6 +6212,10 @@ msgstr "Regresar a la página de inicio"
msgid "Return to sign in"
msgstr "Regresar para iniciar sesión"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Review request"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
msgid "Revoke"
@@ -5974,6 +6390,10 @@ msgstr "Seleccionar métodos de autenticación"
msgid "Select default option"
msgstr "Seleccionar opción predeterminada"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Select default role"
+msgstr ""
+
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx
msgid "Select direction"
msgstr "Seleccione dirección"
@@ -6189,6 +6609,11 @@ msgstr "Mostrar configuraciones avanzadas"
msgid "Show templates in your public profile for your audience to sign and get started quickly"
msgstr "Mostrar plantillas en tu perfil público para que tu audiencia firme y comience rápidamente"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "Sign"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table-action-dropdown.tsx
@@ -6202,7 +6627,6 @@ msgstr "Mostrar plantillas en tu perfil público para que tu audiencia firme y c
#: apps/remix/app/components/general/document-signing/document-signing-auth-password.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-2fa.tsx
#: apps/remix/app/components/general/document/document-page-view-button.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Sign"
msgstr "Firmar"
@@ -6224,7 +6648,7 @@ msgstr "Firmar como<0>{0} <1>({1})1>0>"
msgid "Sign document"
msgstr "Firmar documento"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Sign Document"
msgstr "Firmar Documento"
@@ -6242,6 +6666,7 @@ msgstr "Campo de firma"
msgid "Sign Here"
msgstr "Firmar aquí"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: packages/email/template-components/template-reset-password.tsx
@@ -6249,6 +6674,7 @@ msgid "Sign In"
msgstr "Iniciar sesión"
#: apps/remix/app/routes/_unauthenticated+/signin.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
msgid "Sign in to your account"
msgstr "Inicia sesión en tu cuenta"
@@ -6316,32 +6742,35 @@ msgstr "Firmas recolectadas"
msgid "Signatures will appear once the document has been completed"
msgstr "Las firmas aparecerán una vez que el documento se haya completado"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Signed"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/ui/components/document/document-read-only-fields.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Signed"
msgstr "Firmado"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Signer"
-msgstr "Firmante"
+msgstr ""
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Signer Events"
msgstr "Eventos del Firmante"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Signers"
-msgstr "Firmantes"
-
-#: packages/ui/primitives/document-flow/add-signers.types.ts
-msgid "Signers must have unique emails"
-msgstr "Los firmantes deben tener correos electrónicos únicos"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Signing"
-msgstr "Firmando"
+msgstr ""
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Signing Certificate"
@@ -6512,6 +6941,14 @@ msgstr "Lo sentimos, no pudimos descargar el certificado. Por favor, intenta de
msgid "Source"
msgstr "Fuente"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Space-separated list of domains. Leave empty to allow all domains."
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
+msgid "SSO"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
msgid "Stats"
msgstr "Estadísticas"
@@ -6543,6 +6980,7 @@ msgstr "Cliente de Stripe creado con éxito"
msgid "Stripe Customer ID"
msgstr "ID de Cliente de Stripe"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Subject"
msgstr "Asunto"
@@ -6552,6 +6990,10 @@ msgstr "Asunto"
msgid "Subject <0>(Optional)0>"
msgstr "Asunto <0>(Opcional)0>"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Submit"
+msgstr ""
+
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx
@@ -6585,10 +7027,12 @@ msgstr "Suscripción inválida"
#: apps/remix/app/routes/embed+/v1+/authoring+/template.edit.$id.tsx
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
@@ -6646,6 +7090,15 @@ msgstr "Creado con éxito: {successCount}"
msgid "Summary:"
msgstr "Resumen:"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+#: apps/remix/app/components/general/org-menu-switcher.tsx
+msgid "Support"
+msgstr ""
+
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Support ticket created"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
msgid "Sync"
msgstr "Sincronizar"
@@ -7009,7 +7462,8 @@ msgid "The email address which will show up in the \"Reply To\" field in emails"
msgstr "La dirección de correo que aparecerá en el campo \"Responder a\" en los correos electrónicos"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
-msgid "The email domain you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The email domain you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "El dominio de correo electrónico que estás buscando puede haber sido eliminado, renombrado o puede que nunca haya existido."
@@ -7050,12 +7504,21 @@ msgstr "Se produjeron los siguientes errores:"
msgid "The following team has been deleted. You will no longer be able to access this team and its documents"
msgstr "El siguiente equipo ha sido eliminado. Ya no podrá acceder a este equipo y sus documentos"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "The OpenID discovery endpoint URL for your provider"
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "The organisation authentication portal does not exist, or is not configured"
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "The organisation email has been created successfully."
msgstr "El correo electrónico de la organización se ha creado con éxito."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
-msgid "The organisation group you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation group you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "El grupo de organización que está buscando puede haber sido eliminado, renombrado o puede que nunca haya existido."
@@ -7064,12 +7527,14 @@ msgid "The organisation role that will be applied to all members in this group."
msgstr "El rol de organización que se aplicará a todos los miembros de este grupo."
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
-msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "La organización que está buscando puede haber sido eliminada, renombrada o puede que nunca haya existido."
#: apps/remix/app/routes/_authenticated+/_layout.tsx
-msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "La organización que está buscando puede haber sido eliminada, renombrada o puede que nunca haya existido."
@@ -7158,14 +7623,17 @@ msgid "The team email <0>{teamEmail}0> has been removed from the following tea
msgstr "El correo electrónico del equipo <0>{teamEmail}0> ha sido eliminado del siguiente equipo"
#: apps/remix/app/routes/_authenticated+/_layout.tsx
-msgid "The team you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The team you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "El equipo que está buscando puede haber sido eliminado, renombrado o puede que nunca haya existido."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
-msgid "The team you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The team you are looking for may have been removed, renamed or may have never\n"
" existed."
-msgstr "El equipo que buscas puede haber sido eliminado, renombrado o quizás nunca\n"
+msgstr ""
+"El equipo que buscas puede haber sido eliminado, renombrado o quizás nunca\n"
" existió."
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
@@ -7180,6 +7648,10 @@ msgstr "La plantilla será eliminada de tu perfil"
msgid "The test webhook has been successfully sent to your endpoint."
msgstr "El webhook de prueba se ha enviado exitosamente a tu terminal."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "The token is invalid or has expired."
+msgstr ""
+
#: apps/remix/app/components/forms/token.tsx
msgid "The token was copied to your clipboard."
msgstr "El token fue copiado a tu portapapeles."
@@ -7206,10 +7678,15 @@ msgid "The URL for Documenso to send webhook events to."
msgstr "La URL para Documenso para enviar eventos de webhook."
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
-msgid "The user you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The user you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "El usuario que está buscando puede haber sido eliminado, renombrado o puede que nunca haya existido."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "The user's two factor authentication has been reset successfully."
+msgstr ""
+
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx
msgid "The webhook has been successfully deleted."
msgstr "El webhook ha sido eliminado con éxito."
@@ -7223,7 +7700,8 @@ msgid "The webhook was successfully created."
msgstr "El webhook fue creado con éxito."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
-msgid "The webhook you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The webhook you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "El webhook que buscas puede haber sido eliminado, renombrado o puede que nunca haya existido."
@@ -7259,6 +7737,10 @@ msgstr "Esta cuenta ha sido deshabilitada. Por favor, contacta con soporte."
msgid "This account has not been verified. Please verify your account before signing in."
msgstr "Esta cuenta no ha sido verificada. Por favor, verifica tu cuenta antes de iniciar sesión."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "This action is irreversible. Please ensure you have informed the user before proceeding."
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
#: apps/remix/app/components/dialogs/admin-document-delete-dialog.tsx
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
@@ -7377,10 +7859,22 @@ msgstr "Así es como el documento llegará a los destinatarios una vez que esté
msgid "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
msgstr "Esta es la reclamo con la que se creó inicialmente esta organización. Cualquier cambio en la bandera de características de esta reclamo se retroalimentará en esta organización."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "This is the required scopes you must set in your provider's settings"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "This is the URL which users will use to sign in to your organisation."
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
msgid "This link is invalid or has expired. Please contact your team to resend a verification."
msgstr "Este enlace es inválido o ha expirado. Por favor, contacta a tu equipo para reenviar una verificación."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "This organisation will have administrative control over your account. You can revoke this access later, but they will retain access to any data they've already collected."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.general.tsx
msgid "This organisation, and any associated data will be permanently deleted."
msgstr "Esta organización y cualquier dato asociado serán eliminados permanentemente."
@@ -7500,9 +7994,10 @@ msgstr "Para poder añadir miembros a un equipo, primero debes añadirlos a la o
msgid "To change the email you must remove and add a new email address."
msgstr "Para cambiar el correo electrónico debes eliminar y añadir una nueva dirección de correo electrónico."
+#. placeholder {0}: user.email
#. placeholder {0}: userToEnable.email
#. placeholder {0}: userToDisable.email
-#. placeholder {0}: user.email
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -7518,6 +8013,7 @@ msgid "To enable two-factor authentication, scan the following QR code using you
msgstr "Para habilitar la autenticación de dos factores, escanea el siguiente código QR usando tu aplicación de autenticador."
#: apps/remix/app/routes/_unauthenticated+/unverified-account.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
msgid "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
msgstr "Para acceder a tu cuenta, por favor confirma tu dirección de correo electrónico haciendo clic en el enlace de confirmación de tu bandeja de entrada."
@@ -7634,9 +8130,14 @@ msgstr "La autenticación de dos factores ha sido desactivada para tu cuenta. Ya
msgid "Two-Factor Re-Authentication"
msgstr "Re-autenticación de Doble Factor"
+#: packages/lib/constants/document.ts
+msgctxt "Type signatute type"
+msgid "Type"
+msgstr ""
+
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
-#: packages/lib/constants/document.ts
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Type"
msgstr "Tipo"
@@ -7750,9 +8251,15 @@ msgstr "Incompleto"
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
msgid "Unknown"
msgstr "Desconocido"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Unknown error"
+msgstr ""
+
#: apps/remix/app/components/tables/admin-claims-table.tsx
msgid "Unlimited"
msgstr "Ilimitado"
@@ -7761,6 +8268,11 @@ msgstr "Ilimitado"
msgid "Unlimited documents, API and more"
msgstr "Documentos ilimitados, API y más"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Unlink"
+msgstr ""
+
#: apps/remix/app/components/general/folder/folder-card.tsx
msgid "Unpin"
msgstr "Desanclar"
@@ -7769,6 +8281,7 @@ msgstr "Desanclar"
msgid "Untitled Group"
msgstr "Grupo sin título"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
@@ -7908,6 +8421,11 @@ msgid "Upgrade your plan to upload more documents"
msgstr "Actualiza tu plan para cargar más documentos"
#: packages/lib/constants/document.ts
+msgctxt "Upload signatute type"
+msgid "Upload"
+msgstr ""
+
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Upload"
msgstr "Subir"
@@ -7941,6 +8459,11 @@ msgstr "Subir documento personalizado"
msgid "Upload Document"
msgstr "Cargar Documento"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Upload failed"
+msgstr ""
+
#: packages/ui/primitives/signature-pad/signature-pad-upload.tsx
msgid "Upload Signature"
msgstr "Subir firma"
@@ -8022,6 +8545,7 @@ msgstr "El usuario no tiene contraseña."
msgid "User not found"
msgstr "Usuario no encontrado"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -8095,6 +8619,11 @@ msgstr "Verifica tu dirección de correo electrónico del equipo"
msgid "Vertical"
msgstr "Vertical"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "View"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
@@ -8104,7 +8633,6 @@ msgstr "Vertical"
#: apps/remix/app/components/general/document/document-page-view-button.tsx
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "View"
msgstr "Ver"
@@ -8137,6 +8665,11 @@ msgstr "Ver toda la actividad de seguridad relacionada con tu cuenta."
msgid "View and manage all active sessions for your account."
msgstr "Ver y gestionar todas las sesiones activas de tu cuenta."
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "View and manage all login methods linked to your account."
+msgstr ""
+
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
msgid "View Codes"
msgstr "Ver Códigos"
@@ -8149,7 +8682,7 @@ msgstr "Ver registros DNS"
msgid "View document"
msgstr "Ver documento"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
@@ -8199,24 +8732,31 @@ msgstr "Ver equipos"
msgid "View the DNS records for this email domain"
msgstr "Ver los registros DNS para este dominio de correo electrónico"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Viewed"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Viewed"
msgstr "Visto"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Viewer"
-msgstr "Visor"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Viewers"
-msgstr "Espectadores"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Viewing"
-msgstr "Viendo"
+msgstr ""
#: apps/remix/app/components/dialogs/folder-update-dialog.tsx
msgid "Visibility"
@@ -8277,6 +8817,10 @@ msgstr "No podemos actualizar esta clave de acceso en este momento. Por favor, i
msgid "We couldn't create a Stripe customer. Please try again."
msgstr "No pudimos crear un cliente de Stripe. Por favor, intente nuevamente."
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "We couldn't promote the member to owner. Please try again."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "We couldn't update the group. Please try again."
msgstr "No pudimos actualizar el grupo. Por favor, intente nuevamente."
@@ -8286,6 +8830,10 @@ msgstr "No pudimos actualizar el grupo. Por favor, intente nuevamente."
msgid "We couldn't update the organisation. Please try again."
msgstr "No pudimos actualizar la organización. Por favor, intente nuevamente."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "We couldn't update the provider. Please try again."
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "We encountered an error while creating the email. Please try again later."
msgstr "Encontramos un error mientras creábamos el correo. Por favor, inténtalo de nuevo más tarde."
@@ -8394,6 +8942,7 @@ msgstr "Encontramos un error desconocido al intentar restablecer tu contraseña.
msgid "We encountered an unknown error while attempting to revoke access. Please try again or contact support."
msgstr "Encontramos un error desconocido al intentar revocar el acceso. Por favor, inténtalo de nuevo o contacta con soporte."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/signin.tsx
msgid "We encountered an unknown error while attempting to sign you In. Please try again later."
@@ -8529,6 +9078,10 @@ msgstr "Generaremos enlaces de firma para ti, que podrás enviar a los destinata
msgid "We won't send anything to notify recipients."
msgstr "No enviaremos nada para notificar a los destinatarios."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "We'll get back to you as soon as possible via email."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates._index.tsx
#: apps/remix/app/components/tables/documents-table-empty-state.tsx
msgid "We're all empty"
@@ -8586,10 +9139,18 @@ msgstr "Bienvenido de nuevo, somos afortunados de tenerte."
msgid "Welcome back! Here's an overview of your account."
msgstr "¡Bienvenido de nuevo! Aquí tienes un resumen de tu cuenta."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Welcome to {organisationName}"
+msgstr ""
+
#: packages/email/template-components/template-confirmation-email.tsx
msgid "Welcome to Documenso!"
msgstr "¡Bienvenido a Documenso!"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Well-known URL is required"
+msgstr ""
+
#: apps/remix/app/routes/_recipient+/sign.$token+/waiting.tsx
msgid "Were you trying to edit this document instead?"
msgstr "¿Estabas intentando editar este documento en su lugar?"
@@ -8616,6 +9177,10 @@ msgstr "Cuando firme un documento, podemos completar y firmar automáticamente l
msgid "When you use our platform to affix your electronic signature to documents, you are consenting to do so under the Electronic Signatures in Global and National Commerce Act (E-Sign Act) and other applicable laws. This action indicates your agreement to use electronic means to sign documents and receive notifications."
msgstr "Cuando utilice nuestra plataforma para colocar su firma electrónica en documentos, está consintiendo hacerlo bajo la Ley de Firmas Electrónicas en el Comercio Global y Nacional (Ley E-Sign) y otras leyes aplicables. Esta acción indica su aceptación de usar medios electrónicos para firmar documentos y recibir notificaciones."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Whether to enable the SSO portal for your organisation"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
msgid "While waiting for them to do so you can create your own Documenso account and get started with document signing right away."
msgstr "Mientras esperas a que ellos lo hagan, puedes crear tu propia cuenta de Documenso y comenzar a firmar documentos de inmediato."
@@ -8683,6 +9248,10 @@ msgstr "Estás a punto de dejar la siguiente organización."
msgid "You are about to remove default access to this team for all organisation members. Any members not explicitly added to this team will no longer have access."
msgstr "Estás a punto de eliminar el acceso predeterminado a este equipo para todos los miembros de la organización. Cualquier miembro no agregado explícitamente a este equipo, ya no tendrá acceso."
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "You are about to remove the <0>{provider}0> login method from your account."
+msgstr ""
+
#. placeholder {0}: organisation.name
#: apps/remix/app/components/dialogs/organisation-email-domain-delete-dialog.tsx
msgid "You are about to remove the email domain <0>{emailDomain}0> from <1>{0}1>. All emails associated with this domain will be deleted."
@@ -8769,6 +9338,10 @@ msgstr "No estás autorizado para deshabilitar a este usuario."
msgid "You are not authorized to enable this user."
msgstr "No estás autorizado para habilitar a este usuario."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "You are not authorized to reset two factor authentcation for this user."
+msgstr ""
+
#: packages/email/template-components/template-confirmation-email.tsx
msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)"
msgstr "También puedes copiar y pegar este enlace en tu navegador: {confirmationLink} (el enlace expira en 1 hora)"
@@ -9059,6 +9632,10 @@ msgstr "Ahora se te pedirá que ingreses un código de tu aplicación de autenti
msgid "You will receive an Email copy of the signed document once everyone has signed."
msgstr "Recibirás una copia por correo electrónico del documento firmado una vez que todos hayan firmado."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Your Account"
+msgstr ""
+
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
msgid "Your account has been deleted successfully."
msgstr "Tu cuenta ha sido eliminada con éxito."
@@ -9092,6 +9669,10 @@ msgstr "Tu operación de envío masivo para la plantilla \"{templateName}\" ha s
msgid "Your current {currentProductName} plan is past due. Please update your payment information."
msgstr "Tu plan actual {currentProductName} está vencido. Por favor, actualiza tu información de pago."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Your current plan includes the following support channels:"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.billing.tsx
msgid "Your current plan is inactive."
msgstr "Tu plan actual está inactivo."
@@ -9105,7 +9686,6 @@ msgid "Your direct signing templates"
msgstr "Tus {0} plantillas de firma directa"
#: apps/remix/app/components/general/document/document-upload.tsx
-#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "Your document failed to upload."
msgstr "Tu documento no se pudo cargar."
@@ -9238,6 +9818,10 @@ msgstr "Tu código de recuperación ha sido copiado en tu portapapeles."
msgid "Your recovery codes are listed below. Please store them in a safe place."
msgstr "Tus códigos de recuperación se enumeran a continuación. Por favor, guárdalos en un lugar seguro."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Your support request has been submitted. We'll get back to you soon!"
+msgstr ""
+
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Your team has been created."
msgstr "Tu equipo ha sido creado."
@@ -9250,10 +9834,6 @@ msgstr "Tu equipo ha sido eliminado con éxito."
msgid "Your team has been successfully updated."
msgstr "Tu equipo ha sido actualizado con éxito."
-#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
-msgid "Your template failed to upload."
-msgstr "Tu plantilla no se pudo cargar."
-
#: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx
msgid "Your template has been created successfully"
msgstr "Tu plantilla se ha creado exitosamente"
@@ -9290,3 +9870,6 @@ msgstr "¡Tu token se creó con éxito! ¡Asegúrate de copiarlo porque no podr
msgid "Your tokens will be shown here once you create them."
msgstr "Tus tokens se mostrarán aquí una vez que los crees."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "your-domain.com another-domain.com"
+msgstr ""
diff --git a/packages/lib/translations/fr/web.po b/packages/lib/translations/fr/web.po
index 44ff6c056..f8baf3af8 100644
--- a/packages/lib/translations/fr/web.po
+++ b/packages/lib/translations/fr/web.po
@@ -414,14 +414,30 @@ msgstr "{visibleRows, plural, one {Affichage de # résultat.} other {Affichage d
msgid "<0>\"{0}\"0>is no longer available to sign"
msgstr "<0>\"{0}\"0> n'est plus disponible pour signer"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "<0>{organisationName}0> has requested to create an account on your behalf."
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "<0>{organisationName}0> has requested to link your current Documenso account to their organisation."
+msgstr ""
+
#: packages/email/templates/confirm-team-email.tsx
msgid "<0>{teamName}0> has requested to use your email address for their team on Documenso."
msgstr "<0>{teamName}0> a demandé à utiliser votre adresse e-mail pour leur équipe sur Documenso."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Account management:0> Modify your account settings, permissions, and preferences"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "<0>Click to upload0> or drag and drop"
msgstr "<0>Cliquez pour importer0> ou faites glisser et déposez"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Data access:0> Access all data associated with your account"
+msgstr ""
+
#: packages/ui/components/document/document-signature-settings-tooltip.tsx
msgid "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
msgstr "<0>Dessinée0> - Une signature dessinée en utilisant une souris ou un stylet."
@@ -430,6 +446,10 @@ msgstr "<0>Dessinée0> - Une signature dessinée en utilisant une souris ou un
msgid "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
msgstr "<0>Email0> - Le destinataire recevra le document par e-mail pour signer, approuver, etc."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Full account access:0> View all your profile information, settings, and activity"
+msgstr ""
+
#: packages/ui/components/recipient/recipient-action-auth-select.tsx
msgid "<0>Inherit authentication method0> - Use the global action signing authentication method configured in the \"General Settings\" step"
msgstr "<0>Hériter de la méthode d'authentification0> - Utilisez la méthode globale d'authentification de signature d'action configurée dans l'étape \"Paramètres généraux\""
@@ -517,10 +537,18 @@ msgstr "12 mois"
msgid "2FA"
msgstr "2FA"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "2FA Reset"
+msgstr ""
+
#: apps/remix/app/components/forms/token.tsx
msgid "3 months"
msgstr "3 mois"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "400 Error"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
msgid "401 Unauthorized"
@@ -534,6 +562,10 @@ msgstr "404 Domaine email introuvable"
msgid "404 not found"
msgstr "404 non trouvé"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "404 Not Found"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "404 Organisation group not found"
msgstr "404 Groupe d'organisation non trouvé"
@@ -597,16 +629,19 @@ msgid "A draft document will be created"
msgstr "Un document brouillon sera créé"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was added"
-msgstr "Un champ a été ajouté"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was removed"
-msgstr "Un champ a été supprimé"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was updated"
-msgstr "Un champ a été mis à jour"
+msgstr ""
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "A means to print or download documents for your records"
@@ -646,16 +681,27 @@ msgid "A password reset email has been sent, if you have an account you should s
msgstr "Un e-mail de réinitialisation de mot de passe a été envoyé, si vous avez un compte vous devriez le voir dans votre boîte de réception sous peu."
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was added"
-msgstr "Un destinataire a été ajouté"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was removed"
-msgstr "Un destinataire a été supprimé"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was updated"
-msgstr "Un destinataire a été mis à jour"
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "A request has been made to create an account for you"
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "A request has been made to link your Documenso account"
+msgstr ""
#. placeholder {0}: team.name
#: packages/lib/server-only/team/create-team-email-verification.ts
@@ -706,6 +752,10 @@ msgstr "Un e-mail de vérification sera envoyé à l'adresse e-mail fournie."
msgid "Accept"
msgstr "Accepter"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Accept & Link Account"
+msgstr ""
+
#: packages/email/templates/organisation-invite.tsx
msgid "Accept invitation to join an organisation on Documenso"
msgstr "Accepter l'invitation à rejoindre une organisation sur Documenso"
@@ -726,6 +776,7 @@ msgstr "Accès désactivé"
msgid "Access enabled"
msgstr "Accès activé"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/general/org-menu-switcher.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
msgid "Account"
@@ -735,6 +786,14 @@ msgstr "Compte"
msgid "Account Authentication"
msgstr "Authentification de compte"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Account creation request"
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Account Creation Request"
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
msgid "Account deleted"
@@ -748,10 +807,18 @@ msgstr "Compte désactivé"
msgid "Account enabled"
msgstr "Compte activé"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Account Linking Request"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Account Re-Authentication"
msgstr "Ré-authentification de compte"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Account unlinked"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "Acknowledgment"
msgstr "Reconnaissance"
@@ -766,6 +833,7 @@ msgstr "Action"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/team-members-table.tsx
#: apps/remix/app/components/tables/team-members-table.tsx
@@ -804,6 +872,10 @@ msgstr "Abonnements actifs"
msgid "Add"
msgstr "Ajouter"
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "Add 2 or more signers to enable signing order."
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-domain-create-dialog.tsx
msgid "Add a custom domain to send emails on behalf of your organisation. We'll generate DKIM records that you need to add to your DNS provider."
msgstr "Ajoutez un domaine personnalisé pour envoyer des emails au nom de votre organisation. Nous générerons des enregistrements DKIM que vous devrez ajouter à votre fournisseur DNS."
@@ -961,6 +1033,10 @@ msgstr "Ajouter les destinataires pour créer le document avec"
msgid "Add these DNS records to verify your domain ownership"
msgstr "Ajoutez ces enregistrements DNS pour vérifier la propriété de votre domaine"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Add this URL to your provider's allowed redirect URIs"
+msgstr ""
+
#: apps/remix/app/components/forms/branding-preferences-form.tsx
msgid "Additional brand information to display at the bottom of emails"
msgstr "Informations supplémentaires sur la marque à afficher en bas des e-mails"
@@ -1078,6 +1154,10 @@ msgstr "Autoriser les destinataires du document à répondre directement à cett
msgid "Allow signers to dictate next signer"
msgstr "Permettre aux signataires de désigner le prochain signataire"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Allowed Email Domains"
+msgstr ""
+
#: apps/remix/app/components/embed/authoring/configure-document-advanced-settings.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
@@ -1120,6 +1200,7 @@ msgstr "Un e-mail contenant une invitation sera envoyé à chaque membre."
msgid "An email with this address already exists."
msgstr "Un email avec cette adresse existe déjà."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
@@ -1139,6 +1220,7 @@ msgstr "Une erreur est survenue lors de l'ajout des champs."
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "An error occurred while adding signers."
msgstr "Une erreur est survenue lors de l'ajout de signataires."
@@ -1146,6 +1228,30 @@ msgstr "Une erreur est survenue lors de l'ajout de signataires."
msgid "An error occurred while adding the fields."
msgstr "Une erreur est survenue lors de l'ajout des champs."
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the document settings."
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the fields."
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the subject form."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template fields."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template placeholders."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template settings."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx
msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields."
msgstr "Une erreur est survenue lors de la signature automatique du document, certains champs peuvent ne pas être signés. Veuillez vérifier et signer manuellement tous les champs restants."
@@ -1224,6 +1330,10 @@ msgstr "Une erreur s'est produite lors de la suppression de la sélection."
msgid "An error occurred while removing the signature."
msgstr "Une erreur est survenue lors de la suppression de la signature."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "An error occurred while resetting two factor authentication for the user."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "An error occurred while sending the document."
msgstr "Une erreur est survenue lors de l'envoi du document."
@@ -1281,10 +1391,23 @@ msgstr "Une erreur est survenue lors de la mise à jour de votre profil."
msgid "An error occurred while uploading your document."
msgstr "Une erreur est survenue lors de l'importation de votre document."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "An error occurred. Please try again later."
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "An organisation wants to create an account for you. Please review the details below."
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "An organisation wants to link your account. Please review the details below."
+msgstr ""
+
#: apps/remix/app/components/general/generic-error-layout.tsx
msgid "An unexpected error occurred."
msgstr "Une erreur inattendue est survenue."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
#: apps/remix/app/components/general/app-command-menu.tsx
#: apps/remix/app/components/forms/team-update-form.tsx
@@ -1364,37 +1487,48 @@ msgstr "Tokens API"
msgid "App Version"
msgstr "Version de l'application"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "Approve"
+msgstr ""
+
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table-action-dropdown.tsx
#: apps/remix/app/components/tables/documents-table-action-button.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document/document-page-view-button.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Approve"
msgstr "Approuver"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Approve Document"
msgstr "Approuver le document"
-#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Approved"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Approved"
msgstr "Approuvé"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Approver"
-msgstr "Approuveur"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Approvers"
-msgstr "Approuveurs"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Approving"
-msgstr "Approval en cours"
+msgstr ""
#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Are you sure you want to complete the document? This action cannot be undone. Please ensure that you have completed prefilling all relevant fields before proceeding."
@@ -1428,6 +1562,7 @@ msgstr "Êtes-vous sûr de vouloir supprimer cette organisation?"
msgid "Are you sure you wish to delete this team?"
msgstr "Êtes-vous sûr de vouloir supprimer cette équipe ?"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: apps/remix/app/components/dialogs/team-member-delete-dialog.tsx
@@ -1450,10 +1585,11 @@ msgid "Assigned Teams"
msgstr "Équipes assignées"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
msgid "Assist"
-msgstr "Aider"
+msgstr ""
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Assist Document"
msgstr "Assister le Document"
@@ -1463,29 +1599,36 @@ msgid "Assist with signing"
msgstr "Aider à la signature"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Assistant"
-msgstr "\"\""
+msgstr ""
#: packages/ui/components/recipient/recipient-role-select.tsx
msgid "Assistant role is only available when the document is in sequential signing mode."
msgstr "Le rôle d'assistant est uniquement disponible lorsque le document est en mode de signature séquentielle."
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Assistants"
-msgstr "\"\""
+msgstr ""
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
msgid "Assistants and Copy roles are currently not compatible with the multi-sign experience."
msgstr "Les rôles d'assistant et de copie ne sont actuellement pas compatibles avec l'expérience multi-sign."
-#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Assisted"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Assisted"
msgstr "Assisté"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Assisting"
-msgstr "En assistance"
+msgstr ""
#: apps/remix/app/components/forms/document-preferences-form.tsx
#: packages/ui/primitives/template-flow/add-template-settings.types.tsx
@@ -1510,6 +1653,10 @@ msgstr "Journaux de vérification"
msgid "Authentication Level"
msgstr "Niveau d'authentification"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Authentication Portal Not Found"
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-auth-page.tsx
#: apps/remix/app/components/general/direct-template/direct-template-signing-auth-page.tsx
msgid "Authentication required"
@@ -1640,6 +1787,11 @@ msgstr "Envoi en masse via CSV"
msgid "by <0>{senderName}0>"
msgstr "par <0>{senderName}0>"
+#. placeholder {0}: organisation.name
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "By accepting this request, you grant {0} the following permissions:"
+msgstr ""
+
#: packages/email/templates/confirm-team-email.tsx
msgid "By accepting this request, you will be granting <0>{teamName}0> access to:"
msgstr "En acceptant cette demande, vous accorderez à <0>{teamName}0> l'accès à :"
@@ -1672,6 +1824,7 @@ msgstr "En utilisant la fonctionnalité de signature électronique, vous consent
msgid "Can prepare"
msgstr "Peut préparer"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
@@ -1763,21 +1916,29 @@ msgid "Cannot remove signer"
msgstr "Impossible de supprimer le signataire"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Cc"
-msgstr "Cc"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
-#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
msgid "CC"
-msgstr "CC"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
+msgid "CC"
+msgstr ""
+
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
msgid "CC'd"
-msgstr "CC'd"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Ccers"
-msgstr "Copie Carboneurs"
+msgstr ""
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
msgid "Character Limit"
@@ -1872,10 +2033,27 @@ msgstr "Cliquez pour copier le lien de signature à envoyer au destinataire"
msgid "Click to insert field"
msgstr "Cliquez pour insérer un champ"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client ID"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client ID is required"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client Secret"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client secret is required"
+msgstr ""
+
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-passkey.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-2fa.tsx
#: apps/remix/app/components/general/document/document-recipient-link-copy-dialog.tsx
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
#: apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
@@ -1902,6 +2080,8 @@ msgstr "Comparez tous les plans et fonctionnalités en détail"
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/forms/signup.tsx
#: apps/remix/app/components/embed/embed-document-signing-page.tsx
+#: apps/remix/app/components/embed/embed-document-signing-page.tsx
+#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
msgid "Complete"
@@ -1923,9 +2103,9 @@ msgstr "Compléter le Document"
msgid "Complete Signing"
msgstr "Compléter la signature"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-msgid "Complete the fields for the following signers. Once reviewed, they will inform you if any modifications are needed."
-msgstr "Complétez les champs pour les signataires suivants. Une fois vérifiés, ils vous informeront si des modifications sont nécessaires."
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
+msgid "Complete the fields for the following signers."
+msgstr ""
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
@@ -2045,6 +2225,7 @@ msgstr "Confirmer la suppression"
msgid "Confirm email"
msgstr "Confirmer l'email"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/send-confirmation-email.tsx
msgid "Confirmation email sent"
msgstr "Email de confirmation envoyé"
@@ -2061,6 +2242,10 @@ msgstr "Coordonnées"
msgid "Contact sales here"
msgstr "Contactez le service commercial ici"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Contact us"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
msgid "Content"
msgstr "Contenu"
@@ -2141,6 +2326,8 @@ msgstr "Contrôle quelles signatures sont autorisées lors de la signature d'un
msgid "Copied"
msgstr "Copié"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/components/tables/settings-public-profile-templates-table.tsx
#: apps/remix/app/components/general/avatar-with-recipient.tsx
#: apps/remix/app/components/general/template/template-direct-link-badge.tsx
@@ -2182,6 +2369,11 @@ msgstr "Copier les liens de signature"
msgid "Copy token"
msgstr "Copier le token"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "couldn't be uploaded:"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
@@ -2208,6 +2400,10 @@ msgstr "Créez une nouvelle adresse e-mail pour votre organisation en utilisant
msgid "Create a new organisation with {planName} plan. Keep your current organisation on it's current plan"
msgstr "Créez une nouvelle organisation avec le plan {planName}. Conservez votre organisation actuelle sur son plan en cours"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Create a support ticket"
+msgstr ""
+
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Create a team to collaborate with your team members."
msgstr "Créer une équipe pour collaborer avec vos membres."
@@ -2466,6 +2662,7 @@ msgstr "Date de création"
msgid "Date Format"
msgstr "Format de date"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/general/organisations/organisation-invitations.tsx
#: packages/email/templates/organisation-invite.tsx
msgid "Decline"
@@ -2491,6 +2688,10 @@ msgstr "E-mail par défaut"
msgid "Default Email Settings"
msgstr "Paramètres d'e-mail par défaut"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Default Organisation Role for New Users"
+msgstr ""
+
#: apps/remix/app/components/forms/document-preferences-form.tsx
msgid "Default Signature Settings"
msgstr "Paramètres de Signature par Défaut"
@@ -2752,6 +2953,10 @@ msgstr "Désactiver la signature de lien direct empêchera quiconque d'accéder
msgid "Disabling the user results in the user not being able to use the account. It also disables all the related contents such as subscription, webhooks, teams, and API keys."
msgstr "Désactiver l'utilisateur a pour résultat que l'utilisateur ne peut pas utiliser le compte. Cela désactive également tous les contenus associés tels que l'abonnement, les webhooks, les équipes et les clés API."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Discord"
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "Display Name"
@@ -2820,8 +3025,9 @@ msgid "Document access"
msgstr "Accès au document"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document access auth updated"
-msgstr "L'authentification d'accès au document a été mise à jour"
+msgstr ""
#: apps/remix/app/components/general/document/document-status.tsx
msgid "Document All"
@@ -2837,9 +3043,13 @@ msgstr "Document Approuvé"
msgid "Document Cancelled"
msgstr "Document Annulé"
+#: packages/lib/utils/document-audit-logs.ts
+#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document completed"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-status.tsx
-#: packages/lib/utils/document-audit-logs.ts
-#: packages/lib/utils/document-audit-logs.ts
msgid "Document completed"
msgstr "Document terminé"
@@ -2852,8 +3062,12 @@ msgstr "E-mail de document complété"
msgid "Document Completed!"
msgstr "Document Complété !"
-#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document created"
+msgstr ""
+
+#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "Document created"
msgstr "Document créé"
@@ -2879,10 +3093,14 @@ msgstr "Document créé en utilisant un <0>lien direct0>"
msgid "Document Creation"
msgstr "Création de document"
+#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document deleted"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
#: apps/remix/app/components/dialogs/admin-document-delete-dialog.tsx
-#: packages/lib/utils/document-audit-logs.ts
msgid "Document deleted"
msgstr "Document supprimé"
@@ -2908,8 +3126,9 @@ msgid "Document Duplicated"
msgstr "Document dupliqué"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document external ID updated"
-msgstr "ID externe du document mis à jour"
+msgstr ""
#: apps/remix/app/components/general/document/document-certificate-qr-view.tsx
msgid "Document found in your account"
@@ -2945,16 +3164,18 @@ msgid "Document moved"
msgstr "Document déplacé"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document moved to team"
-msgstr "Document déplacé vers l'équipe"
+msgstr ""
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
msgid "Document no longer available to sign"
msgstr "Document non disponible pour signature"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document opened"
-msgstr "Document ouvert"
+msgstr ""
#: apps/remix/app/components/general/document/document-status.tsx
msgid "Document pending"
@@ -2993,8 +3214,12 @@ msgstr "Document Rejeté"
msgid "Document resealed"
msgstr "Document resealé"
-#: apps/remix/app/components/general/document/document-edit-form.tsx
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document sent"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "Document sent"
msgstr "Document envoyé"
@@ -3003,8 +3228,9 @@ msgid "Document Signed"
msgstr "Document signé"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document signing auth updated"
-msgstr "Authentification de signature de document mise à jour"
+msgstr ""
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document signing process will be cancelled"
@@ -3019,12 +3245,14 @@ msgid "Document title"
msgstr "Titre du document"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document title updated"
-msgstr "Titre du document mis à jour"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document updated"
-msgstr "Document mis à jour"
+msgstr ""
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
msgid "Document updated successfully"
@@ -3040,21 +3268,27 @@ msgid "Document uploaded"
msgstr "Document importé"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document viewed"
-msgstr "Document consulté"
+msgstr ""
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
msgid "Document Viewed"
msgstr "Document consulté"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document visibility updated"
-msgstr "Visibilité du document mise à jour"
+msgstr ""
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document will be permanently deleted"
msgstr "Le document sera supprimé de manière permanente"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Documentation"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx
@@ -3165,6 +3399,11 @@ msgid "Drag and drop your PDF file here"
msgstr "Faites glisser et déposez votre fichier PDF ici"
#: packages/lib/constants/document.ts
+msgctxt "Draw signatute type"
+msgid "Draw"
+msgstr ""
+
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Draw"
msgstr "Dessiner"
@@ -3411,6 +3650,10 @@ msgstr "Activer la signature de lien direct"
msgid "Enable signing order"
msgstr "Activer l'ordre de signature"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Enable SSO portal"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
@@ -3475,13 +3718,18 @@ msgstr "Entreprise"
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
#: apps/remix/app/components/general/verify-email-banner.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
@@ -3510,6 +3758,10 @@ msgstr "Entreprise"
#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
@@ -3521,6 +3773,7 @@ msgstr "Entreprise"
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -3579,6 +3832,10 @@ msgstr "Échec de la création du dossier"
msgid "Failed to create subscription claim."
msgstr "Échec de la création de la réclamation d'abonnement."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Failed to create support ticket"
+msgstr ""
+
#: apps/remix/app/components/dialogs/folder-delete-dialog.tsx
msgid "Failed to delete folder"
msgstr "Échec de la suppression du dossier"
@@ -3611,6 +3868,10 @@ msgstr "Échec de l'enregistrement des paramètres."
msgid "Failed to sign out all sessions"
msgstr "Impossible de se déconnecter de toutes les sessions"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Failed to unlink account"
+msgstr ""
+
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
msgid "Failed to update document"
msgstr "Échec de la mise à jour du document"
@@ -3669,16 +3930,19 @@ msgid "Field placeholder"
msgstr "Espace réservé du champ"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field prefilled by assistant"
-msgstr "Champ pré-rempli par l'assistant"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field signed"
-msgstr "Champ signé"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field unsigned"
-msgstr "Champ non signé"
+msgstr ""
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
msgid "Fields"
@@ -3688,13 +3952,21 @@ msgstr "Champs"
msgid "Fields updated"
msgstr "Champs mis à jour"
-#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-upload.tsx
-#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "Le fichier ne peut pas dépasser {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} Mo"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "File is too small"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB"
msgstr "La taille du fichier dépasse la limite de {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB"
@@ -3810,6 +4082,7 @@ msgstr "Générer des liens"
msgid "Global recipient action authentication"
msgstr "Authentification d'action de destinataire globale"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
@@ -4000,6 +4273,10 @@ msgstr "Accueil (Pas de Dossier)"
msgid "Horizontal"
msgstr "Horizontal"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "I agree to link my account with this organization"
+msgstr ""
+
#: packages/lib/constants/recipient-roles.ts
msgid "I am a signer of this document"
msgstr "Je suis un signataire de ce document"
@@ -4024,6 +4301,10 @@ msgstr "Je dois recevoir une copie de ce document"
msgid "I am the owner of this document"
msgstr "Je suis le propriétaire de ce document"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "I understand that I am providing my credentials to a 3rd party service configured by this organisation"
+msgstr ""
+
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx
#: apps/remix/app/components/dialogs/token-delete-dialog.tsx
msgid "I'm sure! Delete it"
@@ -4053,6 +4334,10 @@ msgstr "Si vous ne trouvez pas le lien de confirmation dans votre boîte de réc
msgid "If your authenticator app does not support QR codes, you can use the following code instead:"
msgstr "Si votre application d'authentification ne prend pas en charge les codes QR, vous pouvez utiliser le code suivant à la place :"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Important: What This Means"
+msgstr ""
+
#: apps/remix/app/components/general/app-nav-mobile.tsx
#: apps/remix/app/components/general/app-nav-mobile.tsx
#: apps/remix/app/components/general/document/document-status.tsx
@@ -4120,6 +4405,10 @@ msgstr "Statistiques de l'instance"
msgid "Invalid code. Please try again."
msgstr "Code invalide. Veuillez réessayer."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Invalid domains"
+msgstr ""
+
#: packages/ui/primitives/document-flow/add-signers.types.ts
msgid "Invalid email"
msgstr "Email invalide"
@@ -4133,6 +4422,10 @@ msgstr "Lien invalide"
msgid "Invalid token"
msgstr "Token invalide"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Invalid Token"
+msgstr ""
+
#: apps/remix/app/components/forms/reset-password.tsx
msgid "Invalid token provided. Please try again."
msgstr "Le token fourni est invalide. Veuillez réessayer."
@@ -4192,6 +4485,10 @@ msgstr "Facture"
msgid "IP Address"
msgstr "Adresse IP"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Issuer URL"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "It is crucial to keep your contact information, especially your email address, up to date with us. Please notify us immediately of any changes to ensure that you continue to receive all necessary communications."
msgstr "Il est crucial de maintenir vos coordonnées, en particulier votre adresse e-mail, à jour avec nous. Veuillez nous informer immédiatement de tout changement pour vous assurer que vous continuez à recevoir toutes les communications nécessaires."
@@ -4225,6 +4522,10 @@ msgstr "Ce n'est actuellement pas votre tour de signer. Vous recevrez un e-mail
msgid "Join {organisationName} on Documenso"
msgstr "Rejoindre {organisationName} sur Documenso"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Join our community on <0>Discord0> for community support and discussion."
+msgstr ""
+
#. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' })
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "Joined {0}"
@@ -4319,10 +4620,27 @@ msgstr "Vous voulez avoir votre propre profil public avec des accords ?"
msgid "Link expires in 1 hour."
msgstr "Le lien expire dans 1 heure."
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Link expires in 30 minutes."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.public-profile.tsx
msgid "Link template"
msgstr "Modèle de lien"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Link your Documenso account"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "Linked Accounts"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Linked At"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "Links Generated"
msgstr "Liens générés"
@@ -4347,6 +4665,10 @@ msgstr "Chargement du document..."
msgid "Loading Document..."
msgstr "Chargement du Document..."
+#: packages/ui/components/recipient/recipient-autocomplete-input.tsx
+msgid "Loading suggestions..."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-page-view-recent-activity.tsx
msgid "Loading..."
msgstr "Chargement..."
@@ -4372,6 +4694,10 @@ msgstr "Gérer"
msgid "Manage {0}'s profile"
msgstr "Gérer le profil de {0}"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Manage a custom SSO login portal for your organisation."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/organisations.tsx
msgid "Manage all organisations you are currently associated with."
msgstr "Gérez toutes les organisations avec lesquelles vous êtes actuellement associé."
@@ -4404,6 +4730,10 @@ msgstr "Gérer le lien direct"
msgid "Manage documents"
msgstr "Gérer les documents"
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "Manage linked accounts"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "Manage organisation"
msgstr "Gérer l'organisation"
@@ -4539,6 +4869,10 @@ msgstr "Membre"
msgid "Member Count"
msgstr "Nombre de membres"
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "Member promoted to owner successfully"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-members-table.tsx
msgid "Member Since"
msgstr "Membre depuis"
@@ -4554,6 +4888,7 @@ msgstr "Membre depuis"
msgid "Members"
msgstr "Membres"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Message"
@@ -4789,6 +5124,10 @@ msgstr "Aucun champ de signature trouvé"
msgid "No Stripe customer attached"
msgstr "Aucun client Stripe attaché"
+#: packages/ui/components/recipient/recipient-autocomplete-input.tsx
+msgid "No suggestions found"
+msgstr ""
+
#: apps/remix/app/components/tables/team-groups-table.tsx
msgid "No team groups found"
msgstr "Aucun groupe d'équipes trouvé"
@@ -4919,6 +5258,16 @@ msgstr "Seules les administrateurs peuvent accéder et voir le document"
msgid "Only managers and above can access and view the document"
msgstr "Seuls les responsables et au-dessus peuvent accéder et voir le document"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Only one file can be uploaded at a time"
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Only PDF files are allowed"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/general/generic-error-layout.tsx
#: apps/remix/app/components/general/generic-error-layout.tsx
@@ -4934,10 +5283,15 @@ msgstr "Ouvert"
msgid "Or"
msgstr "Ou"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "OR"
+msgstr ""
+
#: apps/remix/app/components/forms/signin.tsx
msgid "Or continue with"
msgstr "Ou continuez avec"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/tables/user-organisations-table.tsx
#: apps/remix/app/components/tables/admin-organisations-table.tsx
msgid "Organisation"
@@ -4947,6 +5301,10 @@ msgstr "Organisation"
msgid "Organisation Admin"
msgstr "Administrateur de l'organisation"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Organisation authentication portal URL"
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-organisation-create-dialog.tsx
msgid "Organisation created"
msgstr "Organisation créée"
@@ -5017,6 +5375,10 @@ msgstr "Paramètres de l'organisation"
msgid "Organisation Settings"
msgstr "Paramètres de l'organisation"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Organisation SSO Portal"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "Organisation Teams"
msgstr "Équipes de l'organisation"
@@ -5309,9 +5671,13 @@ msgstr "Veuillez entrer un nom significatif pour votre token. Cela vous aidera
msgid "Please enter a valid name."
msgstr "Veuiillez entrer un nom valide."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-msgid "Please mark as viewed to complete"
-msgstr "Veuillez marquer comme vu pour terminer"
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
+msgid "Please mark as viewed to complete."
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Please note that anyone who signs in through your portal will be added to your organisation as a member."
+msgstr ""
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid "Please note that proceeding will remove direct linking recipient and turn it into a placeholder."
@@ -5349,11 +5715,11 @@ msgstr "Veuillez fournir un token de l'authentificateur, ou un code de secours.
msgid "Please provide a token from your authenticator, or a backup code."
msgstr "Veuillez fournir un token de votre authentificateur, ou un code de secours."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
msgid "Please review the document before approving."
msgstr "Veuillez examiner le document avant d'approuver."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
msgid "Please review the document before signing."
msgstr "Veuillez examiner le document avant de signer."
@@ -5449,6 +5815,18 @@ msgstr "Profil mis à jour"
msgid "Progress"
msgstr "Progrès"
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "Promote to owner"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Provider"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Provider has been updated successfully"
+msgstr ""
+
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/general/template/template-type.tsx
msgid "Public"
@@ -5485,6 +5863,10 @@ msgstr "Valeurs radio"
msgid "Read only"
msgstr "Lecture seule"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Read our documentation to get started with Documenso."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-disclosure.tsx
msgid "Read the full <0>signature disclosure0>."
msgstr "Lisez l'intégralité de la <0>divulgation de signature0>."
@@ -5601,6 +5983,10 @@ msgstr "Codes de récupération"
msgid "Red"
msgstr "Rouge"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Redirect URI"
+msgstr ""
+
#: apps/remix/app/components/embed/authoring/configure-document-advanced-settings.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
@@ -5714,6 +6100,10 @@ msgstr "Répondre à l'e-mail"
msgid "Reply To Email"
msgstr "Répondre à l'e-mail"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Requesting Organisation"
+msgstr ""
+
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx
@@ -5722,6 +6112,10 @@ msgstr "Répondre à l'e-mail"
msgid "Required field"
msgstr "Champ requis"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Required scopes"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
msgid "Reseal document"
msgstr "Rescellage du document"
@@ -5746,6 +6140,11 @@ msgstr "Renvoyer la vérification"
msgid "Reset"
msgstr "Réinitialiser"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset 2FA"
+msgstr ""
+
#: apps/remix/app/components/forms/forgot-password.tsx
msgid "Reset email sent"
msgstr "E-mail de réinitialisation envoyé"
@@ -5757,6 +6156,14 @@ msgstr "E-mail de réinitialisation envoyé"
msgid "Reset Password"
msgstr "Réinitialiser le mot de passe"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset the users two factor authentication. This action is irreversible and will disable two factor authentication for the user."
+msgstr ""
+
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset Two Factor Authentication"
+msgstr ""
+
#: apps/remix/app/components/forms/reset-password.tsx
msgid "Resetting Password..."
msgstr "Réinitialisation du mot de passe..."
@@ -5788,9 +6195,14 @@ msgstr "Réessayer"
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
msgid "Return"
msgstr "Retour"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Return to Documenso sign in page here"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
msgid "Return to Home"
msgstr "Retour à l'accueil"
@@ -5800,6 +6212,10 @@ msgstr "Retour à l'accueil"
msgid "Return to sign in"
msgstr "Retour à la connexion"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Review request"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
msgid "Revoke"
@@ -5974,6 +6390,10 @@ msgstr "Sélectionnez les méthodes d'authentification"
msgid "Select default option"
msgstr "Sélectionner l'option par défaut"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Select default role"
+msgstr ""
+
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx
msgid "Select direction"
msgstr "Sélectionner la direction"
@@ -6189,6 +6609,11 @@ msgstr "Afficher les paramètres avancés"
msgid "Show templates in your public profile for your audience to sign and get started quickly"
msgstr "Afficher des modèles dans votre profil public pour que votre audience puisse signer et commencer rapidement"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "Sign"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table-action-dropdown.tsx
@@ -6202,7 +6627,6 @@ msgstr "Afficher des modèles dans votre profil public pour que votre audience p
#: apps/remix/app/components/general/document-signing/document-signing-auth-password.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-2fa.tsx
#: apps/remix/app/components/general/document/document-page-view-button.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Sign"
msgstr "Signer"
@@ -6224,7 +6648,7 @@ msgstr "Signer comme<0>{0} <1>({1})1>0>"
msgid "Sign document"
msgstr "Signer le document"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Sign Document"
msgstr "Signer le document"
@@ -6242,6 +6666,7 @@ msgstr "Champ de signature"
msgid "Sign Here"
msgstr "Signer ici"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: packages/email/template-components/template-reset-password.tsx
@@ -6249,6 +6674,7 @@ msgid "Sign In"
msgstr "Se connecter"
#: apps/remix/app/routes/_unauthenticated+/signin.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
msgid "Sign in to your account"
msgstr "Connectez-vous à votre compte"
@@ -6316,32 +6742,35 @@ msgstr "Signatures collectées"
msgid "Signatures will appear once the document has been completed"
msgstr "Les signatures apparaîtront une fois le document complété"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Signed"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/ui/components/document/document-read-only-fields.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Signed"
msgstr "Signé"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Signer"
-msgstr "Signataire"
+msgstr ""
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Signer Events"
msgstr "Événements de signataire"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Signers"
-msgstr "Signataires"
-
-#: packages/ui/primitives/document-flow/add-signers.types.ts
-msgid "Signers must have unique emails"
-msgstr "Les signataires doivent avoir des e-mails uniques"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Signing"
-msgstr "Signature en cours"
+msgstr ""
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Signing Certificate"
@@ -6512,6 +6941,14 @@ msgstr "Désolé, nous n'avons pas pu télécharger le certificat. Veuillez rée
msgid "Source"
msgstr "Source"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Space-separated list of domains. Leave empty to allow all domains."
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
+msgid "SSO"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
msgid "Stats"
msgstr "Statistiques"
@@ -6543,6 +6980,7 @@ msgstr "Le client Stripe a été créé avec succès"
msgid "Stripe Customer ID"
msgstr "ID client Stripe"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Subject"
msgstr "Sujet"
@@ -6552,6 +6990,10 @@ msgstr "Sujet"
msgid "Subject <0>(Optional)0>"
msgstr "Objet <0>(Optionnel)0>"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Submit"
+msgstr ""
+
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx
@@ -6585,10 +7027,12 @@ msgstr "Abonnement non valide"
#: apps/remix/app/routes/embed+/v1+/authoring+/template.edit.$id.tsx
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
@@ -6646,6 +7090,15 @@ msgstr "Créés avec succès : {successCount}"
msgid "Summary:"
msgstr "Résumé :"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+#: apps/remix/app/components/general/org-menu-switcher.tsx
+msgid "Support"
+msgstr ""
+
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Support ticket created"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
msgid "Sync"
msgstr "Synchronisation"
@@ -7009,7 +7462,8 @@ msgid "The email address which will show up in the \"Reply To\" field in emails"
msgstr "L'adresse e-mail qui apparaîtra dans le champ \"Répondre à\" dans les courriels"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
-msgid "The email domain you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The email domain you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Le domaine de messagerie que vous recherchez a peut-être été supprimé, renommé ou n'a peut-être jamais existé."
@@ -7050,12 +7504,21 @@ msgstr "Les erreurs suivantes se sont produites :"
msgid "The following team has been deleted. You will no longer be able to access this team and its documents"
msgstr "L'équipe suivante a été supprimée. Vous ne pourrez plus accéder à cette équipe et à ses documents"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "The OpenID discovery endpoint URL for your provider"
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "The organisation authentication portal does not exist, or is not configured"
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "The organisation email has been created successfully."
msgstr "L'e-mail de l'organisation a été créé avec succès."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
-msgid "The organisation group you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation group you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Le groupe d'organisation que vous cherchez peut avoir été supprimé, renommé ou n'a peut-être jamais existé."
@@ -7064,12 +7527,14 @@ msgid "The organisation role that will be applied to all members in this group."
msgstr "Le rôle d'organisation qui sera appliqué à tous les membres de ce groupe."
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
-msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "L'organisation que vous cherchez peut avoir été supprimée, renommée ou n'a peut-être jamais existé."
#: apps/remix/app/routes/_authenticated+/_layout.tsx
-msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "L'organisation que vous cherchez peut avoir été supprimée, renommée ou n'a peut-être jamais existé."
@@ -7158,12 +7623,14 @@ msgid "The team email <0>{teamEmail}0> has been removed from the following tea
msgstr "L'email d'équipe <0>{teamEmail}0> a été supprimé de l'équipe suivante"
#: apps/remix/app/routes/_authenticated+/_layout.tsx
-msgid "The team you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The team you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "L'équipe que vous cherchez peut avoir été supprimée, renommée ou n'a peut-être jamais existé."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
-msgid "The team you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The team you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "L'équipe que vous cherchez a peut-être été supprimée, renommée ou n'a peut-être jamais existé."
@@ -7179,6 +7646,10 @@ msgstr "Le modèle sera retiré de votre profil"
msgid "The test webhook has been successfully sent to your endpoint."
msgstr "Le webhook de test a été envoyé avec succès vers votre point de terminaison."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "The token is invalid or has expired."
+msgstr ""
+
#: apps/remix/app/components/forms/token.tsx
msgid "The token was copied to your clipboard."
msgstr "Le token a été copié dans votre presse-papiers."
@@ -7205,10 +7676,15 @@ msgid "The URL for Documenso to send webhook events to."
msgstr "L'URL pour Documenso pour envoyer des événements webhook."
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
-msgid "The user you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The user you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "L'utilisateur que vous cherchez peut avoir été supprimé, renommé ou n'a peut-être jamais existé."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "The user's two factor authentication has been reset successfully."
+msgstr ""
+
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx
msgid "The webhook has been successfully deleted."
msgstr "Le webhook a été supprimé avec succès."
@@ -7222,7 +7698,8 @@ msgid "The webhook was successfully created."
msgstr "Le webhook a été créé avec succès."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
-msgid "The webhook you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The webhook you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Le webhook que vous recherchez a peut-être été supprimé, renommé ou n'a peut-être jamais existé."
@@ -7258,6 +7735,10 @@ msgstr "Ce compte a été désactivé. Veuillez contacter le support."
msgid "This account has not been verified. Please verify your account before signing in."
msgstr "Ce compte n'a pas été vérifié. Veuillez vérifier votre compte avant de vous connecter."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "This action is irreversible. Please ensure you have informed the user before proceeding."
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
#: apps/remix/app/components/dialogs/admin-document-delete-dialog.tsx
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
@@ -7376,10 +7857,22 @@ msgstr "Voici comment le document atteindra les destinataires une fois qu'il ser
msgid "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
msgstr "Il s'agit de la réclamation avec laquelle cette organisation a initialement été créée. Tout changement de drapeau de fonctionnalité à cette revendication sera rétroporté dans cette organisation."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "This is the required scopes you must set in your provider's settings"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "This is the URL which users will use to sign in to your organisation."
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
msgid "This link is invalid or has expired. Please contact your team to resend a verification."
msgstr "Ce lien est invalide ou a expiré. Veuillez contacter votre équipe pour renvoyer une vérification."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "This organisation will have administrative control over your account. You can revoke this access later, but they will retain access to any data they've already collected."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.general.tsx
msgid "This organisation, and any associated data will be permanently deleted."
msgstr "Cette organisation, ainsi que toutes les données associées, seront définitivement supprimées."
@@ -7499,9 +7992,10 @@ msgstr "Pour pouvoir ajouter des membres à une équipe, vous devez d'abord les
msgid "To change the email you must remove and add a new email address."
msgstr "Pour changer l'e-mail, vous devez supprimer et ajouter une nouvelle adresse e-mail."
+#. placeholder {0}: user.email
#. placeholder {0}: userToEnable.email
#. placeholder {0}: userToDisable.email
-#. placeholder {0}: user.email
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -7517,6 +8011,7 @@ msgid "To enable two-factor authentication, scan the following QR code using you
msgstr "Pour activer l'authentification à deux facteurs, scannez le code QR suivant à l'aide de votre application d'authentification."
#: apps/remix/app/routes/_unauthenticated+/unverified-account.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
msgid "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
msgstr "Pour accéder à votre compte, veuillez confirmer votre adresse e-mail en cliquant sur le lien de confirmation dans votre boîte de réception."
@@ -7633,9 +8128,14 @@ msgstr "L'authentification à deux facteurs a été désactivée pour votre comp
msgid "Two-Factor Re-Authentication"
msgstr "Ré-authentification à deux facteurs"
+#: packages/lib/constants/document.ts
+msgctxt "Type signatute type"
+msgid "Type"
+msgstr ""
+
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
-#: packages/lib/constants/document.ts
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Type"
msgstr "Type"
@@ -7749,9 +8249,15 @@ msgstr "Non complet"
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
msgid "Unknown"
msgstr "Inconnu"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Unknown error"
+msgstr ""
+
#: apps/remix/app/components/tables/admin-claims-table.tsx
msgid "Unlimited"
msgstr "Illimité"
@@ -7760,6 +8266,11 @@ msgstr "Illimité"
msgid "Unlimited documents, API and more"
msgstr "Documents illimités, API et plus"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Unlink"
+msgstr ""
+
#: apps/remix/app/components/general/folder/folder-card.tsx
msgid "Unpin"
msgstr "Détacher"
@@ -7768,6 +8279,7 @@ msgstr "Détacher"
msgid "Untitled Group"
msgstr "Groupe sans titre"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
@@ -7907,6 +8419,11 @@ msgid "Upgrade your plan to upload more documents"
msgstr "Mettez à niveau votre plan pour importer plus de documents"
#: packages/lib/constants/document.ts
+msgctxt "Upload signatute type"
+msgid "Upload"
+msgstr ""
+
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Upload"
msgstr "Importer"
@@ -7940,6 +8457,11 @@ msgstr "Importer un document personnalisé"
msgid "Upload Document"
msgstr "Importer le document"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Upload failed"
+msgstr ""
+
#: packages/ui/primitives/signature-pad/signature-pad-upload.tsx
msgid "Upload Signature"
msgstr "Importer une signature"
@@ -8021,6 +8543,7 @@ msgstr "L'utilisateur n'a pas de mot de passe."
msgid "User not found"
msgstr "Utilisateur non trouvé"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -8094,6 +8617,11 @@ msgstr "Vérifiez votre adresse e-mail d'équipe"
msgid "Vertical"
msgstr "Vertical"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "View"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
@@ -8103,7 +8631,6 @@ msgstr "Vertical"
#: apps/remix/app/components/general/document/document-page-view-button.tsx
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "View"
msgstr "Voir"
@@ -8136,6 +8663,11 @@ msgstr "Voir toute l'activité de sécurité liée à votre compte."
msgid "View and manage all active sessions for your account."
msgstr "Afficher et gérer toutes les sessions actives de votre compte."
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "View and manage all login methods linked to your account."
+msgstr ""
+
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
msgid "View Codes"
msgstr "Voir les codes"
@@ -8148,7 +8680,7 @@ msgstr "Voir les enregistrements DNS"
msgid "View document"
msgstr "Voir le document"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
@@ -8198,24 +8730,31 @@ msgstr "Voir les équipes"
msgid "View the DNS records for this email domain"
msgstr "Voir les enregistrements DNS pour ce domaine de messagerie"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Viewed"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Viewed"
msgstr "Vu"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Viewer"
-msgstr "Lecteur"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Viewers"
-msgstr "Lecteurs"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Viewing"
-msgstr "Consultation"
+msgstr ""
#: apps/remix/app/components/dialogs/folder-update-dialog.tsx
msgid "Visibility"
@@ -8276,6 +8815,10 @@ msgstr "Nous ne pouvons pas mettre à jour cette clé de passkey pour le moment.
msgid "We couldn't create a Stripe customer. Please try again."
msgstr "Nous n'avons pas pu créer un client Stripe. Veuillez réessayer."
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "We couldn't promote the member to owner. Please try again."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "We couldn't update the group. Please try again."
msgstr "Nous n'avons pas pu mettre à jour le groupe. Veuillez réessayer."
@@ -8285,6 +8828,10 @@ msgstr "Nous n'avons pas pu mettre à jour le groupe. Veuillez réessayer."
msgid "We couldn't update the organisation. Please try again."
msgstr "Nous n'avons pas pu mettre à jour l'organisation. Veuillez réessayer."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "We couldn't update the provider. Please try again."
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "We encountered an error while creating the email. Please try again later."
msgstr "Nous avons rencontré une erreur lors de la création de l'e-mail. Veuillez réessayer plus tard."
@@ -8393,6 +8940,7 @@ msgstr "Une erreur inconnue s'est produite lors de la réinitialisation de votre
msgid "We encountered an unknown error while attempting to revoke access. Please try again or contact support."
msgstr "Une erreur inconnue s'est produite lors de la révocation de l'accès. Veuillez réessayer ou contacter le support."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/signin.tsx
msgid "We encountered an unknown error while attempting to sign you In. Please try again later."
@@ -8528,6 +9076,10 @@ msgstr "Nous allons générer des liens de signature pour vous, que vous pouvez
msgid "We won't send anything to notify recipients."
msgstr "Nous n'enverrons rien pour notifier les destinataires."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "We'll get back to you as soon as possible via email."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates._index.tsx
#: apps/remix/app/components/tables/documents-table-empty-state.tsx
msgid "We're all empty"
@@ -8585,10 +9137,18 @@ msgstr "Contentieux, nous avons de la chance de vous avoir."
msgid "Welcome back! Here's an overview of your account."
msgstr "Bon retour ! Voici un aperçu de votre compte."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Welcome to {organisationName}"
+msgstr ""
+
#: packages/email/template-components/template-confirmation-email.tsx
msgid "Welcome to Documenso!"
msgstr "Bienvenue sur Documenso !"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Well-known URL is required"
+msgstr ""
+
#: apps/remix/app/routes/_recipient+/sign.$token+/waiting.tsx
msgid "Were you trying to edit this document instead?"
msgstr "Essayiez-vous d'éditer ce document à la place ?"
@@ -8615,6 +9175,10 @@ msgstr "Lorsque vous signez un document, nous pouvons automatiquement remplir et
msgid "When you use our platform to affix your electronic signature to documents, you are consenting to do so under the Electronic Signatures in Global and National Commerce Act (E-Sign Act) and other applicable laws. This action indicates your agreement to use electronic means to sign documents and receive notifications."
msgstr "Lorsque vous utilisez notre plateforme pour apposer votre signature électronique sur des documents, vous consentez à le faire conformément à la loi sur les signatures électroniques dans le commerce mondial et national (E-Sign Act) et aux autres lois applicables. Cette action indique votre accord à utiliser des moyens électroniques pour signer des documents et recevoir des notifications."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Whether to enable the SSO portal for your organisation"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
msgid "While waiting for them to do so you can create your own Documenso account and get started with document signing right away."
msgstr "En attendant qu'ils le fassent, vous pouvez créer votre propre compte Documenso et commencer à signer des documents dès maintenant."
@@ -8682,6 +9246,10 @@ msgstr "Vous êtes sur le point de quitter l'organisation suivante."
msgid "You are about to remove default access to this team for all organisation members. Any members not explicitly added to this team will no longer have access."
msgstr "Vous êtes sur le point de supprimer l'accès par défaut à cette équipe pour tous les membres de l'organisation. Tous les membres non ajoutés explicitement à cette équipe ne pourront plus y accéder."
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "You are about to remove the <0>{provider}0> login method from your account."
+msgstr ""
+
#. placeholder {0}: organisation.name
#: apps/remix/app/components/dialogs/organisation-email-domain-delete-dialog.tsx
msgid "You are about to remove the email domain <0>{emailDomain}0> from <1>{0}1>. All emails associated with this domain will be deleted."
@@ -8768,6 +9336,10 @@ msgstr "Vous n'êtes pas autorisé à désactiver cet utilisateur."
msgid "You are not authorized to enable this user."
msgstr "Vous n'êtes pas autorisé à activer cet utilisateur."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "You are not authorized to reset two factor authentcation for this user."
+msgstr ""
+
#: packages/email/template-components/template-confirmation-email.tsx
msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)"
msgstr "Vous pouvez également copier et coller ce lien dans votre navigateur : {confirmationLink} (le lien expire dans 1 heure)"
@@ -9058,6 +9630,10 @@ msgstr "Vous devrez maintenant entrer un code de votre application d'authentific
msgid "You will receive an Email copy of the signed document once everyone has signed."
msgstr "Vous recevrez une copie par e-mail du document signé une fois que tout le monde aura signé."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Your Account"
+msgstr ""
+
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
msgid "Your account has been deleted successfully."
msgstr "Votre compte a été supprimé avec succès."
@@ -9091,6 +9667,10 @@ msgstr "Votre envoi groupé pour le modèle \"{templateName}\" est terminé."
msgid "Your current {currentProductName} plan is past due. Please update your payment information."
msgstr "Votre plan actuel {currentProductName} est arrivé à échéance. Veuillez mettre à jour vos informations de paiement."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Your current plan includes the following support channels:"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.billing.tsx
msgid "Your current plan is inactive."
msgstr "Votre plan actuel est inactif."
@@ -9104,7 +9684,6 @@ msgid "Your direct signing templates"
msgstr "Vos modèles de signature directe"
#: apps/remix/app/components/general/document/document-upload.tsx
-#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "Your document failed to upload."
msgstr "L'importation de votre document a échoué."
@@ -9237,6 +9816,10 @@ msgstr "Votre code de récupération a été copié dans votre presse-papiers."
msgid "Your recovery codes are listed below. Please store them in a safe place."
msgstr "Vos codes de récupération sont listés ci-dessous. Veuillez les conserver dans un endroit sûr."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Your support request has been submitted. We'll get back to you soon!"
+msgstr ""
+
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Your team has been created."
msgstr "Votre équipe a été créée."
@@ -9249,10 +9832,6 @@ msgstr "Votre équipe a été supprimée avec succès."
msgid "Your team has been successfully updated."
msgstr "Votre équipe a été mise à jour avec succès."
-#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
-msgid "Your template failed to upload."
-msgstr "Votre modèle n'a pas pu être téléchargé."
-
#: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx
msgid "Your template has been created successfully"
msgstr "Votre modèle a été créé avec succès"
@@ -9289,3 +9868,6 @@ msgstr "Votre token a été créé avec succès ! Assurez-vous de le copier car
msgid "Your tokens will be shown here once you create them."
msgstr "Vos tokens seront affichés ici une fois que vous les aurez créés."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "your-domain.com another-domain.com"
+msgstr ""
diff --git a/packages/lib/translations/it/web.po b/packages/lib/translations/it/web.po
index e35aa8476..35d82a4a4 100644
--- a/packages/lib/translations/it/web.po
+++ b/packages/lib/translations/it/web.po
@@ -414,14 +414,30 @@ msgstr "{visibleRows, plural, one {Visualizzazione di # risultato.} other {Visua
msgid "<0>\"{0}\"0>is no longer available to sign"
msgstr "<0>\"{0}\"0>non è più disponibile per la firma"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "<0>{organisationName}0> has requested to create an account on your behalf."
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "<0>{organisationName}0> has requested to link your current Documenso account to their organisation."
+msgstr ""
+
#: packages/email/templates/confirm-team-email.tsx
msgid "<0>{teamName}0> has requested to use your email address for their team on Documenso."
msgstr "<0>{teamName}0> ha richiesto di utilizzare il tuo indirizzo email per il loro team su Documenso."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Account management:0> Modify your account settings, permissions, and preferences"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "<0>Click to upload0> or drag and drop"
msgstr "<0>Fai clic per caricare0> o trascina e rilascia"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Data access:0> Access all data associated with your account"
+msgstr ""
+
#: packages/ui/components/document/document-signature-settings-tooltip.tsx
msgid "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
msgstr "<0>Disegnata0> - Una firma disegnata con un mouse o uno stilo."
@@ -430,6 +446,10 @@ msgstr "<0>Disegnata0> - Una firma disegnata con un mouse o uno stilo."
msgid "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
msgstr "<0>Email0> - Al destinatario verrà inviato il documento tramite email per firmare, approvare, ecc."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Full account access:0> View all your profile information, settings, and activity"
+msgstr ""
+
#: packages/ui/components/recipient/recipient-action-auth-select.tsx
msgid "<0>Inherit authentication method0> - Use the global action signing authentication method configured in the \"General Settings\" step"
msgstr "<0>Eredita metodo di autenticazione0> - Usa il metodo globale di autenticazione della firma configurato nel passaggio \"Impostazioni generali\""
@@ -517,10 +537,18 @@ msgstr "{VAR_PLURAL, select, one {1 mese} other {12 mesi}}"
msgid "2FA"
msgstr "2FA"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "2FA Reset"
+msgstr ""
+
#: apps/remix/app/components/forms/token.tsx
msgid "3 months"
msgstr "{VAR_PLURAL, select, one {1 mese} other {3 mesi}}"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "400 Error"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
msgid "401 Unauthorized"
@@ -534,6 +562,10 @@ msgstr "404 Dominio email non trovato"
msgid "404 not found"
msgstr "404 non trovato"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "404 Not Found"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "404 Organisation group not found"
msgstr "404 Gruppo organizzazione non trovato"
@@ -597,16 +629,19 @@ msgid "A draft document will be created"
msgstr "Verrà creato un documento bozza"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was added"
-msgstr "Un campo è stato aggiunto"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was removed"
-msgstr "Un campo è stato rimosso"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was updated"
-msgstr "Un campo è stato aggiornato"
+msgstr ""
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "A means to print or download documents for your records"
@@ -646,16 +681,27 @@ msgid "A password reset email has been sent, if you have an account you should s
msgstr "È stata inviata un'e-mail per il reset della password; se hai un account dovresti vederla nella tua casella di posta a breve."
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was added"
-msgstr "Un destinatario è stato aggiunto"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was removed"
-msgstr "Un destinatario è stato rimosso"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was updated"
-msgstr "Un destinatario è stato aggiornato"
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "A request has been made to create an account for you"
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "A request has been made to link your Documenso account"
+msgstr ""
#. placeholder {0}: team.name
#: packages/lib/server-only/team/create-team-email-verification.ts
@@ -706,6 +752,10 @@ msgstr "Un'email di verifica sarà inviata all'email fornita."
msgid "Accept"
msgstr "Accetta"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Accept & Link Account"
+msgstr ""
+
#: packages/email/templates/organisation-invite.tsx
msgid "Accept invitation to join an organisation on Documenso"
msgstr "Accetta l'invito a unirti a un'organizzazione su Documenso"
@@ -726,6 +776,7 @@ msgstr "Accesso disabilitato"
msgid "Access enabled"
msgstr "Accesso abilitato"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/general/org-menu-switcher.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
msgid "Account"
@@ -735,6 +786,14 @@ msgstr "Account"
msgid "Account Authentication"
msgstr "Autenticazione dell'account"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Account creation request"
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Account Creation Request"
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
msgid "Account deleted"
@@ -748,10 +807,18 @@ msgstr "Account disabilitato"
msgid "Account enabled"
msgstr "Account abilitato"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Account Linking Request"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Account Re-Authentication"
msgstr "Ri-autenticazione dell'account"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Account unlinked"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "Acknowledgment"
msgstr "Riconoscimento"
@@ -766,6 +833,7 @@ msgstr "Azione"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/team-members-table.tsx
#: apps/remix/app/components/tables/team-members-table.tsx
@@ -804,6 +872,10 @@ msgstr "Abbonamenti attivi"
msgid "Add"
msgstr "Aggiungi"
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "Add 2 or more signers to enable signing order."
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-domain-create-dialog.tsx
msgid "Add a custom domain to send emails on behalf of your organisation. We'll generate DKIM records that you need to add to your DNS provider."
msgstr "Aggiungi un dominio personalizzato per inviare email per conto della tua organizzazione. Genereremo record DKIM che devi aggiungere al tuo provider DNS."
@@ -961,6 +1033,10 @@ msgstr "Aggiungi i destinatari con cui creare il documento"
msgid "Add these DNS records to verify your domain ownership"
msgstr "Aggiungi questi record DNS per verificare la proprietà del tuo dominio"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Add this URL to your provider's allowed redirect URIs"
+msgstr ""
+
#: apps/remix/app/components/forms/branding-preferences-form.tsx
msgid "Additional brand information to display at the bottom of emails"
msgstr "Informazioni aggiuntive sul marchio da mostrare in fondo alle email"
@@ -1078,6 +1154,10 @@ msgstr "Consenti ai destinatari del documento di rispondere direttamente a quest
msgid "Allow signers to dictate next signer"
msgstr "Permetti ai firmatari di scegliere il prossimo firmatario"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Allowed Email Domains"
+msgstr ""
+
#: apps/remix/app/components/embed/authoring/configure-document-advanced-settings.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
@@ -1120,6 +1200,7 @@ msgstr "Verrà inviato un'email contenente un invito a ciascun membro."
msgid "An email with this address already exists."
msgstr "Una email con questo indirizzo esiste già."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
@@ -1139,6 +1220,7 @@ msgstr "Si è verificato un errore durante l'aggiunta dei campi."
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "An error occurred while adding signers."
msgstr "Si è verificato un errore durante l'aggiunta di firmatari."
@@ -1146,6 +1228,30 @@ msgstr "Si è verificato un errore durante l'aggiunta di firmatari."
msgid "An error occurred while adding the fields."
msgstr "Si è verificato un errore durante l'aggiunta dei campi."
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the document settings."
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the fields."
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the subject form."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template fields."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template placeholders."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template settings."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx
msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields."
msgstr "Si è verificato un errore durante la firma automatica del documento, alcuni campi potrebbero non essere firmati. Si prega di controllare e firmare manualmente eventuali campi rimanenti."
@@ -1224,6 +1330,10 @@ msgstr "Si è verificato un errore durante la rimozione della selezione."
msgid "An error occurred while removing the signature."
msgstr "Si è verificato un errore durante la rimozione della firma."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "An error occurred while resetting two factor authentication for the user."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "An error occurred while sending the document."
msgstr "Si è verificato un errore durante l'invio del documento."
@@ -1281,10 +1391,23 @@ msgstr "Si è verificato un errore durante l'aggiornamento del tuo profilo."
msgid "An error occurred while uploading your document."
msgstr "Si è verificato un errore durante il caricamento del tuo documento."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "An error occurred. Please try again later."
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "An organisation wants to create an account for you. Please review the details below."
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "An organisation wants to link your account. Please review the details below."
+msgstr ""
+
#: apps/remix/app/components/general/generic-error-layout.tsx
msgid "An unexpected error occurred."
msgstr "Si è verificato un errore inaspettato."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
#: apps/remix/app/components/general/app-command-menu.tsx
#: apps/remix/app/components/forms/team-update-form.tsx
@@ -1364,37 +1487,48 @@ msgstr "Token API"
msgid "App Version"
msgstr "Versione dell'app"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "Approve"
+msgstr ""
+
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table-action-dropdown.tsx
#: apps/remix/app/components/tables/documents-table-action-button.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document/document-page-view-button.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Approve"
msgstr "Approvare"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Approve Document"
msgstr "Approva Documento"
-#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Approved"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Approved"
msgstr "Approvato"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Approver"
-msgstr "Approvante"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Approvers"
-msgstr "Approvanti"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Approving"
-msgstr "Approvazione in corso"
+msgstr ""
#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Are you sure you want to complete the document? This action cannot be undone. Please ensure that you have completed prefilling all relevant fields before proceeding."
@@ -1428,6 +1562,7 @@ msgstr "Sei sicuro di voler eliminare questa organizzazione?"
msgid "Are you sure you wish to delete this team?"
msgstr "Sei sicuro di voler eliminare questo team?"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: apps/remix/app/components/dialogs/team-member-delete-dialog.tsx
@@ -1450,10 +1585,11 @@ msgid "Assigned Teams"
msgstr "Team Assegnati"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
msgid "Assist"
-msgstr "Assisti"
+msgstr ""
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Assist Document"
msgstr "Assisti il Documento"
@@ -1463,29 +1599,36 @@ msgid "Assist with signing"
msgstr "Assisti nella firma"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Assistant"
-msgstr "Assistente"
+msgstr ""
#: packages/ui/components/recipient/recipient-role-select.tsx
msgid "Assistant role is only available when the document is in sequential signing mode."
msgstr "Il ruolo di assistente è disponibile solo quando il documento è in modalità firma sequenziale."
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Assistants"
-msgstr "Assistenti"
+msgstr ""
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
msgid "Assistants and Copy roles are currently not compatible with the multi-sign experience."
msgstr "I ruoli Assistenti e Copia non sono attualmente compatibili con l'esperienza multi-firma."
-#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Assisted"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Assisted"
msgstr "Assistenza"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Assisting"
-msgstr "Assistenza in corso"
+msgstr ""
#: apps/remix/app/components/forms/document-preferences-form.tsx
#: packages/ui/primitives/template-flow/add-template-settings.types.tsx
@@ -1510,6 +1653,10 @@ msgstr "Registri di Audit"
msgid "Authentication Level"
msgstr "Livello di Autenticazione"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Authentication Portal Not Found"
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-auth-page.tsx
#: apps/remix/app/components/general/direct-template/direct-template-signing-auth-page.tsx
msgid "Authentication required"
@@ -1640,6 +1787,11 @@ msgstr "Invio Massivo via CSV"
msgid "by <0>{senderName}0>"
msgstr "da <0>{senderName}0>"
+#. placeholder {0}: organisation.name
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "By accepting this request, you grant {0} the following permissions:"
+msgstr ""
+
#: packages/email/templates/confirm-team-email.tsx
msgid "By accepting this request, you will be granting <0>{teamName}0> access to:"
msgstr "Accettando questa richiesta, concederai l'accesso a <0>{teamName}0> a:"
@@ -1672,6 +1824,7 @@ msgstr "Utilizzando la funzione di firma elettronica, acconsenti a effettuare tr
msgid "Can prepare"
msgstr "Può preparare"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
@@ -1763,19 +1916,27 @@ msgid "Cannot remove signer"
msgstr "Impossibile rimuovere il firmatario"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Cc"
-msgstr "Cc"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
-#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
msgid "CC"
-msgstr "CC"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
+msgid "CC"
+msgstr ""
+
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
msgid "CC'd"
-msgstr "CC'd"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Ccers"
msgstr ""
@@ -1872,10 +2033,27 @@ msgstr "Clicca per copiare il link di firma da inviare al destinatario"
msgid "Click to insert field"
msgstr "Clicca per inserire il campo"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client ID"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client ID is required"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client Secret"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client secret is required"
+msgstr ""
+
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-passkey.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-2fa.tsx
#: apps/remix/app/components/general/document/document-recipient-link-copy-dialog.tsx
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
#: apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
@@ -1902,6 +2080,8 @@ msgstr "Confronta tutti i piani e le caratteristiche in dettaglio"
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/forms/signup.tsx
#: apps/remix/app/components/embed/embed-document-signing-page.tsx
+#: apps/remix/app/components/embed/embed-document-signing-page.tsx
+#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
msgid "Complete"
@@ -1923,9 +2103,9 @@ msgstr "Completa Documento"
msgid "Complete Signing"
msgstr "Completa la Firma"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-msgid "Complete the fields for the following signers. Once reviewed, they will inform you if any modifications are needed."
-msgstr "Completa i campi per i seguenti firmatari. Una volta esaminati, ti informeranno se sono necessarie modifiche."
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
+msgid "Complete the fields for the following signers."
+msgstr ""
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
@@ -2045,6 +2225,7 @@ msgstr "Conferma eliminazione"
msgid "Confirm email"
msgstr "Conferma email"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/send-confirmation-email.tsx
msgid "Confirmation email sent"
msgstr "Email di conferma inviato"
@@ -2061,6 +2242,10 @@ msgstr "Informazioni di contatto"
msgid "Contact sales here"
msgstr "Contatta le vendite qui"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Contact us"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
msgid "Content"
msgstr "Contenuto"
@@ -2141,6 +2326,8 @@ msgstr "Controlla quali firme sono consentite per firmare un documento."
msgid "Copied"
msgstr "Copiato"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/components/tables/settings-public-profile-templates-table.tsx
#: apps/remix/app/components/general/avatar-with-recipient.tsx
#: apps/remix/app/components/general/template/template-direct-link-badge.tsx
@@ -2182,6 +2369,11 @@ msgstr "Copia link di firma"
msgid "Copy token"
msgstr "Copia il token"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "couldn't be uploaded:"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
@@ -2208,6 +2400,10 @@ msgstr "Crea un nuovo indirizzo email per la tua organizzazione utilizzando il d
msgid "Create a new organisation with {planName} plan. Keep your current organisation on it's current plan"
msgstr "Crea una nuova organizzazione con il piano {planName}. Mantieni la tua organizzazione attuale sul suo piano attuale"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Create a support ticket"
+msgstr ""
+
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Create a team to collaborate with your team members."
msgstr "Crea un team per collaborare con i membri del tuo team."
@@ -2466,6 +2662,7 @@ msgstr "Data di creazione"
msgid "Date Format"
msgstr "Formato data"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/general/organisations/organisation-invitations.tsx
#: packages/email/templates/organisation-invite.tsx
msgid "Decline"
@@ -2491,6 +2688,10 @@ msgstr "Email Predefinita"
msgid "Default Email Settings"
msgstr "Impostazioni Email Predefinite"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Default Organisation Role for New Users"
+msgstr ""
+
#: apps/remix/app/components/forms/document-preferences-form.tsx
msgid "Default Signature Settings"
msgstr "Impostazioni predefinite della firma"
@@ -2752,6 +2953,10 @@ msgstr "Disabilitare la firma del collegamento diretto impedirà a chiunque di a
msgid "Disabling the user results in the user not being able to use the account. It also disables all the related contents such as subscription, webhooks, teams, and API keys."
msgstr "Disabilitare l'utente porta all'impossibilità per l'utente di usare l'account. Disabilita anche tutti i contenuti correlati come abbonamento, webhook, team e chiavi API."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Discord"
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "Display Name"
@@ -2820,8 +3025,9 @@ msgid "Document access"
msgstr "Accesso al documento"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document access auth updated"
-msgstr "Autenticazione di accesso al documento aggiornata"
+msgstr ""
#: apps/remix/app/components/general/document/document-status.tsx
msgid "Document All"
@@ -2837,9 +3043,13 @@ msgstr "Documento Approvato"
msgid "Document Cancelled"
msgstr "Documento Annullato"
+#: packages/lib/utils/document-audit-logs.ts
+#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document completed"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-status.tsx
-#: packages/lib/utils/document-audit-logs.ts
-#: packages/lib/utils/document-audit-logs.ts
msgid "Document completed"
msgstr "Documento completato"
@@ -2852,8 +3062,12 @@ msgstr "Email documento completato"
msgid "Document Completed!"
msgstr "Documento completato!"
-#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document created"
+msgstr ""
+
+#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "Document created"
msgstr "Documento creato"
@@ -2879,10 +3093,14 @@ msgstr "Documento creato usando un <0>link diretto0>"
msgid "Document Creation"
msgstr "Creazione del documento"
+#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document deleted"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
#: apps/remix/app/components/dialogs/admin-document-delete-dialog.tsx
-#: packages/lib/utils/document-audit-logs.ts
msgid "Document deleted"
msgstr "Documento eliminato"
@@ -2908,8 +3126,9 @@ msgid "Document Duplicated"
msgstr "Documento Duplicato"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document external ID updated"
-msgstr "ID esterno del documento aggiornato"
+msgstr ""
#: apps/remix/app/components/general/document/document-certificate-qr-view.tsx
msgid "Document found in your account"
@@ -2945,16 +3164,18 @@ msgid "Document moved"
msgstr "Documento spostato"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document moved to team"
-msgstr "Documento spostato al team"
+msgstr ""
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
msgid "Document no longer available to sign"
msgstr "Documento non più disponibile per la firma"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document opened"
-msgstr "Documento aperto"
+msgstr ""
#: apps/remix/app/components/general/document/document-status.tsx
msgid "Document pending"
@@ -2993,8 +3214,12 @@ msgstr "Documento Rifiutato"
msgid "Document resealed"
msgstr "Documento risigillato"
-#: apps/remix/app/components/general/document/document-edit-form.tsx
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document sent"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "Document sent"
msgstr "Documento inviato"
@@ -3003,8 +3228,9 @@ msgid "Document Signed"
msgstr "Documento firmato"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document signing auth updated"
-msgstr "Autenticazione firma documento aggiornata"
+msgstr ""
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document signing process will be cancelled"
@@ -3019,12 +3245,14 @@ msgid "Document title"
msgstr "Titolo del documento"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document title updated"
-msgstr "Titolo documento aggiornato"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document updated"
-msgstr "Documento aggiornato"
+msgstr ""
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
msgid "Document updated successfully"
@@ -3040,21 +3268,27 @@ msgid "Document uploaded"
msgstr "Documento caricato"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document viewed"
-msgstr "Documento visualizzato"
+msgstr ""
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
msgid "Document Viewed"
msgstr "Documento visualizzato"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document visibility updated"
-msgstr "Visibilità del documento aggiornata"
+msgstr ""
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document will be permanently deleted"
msgstr "Il documento sarà eliminato definitivamente"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Documentation"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx
@@ -3165,6 +3399,11 @@ msgid "Drag and drop your PDF file here"
msgstr "Trascina qui il tuo file PDF"
#: packages/lib/constants/document.ts
+msgctxt "Draw signatute type"
+msgid "Draw"
+msgstr ""
+
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Draw"
msgstr "Disegno"
@@ -3411,6 +3650,10 @@ msgstr "Abilita la firma di link diretto"
msgid "Enable signing order"
msgstr "Abilita ordine di firma"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Enable SSO portal"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
@@ -3475,13 +3718,18 @@ msgstr "Impresa"
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
#: apps/remix/app/components/general/verify-email-banner.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
@@ -3510,6 +3758,10 @@ msgstr "Impresa"
#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
@@ -3521,6 +3773,7 @@ msgstr "Impresa"
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -3579,6 +3832,10 @@ msgstr "Creazione cartella fallita"
msgid "Failed to create subscription claim."
msgstr "Creazione della richiesta di abbonamento non riuscita."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Failed to create support ticket"
+msgstr ""
+
#: apps/remix/app/components/dialogs/folder-delete-dialog.tsx
msgid "Failed to delete folder"
msgstr "Impossibile eliminare la cartella"
@@ -3611,6 +3868,10 @@ msgstr "Impossibile salvare le impostazioni."
msgid "Failed to sign out all sessions"
msgstr "Non è stato possibile disconnettere tutte le sessioni"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Failed to unlink account"
+msgstr ""
+
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
msgid "Failed to update document"
msgstr "Aggiornamento documento fallito"
@@ -3669,16 +3930,19 @@ msgid "Field placeholder"
msgstr "Segnaposto del campo"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field prefilled by assistant"
-msgstr "Campo precompilato dall'assistente"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field signed"
-msgstr "Campo firmato"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field unsigned"
-msgstr "Campo non firmato"
+msgstr ""
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
msgid "Fields"
@@ -3688,13 +3952,21 @@ msgstr "Campi"
msgid "Fields updated"
msgstr "Campi aggiornati"
-#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-upload.tsx
-#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "Il file non può essere più grande di {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "File is too small"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB"
msgstr "La dimensione del file supera il limite di {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB"
@@ -3810,6 +4082,7 @@ msgstr "Genera link"
msgid "Global recipient action authentication"
msgstr "Autenticazione globale del destinatario"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
@@ -4000,6 +4273,10 @@ msgstr "Home (Nessuna Cartella)"
msgid "Horizontal"
msgstr "Orizzontale"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "I agree to link my account with this organization"
+msgstr ""
+
#: packages/lib/constants/recipient-roles.ts
msgid "I am a signer of this document"
msgstr "Sono un firmatario di questo documento"
@@ -4024,6 +4301,10 @@ msgstr "Sono tenuto a ricevere una copia di questo documento"
msgid "I am the owner of this document"
msgstr "Sono il proprietario di questo documento"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "I understand that I am providing my credentials to a 3rd party service configured by this organisation"
+msgstr ""
+
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx
#: apps/remix/app/components/dialogs/token-delete-dialog.tsx
msgid "I'm sure! Delete it"
@@ -4053,6 +4334,10 @@ msgstr "Se non trovi il link di conferma nella tua casella di posta, puoi richie
msgid "If your authenticator app does not support QR codes, you can use the following code instead:"
msgstr "Se la tua app autenticatrice non supporta i codici QR, puoi usare il seguente codice:"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Important: What This Means"
+msgstr ""
+
#: apps/remix/app/components/general/app-nav-mobile.tsx
#: apps/remix/app/components/general/app-nav-mobile.tsx
#: apps/remix/app/components/general/document/document-status.tsx
@@ -4120,6 +4405,10 @@ msgstr "Statistiche istanze"
msgid "Invalid code. Please try again."
msgstr "Codice non valido. Riprova."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Invalid domains"
+msgstr ""
+
#: packages/ui/primitives/document-flow/add-signers.types.ts
msgid "Invalid email"
msgstr "Email non valida"
@@ -4133,6 +4422,10 @@ msgstr "Link non valido"
msgid "Invalid token"
msgstr "Token non valido"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Invalid Token"
+msgstr ""
+
#: apps/remix/app/components/forms/reset-password.tsx
msgid "Invalid token provided. Please try again."
msgstr "Token non valido fornito. Per favore riprova."
@@ -4192,6 +4485,10 @@ msgstr "Fattura"
msgid "IP Address"
msgstr "Indirizzo IP"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Issuer URL"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "It is crucial to keep your contact information, especially your email address, up to date with us. Please notify us immediately of any changes to ensure that you continue to receive all necessary communications."
msgstr "È fondamentale mantenere aggiornate le tue informazioni di contatto, in particolare il tuo indirizzo email. Ti preghiamo di notificarci immediatamente qualsiasi modifica per assicurarti di continuare a ricevere tutte le comunicazioni necessarie."
@@ -4225,6 +4522,10 @@ msgstr "Al momento, non è il tuo turno di firmare. Riceverai un'email con le is
msgid "Join {organisationName} on Documenso"
msgstr "Unisciti a {organisationName} su Documenso"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Join our community on <0>Discord0> for community support and discussion."
+msgstr ""
+
#. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' })
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "Joined {0}"
@@ -4319,10 +4620,27 @@ msgstr "Ti piacerebbe avere il tuo profilo pubblico con accordi?"
msgid "Link expires in 1 hour."
msgstr "Il link scade tra 1 ora."
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Link expires in 30 minutes."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.public-profile.tsx
msgid "Link template"
msgstr "Collega modello"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Link your Documenso account"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "Linked Accounts"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Linked At"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "Links Generated"
msgstr "Link Generati"
@@ -4347,6 +4665,10 @@ msgstr "Caricamento del documento..."
msgid "Loading Document..."
msgstr "Caricamento Documento..."
+#: packages/ui/components/recipient/recipient-autocomplete-input.tsx
+msgid "Loading suggestions..."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-page-view-recent-activity.tsx
msgid "Loading..."
msgstr "Caricamento in corso..."
@@ -4372,6 +4694,10 @@ msgstr "Gestisci"
msgid "Manage {0}'s profile"
msgstr "Gestisci il profilo di {0}"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Manage a custom SSO login portal for your organisation."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/organisations.tsx
msgid "Manage all organisations you are currently associated with."
msgstr "Gestisci tutte le organizzazioni con cui sei attualmente associato."
@@ -4404,6 +4730,10 @@ msgstr "Gestisci Link Diretto"
msgid "Manage documents"
msgstr "Gestisci documenti"
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "Manage linked accounts"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "Manage organisation"
msgstr "Gestisci l'organizzazione"
@@ -4539,6 +4869,10 @@ msgstr "Membro"
msgid "Member Count"
msgstr "Conteggio membri"
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "Member promoted to owner successfully"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-members-table.tsx
msgid "Member Since"
msgstr "Membro dal"
@@ -4554,6 +4888,7 @@ msgstr "Membro dal"
msgid "Members"
msgstr "Membri"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Message"
@@ -4789,6 +5124,10 @@ msgstr "Nessun campo di firma trovato"
msgid "No Stripe customer attached"
msgstr "Nessun cliente Stripe collegato"
+#: packages/ui/components/recipient/recipient-autocomplete-input.tsx
+msgid "No suggestions found"
+msgstr ""
+
#: apps/remix/app/components/tables/team-groups-table.tsx
msgid "No team groups found"
msgstr "Nessun gruppo di team trovato"
@@ -4919,6 +5258,16 @@ msgstr "Solo gli amministratori possono accedere e visualizzare il documento"
msgid "Only managers and above can access and view the document"
msgstr "Solo i manager e superiori possono accedere e visualizzare il documento"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Only one file can be uploaded at a time"
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Only PDF files are allowed"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/general/generic-error-layout.tsx
#: apps/remix/app/components/general/generic-error-layout.tsx
@@ -4934,10 +5283,15 @@ msgstr "Aperto"
msgid "Or"
msgstr "Oppure"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "OR"
+msgstr ""
+
#: apps/remix/app/components/forms/signin.tsx
msgid "Or continue with"
msgstr "Oppure continua con"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/tables/user-organisations-table.tsx
#: apps/remix/app/components/tables/admin-organisations-table.tsx
msgid "Organisation"
@@ -4947,6 +5301,10 @@ msgstr "Organizzazione"
msgid "Organisation Admin"
msgstr "Amministratore dell'organizzazione"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Organisation authentication portal URL"
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-organisation-create-dialog.tsx
msgid "Organisation created"
msgstr "Organizzazione creata"
@@ -5017,6 +5375,10 @@ msgstr "Impostazioni dell'organizzazione"
msgid "Organisation Settings"
msgstr "Impostazioni dell'organizzazione"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Organisation SSO Portal"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "Organisation Teams"
msgstr "Team dell'organizzazione"
@@ -5309,9 +5671,13 @@ msgstr "Si prega di inserire un nome significativo per il proprio token. Questo
msgid "Please enter a valid name."
msgstr "Per favore inserisci un nome valido."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-msgid "Please mark as viewed to complete"
-msgstr "Si prega di segnare come visualizzato per completare"
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
+msgid "Please mark as viewed to complete."
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Please note that anyone who signs in through your portal will be added to your organisation as a member."
+msgstr ""
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid "Please note that proceeding will remove direct linking recipient and turn it into a placeholder."
@@ -5349,11 +5715,11 @@ msgstr "Si prega di fornire un token dal tuo autenticatore, o un codice di backu
msgid "Please provide a token from your authenticator, or a backup code."
msgstr "Si prega di fornire un token dal tuo autenticatore, o un codice di backup."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
msgid "Please review the document before approving."
msgstr "Per favore, esamina il documento prima di approvarlo."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
msgid "Please review the document before signing."
msgstr "Rivedi il documento prima di firmare."
@@ -5449,6 +5815,18 @@ msgstr "Profilo aggiornato"
msgid "Progress"
msgstr "Progresso"
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "Promote to owner"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Provider"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Provider has been updated successfully"
+msgstr ""
+
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/general/template/template-type.tsx
msgid "Public"
@@ -5485,6 +5863,10 @@ msgstr "Valori radio"
msgid "Read only"
msgstr "Sola lettura"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Read our documentation to get started with Documenso."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-disclosure.tsx
msgid "Read the full <0>signature disclosure0>."
msgstr "Leggi l'intera <0>divulgazione della firma0>."
@@ -5601,6 +5983,10 @@ msgstr "Codici di recupero"
msgid "Red"
msgstr "Rosso"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Redirect URI"
+msgstr ""
+
#: apps/remix/app/components/embed/authoring/configure-document-advanced-settings.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
@@ -5714,6 +6100,10 @@ msgstr "Rispondi all'email"
msgid "Reply To Email"
msgstr "Rispondi a Email"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Requesting Organisation"
+msgstr ""
+
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx
@@ -5722,6 +6112,10 @@ msgstr "Rispondi a Email"
msgid "Required field"
msgstr "Campo richiesto"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Required scopes"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
msgid "Reseal document"
msgstr "Risigilla documento"
@@ -5746,6 +6140,11 @@ msgstr "Reinvia verifica"
msgid "Reset"
msgstr "Ripristina"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset 2FA"
+msgstr ""
+
#: apps/remix/app/components/forms/forgot-password.tsx
msgid "Reset email sent"
msgstr "Email di reset inviato"
@@ -5757,6 +6156,14 @@ msgstr "Email di reset inviato"
msgid "Reset Password"
msgstr "Reimposta password"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset the users two factor authentication. This action is irreversible and will disable two factor authentication for the user."
+msgstr ""
+
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset Two Factor Authentication"
+msgstr ""
+
#: apps/remix/app/components/forms/reset-password.tsx
msgid "Resetting Password..."
msgstr "Reimpostazione della password..."
@@ -5788,9 +6195,14 @@ msgstr "Riprova"
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
msgid "Return"
msgstr "Ritorna"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Return to Documenso sign in page here"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
msgid "Return to Home"
msgstr "Torna alla home"
@@ -5800,6 +6212,10 @@ msgstr "Torna alla home"
msgid "Return to sign in"
msgstr "Torna a accedere"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Review request"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
msgid "Revoke"
@@ -5974,6 +6390,10 @@ msgstr "Seleziona i metodi di autenticazione"
msgid "Select default option"
msgstr "Seleziona opzione predefinita"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Select default role"
+msgstr ""
+
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx
msgid "Select direction"
msgstr "Seleziona la direzione"
@@ -6189,6 +6609,11 @@ msgstr "Mostra impostazioni avanzate"
msgid "Show templates in your public profile for your audience to sign and get started quickly"
msgstr "Mostra modelli nel tuo profilo pubblico per il tuo pubblico da firmare e iniziare rapidamente"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "Sign"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table-action-dropdown.tsx
@@ -6202,7 +6627,6 @@ msgstr "Mostra modelli nel tuo profilo pubblico per il tuo pubblico da firmare e
#: apps/remix/app/components/general/document-signing/document-signing-auth-password.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-2fa.tsx
#: apps/remix/app/components/general/document/document-page-view-button.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Sign"
msgstr "Firma"
@@ -6224,7 +6648,7 @@ msgstr "Firma come<0>{0} <1>({1})1>0>"
msgid "Sign document"
msgstr "Firma il documento"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Sign Document"
msgstr "Firma documento"
@@ -6242,6 +6666,7 @@ msgstr "Campo di firma"
msgid "Sign Here"
msgstr "Firma qui"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: packages/email/template-components/template-reset-password.tsx
@@ -6249,6 +6674,7 @@ msgid "Sign In"
msgstr "Accedi"
#: apps/remix/app/routes/_unauthenticated+/signin.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
msgid "Sign in to your account"
msgstr "Accedi al tuo account"
@@ -6316,32 +6742,35 @@ msgstr "Firme raccolte"
msgid "Signatures will appear once the document has been completed"
msgstr "Le firme appariranno una volta completato il documento"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Signed"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/ui/components/document/document-read-only-fields.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Signed"
msgstr "Firmato"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Signer"
-msgstr "Firmatario"
+msgstr ""
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Signer Events"
msgstr "Eventi del Firmatario"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Signers"
-msgstr "Firmatari"
-
-#: packages/ui/primitives/document-flow/add-signers.types.ts
-msgid "Signers must have unique emails"
-msgstr "I firmatari devono avere email uniche"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Signing"
-msgstr "Firma"
+msgstr ""
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Signing Certificate"
@@ -6512,6 +6941,14 @@ msgstr "Siamo spiacenti, non siamo riusciti a scaricare il certificato. Riprova
msgid "Source"
msgstr "Fonte"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Space-separated list of domains. Leave empty to allow all domains."
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
+msgid "SSO"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
msgid "Stats"
msgstr "Statistiche"
@@ -6543,6 +6980,7 @@ msgstr "Cliente Stripe creato con successo"
msgid "Stripe Customer ID"
msgstr "ID cliente di Stripe"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Subject"
msgstr "Soggetto"
@@ -6552,6 +6990,10 @@ msgstr "Soggetto"
msgid "Subject <0>(Optional)0>"
msgstr "Oggetto <0>(Opzionale)0>"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Submit"
+msgstr ""
+
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx
@@ -6585,10 +7027,12 @@ msgstr "Abbonamento non valido"
#: apps/remix/app/routes/embed+/v1+/authoring+/template.edit.$id.tsx
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
@@ -6646,6 +7090,15 @@ msgstr "Creati con successo: {successCount}"
msgid "Summary:"
msgstr "Sommario:"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+#: apps/remix/app/components/general/org-menu-switcher.tsx
+msgid "Support"
+msgstr ""
+
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Support ticket created"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
msgid "Sync"
msgstr "Sincronizza"
@@ -7009,9 +7462,11 @@ msgid "The email address which will show up in the \"Reply To\" field in emails"
msgstr "L'indirizzo email che verrà visualizzato nel campo \"Rispondi a\" nelle email"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
-msgid "The email domain you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The email domain you are looking for may have been removed, renamed or may have never\n"
" existed."
-msgstr "Il dominio email che stai cercando potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
+msgstr ""
+"Il dominio email che stai cercando potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
"esistito."
#: apps/remix/app/components/forms/signin.tsx
@@ -7051,14 +7506,24 @@ msgstr "Si sono verificati i seguenti errori:"
msgid "The following team has been deleted. You will no longer be able to access this team and its documents"
msgstr "Il seguente team è stato eliminato. Non potrai più accedere a questo team e ai suoi documenti"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "The OpenID discovery endpoint URL for your provider"
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "The organisation authentication portal does not exist, or is not configured"
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "The organisation email has been created successfully."
msgstr "L'email dell'organizzazione è stata creata con successo."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
-msgid "The organisation group you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation group you are looking for may have been removed, renamed or may have never\n"
" existed."
-msgstr "Il gruppo organizzativo che cerchi potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
+msgstr ""
+"Il gruppo organizzativo che cerchi potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
" esistito."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
@@ -7066,15 +7531,19 @@ msgid "The organisation role that will be applied to all members in this group."
msgstr "Il ruolo organizzativo che verrà applicato a tutti i membri in questo gruppo."
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
-msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
-msgstr "L'organizzazione che cerchi potrebbe essere stata rimossa, rinominata o potrebbe non essere mai\n"
+msgstr ""
+"L'organizzazione che cerchi potrebbe essere stata rimossa, rinominata o potrebbe non essere mai\n"
" esistita."
#: apps/remix/app/routes/_authenticated+/_layout.tsx
-msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
-msgstr "L'organizzazione che cerchi potrebbe essere stata rimossa, rinominata o potrebbe non essere mai\n"
+msgstr ""
+"L'organizzazione che cerchi potrebbe essere stata rimossa, rinominata o potrebbe non essere mai\n"
" esistita."
#: apps/remix/app/components/general/generic-error-layout.tsx
@@ -7162,15 +7631,19 @@ msgid "The team email <0>{teamEmail}0> has been removed from the following tea
msgstr "L'email del team <0>{teamEmail}0> è stata rimossa dal seguente team"
#: apps/remix/app/routes/_authenticated+/_layout.tsx
-msgid "The team you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The team you are looking for may have been removed, renamed or may have never\n"
" existed."
-msgstr "Il team che cerchi potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
+msgstr ""
+"Il team che cerchi potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
" esistito."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
-msgid "The team you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The team you are looking for may have been removed, renamed or may have never\n"
" existed."
-msgstr "La squadra che stai cercando potrebbe essere stata rimossa, rinominata o potrebbe non essere mai\n"
+msgstr ""
+"La squadra che stai cercando potrebbe essere stata rimossa, rinominata o potrebbe non essere mai\n"
" esistita."
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
@@ -7185,6 +7658,10 @@ msgstr "Il modello sarà rimosso dal tuo profilo"
msgid "The test webhook has been successfully sent to your endpoint."
msgstr "Il test del webhook è stato inviato con successo al tuo endpoint."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "The token is invalid or has expired."
+msgstr ""
+
#: apps/remix/app/components/forms/token.tsx
msgid "The token was copied to your clipboard."
msgstr "Il token è stato copiato negli appunti."
@@ -7211,11 +7688,17 @@ msgid "The URL for Documenso to send webhook events to."
msgstr "L'URL per Documenso per inviare eventi webhook."
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
-msgid "The user you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The user you are looking for may have been removed, renamed or may have never\n"
" existed."
-msgstr "L'utente che cerchi potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
+msgstr ""
+"L'utente che cerchi potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
" esistito."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "The user's two factor authentication has been reset successfully."
+msgstr ""
+
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx
msgid "The webhook has been successfully deleted."
msgstr "Il webhook è stato eliminato con successo."
@@ -7229,9 +7712,11 @@ msgid "The webhook was successfully created."
msgstr "Il webhook è stato creato con successo."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
-msgid "The webhook you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The webhook you are looking for may have been removed, renamed or may have never\n"
" existed."
-msgstr "Il webhook che stai cercando potrebbe essere stato rimosso, rinominato o potrebbe non\n"
+msgstr ""
+"Il webhook che stai cercando potrebbe essere stato rimosso, rinominato o potrebbe non\n"
"esistito mai."
#: apps/remix/app/components/tables/documents-table-empty-state.tsx
@@ -7266,6 +7751,10 @@ msgstr "Questo account è stato disabilitato. Contatta il supporto."
msgid "This account has not been verified. Please verify your account before signing in."
msgstr "Questo account non è stato verificato. Verifica il tuo account prima di accedere."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "This action is irreversible. Please ensure you have informed the user before proceeding."
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
#: apps/remix/app/components/dialogs/admin-document-delete-dialog.tsx
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
@@ -7384,10 +7873,22 @@ msgstr "È così che il documento raggiungerà i destinatari una volta pronto pe
msgid "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
msgstr "Questo è il reclamo con cui questa organizzazione è stata inizialmente creata. Qualunque cambiamento agli indicatori delle funzionalità di questo reclamo sarà retroportato in questa organizzazione."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "This is the required scopes you must set in your provider's settings"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "This is the URL which users will use to sign in to your organisation."
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
msgid "This link is invalid or has expired. Please contact your team to resend a verification."
msgstr "Questo link è invalido o è scaduto. Si prega di contattare il tuo team per inviare nuovamente una verifica."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "This organisation will have administrative control over your account. You can revoke this access later, but they will retain access to any data they've already collected."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.general.tsx
msgid "This organisation, and any associated data will be permanently deleted."
msgstr "Questa organizzazione e tutti i dati associati saranno cancellati in modo permanente."
@@ -7507,9 +8008,10 @@ msgstr "Per poter aggiungere membri a un team, devi prima aggiungerli all'organi
msgid "To change the email you must remove and add a new email address."
msgstr "Per cambiare la email devi rimuovere e aggiungere un nuovo indirizzo email."
+#. placeholder {0}: user.email
#. placeholder {0}: userToEnable.email
#. placeholder {0}: userToDisable.email
-#. placeholder {0}: user.email
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -7525,6 +8027,7 @@ msgid "To enable two-factor authentication, scan the following QR code using you
msgstr "Per abilitare l'autenticazione a due fattori, scansiona il seguente codice QR utilizzando la tua app di autenticazione."
#: apps/remix/app/routes/_unauthenticated+/unverified-account.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
msgid "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
msgstr "Per accedere al tuo account, conferma il tuo indirizzo email facendo clic sul link di conferma dalla tua casella di posta."
@@ -7641,9 +8144,14 @@ msgstr "L'autenticazione a due fattori è stata disattivata per il tuo account.
msgid "Two-Factor Re-Authentication"
msgstr "Ri-autenticazione a due fattori"
+#: packages/lib/constants/document.ts
+msgctxt "Type signatute type"
+msgid "Type"
+msgstr ""
+
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
-#: packages/lib/constants/document.ts
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Type"
msgstr "Tipo"
@@ -7757,9 +8265,15 @@ msgstr "Incompleto"
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
msgid "Unknown"
msgstr "Sconosciuto"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Unknown error"
+msgstr ""
+
#: apps/remix/app/components/tables/admin-claims-table.tsx
msgid "Unlimited"
msgstr "Illimitato"
@@ -7768,6 +8282,11 @@ msgstr "Illimitato"
msgid "Unlimited documents, API and more"
msgstr "Documenti illimitati, API e altro"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Unlink"
+msgstr ""
+
#: apps/remix/app/components/general/folder/folder-card.tsx
msgid "Unpin"
msgstr "Rimuovi"
@@ -7776,6 +8295,7 @@ msgstr "Rimuovi"
msgid "Untitled Group"
msgstr "Gruppo senza nome"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
@@ -7915,6 +8435,11 @@ msgid "Upgrade your plan to upload more documents"
msgstr "Aggiorna il tuo piano per caricare più documenti"
#: packages/lib/constants/document.ts
+msgctxt "Upload signatute type"
+msgid "Upload"
+msgstr ""
+
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Upload"
msgstr "Carica"
@@ -7948,6 +8473,11 @@ msgstr "Carica documento personalizzato"
msgid "Upload Document"
msgstr "Carica documento"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Upload failed"
+msgstr ""
+
#: packages/ui/primitives/signature-pad/signature-pad-upload.tsx
msgid "Upload Signature"
msgstr "Carica Firma"
@@ -8029,6 +8559,7 @@ msgstr "L'utente non ha password."
msgid "User not found"
msgstr "Utente non trovato"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -8102,6 +8633,11 @@ msgstr "Verifica il tuo indirizzo email del team"
msgid "Vertical"
msgstr "Verticale"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "View"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
@@ -8111,7 +8647,6 @@ msgstr "Verticale"
#: apps/remix/app/components/general/document/document-page-view-button.tsx
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "View"
msgstr "Visualizza"
@@ -8144,6 +8679,11 @@ msgstr "Visualizza tutte le attività di sicurezza relative al tuo account."
msgid "View and manage all active sessions for your account."
msgstr "Visualizza e gestisci tutte le sessioni attive per il tuo account."
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "View and manage all login methods linked to your account."
+msgstr ""
+
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
msgid "View Codes"
msgstr "Visualizza Codici"
@@ -8156,7 +8696,7 @@ msgstr "Visualizza Record DNS"
msgid "View document"
msgstr "Visualizza documento"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
@@ -8206,24 +8746,31 @@ msgstr "Visualizza squadre"
msgid "View the DNS records for this email domain"
msgstr "Visualizza i record DNS per questo dominio email"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Viewed"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Viewed"
msgstr "Visualizzato"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Viewer"
-msgstr "Visualizzatore"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Viewers"
-msgstr "Visualizzatori"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Viewing"
-msgstr "Visualizzazione"
+msgstr ""
#: apps/remix/app/components/dialogs/folder-update-dialog.tsx
msgid "Visibility"
@@ -8284,6 +8831,10 @@ msgstr "Non siamo in grado di aggiornare questa chiave d'accesso al momento. Per
msgid "We couldn't create a Stripe customer. Please try again."
msgstr "Non siamo riusciti a creare un cliente di Stripe. Si prega di riprovare."
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "We couldn't promote the member to owner. Please try again."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "We couldn't update the group. Please try again."
msgstr "Non siamo riusciti ad aggiornare il gruppo. Si prega di riprovare."
@@ -8293,6 +8844,10 @@ msgstr "Non siamo riusciti ad aggiornare il gruppo. Si prega di riprovare."
msgid "We couldn't update the organisation. Please try again."
msgstr "Non siamo riusciti ad aggiornare l'organizzazione. Si prega di riprovare."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "We couldn't update the provider. Please try again."
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "We encountered an error while creating the email. Please try again later."
msgstr "Abbiamo riscontrato un errore durante la creazione dell'email. Riprovare più tardi."
@@ -8401,6 +8956,7 @@ msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di reimpo
msgid "We encountered an unknown error while attempting to revoke access. Please try again or contact support."
msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di revocare l'accesso. Si prega di riprovare o contattare il supporto."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/signin.tsx
msgid "We encountered an unknown error while attempting to sign you In. Please try again later."
@@ -8536,6 +9092,10 @@ msgstr "Genereremo link di firma per te, che potrai inviare ai destinatari trami
msgid "We won't send anything to notify recipients."
msgstr "Non invieremo nulla per notificare i destinatari."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "We'll get back to you as soon as possible via email."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates._index.tsx
#: apps/remix/app/components/tables/documents-table-empty-state.tsx
msgid "We're all empty"
@@ -8593,10 +9153,18 @@ msgstr "Bentornato, siamo fortunati ad averti."
msgid "Welcome back! Here's an overview of your account."
msgstr "Bentornato! Ecco una panoramica del tuo account."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Welcome to {organisationName}"
+msgstr ""
+
#: packages/email/template-components/template-confirmation-email.tsx
msgid "Welcome to Documenso!"
msgstr "Benvenuto su Documenso!"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Well-known URL is required"
+msgstr ""
+
#: apps/remix/app/routes/_recipient+/sign.$token+/waiting.tsx
msgid "Were you trying to edit this document instead?"
msgstr "Stavi provando a modificare questo documento invece?"
@@ -8623,6 +9191,10 @@ msgstr "Quando firmi un documento, possiamo automaticamente compilare e firmare
msgid "When you use our platform to affix your electronic signature to documents, you are consenting to do so under the Electronic Signatures in Global and National Commerce Act (E-Sign Act) and other applicable laws. This action indicates your agreement to use electronic means to sign documents and receive notifications."
msgstr "Quando utilizzi la nostra piattaforma per apporre la tua firma elettronica sui documenti, acconsenti a farlo ai sensi della Legge sulle firme elettroniche nel commercio globale e nazionale (E-Sign Act) e altre leggi applicabili. Questa azione indica il tuo consenso a utilizzare mezzi elettronici per firmare documenti e ricevere notifiche."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Whether to enable the SSO portal for your organisation"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
msgid "While waiting for them to do so you can create your own Documenso account and get started with document signing right away."
msgstr "Mentre aspetti che lo facciano, puoi creare il tuo account Documenso e iniziare a firmare documenti subito."
@@ -8690,6 +9262,10 @@ msgstr "Stai per lasciare l'organizzazione seguente."
msgid "You are about to remove default access to this team for all organisation members. Any members not explicitly added to this team will no longer have access."
msgstr "Stai per rimuovere l'accesso predefinito a questo team per tutti i membri dell'organizzazione. Qualsiasi membro non esplicitamente aggiunto a questo team non avrà più accesso."
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "You are about to remove the <0>{provider}0> login method from your account."
+msgstr ""
+
#. placeholder {0}: organisation.name
#: apps/remix/app/components/dialogs/organisation-email-domain-delete-dialog.tsx
msgid "You are about to remove the email domain <0>{emailDomain}0> from <1>{0}1>. All emails associated with this domain will be deleted."
@@ -8776,6 +9352,10 @@ msgstr "Non sei autorizzato a disabilitare questo utente."
msgid "You are not authorized to enable this user."
msgstr "Non sei autorizzato ad abilitare questo utente."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "You are not authorized to reset two factor authentcation for this user."
+msgstr ""
+
#: packages/email/template-components/template-confirmation-email.tsx
msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)"
msgstr "Puoi anche copiare e incollare questo link nel tuo browser: {confirmationLink} (il link scade tra 1 ora)"
@@ -9066,6 +9646,10 @@ msgstr "Ora ti verrà richiesto di inserire un codice dalla tua app di autentica
msgid "You will receive an Email copy of the signed document once everyone has signed."
msgstr "Riceverai una copia del documento firmato via email una volta che tutti hanno firmato."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Your Account"
+msgstr ""
+
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
msgid "Your account has been deleted successfully."
msgstr "Il tuo account è stato eliminato con successo."
@@ -9099,6 +9683,10 @@ msgstr "La tua operazione di invio massivo per il modello \"{templateName}\" è
msgid "Your current {currentProductName} plan is past due. Please update your payment information."
msgstr "Il tuo attuale piano {currentProductName} è scaduto. Si prega di aggiornare le informazioni di pagamento."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Your current plan includes the following support channels:"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.billing.tsx
msgid "Your current plan is inactive."
msgstr "Il tuo attuale piano è inattivo."
@@ -9112,7 +9700,6 @@ msgid "Your direct signing templates"
msgstr "I tuoi modelli di firma diretta"
#: apps/remix/app/components/general/document/document-upload.tsx
-#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "Your document failed to upload."
msgstr "Il tuo documento non è stato caricato."
@@ -9245,6 +9832,10 @@ msgstr "Il tuo codice di recupero è stato copiato negli appunti."
msgid "Your recovery codes are listed below. Please store them in a safe place."
msgstr "I tuoi codici di recupero sono elencati di seguito. Si prega di conservarli in un luogo sicuro."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Your support request has been submitted. We'll get back to you soon!"
+msgstr ""
+
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Your team has been created."
msgstr "Il tuo team è stato creato."
@@ -9257,10 +9848,6 @@ msgstr "Il tuo team è stato eliminato correttamente."
msgid "Your team has been successfully updated."
msgstr "Il tuo team è stato aggiornato correttamente."
-#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
-msgid "Your template failed to upload."
-msgstr "Il tuo modello non è riuscito a caricarsi."
-
#: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx
msgid "Your template has been created successfully"
msgstr "Il tuo modello è stato creato con successo"
@@ -9297,3 +9884,6 @@ msgstr "Il tuo token è stato creato con successo! Assicurati di copiarlo perch
msgid "Your tokens will be shown here once you create them."
msgstr "I tuoi token verranno mostrati qui una volta creati."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "your-domain.com another-domain.com"
+msgstr ""
diff --git a/packages/lib/translations/pl/web.po b/packages/lib/translations/pl/web.po
index 939058488..dec7686c1 100644
--- a/packages/lib/translations/pl/web.po
+++ b/packages/lib/translations/pl/web.po
@@ -414,14 +414,30 @@ msgstr "{visibleRows, plural, one {Wyświetlanie # wyniku.} other {Wyświetlanie
msgid "<0>\"{0}\"0>is no longer available to sign"
msgstr "<0>\"{0}\"0>nie jest już dostępny do podpisu"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "<0>{organisationName}0> has requested to create an account on your behalf."
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "<0>{organisationName}0> has requested to link your current Documenso account to their organisation."
+msgstr ""
+
#: packages/email/templates/confirm-team-email.tsx
msgid "<0>{teamName}0> has requested to use your email address for their team on Documenso."
msgstr "Zespół <0>{teamName}0> poprosił o możliwość używania Twojego adresu e-mail w zespole Documenso."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Account management:0> Modify your account settings, permissions, and preferences"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "<0>Click to upload0> or drag and drop"
msgstr "<0>Kliknij, aby przesłać0> lub przeciągnij i upuść"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Data access:0> Access all data associated with your account"
+msgstr ""
+
#: packages/ui/components/document/document-signature-settings-tooltip.tsx
msgid "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
msgstr "<0>Rysowany0> – Podpis narysowany za pomocą myszy lub pióra."
@@ -430,6 +446,10 @@ msgstr "<0>Rysowany0> – Podpis narysowany za pomocą myszy lub pióra."
msgid "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
msgstr "<0>Adres e-mail0> – Odbiorca otrzyma wiadomość z dokumentem do podpisania, zatwierdzenia itp."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "<0>Full account access:0> View all your profile information, settings, and activity"
+msgstr ""
+
#: packages/ui/components/recipient/recipient-action-auth-select.tsx
msgid "<0>Inherit authentication method0> - Use the global action signing authentication method configured in the \"General Settings\" step"
msgstr "<0>Przechwyć metodę uwierzytelniania0> - Użyj globalnej metody uwierzytelniania podpisywania akcji skonfigurowanej w kroku \"Ustawienia ogólne\""
@@ -517,10 +537,18 @@ msgstr "12 miesięcy"
msgid "2FA"
msgstr "2FA"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "2FA Reset"
+msgstr ""
+
#: apps/remix/app/components/forms/token.tsx
msgid "3 months"
msgstr "3 miesiące"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "400 Error"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings._layout.tsx
msgid "401 Unauthorized"
@@ -534,6 +562,10 @@ msgstr "404: Domena nie została znaleziona"
msgid "404 not found"
msgstr "404: Strona nie została znaleziona"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "404 Not Found"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "404 Organisation group not found"
msgstr "404: Grupa organizacji nie została znaleziona"
@@ -597,16 +629,19 @@ msgid "A draft document will be created"
msgstr "Zostanie utworzony szkic dokumentu"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was added"
-msgstr "Dodano pole"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was removed"
-msgstr "Usunięto pole"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A field was updated"
-msgstr "Zaktualizowano pole"
+msgstr ""
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "A means to print or download documents for your records"
@@ -646,16 +681,27 @@ msgid "A password reset email has been sent, if you have an account you should s
msgstr "E-mail z linkiem do resetowania hasła został wysłany. Jeśli masz konto, powinieneś go niedługo zobaczyć w skrzynce odbiorczej."
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was added"
-msgstr "Dodano odbiorcę"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was removed"
-msgstr "Usunięto odbiorcę"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "A recipient was updated"
-msgstr "Zaktualizowano odbiorcę"
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "A request has been made to create an account for you"
+msgstr ""
+
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "A request has been made to link your Documenso account"
+msgstr ""
#. placeholder {0}: team.name
#: packages/lib/server-only/team/create-team-email-verification.ts
@@ -706,6 +752,10 @@ msgstr "E-mail weryfikacyjny zostanie wysłany na podany adres e-mail."
msgid "Accept"
msgstr "Zaakceptuj"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Accept & Link Account"
+msgstr ""
+
#: packages/email/templates/organisation-invite.tsx
msgid "Accept invitation to join an organisation on Documenso"
msgstr "Akceptuj zaproszenie do przyłączenia się do organizacji na Documenso"
@@ -726,6 +776,7 @@ msgstr "Dostęp zablokowany"
msgid "Access enabled"
msgstr "Dostęp włączony"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/general/org-menu-switcher.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
msgid "Account"
@@ -735,6 +786,14 @@ msgstr "Konto"
msgid "Account Authentication"
msgstr "Uwierzytelnianie konta"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Account creation request"
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Account Creation Request"
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
msgid "Account deleted"
@@ -748,10 +807,18 @@ msgstr "Konto zostało wyłączone"
msgid "Account enabled"
msgstr "Konto zostało włączone"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Account Linking Request"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Account Re-Authentication"
msgstr "Ponowna Autoryzacja Konta"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Account unlinked"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "Acknowledgment"
msgstr "Potwierdzenie"
@@ -766,6 +833,7 @@ msgstr "Akcja"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/team-members-table.tsx
#: apps/remix/app/components/tables/team-members-table.tsx
@@ -804,6 +872,10 @@ msgstr "Aktywne subskrypcje"
msgid "Add"
msgstr "Dodaj"
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "Add 2 or more signers to enable signing order."
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-domain-create-dialog.tsx
msgid "Add a custom domain to send emails on behalf of your organisation. We'll generate DKIM records that you need to add to your DNS provider."
msgstr "Dodaj niestandardową domenę, aby wysyłać wiadomości w imieniu swojej organizacji. Wygenerujemy rekordy DKIM, które musisz dodać do dostawcy DNS."
@@ -961,6 +1033,10 @@ msgstr "Dodaj odbiorców, aby utworzyć dokument"
msgid "Add these DNS records to verify your domain ownership"
msgstr "Dodaj te rekordy DNS, aby zweryfikować własność domeny"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Add this URL to your provider's allowed redirect URIs"
+msgstr ""
+
#: apps/remix/app/components/forms/branding-preferences-form.tsx
msgid "Additional brand information to display at the bottom of emails"
msgstr "Dodatkowe informacje o marce do wyświetlenia na dole wiadomości e-mail"
@@ -1078,6 +1154,10 @@ msgstr "Odpowiadanie odbiorcom dokumentu bezpośrednio na ten adres e-mail"
msgid "Allow signers to dictate next signer"
msgstr "Zezwalaj podpisującym wskazać następnego podpisującego"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Allowed Email Domains"
+msgstr ""
+
#: apps/remix/app/components/embed/authoring/configure-document-advanced-settings.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
@@ -1120,6 +1200,7 @@ msgstr "E-mail zawierający zaproszenie zostanie wysłany do każdego członka."
msgid "An email with this address already exists."
msgstr "Ten adres e-mail już istnieje."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
@@ -1139,6 +1220,7 @@ msgstr "Wystąpił błąd podczas dodawania pól."
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "An error occurred while adding signers."
msgstr "Wystąpił błąd podczas dodawania podpisujących."
@@ -1146,6 +1228,30 @@ msgstr "Wystąpił błąd podczas dodawania podpisujących."
msgid "An error occurred while adding the fields."
msgstr "Wystąpił błąd podczas dodawania pól."
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the document settings."
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the fields."
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+msgid "An error occurred while auto-saving the subject form."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template fields."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template placeholders."
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+msgid "An error occurred while auto-saving the template settings."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-auto-sign.tsx
msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields."
msgstr "Wystąpił błąd podczas automatycznego podpisywania dokumentu, niektóre pola mogą nie być podpisane. Proszę sprawdzić i ręcznie podpisać wszystkie pozostałe pola."
@@ -1224,6 +1330,10 @@ msgstr "Wystąpił błąd podczas usuwania wyboru."
msgid "An error occurred while removing the signature."
msgstr "Wystąpił błąd podczas usuwania podpisu."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "An error occurred while resetting two factor authentication for the user."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "An error occurred while sending the document."
msgstr "Wystąpił błąd podczas wysyłania dokumentu."
@@ -1281,10 +1391,23 @@ msgstr "Wystąpił błąd podczas aktualizowania profilu."
msgid "An error occurred while uploading your document."
msgstr "Wystąpił błąd podczas przesyłania dokumentu."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "An error occurred. Please try again later."
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "An organisation wants to create an account for you. Please review the details below."
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "An organisation wants to link your account. Please review the details below."
+msgstr ""
+
#: apps/remix/app/components/general/generic-error-layout.tsx
msgid "An unexpected error occurred."
msgstr "Wystąpił nieoczekiwany błąd."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
#: apps/remix/app/components/general/app-command-menu.tsx
#: apps/remix/app/components/forms/team-update-form.tsx
@@ -1364,37 +1487,48 @@ msgstr "Tokeny API"
msgid "App Version"
msgstr "Wersja aplikacji"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "Approve"
+msgstr ""
+
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table-action-dropdown.tsx
#: apps/remix/app/components/tables/documents-table-action-button.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document/document-page-view-button.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Approve"
msgstr "Zatwierdź"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Approve Document"
msgstr "Zatwierdź dokument"
-#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Approved"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Approved"
msgstr "Zatwierdził"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Approver"
-msgstr "Zatwierdzający"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Approvers"
-msgstr "Zatwierdzający"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Approving"
-msgstr "Zatwierdzanie"
+msgstr ""
#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Are you sure you want to complete the document? This action cannot be undone. Please ensure that you have completed prefilling all relevant fields before proceeding."
@@ -1428,6 +1562,7 @@ msgstr "Czy na pewno chcesz usunąć tę organizację?"
msgid "Are you sure you wish to delete this team?"
msgstr "Czy na pewno chcesz usunąć ten zespół?"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: apps/remix/app/components/dialogs/team-member-delete-dialog.tsx
@@ -1450,10 +1585,11 @@ msgid "Assigned Teams"
msgstr "Przydzielone zespoły"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
msgid "Assist"
-msgstr "Przygotuj"
+msgstr ""
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Assist Document"
msgstr "Asysta dokumentu"
@@ -1463,29 +1599,36 @@ msgid "Assist with signing"
msgstr "Pomoc w podpisywaniu"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Assistant"
-msgstr "Przygotowujący"
+msgstr ""
#: packages/ui/components/recipient/recipient-role-select.tsx
msgid "Assistant role is only available when the document is in sequential signing mode."
msgstr "Rola asystenta jest dostępna tylko w trybie sekwencyjnego podpisywania dokumentów."
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Assistants"
-msgstr "Przygotowujący"
+msgstr ""
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
msgid "Assistants and Copy roles are currently not compatible with the multi-sign experience."
msgstr "Asystenci i role Kopii są obecnie niekompatybilne z doświadczeniem multi-sign."
-#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Assisted"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Assisted"
msgstr "Przygotował"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Assisting"
-msgstr "Przygotowuje"
+msgstr ""
#: apps/remix/app/components/forms/document-preferences-form.tsx
#: packages/ui/primitives/template-flow/add-template-settings.types.tsx
@@ -1510,6 +1653,10 @@ msgstr "Logi"
msgid "Authentication Level"
msgstr "Poziom autoryzacji"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Authentication Portal Not Found"
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-auth-page.tsx
#: apps/remix/app/components/general/direct-template/direct-template-signing-auth-page.tsx
msgid "Authentication required"
@@ -1640,6 +1787,11 @@ msgstr "Zbiorcza wysyłka przez CSV"
msgid "by <0>{senderName}0>"
msgstr "przez <0>{senderName}0>"
+#. placeholder {0}: organisation.name
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "By accepting this request, you grant {0} the following permissions:"
+msgstr ""
+
#: packages/email/templates/confirm-team-email.tsx
msgid "By accepting this request, you will be granting <0>{teamName}0> access to:"
msgstr "Akceptując prośbę, umożliwisz zespołowi <0>{teamName}0> na:"
@@ -1672,6 +1824,7 @@ msgstr "Korzystając z funkcji podpisu elektronicznego, wyrażasz zgodę na prze
msgid "Can prepare"
msgstr "Może przygotować"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
@@ -1763,21 +1916,29 @@ msgid "Cannot remove signer"
msgstr "Nie można usunąć podpisującego"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Cc"
-msgstr "Odbierający kopię"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
-#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
msgid "CC"
-msgstr "Odbierz kopię"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
+msgid "CC"
+msgstr ""
+
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
msgid "CC'd"
-msgstr "CC'd"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Ccers"
-msgstr "Odbierający kopię"
+msgstr ""
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
msgid "Character Limit"
@@ -1872,10 +2033,27 @@ msgstr "Kliknij, aby skopiować link podpisu do wysłania do odbiorcy"
msgid "Click to insert field"
msgstr "Kliknij, aby wstawić pole"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client ID"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client ID is required"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client Secret"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Client secret is required"
+msgstr ""
+
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-passkey.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-2fa.tsx
#: apps/remix/app/components/general/document/document-recipient-link-copy-dialog.tsx
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
#: apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
@@ -1902,6 +2080,8 @@ msgstr "Porównaj szczegóły wszystkich planów i funkcji"
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/forms/signup.tsx
#: apps/remix/app/components/embed/embed-document-signing-page.tsx
+#: apps/remix/app/components/embed/embed-document-signing-page.tsx
+#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
msgid "Complete"
@@ -1923,9 +2103,9 @@ msgstr "Zakończ dokument"
msgid "Complete Signing"
msgstr "Zakończ podpisywanie"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-msgid "Complete the fields for the following signers. Once reviewed, they will inform you if any modifications are needed."
-msgstr "Wypełnij pola dla następujących sygnatariuszy. Po przeglądzie poinformują Cię, czy są potrzebne jakiekolwiek modyfikacje."
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
+msgid "Complete the fields for the following signers."
+msgstr ""
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
@@ -2045,6 +2225,7 @@ msgstr "Potwierdź usunięcie"
msgid "Confirm email"
msgstr "Potwierdź adres e-mail"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/send-confirmation-email.tsx
msgid "Confirmation email sent"
msgstr "E-mail potwierdzający został wysłany"
@@ -2061,6 +2242,10 @@ msgstr "Informacje kontaktowe"
msgid "Contact sales here"
msgstr "Skontaktuj się z działem sprzedaży tutaj"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Contact us"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
msgid "Content"
msgstr "Treść"
@@ -2141,6 +2326,8 @@ msgstr "Kontroluje, które podpisy są dozwolone do użycia podczas podpisywania
msgid "Copied"
msgstr "Skopiowano"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/components/tables/settings-public-profile-templates-table.tsx
#: apps/remix/app/components/general/avatar-with-recipient.tsx
#: apps/remix/app/components/general/template/template-direct-link-badge.tsx
@@ -2182,6 +2369,11 @@ msgstr "Kopiuj linki do podpisania"
msgid "Copy token"
msgstr "Kopiuj token"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "couldn't be uploaded:"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
@@ -2208,6 +2400,10 @@ msgstr "Utwórz nowy adres e-mail dla swojej organizacji używając domeny <0>{0
msgid "Create a new organisation with {planName} plan. Keep your current organisation on it's current plan"
msgstr "Utwórz nową organizację z planem {planName}. Pozostaw swoją obecną organizację na jej obecnym planie"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Create a support ticket"
+msgstr ""
+
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Create a team to collaborate with your team members."
msgstr "Utwórz zespół, aby współpracować z członkami zespołu."
@@ -2466,6 +2662,7 @@ msgstr "Data utworzenia"
msgid "Date Format"
msgstr "Format daty"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/general/organisations/organisation-invitations.tsx
#: packages/email/templates/organisation-invite.tsx
msgid "Decline"
@@ -2491,6 +2688,10 @@ msgstr "Domyślny adres e-mail"
msgid "Default Email Settings"
msgstr "Domyślne ustawienia adresu e-mail"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Default Organisation Role for New Users"
+msgstr ""
+
#: apps/remix/app/components/forms/document-preferences-form.tsx
msgid "Default Signature Settings"
msgstr "Domyślne rodzaje dozwolonych podpisów"
@@ -2752,6 +2953,10 @@ msgstr "Wyłączenie podpisywania za pomocą linku bezpośredniego uniemożliwi
msgid "Disabling the user results in the user not being able to use the account. It also disables all the related contents such as subscription, webhooks, teams, and API keys."
msgstr "Wyłączenie użytkownika uniemożliwia korzystanie z konta oraz dezaktywuje powiązane elementy takie jak subskrypcje, webhooki, zespoły i klucze API."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Discord"
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "Display Name"
@@ -2820,8 +3025,9 @@ msgid "Document access"
msgstr "Dostęp do dokumentu"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document access auth updated"
-msgstr "Zaktualizowano autoryzację dostępu do dokumentu"
+msgstr ""
#: apps/remix/app/components/general/document/document-status.tsx
msgid "Document All"
@@ -2837,9 +3043,13 @@ msgstr "Dokument zatwierdzony"
msgid "Document Cancelled"
msgstr "Dokument anulowany"
+#: packages/lib/utils/document-audit-logs.ts
+#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document completed"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-status.tsx
-#: packages/lib/utils/document-audit-logs.ts
-#: packages/lib/utils/document-audit-logs.ts
msgid "Document completed"
msgstr "Zakończono dokument"
@@ -2852,8 +3062,12 @@ msgstr "Wiadomość potwierdzająca zakończenie"
msgid "Document Completed!"
msgstr "Dokument Zakończony!"
-#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document created"
+msgstr ""
+
+#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "Document created"
msgstr "Utworzono dokument"
@@ -2879,10 +3093,14 @@ msgstr "Dokument utworzony za pomocą <0>bezpośredniego linku0>"
msgid "Document Creation"
msgstr "Tworzenie dokumentu"
+#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document deleted"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
#: apps/remix/app/components/dialogs/admin-document-delete-dialog.tsx
-#: packages/lib/utils/document-audit-logs.ts
msgid "Document deleted"
msgstr "Usunięto dokument"
@@ -2908,8 +3126,9 @@ msgid "Document Duplicated"
msgstr "Dokument zduplikowany"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document external ID updated"
-msgstr "Zaktualizowano identyfikator zewnętrzny dokumentu"
+msgstr ""
#: apps/remix/app/components/general/document/document-certificate-qr-view.tsx
msgid "Document found in your account"
@@ -2945,16 +3164,18 @@ msgid "Document moved"
msgstr "Dokument przeniesiony"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document moved to team"
-msgstr "Przeniesiono dokument do zespołu"
+msgstr ""
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
msgid "Document no longer available to sign"
msgstr "Dokument nie jest już dostępny do podpisania"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document opened"
-msgstr "Otwarto dokument"
+msgstr ""
#: apps/remix/app/components/general/document/document-status.tsx
msgid "Document pending"
@@ -2993,8 +3214,12 @@ msgstr "Dokument odrzucone"
msgid "Document resealed"
msgstr "Dokument ponownie zaplombowany"
-#: apps/remix/app/components/general/document/document-edit-form.tsx
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
+msgid "Document sent"
+msgstr ""
+
+#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "Document sent"
msgstr "Wysłano dokument"
@@ -3003,8 +3228,9 @@ msgid "Document Signed"
msgstr "Dokument podpisany"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document signing auth updated"
-msgstr "Zaktualizowano autoryzację podpisu dokumentu"
+msgstr ""
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document signing process will be cancelled"
@@ -3019,12 +3245,14 @@ msgid "Document title"
msgstr "Tytuł dokumentu"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document title updated"
-msgstr "Zaktualizowano tytuł dokumentu"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document updated"
-msgstr "Zaktualizowano dokument"
+msgstr ""
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
msgid "Document updated successfully"
@@ -3040,21 +3268,27 @@ msgid "Document uploaded"
msgstr "Przesłano dokument"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document viewed"
-msgstr "Dokument został wyświetlony"
+msgstr ""
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
msgid "Document Viewed"
msgstr "Dokument został wyświetlony"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Document visibility updated"
-msgstr "Zaktualizowano widoczność dokumentu"
+msgstr ""
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "Document will be permanently deleted"
msgstr "Dokument zostanie trwale usunięty"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Documentation"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx
@@ -3165,6 +3399,11 @@ msgid "Drag and drop your PDF file here"
msgstr "Przeciągnij i upuść swój plik PDF tutaj"
#: packages/lib/constants/document.ts
+msgctxt "Draw signatute type"
+msgid "Draw"
+msgstr ""
+
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Draw"
msgstr "Rysowany"
@@ -3411,6 +3650,10 @@ msgstr "Włącz podpisywanie linku bezpośredniego"
msgid "Enable signing order"
msgstr "Włącz kolejność podpisów"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Enable SSO portal"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx
@@ -3475,13 +3718,18 @@ msgstr "Enterprise"
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
#: apps/remix/app/components/general/verify-email-banner.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
+#: apps/remix/app/components/general/template/template-edit-form.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
@@ -3510,6 +3758,10 @@ msgstr "Enterprise"
#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
+#: apps/remix/app/components/general/document/document-edit-form.tsx
#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-signing-view.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
@@ -3521,6 +3773,7 @@ msgstr "Enterprise"
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -3579,6 +3832,10 @@ msgstr "Nie udało się utworzyć folderu"
msgid "Failed to create subscription claim."
msgstr "Nie udało się utworzyć roszczenia subskrypcyjnego."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Failed to create support ticket"
+msgstr ""
+
#: apps/remix/app/components/dialogs/folder-delete-dialog.tsx
msgid "Failed to delete folder"
msgstr "Nie udało się usunąć folderu"
@@ -3611,6 +3868,10 @@ msgstr "Nie udało się zapisać ustawień."
msgid "Failed to sign out all sessions"
msgstr "Nie udało się wylogować ze wszystkich sesji"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Failed to unlink account"
+msgstr ""
+
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
msgid "Failed to update document"
msgstr "Nie udało się zaktualizować dokumentu"
@@ -3669,16 +3930,19 @@ msgid "Field placeholder"
msgstr "Tekst zastępczy pola"
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field prefilled by assistant"
-msgstr "Wstępnie wypełniono pole przez asystenta"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field signed"
-msgstr "Podpisano pole"
+msgstr ""
#: packages/lib/utils/document-audit-logs.ts
+msgctxt "Audit log format"
msgid "Field unsigned"
-msgstr "Niepodpisano pole"
+msgstr ""
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
msgid "Fields"
@@ -3688,13 +3952,21 @@ msgstr "Pola"
msgid "Fields updated"
msgstr "Pola zaktualizowane"
-#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
#: apps/remix/app/components/general/document/document-upload.tsx
-#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
msgstr "Plik nie może mieć większej wielkości niż {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "File is larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "File is too small"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
msgid "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB"
msgstr "Rozmiar pliku przekracza limit {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB"
@@ -3810,6 +4082,7 @@ msgstr "Generuj linki"
msgid "Global recipient action authentication"
msgstr "Globalne uwierzytelnianie akcji odbiorcy"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
@@ -4000,6 +4273,10 @@ msgstr "Strona główna (brak folderu)"
msgid "Horizontal"
msgstr "Poziomo"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "I agree to link my account with this organization"
+msgstr ""
+
#: packages/lib/constants/recipient-roles.ts
msgid "I am a signer of this document"
msgstr "Podpisuję dokument"
@@ -4024,6 +4301,10 @@ msgstr "Muszę otrzymać kopię dokumentu"
msgid "I am the owner of this document"
msgstr "Jestem właścicielem tego dokumentu"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "I understand that I am providing my credentials to a 3rd party service configured by this organisation"
+msgstr ""
+
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx
#: apps/remix/app/components/dialogs/token-delete-dialog.tsx
msgid "I'm sure! Delete it"
@@ -4053,6 +4334,10 @@ msgstr "Jeśli nie znajdziesz linku potwierdzającego w swojej skrzynce odbiorcz
msgid "If your authenticator app does not support QR codes, you can use the following code instead:"
msgstr "Jeśli Twoja aplikacja uwierzytelniająca nie obsługuje kodów QR, możesz użyć poniższego kodu:"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Important: What This Means"
+msgstr ""
+
#: apps/remix/app/components/general/app-nav-mobile.tsx
#: apps/remix/app/components/general/app-nav-mobile.tsx
#: apps/remix/app/components/general/document/document-status.tsx
@@ -4120,6 +4405,10 @@ msgstr "Statystyki instancji"
msgid "Invalid code. Please try again."
msgstr "Kod jest nieprawidłowy. Spróbuj ponownie."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Invalid domains"
+msgstr ""
+
#: packages/ui/primitives/document-flow/add-signers.types.ts
msgid "Invalid email"
msgstr "Adres e-mail jest nieprawidłowy"
@@ -4133,6 +4422,10 @@ msgstr "Link jest nieprawidłowy"
msgid "Invalid token"
msgstr "Token jest nieprawidłowy"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Invalid Token"
+msgstr ""
+
#: apps/remix/app/components/forms/reset-password.tsx
msgid "Invalid token provided. Please try again."
msgstr "Podano nieprawidłowy token. Spróbuj ponownie."
@@ -4192,6 +4485,10 @@ msgstr "Faktura"
msgid "IP Address"
msgstr "Adres IP"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Issuer URL"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "It is crucial to keep your contact information, especially your email address, up to date with us. Please notify us immediately of any changes to ensure that you continue to receive all necessary communications."
msgstr "Konieczne jest, aby mieć aktualne informacje kontaktowe, szczególnie swój adres e-mail. Proszę niezwłocznie powiadomić nas o wszelkich zmianach, aby zapewnić ciągłość wszystkich niezbędnych komunikacji."
@@ -4225,6 +4522,10 @@ msgstr "Obecnie nie jest Twój czas na podpisanie dokumentu. Otrzymasz e-mail z
msgid "Join {organisationName} on Documenso"
msgstr "Dołącz do {organisationName} na Documenso"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Join our community on <0>Discord0> for community support and discussion."
+msgstr ""
+
#. placeholder {0}: DateTime.fromJSDate(team.createdAt).toRelative({ style: 'short' })
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
msgid "Joined {0}"
@@ -4319,10 +4620,27 @@ msgstr "Czy chcesz mieć własny publiczny profil z umowami?"
msgid "Link expires in 1 hour."
msgstr "Link wygaśnie za 1 godzinę."
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Link expires in 30 minutes."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.public-profile.tsx
msgid "Link template"
msgstr "Szablon linku"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Link your Documenso account"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "Linked Accounts"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Linked At"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-edit-form.tsx
msgid "Links Generated"
msgstr "Wygenerowane linki"
@@ -4347,6 +4665,10 @@ msgstr "Ładowanie dokumentu..."
msgid "Loading Document..."
msgstr "Ładowanie dokumentu..."
+#: packages/ui/components/recipient/recipient-autocomplete-input.tsx
+msgid "Loading suggestions..."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-page-view-recent-activity.tsx
msgid "Loading..."
msgstr "Ładowanie..."
@@ -4372,6 +4694,10 @@ msgstr "Zarządzaj"
msgid "Manage {0}'s profile"
msgstr "Zarządzaj profilem {0}"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Manage a custom SSO login portal for your organisation."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/organisations.tsx
msgid "Manage all organisations you are currently associated with."
msgstr "Zarządzaj wszystkimi swoimi organizacjami."
@@ -4404,6 +4730,10 @@ msgstr "Zarządzaj Bezpośrednim Linkiem"
msgid "Manage documents"
msgstr "Zarządzaj dokumentami"
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "Manage linked accounts"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "Manage organisation"
msgstr "Zarządzaj organizacją"
@@ -4539,6 +4869,10 @@ msgstr "Członek"
msgid "Member Count"
msgstr "Ilość członków"
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "Member promoted to owner successfully"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-members-table.tsx
msgid "Member Since"
msgstr "Data dołączenia"
@@ -4554,6 +4888,7 @@ msgstr "Data dołączenia"
msgid "Members"
msgstr "Członkowie"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Message"
@@ -4789,6 +5124,10 @@ msgstr "Nie znaleziono pola podpisu"
msgid "No Stripe customer attached"
msgstr "Brak powiązanego klienta Stripe"
+#: packages/ui/components/recipient/recipient-autocomplete-input.tsx
+msgid "No suggestions found"
+msgstr ""
+
#: apps/remix/app/components/tables/team-groups-table.tsx
msgid "No team groups found"
msgstr "Nie znaleziono grupy zespołu"
@@ -4919,6 +5258,16 @@ msgstr "Tylko administratorzy mogą uzyskać dostęp do dokumentu i go wyświetl
msgid "Only managers and above can access and view the document"
msgstr "Tylko menedżerowie i wyżej mogą uzyskać dostęp do dokumentu i go wyświetlić"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Only one file can be uploaded at a time"
+msgstr ""
+
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Only PDF files are allowed"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/_layout.tsx
#: apps/remix/app/components/general/generic-error-layout.tsx
#: apps/remix/app/components/general/generic-error-layout.tsx
@@ -4934,10 +5283,15 @@ msgstr "Otwarto"
msgid "Or"
msgstr "Lub"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "OR"
+msgstr ""
+
#: apps/remix/app/components/forms/signin.tsx
msgid "Or continue with"
msgstr "Lub kontynuuj z"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
#: apps/remix/app/components/tables/user-organisations-table.tsx
#: apps/remix/app/components/tables/admin-organisations-table.tsx
msgid "Organisation"
@@ -4947,6 +5301,10 @@ msgstr "Organizacja"
msgid "Organisation Admin"
msgstr "Administrator organizacji"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Organisation authentication portal URL"
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-organisation-create-dialog.tsx
msgid "Organisation created"
msgstr "Organizacja została utworzona"
@@ -5017,6 +5375,10 @@ msgstr "Ustawienia organizacji"
msgid "Organisation Settings"
msgstr "Ustawienia organizacji"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Organisation SSO Portal"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
msgid "Organisation Teams"
msgstr "Zespoły w organizacji"
@@ -5309,9 +5671,13 @@ msgstr "Wpisz nazwę tokena. Pomoże to później w jego identyfikacji."
msgid "Please enter a valid name."
msgstr "Wpisz prawdłową nazwę."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-msgid "Please mark as viewed to complete"
-msgstr "Proszę zaznaczyć jako obejrzane, aby zakończyć"
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
+msgid "Please mark as viewed to complete."
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Please note that anyone who signs in through your portal will be added to your organisation as a member."
+msgstr ""
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
msgid "Please note that proceeding will remove direct linking recipient and turn it into a placeholder."
@@ -5349,11 +5715,11 @@ msgstr "Proszę podać token z aplikacji uwierzytelniającej lub kod zapasowy. J
msgid "Please provide a token from your authenticator, or a backup code."
msgstr "Proszę podać token z Twojego uwierzytelniacza lub kod zapasowy."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
msgid "Please review the document before approving."
msgstr "Przejrzyj dokument przed zatwierdzeniem."
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
msgid "Please review the document before signing."
msgstr "Proszę przejrzeć dokument przed podpisaniem."
@@ -5449,6 +5815,18 @@ msgstr "Profil zaktualizowano"
msgid "Progress"
msgstr "Postęp"
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "Promote to owner"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Provider"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Provider has been updated successfully"
+msgstr ""
+
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/general/template/template-type.tsx
msgid "Public"
@@ -5485,6 +5863,10 @@ msgstr "Wartości radiowe"
msgid "Read only"
msgstr "Tylko do odczytu"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Read our documentation to get started with Documenso."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-disclosure.tsx
msgid "Read the full <0>signature disclosure0>."
msgstr "Przeczytaj pełne <0>ujawnienie podpisu0>."
@@ -5601,6 +5983,10 @@ msgstr "Kody odzyskiwania"
msgid "Red"
msgstr "Czerwony"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Redirect URI"
+msgstr ""
+
#: apps/remix/app/components/embed/authoring/configure-document-advanced-settings.tsx
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
@@ -5714,6 +6100,10 @@ msgstr "Odpowiedz na adres"
msgid "Reply To Email"
msgstr "Odpowiedz na adres"
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Requesting Organisation"
+msgstr ""
+
#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx
#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx
@@ -5722,6 +6112,10 @@ msgstr "Odpowiedz na adres"
msgid "Required field"
msgstr "Wymagane pole"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Required scopes"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
msgid "Reseal document"
msgstr "Zapieczętuj ponownie dokument"
@@ -5746,6 +6140,11 @@ msgstr "Wyślij ponownie weryfikację"
msgid "Reset"
msgstr "Resetuj"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset 2FA"
+msgstr ""
+
#: apps/remix/app/components/forms/forgot-password.tsx
msgid "Reset email sent"
msgstr "Wysłano e-mail z resetowaniem"
@@ -5757,6 +6156,14 @@ msgstr "Wysłano e-mail z resetowaniem"
msgid "Reset Password"
msgstr "Zresetuj hasło"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset the users two factor authentication. This action is irreversible and will disable two factor authentication for the user."
+msgstr ""
+
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "Reset Two Factor Authentication"
+msgstr ""
+
#: apps/remix/app/components/forms/reset-password.tsx
msgid "Resetting Password..."
msgstr "Resetowanie hasła..."
@@ -5788,9 +6195,14 @@ msgstr "Spróbuj ponownie"
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
msgid "Return"
msgstr "Zwróć"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Return to Documenso sign in page here"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
msgid "Return to Home"
msgstr "Powrót do strony głównej"
@@ -5800,6 +6212,10 @@ msgstr "Powrót do strony głównej"
msgid "Return to sign in"
msgstr "Powrót do logowania"
+#: packages/email/templates/organisation-account-link-confirmation.tsx
+msgid "Review request"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/components/general/teams/team-email-usage.tsx
msgid "Revoke"
@@ -5974,6 +6390,10 @@ msgstr "Wybierz metody uwierzytelniania"
msgid "Select default option"
msgstr "Wybierz domyślną opcję"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Select default role"
+msgstr ""
+
#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx
msgid "Select direction"
msgstr "Wybierz kierunek"
@@ -6189,6 +6609,11 @@ msgstr "Pokaż ustawienia zaawansowane"
msgid "Show templates in your public profile for your audience to sign and get started quickly"
msgstr "Pokaż szablony w profilu publicznym, aby szybko podpisać dokument"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "Sign"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/documents-table-action-dropdown.tsx
@@ -6202,7 +6627,6 @@ msgstr "Pokaż szablony w profilu publicznym, aby szybko podpisać dokument"
#: apps/remix/app/components/general/document-signing/document-signing-auth-password.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-2fa.tsx
#: apps/remix/app/components/general/document/document-page-view-button.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Sign"
msgstr "Podpisz"
@@ -6224,7 +6648,7 @@ msgstr "Podpisz jako<0>{0} <1>({1})1>0>"
msgid "Sign document"
msgstr "Podpisz dokument"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "Sign Document"
msgstr "Podpisz dokument"
@@ -6242,6 +6666,7 @@ msgstr "Pole podpisu"
msgid "Sign Here"
msgstr "Podpisz tutaj"
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: packages/email/template-components/template-reset-password.tsx
@@ -6249,6 +6674,7 @@ msgid "Sign In"
msgstr "Zaloguj się"
#: apps/remix/app/routes/_unauthenticated+/signin.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/general/document-signing/document-signing-auth-dialog.tsx
msgid "Sign in to your account"
msgstr "Zaloguj się na swoje konto"
@@ -6316,32 +6742,35 @@ msgstr "Zebrane podpisy"
msgid "Signatures will appear once the document has been completed"
msgstr "Podpisy pojawią się po ukończeniu dokumentu"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Signed"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: packages/ui/components/document/document-read-only-fields.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Signed"
msgstr "Podpisał"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Signer"
-msgstr "Podpisujący"
+msgstr ""
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Signer Events"
msgstr "Zdarzenia podpisujących"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Signers"
-msgstr "Podpisujący"
-
-#: packages/ui/primitives/document-flow/add-signers.types.ts
-msgid "Signers must have unique emails"
-msgstr "Podpisujący muszą mieć unikalne emaile"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Signing"
-msgstr "Podpisywanie"
+msgstr ""
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
msgid "Signing Certificate"
@@ -6512,6 +6941,14 @@ msgstr "Przepraszamy, nie mogliśmy pobrać certyfikatu. Proszę spróbować pon
msgid "Source"
msgstr "Źródło"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Space-separated list of domains. Leave empty to allow all domains."
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
+msgid "SSO"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
msgid "Stats"
msgstr "Statystyki"
@@ -6543,6 +6980,7 @@ msgstr "Klient Stripe został utworzony"
msgid "Stripe Customer ID"
msgstr "Identyfikator klienta Stripe"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Subject"
msgstr "Temat"
@@ -6552,6 +6990,10 @@ msgstr "Temat"
msgid "Subject <0>(Optional)0>"
msgstr "Temat <0>(opcjonalnie)0>"
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Submit"
+msgstr ""
+
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx
#: apps/remix/app/components/general/billing-plans.tsx
@@ -6585,10 +7027,12 @@ msgstr "Subskrypcja nieważna"
#: apps/remix/app/routes/embed+/v1+/authoring+/template.edit.$id.tsx
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
@@ -6646,6 +7090,15 @@ msgstr "Pomyślnie utworzono: {successCount}"
msgid "Summary:"
msgstr "Podsumowanie:"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+#: apps/remix/app/components/general/org-menu-switcher.tsx
+msgid "Support"
+msgstr ""
+
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Support ticket created"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
msgid "Sync"
msgstr "Synchronizuj"
@@ -7009,7 +7462,8 @@ msgid "The email address which will show up in the \"Reply To\" field in emails"
msgstr "Adres e-mail, który pojawi się w polu \"Odpowiedź do\" w wiadomościach e-mail"
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
-msgid "The email domain you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The email domain you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Domena e-mail, której szukasz mogła zostać usunięta, przechrzczona lub nigdy nie istniała."
@@ -7050,12 +7504,21 @@ msgstr "Wystąpiły następujące błędy:"
msgid "The following team has been deleted. You will no longer be able to access this team and its documents"
msgstr "Poniższy zespół został usunięty. Nie będziesz mógł już uzyskać dostępu do tego zespołu i jego dokumentów."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "The OpenID discovery endpoint URL for your provider"
+msgstr ""
+
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "The organisation authentication portal does not exist, or is not configured"
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "The organisation email has been created successfully."
msgstr "Organizacyjny adres e-mail został pomyślnie utworzony."
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
-msgid "The organisation group you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation group you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Grupa organizacji, której szukasz, mogła zostać usunięta, zmieniona nazwa lub mogła nigdy nie istnieć."
@@ -7064,12 +7527,14 @@ msgid "The organisation role that will be applied to all members in this group."
msgstr "Rola organizacji, która zostanie zastosowana do wszystkich członków tej grupy."
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
-msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Organizacja, której szukasz, mogła zostać usunięta, zmieniona nazwa lub mogła nigdy nie istnieć."
#: apps/remix/app/routes/_authenticated+/_layout.tsx
-msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The organisation you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Organizacja, której szukasz, mogła zostać usunięta, zmieniona nazwa lub mogła nigdy nie istnieć."
@@ -7158,12 +7623,14 @@ msgid "The team email <0>{teamEmail}0> has been removed from the following tea
msgstr "Email zespołowy <0>{teamEmail}0> został usunięty z następującego zespołu"
#: apps/remix/app/routes/_authenticated+/_layout.tsx
-msgid "The team you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The team you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Zespół, którego szukasz, mógł zostać usunięty, zmienić nazwę lub mógł nigdy nie istnieć."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
-msgid "The team you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The team you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Zespół, którego szukasz, mógł zostać usunięty, zmieniony na, albo nigdy nie istniał."
@@ -7179,6 +7646,10 @@ msgstr "Szablon zostanie usunięty z Twojego profilu"
msgid "The test webhook has been successfully sent to your endpoint."
msgstr "Testowy webhook został pomyślnie wysłany na twój punkt końcowy."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "The token is invalid or has expired."
+msgstr ""
+
#: apps/remix/app/components/forms/token.tsx
msgid "The token was copied to your clipboard."
msgstr "Token został skopiowany do schowka."
@@ -7205,10 +7676,15 @@ msgid "The URL for Documenso to send webhook events to."
msgstr "URL dla Documenso do wysyłania zdarzeń webhook."
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
-msgid "The user you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The user you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Użytkownik, którego szukasz, mógł zostać usunięty, zmieniony nazwę lub mógł nigdy nie istnieć."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "The user's two factor authentication has been reset successfully."
+msgstr ""
+
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx
msgid "The webhook has been successfully deleted."
msgstr "Webhook został pomyślnie usunięty."
@@ -7222,7 +7698,8 @@ msgid "The webhook was successfully created."
msgstr "Webhook został pomyślnie utworzony."
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
-msgid "The webhook you are looking for may have been removed, renamed or may have never\n"
+msgid ""
+"The webhook you are looking for may have been removed, renamed or may have never\n"
" existed."
msgstr "Webhook, którego szukasz, mógł zostać usunięty, przechrzczony lub nigdy nie istniał."
@@ -7258,6 +7735,10 @@ msgstr "To konto zostało zablokowane. Skontaktuj się z pomocą techniczną."
msgid "This account has not been verified. Please verify your account before signing in."
msgstr "To konto nie zostało zweryfikowane. Proszę zweryfikuj konto przed zalogowaniem."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "This action is irreversible. Please ensure you have informed the user before proceeding."
+msgstr ""
+
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
#: apps/remix/app/components/dialogs/admin-document-delete-dialog.tsx
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
@@ -7376,10 +7857,22 @@ msgstr "W ten sposób dokument dotrze do odbiorców, gdy tylko dokument będzie
msgid "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
msgstr "To jest roszczenie, z którym pierwotnie została utworzona ta organizacja. Wszelkie zmiany flag funkcji w tym roszczeniu zostaną przeniesione do tej organizacji."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "This is the required scopes you must set in your provider's settings"
+msgstr ""
+
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "This is the URL which users will use to sign in to your organisation."
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
msgid "This link is invalid or has expired. Please contact your team to resend a verification."
msgstr "Ten link jest nieprawidłowy lub wygasł. Proszę skontaktować się ze swoim zespołem, aby ponownie wysłać weryfikację."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "This organisation will have administrative control over your account. You can revoke this access later, but they will retain access to any data they've already collected."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.general.tsx
msgid "This organisation, and any associated data will be permanently deleted."
msgstr "Ta organizacja oraz wszelkie powiązane dane zostaną trwale usunięte."
@@ -7499,9 +7992,10 @@ msgstr "Aby móc dodać członków do zespołu, musisz najpierw dodać ich do or
msgid "To change the email you must remove and add a new email address."
msgstr "Aby zmienić e-mail, musisz usunąć i dodać nowy adres e-mail."
+#. placeholder {0}: user.email
#. placeholder {0}: userToEnable.email
#. placeholder {0}: userToDisable.email
-#. placeholder {0}: user.email
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -7517,6 +8011,7 @@ msgid "To enable two-factor authentication, scan the following QR code using you
msgstr "Aby włączyć uwierzytelnianie dwuetapowe, zeskanuj poniższy kod QR za pomocą swojej aplikacji uwierzytelniającej."
#: apps/remix/app/routes/_unauthenticated+/unverified-account.tsx
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
msgid "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
msgstr "Aby uzyskać dostęp do swojego konta, proszę potwierdzić swój adres e-mail, klikając na link potwierdzający w swojej skrzynce odbiorczej."
@@ -7633,9 +8128,14 @@ msgstr "Uwierzytelnianie dwuetapowe zostało wyłączone dla Twojego konta. Nie
msgid "Two-Factor Re-Authentication"
msgstr "Ponowna autoryzacja za pomocą dwuetapowej weryfikacji"
+#: packages/lib/constants/document.ts
+msgctxt "Type signatute type"
+msgid "Type"
+msgstr ""
+
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
-#: packages/lib/constants/document.ts
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Type"
msgstr "Typ"
@@ -7749,9 +8249,15 @@ msgstr "Niezakończony"
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
msgid "Unknown"
msgstr "Nieznany"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Unknown error"
+msgstr ""
+
#: apps/remix/app/components/tables/admin-claims-table.tsx
msgid "Unlimited"
msgstr "Nieograniczone"
@@ -7760,6 +8266,11 @@ msgstr "Nieograniczone"
msgid "Unlimited documents, API and more"
msgstr "Nieograniczone dokumenty, API i więcej"
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "Unlink"
+msgstr ""
+
#: apps/remix/app/components/general/folder/folder-card.tsx
msgid "Unpin"
msgstr "Odepnij"
@@ -7768,6 +8279,7 @@ msgstr "Odepnij"
msgid "Untitled Group"
msgstr "Grupa bez nazwy"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains.$id.tsx
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
@@ -7907,6 +8419,11 @@ msgid "Upgrade your plan to upload more documents"
msgstr "Zaktualizuj swój plan, aby przesłać więcej dokumentów"
#: packages/lib/constants/document.ts
+msgctxt "Upload signatute type"
+msgid "Upload"
+msgstr ""
+
+#: packages/ui/primitives/signature-pad/signature-pad.tsx
msgid "Upload"
msgstr "Przesłany"
@@ -7940,6 +8457,11 @@ msgstr "Prześlij niestandardowy dokument"
msgid "Upload Document"
msgstr "Prześlij dokument"
+#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
+#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
+msgid "Upload failed"
+msgstr ""
+
#: packages/ui/primitives/signature-pad/signature-pad-upload.tsx
msgid "Upload Signature"
msgstr "Prześlij podpis"
@@ -8021,6 +8543,7 @@ msgstr "Użytkownik nie ma hasła."
msgid "User not found"
msgstr "Użytkownik nie znaleziony"
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx
@@ -8094,6 +8617,11 @@ msgstr "Zweryfikuj adres e-mail zespołu"
msgid "Vertical"
msgstr "Pionowo"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role action verb"
+msgid "View"
+msgstr ""
+
#: apps/remix/app/components/tables/organisation-billing-invoices-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
#: apps/remix/app/components/tables/inbox-table.tsx
@@ -8103,7 +8631,6 @@ msgstr "Pionowo"
#: apps/remix/app/components/general/document/document-page-view-button.tsx
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "View"
msgstr "Widok"
@@ -8136,6 +8663,11 @@ msgstr "Wyświetl wszystkie aktywności związane z bezpieczeństwem twojego kon
msgid "View and manage all active sessions for your account."
msgstr "Przeglądaj i zarządzaj wszystkimi aktywnymi sesjami swojego konta."
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
+msgid "View and manage all login methods linked to your account."
+msgstr ""
+
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
msgid "View Codes"
msgstr "Wyświetl kody"
@@ -8148,7 +8680,7 @@ msgstr "Zobacz rekordy DNS"
msgid "View document"
msgstr "Zobacz dokument"
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-page-view.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
@@ -8198,24 +8730,31 @@ msgstr "Wyświetl zespoły"
msgid "View the DNS records for this email domain"
msgstr "Zobacz rekordy DNS dla tej domeny e-mail"
+#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role actioned"
+msgid "Viewed"
+msgstr ""
+
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
#: apps/remix/app/components/embed/multisign/multi-sign-document-list.tsx
-#: packages/lib/constants/recipient-roles.ts
msgid "Viewed"
msgstr "Wyświetlono"
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role name"
msgid "Viewer"
-msgstr "Użytkownik widoku"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role plural name"
msgid "Viewers"
-msgstr "Widokowcy"
+msgstr ""
#: packages/lib/constants/recipient-roles.ts
+msgctxt "Recipient role progressive verb"
msgid "Viewing"
-msgstr "Wyświetlanie"
+msgstr ""
#: apps/remix/app/components/dialogs/folder-update-dialog.tsx
msgid "Visibility"
@@ -8276,6 +8815,10 @@ msgstr "Nie możemy zaktualizować tego klucza zabezpieczeń w tej chwili. Prosz
msgid "We couldn't create a Stripe customer. Please try again."
msgstr "Nie udało nam się utworzyć klienta Stripe. Spróbuj ponownie."
+#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
+msgid "We couldn't promote the member to owner. Please try again."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
msgid "We couldn't update the group. Please try again."
msgstr "Nie udało nam się zaktualizować grupy. Spróbuj ponownie."
@@ -8285,6 +8828,10 @@ msgstr "Nie udało nam się zaktualizować grupy. Spróbuj ponownie."
msgid "We couldn't update the organisation. Please try again."
msgstr "Nie udało nam się zaktualizować organizacji. Spróbuj ponownie."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "We couldn't update the provider. Please try again."
+msgstr ""
+
#: apps/remix/app/components/dialogs/organisation-email-create-dialog.tsx
msgid "We encountered an error while creating the email. Please try again later."
msgstr "Wystąpił błąd podczas tworzenia e-maila. Proszę spróbować ponownie później."
@@ -8393,6 +8940,7 @@ msgstr "Natknęliśmy się na nieznany błąd podczas próby zresetowania hasła
msgid "We encountered an unknown error while attempting to revoke access. Please try again or contact support."
msgstr "Natknęliśmy się na nieznany błąd podczas próby odwołania dostępu. Proszę spróbuj ponownie lub skontaktuj się z pomocą techniczną."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/signin.tsx
msgid "We encountered an unknown error while attempting to sign you In. Please try again later."
@@ -8528,6 +9076,10 @@ msgstr "Wygenerujemy dla Ciebie linki do podpisania, które możesz wysłać do
msgid "We won't send anything to notify recipients."
msgstr "Nie wyślemy nic, aby powiadomić odbiorców."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "We'll get back to you as soon as possible via email."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates._index.tsx
#: apps/remix/app/components/tables/documents-table-empty-state.tsx
msgid "We're all empty"
@@ -8585,10 +9137,18 @@ msgstr "Witaj ponownie. Mamy szczęście, że Cię mamy."
msgid "Welcome back! Here's an overview of your account."
msgstr "Witamy z powrotem! Oto przegląd twojego konta."
+#: apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+msgid "Welcome to {organisationName}"
+msgstr ""
+
#: packages/email/template-components/template-confirmation-email.tsx
msgid "Welcome to Documenso!"
msgstr "Witaj w Documenso!"
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Well-known URL is required"
+msgstr ""
+
#: apps/remix/app/routes/_recipient+/sign.$token+/waiting.tsx
msgid "Were you trying to edit this document instead?"
msgstr "Czy próbowałeś raczej edytować ten dokument?"
@@ -8615,6 +9175,10 @@ msgstr "Gdy podpisujesz dokument, możemy automatycznie wypełnić i podpisać n
msgid "When you use our platform to affix your electronic signature to documents, you are consenting to do so under the Electronic Signatures in Global and National Commerce Act (E-Sign Act) and other applicable laws. This action indicates your agreement to use electronic means to sign documents and receive notifications."
msgstr "Kiedy korzystasz z naszej platformy, aby przyczepić swój podpis elektroniczny do dokumentów, wyrażasz zgodę na dokonanie tego zgodnie z Ustawą o podpisach elektronicznych w handlu globalnym i krajowym (Ustawa E-Sign) oraz innymi obowiązującymi przepisami. Ta czynność wskazuje na twoją zgodę na korzystanie z elektronicznych środków do podpisywania dokumentów i otrzymywania powiadomień."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "Whether to enable the SSO portal for your organisation"
+msgstr ""
+
#: apps/remix/app/routes/_profile+/p.$url.tsx
msgid "While waiting for them to do so you can create your own Documenso account and get started with document signing right away."
msgstr "Czekając na ich działania możesz utworzyć własne konto Documenso i od razu rozpocząć podpisywanie dokumentów."
@@ -8682,6 +9246,10 @@ msgstr "Masz zamiar opuścić następującą organizację."
msgid "You are about to remove default access to this team for all organisation members. Any members not explicitly added to this team will no longer have access."
msgstr "Masz zamiar usunąć domyślny dostęp do tego zespołu dla wszystkich członków organizacji. Każdy członek nie dodany odrębnie do tego zespołu nie będzie miał już dostępu."
+#: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx
+msgid "You are about to remove the <0>{provider}0> login method from your account."
+msgstr ""
+
#. placeholder {0}: organisation.name
#: apps/remix/app/components/dialogs/organisation-email-domain-delete-dialog.tsx
msgid "You are about to remove the email domain <0>{emailDomain}0> from <1>{0}1>. All emails associated with this domain will be deleted."
@@ -8768,6 +9336,10 @@ msgstr "Nie masz uprawnień, aby wyłączyć tego użytkownika."
msgid "You are not authorized to enable this user."
msgstr "Nie masz uprawnień, aby włączyć tego użytkownika."
+#: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx
+msgid "You are not authorized to reset two factor authentcation for this user."
+msgstr ""
+
#: packages/email/template-components/template-confirmation-email.tsx
msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)"
msgstr "Możesz także skopiować i wkleić ten link do przeglądarki: {confirmationLink} (link wygasa za 1 godzinę)"
@@ -9058,6 +9630,10 @@ msgstr "Będziesz teraz zobowiązany do wpisania kodu z aplikacji uwierzytelniaj
msgid "You will receive an Email copy of the signed document once everyone has signed."
msgstr "Otrzymasz kopię e-maila podpisanego dokumentu, gdy wszyscy podpiszą."
+#: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx
+msgid "Your Account"
+msgstr ""
+
#: apps/remix/app/components/dialogs/account-delete-dialog.tsx
msgid "Your account has been deleted successfully."
msgstr "Konto zostało usunięte."
@@ -9091,6 +9667,10 @@ msgstr "Twoja operacja masowej wysyłki dla szablonu \"{templateName}\" została
msgid "Your current {currentProductName} plan is past due. Please update your payment information."
msgstr "Twój plan {currentProductName} jest nieopłacony. Zaktualizuj informacje płatnicze."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+msgid "Your current plan includes the following support channels:"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.billing.tsx
msgid "Your current plan is inactive."
msgstr "Obecny plan jest nieaktywny."
@@ -9104,7 +9684,6 @@ msgid "Your direct signing templates"
msgstr "Twoje bezpośrednie szablony podpisu"
#: apps/remix/app/components/general/document/document-upload.tsx
-#: apps/remix/app/components/general/document/document-drop-zone-wrapper.tsx
#: apps/remix/app/components/embed/authoring/configure-document-upload.tsx
msgid "Your document failed to upload."
msgstr "Twój dokument nie udało się załadować."
@@ -9237,6 +9816,10 @@ msgstr "Twój kod odzyskiwania został skopiowany do schowka."
msgid "Your recovery codes are listed below. Please store them in a safe place."
msgstr "Twoje kody odzyskiwania są wymienione poniżej. Proszę przechowywać je w bezpiecznym miejscu."
+#: apps/remix/app/components/forms/support-ticket-form.tsx
+msgid "Your support request has been submitted. We'll get back to you soon!"
+msgstr ""
+
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
msgid "Your team has been created."
msgstr "Zespół został utworzony."
@@ -9249,10 +9832,6 @@ msgstr "Zespół został usunięty."
msgid "Your team has been successfully updated."
msgstr "Zespół został zaktualizowany."
-#: apps/remix/app/components/general/template/template-drop-zone-wrapper.tsx
-msgid "Your template failed to upload."
-msgstr "Twój szablon nie został przesłany."
-
#: apps/remix/app/routes/embed+/v1+/authoring_.completed.create.tsx
msgid "Your template has been created successfully"
msgstr "Szablon został utworzony"
@@ -9289,3 +9868,6 @@ msgstr "Twój token został pomyślnie utworzony! Upewnij się, że go skopiujes
msgid "Your tokens will be shown here once you create them."
msgstr "Twoje tokeny będą tutaj wyświetlane po ich utworzeniu."
+#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
+msgid "your-domain.com another-domain.com"
+msgstr ""
diff --git a/packages/lib/types/document-audit-logs.ts b/packages/lib/types/document-audit-logs.ts
index 79a4e7c1b..c0bf04a2a 100644
--- a/packages/lib/types/document-audit-logs.ts
+++ b/packages/lib/types/document-audit-logs.ts
@@ -41,6 +41,11 @@ export const ZDocumentAuditLogTypeSchema = z.enum([
'DOCUMENT_EXTERNAL_ID_UPDATED', // When the document external ID is updated.
'DOCUMENT_MOVED_TO_TEAM', // When the document is moved to a team.
'DOCUMENT_ATTACHMENTS_UPDATED', // When the document attachments are updated.
+
+ // ACCESS AUTH 2FA events.
+ 'DOCUMENT_ACCESS_AUTH_2FA_REQUESTED', // When ACCESS AUTH 2FA is requested.
+ 'DOCUMENT_ACCESS_AUTH_2FA_VALIDATED', // When ACCESS AUTH 2FA is successfully validated.
+ 'DOCUMENT_ACCESS_AUTH_2FA_FAILED', // When ACCESS AUTH 2FA validation fails.
]);
export const ZDocumentAuditLogEmailTypeSchema = z.enum([
@@ -488,6 +493,42 @@ export const ZDocumentAuditLogEventDocumentRecipientRejectedSchema = z.object({
}),
});
+/**
+ * Event: Document recipient requested a 2FA token.
+ */
+export const ZDocumentAuditLogEventDocumentRecipientRequested2FAEmailSchema = z.object({
+ type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_ACCESS_AUTH_2FA_REQUESTED),
+ data: z.object({
+ recipientEmail: z.string(),
+ recipientName: z.string(),
+ recipientId: z.number(),
+ }),
+});
+
+/**
+ * Event: Document recipient validated a 2FA token.
+ */
+export const ZDocumentAuditLogEventDocumentRecipientValidated2FAEmailSchema = z.object({
+ type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_ACCESS_AUTH_2FA_VALIDATED),
+ data: z.object({
+ recipientEmail: z.string(),
+ recipientName: z.string(),
+ recipientId: z.number(),
+ }),
+});
+
+/**
+ * Event: Document recipient failed to validate a 2FA token.
+ */
+export const ZDocumentAuditLogEventDocumentRecipientFailed2FAEmailSchema = z.object({
+ type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_ACCESS_AUTH_2FA_FAILED),
+ data: z.object({
+ recipientEmail: z.string(),
+ recipientName: z.string(),
+ recipientId: z.number(),
+ }),
+});
+
/**
* Event: Document sent.
*/
@@ -651,6 +692,9 @@ export const ZDocumentAuditLogSchema = ZDocumentAuditLogBaseSchema.and(
ZDocumentAuditLogEventDocumentViewedSchema,
ZDocumentAuditLogEventDocumentRecipientCompleteSchema,
ZDocumentAuditLogEventDocumentRecipientRejectedSchema,
+ ZDocumentAuditLogEventDocumentRecipientRequested2FAEmailSchema,
+ ZDocumentAuditLogEventDocumentRecipientValidated2FAEmailSchema,
+ ZDocumentAuditLogEventDocumentRecipientFailed2FAEmailSchema,
ZDocumentAuditLogEventDocumentSentSchema,
ZDocumentAuditLogEventDocumentTitleUpdatedSchema,
ZDocumentAuditLogEventDocumentExternalIdUpdatedSchema,
diff --git a/packages/lib/types/document-auth.ts b/packages/lib/types/document-auth.ts
index 493e14374..af28da615 100644
--- a/packages/lib/types/document-auth.ts
+++ b/packages/lib/types/document-auth.ts
@@ -37,6 +37,7 @@ const ZDocumentAuthPasswordSchema = z.object({
const ZDocumentAuth2FASchema = z.object({
type: z.literal(DocumentAuth.TWO_FACTOR_AUTH),
token: z.string().min(4).max(10),
+ method: z.enum(['email', 'authenticator']).default('authenticator').optional(),
});
/**
@@ -55,9 +56,12 @@ export const ZDocumentAuthMethodsSchema = z.discriminatedUnion('type', [
*
* Must keep these two in sync.
*/
-export const ZDocumentAccessAuthSchema = z.discriminatedUnion('type', [ZDocumentAuthAccountSchema]);
+export const ZDocumentAccessAuthSchema = z.discriminatedUnion('type', [
+ ZDocumentAuthAccountSchema,
+ ZDocumentAuth2FASchema,
+]);
export const ZDocumentAccessAuthTypesSchema = z
- .enum([DocumentAuth.ACCOUNT])
+ .enum([DocumentAuth.ACCOUNT, DocumentAuth.TWO_FACTOR_AUTH])
.describe('The type of authentication required for the recipient to access the document.');
/**
@@ -89,9 +93,10 @@ export const ZDocumentActionAuthTypesSchema = z
*/
export const ZRecipientAccessAuthSchema = z.discriminatedUnion('type', [
ZDocumentAuthAccountSchema,
+ ZDocumentAuth2FASchema,
]);
export const ZRecipientAccessAuthTypesSchema = z
- .enum([DocumentAuth.ACCOUNT])
+ .enum([DocumentAuth.ACCOUNT, DocumentAuth.TWO_FACTOR_AUTH])
.describe('The type of authentication required for the recipient to access the document.');
/**
diff --git a/packages/lib/utils/document-audit-logs.ts b/packages/lib/utils/document-audit-logs.ts
index 51390c44a..9f3576f63 100644
--- a/packages/lib/utils/document-audit-logs.ts
+++ b/packages/lib/utils/document-audit-logs.ts
@@ -476,6 +476,36 @@ export const formatDocumentAuditLogAction = (
identified: result,
};
})
+ .with({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_ACCESS_AUTH_2FA_REQUESTED }, ({ data }) => {
+ const userName = prefix || _(msg`Recipient`);
+
+ const result = msg`${userName} requested a 2FA token for the document`;
+
+ return {
+ anonymous: result,
+ identified: result,
+ };
+ })
+ .with({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_ACCESS_AUTH_2FA_VALIDATED }, ({ data }) => {
+ const userName = prefix || _(msg`Recipient`);
+
+ const result = msg`${userName} validated a 2FA token for the document`;
+
+ return {
+ anonymous: result,
+ identified: result,
+ };
+ })
+ .with({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_ACCESS_AUTH_2FA_FAILED }, ({ data }) => {
+ const userName = prefix || _(msg`Recipient`);
+
+ const result = msg`${userName} failed to validate a 2FA token for the document`;
+
+ return {
+ anonymous: result,
+ identified: result,
+ };
+ })
.with({ type: DOCUMENT_AUDIT_LOG_TYPE.EMAIL_SENT }, ({ data }) => ({
anonymous: data.isResending ? msg`Email resent` : msg`Email sent`,
identified: data.isResending
diff --git a/packages/prisma/migrations/20250917042725_remove_recipient_unique_email_constraints/migration.sql b/packages/prisma/migrations/20250917042725_remove_recipient_unique_email_constraints/migration.sql
new file mode 100644
index 000000000..a6773703f
--- /dev/null
+++ b/packages/prisma/migrations/20250917042725_remove_recipient_unique_email_constraints/migration.sql
@@ -0,0 +1,5 @@
+-- DropIndex
+DROP INDEX "Recipient_documentId_email_key";
+
+-- DropIndex
+DROP INDEX "Recipient_templateId_email_key";
diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma
index 90d904bd5..2dafb042e 100644
--- a/packages/prisma/schema.prisma
+++ b/packages/prisma/schema.prisma
@@ -554,8 +554,6 @@ model Recipient {
fields Field[]
signatures Signature[]
- @@unique([documentId, email])
- @@unique([templateId, email])
@@index([documentId])
@@index([templateId])
@@index([token])
diff --git a/packages/trpc/server/admin-router/promote-member-to-owner.ts b/packages/trpc/server/admin-router/promote-member-to-owner.ts
new file mode 100644
index 000000000..fbe01efef
--- /dev/null
+++ b/packages/trpc/server/admin-router/promote-member-to-owner.ts
@@ -0,0 +1,124 @@
+import { OrganisationGroupType, OrganisationMemberRole } from '@prisma/client';
+
+import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
+import { generateDatabaseId } from '@documenso/lib/universal/id';
+import { getHighestOrganisationRoleInGroup } from '@documenso/lib/utils/organisations';
+import { prisma } from '@documenso/prisma';
+
+import { adminProcedure } from '../trpc';
+import {
+ ZPromoteMemberToOwnerRequestSchema,
+ ZPromoteMemberToOwnerResponseSchema,
+} from './promote-member-to-owner.types';
+
+export const promoteMemberToOwnerRoute = adminProcedure
+ .input(ZPromoteMemberToOwnerRequestSchema)
+ .output(ZPromoteMemberToOwnerResponseSchema)
+ .mutation(async ({ input, ctx }) => {
+ const { organisationId, userId } = input;
+
+ ctx.logger.info({
+ input: {
+ organisationId,
+ userId,
+ },
+ });
+
+ // First, verify the organisation exists and get member details with groups
+ const organisation = await prisma.organisation.findUnique({
+ where: {
+ id: organisationId,
+ },
+ include: {
+ groups: {
+ where: {
+ type: OrganisationGroupType.INTERNAL_ORGANISATION,
+ },
+ },
+ members: {
+ where: {
+ userId,
+ },
+ include: {
+ organisationGroupMembers: {
+ include: {
+ group: true,
+ },
+ },
+ },
+ },
+ },
+ });
+
+ if (!organisation) {
+ throw new AppError(AppErrorCode.NOT_FOUND, {
+ message: 'Organisation not found',
+ });
+ }
+
+ // Verify the user is a member of the organisation
+ const [member] = organisation.members;
+
+ if (!member) {
+ throw new AppError(AppErrorCode.NOT_FOUND, {
+ message: 'User is not a member of this organisation',
+ });
+ }
+
+ // Verify the user is not already the owner
+ if (organisation.ownerUserId === userId) {
+ throw new AppError(AppErrorCode.INVALID_REQUEST, {
+ message: 'User is already the owner of this organisation',
+ });
+ }
+
+ // Get current organisation role
+ const currentOrganisationRole = getHighestOrganisationRoleInGroup(
+ member.organisationGroupMembers.flatMap((member) => member.group),
+ );
+
+ // Find the current and target organisation groups
+ const currentMemberGroup = organisation.groups.find(
+ (group) => group.organisationRole === currentOrganisationRole,
+ );
+
+ const adminGroup = organisation.groups.find(
+ (group) => group.organisationRole === OrganisationMemberRole.ADMIN,
+ );
+
+ if (!currentMemberGroup) {
+ throw new AppError(AppErrorCode.UNKNOWN_ERROR, {
+ message: 'Current member group not found',
+ });
+ }
+
+ if (!adminGroup) {
+ throw new AppError(AppErrorCode.UNKNOWN_ERROR, {
+ message: 'Admin group not found',
+ });
+ }
+
+ // Update the organisation owner and member role in a transaction
+ await prisma.$transaction(async (tx) => {
+ // Update the organisation to set the new owner
+ await tx.organisation.update({
+ where: {
+ id: organisationId,
+ },
+ data: {
+ ownerUserId: userId,
+ },
+ });
+
+ // Only update role if the user is not already an admin then add them to the admin group
+ if (currentOrganisationRole !== OrganisationMemberRole.ADMIN) {
+ await tx.organisationGroupMember.create({
+ data: {
+ id: generateDatabaseId('group_member'),
+ organisationMemberId: member.id,
+ groupId: adminGroup.id,
+ },
+ });
+ }
+ });
+ });
diff --git a/packages/trpc/server/admin-router/promote-member-to-owner.types.ts b/packages/trpc/server/admin-router/promote-member-to-owner.types.ts
new file mode 100644
index 000000000..353c80cdd
--- /dev/null
+++ b/packages/trpc/server/admin-router/promote-member-to-owner.types.ts
@@ -0,0 +1,11 @@
+import { z } from 'zod';
+
+export const ZPromoteMemberToOwnerRequestSchema = z.object({
+ organisationId: z.string().min(1),
+ userId: z.number().min(1),
+});
+
+export const ZPromoteMemberToOwnerResponseSchema = z.void();
+
+export type TPromoteMemberToOwnerRequest = z.infer;
+export type TPromoteMemberToOwnerResponse = z.infer;
diff --git a/packages/trpc/server/admin-router/router.ts b/packages/trpc/server/admin-router/router.ts
index f8d472a79..541542097 100644
--- a/packages/trpc/server/admin-router/router.ts
+++ b/packages/trpc/server/admin-router/router.ts
@@ -12,6 +12,7 @@ import { findDocumentsRoute } from './find-documents';
import { findSubscriptionClaimsRoute } from './find-subscription-claims';
import { getAdminOrganisationRoute } from './get-admin-organisation';
import { getUserRoute } from './get-user';
+import { promoteMemberToOwnerRoute } from './promote-member-to-owner';
import { resealDocumentRoute } from './reseal-document';
import { resetTwoFactorRoute } from './reset-two-factor-authentication';
import { updateAdminOrganisationRoute } from './update-admin-organisation';
@@ -27,6 +28,9 @@ export const adminRouter = router({
create: createAdminOrganisationRoute,
update: updateAdminOrganisationRoute,
},
+ organisationMember: {
+ promoteToOwner: promoteMemberToOwnerRoute,
+ },
claims: {
find: findSubscriptionClaimsRoute,
create: createSubscriptionClaimRoute,
diff --git a/packages/trpc/server/document-router/access-auth-request-2fa-email.ts b/packages/trpc/server/document-router/access-auth-request-2fa-email.ts
new file mode 100644
index 000000000..849636a0f
--- /dev/null
+++ b/packages/trpc/server/document-router/access-auth-request-2fa-email.ts
@@ -0,0 +1,94 @@
+import { TRPCError } from '@trpc/server';
+import { DateTime } from 'luxon';
+
+import { TWO_FACTOR_EMAIL_EXPIRATION_MINUTES } from '@documenso/lib/server-only/2fa/email/constants';
+import { send2FATokenEmail } from '@documenso/lib/server-only/2fa/email/send-2fa-token-email';
+import { DocumentAuth } from '@documenso/lib/types/document-auth';
+import { extractDocumentAuthMethods } from '@documenso/lib/utils/document-auth';
+import { prisma } from '@documenso/prisma';
+
+import { procedure } from '../trpc';
+import {
+ ZAccessAuthRequest2FAEmailRequestSchema,
+ ZAccessAuthRequest2FAEmailResponseSchema,
+} from './access-auth-request-2fa-email.types';
+
+export const accessAuthRequest2FAEmailRoute = procedure
+ .input(ZAccessAuthRequest2FAEmailRequestSchema)
+ .output(ZAccessAuthRequest2FAEmailResponseSchema)
+ .mutation(async ({ input, ctx }) => {
+ try {
+ const { token } = input;
+
+ const user = ctx.user;
+
+ // Get document and recipient by token
+ const document = await prisma.document.findFirst({
+ where: {
+ recipients: {
+ some: {
+ token,
+ },
+ },
+ },
+ include: {
+ recipients: {
+ where: {
+ token,
+ },
+ },
+ },
+ });
+
+ if (!document) {
+ throw new TRPCError({
+ code: 'NOT_FOUND',
+ message: 'Document not found',
+ });
+ }
+
+ const [recipient] = document.recipients;
+
+ const { derivedRecipientAccessAuth } = extractDocumentAuthMethods({
+ documentAuth: document.authOptions,
+ recipientAuth: recipient.authOptions,
+ });
+
+ if (!derivedRecipientAccessAuth.includes(DocumentAuth.TWO_FACTOR_AUTH)) {
+ throw new TRPCError({
+ code: 'BAD_REQUEST',
+ message: '2FA is not required for this document',
+ });
+ }
+
+ // if (user && recipient.email !== user.email) {
+ // throw new TRPCError({
+ // code: 'UNAUTHORIZED',
+ // message: 'User does not match recipient',
+ // });
+ // }
+
+ const expiresAt = DateTime.now().plus({ minutes: TWO_FACTOR_EMAIL_EXPIRATION_MINUTES });
+
+ await send2FATokenEmail({
+ token,
+ documentId: document.id,
+ });
+
+ return {
+ success: true,
+ expiresAt: expiresAt.toJSDate(),
+ };
+ } catch (error) {
+ console.error('Error sending access auth 2FA email:', error);
+
+ if (error instanceof TRPCError) {
+ throw error;
+ }
+
+ throw new TRPCError({
+ code: 'INTERNAL_SERVER_ERROR',
+ message: 'Failed to send 2FA email',
+ });
+ }
+ });
diff --git a/packages/trpc/server/document-router/access-auth-request-2fa-email.types.ts b/packages/trpc/server/document-router/access-auth-request-2fa-email.types.ts
new file mode 100644
index 000000000..a60e8b991
--- /dev/null
+++ b/packages/trpc/server/document-router/access-auth-request-2fa-email.types.ts
@@ -0,0 +1,17 @@
+import { z } from 'zod';
+
+export const ZAccessAuthRequest2FAEmailRequestSchema = z.object({
+ token: z.string().min(1),
+});
+
+export const ZAccessAuthRequest2FAEmailResponseSchema = z.object({
+ success: z.boolean(),
+ expiresAt: z.date(),
+});
+
+export type TAccessAuthRequest2FAEmailRequest = z.infer<
+ typeof ZAccessAuthRequest2FAEmailRequestSchema
+>;
+export type TAccessAuthRequest2FAEmailResponse = z.infer<
+ typeof ZAccessAuthRequest2FAEmailResponseSchema
+>;
diff --git a/packages/trpc/server/document-router/create-document-temporary.types.ts b/packages/trpc/server/document-router/create-document-temporary.types.ts
index 858b3835a..f7c15ee42 100644
--- a/packages/trpc/server/document-router/create-document-temporary.types.ts
+++ b/packages/trpc/server/document-router/create-document-temporary.types.ts
@@ -78,14 +78,7 @@ export const ZCreateDocumentTemporaryRequestSchema = z.object({
.optional(),
}),
)
- .refine(
- (recipients) => {
- const emails = recipients.map((recipient) => recipient.email);
- return new Set(emails).size === emails.length;
- },
- { message: 'Recipients must have unique emails' },
- )
.optional(),
meta: z
.object({
diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts
index c8c835282..c33a90849 100644
--- a/packages/trpc/server/document-router/router.ts
+++ b/packages/trpc/server/document-router/router.ts
@@ -1,4 +1,5 @@
import { router } from '../trpc';
+import { accessAuthRequest2FAEmailRoute } from './access-auth-request-2fa-email';
import { createDocumentRoute } from './create-document';
import { createDocumentTemporaryRoute } from './create-document-temporary';
import { deleteDocumentRoute } from './delete-document';
@@ -40,6 +41,10 @@ export const documentRouter = router({
getDocumentByToken: getDocumentByTokenRoute,
findDocumentsInternal: findDocumentsInternalRoute,
+ accessAuth: router({
+ request2FAEmail: accessAuthRequest2FAEmailRoute,
+ }),
+
auditLog: {
find: findDocumentAuditLogsRoute,
download: downloadDocumentAuditLogsRoute,
diff --git a/packages/trpc/server/embedding-router/create-embedding-document.types.ts b/packages/trpc/server/embedding-router/create-embedding-document.types.ts
index 662136c17..40547d77b 100644
--- a/packages/trpc/server/embedding-router/create-embedding-document.types.ts
+++ b/packages/trpc/server/embedding-router/create-embedding-document.types.ts
@@ -47,14 +47,7 @@ export const ZCreateEmbeddingDocumentRequestSchema = z.object({
.optional(),
}),
)
- .refine(
- (recipients) => {
- const emails = recipients.map((recipient) => recipient.email);
- return new Set(emails).size === emails.length;
- },
- { message: 'Recipients must have unique emails' },
- )
.optional(),
meta: z
.object({
diff --git a/packages/trpc/server/embedding-router/update-embedding-document.types.ts b/packages/trpc/server/embedding-router/update-embedding-document.types.ts
index 183ede703..c7521e91b 100644
--- a/packages/trpc/server/embedding-router/update-embedding-document.types.ts
+++ b/packages/trpc/server/embedding-router/update-embedding-document.types.ts
@@ -30,36 +30,27 @@ export const ZUpdateEmbeddingDocumentRequestSchema = z.object({
documentId: z.number(),
title: ZDocumentTitleSchema,
externalId: ZDocumentExternalIdSchema.optional(),
- recipients: z
- .array(
- z.object({
- id: z.number().optional(),
- email: z.string().toLowerCase().email().min(1),
- name: z.string(),
- role: z.nativeEnum(RecipientRole),
- signingOrder: z.number().optional(),
- fields: ZFieldAndMetaSchema.and(
- z.object({
- id: z.number().optional(),
- pageNumber: ZFieldPageNumberSchema,
- pageX: ZFieldPageXSchema,
- pageY: ZFieldPageYSchema,
- width: ZFieldWidthSchema,
- height: ZFieldHeightSchema,
- }),
- )
- .array()
- .optional(),
- }),
- )
- .refine(
- (recipients) => {
- const emails = recipients.map((recipient) => recipient.email);
-
- return new Set(emails).size === emails.length;
- },
- { message: 'Recipients must have unique emails' },
- ),
+ recipients: z.array(
+ z.object({
+ id: z.number().optional(),
+ email: z.string().toLowerCase().email().min(1),
+ name: z.string(),
+ role: z.nativeEnum(RecipientRole),
+ signingOrder: z.number().optional(),
+ fields: ZFieldAndMetaSchema.and(
+ z.object({
+ id: z.number().optional(),
+ pageNumber: ZFieldPageNumberSchema,
+ pageX: ZFieldPageXSchema,
+ pageY: ZFieldPageYSchema,
+ width: ZFieldWidthSchema,
+ height: ZFieldHeightSchema,
+ }),
+ )
+ .array()
+ .optional(),
+ }),
+ ),
meta: z
.object({
subject: ZDocumentMetaSubjectSchema.optional(),
diff --git a/packages/trpc/server/field-router/router.ts b/packages/trpc/server/field-router/router.ts
index 1e022749c..462635544 100644
--- a/packages/trpc/server/field-router/router.ts
+++ b/packages/trpc/server/field-router/router.ts
@@ -274,6 +274,7 @@ export const fieldRouter = router({
fields: fields.map((field) => ({
id: field.nativeId,
signerEmail: field.signerEmail,
+ recipientId: field.recipientId,
type: field.type,
pageNumber: field.pageNumber,
pageX: field.pageX,
@@ -513,6 +514,7 @@ export const fieldRouter = router({
fields: fields.map((field) => ({
id: field.nativeId,
signerEmail: field.signerEmail,
+ recipientId: field.recipientId,
type: field.type,
pageNumber: field.pageNumber,
pageX: field.pageX,
diff --git a/packages/trpc/server/field-router/schema.ts b/packages/trpc/server/field-router/schema.ts
index fcb26e0f2..89912f5d8 100644
--- a/packages/trpc/server/field-router/schema.ts
+++ b/packages/trpc/server/field-router/schema.ts
@@ -114,6 +114,7 @@ export const ZSetDocumentFieldsRequestSchema = z.object({
nativeId: z.number().optional(),
type: z.nativeEnum(FieldType),
signerEmail: z.string().min(1),
+ recipientId: z.number().min(1),
pageNumber: z.number().min(1),
pageX: z.number().min(0),
pageY: z.number().min(0),
@@ -136,6 +137,7 @@ export const ZSetFieldsForTemplateRequestSchema = z.object({
nativeId: z.number().optional(),
type: z.nativeEnum(FieldType),
signerEmail: z.string().min(1),
+ recipientId: z.number().min(1),
pageNumber: z.number().min(1),
pageX: z.number().min(0),
pageY: z.number().min(0),
diff --git a/packages/trpc/server/organisation-router/update-organisation-settings.ts b/packages/trpc/server/organisation-router/update-organisation-settings.ts
index 08c4dceb1..661fbf950 100644
--- a/packages/trpc/server/organisation-router/update-organisation-settings.ts
+++ b/packages/trpc/server/organisation-router/update-organisation-settings.ts
@@ -1,3 +1,5 @@
+import { OrganisationType } from '@prisma/client';
+
import { ORGANISATION_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/organisations';
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
import { buildOrganisationWhereQuery } from '@documenso/lib/utils/organisations';
@@ -104,6 +106,19 @@ export const updateOrganisationSettingsRoute = authenticatedProcedure
});
}
+ const isPersonalOrganisation = organisation.type === OrganisationType.PERSONAL;
+ const currentIncludeSenderDetails =
+ organisation.organisationGlobalSettings.includeSenderDetails;
+
+ const isChangingIncludeSenderDetails =
+ includeSenderDetails !== undefined && includeSenderDetails !== currentIncludeSenderDetails;
+
+ if (isPersonalOrganisation && isChangingIncludeSenderDetails) {
+ throw new AppError(AppErrorCode.INVALID_BODY, {
+ message: 'Personal organisations cannot update the sender details',
+ });
+ }
+
await prisma.organisation.update({
where: {
id: organisationId,
diff --git a/packages/trpc/server/recipient-router/router.ts b/packages/trpc/server/recipient-router/router.ts
index 876e21942..401251b27 100644
--- a/packages/trpc/server/recipient-router/router.ts
+++ b/packages/trpc/server/recipient-router/router.ts
@@ -525,7 +525,7 @@ export const recipientRouter = router({
completeDocumentWithToken: procedure
.input(ZCompleteDocumentWithTokenMutationSchema)
.mutation(async ({ input, ctx }) => {
- const { token, documentId, authOptions, nextSigner } = input;
+ const { token, documentId, authOptions, accessAuthOptions, nextSigner } = input;
ctx.logger.info({
input: {
@@ -537,6 +537,7 @@ export const recipientRouter = router({
token,
documentId,
authOptions,
+ accessAuthOptions,
nextSigner,
userId: ctx.user?.id,
requestMetadata: ctx.metadata.requestMetadata,
diff --git a/packages/trpc/server/recipient-router/schema.ts b/packages/trpc/server/recipient-router/schema.ts
index dbc25a497..2307cd6cb 100644
--- a/packages/trpc/server/recipient-router/schema.ts
+++ b/packages/trpc/server/recipient-router/schema.ts
@@ -3,6 +3,7 @@ import { z } from 'zod';
import { isTemplateRecipientEmailPlaceholder } from '@documenso/lib/constants/template';
import {
+ ZRecipientAccessAuthSchema,
ZRecipientAccessAuthTypesSchema,
ZRecipientActionAuthSchema,
ZRecipientActionAuthTypesSchema,
@@ -50,16 +51,7 @@ export const ZCreateDocumentRecipientResponseSchema = ZRecipientLiteSchema;
export const ZCreateDocumentRecipientsRequestSchema = z.object({
documentId: z.number(),
- recipients: z.array(ZCreateRecipientSchema).refine(
- (recipients) => {
- const emails = recipients.map((recipient) => recipient.email.toLowerCase());
-
- return new Set(emails).size === emails.length;
- },
- {
- message: 'Recipients must have unique emails',
- },
- ),
+ recipients: z.array(ZCreateRecipientSchema),
});
export const ZCreateDocumentRecipientsResponseSchema = z.object({
@@ -75,18 +67,7 @@ export const ZUpdateDocumentRecipientResponseSchema = ZRecipientSchema;
export const ZUpdateDocumentRecipientsRequestSchema = z.object({
documentId: z.number(),
- recipients: z.array(ZUpdateRecipientSchema).refine(
- (recipients) => {
- const emails = recipients
- .filter((recipient) => recipient.email !== undefined)
- .map((recipient) => recipient.email?.toLowerCase());
-
- return new Set(emails).size === emails.length;
- },
- {
- message: 'Recipients must have unique emails',
- },
- ),
+ recipients: z.array(ZUpdateRecipientSchema),
});
export const ZUpdateDocumentRecipientsResponseSchema = z.object({
@@ -97,29 +78,19 @@ export const ZDeleteDocumentRecipientRequestSchema = z.object({
recipientId: z.number(),
});
-export const ZSetDocumentRecipientsRequestSchema = z
- .object({
- documentId: z.number(),
- recipients: z.array(
- z.object({
- nativeId: z.number().optional(),
- email: z.string().toLowerCase().email().min(1).max(254),
- name: z.string().max(255),
- role: z.nativeEnum(RecipientRole),
- signingOrder: z.number().optional(),
- actionAuth: z.array(ZRecipientActionAuthTypesSchema).optional().default([]),
- }),
- ),
- })
- .refine(
- (schema) => {
- const emails = schema.recipients.map((recipient) => recipient.email.toLowerCase());
-
- return new Set(emails).size === emails.length;
- },
- // Dirty hack to handle errors when .root is populated for an array type
- { message: 'Recipients must have unique emails', path: ['recipients__root'] },
- );
+export const ZSetDocumentRecipientsRequestSchema = z.object({
+ documentId: z.number(),
+ recipients: z.array(
+ z.object({
+ nativeId: z.number().optional(),
+ email: z.string().toLowerCase().email().min(1).max(254),
+ name: z.string().max(255),
+ role: z.nativeEnum(RecipientRole),
+ signingOrder: z.number().optional(),
+ actionAuth: z.array(ZRecipientActionAuthTypesSchema).optional().default([]),
+ }),
+ ),
+});
export const ZSetDocumentRecipientsResponseSchema = z.object({
recipients: ZRecipientLiteSchema.array(),
@@ -134,16 +105,7 @@ export const ZCreateTemplateRecipientResponseSchema = ZRecipientLiteSchema;
export const ZCreateTemplateRecipientsRequestSchema = z.object({
templateId: z.number(),
- recipients: z.array(ZCreateRecipientSchema).refine(
- (recipients) => {
- const emails = recipients.map((recipient) => recipient.email);
-
- return new Set(emails).size === emails.length;
- },
- {
- message: 'Recipients must have unique emails',
- },
- ),
+ recipients: z.array(ZCreateRecipientSchema),
});
export const ZCreateTemplateRecipientsResponseSchema = z.object({
@@ -159,18 +121,7 @@ export const ZUpdateTemplateRecipientResponseSchema = ZRecipientSchema;
export const ZUpdateTemplateRecipientsRequestSchema = z.object({
templateId: z.number(),
- recipients: z.array(ZUpdateRecipientSchema).refine(
- (recipients) => {
- const emails = recipients
- .filter((recipient) => recipient.email !== undefined)
- .map((recipient) => recipient.email);
-
- return new Set(emails).size === emails.length;
- },
- {
- message: 'Recipients must have unique emails',
- },
- ),
+ recipients: z.array(ZUpdateRecipientSchema),
});
export const ZUpdateTemplateRecipientsResponseSchema = z.object({
@@ -181,43 +132,30 @@ export const ZDeleteTemplateRecipientRequestSchema = z.object({
recipientId: z.number(),
});
-export const ZSetTemplateRecipientsRequestSchema = z
- .object({
- templateId: z.number(),
- recipients: z.array(
- z.object({
- nativeId: z.number().optional(),
- email: z
- .string()
- .toLowerCase()
- .refine(
- (email) => {
- return (
- isTemplateRecipientEmailPlaceholder(email) ||
- z.string().email().safeParse(email).success
- );
- },
- { message: 'Please enter a valid email address' },
- ),
- name: z.string(),
- role: z.nativeEnum(RecipientRole),
- signingOrder: z.number().optional(),
- actionAuth: z.array(ZRecipientActionAuthTypesSchema).optional().default([]),
- }),
- ),
- })
- .refine(
- (schema) => {
- // Filter out placeholder emails and only check uniqueness for actual emails
- const nonPlaceholderEmails = schema.recipients
- .map((recipient) => recipient.email)
- .filter((email) => !isTemplateRecipientEmailPlaceholder(email));
-
- return new Set(nonPlaceholderEmails).size === nonPlaceholderEmails.length;
- },
- // Dirty hack to handle errors when .root is populated for an array type
- { message: 'Recipients must have unique emails', path: ['recipients__root'] },
- );
+export const ZSetTemplateRecipientsRequestSchema = z.object({
+ templateId: z.number(),
+ recipients: z.array(
+ z.object({
+ nativeId: z.number().optional(),
+ email: z
+ .string()
+ .toLowerCase()
+ .refine(
+ (email) => {
+ return (
+ isTemplateRecipientEmailPlaceholder(email) ||
+ z.string().email().safeParse(email).success
+ );
+ },
+ { message: 'Please enter a valid email address' },
+ ),
+ name: z.string(),
+ role: z.nativeEnum(RecipientRole),
+ signingOrder: z.number().optional(),
+ actionAuth: z.array(ZRecipientActionAuthTypesSchema).optional().default([]),
+ }),
+ ),
+});
export const ZSetTemplateRecipientsResponseSchema = z.object({
recipients: ZRecipientLiteSchema.array(),
@@ -227,6 +165,7 @@ export const ZCompleteDocumentWithTokenMutationSchema = z.object({
token: z.string(),
documentId: z.number(),
authOptions: ZRecipientActionAuthSchema.optional(),
+ accessAuthOptions: ZRecipientAccessAuthSchema.optional(),
nextSigner: z
.object({
email: z.string().email().max(254),
diff --git a/packages/trpc/server/team-router/update-team-settings.ts b/packages/trpc/server/team-router/update-team-settings.ts
index f3805366c..57a9329e0 100644
--- a/packages/trpc/server/team-router/update-team-settings.ts
+++ b/packages/trpc/server/team-router/update-team-settings.ts
@@ -1,7 +1,10 @@
import { Prisma } from '@prisma/client';
+import { OrganisationType } from '@prisma/client';
+import { ORGANISATION_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/organisations';
import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams';
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
+import { buildOrganisationWhereQuery } from '@documenso/lib/utils/organisations';
import { buildTeamWhereQuery } from '@documenso/lib/utils/teams';
import { prisma } from '@documenso/prisma';
@@ -97,6 +100,35 @@ export const updateTeamSettingsRoute = authenticatedProcedure
}
}
+ const organisation = await prisma.organisation.findFirst({
+ where: buildOrganisationWhereQuery({
+ organisationId: team.organisationId,
+ userId: user.id,
+ roles: ORGANISATION_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_ORGANISATION'],
+ }),
+ select: {
+ type: true,
+ organisationGlobalSettings: {
+ select: {
+ includeSenderDetails: true,
+ },
+ },
+ },
+ });
+
+ const isPersonalOrganisation = organisation?.type === OrganisationType.PERSONAL;
+ const currentIncludeSenderDetails =
+ organisation?.organisationGlobalSettings.includeSenderDetails;
+
+ const isChangingIncludeSenderDetails =
+ includeSenderDetails !== undefined && includeSenderDetails !== currentIncludeSenderDetails;
+
+ if (isPersonalOrganisation && isChangingIncludeSenderDetails) {
+ throw new AppError(AppErrorCode.INVALID_BODY, {
+ message: 'Personal teams cannot update the sender details',
+ });
+ }
+
await prisma.team.update({
where: {
id: teamId,
diff --git a/packages/trpc/server/template-router/schema.ts b/packages/trpc/server/template-router/schema.ts
index 452ade10c..a00717f33 100644
--- a/packages/trpc/server/template-router/schema.ts
+++ b/packages/trpc/server/template-router/schema.ts
@@ -101,12 +101,7 @@ export const ZCreateDocumentFromTemplateRequestSchema = z.object({
name: z.string().max(255).optional(),
}),
)
- .describe('The information of the recipients to create the document with.')
- .refine((recipients) => {
- const emails = recipients.map((signer) => signer.email);
-
- return new Set(emails).size === emails.length;
- }, 'Recipients must have unique emails'),
+ .describe('The information of the recipients to create the document with.'),
distributeDocument: z
.boolean()
.describe('Whether to create the document as pending and distribute it to recipients.')
diff --git a/packages/ui/components/document/document-read-only-fields.tsx b/packages/ui/components/document/document-read-only-fields.tsx
index d1c96f8a9..4ea0d6c89 100644
--- a/packages/ui/components/document/document-read-only-fields.tsx
+++ b/packages/ui/components/document/document-read-only-fields.tsx
@@ -105,6 +105,7 @@ export const DocumentReadOnlyFields = ({
(null);
@@ -103,6 +110,7 @@ export function FieldRootContainer({ field, children, color, className }: FieldR
ref={ref}
data-field-type={field.type}
data-inserted={field.inserted ? 'true' : 'false'}
+ data-readonly={readonly ? 'true' : 'false'}
className={cn(
'field--FieldRootContainer field-card-container dark-mode-disabled group relative z-20 flex h-full w-full items-center rounded-[2px] bg-white/90 ring-2 ring-gray-200 transition-all',
color?.base,
diff --git a/packages/ui/primitives/badge.tsx b/packages/ui/primitives/badge.tsx
index 57418dab6..58e1990f7 100644
--- a/packages/ui/primitives/badge.tsx
+++ b/packages/ui/primitives/badge.tsx
@@ -39,7 +39,9 @@ export interface BadgeProps
VariantProps {}
function Badge({ className, variant, size, ...props }: BadgeProps) {
- return
;
+ return (
+
+ );
}
export { Badge, badgeVariants };
diff --git a/packages/ui/primitives/document-flow/add-fields.tsx b/packages/ui/primitives/document-flow/add-fields.tsx
index 820696e0e..eef021fe0 100644
--- a/packages/ui/primitives/document-flow/add-fields.tsx
+++ b/packages/ui/primitives/document-flow/add-fields.tsx
@@ -1,5 +1,6 @@
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
+import { zodResolver } from '@hookform/resolvers/zod';
import { msg } from '@lingui/core/macro';
import { useLingui } from '@lingui/react';
import { Trans } from '@lingui/react/macro';
@@ -46,7 +47,7 @@ import { Form } from '../form/form';
import { RecipientSelector } from '../recipient-selector';
import { useStep } from '../stepper';
import { useToast } from '../use-toast';
-import type { TAddFieldsFormSchema } from './add-fields.types';
+import { type TAddFieldsFormSchema, ZAddFieldsFormSchema } from './add-fields.types';
import {
DocumentFlowFormContainerActions,
DocumentFlowFormContainerContent,
@@ -75,6 +76,7 @@ export type FieldFormType = {
pageWidth: number;
pageHeight: number;
signerEmail: string;
+ recipientId: number;
fieldMeta?: FieldMeta;
};
@@ -127,9 +129,11 @@ export const AddFieldsFormPartial = ({
pageHeight: Number(field.height),
signerEmail:
recipients.find((recipient) => recipient.id === field.recipientId)?.email ?? '',
+ recipientId: field.recipientId,
fieldMeta: field.fieldMeta ? ZFieldMetaSchema.parse(field.fieldMeta) : undefined,
})),
},
+ resolver: zodResolver(ZAddFieldsFormSchema),
});
useHotkeys(['ctrl+c', 'meta+c'], (evt) => onFieldCopy(evt));
@@ -323,6 +327,7 @@ export const AddFieldsFormPartial = ({
const field = {
formId: nanoid(12),
+ nativeId: undefined,
type: selectedField,
pageNumber,
pageX,
@@ -330,6 +335,7 @@ export const AddFieldsFormPartial = ({
pageWidth: fieldPageWidth,
pageHeight: fieldPageHeight,
signerEmail: selectedSigner.email,
+ recipientId: selectedSigner.id,
fieldMeta: undefined,
};
@@ -414,6 +420,7 @@ export const AddFieldsFormPartial = ({
nativeId: undefined,
formId: nanoid(12),
signerEmail: selectedSigner?.email ?? lastActiveField.signerEmail,
+ recipientId: selectedSigner?.id ?? lastActiveField.recipientId,
pageX: lastActiveField.pageX + 3,
pageY: lastActiveField.pageY + 3,
};
@@ -438,6 +445,7 @@ export const AddFieldsFormPartial = ({
nativeId: undefined,
formId: nanoid(12),
signerEmail: selectedSigner?.email ?? lastActiveField.signerEmail,
+ recipientId: selectedSigner?.id ?? lastActiveField.recipientId,
pageNumber,
};
@@ -470,6 +478,7 @@ export const AddFieldsFormPartial = ({
nativeId: undefined,
formId: nanoid(12),
signerEmail: selectedSigner?.email ?? copiedField.signerEmail,
+ recipientId: selectedSigner?.id ?? copiedField.recipientId,
pageX: copiedField.pageX + 3,
pageY: copiedField.pageY + 3,
});
@@ -663,7 +672,7 @@ export const AddFieldsFormPartial = ({
{isDocumentPdfLoaded &&
localFields.map((field, index) => {
- const recipientIndex = recipients.findIndex((r) => r.email === field.signerEmail);
+ const recipientIndex = recipients.findIndex((r) => r.id === field.recipientId);
const hasFieldError =
emptyCheckboxFields.find((f) => f.formId === field.formId) ||
emptyRadioFields.find((f) => f.formId === field.formId) ||
diff --git a/packages/ui/primitives/document-flow/add-fields.types.ts b/packages/ui/primitives/document-flow/add-fields.types.ts
index 6ec2fade3..7e1a4a170 100644
--- a/packages/ui/primitives/document-flow/add-fields.types.ts
+++ b/packages/ui/primitives/document-flow/add-fields.types.ts
@@ -10,6 +10,7 @@ export const ZAddFieldsFormSchema = z.object({
nativeId: z.number().optional(),
type: z.nativeEnum(FieldType),
signerEmail: z.string().min(1),
+ recipientId: z.number().min(1),
pageNumber: z.number().min(1),
pageX: z.number().min(0),
pageY: z.number().min(0),
diff --git a/packages/ui/primitives/document-flow/add-signers.tsx b/packages/ui/primitives/document-flow/add-signers.tsx
index 43caa8fe1..2010775c4 100644
--- a/packages/ui/primitives/document-flow/add-signers.tsx
+++ b/packages/ui/primitives/document-flow/add-signers.tsx
@@ -53,6 +53,10 @@ import {
import { SigningOrderConfirmation } from './signing-order-confirmation';
import type { DocumentFlowStep } from './types';
+type AutoSaveResponse = {
+ recipients: Recipient[];
+};
+
export type AddSignersFormProps = {
documentFlow: DocumentFlowStep;
recipients: Recipient[];
@@ -60,7 +64,7 @@ export type AddSignersFormProps = {
signingOrder?: DocumentSigningOrder | null;
allowDictateNextSigner?: boolean;
onSubmit: (_data: TAddSignersFormSchema) => void;
- onAutoSave: (_data: TAddSignersFormSchema) => Promise;
+ onAutoSave: (_data: TAddSignersFormSchema) => Promise;
isDocumentPdfLoaded: boolean;
};
@@ -208,7 +212,44 @@ export const AddSignersFormPartial = ({
const formData = form.getValues();
- scheduleSave(formData);
+ scheduleSave(formData, (response) => {
+ // Sync the response recipients back to form state to prevent duplicates
+ if (response?.recipients) {
+ const currentSigners = form.getValues('signers');
+ const updatedSigners = currentSigners.map((signer) => {
+ // Find the matching recipient from the response using nativeId
+ const matchingRecipient = response.recipients.find(
+ (recipient) => recipient.id === signer.nativeId,
+ );
+
+ if (matchingRecipient) {
+ // Update the signer with the server-returned data, especially the ID
+ return {
+ ...signer,
+ nativeId: matchingRecipient.id,
+ };
+ }
+
+ // For new signers without nativeId, match by email and update with server ID
+ if (!signer.nativeId) {
+ const newRecipient = response.recipients.find(
+ (recipient) => recipient.email === signer.email,
+ );
+ if (newRecipient) {
+ return {
+ ...signer,
+ nativeId: newRecipient.id,
+ };
+ }
+ }
+
+ return signer;
+ });
+
+ // Update the form state with the synced data
+ form.setValue('signers', updatedSigners, { shouldValidate: false });
+ }
+ });
};
const emptySignerIndex = watchedSigners.findIndex((signer) => !signer.name && !signer.email);
@@ -714,7 +755,6 @@ export const AddSignersFormPartial = ({
handleRecipientAutoCompleteSelect(index, suggestion)
}
onSearchQueryChange={(query) => {
- console.log('onSearchQueryChange', query);
field.onChange(query);
setRecipientSearchQuery(query);
}}
diff --git a/packages/ui/primitives/document-flow/add-signers.types.ts b/packages/ui/primitives/document-flow/add-signers.types.ts
index 05e6fea73..ec56c253b 100644
--- a/packages/ui/primitives/document-flow/add-signers.types.ts
+++ b/packages/ui/primitives/document-flow/add-signers.types.ts
@@ -4,33 +4,23 @@ import { z } from 'zod';
import { ZRecipientActionAuthTypesSchema } from '@documenso/lib/types/document-auth';
-export const ZAddSignersFormSchema = z
- .object({
- signers: z.array(
- z.object({
- formId: z.string().min(1),
- nativeId: z.number().optional(),
- email: z
- .string()
- .email({ message: msg`Invalid email`.id })
- .min(1),
- name: z.string(),
- role: z.nativeEnum(RecipientRole),
- signingOrder: z.number().optional(),
- actionAuth: z.array(ZRecipientActionAuthTypesSchema).optional().default([]),
- }),
- ),
- signingOrder: z.nativeEnum(DocumentSigningOrder),
- allowDictateNextSigner: z.boolean().default(false),
- })
- .refine(
- (schema) => {
- const emails = schema.signers.map((signer) => signer.email.toLowerCase());
-
- return new Set(emails).size === emails.length;
- },
- // Dirty hack to handle errors when .root is populated for an array type
- { message: msg`Signers must have unique emails`.id, path: ['signers__root'] },
- );
+export const ZAddSignersFormSchema = z.object({
+ signers: z.array(
+ z.object({
+ formId: z.string().min(1),
+ nativeId: z.number().optional(),
+ email: z
+ .string()
+ .email({ message: msg`Invalid email`.id })
+ .min(1),
+ name: z.string(),
+ role: z.nativeEnum(RecipientRole),
+ signingOrder: z.number().optional(),
+ actionAuth: z.array(ZRecipientActionAuthTypesSchema).optional().default([]),
+ }),
+ ),
+ signingOrder: z.nativeEnum(DocumentSigningOrder),
+ allowDictateNextSigner: z.boolean().default(false),
+});
export type TAddSignersFormSchema = z.infer;
diff --git a/packages/ui/primitives/document-flow/field-item.tsx b/packages/ui/primitives/document-flow/field-item.tsx
index da09ed471..40c2684da 100644
--- a/packages/ui/primitives/document-flow/field-item.tsx
+++ b/packages/ui/primitives/document-flow/field-item.tsx
@@ -299,6 +299,8 @@ export const FieldItem = ({
}}
ref={$el}
data-field-id={field.nativeId}
+ data-field-type={field.type}
+ data-recipient-id={field.recipientId}
>
diff --git a/packages/ui/primitives/document-flow/types.ts b/packages/ui/primitives/document-flow/types.ts
index 2e57f0ff0..1551ed72c 100644
--- a/packages/ui/primitives/document-flow/types.ts
+++ b/packages/ui/primitives/document-flow/types.ts
@@ -8,19 +8,14 @@ import { ZFieldMetaSchema } from '@documenso/lib/types/field-meta';
export const ZDocumentFlowFormSchema = z.object({
title: z.string().min(1),
- signers: z
- .array(
- z.object({
- formId: z.string().min(1),
- nativeId: z.number().optional(),
- email: z.string().min(1).email(),
- name: z.string(),
- }),
- )
- .refine((signers) => {
- const emails = signers.map((signer) => signer.email);
- return new Set(emails).size === emails.length;
- }, 'Signers must have unique emails'),
+ signers: z.array(
+ z.object({
+ formId: z.string().min(1),
+ nativeId: z.number().optional(),
+ email: z.string().min(1).email(),
+ name: z.string(),
+ }),
+ ),
fields: z.array(
z.object({
@@ -28,6 +23,7 @@ export const ZDocumentFlowFormSchema = z.object({
nativeId: z.number().optional(),
type: z.nativeEnum(FieldType),
signerEmail: z.string().min(1).optional(),
+ recipientId: z.number().min(1),
pageNumber: z.number().min(1),
pageX: z.number().min(0),
pageY: z.number().min(0),
diff --git a/packages/ui/primitives/template-flow/add-template-fields.tsx b/packages/ui/primitives/template-flow/add-template-fields.tsx
index b6471bc61..7db417036 100644
--- a/packages/ui/primitives/template-flow/add-template-fields.tsx
+++ b/packages/ui/primitives/template-flow/add-template-fields.tsx
@@ -1,5 +1,6 @@
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
+import { zodResolver } from '@hookform/resolvers/zod';
import { msg } from '@lingui/core/macro';
import { useLingui } from '@lingui/react';
import { Trans } from '@lingui/react/macro';
@@ -61,7 +62,10 @@ import type { FieldFormType } from '../document-flow/add-fields';
import { FieldAdvancedSettings } from '../document-flow/field-item-advanced-settings';
import { Form } from '../form/form';
import { useStep } from '../stepper';
-import type { TAddTemplateFieldsFormSchema } from './add-template-fields.types';
+import {
+ type TAddTemplateFieldsFormSchema,
+ ZAddTemplateFieldsFormSchema,
+} from './add-template-fields.types';
const MIN_HEIGHT_PX = 12;
const MIN_WIDTH_PX = 36;
@@ -112,7 +116,7 @@ export const AddTemplateFieldsFormPartial = ({
pageY: Number(field.positionY),
pageWidth: Number(field.width),
pageHeight: Number(field.height),
- signerId: field.recipientId ?? -1,
+ recipientId: field.recipientId ?? -1,
signerEmail:
recipients.find((recipient) => recipient.id === field.recipientId)?.email ?? '',
signerToken:
@@ -120,6 +124,7 @@ export const AddTemplateFieldsFormPartial = ({
fieldMeta: field.fieldMeta ? ZFieldMetaSchema.parse(field.fieldMeta) : undefined,
})),
},
+ resolver: zodResolver(ZAddTemplateFieldsFormSchema),
});
const onFormSubmit = form.handleSubmit(onSubmit);
@@ -170,7 +175,7 @@ export const AddTemplateFieldsFormPartial = ({
nativeId: undefined,
formId: nanoid(12),
signerEmail: selectedSigner?.email ?? lastActiveField.signerEmail,
- signerId: selectedSigner?.id ?? lastActiveField.signerId,
+ recipientId: selectedSigner?.id ?? lastActiveField.recipientId,
signerToken: selectedSigner?.token ?? lastActiveField.signerToken,
pageX: lastActiveField.pageX + 3,
pageY: lastActiveField.pageY + 3,
@@ -197,7 +202,7 @@ export const AddTemplateFieldsFormPartial = ({
nativeId: undefined,
formId: nanoid(12),
signerEmail: selectedSigner?.email ?? lastActiveField.signerEmail,
- signerId: selectedSigner?.id ?? lastActiveField.signerId,
+ recipientId: selectedSigner?.id ?? lastActiveField.recipientId,
signerToken: selectedSigner?.token ?? lastActiveField.signerToken,
pageNumber,
};
@@ -240,7 +245,7 @@ export const AddTemplateFieldsFormPartial = ({
formId: nanoid(12),
nativeId: undefined,
signerEmail: selectedSigner?.email ?? copiedField.signerEmail,
- signerId: selectedSigner?.id ?? copiedField.signerId,
+ recipientId: selectedSigner?.id ?? copiedField.recipientId,
signerToken: selectedSigner?.token ?? copiedField.signerToken,
pageX: copiedField.pageX + 3,
pageY: copiedField.pageY + 3,
@@ -371,7 +376,7 @@ export const AddTemplateFieldsFormPartial = ({
pageWidth: fieldPageWidth,
pageHeight: fieldPageHeight,
signerEmail: selectedSigner.email,
- signerId: selectedSigner.id,
+ recipientId: selectedSigner.id,
signerToken: selectedSigner.token ?? '',
fieldMeta: undefined,
};
@@ -597,14 +602,14 @@ export const AddTemplateFieldsFormPartial = ({
)}
{localFields.map((field, index) => {
- const recipientIndex = recipients.findIndex((r) => r.email === field.signerEmail);
+ const recipientIndex = recipients.findIndex((r) => r.id === field.recipientId);
return (
void;
- onAutoSave: (_data: TAddTemplatePlacholderRecipientsFormSchema) => Promise;
+ onAutoSave: (_data: TAddTemplatePlacholderRecipientsFormSchema) => Promise;
isDocumentPdfLoaded: boolean;
};
@@ -146,7 +150,44 @@ export const AddTemplatePlaceholderRecipientsFormPartial = ({
const formData = form.getValues();
- scheduleSave(formData);
+ scheduleSave(formData, (response) => {
+ // Sync the response recipients back to form state to prevent duplicates
+ if (response?.recipients) {
+ const currentSigners = form.getValues('signers');
+ const updatedSigners = currentSigners.map((signer) => {
+ // Find the matching recipient from the response using nativeId
+ const matchingRecipient = response.recipients.find(
+ (recipient) => recipient.id === signer.nativeId,
+ );
+
+ if (matchingRecipient) {
+ // Update the signer with the server-returned data, especially the ID
+ return {
+ ...signer,
+ nativeId: matchingRecipient.id,
+ };
+ }
+
+ // For new signers without nativeId, match by email and update with server ID
+ if (!signer.nativeId) {
+ const newRecipient = response.recipients.find(
+ (recipient) => recipient.email === signer.email,
+ );
+ if (newRecipient) {
+ return {
+ ...signer,
+ nativeId: newRecipient.id,
+ };
+ }
+ }
+
+ return signer;
+ });
+
+ // Update the form state with the synced data
+ form.setValue('signers', updatedSigners, { shouldValidate: false });
+ }
+ });
};
// useEffect(() => {
diff --git a/packages/ui/primitives/template-flow/add-template-placeholder-recipients.types.ts b/packages/ui/primitives/template-flow/add-template-placeholder-recipients.types.ts
index 187f99e57..538f3cef1 100644
--- a/packages/ui/primitives/template-flow/add-template-placeholder-recipients.types.ts
+++ b/packages/ui/primitives/template-flow/add-template-placeholder-recipients.types.ts
@@ -1,7 +1,6 @@
import { DocumentSigningOrder, RecipientRole } from '@prisma/client';
import { z } from 'zod';
-import { TEMPLATE_RECIPIENT_EMAIL_PLACEHOLDER_REGEX } from '@documenso/lib/constants/template';
import { ZRecipientActionAuthTypesSchema } from '@documenso/lib/types/document-auth';
export const ZAddTemplatePlacholderRecipientsFormSchema = z
@@ -20,17 +19,7 @@ export const ZAddTemplatePlacholderRecipientsFormSchema = z
signingOrder: z.nativeEnum(DocumentSigningOrder),
allowDictateNextSigner: z.boolean().default(false),
})
- .refine(
- (schema) => {
- const nonPlaceholderEmails = schema.signers
- .map((signer) => signer.email.toLowerCase())
- .filter((email) => !TEMPLATE_RECIPIENT_EMAIL_PLACEHOLDER_REGEX.test(email));
- return new Set(nonPlaceholderEmails).size === nonPlaceholderEmails.length;
- },
- // Dirty hack to handle errors when .root is populated for an array type
- { message: 'Signers must have unique emails', path: ['signers__root'] },
- )
.refine(
/*
Since placeholder emails are empty, we need to check that the names are unique.