feat: signing volume (#1358)

adds a signing volume and leaderboard section to the admin panel
This commit is contained in:
Ephraim Duncan
2024-12-03 00:27:22 +00:00
committed by GitHub
parent 9e8d0ac906
commit bdd33bd335
15 changed files with 685 additions and 61 deletions

View File

@ -0,0 +1,169 @@
'use client';
import { useEffect, useMemo, useState, useTransition } from 'react';
import { msg } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { ChevronDownIcon as CaretSortIcon, Loader } from 'lucide-react';
import { useDebouncedValue } from '@documenso/lib/client-only/hooks/use-debounced-value';
import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params';
import type { DataTableColumnDef } from '@documenso/ui/primitives/data-table';
import { DataTable } from '@documenso/ui/primitives/data-table';
import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination';
import { Input } from '@documenso/ui/primitives/input';
export type SigningVolume = {
id: number;
name: string;
signingVolume: number;
createdAt: Date;
planId: string;
};
type LeaderboardTableProps = {
signingVolume: SigningVolume[];
totalPages: number;
perPage: number;
page: number;
sortBy: 'name' | 'createdAt' | 'signingVolume';
sortOrder: 'asc' | 'desc';
};
export const LeaderboardTable = ({
signingVolume,
totalPages,
perPage,
page,
sortBy,
sortOrder,
}: LeaderboardTableProps) => {
const { _, i18n } = useLingui();
const [isPending, startTransition] = useTransition();
const updateSearchParams = useUpdateSearchParams();
const [searchString, setSearchString] = useState('');
const debouncedSearchString = useDebouncedValue(searchString, 1000);
const columns = useMemo(() => {
return [
{
header: () => (
<div
className="flex cursor-pointer items-center"
onClick={() => handleColumnSort('name')}
>
{_(msg`Name`)}
<CaretSortIcon className="ml-2 h-4 w-4" />
</div>
),
accessorKey: 'name',
cell: ({ row }) => {
return (
<div>
<a
className="text-primary underline"
href={`https://dashboard.stripe.com/subscriptions/${row.original.planId}`}
target="_blank"
>
{row.getValue('name')}
</a>
</div>
);
},
size: 250,
},
{
header: () => (
<div
className="flex cursor-pointer items-center"
onClick={() => handleColumnSort('signingVolume')}
>
{_(msg`Signing Volume`)}
<CaretSortIcon className="ml-2 h-4 w-4" />
</div>
),
accessorKey: 'signingVolume',
cell: ({ row }) => <div>{Number(row.getValue('signingVolume'))}</div>,
},
{
header: () => {
return (
<div
className="flex cursor-pointer items-center"
onClick={() => handleColumnSort('createdAt')}
>
{_(msg`Created`)}
<CaretSortIcon className="ml-2 h-4 w-4" />
</div>
);
},
accessorKey: 'createdAt',
cell: ({ row }) => i18n.date(row.original.createdAt),
},
] satisfies DataTableColumnDef<SigningVolume>[];
}, [sortOrder]);
useEffect(() => {
startTransition(() => {
updateSearchParams({
search: debouncedSearchString,
page: 1,
perPage,
sortBy,
sortOrder,
});
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [debouncedSearchString]);
const onPaginationChange = (page: number, perPage: number) => {
startTransition(() => {
updateSearchParams({
page,
perPage,
});
});
};
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setSearchString(e.target.value);
};
const handleColumnSort = (column: 'name' | 'createdAt' | 'signingVolume') => {
startTransition(() => {
updateSearchParams({
sortBy: column,
sortOrder: sortOrder === 'asc' ? 'desc' : 'asc',
});
});
};
return (
<div className="relative">
<Input
className="my-6 flex flex-row gap-4"
type="text"
placeholder={_(msg`Search by name or email`)}
value={searchString}
onChange={handleChange}
/>
<DataTable
columns={columns}
data={signingVolume}
perPage={perPage}
currentPage={page}
totalPages={totalPages}
onPaginationChange={onPaginationChange}
>
{(table) => <DataTablePagination additionalInformation="VisibleCount" table={table} />}
</DataTable>
{isPending && (
<div className="absolute inset-0 flex items-center justify-center bg-white/50">
<Loader className="h-8 w-8 animate-spin text-gray-500" />
</div>
)}
</div>
);
};

View File

@ -0,0 +1,25 @@
'use server';
import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session';
import { isAdmin } from '@documenso/lib/next-auth/guards/is-admin';
import { getSigningVolume } from '@documenso/lib/server-only/admin/get-signing-volume';
type SearchOptions = {
search: string;
page: number;
perPage: number;
sortBy: 'name' | 'createdAt' | 'signingVolume';
sortOrder: 'asc' | 'desc';
};
export async function search({ search, page, perPage, sortBy, sortOrder }: SearchOptions) {
const { user } = await getRequiredServerComponentSession();
if (!isAdmin(user)) {
throw new Error('Unauthorized');
}
const results = await getSigningVolume({ search, page, perPage, sortBy, sortOrder });
return results;
}

View File

@ -0,0 +1,60 @@
import { Trans } from '@lingui/macro';
import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server';
import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session';
import { isAdmin } from '@documenso/lib/next-auth/guards/is-admin';
import { LeaderboardTable } from './data-table-leaderboard';
import { search } from './fetch-leaderboard.actions';
type AdminLeaderboardProps = {
searchParams?: {
search?: string;
page?: number;
perPage?: number;
sortBy?: 'name' | 'createdAt' | 'signingVolume';
sortOrder?: 'asc' | 'desc';
};
};
export default async function Leaderboard({ searchParams = {} }: AdminLeaderboardProps) {
await setupI18nSSR();
const { user } = await getRequiredServerComponentSession();
if (!isAdmin(user)) {
throw new Error('Unauthorized');
}
const page = Number(searchParams.page) || 1;
const perPage = Number(searchParams.perPage) || 10;
const searchString = searchParams.search || '';
const sortBy = searchParams.sortBy || 'signingVolume';
const sortOrder = searchParams.sortOrder || 'desc';
const { leaderboard: signingVolume, totalPages } = await search({
search: searchString,
page,
perPage,
sortBy,
sortOrder,
});
return (
<div>
<h2 className="text-4xl font-semibold">
<Trans>Signing Volume</Trans>
</h2>
<div className="mt-8">
<LeaderboardTable
signingVolume={signingVolume}
totalPages={totalPages}
page={page}
perPage={perPage}
sortBy={sortBy}
sortOrder={sortOrder}
/>
</div>
</div>
);
}

View File

@ -6,7 +6,7 @@ import Link from 'next/link';
import { usePathname } from 'next/navigation';
import { Trans } from '@lingui/macro';
import { BarChart3, FileStack, Settings, Users, Wallet2 } from 'lucide-react';
import { BarChart3, FileStack, Settings, Trophy, Users, Wallet2 } from 'lucide-react';
import { cn } from '@documenso/ui/lib/utils';
import { Button } from '@documenso/ui/primitives/button';
@ -80,6 +80,20 @@ export const AdminNav = ({ className, ...props }: AdminNavProps) => {
</Link>
</Button>
<Button
variant="ghost"
className={cn(
'justify-start md:w-full',
pathname?.startsWith('/admin/leaderboard') && 'bg-secondary',
)}
asChild
>
<Link href="/admin/leaderboard">
<Trophy className="mr-2 h-5 w-5" />
<Trans>Leaderboard</Trans>
</Link>
</Button>
<Button
variant="ghost"
className={cn(

View File

@ -0,0 +1,148 @@
import { prisma } from '@documenso/prisma';
import { Prisma } from '@documenso/prisma/client';
export type SigningVolume = {
id: number;
name: string;
signingVolume: number;
createdAt: Date;
planId: string;
};
export type GetSigningVolumeOptions = {
search?: string;
page?: number;
perPage?: number;
sortBy?: 'name' | 'createdAt' | 'signingVolume';
sortOrder?: 'asc' | 'desc';
};
export async function getSigningVolume({
search = '',
page = 1,
perPage = 10,
sortBy = 'signingVolume',
sortOrder = 'desc',
}: GetSigningVolumeOptions) {
const whereClause = Prisma.validator<Prisma.SubscriptionWhereInput>()({
status: 'ACTIVE',
OR: [
{
User: {
OR: [
{ name: { contains: search, mode: 'insensitive' } },
{ email: { contains: search, mode: 'insensitive' } },
],
},
},
{
team: {
name: { contains: search, mode: 'insensitive' },
},
},
],
});
const orderByClause = getOrderByClause({ sortBy, sortOrder });
const [subscriptions, totalCount] = await Promise.all([
prisma.subscription.findMany({
where: whereClause,
include: {
User: {
include: {
Document: {
where: {
status: 'COMPLETED',
deletedAt: null,
},
},
},
},
team: {
include: {
document: {
where: {
status: 'COMPLETED',
deletedAt: null,
},
},
},
},
},
orderBy: orderByClause,
skip: Math.max(page - 1, 0) * perPage,
take: perPage,
}),
prisma.subscription.count({
where: whereClause,
}),
]);
const leaderboardWithVolume: SigningVolume[] = subscriptions.map((subscription) => {
const name =
subscription.User?.name || subscription.team?.name || subscription.User?.email || 'Unknown';
const userSignedDocs = subscription.User?.Document?.length || 0;
const teamSignedDocs = subscription.team?.document?.length || 0;
return {
id: subscription.id,
name,
signingVolume: userSignedDocs + teamSignedDocs,
createdAt: subscription.createdAt,
planId: subscription.planId,
};
});
return {
leaderboard: leaderboardWithVolume,
totalPages: Math.ceil(totalCount / perPage),
};
}
function getOrderByClause(options: {
sortBy: string;
sortOrder: 'asc' | 'desc';
}): Prisma.SubscriptionOrderByWithRelationInput | Prisma.SubscriptionOrderByWithRelationInput[] {
const { sortBy, sortOrder } = options;
if (sortBy === 'name') {
return [
{
User: {
name: sortOrder,
},
},
{
team: {
name: sortOrder,
},
},
];
}
if (sortBy === 'createdAt') {
return {
createdAt: sortOrder,
};
}
// Default: sort by signing volume
return [
{
User: {
Document: {
_count: sortOrder,
},
},
},
{
team: {
document: {
_count: sortOrder,
},
},
},
];
}

View File

@ -60,14 +60,19 @@ msgstr "{0} von {1} Zeile(n) ausgewählt."
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:136
#: packages/lib/server-only/document/resend-document.tsx:137
msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr "{0} hat dich im Namen von {1} eingeladen, das Dokument \"{2}\" {recipientActionVerb}."
msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:136
#: packages/lib/server-only/document/resend-document.tsx:137
#~ msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
#~ msgstr "{0} hat dich im Namen von {1} eingeladen, das Dokument \"{2}\" {recipientActionVerb}."
#: packages/email/template-components/template-document-invite.tsx:51
#~ msgid "{0}<0/>\"{documentName}\""
#~ msgstr "{0}<0/>\"{documentName}\""
#: packages/email/templates/document-invite.tsx:94
#: packages/email/templates/document-invite.tsx:95
msgid "{inviterName} <0>({inviterEmail})</0>"
msgstr "{inviterName} <0>({inviterEmail})</0>"
@ -87,7 +92,7 @@ msgstr "{inviterName} hat dich eingeladen, {0}<0/>\"{documentName}\""
msgid "{inviterName} has invited you to {action} {documentName}"
msgstr "{inviterName} hat dich eingeladen, {action} {documentName}"
#: packages/email/templates/document-invite.tsx:106
#: packages/email/templates/document-invite.tsx:108
msgid "{inviterName} has invited you to {action} the document \"{documentName}\"."
msgstr "{inviterName} hat Sie eingeladen, das Dokument \"{documentName}\" {action}."
@ -100,16 +105,24 @@ msgid "{inviterName} has removed you from the document<0/>\"{documentName}\""
msgstr "{inviterName} hat dich aus dem Dokument<0/>\"{documentName}\" entfernt"
#: packages/email/template-components/template-document-invite.tsx:63
msgid "{inviterName} on behalf of {teamName} has invited you to {0}"
msgstr "{inviterName} im Namen von {teamName} hat Sie eingeladen, {0}"
msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}"
msgstr ""
#: packages/email/templates/document-invite.tsx:45
msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}"
msgstr ""
#: packages/email/template-components/template-document-invite.tsx:63
#~ msgid "{inviterName} on behalf of {teamName} has invited you to {0}"
#~ msgstr "{inviterName} im Namen von {teamName} hat Sie eingeladen, {0}"
#: packages/email/template-components/template-document-invite.tsx:49
#~ msgid "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\""
#~ msgstr "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\""
#: packages/email/templates/document-invite.tsx:45
msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
msgstr "{inviterName} hat dich im Namen von {teamName} eingeladen, {action} {documentName}"
#~ msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
#~ msgstr "{inviterName} hat dich im Namen von {teamName} eingeladen, {action} {documentName}"
#: packages/email/templates/team-join.tsx:67
msgid "{memberEmail} joined the following team"

File diff suppressed because one or more lines are too long

View File

@ -51,16 +51,16 @@ msgstr "\"{placeholderEmail}\" im Namen von \"{0}\" hat Sie eingeladen, \"Beispi
#~ msgstr "\"{teamUrl}\" hat Sie eingeladen, \"Beispieldokument\" zu unterschreiben."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:83
msgid "({0}) has invited you to approve this document"
msgstr "({0}) hat dich eingeladen, dieses Dokument zu genehmigen"
#~ msgid "({0}) has invited you to approve this document"
#~ msgstr "({0}) hat dich eingeladen, dieses Dokument zu genehmigen"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:80
msgid "({0}) has invited you to sign this document"
msgstr "({0}) hat dich eingeladen, dieses Dokument zu unterzeichnen"
#~ msgid "({0}) has invited you to sign this document"
#~ msgstr "({0}) hat dich eingeladen, dieses Dokument zu unterzeichnen"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:77
msgid "({0}) has invited you to view this document"
msgstr "({0}) hat dich eingeladen, dieses Dokument zu betrachten"
#~ msgid "({0}) has invited you to view this document"
#~ msgstr "({0}) hat dich eingeladen, dieses Dokument zu betrachten"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313
msgid "{0, plural, one {(1 character over)} other {(# characters over)}}"
@ -1206,6 +1206,7 @@ msgid "Create your account and start using state-of-the-art document signing. Op
msgstr "Erstellen Sie Ihr Konto und beginnen Sie mit dem modernen Dokumentensignieren. Offenes und schönes Signieren liegt in Ihrer Reichweite."
#: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:62
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:96
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:35
#: apps/web/src/app/(dashboard)/documents/data-table.tsx:54
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:65
@ -1245,6 +1246,11 @@ msgstr "Aktuelles Passwort"
msgid "Current plan: {0}"
msgstr "Aktueller Plan: {0}"
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:94
#: apps/web/src/app/(dashboard)/admin/leaderboard/leaderboard-table.tsx:94
#~ msgid "Customer Type"
#~ msgstr ""
#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:28
msgid "Daily"
msgstr "Täglich"
@ -1988,6 +1994,18 @@ msgstr "Zum Eigentümer gehen"
msgid "Go to your <0>public profile settings</0> to add documents."
msgstr "Gehen Sie zu Ihren <0>öffentlichen Profileinstellungen</0>, um Dokumente hinzuzufügen."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:107
msgid "has invited you to approve this document"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:98
msgid "has invited you to sign this document"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:89
msgid "has invited you to view this document"
msgstr ""
#: apps/web/src/app/(dashboard)/settings/profile/page.tsx:29
msgid "Here you can edit your personal details."
msgstr "Hier können Sie Ihre persönlichen Daten bearbeiten."
@ -2204,6 +2222,10 @@ msgstr "Zuletzt aktualisiert am"
msgid "Last used"
msgstr "Zuletzt verwendet"
#: apps/web/src/app/(dashboard)/admin/nav.tsx:93
msgid "Leaderboard"
msgstr ""
#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:111
#: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:117
msgid "Leave"
@ -2411,6 +2433,7 @@ msgid "My templates"
msgstr "Meine Vorlagen"
#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:148
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:56
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:99
#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:66
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:144
@ -2524,6 +2547,18 @@ msgstr "Nichts zu tun"
msgid "Number"
msgstr "Nummer"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:103
msgid "on behalf of \"{0}\" has invited you to approve this document"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:94
msgid "on behalf of \"{0}\" has invited you to sign this document"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:85
msgid "on behalf of \"{0}\" has invited you to view this document"
msgstr ""
#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:128
msgid "On this page, you can create a new webhook."
msgstr "Auf dieser Seite können Sie einen neuen Webhook erstellen."
@ -3105,6 +3140,7 @@ msgstr "Suchen"
msgid "Search by document title"
msgstr "Nach Dokumenttitel suchen"
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:147
#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144
msgid "Search by name or email"
msgstr "Nach Name oder E-Mail suchen"
@ -3369,6 +3405,11 @@ msgstr "Unterzeichnungslinks wurden für dieses Dokument erstellt."
msgid "Signing up..."
msgstr "Registrierung..."
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:82
#: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:46
msgid "Signing Volume"
msgstr ""
#: apps/web/src/app/(profile)/p/[url]/page.tsx:109
msgid "Since {0}"
msgstr "Seit {0}"
@ -3377,7 +3418,7 @@ msgstr "Seit {0}"
msgid "Site Banner"
msgstr "Website Banner"
#: apps/web/src/app/(dashboard)/admin/nav.tsx:93
#: apps/web/src/app/(dashboard)/admin/nav.tsx:107
#: apps/web/src/app/(dashboard)/admin/site-settings/page.tsx:26
msgid "Site Settings"
msgstr "Website Einstellungen"

View File

@ -55,14 +55,19 @@ msgstr "{0} of {1} row(s) selected."
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:136
#: packages/lib/server-only/document/resend-document.tsx:137
msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"."
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:136
#: packages/lib/server-only/document/resend-document.tsx:137
#~ msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
#~ msgstr "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
#: packages/email/template-components/template-document-invite.tsx:51
#~ msgid "{0}<0/>\"{documentName}\""
#~ msgstr "{0}<0/>\"{documentName}\""
#: packages/email/templates/document-invite.tsx:94
#: packages/email/templates/document-invite.tsx:95
msgid "{inviterName} <0>({inviterEmail})</0>"
msgstr "{inviterName} <0>({inviterEmail})</0>"
@ -82,7 +87,7 @@ msgstr "{inviterName} has invited you to {0}<0/>\"{documentName}\""
msgid "{inviterName} has invited you to {action} {documentName}"
msgstr "{inviterName} has invited you to {action} {documentName}"
#: packages/email/templates/document-invite.tsx:106
#: packages/email/templates/document-invite.tsx:108
msgid "{inviterName} has invited you to {action} the document \"{documentName}\"."
msgstr "{inviterName} has invited you to {action} the document \"{documentName}\"."
@ -95,16 +100,24 @@ msgid "{inviterName} has removed you from the document<0/>\"{documentName}\""
msgstr "{inviterName} has removed you from the document<0/>\"{documentName}\""
#: packages/email/template-components/template-document-invite.tsx:63
msgid "{inviterName} on behalf of {teamName} has invited you to {0}"
msgstr "{inviterName} on behalf of {teamName} has invited you to {0}"
msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}"
msgstr "{inviterName} on behalf of \"{teamName}\" has invited you to {0}"
#: packages/email/templates/document-invite.tsx:45
msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}"
msgstr "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}"
#: packages/email/template-components/template-document-invite.tsx:63
#~ msgid "{inviterName} on behalf of {teamName} has invited you to {0}"
#~ msgstr "{inviterName} on behalf of {teamName} has invited you to {0}"
#: packages/email/template-components/template-document-invite.tsx:49
#~ msgid "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\""
#~ msgstr "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\""
#: packages/email/templates/document-invite.tsx:45
msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
msgstr "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
#~ msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
#~ msgstr "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
#: packages/email/templates/team-join.tsx:67
msgid "{memberEmail} joined the following team"

File diff suppressed because one or more lines are too long

View File

@ -46,16 +46,16 @@ msgstr "\"{placeholderEmail}\" on behalf of \"{0}\" has invited you to sign \"ex
#~ msgstr "\"{teamUrl}\" has invited you to sign \"example document\"."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:83
msgid "({0}) has invited you to approve this document"
msgstr "({0}) has invited you to approve this document"
#~ msgid "({0}) has invited you to approve this document"
#~ msgstr "({0}) has invited you to approve this document"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:80
msgid "({0}) has invited you to sign this document"
msgstr "({0}) has invited you to sign this document"
#~ msgid "({0}) has invited you to sign this document"
#~ msgstr "({0}) has invited you to sign this document"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:77
msgid "({0}) has invited you to view this document"
msgstr "({0}) has invited you to view this document"
#~ msgid "({0}) has invited you to view this document"
#~ msgstr "({0}) has invited you to view this document"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313
msgid "{0, plural, one {(1 character over)} other {(# characters over)}}"
@ -1201,6 +1201,7 @@ msgid "Create your account and start using state-of-the-art document signing. Op
msgstr "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
#: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:62
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:96
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:35
#: apps/web/src/app/(dashboard)/documents/data-table.tsx:54
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:65
@ -1240,6 +1241,11 @@ msgstr "Current Password"
msgid "Current plan: {0}"
msgstr "Current plan: {0}"
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:94
#: apps/web/src/app/(dashboard)/admin/leaderboard/leaderboard-table.tsx:94
#~ msgid "Customer Type"
#~ msgstr "Customer Type"
#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:28
msgid "Daily"
msgstr "Daily"
@ -1983,6 +1989,18 @@ msgstr "Go to owner"
msgid "Go to your <0>public profile settings</0> to add documents."
msgstr "Go to your <0>public profile settings</0> to add documents."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:107
msgid "has invited you to approve this document"
msgstr "has invited you to approve this document"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:98
msgid "has invited you to sign this document"
msgstr "has invited you to sign this document"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:89
msgid "has invited you to view this document"
msgstr "has invited you to view this document"
#: apps/web/src/app/(dashboard)/settings/profile/page.tsx:29
msgid "Here you can edit your personal details."
msgstr "Here you can edit your personal details."
@ -2199,6 +2217,10 @@ msgstr "Last updated at"
msgid "Last used"
msgstr "Last used"
#: apps/web/src/app/(dashboard)/admin/nav.tsx:93
msgid "Leaderboard"
msgstr "Leaderboard"
#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:111
#: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:117
msgid "Leave"
@ -2406,6 +2428,7 @@ msgid "My templates"
msgstr "My templates"
#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:148
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:56
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:99
#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:66
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:144
@ -2519,6 +2542,18 @@ msgstr "Nothing to do"
msgid "Number"
msgstr "Number"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:103
msgid "on behalf of \"{0}\" has invited you to approve this document"
msgstr "on behalf of \"{0}\" has invited you to approve this document"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:94
msgid "on behalf of \"{0}\" has invited you to sign this document"
msgstr "on behalf of \"{0}\" has invited you to sign this document"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:85
msgid "on behalf of \"{0}\" has invited you to view this document"
msgstr "on behalf of \"{0}\" has invited you to view this document"
#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:128
msgid "On this page, you can create a new webhook."
msgstr "On this page, you can create a new webhook."
@ -3100,6 +3135,7 @@ msgstr "Search"
msgid "Search by document title"
msgstr "Search by document title"
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:147
#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144
msgid "Search by name or email"
msgstr "Search by name or email"
@ -3364,6 +3400,11 @@ msgstr "Signing links have been generated for this document."
msgid "Signing up..."
msgstr "Signing up..."
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:82
#: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:46
msgid "Signing Volume"
msgstr "Signing Volume"
#: apps/web/src/app/(profile)/p/[url]/page.tsx:109
msgid "Since {0}"
msgstr "Since {0}"
@ -3372,7 +3413,7 @@ msgstr "Since {0}"
msgid "Site Banner"
msgstr "Site Banner"
#: apps/web/src/app/(dashboard)/admin/nav.tsx:93
#: apps/web/src/app/(dashboard)/admin/nav.tsx:107
#: apps/web/src/app/(dashboard)/admin/site-settings/page.tsx:26
msgid "Site Settings"
msgstr "Site Settings"

View File

@ -60,14 +60,19 @@ msgstr "{0} de {1} fila(s) seleccionada."
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:136
#: packages/lib/server-only/document/resend-document.tsx:137
msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr "{0} en nombre de {1} te ha invitado a {recipientActionVerb} el documento \"{2}\"."
msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:136
#: packages/lib/server-only/document/resend-document.tsx:137
#~ msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
#~ msgstr "{0} en nombre de {1} te ha invitado a {recipientActionVerb} el documento \"{2}\"."
#: packages/email/template-components/template-document-invite.tsx:51
#~ msgid "{0}<0/>\"{documentName}\""
#~ msgstr "{0}<0/>\"{documentName}\""
#: packages/email/templates/document-invite.tsx:94
#: packages/email/templates/document-invite.tsx:95
msgid "{inviterName} <0>({inviterEmail})</0>"
msgstr "{inviterName} <0>({inviterEmail})</0>"
@ -87,7 +92,7 @@ msgstr "{inviterName} te ha invitado a {0}<0/>\"{documentName}\""
msgid "{inviterName} has invited you to {action} {documentName}"
msgstr "{inviterName} te ha invitado a {action} {documentName}"
#: packages/email/templates/document-invite.tsx:106
#: packages/email/templates/document-invite.tsx:108
msgid "{inviterName} has invited you to {action} the document \"{documentName}\"."
msgstr "{inviterName} te ha invitado a {action} el documento \"{documentName}\"."
@ -100,16 +105,24 @@ msgid "{inviterName} has removed you from the document<0/>\"{documentName}\""
msgstr "{inviterName} te ha eliminado del documento<0/>\"{documentName}\""
#: packages/email/template-components/template-document-invite.tsx:63
msgid "{inviterName} on behalf of {teamName} has invited you to {0}"
msgstr "{inviterName} en nombre de {teamName} te ha invitado a {0}"
msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}"
msgstr ""
#: packages/email/templates/document-invite.tsx:45
msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}"
msgstr ""
#: packages/email/template-components/template-document-invite.tsx:63
#~ msgid "{inviterName} on behalf of {teamName} has invited you to {0}"
#~ msgstr "{inviterName} en nombre de {teamName} te ha invitado a {0}"
#: packages/email/template-components/template-document-invite.tsx:49
#~ msgid "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\""
#~ msgstr "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\""
#: packages/email/templates/document-invite.tsx:45
msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
msgstr "{inviterName} en nombre de {teamName} te ha invitado a {action} {documentName}"
#~ msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
#~ msgstr "{inviterName} en nombre de {teamName} te ha invitado a {action} {documentName}"
#: packages/email/templates/team-join.tsx:67
msgid "{memberEmail} joined the following team"

View File

@ -51,16 +51,16 @@ msgstr "\"{placeholderEmail}\" en nombre de \"{0}\" te ha invitado a firmar \"do
#~ msgstr "\"{teamUrl}\" te ha invitado a firmar \"ejemplo de documento\"."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:83
msgid "({0}) has invited you to approve this document"
msgstr "({0}) te ha invitado a aprobar este documento"
#~ msgid "({0}) has invited you to approve this document"
#~ msgstr "({0}) te ha invitado a aprobar este documento"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:80
msgid "({0}) has invited you to sign this document"
msgstr "({0}) te ha invitado a firmar este documento"
#~ msgid "({0}) has invited you to sign this document"
#~ msgstr "({0}) te ha invitado a firmar este documento"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:77
msgid "({0}) has invited you to view this document"
msgstr "({0}) te ha invitado a ver este documento"
#~ msgid "({0}) has invited you to view this document"
#~ msgstr "({0}) te ha invitado a ver este documento"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313
msgid "{0, plural, one {(1 character over)} other {(# characters over)}}"
@ -1206,6 +1206,7 @@ msgid "Create your account and start using state-of-the-art document signing. Op
msgstr "Crea tu cuenta y comienza a utilizar la firma de documentos de última generación. La firma abierta y hermosa está al alcance de tu mano."
#: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:62
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:96
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:35
#: apps/web/src/app/(dashboard)/documents/data-table.tsx:54
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:65
@ -1988,6 +1989,18 @@ msgstr "Ir al propietario"
msgid "Go to your <0>public profile settings</0> to add documents."
msgstr "Ve a tu <0>configuración de perfil público</0> para agregar documentos."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:107
msgid "has invited you to approve this document"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:98
msgid "has invited you to sign this document"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:89
msgid "has invited you to view this document"
msgstr ""
#: apps/web/src/app/(dashboard)/settings/profile/page.tsx:29
msgid "Here you can edit your personal details."
msgstr "Aquí puedes editar tus datos personales."
@ -2204,6 +2217,10 @@ msgstr "Última actualización el"
msgid "Last used"
msgstr "Último uso"
#: apps/web/src/app/(dashboard)/admin/nav.tsx:93
msgid "Leaderboard"
msgstr ""
#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:111
#: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:117
msgid "Leave"
@ -2411,6 +2428,7 @@ msgid "My templates"
msgstr "Mis plantillas"
#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:148
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:56
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:99
#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:66
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:144
@ -2524,6 +2542,18 @@ msgstr "Nada que hacer"
msgid "Number"
msgstr "Número"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:103
msgid "on behalf of \"{0}\" has invited you to approve this document"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:94
msgid "on behalf of \"{0}\" has invited you to sign this document"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:85
msgid "on behalf of \"{0}\" has invited you to view this document"
msgstr ""
#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:128
msgid "On this page, you can create a new webhook."
msgstr "En esta página, puedes crear un nuevo webhook."
@ -3105,6 +3135,7 @@ msgstr "Buscar"
msgid "Search by document title"
msgstr "Buscar por título del documento"
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:147
#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144
msgid "Search by name or email"
msgstr "Buscar por nombre o correo electrónico"
@ -3369,6 +3400,11 @@ msgstr "Se han generado enlaces de firma para este documento."
msgid "Signing up..."
msgstr "Registrándose..."
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:82
#: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:46
msgid "Signing Volume"
msgstr ""
#: apps/web/src/app/(profile)/p/[url]/page.tsx:109
msgid "Since {0}"
msgstr "Desde {0}"
@ -3377,7 +3413,7 @@ msgstr "Desde {0}"
msgid "Site Banner"
msgstr "Banner del sitio"
#: apps/web/src/app/(dashboard)/admin/nav.tsx:93
#: apps/web/src/app/(dashboard)/admin/nav.tsx:107
#: apps/web/src/app/(dashboard)/admin/site-settings/page.tsx:26
msgid "Site Settings"
msgstr "Configuraciones del sitio"

View File

@ -60,14 +60,19 @@ msgstr "{0} sur {1} ligne(s) sélectionnée(s)."
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:136
#: packages/lib/server-only/document/resend-document.tsx:137
msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr "{0} au nom de {1} vous a invité à {recipientActionVerb} le document \"{2}\"."
msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"."
msgstr ""
#: packages/lib/jobs/definitions/emails/send-signing-email.ts:136
#: packages/lib/server-only/document/resend-document.tsx:137
#~ msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"."
#~ msgstr "{0} au nom de {1} vous a invité à {recipientActionVerb} le document \"{2}\"."
#: packages/email/template-components/template-document-invite.tsx:51
#~ msgid "{0}<0/>\"{documentName}\""
#~ msgstr "{0}<0/>\"{documentName}\""
#: packages/email/templates/document-invite.tsx:94
#: packages/email/templates/document-invite.tsx:95
msgid "{inviterName} <0>({inviterEmail})</0>"
msgstr "{inviterName} <0>({inviterEmail})</0>"
@ -87,7 +92,7 @@ msgstr "{inviterName} vous a invité à {0}<0/>\"{documentName}\""
msgid "{inviterName} has invited you to {action} {documentName}"
msgstr "{inviterName} vous a invité à {action} {documentName}"
#: packages/email/templates/document-invite.tsx:106
#: packages/email/templates/document-invite.tsx:108
msgid "{inviterName} has invited you to {action} the document \"{documentName}\"."
msgstr "{inviterName} vous a invité à {action} le document \"{documentName}\"."
@ -100,16 +105,24 @@ msgid "{inviterName} has removed you from the document<0/>\"{documentName}\""
msgstr "{inviterName} vous a retiré du document<0/>\"{documentName}\""
#: packages/email/template-components/template-document-invite.tsx:63
msgid "{inviterName} on behalf of {teamName} has invited you to {0}"
msgstr "{inviterName} au nom de {teamName} vous a invité à {0}"
msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}"
msgstr ""
#: packages/email/templates/document-invite.tsx:45
msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}"
msgstr ""
#: packages/email/template-components/template-document-invite.tsx:63
#~ msgid "{inviterName} on behalf of {teamName} has invited you to {0}"
#~ msgstr "{inviterName} au nom de {teamName} vous a invité à {0}"
#: packages/email/template-components/template-document-invite.tsx:49
#~ msgid "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\""
#~ msgstr "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\""
#: packages/email/templates/document-invite.tsx:45
msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
msgstr "{inviterName} au nom de {teamName} vous a invité à {action} {documentName}"
#~ msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}"
#~ msgstr "{inviterName} au nom de {teamName} vous a invité à {action} {documentName}"
#: packages/email/templates/team-join.tsx:67
msgid "{memberEmail} joined the following team"

View File

@ -51,16 +51,16 @@ msgstr "\"{placeholderEmail}\" au nom de \"{0}\" vous a invité à signer \"exem
#~ msgstr "\"{teamUrl}\" vous a invité à signer \"example document\"."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:83
msgid "({0}) has invited you to approve this document"
msgstr "({0}) vous a invité à approuver ce document"
#~ msgid "({0}) has invited you to approve this document"
#~ msgstr "({0}) vous a invité à approuver ce document"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:80
msgid "({0}) has invited you to sign this document"
msgstr "({0}) vous a invité à signer ce document"
#~ msgid "({0}) has invited you to sign this document"
#~ msgstr "({0}) vous a invité à signer ce document"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:77
msgid "({0}) has invited you to view this document"
msgstr "({0}) vous a invité à consulter ce document"
#~ msgid "({0}) has invited you to view this document"
#~ msgstr "({0}) vous a invité à consulter ce document"
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313
msgid "{0, plural, one {(1 character over)} other {(# characters over)}}"
@ -1206,6 +1206,7 @@ msgid "Create your account and start using state-of-the-art document signing. Op
msgstr "Créez votre compte et commencez à utiliser la signature de documents à la pointe de la technologie. Une signature ouverte et magnifique est à votre portée."
#: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:62
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:96
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:35
#: apps/web/src/app/(dashboard)/documents/data-table.tsx:54
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:65
@ -1988,6 +1989,18 @@ msgstr "Aller au propriétaire"
msgid "Go to your <0>public profile settings</0> to add documents."
msgstr "Allez à vos <0>paramètres de profil public</0> pour ajouter des documents."
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:107
msgid "has invited you to approve this document"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:98
msgid "has invited you to sign this document"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:89
msgid "has invited you to view this document"
msgstr ""
#: apps/web/src/app/(dashboard)/settings/profile/page.tsx:29
msgid "Here you can edit your personal details."
msgstr "Ici, vous pouvez modifier vos coordonnées personnelles."
@ -2204,6 +2217,10 @@ msgstr "Dernière mise à jour à"
msgid "Last used"
msgstr "Dernière utilisation"
#: apps/web/src/app/(dashboard)/admin/nav.tsx:93
msgid "Leaderboard"
msgstr ""
#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:111
#: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:117
msgid "Leave"
@ -2411,6 +2428,7 @@ msgid "My templates"
msgstr "Mes modèles"
#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:148
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:56
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:99
#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:66
#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:144
@ -2524,6 +2542,18 @@ msgstr "Rien à faire"
msgid "Number"
msgstr "Numéro"
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:103
msgid "on behalf of \"{0}\" has invited you to approve this document"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:94
msgid "on behalf of \"{0}\" has invited you to sign this document"
msgstr ""
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:85
msgid "on behalf of \"{0}\" has invited you to view this document"
msgstr ""
#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:128
msgid "On this page, you can create a new webhook."
msgstr "Sur cette page, vous pouvez créer un nouveau webhook."
@ -3105,6 +3135,7 @@ msgstr "Recherche"
msgid "Search by document title"
msgstr "Recherche par titre de document"
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:147
#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144
msgid "Search by name or email"
msgstr "Recherche par nom ou e-mail"
@ -3369,6 +3400,11 @@ msgstr "Des liens de signature ont été générés pour ce document."
msgid "Signing up..."
msgstr "Inscription en cours..."
#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:82
#: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:46
msgid "Signing Volume"
msgstr ""
#: apps/web/src/app/(profile)/p/[url]/page.tsx:109
msgid "Since {0}"
msgstr "Depuis {0}"
@ -3377,7 +3413,7 @@ msgstr "Depuis {0}"
msgid "Site Banner"
msgstr "Bannière du site"
#: apps/web/src/app/(dashboard)/admin/nav.tsx:93
#: apps/web/src/app/(dashboard)/admin/nav.tsx:107
#: apps/web/src/app/(dashboard)/admin/site-settings/page.tsx:26
msgid "Site Settings"
msgstr "Paramètres du site"