diff --git a/apps/marketing/src/app/(marketing)/[content]/page.tsx b/apps/marketing/src/app/(marketing)/[content]/page.tsx index 2e8327944..38200d984 100644 --- a/apps/marketing/src/app/(marketing)/[content]/page.tsx +++ b/apps/marketing/src/app/(marketing)/[content]/page.tsx @@ -30,8 +30,8 @@ const mdxComponents: MDXComponents = { * * Will render the document if it exists, otherwise will return a 404. */ -export default function ContentPage({ params }: { params: { content: string } }) { - setupI18nSSR(); +export default async function ContentPage({ params }: { params: { content: string } }) { + await setupI18nSSR(); const post = allDocuments.find((post) => post._raw.flattenedPath === params.content); diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx index 4f99126f3..324f742d1 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx @@ -48,8 +48,8 @@ const mdxComponents: MDXComponents = { ), }; -export default function BlogPostPage({ params }: { params: { post: string } }) { - setupI18nSSR(); +export default async function BlogPostPage({ params }: { params: { post: string } }) { + await setupI18nSSR(); const post = allBlogPosts.find((post) => post._raw.flattenedPath === `blog/${params.post}`); diff --git a/apps/marketing/src/app/(marketing)/blog/page.tsx b/apps/marketing/src/app/(marketing)/blog/page.tsx index 4974a2399..a762f4c2a 100644 --- a/apps/marketing/src/app/(marketing)/blog/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/page.tsx @@ -9,8 +9,8 @@ export const metadata: Metadata = { title: 'Blog', }; -export default function BlogPage() { - const { i18n } = setupI18nSSR(); +export default async function BlogPage() { + const { i18n } = await setupI18nSSR(); const blogPosts = allBlogPosts.sort((a, b) => { const dateA = new Date(a.date); diff --git a/apps/marketing/src/app/(marketing)/open/page.tsx b/apps/marketing/src/app/(marketing)/open/page.tsx index 676a352bb..035b4de38 100644 --- a/apps/marketing/src/app/(marketing)/open/page.tsx +++ b/apps/marketing/src/app/(marketing)/open/page.tsx @@ -1,7 +1,6 @@ import type { Metadata } from 'next'; import { Trans, msg } from '@lingui/macro'; -import { useLingui } from '@lingui/react'; import { z } from 'zod'; import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server'; @@ -131,9 +130,9 @@ const fetchEarlyAdopters = async () => { }; export default async function OpenPage() { - setupI18nSSR(); + const { i18n } = await setupI18nSSR(); - const { _ } = useLingui(); + const { _ } = i18n; const [ { forks_count: forksCount, stargazers_count: stargazersCount }, diff --git a/apps/marketing/src/app/(marketing)/page.tsx b/apps/marketing/src/app/(marketing)/page.tsx index 2f5dd14c8..816b1aaa1 100644 --- a/apps/marketing/src/app/(marketing)/page.tsx +++ b/apps/marketing/src/app/(marketing)/page.tsx @@ -26,7 +26,7 @@ const fontCaveat = Caveat({ }); export default async function IndexPage() { - setupI18nSSR(); + await setupI18nSSR(); const starCount = await fetch('https://api.github.com/repos/documenso/documenso', { headers: { diff --git a/apps/marketing/src/app/(marketing)/pricing/page.tsx b/apps/marketing/src/app/(marketing)/pricing/page.tsx index 61a802cb8..4c89490c0 100644 --- a/apps/marketing/src/app/(marketing)/pricing/page.tsx +++ b/apps/marketing/src/app/(marketing)/pricing/page.tsx @@ -30,8 +30,8 @@ export type PricingPageProps = { }; }; -export default function PricingPage() { - setupI18nSSR(); +export default async function PricingPage() { + await setupI18nSSR(); return (
diff --git a/apps/marketing/src/app/(marketing)/singleplayer/page.tsx b/apps/marketing/src/app/(marketing)/singleplayer/page.tsx index 1416067e4..16da4e6b9 100644 --- a/apps/marketing/src/app/(marketing)/singleplayer/page.tsx +++ b/apps/marketing/src/app/(marketing)/singleplayer/page.tsx @@ -14,8 +14,8 @@ export const dynamic = 'force-dynamic'; // !: This entire file is a hack to get around failed prerendering of // !: the Single Player Mode page. This regression was introduced during // !: the upgrade of Next.js to v13.5.x. -export default function SingleplayerPage() { - setupI18nSSR(); +export default async function SingleplayerPage() { + await setupI18nSSR(); return ; } diff --git a/apps/marketing/src/app/layout.tsx b/apps/marketing/src/app/layout.tsx index 544b5ceb4..ea879d89d 100644 --- a/apps/marketing/src/app/layout.tsx +++ b/apps/marketing/src/app/layout.tsx @@ -56,7 +56,7 @@ export function generateMetadata() { export default async function RootLayout({ children }: { children: React.ReactNode }) { const flags = await getAllAnonymousFlags(); - const { lang, locales, i18n } = setupI18nSSR(); + const { lang, locales, i18n } = await setupI18nSSR(); return ( diff --git a/apps/web/src/app/(dashboard)/admin/layout.tsx b/apps/web/src/app/(dashboard)/admin/layout.tsx index c489c34a1..964267872 100644 --- a/apps/web/src/app/(dashboard)/admin/layout.tsx +++ b/apps/web/src/app/(dashboard)/admin/layout.tsx @@ -13,7 +13,7 @@ export type AdminSectionLayoutProps = { }; export default async function AdminSectionLayout({ children }: AdminSectionLayoutProps) { - setupI18nSSR(); + await setupI18nSSR(); const { user } = await getRequiredServerComponentSession(); diff --git a/apps/web/src/app/(dashboard)/admin/site-settings/page.tsx b/apps/web/src/app/(dashboard)/admin/site-settings/page.tsx index a9d37caff..c78eb87ec 100644 --- a/apps/web/src/app/(dashboard)/admin/site-settings/page.tsx +++ b/apps/web/src/app/(dashboard)/admin/site-settings/page.tsx @@ -12,7 +12,7 @@ import { BannerForm } from './banner-form'; // import { BannerForm } from './banner-form'; export default async function AdminBannerPage() { - setupI18nSSR(); + await setupI18nSSR(); const { _ } = useLingui(); diff --git a/apps/web/src/app/(dashboard)/admin/stats/page.tsx b/apps/web/src/app/(dashboard)/admin/stats/page.tsx index 33be711e1..9ffbfb5dc 100644 --- a/apps/web/src/app/(dashboard)/admin/stats/page.tsx +++ b/apps/web/src/app/(dashboard)/admin/stats/page.tsx @@ -30,7 +30,7 @@ import { SignerConversionChart } from './signer-conversion-chart'; import { UserWithDocumentChart } from './user-with-document'; export default async function AdminStatsPage() { - setupI18nSSR(); + await setupI18nSSR(); const { _ } = useLingui(); diff --git a/apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx b/apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx index f31e9d13e..7940b6fb5 100644 --- a/apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx +++ b/apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx @@ -14,7 +14,7 @@ import { } from '@documenso/ui/primitives/table'; export default async function Subscriptions() { - setupI18nSSR(); + await setupI18nSSR(); const subscriptions = await findSubscriptions(); diff --git a/apps/web/src/app/(dashboard)/admin/users/page.tsx b/apps/web/src/app/(dashboard)/admin/users/page.tsx index 807fd45c9..55803f6f9 100644 --- a/apps/web/src/app/(dashboard)/admin/users/page.tsx +++ b/apps/web/src/app/(dashboard)/admin/users/page.tsx @@ -16,7 +16,7 @@ type AdminManageUsersProps = { }; export default async function AdminManageUsers({ searchParams = {} }: AdminManageUsersProps) { - setupI18nSSR(); + await setupI18nSSR(); const page = Number(searchParams.page) || 1; const perPage = Number(searchParams.perPage) || 10; diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index 571ca535f..5c659ad46 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -7,6 +7,7 @@ import { useRouter, useSearchParams } from 'next/navigation'; import { msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; +import { isValidLanguageCode } from '@documenso/lib/constants/i18n'; import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION, SKIP_QUERY_BATCH_META, @@ -201,7 +202,7 @@ export const EditDocumentForm = ({ const onAddSettingsFormSubmit = async (data: TAddSettingsFormSchema) => { try { - const { timezone, dateFormat, redirectUrl } = data.meta; + const { timezone, dateFormat, redirectUrl, language } = data.meta; await setSettingsForDocument({ documentId: document.id, @@ -217,6 +218,7 @@ export const EditDocumentForm = ({ timezone, dateFormat, redirectUrl, + language: isValidLanguageCode(language) ? language : undefined, }, }); diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit/page.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit/page.tsx index b91bf4e9a..a20cc8469 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit/page.tsx @@ -8,8 +8,8 @@ export type DocumentPageProps = { }; }; -export default function DocumentEditPage({ params }: DocumentPageProps) { - setupI18nSSR(); +export default async function DocumentEditPage({ params }: DocumentPageProps) { + await setupI18nSSR(); return ; } diff --git a/apps/web/src/app/(dashboard)/documents/[id]/loading.tsx b/apps/web/src/app/(dashboard)/documents/[id]/loading.tsx index 65d508482..b6165436b 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/loading.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/loading.tsx @@ -6,8 +6,8 @@ import { ChevronLeft, Loader } from 'lucide-react'; import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server'; import { Skeleton } from '@documenso/ui/primitives/skeleton'; -export default function Loading() { - setupI18nSSR(); +export default async function Loading() { + await setupI18nSSR(); return (
diff --git a/apps/web/src/app/(dashboard)/documents/[id]/logs/page.tsx b/apps/web/src/app/(dashboard)/documents/[id]/logs/page.tsx index 7c91ac8fc..c7c489ef1 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/logs/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/logs/page.tsx @@ -8,8 +8,8 @@ export type DocumentsLogsPageProps = { }; }; -export default function DocumentsLogsPage({ params }: DocumentsLogsPageProps) { - setupI18nSSR(); +export default async function DocumentsLogsPage({ params }: DocumentsLogsPageProps) { + await setupI18nSSR(); return ; } diff --git a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx index 101b707fb..4e570effe 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx @@ -8,8 +8,8 @@ export type DocumentPageProps = { }; }; -export default function DocumentPage({ params }: DocumentPageProps) { - setupI18nSSR(); +export default async function DocumentPage({ params }: DocumentPageProps) { + await setupI18nSSR(); return ; } diff --git a/apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx b/apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx index b6938f154..9d6e20535 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx @@ -5,8 +5,8 @@ import { ChevronLeft } from 'lucide-react'; import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server'; -export default function DocumentSentPage() { - setupI18nSSR(); +export default async function DocumentSentPage() { + await setupI18nSSR(); return (
diff --git a/apps/web/src/app/(dashboard)/documents/page.tsx b/apps/web/src/app/(dashboard)/documents/page.tsx index 241bee6f0..41cbf3df9 100644 --- a/apps/web/src/app/(dashboard)/documents/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/page.tsx @@ -16,7 +16,7 @@ export const metadata: Metadata = { }; export default async function DocumentsPage({ searchParams = {} }: DocumentsPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { user } = await getRequiredServerComponentSession(); diff --git a/apps/web/src/app/(dashboard)/layout.tsx b/apps/web/src/app/(dashboard)/layout.tsx index 92cbbfecb..90096b0e3 100644 --- a/apps/web/src/app/(dashboard)/layout.tsx +++ b/apps/web/src/app/(dashboard)/layout.tsx @@ -23,7 +23,7 @@ export type AuthenticatedDashboardLayoutProps = { export default async function AuthenticatedDashboardLayout({ children, }: AuthenticatedDashboardLayoutProps) { - setupI18nSSR(); + await setupI18nSSR(); const session = await getServerSession(NEXT_AUTH_OPTIONS); diff --git a/apps/web/src/app/(dashboard)/settings/billing/page.tsx b/apps/web/src/app/(dashboard)/settings/billing/page.tsx index 4f1e69334..e60698818 100644 --- a/apps/web/src/app/(dashboard)/settings/billing/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/billing/page.tsx @@ -24,7 +24,7 @@ export const metadata: Metadata = { }; export default async function BillingSettingsPage() { - const { i18n } = setupI18nSSR(); + const { i18n } = await setupI18nSSR(); let { user } = await getRequiredServerComponentSession(); diff --git a/apps/web/src/app/(dashboard)/settings/layout.tsx b/apps/web/src/app/(dashboard)/settings/layout.tsx index 7d15d4874..9c472cf07 100644 --- a/apps/web/src/app/(dashboard)/settings/layout.tsx +++ b/apps/web/src/app/(dashboard)/settings/layout.tsx @@ -11,8 +11,8 @@ export type DashboardSettingsLayoutProps = { children: React.ReactNode; }; -export default function DashboardSettingsLayout({ children }: DashboardSettingsLayoutProps) { - setupI18nSSR(); +export default async function DashboardSettingsLayout({ children }: DashboardSettingsLayoutProps) { + await setupI18nSSR(); return (
diff --git a/apps/web/src/app/(dashboard)/settings/profile/page.tsx b/apps/web/src/app/(dashboard)/settings/profile/page.tsx index a9c47f245..214f73ad2 100644 --- a/apps/web/src/app/(dashboard)/settings/profile/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/profile/page.tsx @@ -17,7 +17,7 @@ export const metadata: Metadata = { }; export default async function ProfileSettingsPage() { - setupI18nSSR(); + await setupI18nSSR(); const { _ } = useLingui(); const { user } = await getRequiredServerComponentSession(); diff --git a/apps/web/src/app/(dashboard)/settings/public-profile/page.tsx b/apps/web/src/app/(dashboard)/settings/public-profile/page.tsx index 673fb9328..8fcf1bca2 100644 --- a/apps/web/src/app/(dashboard)/settings/public-profile/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/public-profile/page.tsx @@ -5,7 +5,7 @@ import { getUserPublicProfile } from '@documenso/lib/server-only/user/get-user-p import { PublicProfilePageView } from './public-profile-page-view'; export default async function Page() { - setupI18nSSR(); + await setupI18nSSR(); const { user } = await getRequiredServerComponentSession(); diff --git a/apps/web/src/app/(dashboard)/settings/security/activity/page.tsx b/apps/web/src/app/(dashboard)/settings/security/activity/page.tsx index 2b46a653c..79563ffd5 100644 --- a/apps/web/src/app/(dashboard)/settings/security/activity/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/security/activity/page.tsx @@ -14,8 +14,8 @@ export const metadata: Metadata = { title: 'Security activity', }; -export default function SettingsSecurityActivityPage() { - setupI18nSSR(); +export default async function SettingsSecurityActivityPage() { + await setupI18nSSR(); const { _ } = useLingui(); diff --git a/apps/web/src/app/(dashboard)/settings/security/page.tsx b/apps/web/src/app/(dashboard)/settings/security/page.tsx index cbe35d254..1f3d4de08 100644 --- a/apps/web/src/app/(dashboard)/settings/security/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/security/page.tsx @@ -21,7 +21,7 @@ export const metadata: Metadata = { }; export default async function SecuritySettingsPage() { - setupI18nSSR(); + await setupI18nSSR(); const { _ } = useLingui(); const { user } = await getRequiredServerComponentSession(); diff --git a/apps/web/src/app/(dashboard)/settings/security/passkeys/page.tsx b/apps/web/src/app/(dashboard)/settings/security/passkeys/page.tsx index 106916b3c..c9ec4153a 100644 --- a/apps/web/src/app/(dashboard)/settings/security/passkeys/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/security/passkeys/page.tsx @@ -17,7 +17,7 @@ export const metadata: Metadata = { }; export default async function SettingsManagePasskeysPage() { - setupI18nSSR(); + await setupI18nSSR(); const { _ } = useLingui(); const isPasskeyEnabled = await getServerComponentFlag('app_passkey'); diff --git a/apps/web/src/app/(dashboard)/settings/tokens/page.tsx b/apps/web/src/app/(dashboard)/settings/tokens/page.tsx index ae01e6802..ad90b54d5 100644 --- a/apps/web/src/app/(dashboard)/settings/tokens/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/tokens/page.tsx @@ -10,7 +10,7 @@ import DeleteTokenDialog from '~/components/(dashboard)/settings/token/delete-to import { ApiTokenForm } from '~/components/forms/token'; export default async function ApiTokensPage() { - const { i18n } = setupI18nSSR(); + const { i18n } = await setupI18nSSR(); const { user } = await getRequiredServerComponentSession(); diff --git a/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx b/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx index 9efd6e3b9..766d45caa 100644 --- a/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx +++ b/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx @@ -7,6 +7,7 @@ import { useRouter } from 'next/navigation'; import { msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; +import { isValidLanguageCode } from '@documenso/lib/constants/i18n'; import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION, SKIP_QUERY_BATCH_META, @@ -151,7 +152,10 @@ export const EditTemplateForm = ({ globalAccessAuth: data.globalAccessAuth ?? null, globalActionAuth: data.globalActionAuth ?? null, }, - meta: data.meta, + meta: { + ...data.meta, + language: isValidLanguageCode(data.meta.language) ? data.meta.language : undefined, + }, }); // Router refresh is here to clear the router cache for when navigating to /documents. diff --git a/apps/web/src/app/(dashboard)/templates/[id]/page.tsx b/apps/web/src/app/(dashboard)/templates/[id]/page.tsx index 5c5699c25..0deaf4ecb 100644 --- a/apps/web/src/app/(dashboard)/templates/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/templates/[id]/page.tsx @@ -7,8 +7,8 @@ import { TemplatePageView } from './template-page-view'; type TemplatePageProps = Pick; -export default function TemplatePage({ params }: TemplatePageProps) { - setupI18nSSR(); +export default async function TemplatePage({ params }: TemplatePageProps) { + await setupI18nSSR(); return ; } diff --git a/apps/web/src/app/(dashboard)/templates/page.tsx b/apps/web/src/app/(dashboard)/templates/page.tsx index 7f910efa5..886eba88e 100644 --- a/apps/web/src/app/(dashboard)/templates/page.tsx +++ b/apps/web/src/app/(dashboard)/templates/page.tsx @@ -15,8 +15,8 @@ export const metadata: Metadata = { title: 'Templates', }; -export default function TemplatesPage({ searchParams = {} }: TemplatesPageProps) { - setupI18nSSR(); +export default async function TemplatesPage({ searchParams = {} }: TemplatesPageProps) { + await setupI18nSSR(); return ; } diff --git a/apps/web/src/app/(profile)/layout.tsx b/apps/web/src/app/(profile)/layout.tsx index 43f263de7..d43e44172 100644 --- a/apps/web/src/app/(profile)/layout.tsx +++ b/apps/web/src/app/(profile)/layout.tsx @@ -14,7 +14,7 @@ type PublicProfileLayoutProps = { }; export default async function PublicProfileLayout({ children }: PublicProfileLayoutProps) { - setupI18nSSR(); + await setupI18nSSR(); const { user, session } = await getServerComponentSession(); diff --git a/apps/web/src/app/(profile)/p/[url]/page.tsx b/apps/web/src/app/(profile)/p/[url]/page.tsx index e276417d2..67226c5cb 100644 --- a/apps/web/src/app/(profile)/p/[url]/page.tsx +++ b/apps/web/src/app/(profile)/p/[url]/page.tsx @@ -42,7 +42,7 @@ const BADGE_DATA = { }; export default async function PublicProfilePage({ params }: PublicProfilePageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { url: profileUrl } = params; diff --git a/apps/web/src/app/(recipient)/d/[token]/page.tsx b/apps/web/src/app/(recipient)/d/[token]/page.tsx index 0cc3b1a2c..a2ace350c 100644 --- a/apps/web/src/app/(recipient)/d/[token]/page.tsx +++ b/apps/web/src/app/(recipient)/d/[token]/page.tsx @@ -24,7 +24,7 @@ export type TemplatesDirectPageProps = { }; export default async function TemplatesDirectPage({ params }: TemplatesDirectPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { token } = params; diff --git a/apps/web/src/app/(recipient)/layout.tsx b/apps/web/src/app/(recipient)/layout.tsx index e24c7d088..54477b458 100644 --- a/apps/web/src/app/(recipient)/layout.tsx +++ b/apps/web/src/app/(recipient)/layout.tsx @@ -19,7 +19,7 @@ type RecipientLayoutProps = { * Such as direct template access, or signing. */ export default async function RecipientLayout({ children }: RecipientLayoutProps) { - setupI18nSSR(); + await setupI18nSSR(); const { user, session } = await getServerComponentSession(); diff --git a/apps/web/src/app/(signing)/sign/[token]/complete/layout.tsx b/apps/web/src/app/(signing)/sign/[token]/complete/layout.tsx index 0798e5098..23a5f1278 100644 --- a/apps/web/src/app/(signing)/sign/[token]/complete/layout.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/complete/layout.tsx @@ -8,8 +8,8 @@ export type SigningLayoutProps = { children: React.ReactNode; }; -export default function SigningLayout({ children }: SigningLayoutProps) { - setupI18nSSR(); +export default async function SigningLayout({ children }: SigningLayoutProps) { + await setupI18nSSR(); return (
diff --git a/apps/web/src/app/(signing)/sign/[token]/complete/page.tsx b/apps/web/src/app/(signing)/sign/[token]/complete/page.tsx index a234375c2..7e183da1d 100644 --- a/apps/web/src/app/(signing)/sign/[token]/complete/page.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/complete/page.tsx @@ -40,7 +40,7 @@ export type CompletedSigningPageProps = { export default async function CompletedSigningPage({ params: { token }, }: CompletedSigningPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { _ } = useLingui(); diff --git a/apps/web/src/app/(signing)/sign/[token]/layout.tsx b/apps/web/src/app/(signing)/sign/[token]/layout.tsx index c9be8130b..9ecb8487b 100644 --- a/apps/web/src/app/(signing)/sign/[token]/layout.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/layout.tsx @@ -13,7 +13,7 @@ export type SigningLayoutProps = { }; export default async function SigningLayout({ children }: SigningLayoutProps) { - setupI18nSSR(); + await setupI18nSSR(); const { user, session } = await getServerComponentSession(); diff --git a/apps/web/src/app/(signing)/sign/[token]/page.tsx b/apps/web/src/app/(signing)/sign/[token]/page.tsx index 0a2c59520..ca7afafa2 100644 --- a/apps/web/src/app/(signing)/sign/[token]/page.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/page.tsx @@ -31,7 +31,7 @@ export type SigningPageProps = { }; export default async function SigningPage({ params: { token } }: SigningPageProps) { - setupI18nSSR(); + await setupI18nSSR(); if (!token) { return notFound(); diff --git a/apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx b/apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx index bf5466215..f53c10e27 100644 --- a/apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx @@ -21,7 +21,7 @@ type WaitingForTurnToSignPageProps = { export default async function WaitingForTurnToSignPage({ params: { token }, }: WaitingForTurnToSignPageProps) { - setupI18nSSR(); + await setupI18nSSR(); if (!token) { return notFound(); diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/edit/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/edit/page.tsx index c04779105..ea6351ad9 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/edit/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/edit/page.tsx @@ -12,7 +12,7 @@ export type DocumentPageProps = { }; export default async function TeamsDocumentEditPage({ params }: DocumentPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { teamUrl } = params; diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/logs/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/logs/page.tsx index effd426c5..9f83273e4 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/logs/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/logs/page.tsx @@ -12,7 +12,7 @@ export type TeamDocumentsLogsPageProps = { }; export default async function TeamsDocumentsLogsPage({ params }: TeamDocumentsLogsPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { teamUrl } = params; diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx index 2d734d944..30bd93555 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx @@ -12,7 +12,7 @@ export type DocumentPageProps = { }; export default async function DocumentPage({ params }: DocumentPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { teamUrl } = params; diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx index dba102909..0d5b9692f 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx @@ -16,7 +16,7 @@ export default async function TeamsDocumentPage({ params, searchParams = {}, }: TeamsDocumentPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { teamUrl } = params; diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/layout.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/layout.tsx index cd1676591..f5d2a48d1 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/layout.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/layout.tsx @@ -27,7 +27,7 @@ export default async function AuthenticatedTeamsLayout({ children, params, }: AuthenticatedTeamsLayoutProps) { - setupI18nSSR(); + await setupI18nSSR(); const { session, user } = await getServerComponentSession(); diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx index a12e02665..dc13b630c 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx @@ -21,7 +21,7 @@ export type TeamsSettingsBillingPageProps = { }; export default async function TeamsSettingBillingPage({ params }: TeamsSettingsBillingPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { _ } = useLingui(); diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/layout.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/layout.tsx index 04ebe3e3f..c2fc3c39e 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/settings/layout.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/layout.tsx @@ -24,7 +24,7 @@ export default async function TeamsSettingsLayout({ children, params: { teamUrl }, }: TeamSettingsLayoutProps) { - setupI18nSSR(); + await setupI18nSSR(); const session = await getRequiredServerComponentSession(); diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/members/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/members/page.tsx index 0ca35c8c9..cda20f9c0 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/settings/members/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/members/page.tsx @@ -16,7 +16,7 @@ export type TeamsSettingsMembersPageProps = { }; export default async function TeamsSettingsMembersPage({ params }: TeamsSettingsMembersPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { _ } = useLingui(); const { teamUrl } = params; diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx index b9ffc4e63..3a72cb255 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx @@ -28,7 +28,7 @@ export type TeamsSettingsPageProps = { }; export default async function TeamsSettingsPage({ params }: TeamsSettingsPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { teamUrl } = params; diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/public-profile/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/public-profile/page.tsx index b8e6f2cc5..d184f2845 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/settings/public-profile/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/public-profile/page.tsx @@ -14,7 +14,7 @@ export type TeamsSettingsPublicProfilePageProps = { export default async function TeamsSettingsPublicProfilePage({ params, }: TeamsSettingsPublicProfilePageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { teamUrl } = params; diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx index 43b85483e..d3dd91b2c 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx @@ -21,7 +21,7 @@ type ApiTokensPageProps = { }; export default async function ApiTokensPage({ params }: ApiTokensPageProps) { - const { i18n } = setupI18nSSR(); + const { i18n } = await setupI18nSSR(); const { teamUrl } = params; diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/page.tsx index a4773e583..2efcf7c5e 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/page.tsx @@ -14,7 +14,7 @@ type TeamTemplatePageProps = { }; export default async function TeamTemplatePage({ params }: TeamTemplatePageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { teamUrl } = params; diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/templates/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/templates/page.tsx index 4bae127ef..784866148 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/templates/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/templates/page.tsx @@ -18,7 +18,7 @@ export default async function TeamTemplatesPage({ searchParams = {}, params, }: TeamTemplatesPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const { teamUrl } = params; diff --git a/apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx b/apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx index 3ac77e01a..160215df8 100644 --- a/apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx +++ b/apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx @@ -7,8 +7,8 @@ import { Button } from '@documenso/ui/primitives/button'; const SUPPORT_EMAIL = 'support@documenso.com'; -export default function SignatureDisclosure() { - setupI18nSSR(); +export default async function SignatureDisclosure() { + await setupI18nSSR(); return (
diff --git a/apps/web/src/app/(unauthenticated)/check-email/page.tsx b/apps/web/src/app/(unauthenticated)/check-email/page.tsx index a91a2f7a2..a0aa50fae 100644 --- a/apps/web/src/app/(unauthenticated)/check-email/page.tsx +++ b/apps/web/src/app/(unauthenticated)/check-email/page.tsx @@ -10,8 +10,8 @@ export const metadata: Metadata = { title: 'Forgot password', }; -export default function ForgotPasswordPage() { - setupI18nSSR(); +export default async function ForgotPasswordPage() { + await setupI18nSSR(); return (
diff --git a/apps/web/src/app/(unauthenticated)/forgot-password/page.tsx b/apps/web/src/app/(unauthenticated)/forgot-password/page.tsx index 72a757732..0bb05587a 100644 --- a/apps/web/src/app/(unauthenticated)/forgot-password/page.tsx +++ b/apps/web/src/app/(unauthenticated)/forgot-password/page.tsx @@ -11,8 +11,8 @@ export const metadata: Metadata = { title: 'Forgot Password', }; -export default function ForgotPasswordPage() { - setupI18nSSR(); +export default async function ForgotPasswordPage() { + await setupI18nSSR(); return (
diff --git a/apps/web/src/app/(unauthenticated)/layout.tsx b/apps/web/src/app/(unauthenticated)/layout.tsx index 994bb3ac2..2b70d2610 100644 --- a/apps/web/src/app/(unauthenticated)/layout.tsx +++ b/apps/web/src/app/(unauthenticated)/layout.tsx @@ -9,8 +9,8 @@ type UnauthenticatedLayoutProps = { children: React.ReactNode; }; -export default function UnauthenticatedLayout({ children }: UnauthenticatedLayoutProps) { - setupI18nSSR(); +export default async function UnauthenticatedLayout({ children }: UnauthenticatedLayoutProps) { + await setupI18nSSR(); return (
diff --git a/apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx b/apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx index 7f594c0ed..1bbca3cfe 100644 --- a/apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx +++ b/apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx @@ -15,7 +15,7 @@ type ResetPasswordPageProps = { }; export default async function ResetPasswordPage({ params: { token } }: ResetPasswordPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const isValid = await getResetTokenValidity({ token }); diff --git a/apps/web/src/app/(unauthenticated)/reset-password/page.tsx b/apps/web/src/app/(unauthenticated)/reset-password/page.tsx index ad478a7bb..fc54aceec 100644 --- a/apps/web/src/app/(unauthenticated)/reset-password/page.tsx +++ b/apps/web/src/app/(unauthenticated)/reset-password/page.tsx @@ -10,8 +10,8 @@ export const metadata: Metadata = { title: 'Reset Password', }; -export default function ResetPasswordPage() { - setupI18nSSR(); +export default async function ResetPasswordPage() { + await setupI18nSSR(); return (
diff --git a/apps/web/src/app/(unauthenticated)/signin/page.tsx b/apps/web/src/app/(unauthenticated)/signin/page.tsx index f7e62675b..9b041e22b 100644 --- a/apps/web/src/app/(unauthenticated)/signin/page.tsx +++ b/apps/web/src/app/(unauthenticated)/signin/page.tsx @@ -17,8 +17,8 @@ export const metadata: Metadata = { title: 'Sign In', }; -export default function SignInPage() { - setupI18nSSR(); +export default async function SignInPage() { + await setupI18nSSR(); const NEXT_PUBLIC_DISABLE_SIGNUP = env('NEXT_PUBLIC_DISABLE_SIGNUP'); diff --git a/apps/web/src/app/(unauthenticated)/signup/page.tsx b/apps/web/src/app/(unauthenticated)/signup/page.tsx index bdcf9c37f..7686d2f70 100644 --- a/apps/web/src/app/(unauthenticated)/signup/page.tsx +++ b/apps/web/src/app/(unauthenticated)/signup/page.tsx @@ -12,8 +12,8 @@ export const metadata: Metadata = { title: 'Sign Up', }; -export default function SignUpPage() { - setupI18nSSR(); +export default async function SignUpPage() { + await setupI18nSSR(); const NEXT_PUBLIC_DISABLE_SIGNUP = env('NEXT_PUBLIC_DISABLE_SIGNUP'); diff --git a/apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx b/apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx index 69d0cad8b..06c7dadc9 100644 --- a/apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx +++ b/apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx @@ -21,7 +21,7 @@ type DeclineInvitationPageProps = { export default async function DeclineInvitationPage({ params: { token }, }: DeclineInvitationPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const session = await getServerComponentSession(); diff --git a/apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx b/apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx index 5e76f8d65..3441dbed7 100644 --- a/apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx +++ b/apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx @@ -21,7 +21,7 @@ type AcceptInvitationPageProps = { export default async function AcceptInvitationPage({ params: { token }, }: AcceptInvitationPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const session = await getServerComponentSession(); diff --git a/apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx b/apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx index 0314646cb..b53fb5f71 100644 --- a/apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx +++ b/apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx @@ -14,7 +14,7 @@ type VerifyTeamEmailPageProps = { }; export default async function VerifyTeamEmailPage({ params: { token } }: VerifyTeamEmailPageProps) { - setupI18nSSR(); + await setupI18nSSR(); const teamEmailVerification = await prisma.teamEmailVerification.findUnique({ where: { diff --git a/apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx b/apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx index ae4e7e97f..8713aeecd 100644 --- a/apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx +++ b/apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx @@ -17,7 +17,7 @@ type VerifyTeamTransferPage = { export default async function VerifyTeamTransferPage({ params: { token }, }: VerifyTeamTransferPage) { - setupI18nSSR(); + await setupI18nSSR(); const teamTransferVerification = await prisma.teamTransferVerification.findUnique({ where: { diff --git a/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx b/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx index 70b94c2cc..3c3588c1e 100644 --- a/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx +++ b/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx @@ -5,8 +5,8 @@ import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server'; import { SendConfirmationEmailForm } from '~/components/forms/send-confirmation-email'; -export default function UnverifiedAccount() { - setupI18nSSR(); +export default async function UnverifiedAccount() { + await setupI18nSSR(); return (
diff --git a/apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx b/apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx index b3edcb3c9..eb88538c4 100644 --- a/apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx +++ b/apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx @@ -23,7 +23,7 @@ export type PageProps = { }; export default async function VerifyEmailPage({ params: { token } }: PageProps) { - setupI18nSSR(); + await setupI18nSSR(); if (!token) { return ( diff --git a/apps/web/src/app/(unauthenticated)/verify-email/page.tsx b/apps/web/src/app/(unauthenticated)/verify-email/page.tsx index 6fcfaec9b..cd518a913 100644 --- a/apps/web/src/app/(unauthenticated)/verify-email/page.tsx +++ b/apps/web/src/app/(unauthenticated)/verify-email/page.tsx @@ -11,8 +11,8 @@ export const metadata: Metadata = { title: 'Verify Email', }; -export default function EmailVerificationWithoutTokenPage() { - setupI18nSSR(); +export default async function EmailVerificationWithoutTokenPage() { + await setupI18nSSR(); return (
diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index c4a6ffd3a..53d735200 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -56,7 +56,7 @@ export function generateMetadata() { export default async function RootLayout({ children }: { children: React.ReactNode }) { const flags = await getServerComponentAllFlags(); - const { i18n, lang, locales } = setupI18nSSR(); + const { i18n, lang, locales } = await setupI18nSSR(); return ( Documenso
; } diff --git a/lingui.config.ts b/lingui.config.ts index 855aaf7f5..8026d461f 100644 --- a/lingui.config.ts +++ b/lingui.config.ts @@ -19,7 +19,7 @@ const config: LinguiConfig = { }, { path: '/packages/lib/translations/{locale}/common', - include: ['packages/ui', 'packages/lib'], + include: ['packages/ui', 'packages/lib', 'packages/email'], exclude: ['**/node_modules/**'], }, ], diff --git a/package-lock.json b/package-lock.json index 27f0b5f26..956db402e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36774,6 +36774,9 @@ "@documenso/email": "*", "@documenso/prisma": "*", "@documenso/signing": "*", + "@lingui/core": "^4.11.3", + "@lingui/macro": "^4.11.3", + "@lingui/react": "^4.11.3", "@next-auth/prisma-adapter": "1.0.7", "@noble/ciphers": "0.4.0", "@noble/hashes": "1.3.2", diff --git a/packages/api/v1/implementation.ts b/packages/api/v1/implementation.ts index fc1aae04c..fda6ad1a4 100644 --- a/packages/api/v1/implementation.ts +++ b/packages/api/v1/implementation.ts @@ -301,6 +301,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { dateFormat: dateFormat?.value, redirectUrl: body.meta.redirectUrl, signingOrder: body.meta.signingOrder, + language: body.meta.language, requestMetadata: extractNextApiRequestMetadata(args.req), }); diff --git a/packages/api/v1/schema.ts b/packages/api/v1/schema.ts index a6d4618ad..a4fab1089 100644 --- a/packages/api/v1/schema.ts +++ b/packages/api/v1/schema.ts @@ -2,6 +2,7 @@ import { extendZodWithOpenApi } from '@anatine/zod-openapi'; import { z } from 'zod'; import { DATE_FORMATS, DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats'; +import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n'; import '@documenso/lib/constants/time-zones'; import { DEFAULT_DOCUMENT_TIME_ZONE, TIME_ZONES } from '@documenso/lib/constants/time-zones'; import { ZUrlSchema } from '@documenso/lib/schemas/common'; @@ -127,6 +128,7 @@ export const ZCreateDocumentMutationSchema = z.object({ }), redirectUrl: z.string(), signingOrder: z.nativeEnum(DocumentSigningOrder).optional(), + language: z.enum(SUPPORTED_LANGUAGE_CODES).optional(), }) .partial(), authOptions: z @@ -181,6 +183,7 @@ export const ZCreateDocumentFromTemplateMutationSchema = z.object({ dateFormat: z.string(), redirectUrl: z.string(), signingOrder: z.nativeEnum(DocumentSigningOrder).optional(), + language: z.enum(SUPPORTED_LANGUAGE_CODES).optional(), }) .partial() .optional(), @@ -247,6 +250,7 @@ export const ZGenerateDocumentFromTemplateMutationSchema = z.object({ dateFormat: z.string(), redirectUrl: ZUrlSchema, signingOrder: z.nativeEnum(DocumentSigningOrder).optional(), + language: z.enum(SUPPORTED_LANGUAGE_CODES).optional(), }) .partial() .optional(), diff --git a/packages/email/render.ts b/packages/email/render.ts deleted file mode 100644 index 46f0d62a5..000000000 --- a/packages/email/render.ts +++ /dev/null @@ -1 +0,0 @@ -export { render, renderAsync } from '@react-email/render'; diff --git a/packages/email/render.tsx b/packages/email/render.tsx new file mode 100644 index 000000000..2a79c8252 --- /dev/null +++ b/packages/email/render.tsx @@ -0,0 +1,39 @@ +import * as reactEmail from '@react-email/render'; + +import config from '@documenso/tailwind-config'; + +import { Tailwind } from './components'; + +export const render: typeof reactEmail.render = (element, options) => { + return reactEmail.render( + + {element} + , + options, + ); +}; + +export const renderAsync: typeof reactEmail.renderAsync = async (element, options) => { + return reactEmail.renderAsync( + + {element} + , + options, + ); +}; diff --git a/packages/email/template-components/template-confirmation-email.tsx b/packages/email/template-components/template-confirmation-email.tsx index 1036faa3e..0c3c687ec 100644 --- a/packages/email/template-components/template-confirmation-email.tsx +++ b/packages/email/template-components/template-confirmation-email.tsx @@ -1,3 +1,6 @@ +import { Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; + import { Button, Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; @@ -10,17 +13,21 @@ export const TemplateConfirmationEmail = ({ confirmationLink, assetBaseUrl, }: TemplateConfirmationEmailProps) => { + const { _ } = useLingui(); + return ( <>
- Welcome to Documenso! + Welcome to Documenso! - Before you get started, please confirm your email address by clicking the button below: + + Before you get started, please confirm your email address by clicking the button below: +
@@ -28,11 +35,13 @@ export const TemplateConfirmationEmail = ({ className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline" href={confirmationLink} > - Confirm email + Confirm email - You can also copy and paste this link into your browser: {confirmationLink} (link - expires in 1 hour) + + You can also copy and paste this link into your browser: {confirmationLink} (link + expires in 1 hour) +
diff --git a/packages/email/template-components/template-document-cancel.tsx b/packages/email/template-components/template-document-cancel.tsx index dff275de2..d6e1b4221 100644 --- a/packages/email/template-components/template-document-cancel.tsx +++ b/packages/email/template-components/template-document-cancel.tsx @@ -1,3 +1,5 @@ +import { Trans } from '@lingui/macro'; + import { Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; @@ -19,16 +21,18 @@ export const TemplateDocumentCancel = ({
- {inviterName} has cancelled the document -
"{documentName}" + + {inviterName} has cancelled the document +
"{documentName}" +
- All signatures have been voided. + All signatures have been voided. - You don't need to sign it anymore. + You don't need to sign it anymore.
diff --git a/packages/email/template-components/template-document-completed.tsx b/packages/email/template-components/template-document-completed.tsx index 8829c8d06..ed1dfc25e 100644 --- a/packages/email/template-components/template-document-completed.tsx +++ b/packages/email/template-components/template-document-completed.tsx @@ -1,3 +1,5 @@ +import { Trans } from '@lingui/macro'; + import { Button, Column, Img, Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; @@ -30,17 +32,17 @@ export const TemplateDocumentCompleted = ({ src={getAssetUrl('/static/completed.png')} className="-mt-0.5 mr-2 inline h-7 w-7 align-middle" /> - Completed + Completed - {customBody ?? `“${documentName}” was signed by all signers`} + {customBody ?? `“${documentName}” was signed by all signers`} - Continue by downloading the document. + Continue by downloading the document.
@@ -59,7 +61,7 @@ export const TemplateDocumentCompleted = ({ src={getAssetUrl('/static/download.png')} className="mb-0.5 mr-2 inline h-5 w-5 align-middle" /> - Download + Download
diff --git a/packages/email/template-components/template-document-invite.tsx b/packages/email/template-components/template-document-invite.tsx index 62d049e13..6f59bab2c 100644 --- a/packages/email/template-components/template-document-invite.tsx +++ b/packages/email/template-components/template-document-invite.tsx @@ -1,3 +1,6 @@ +import { Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; + import { RECIPIENT_ROLES_DESCRIPTION_ENG } from '@documenso/lib/constants/recipient-roles'; import type { RecipientRole } from '@documenso/prisma/client'; @@ -26,6 +29,8 @@ export const TemplateDocumentInvite = ({ isTeamInvite, teamName, }: TemplateDocumentInviteProps) => { + const { _ } = useLingui(); + const { actionVerb, progressiveVerb } = RECIPIENT_ROLES_DESCRIPTION_ENG[role]; return ( @@ -35,28 +40,30 @@ export const TemplateDocumentInvite = ({
{selfSigner ? ( - <> - {`Please ${actionVerb.toLowerCase()} your document`} + + {`Please ${_(actionVerb).toLowerCase()} your document`}
{`"${documentName}"`} - +
) : isTeamInvite ? ( - <> - {`${inviterName} on behalf of ${teamName} has invited you to ${actionVerb.toLowerCase()}`} + + {`${inviterName} on behalf of ${teamName} has invited you to ${_( + actionVerb, + ).toLowerCase()}`}
{`"${documentName}"`} - +
) : ( - <> - {`${inviterName} has invited you to ${actionVerb.toLowerCase()}`} + + {`${inviterName} has invited you to ${_(actionVerb).toLowerCase()}`}
{`"${documentName}"`} - +
)}
- Continue by {progressiveVerb.toLowerCase()} the document. + Continue by {_(progressiveVerb).toLowerCase()} the document.
@@ -64,7 +71,7 @@ export const TemplateDocumentInvite = ({ className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline" href={signDocumentLink} > - {actionVerb} Document + {_(actionVerb)} Document
diff --git a/packages/email/template-components/template-document-pending.tsx b/packages/email/template-components/template-document-pending.tsx index f03d7bdbb..161f519dc 100644 --- a/packages/email/template-components/template-document-pending.tsx +++ b/packages/email/template-components/template-document-pending.tsx @@ -1,3 +1,5 @@ +import { Trans } from '@lingui/macro'; + import { Column, Img, Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; @@ -26,19 +28,21 @@ export const TemplateDocumentPending = ({ src={getAssetUrl('/static/clock.png')} className="-mt-0.5 mr-2 inline h-7 w-7 align-middle" /> - Waiting for others + Waiting for others - “{documentName}” has been signed + “{documentName}” has been signed - We're still waiting for other signers to sign this document. -
- We'll notify you as soon as it's ready. + + We're still waiting for other signers to sign this document. +
+ We'll notify you as soon as it's ready. +
diff --git a/packages/email/template-components/template-document-self-signed.tsx b/packages/email/template-components/template-document-self-signed.tsx index db16fb000..f62b3e650 100644 --- a/packages/email/template-components/template-document-self-signed.tsx +++ b/packages/email/template-components/template-document-self-signed.tsx @@ -1,3 +1,4 @@ +import { Trans } from '@lingui/macro'; import { env } from 'next-runtime-env'; import { Button, Column, Img, Link, Section, Text } from '../components'; @@ -32,25 +33,27 @@ export const TemplateDocumentSelfSigned = ({ src={getAssetUrl('/static/completed.png')} className="-mt-0.5 mr-2 inline h-7 w-7 align-middle" /> - Completed + Completed - You have signed “{documentName}” + You have signed “{documentName}” - Create a{' '} - - free account - {' '} - to access your signed documents at any time. + + Create a{' '} + + free account + {' '} + to access your signed documents at any time. +
@@ -62,7 +65,7 @@ export const TemplateDocumentSelfSigned = ({ src={getAssetUrl('/static/user-plus.png')} className="mb-0.5 mr-2 inline h-5 w-5 align-middle" /> - Create account + Create account
diff --git a/packages/email/template-components/template-document-super-delete.tsx b/packages/email/template-components/template-document-super-delete.tsx index 9cb0a9e71..b26a6f105 100644 --- a/packages/email/template-components/template-document-super-delete.tsx +++ b/packages/email/template-components/template-document-super-delete.tsx @@ -1,3 +1,5 @@ +import { Trans } from '@lingui/macro'; + import { Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; @@ -18,20 +20,22 @@ export const TemplateDocumentDelete = ({
- Your document has been deleted by an admin! + Your document has been deleted by an admin! - "{documentName}" has been deleted by an admin. + "{documentName}" has been deleted by an admin. - This document can not be recovered, if you would like to dispute the reason for future - documents please contact support. + + This document can not be recovered, if you would like to dispute the reason for future + documents please contact support. + - The reason provided for deletion is the following: + The reason provided for deletion is the following: diff --git a/packages/email/template-components/template-footer.tsx b/packages/email/template-components/template-footer.tsx index 34cd4047e..36ecbb950 100644 --- a/packages/email/template-components/template-footer.tsx +++ b/packages/email/template-components/template-footer.tsx @@ -1,3 +1,5 @@ +import { Trans } from '@lingui/macro'; + import { Link, Section, Text } from '../components'; export type TemplateFooterProps = { @@ -9,10 +11,12 @@ export const TemplateFooter = ({ isDocument = true }: TemplateFooterProps) => {
{isDocument && ( - This document was sent using{' '} - - Documenso. - + + This document was sent using{' '} + + Documenso. + + )} diff --git a/packages/email/template-components/template-forgot-password.tsx b/packages/email/template-components/template-forgot-password.tsx index c8227b2bd..1ab319a43 100644 --- a/packages/email/template-components/template-forgot-password.tsx +++ b/packages/email/template-components/template-forgot-password.tsx @@ -1,3 +1,5 @@ +import { Trans } from '@lingui/macro'; + import { Button, Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; @@ -16,11 +18,11 @@ export const TemplateForgotPassword = ({
- Forgot your password? + Forgot your password? - That's okay, it happens! Click the button below to reset your password. + That's okay, it happens! Click the button below to reset your password.
@@ -28,7 +30,7 @@ export const TemplateForgotPassword = ({ className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline" href={resetPasswordLink} > - Reset Password + Reset Password
diff --git a/packages/email/template-components/template-reset-password.tsx b/packages/email/template-components/template-reset-password.tsx index d05393c83..d264385e4 100644 --- a/packages/email/template-components/template-reset-password.tsx +++ b/packages/email/template-components/template-reset-password.tsx @@ -1,3 +1,4 @@ +import { Trans } from '@lingui/macro'; import { env } from 'next-runtime-env'; import { Button, Section, Text } from '../components'; @@ -18,11 +19,11 @@ export const TemplateResetPassword = ({ assetBaseUrl }: TemplateResetPasswordPro
- Password updated! + Password updated! - Your password has been updated. + Your password has been updated.
@@ -30,7 +31,7 @@ export const TemplateResetPassword = ({ assetBaseUrl }: TemplateResetPasswordPro className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline" href={`${NEXT_PUBLIC_WEBAPP_URL ?? 'http://localhost:3000'}/signin`} > - Sign In + Sign In
diff --git a/packages/email/templates/confirm-email.tsx b/packages/email/templates/confirm-email.tsx index 59c7add10..4d39f12d6 100644 --- a/packages/email/templates/confirm-email.tsx +++ b/packages/email/templates/confirm-email.tsx @@ -1,6 +1,7 @@ -import config from '@documenso/tailwind-config'; +import { msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components'; +import { Body, Container, Head, Html, Img, Preview, Section } from '../components'; import type { TemplateConfirmationEmailProps } from '../template-components/template-confirmation-email'; import { TemplateConfirmationEmail } from '../template-components/template-confirmation-email'; import { TemplateFooter } from '../template-components/template-footer'; @@ -9,7 +10,9 @@ export const ConfirmEmailTemplate = ({ confirmationLink, assetBaseUrl = 'http://localhost:3002', }: TemplateConfirmationEmailProps) => { - const previewText = `Please confirm your email address`; + const { _ } = useLingui(); + + const previewText = msg`Please confirm your email address`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); @@ -18,40 +21,30 @@ export const ConfirmEmailTemplate = ({ return ( - {previewText} - - -
- -
- Documenso Logo + {_(previewText)} + +
+ +
+ Documenso Logo - -
-
-
+ +
+ +
- - - -
- - + + + +
+ ); }; diff --git a/packages/email/templates/confirm-team-email.tsx b/packages/email/templates/confirm-team-email.tsx index 552a079f8..8fa3afd3d 100644 --- a/packages/email/templates/confirm-team-email.tsx +++ b/packages/email/templates/confirm-team-email.tsx @@ -1,5 +1,7 @@ +import { msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; + import { formatTeamUrl } from '@documenso/lib/utils/teams'; -import config from '@documenso/tailwind-config'; import { Body, @@ -11,7 +13,6 @@ import { Link, Preview, Section, - Tailwind, Text, } from '../components'; import { TemplateFooter } from '../template-components/template-footer'; @@ -32,97 +33,90 @@ export const ConfirmTeamEmailTemplate = ({ teamUrl = 'demo', token = '', }: ConfirmTeamEmailProps) => { - const previewText = `Accept team email request for ${teamName} on Documenso`; + const { _ } = useLingui(); + + const previewText = msg`Accept team email request for ${teamName} on Documenso`; return ( - {previewText} - - -
- + {_(previewText)} + + +
+ + + +
+
-
- -
+
+ + Verify your team email address + -
- - Verify your team email address + + {teamName} has requested to use your email + address for their team on Documenso. + + +
+ {formatTeamUrl(teamUrl, baseUrl)} +
+ +
+ + By accepting this request, you will be granting {teamName} access + to: - - {teamName} has requested to use your email - address for their team on Documenso. +
    +
  • + View all documents sent to and from this email address +
  • +
  • + Allow document recipients to reply directly to this email address +
  • +
  • + Send documents on behalf of the team using the email address +
  • +
+ + + You can revoke access at any time in your team settings on Documenso{' '} + here. - -
- {formatTeamUrl(teamUrl, baseUrl)} -
- -
- - By accepting this request, you will be granting {teamName}{' '} - access to: - - -
    -
  • - View all documents sent to and from this email address -
  • -
  • - Allow document recipients to reply directly to this email address -
  • -
  • - Send documents on behalf of the team using the email address -
  • -
- - - You can revoke access at any time in your team settings on Documenso{' '} - here. - -
- -
- -
- Link expires in 1 hour. - +
+ +
+
-
+ Link expires in 1 hour. + - - - -
- - +
+ + + + +
+ ); }; diff --git a/packages/email/templates/document-cancel.tsx b/packages/email/templates/document-cancel.tsx index 66892bccc..edaec133b 100644 --- a/packages/email/templates/document-cancel.tsx +++ b/packages/email/templates/document-cancel.tsx @@ -1,6 +1,7 @@ -import config from '@documenso/tailwind-config'; +import { msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { Body, Container, Head, Hr, Html, Img, Preview, Section, Tailwind } from '../components'; +import { Body, Container, Head, Hr, Html, Img, Preview, Section } from '../components'; import type { TemplateDocumentCancelProps } from '../template-components/template-document-cancel'; import { TemplateDocumentCancel } from '../template-components/template-document-cancel'; import { TemplateFooter } from '../template-components/template-footer'; @@ -13,7 +14,9 @@ export const DocumentCancelTemplate = ({ documentName = 'Open Source Pledge.pdf', assetBaseUrl = 'http://localhost:3002', }: DocumentCancelEmailTemplateProps) => { - const previewText = `${inviterName} has cancelled the document ${documentName}, you don't need to sign it anymore.`; + const { _ } = useLingui(); + + const previewText = msg`${inviterName} has cancelled the document ${documentName}, you don't need to sign it anymore.`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); @@ -22,43 +25,34 @@ export const DocumentCancelTemplate = ({ return ( - {previewText} - - -
- -
- Documenso Logo + {_(previewText)} - -
-
+ +
+ +
+ Documenso Logo -
+ +
+
- - - -
- - +
+ + + + +
+ ); }; diff --git a/packages/email/templates/document-completed.tsx b/packages/email/templates/document-completed.tsx index 5e23be873..b1ad6fc3a 100644 --- a/packages/email/templates/document-completed.tsx +++ b/packages/email/templates/document-completed.tsx @@ -1,6 +1,7 @@ -import config from '@documenso/tailwind-config'; +import { msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components'; +import { Body, Container, Head, Html, Img, Preview, Section } from '../components'; import type { TemplateDocumentCompletedProps } from '../template-components/template-document-completed'; import { TemplateDocumentCompleted } from '../template-components/template-document-completed'; import { TemplateFooter } from '../template-components/template-footer'; @@ -15,7 +16,9 @@ export const DocumentCompletedEmailTemplate = ({ assetBaseUrl = 'http://localhost:3002', customBody, }: DocumentCompletedEmailTemplateProps) => { - const previewText = `Completed Document`; + const { _ } = useLingui(); + + const previewText = msg`Completed Document`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); @@ -24,41 +27,32 @@ export const DocumentCompletedEmailTemplate = ({ return ( - {previewText} - - -
- -
- Documenso Logo + {_(previewText)} - -
-
+ +
+ +
+ Documenso Logo - - - -
- - + +
+ + + + + +
+ ); }; diff --git a/packages/email/templates/document-created-from-direct-template.tsx b/packages/email/templates/document-created-from-direct-template.tsx index 68ad3363b..63d46c9b8 100644 --- a/packages/email/templates/document-created-from-direct-template.tsx +++ b/packages/email/templates/document-created-from-direct-template.tsx @@ -1,18 +1,9 @@ -import { RECIPIENT_ROLES_DESCRIPTION_ENG } from '@documenso/lib/constants/recipient-roles'; -import config from '@documenso/tailwind-config'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { - Body, - Button, - Container, - Head, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from '../components'; +import { RECIPIENT_ROLES_DESCRIPTION_ENG } from '@documenso/lib/constants/recipient-roles'; + +import { Body, Button, Container, Head, Html, Img, Preview, Section, Text } from '../components'; import TemplateDocumentImage from '../template-components/template-document-image'; import { TemplateFooter } from '../template-components/template-footer'; import { RecipientRole } from '.prisma/client'; @@ -32,9 +23,11 @@ export const DocumentCreatedFromDirectTemplateEmailTemplate = ({ documentName = 'Open Source Pledge.pdf', assetBaseUrl = 'http://localhost:3002', }: DocumentCompletedEmailTemplateProps) => { - const action = RECIPIENT_ROLES_DESCRIPTION_ENG[recipientRole].actioned.toLowerCase(); + const { _ } = useLingui(); - const previewText = `Document created from direct template`; + const action = _(RECIPIENT_ROLES_DESCRIPTION_ENG[recipientRole].actioned).toLowerCase(); + + const previewText = msg`Document created from direct template`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); @@ -43,55 +36,48 @@ export const DocumentCreatedFromDirectTemplateEmailTemplate = ({ return ( - {previewText} - - -
- -
- Documenso Logo + {_(previewText)} - + +
+ +
+ Documenso Logo -
- + + +
+ + {recipientName} {action} a document by using one of your direct links - + + -
- {documentName} -
+
+ {documentName} +
-
- -
+
+
- +
+ - - - -
- - + + + +
+ ); }; diff --git a/packages/email/templates/document-invite.tsx b/packages/email/templates/document-invite.tsx index 30c6ae960..edfd525f1 100644 --- a/packages/email/templates/document-invite.tsx +++ b/packages/email/templates/document-invite.tsx @@ -1,20 +1,10 @@ +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; + import { RECIPIENT_ROLES_DESCRIPTION_ENG } from '@documenso/lib/constants/recipient-roles'; import type { RecipientRole } from '@documenso/prisma/client'; -import config from '@documenso/tailwind-config'; -import { - Body, - Container, - Head, - Hr, - Html, - Img, - Link, - Preview, - Section, - Tailwind, - Text, -} from '../components'; +import { Body, Container, Head, Hr, Html, Img, Link, Preview, Section, Text } from '../components'; import type { TemplateDocumentInviteProps } from '../template-components/template-document-invite'; import { TemplateDocumentInvite } from '../template-components/template-document-invite'; import { TemplateFooter } from '../template-components/template-footer'; @@ -40,13 +30,15 @@ export const DocumentInviteEmailTemplate = ({ isTeamInvite = false, teamName, }: DocumentInviteEmailTemplateProps) => { - const action = RECIPIENT_ROLES_DESCRIPTION_ENG[role].actionVerb.toLowerCase(); + const { _ } = useLingui(); + + const action = _(RECIPIENT_ROLES_DESCRIPTION_ENG[role].actionVerb).toLowerCase(); const previewText = selfSigner - ? `Please ${action} your document ${documentName}` + ? msg`Please ${action} your document ${documentName}` : isTeamInvite - ? `${inviterName} on behalf of ${teamName} has invited you to ${action} ${documentName}` - : `${inviterName} has invited you to ${action} ${documentName}`; + ? msg`${inviterName} on behalf of ${teamName} has invited you to ${action} ${documentName}` + : msg`${inviterName} has invited you to ${action} ${documentName}`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); @@ -55,67 +47,62 @@ export const DocumentInviteEmailTemplate = ({ return ( - {previewText} - - -
- -
- Documenso Logo + {_(previewText)} - -
-
+ +
+ +
+ Documenso Logo - -
- + +
+
+ + +
+ + {inviterName}{' '} ({inviterEmail}) - + + - - {customBody ? ( -
{customBody}
- ) : ( + + {customBody ? ( +
{customBody}
+ ) : ( + `${inviterName} has invited you to ${action} the document "${documentName}".` - )} -
-
-
+ + )} + +
+
-
+
- - - -
- - + + + +
+ ); }; diff --git a/packages/email/templates/document-pending.tsx b/packages/email/templates/document-pending.tsx index f14671e10..2073e491b 100644 --- a/packages/email/templates/document-pending.tsx +++ b/packages/email/templates/document-pending.tsx @@ -1,6 +1,7 @@ -import config from '@documenso/tailwind-config'; +import { msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components'; +import { Body, Container, Head, Html, Img, Preview, Section } from '../components'; import type { TemplateDocumentPendingProps } from '../template-components/template-document-pending'; import { TemplateDocumentPending } from '../template-components/template-document-pending'; import { TemplateFooter } from '../template-components/template-footer'; @@ -11,7 +12,9 @@ export const DocumentPendingEmailTemplate = ({ documentName = 'Open Source Pledge.pdf', assetBaseUrl = 'http://localhost:3002', }: DocumentPendingEmailTemplateProps) => { - const previewText = `Pending Document`; + const { _ } = useLingui(); + + const previewText = msg`Pending Document`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); @@ -20,36 +23,27 @@ export const DocumentPendingEmailTemplate = ({ return ( - {previewText} - - -
- -
- Documenso Logo + {_(previewText)} - -
-
+ +
+ +
+ Documenso Logo - - - -
- - + +
+ + + + + +
+ ); }; diff --git a/packages/email/templates/document-self-signed.tsx b/packages/email/templates/document-self-signed.tsx index aa1c89b10..db9d44495 100644 --- a/packages/email/templates/document-self-signed.tsx +++ b/packages/email/templates/document-self-signed.tsx @@ -1,6 +1,7 @@ -import config from '@documenso/tailwind-config'; +import { msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components'; +import { Body, Container, Head, Html, Img, Preview, Section } from '../components'; import type { TemplateDocumentSelfSignedProps } from '../template-components/template-document-self-signed'; import { TemplateDocumentSelfSigned } from '../template-components/template-document-self-signed'; import { TemplateFooter } from '../template-components/template-footer'; @@ -11,7 +12,9 @@ export const DocumentSelfSignedEmailTemplate = ({ documentName = 'Open Source Pledge.pdf', assetBaseUrl = 'http://localhost:3002', }: DocumentSelfSignedTemplateProps) => { - const previewText = `Completed Document`; + const { _ } = useLingui(); + + const previewText = msg`Completed Document`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); @@ -20,39 +23,27 @@ export const DocumentSelfSignedEmailTemplate = ({ return ( - {previewText} - - -
- -
- Documenso Logo + {_(previewText)} - -
-
+ +
+ +
+ Documenso Logo - - - -
- - + +
+ + + + + +
+ ); }; diff --git a/packages/email/templates/document-super-delete.tsx b/packages/email/templates/document-super-delete.tsx index 68384e119..bddc85dc4 100644 --- a/packages/email/templates/document-super-delete.tsx +++ b/packages/email/templates/document-super-delete.tsx @@ -1,6 +1,7 @@ -import config from '@documenso/tailwind-config'; +import { msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { Body, Container, Head, Hr, Html, Img, Preview, Section, Tailwind } from '../components'; +import { Body, Container, Head, Hr, Html, Img, Preview, Section } from '../components'; import { TemplateDocumentDelete, type TemplateDocumentDeleteProps, @@ -14,7 +15,9 @@ export const DocumentSuperDeleteEmailTemplate = ({ assetBaseUrl = 'http://localhost:3002', reason = 'Unknown', }: DocumentDeleteEmailTemplateProps) => { - const previewText = `An admin has deleted your document "${documentName}".`; + const { _ } = useLingui(); + + const previewText = msg`An admin has deleted your document "${documentName}".`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); @@ -23,42 +26,33 @@ export const DocumentSuperDeleteEmailTemplate = ({ return ( - {previewText} - - -
- -
- Documenso Logo + {_(previewText)} - -
-
+ +
+ +
+ Documenso Logo -
+ +
+
- - - -
- - +
+ + + + +
+ ); }; diff --git a/packages/email/templates/forgot-password.tsx b/packages/email/templates/forgot-password.tsx index 7fe62cd20..531ec2ee6 100644 --- a/packages/email/templates/forgot-password.tsx +++ b/packages/email/templates/forgot-password.tsx @@ -1,6 +1,7 @@ -import config from '@documenso/tailwind-config'; +import { msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components'; +import { Body, Container, Head, Html, Img, Preview, Section } from '../components'; import { TemplateFooter } from '../template-components/template-footer'; import type { TemplateForgotPasswordProps } from '../template-components/template-forgot-password'; import { TemplateForgotPassword } from '../template-components/template-forgot-password'; @@ -11,7 +12,9 @@ export const ForgotPasswordTemplate = ({ resetPasswordLink = 'https://documenso.com', assetBaseUrl = 'http://localhost:3002', }: ForgotPasswordTemplateProps) => { - const previewText = `Password Reset Requested`; + const { _ } = useLingui(); + + const previewText = msg`Password Reset Requested`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); @@ -20,41 +23,32 @@ export const ForgotPasswordTemplate = ({ return ( - {previewText} - - -
- -
- Documenso Logo + {_(previewText)} - -
-
+ +
+ +
+ Documenso Logo -
+ +
+
- - - -
- - +
+ + + + +
+ ); }; diff --git a/packages/email/templates/recipient-removed-from-document.tsx b/packages/email/templates/recipient-removed-from-document.tsx index 4fa22a28e..2ba19dc03 100644 --- a/packages/email/templates/recipient-removed-from-document.tsx +++ b/packages/email/templates/recipient-removed-from-document.tsx @@ -1,17 +1,7 @@ -import config from '@documenso/tailwind-config'; +import { msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { - Body, - Container, - Head, - Hr, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from '../components'; +import { Body, Container, Head, Hr, Html, Img, Preview, Section, Text } from '../components'; import type { TemplateDocumentCancelProps } from '../template-components/template-document-cancel'; import TemplateDocumentImage from '../template-components/template-document-image'; import { TemplateFooter } from '../template-components/template-footer'; @@ -23,7 +13,9 @@ export const RecipientRemovedFromDocumentTemplate = ({ documentName = 'Open Source Pledge.pdf', assetBaseUrl = 'http://localhost:3002', }: DocumentCancelEmailTemplateProps) => { - const previewText = `${inviterName} has removed you from the document ${documentName}.`; + const { _ } = useLingui(); + + const previewText = msg`${inviterName} has removed you from the document ${documentName}.`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); @@ -32,45 +24,36 @@ export const RecipientRemovedFromDocumentTemplate = ({ return ( - {previewText} - - -
- + {_(previewText)} + + +
+ +
+ Documenso Logo + + +
- Documenso Logo - - - -
- - {inviterName} has removed you from the document -
"{documentName}" -
-
+ + {inviterName} has removed you from the document +
"{documentName}" +
- +
+
-
+
- - - -
- - + + + +
+ ); }; diff --git a/packages/email/templates/reset-password.tsx b/packages/email/templates/reset-password.tsx index c6c1201c6..2c73e50b8 100644 --- a/packages/email/templates/reset-password.tsx +++ b/packages/email/templates/reset-password.tsx @@ -1,18 +1,7 @@ -import config from '@documenso/tailwind-config'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { - Body, - Container, - Head, - Hr, - Html, - Img, - Link, - Preview, - Section, - Tailwind, - Text, -} from '../components'; +import { Body, Container, Head, Hr, Html, Img, Link, Preview, Section, Text } from '../components'; import { TemplateFooter } from '../template-components/template-footer'; import type { TemplateResetPasswordProps } from '../template-components/template-reset-password'; import { TemplateResetPassword } from '../template-components/template-reset-password'; @@ -24,7 +13,9 @@ export const ResetPasswordTemplate = ({ userEmail = 'lucas@documenso.com', assetBaseUrl = 'http://localhost:3002', }: ResetPasswordTemplateProps) => { - const previewText = `Password Reset Successful`; + const { _ } = useLingui(); + + const previewText = msg`Password Reset Successful`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); @@ -33,65 +24,62 @@ export const ResetPasswordTemplate = ({ return ( - {previewText} - - -
- -
- Documenso Logo + {_(previewText)} - -
-
+ +
+ +
+ Documenso Logo - -
- + +
+
+ + +
+ + Hi, {userName}{' '} ({userEmail}) - + + - + + We've changed your password as you asked. You can now sign in with your new password. - - + + + + Didn't request a password change? We are here to help you secure your account, just{' '} contact us. - -
-
+ + +
+
-
+
- - - -
- - + + + +
+ ); }; diff --git a/packages/email/templates/team-delete.tsx b/packages/email/templates/team-delete.tsx index 240757338..9f44f6724 100644 --- a/packages/email/templates/team-delete.tsx +++ b/packages/email/templates/team-delete.tsx @@ -1,7 +1,9 @@ -import { formatTeamUrl } from '@documenso/lib/utils/teams'; -import config from '@documenso/tailwind-config'; +import { msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { Body, Container, Head, Hr, Html, Preview, Section, Tailwind, Text } from '../components'; +import { formatTeamUrl } from '@documenso/lib/utils/teams'; + +import { Body, Container, Head, Hr, Html, Preview, Section, Text } from '../components'; import { TemplateFooter } from '../template-components/template-footer'; import TemplateImage from '../template-components/template-image'; @@ -18,67 +20,60 @@ export const TeamDeleteEmailTemplate = ({ teamUrl = 'demo', isOwner = false, }: TeamDeleteEmailProps) => { + const { _ } = useLingui(); + const previewText = isOwner - ? 'Your team has been deleted' - : 'A team you were a part of has been deleted'; + ? msg`Your team has been deleted` + : msg`A team you were a part of has been deleted`; const title = isOwner - ? 'Your team has been deleted' - : 'A team you were a part of has been deleted'; + ? msg`Your team has been deleted` + : msg`A team you were a part of has been deleted`; const description = isOwner - ? 'The following team has been deleted by you' - : 'The following team has been deleted by its owner. You will no longer be able to access this team and its documents'; + ? msg`The following team has been deleted by you` + : msg`The following team has been deleted by its owner. You will no longer be able to access this team and its documents`; return ( - {previewText} - - -
- + {_(previewText)} + + +
+ + + +
+
-
- -
+
+ {_(title)} -
- {title} + {_(description)} - {description} +
+ {formatTeamUrl(teamUrl, baseUrl)} +
+
+ -
- {formatTeamUrl(teamUrl, baseUrl)} -
-
-
+
-
- - - - -
- - + + + +
+ ); }; diff --git a/packages/email/templates/team-email-removed.tsx b/packages/email/templates/team-email-removed.tsx index 0a143d1b9..c78de5a0b 100644 --- a/packages/email/templates/team-email-removed.tsx +++ b/packages/email/templates/team-email-removed.tsx @@ -1,7 +1,9 @@ -import { formatTeamUrl } from '@documenso/lib/utils/teams'; -import config from '@documenso/tailwind-config'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { Body, Container, Head, Hr, Html, Preview, Section, Tailwind, Text } from '../components'; +import { formatTeamUrl } from '@documenso/lib/utils/teams'; + +import { Body, Container, Head, Hr, Html, Preview, Section, Text } from '../components'; import { TemplateFooter } from '../template-components/template-footer'; import TemplateImage from '../template-components/template-image'; @@ -20,62 +22,57 @@ export const TeamEmailRemovedTemplate = ({ teamName = 'Team Name', teamUrl = 'demo', }: TeamEmailRemovedTemplateProps) => { - const previewText = `Team email removed for ${teamName} on Documenso`; + const { _ } = useLingui(); + + const previewText = msg`Team email removed for ${teamName} on Documenso`; return ( - {previewText} - - -
- + {_(previewText)} + + +
+ + + +
+
-
- -
+
+ + Team email removed + -
- - Team email removed - - - + + The team email {teamEmail} has been removed from the following team - + + -
- {formatTeamUrl(teamUrl, baseUrl)} -
-
- +
+ {formatTeamUrl(teamUrl, baseUrl)} +
+
+
-
+
- - - -
- - + + + +
+ ); }; diff --git a/packages/email/templates/team-invite.tsx b/packages/email/templates/team-invite.tsx index 3c062c4c8..33bcd058a 100644 --- a/packages/email/templates/team-invite.tsx +++ b/packages/email/templates/team-invite.tsx @@ -1,18 +1,9 @@ -import { formatTeamUrl } from '@documenso/lib/utils/teams'; -import config from '@documenso/tailwind-config'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { - Body, - Button, - Container, - Head, - Hr, - Html, - Preview, - Section, - Tailwind, - Text, -} from '../components'; +import { formatTeamUrl } from '@documenso/lib/utils/teams'; + +import { Body, Button, Container, Head, Hr, Html, Preview, Section, Text } from '../components'; import { TemplateFooter } from '../template-components/template-footer'; import TemplateImage from '../template-components/template-image'; @@ -33,80 +24,75 @@ export const TeamInviteEmailTemplate = ({ teamUrl = 'demo', token = '', }: TeamInviteEmailProps) => { - const previewText = `Accept invitation to join a team on Documenso`; + const { _ } = useLingui(); + + const previewText = msg`Accept invitation to join a team on Documenso`; return ( - {previewText} - - -
- + {_(previewText)} + + +
+ + + +
+
-
- -
+
+ + Join {teamName} on Documenso + -
- - Join {teamName} on Documenso - + + You have been invited to join the following team + - - You have been invited to join the following team - +
+ {formatTeamUrl(teamUrl, baseUrl)} +
-
- {formatTeamUrl(teamUrl, baseUrl)} -
- - + + by {senderName} - + + -
- - -
+
+ +
- +
+ -
+
- - - -
- - + + + +
+ ); }; diff --git a/packages/email/templates/team-join.tsx b/packages/email/templates/team-join.tsx index b3c1efc2f..ce463602a 100644 --- a/packages/email/templates/team-join.tsx +++ b/packages/email/templates/team-join.tsx @@ -1,7 +1,9 @@ -import { formatTeamUrl } from '@documenso/lib/utils/teams'; -import config from '@documenso/tailwind-config'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { Body, Container, Head, Hr, Html, Preview, Section, Tailwind, Text } from '../components'; +import { formatTeamUrl } from '@documenso/lib/utils/teams'; + +import { Body, Container, Head, Hr, Html, Preview, Section, Text } from '../components'; import { TemplateFooter } from '../template-components/template-footer'; import TemplateImage from '../template-components/template-image'; @@ -22,61 +24,56 @@ export const TeamJoinEmailTemplate = ({ teamName = 'Team Name', teamUrl = 'demo', }: TeamJoinEmailProps) => { - const previewText = 'A team member has joined a team on Documenso'; + const { _ } = useLingui(); + + const previewText = msg`A team member has joined a team on Documenso`; return ( - {previewText} - - -
- + {_(previewText)} + + +
+ + + +
+
-
- -
- -
- +
+ + {memberName || memberEmail} joined the team {teamName} on Documenso - + + - - {memberEmail} joined the following team - + + {memberEmail} joined the following team + -
- {formatTeamUrl(teamUrl, baseUrl)} -
-
- +
+ {formatTeamUrl(teamUrl, baseUrl)} +
+
+
-
+
- - - -
- - + + + +
+ ); }; diff --git a/packages/email/templates/team-leave.tsx b/packages/email/templates/team-leave.tsx index 51b9aaab1..1cd18446e 100644 --- a/packages/email/templates/team-leave.tsx +++ b/packages/email/templates/team-leave.tsx @@ -1,7 +1,9 @@ -import { formatTeamUrl } from '@documenso/lib/utils/teams'; -import config from '@documenso/tailwind-config'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { Body, Container, Head, Hr, Html, Preview, Section, Tailwind, Text } from '../components'; +import { formatTeamUrl } from '@documenso/lib/utils/teams'; + +import { Body, Container, Head, Hr, Html, Preview, Section, Text } from '../components'; import { TemplateFooter } from '../template-components/template-footer'; import TemplateImage from '../template-components/template-image'; @@ -22,61 +24,56 @@ export const TeamLeaveEmailTemplate = ({ teamName = 'Team Name', teamUrl = 'demo', }: TeamLeaveEmailProps) => { - const previewText = 'A team member has left a team on Documenso'; + const { _ } = useLingui(); + + const previewText = msg`A team member has left a team on Documenso`; return ( - {previewText} - - -
- + {_(previewText)} + + +
+ + + +
+
-
- -
- -
- +
+ + {memberName || memberEmail} left the team {teamName} on Documenso - + + - - {memberEmail} left the following team - + + {memberEmail} left the following team + -
- {formatTeamUrl(teamUrl, baseUrl)} -
-
- +
+ {formatTeamUrl(teamUrl, baseUrl)} +
+
+
-
+
- - - -
- - + + + +
+ ); }; diff --git a/packages/email/templates/team-transfer-request.tsx b/packages/email/templates/team-transfer-request.tsx index 82723226c..480274efb 100644 --- a/packages/email/templates/team-transfer-request.tsx +++ b/packages/email/templates/team-transfer-request.tsx @@ -1,18 +1,9 @@ -import { formatTeamUrl } from '@documenso/lib/utils/teams'; -import config from '@documenso/tailwind-config'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; -import { - Body, - Button, - Container, - Head, - Hr, - Html, - Preview, - Section, - Tailwind, - Text, -} from '../components'; +import { formatTeamUrl } from '@documenso/lib/utils/teams'; + +import { Body, Button, Container, Head, Hr, Html, Preview, Section, Text } from '../components'; import { TemplateFooter } from '../template-components/template-footer'; import TemplateImage from '../template-components/template-image'; @@ -33,78 +24,77 @@ export const TeamTransferRequestTemplate = ({ teamUrl = 'demo', token = '', }: TeamTransferRequestTemplateProps) => { - const previewText = 'Accept team transfer request on Documenso'; + const { _ } = useLingui(); + + const previewText = msg`Accept team transfer request on Documenso`; return ( - {previewText} - - -
- + {_(previewText)} + + +
+ + + +
+
-
- -
+
+ + {teamName} ownership transfer request + -
- - {teamName} ownership transfer request - - - + + {senderName} has requested that you take ownership of the following team - + + -
- {formatTeamUrl(teamUrl, baseUrl)} -
+
+ {formatTeamUrl(teamUrl, baseUrl)} +
- + + By accepting this request, you will take responsibility for any billing items associated with this team. - + + -
- -
+
+
+
- Link expires in 1 hour. - + + Link expires in 1 hour. + + -
+
- - - -
- - + + + +
+ ); }; diff --git a/packages/lib/client-only/providers/i18n.server.tsx b/packages/lib/client-only/providers/i18n.server.tsx index b5f193072..9acca3119 100644 --- a/packages/lib/client-only/providers/i18n.server.tsx +++ b/packages/lib/client-only/providers/i18n.server.tsx @@ -7,12 +7,17 @@ import { setupI18n } from '@lingui/core'; import { setI18n } from '@lingui/react/server'; import { IS_APP_WEB } from '../../constants/app'; -import { SUPPORTED_LANGUAGE_CODES } from '../../constants/i18n'; +import { + APP_I18N_OPTIONS, + SUPPORTED_LANGUAGE_CODES, + isValidLanguageCode, +} from '../../constants/i18n'; import { extractLocaleData } from '../../utils/i18n'; +import { remember } from '../../utils/remember'; type SupportedLanguages = (typeof SUPPORTED_LANGUAGE_CODES)[number]; -async function loadCatalog(lang: SupportedLanguages): Promise<{ +export async function loadCatalog(lang: SupportedLanguages): Promise<{ [k: string]: Messages; }> { const extension = process.env.NODE_ENV === 'development' ? 'po' : 'js'; @@ -20,14 +25,12 @@ async function loadCatalog(lang: SupportedLanguages): Promise<{ let { messages } = await import(`../../translations/${lang}/${context}.${extension}`); - // Dirty way to load common messages for development since it's not compiled. - if (process.env.NODE_ENV === 'development') { - const commonMessages = await import(`../../translations/${lang}/common.${extension}`); + if (extension === 'po') { + const { messages: commonMessages } = await import( + `../../translations/${lang}/common.${extension}` + ); - messages = { - ...messages, - ...commonMessages.messages, - }; + messages = { ...messages, ...commonMessages }; } return { @@ -35,40 +38,63 @@ async function loadCatalog(lang: SupportedLanguages): Promise<{ }; } -const catalogs = await Promise.all(SUPPORTED_LANGUAGE_CODES.map(loadCatalog)); +const catalogs = Promise.all(SUPPORTED_LANGUAGE_CODES.map(loadCatalog)); // transform array of catalogs into a single object -export const allMessages = catalogs.reduce((acc, oneCatalog) => { - return { ...acc, ...oneCatalog }; -}, {}); +const allMessages = async () => { + return await catalogs.then((catalogs) => + catalogs.reduce((acc, oneCatalog) => { + return { + ...acc, + ...oneCatalog, + }; + }, {}), + ); +}; type AllI18nInstances = { [K in SupportedLanguages]: I18n }; // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -export const allI18nInstances = SUPPORTED_LANGUAGE_CODES.reduce((acc, lang) => { - const messages = allMessages[lang] ?? {}; +export const allI18nInstances = remember('i18n.allI18nInstances', async () => { + const loadedMessages = await allMessages(); - const i18n = setupI18n({ - locale: lang, - messages: { [lang]: messages }, - }); + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + return SUPPORTED_LANGUAGE_CODES.reduce((acc, lang) => { + const messages = loadedMessages[lang] ?? {}; - return { ...acc, [lang]: i18n }; -}, {}) as AllI18nInstances; + const i18n = setupI18n({ + locale: lang, + messages: { [lang]: messages }, + }); + + return { ...acc, [lang]: i18n }; + }, {}) as AllI18nInstances; +}); + +// eslint-disable-next-line @typescript-eslint/ban-types +export const getI18nInstance = async (lang?: SupportedLanguages | (string & {})) => { + const instances = await allI18nInstances; + + if (!isValidLanguageCode(lang)) { + return instances[APP_I18N_OPTIONS.sourceLang]; + } + + return instances[lang] ?? instances[APP_I18N_OPTIONS.sourceLang]; +}; /** * This needs to be run in all layouts and page server components that require i18n. * * https://lingui.dev/tutorials/react-rsc#pages-layouts-and-lingui */ -export const setupI18nSSR = () => { +export const setupI18nSSR = async () => { const { lang, locales } = extractLocaleData({ cookies: cookies(), headers: headers(), }); // Get and set a ready-made i18n instance for the given language. - const i18n = allI18nInstances[lang]; + const i18n = await getI18nInstance(lang); // Reactivate the i18n instance with the locale for date and number formatting. i18n.activate(lang, locales); diff --git a/packages/lib/constants/i18n.ts b/packages/lib/constants/i18n.ts index a54990e09..b3c8a8954 100644 --- a/packages/lib/constants/i18n.ts +++ b/packages/lib/constants/i18n.ts @@ -47,3 +47,6 @@ export const SUPPORTED_LANGUAGES: Record = { short: 'es', }, } satisfies Record; + +export const isValidLanguageCode = (code: unknown): code is SupportedLanguageCodes => + SUPPORTED_LANGUAGE_CODES.includes(code as SupportedLanguageCodes); diff --git a/packages/lib/constants/recipient-roles.ts b/packages/lib/constants/recipient-roles.ts index 7dfe3c7fc..9a3eefe1c 100644 --- a/packages/lib/constants/recipient-roles.ts +++ b/packages/lib/constants/recipient-roles.ts @@ -67,9 +67,9 @@ export const RECIPIENT_ROLES_DESCRIPTION_ENG = { } satisfies Record; export const RECIPIENT_ROLE_TO_EMAIL_TYPE = { - [RecipientRole.SIGNER]: 'SIGNING_REQUEST', - [RecipientRole.VIEWER]: 'VIEW_REQUEST', - [RecipientRole.APPROVER]: 'APPROVE_REQUEST', + [RecipientRole.SIGNER]: `SIGNING_REQUEST`, + [RecipientRole.VIEWER]: `VIEW_REQUEST`, + [RecipientRole.APPROVER]: `APPROVE_REQUEST`, } as const; export const RECIPIENT_ROLE_SIGNING_REASONS = { diff --git a/packages/lib/jobs/client/local.ts b/packages/lib/jobs/client/local.ts index a0405dbf1..d5ba58f83 100644 --- a/packages/lib/jobs/client/local.ts +++ b/packages/lib/jobs/client/local.ts @@ -43,18 +43,10 @@ export class LocalJobProvider extends BaseJobProvider { } public async triggerJob(options: SimpleTriggerJobOptions) { - console.log({ jobDefinitions: this._jobDefinitions }); - const eligibleJobs = Object.values(this._jobDefinitions).filter( (job) => job.trigger.name === options.name, ); - console.log({ options }); - console.log( - 'Eligible jobs:', - eligibleJobs.map((job) => job.name), - ); - await Promise.all( eligibleJobs.map(async (job) => { // Ideally we will change this to a createMany with returning later once we upgrade Prisma diff --git a/packages/lib/jobs/definitions/emails/send-signing-email.ts b/packages/lib/jobs/definitions/emails/send-signing-email.ts index beab38cab..34d1a8422 100644 --- a/packages/lib/jobs/definitions/emails/send-signing-email.ts +++ b/packages/lib/jobs/definitions/emails/send-signing-email.ts @@ -1,9 +1,9 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; import { z } from 'zod'; import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import DocumentInviteEmailTemplate from '@documenso/email/templates/document-invite'; import { prisma } from '@documenso/prisma'; import { @@ -13,6 +13,7 @@ import { SendStatus, } from '@documenso/prisma/client'; +import { getI18nInstance } from '../../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../../constants/app'; import { FROM_ADDRESS, FROM_NAME } from '../../../constants/email'; import { @@ -23,6 +24,7 @@ import { DOCUMENT_AUDIT_LOG_TYPE } from '../../../types/document-audit-logs'; import { ZRequestMetadataSchema } from '../../../universal/extract-request-metadata'; import { createDocumentAuditLogData } from '../../../utils/document-audit-logs'; import { renderCustomEmailTemplate } from '../../../utils/render-custom-email-template'; +import { renderEmailWithI18N } from '../../../utils/render-email-with-i18n'; import { type JobDefinition } from '../../client/_internal/job'; const SEND_SIGNING_EMAIL_JOB_DEFINITION_ID = 'send.signing.requested.email'; @@ -90,22 +92,32 @@ export const SEND_SIGNING_EMAIL_JOB_DEFINITION = { const recipientActionVerb = RECIPIENT_ROLES_DESCRIPTION_ENG[recipient.role].actionVerb.toLowerCase(); + const i18n = await getI18nInstance(documentMeta?.language); + let emailMessage = customEmail?.message || ''; - let emailSubject = `Please ${recipientActionVerb} this document`; + let emailSubject = i18n._(msg`Please ${recipientActionVerb} this document`); if (selfSigner) { - emailMessage = `You have initiated the document ${`"${document.title}"`} that requires you to ${recipientActionVerb} it.`; - emailSubject = `Please ${recipientActionVerb} your document`; + emailMessage = i18n._( + msg`You have initiated the document ${`"${document.title}"`} that requires you to ${recipientActionVerb} it.`, + ); + emailSubject = i18n._(msg`Please ${recipientActionVerb} your document`); } if (isDirectTemplate) { - emailMessage = `A document was created by your direct template that requires you to ${recipientActionVerb} it.`; - emailSubject = `Please ${recipientActionVerb} this document created by your direct template`; + emailMessage = i18n._( + msg`A document was created by your direct template that requires you to ${recipientActionVerb} it.`, + ); + emailSubject = i18n._( + msg`Please ${recipientActionVerb} this document created by your direct template`, + ); } if (isTeamDocument && team) { - emailSubject = `${team.name} invited you to ${recipientActionVerb} a document`; - emailMessage = `${user.name} on behalf of ${team.name} has invited you to ${recipientActionVerb} the document "${document.title}".`; + emailSubject = i18n._(msg`${team.name} invited you to ${recipientActionVerb} a document`); + emailMessage = i18n._( + msg`${user.name} on behalf of ${team.name} has invited you to ${recipientActionVerb} the document "${document.title}".`, + ); } const customEmailTemplate = { @@ -132,6 +144,14 @@ export const SEND_SIGNING_EMAIL_JOB_DEFINITION = { }); await io.runTask('send-signing-email', async () => { + const [html, text] = await Promise.all([ + renderEmailWithI18N(template, { lang: documentMeta?.language }), + renderEmailWithI18N(template, { + lang: documentMeta?.language, + plainText: true, + }), + ]); + await mailer.sendMail({ to: { name: recipient.name, @@ -145,8 +165,8 @@ export const SEND_SIGNING_EMAIL_JOB_DEFINITION = { documentMeta?.subject || emailSubject, customEmailTemplate, ), - html: render(template), - text: render(template, { plainText: true }), + html, + text, }); }); diff --git a/packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts b/packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts index c5afa1cd3..94362820e 100644 --- a/packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts +++ b/packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts @@ -1,13 +1,15 @@ +import { msg } from '@lingui/macro'; import { z } from 'zod'; import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import TeamJoinEmailTemplate from '@documenso/email/templates/team-join'; import { prisma } from '@documenso/prisma'; import { TeamMemberRole } from '@documenso/prisma/client'; +import { getI18nInstance } from '../../../client-only/providers/i18n.server'; import { WEBAPP_BASE_URL } from '../../../constants/app'; import { FROM_ADDRESS, FROM_NAME } from '../../../constants/email'; +import { renderEmailWithI18N } from '../../../utils/render-email-with-i18n'; import type { JobDefinition } from '../../client/_internal/job'; const SEND_TEAM_MEMBER_JOINED_EMAIL_JOB_DEFINITION_ID = 'send.team-member-joined.email'; @@ -71,15 +73,23 @@ export const SEND_TEAM_MEMBER_JOINED_EMAIL_JOB_DEFINITION = { teamUrl: team.url, }); + // !: Replace with the actual language of the recipient later + const [html, text] = await Promise.all([ + renderEmailWithI18N(emailContent), + renderEmailWithI18N(emailContent, { plainText: true }), + ]); + + const i18n = await getI18nInstance(); + await mailer.sendMail({ to: member.user.email, from: { name: FROM_NAME, address: FROM_ADDRESS, }, - subject: 'A new member has joined your team', - html: render(emailContent), - text: render(emailContent, { plainText: true }), + subject: i18n._(msg`A new member has joined your team`), + html, + text, }); }, ); diff --git a/packages/lib/jobs/definitions/emails/send-team-member-left-email.ts b/packages/lib/jobs/definitions/emails/send-team-member-left-email.ts index 55e5ab1e6..7e1b33d6f 100644 --- a/packages/lib/jobs/definitions/emails/send-team-member-left-email.ts +++ b/packages/lib/jobs/definitions/emails/send-team-member-left-email.ts @@ -1,13 +1,15 @@ +import { msg } from '@lingui/macro'; import { z } from 'zod'; import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import TeamJoinEmailTemplate from '@documenso/email/templates/team-join'; import { prisma } from '@documenso/prisma'; import { TeamMemberRole } from '@documenso/prisma/client'; +import { getI18nInstance } from '../../../client-only/providers/i18n.server'; import { WEBAPP_BASE_URL } from '../../../constants/app'; import { FROM_ADDRESS, FROM_NAME } from '../../../constants/email'; +import { renderEmailWithI18N } from '../../../utils/render-email-with-i18n'; import type { JobDefinition } from '../../client/_internal/job'; const SEND_TEAM_MEMBER_LEFT_EMAIL_JOB_DEFINITION_ID = 'send.team-member-left.email'; @@ -61,15 +63,22 @@ export const SEND_TEAM_MEMBER_LEFT_EMAIL_JOB_DEFINITION = { teamUrl: team.url, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(emailContent), + renderEmailWithI18N(emailContent, { plainText: true }), + ]); + + const i18n = await getI18nInstance(); + await mailer.sendMail({ to: member.user.email, from: { name: FROM_NAME, address: FROM_ADDRESS, }, - subject: `A team member has left ${team.name}`, - html: render(emailContent), - text: render(emailContent, { plainText: true }), + subject: i18n._(msg`A team member has left ${team.name}`), + html, + text, }); }); } diff --git a/packages/lib/package.json b/packages/lib/package.json index 5eabe4a26..0dc897f98 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -25,6 +25,9 @@ "@documenso/email": "*", "@documenso/prisma": "*", "@documenso/signing": "*", + "@lingui/core": "^4.11.3", + "@lingui/macro": "^4.11.3", + "@lingui/react": "^4.11.3", "@next-auth/prisma-adapter": "1.0.7", "@noble/ciphers": "0.4.0", "@noble/hashes": "1.3.2", diff --git a/packages/lib/server-only/auth/send-confirmation-email.ts b/packages/lib/server-only/auth/send-confirmation-email.ts index ddefa530a..5673d9603 100644 --- a/packages/lib/server-only/auth/send-confirmation-email.ts +++ b/packages/lib/server-only/auth/send-confirmation-email.ts @@ -1,11 +1,14 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; + import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import { ConfirmEmailTemplate } from '@documenso/email/templates/confirm-email'; import { prisma } from '@documenso/prisma'; +import { getI18nInstance } from '../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; export interface SendConfirmationEmailProps { userId: number; @@ -45,6 +48,13 @@ export const sendConfirmationEmail = async ({ userId }: SendConfirmationEmailPro confirmationLink, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(confirmationTemplate), + renderEmailWithI18N(confirmationTemplate, { plainText: true }), + ]); + + const i18n = await getI18nInstance(); + return mailer.sendMail({ to: { address: user.email, @@ -54,8 +64,8 @@ export const sendConfirmationEmail = async ({ userId }: SendConfirmationEmailPro name: senderName, address: senderAddress, }, - subject: 'Please confirm your email', - html: render(confirmationTemplate), - text: render(confirmationTemplate, { plainText: true }), + subject: i18n._(msg`Please confirm your email`), + html, + text, }); }; diff --git a/packages/lib/server-only/auth/send-forgot-password.ts b/packages/lib/server-only/auth/send-forgot-password.ts index 6e3a582a8..fef1543c3 100644 --- a/packages/lib/server-only/auth/send-forgot-password.ts +++ b/packages/lib/server-only/auth/send-forgot-password.ts @@ -1,11 +1,14 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; + import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import { ForgotPasswordTemplate } from '@documenso/email/templates/forgot-password'; import { prisma } from '@documenso/prisma'; +import { getI18nInstance } from '../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; export interface SendForgotPasswordOptions { userId: number; @@ -39,6 +42,13 @@ export const sendForgotPassword = async ({ userId }: SendForgotPasswordOptions) resetPasswordLink, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template), + renderEmailWithI18N(template, { plainText: true }), + ]); + + const i18n = await getI18nInstance(); + return await mailer.sendMail({ to: { address: user.email, @@ -48,8 +58,8 @@ export const sendForgotPassword = async ({ userId }: SendForgotPasswordOptions) name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso', address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com', }, - subject: 'Forgot Password?', - html: render(template), - text: render(template, { plainText: true }), + subject: i18n._(msg`Forgot Password?`), + html, + text, }); }; diff --git a/packages/lib/server-only/auth/send-reset-password.ts b/packages/lib/server-only/auth/send-reset-password.ts index 6bcd5820d..03165fcfc 100644 --- a/packages/lib/server-only/auth/send-reset-password.ts +++ b/packages/lib/server-only/auth/send-reset-password.ts @@ -1,11 +1,11 @@ import { createElement } from 'react'; import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import { ResetPasswordTemplate } from '@documenso/email/templates/reset-password'; import { prisma } from '@documenso/prisma'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; export interface SendResetPasswordOptions { userId: number; @@ -26,6 +26,11 @@ export const sendResetPassword = async ({ userId }: SendResetPasswordOptions) => userName: user.name || '', }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template), + renderEmailWithI18N(template, { plainText: true }), + ]); + return await mailer.sendMail({ to: { address: user.email, @@ -36,7 +41,7 @@ export const sendResetPassword = async ({ userId }: SendResetPasswordOptions) => address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com', }, subject: 'Password Reset Success!', - html: render(template), - text: render(template, { plainText: true }), + html, + text, }); }; diff --git a/packages/lib/server-only/document-meta/upsert-document-meta.ts b/packages/lib/server-only/document-meta/upsert-document-meta.ts index 99ca7f5da..daf8ec32c 100644 --- a/packages/lib/server-only/document-meta/upsert-document-meta.ts +++ b/packages/lib/server-only/document-meta/upsert-document-meta.ts @@ -9,6 +9,8 @@ import { import { prisma } from '@documenso/prisma'; import type { DocumentSigningOrder } from '@documenso/prisma/client'; +import type { SupportedLanguageCodes } from '../../constants/i18n'; + export type CreateDocumentMetaOptions = { documentId: number; subject?: string; @@ -19,6 +21,7 @@ export type CreateDocumentMetaOptions = { redirectUrl?: string; signingOrder?: DocumentSigningOrder; typedSignatureEnabled?: boolean; + language?: SupportedLanguageCodes; userId: number; requestMetadata: RequestMetadata; }; @@ -34,6 +37,7 @@ export const upsertDocumentMeta = async ({ redirectUrl, signingOrder, typedSignatureEnabled, + language, requestMetadata, }: CreateDocumentMetaOptions) => { const user = await prisma.user.findFirstOrThrow({ @@ -85,6 +89,7 @@ export const upsertDocumentMeta = async ({ redirectUrl, signingOrder, typedSignatureEnabled, + language, }, update: { subject, @@ -95,6 +100,7 @@ export const upsertDocumentMeta = async ({ redirectUrl, signingOrder, typedSignatureEnabled, + language, }, }); diff --git a/packages/lib/server-only/document/delete-document.ts b/packages/lib/server-only/document/delete-document.ts index 6ac8e1bd3..b43ed2cd3 100644 --- a/packages/lib/server-only/document/delete-document.ts +++ b/packages/lib/server-only/document/delete-document.ts @@ -3,7 +3,6 @@ import { createElement } from 'react'; import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import DocumentCancelTemplate from '@documenso/email/templates/document-cancel'; import { prisma } from '@documenso/prisma'; import type { Document, DocumentMeta, Recipient, User } from '@documenso/prisma/client'; @@ -14,6 +13,7 @@ import { FROM_ADDRESS, FROM_NAME } from '../../constants/email'; import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; import type { RequestMetadata } from '../../universal/extract-request-metadata'; import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; export type DeleteDocumentOptions = { id: number; @@ -191,6 +191,11 @@ const handleDocumentOwnerDelete = async ({ assetBaseUrl, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template), + renderEmailWithI18N(template, { plainText: true }), + ]); + await mailer.sendMail({ to: { address: recipient.email, @@ -201,8 +206,8 @@ const handleDocumentOwnerDelete = async ({ address: FROM_ADDRESS, }, subject: 'Document Cancelled', - html: render(template), - text: render(template, { plainText: true }), + html, + text, }); }), ); diff --git a/packages/lib/server-only/document/resend-document.tsx b/packages/lib/server-only/document/resend-document.tsx index 30f104e92..e25b4b766 100644 --- a/packages/lib/server-only/document/resend-document.tsx +++ b/packages/lib/server-only/document/resend-document.tsx @@ -1,11 +1,12 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; + import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import { DocumentInviteEmailTemplate } from '@documenso/email/templates/document-invite'; import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email'; import { - RECIPIENT_ROLES_DESCRIPTION_ENG, + RECIPIENT_ROLES_DESCRIPTION, RECIPIENT_ROLE_TO_EMAIL_TYPE, } from '@documenso/lib/constants/recipient-roles'; import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; @@ -16,7 +17,9 @@ import { prisma } from '@documenso/prisma'; import { DocumentStatus, RecipientRole, SigningStatus } from '@documenso/prisma/client'; import type { Prisma } from '@documenso/prisma/client'; +import { getI18nInstance } from '../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; import { getDocumentWhereInput } from './get-document-by-id'; export type ResendDocumentOptions = { @@ -92,25 +95,28 @@ export const resendDocument = async ({ return; } + const i18n = await getI18nInstance(document.documentMeta?.language); + const recipientEmailType = RECIPIENT_ROLE_TO_EMAIL_TYPE[recipient.role]; const { email, name } = recipient; const selfSigner = email === user.email; - const recipientActionVerb = - RECIPIENT_ROLES_DESCRIPTION_ENG[recipient.role].actionVerb.toLowerCase(); + const recipientActionVerb = i18n + ._(RECIPIENT_ROLES_DESCRIPTION[recipient.role].actionVerb) + .toLowerCase(); - let emailMessage = customEmail?.message || ''; - let emailSubject = `Reminder: Please ${recipientActionVerb} this document`; + let emailMessage = msg`${customEmail?.message || ''}`; + let emailSubject = msg`Reminder: Please ${recipientActionVerb} this document`; if (selfSigner) { - emailMessage = `You have initiated the document ${`"${document.title}"`} that requires you to ${recipientActionVerb} it.`; - emailSubject = `Reminder: Please ${recipientActionVerb} your document`; + emailMessage = msg`You have initiated the document ${`"${document.title}"`} that requires you to ${recipientActionVerb} it.`; + emailSubject = msg`Reminder: Please ${recipientActionVerb} your document`; } if (isTeamDocument && document.team) { - emailSubject = `Reminder: ${document.team.name} invited you to ${recipientActionVerb} a document`; - emailMessage = `${user.name} on behalf of ${document.team.name} has invited you to ${recipientActionVerb} the document "${document.title}".`; + emailSubject = msg`Reminder: ${document.team.name} invited you to ${recipientActionVerb} a document`; + emailMessage = msg`${user.name} on behalf of ${document.team.name} has invited you to ${recipientActionVerb} the document "${document.title}".`; } const customEmailTemplate = { @@ -128,7 +134,7 @@ export const resendDocument = async ({ inviterEmail: isTeamDocument ? document.team?.teamEmail?.email || user.email : user.email, assetBaseUrl, signDocumentLink, - customBody: renderCustomEmailTemplate(emailMessage, customEmailTemplate), + customBody: renderCustomEmailTemplate(i18n._(emailMessage), customEmailTemplate), role: recipient.role, selfSigner, isTeamInvite: isTeamDocument, @@ -137,6 +143,14 @@ export const resendDocument = async ({ await prisma.$transaction( async (tx) => { + const [html, text] = await Promise.all([ + renderEmailWithI18N(template, { lang: document.documentMeta?.language }), + renderEmailWithI18N(template, { + lang: document.documentMeta?.language, + plainText: true, + }), + ]); + await mailer.sendMail({ to: { address: email, @@ -147,10 +161,13 @@ export const resendDocument = async ({ address: FROM_ADDRESS, }, subject: customEmail?.subject - ? renderCustomEmailTemplate(`Reminder: ${customEmail.subject}`, customEmailTemplate) - : emailSubject, - html: render(template), - text: render(template, { plainText: true }), + ? renderCustomEmailTemplate( + i18n._(msg`Reminder: ${customEmail.subject}`), + customEmailTemplate, + ) + : i18n._(emailSubject), + html, + text, }); await tx.documentAuditLog.create({ diff --git a/packages/lib/server-only/document/send-completed-email.ts b/packages/lib/server-only/document/send-completed-email.ts index cea9d5424..29413a3dd 100644 --- a/packages/lib/server-only/document/send-completed-email.ts +++ b/packages/lib/server-only/document/send-completed-email.ts @@ -1,17 +1,20 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; + import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import { DocumentCompletedEmailTemplate } from '@documenso/email/templates/document-completed'; import { prisma } from '@documenso/prisma'; import { DocumentSource } from '@documenso/prisma/client'; +import { getI18nInstance } from '../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; import type { RequestMetadata } from '../../universal/extract-request-metadata'; import { getFile } from '../../universal/upload/get-file'; import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; import { renderCustomEmailTemplate } from '../../utils/render-custom-email-template'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; export interface SendDocumentOptions { documentId: number; @@ -61,6 +64,8 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo }`; } + const i18n = await getI18nInstance(document.documentMeta?.language); + // If the document owner is not a recipient then send the email to them separately if (!document.Recipient.find((recipient) => recipient.email === owner.email)) { const template = createElement(DocumentCompletedEmailTemplate, { @@ -69,6 +74,11 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo downloadLink: documentOwnerDownloadLink, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template, { lang: document.documentMeta?.language }), + renderEmailWithI18N(template, { lang: document.documentMeta?.language, plainText: true }), + ]); + await mailer.sendMail({ to: [ { @@ -80,9 +90,9 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso', address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com', }, - subject: 'Signing Complete!', - html: render(template), - text: render(template, { plainText: true }), + subject: i18n._(msg`Signing Complete!`), + html, + text, attachments: [ { filename: document.title.endsWith('.pdf') ? document.title : document.title + '.pdf', @@ -129,6 +139,11 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo : undefined, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template, { lang: document.documentMeta?.language }), + renderEmailWithI18N(template, { lang: document.documentMeta?.language, plainText: true }), + ]); + await mailer.sendMail({ to: [ { @@ -143,9 +158,9 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo subject: isDirectTemplate && document.documentMeta?.subject ? renderCustomEmailTemplate(document.documentMeta.subject, customEmailTemplate) - : 'Signing Complete!', - html: render(template), - text: render(template, { plainText: true }), + : i18n._(msg`Signing Complete!`), + html, + text, attachments: [ { filename: document.title.endsWith('.pdf') ? document.title : document.title + '.pdf', diff --git a/packages/lib/server-only/document/send-delete-email.ts b/packages/lib/server-only/document/send-delete-email.ts index cc1101942..fa648de2b 100644 --- a/packages/lib/server-only/document/send-delete-email.ts +++ b/packages/lib/server-only/document/send-delete-email.ts @@ -1,11 +1,14 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; + import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import { DocumentSuperDeleteEmailTemplate } from '@documenso/email/templates/document-super-delete'; import { prisma } from '@documenso/prisma'; +import { getI18nInstance } from '../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; export interface SendDeleteEmailOptions { documentId: number; @@ -36,6 +39,13 @@ export const sendDeleteEmail = async ({ documentId, reason }: SendDeleteEmailOpt assetBaseUrl, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template), + renderEmailWithI18N(template, { plainText: true }), + ]); + + const i18n = await getI18nInstance(); + await mailer.sendMail({ to: { address: email, @@ -45,8 +55,8 @@ export const sendDeleteEmail = async ({ documentId, reason }: SendDeleteEmailOpt name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso', address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com', }, - subject: 'Document Deleted!', - html: render(template), - text: render(template, { plainText: true }), + subject: i18n._(msg`Document Deleted!`), + html, + text, }); }; diff --git a/packages/lib/server-only/document/send-pending-email.ts b/packages/lib/server-only/document/send-pending-email.ts index 73e938a7d..997d8cdbd 100644 --- a/packages/lib/server-only/document/send-pending-email.ts +++ b/packages/lib/server-only/document/send-pending-email.ts @@ -1,11 +1,14 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; + import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import { DocumentPendingEmailTemplate } from '@documenso/email/templates/document-pending'; import { prisma } from '@documenso/prisma'; +import { getI18nInstance } from '../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; export interface SendPendingEmailOptions { documentId: number; @@ -28,6 +31,7 @@ export const sendPendingEmail = async ({ documentId, recipientId }: SendPendingE id: recipientId, }, }, + documentMeta: true, }, }); @@ -50,6 +54,13 @@ export const sendPendingEmail = async ({ documentId, recipientId }: SendPendingE assetBaseUrl, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template, { lang: document.documentMeta?.language }), + renderEmailWithI18N(template, { lang: document.documentMeta?.language, plainText: true }), + ]); + + const i18n = await getI18nInstance(); + await mailer.sendMail({ to: { address: email, @@ -59,8 +70,8 @@ export const sendPendingEmail = async ({ documentId, recipientId }: SendPendingE name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso', address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com', }, - subject: 'Waiting for others to complete signing.', - html: render(template), - text: render(template, { plainText: true }), + subject: i18n._(msg`Waiting for others to complete signing.`), + html, + text, }); }; diff --git a/packages/lib/server-only/document/super-delete-document.ts b/packages/lib/server-only/document/super-delete-document.ts index 0dfc9c163..db72bb1fc 100644 --- a/packages/lib/server-only/document/super-delete-document.ts +++ b/packages/lib/server-only/document/super-delete-document.ts @@ -2,17 +2,20 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; + import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import DocumentCancelTemplate from '@documenso/email/templates/document-cancel'; import { prisma } from '@documenso/prisma'; import { DocumentStatus, SendStatus } from '@documenso/prisma/client'; +import { getI18nInstance } from '../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; import { FROM_ADDRESS, FROM_NAME } from '../../constants/email'; import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; import type { RequestMetadata } from '../../universal/extract-request-metadata'; import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; export type SuperDeleteDocumentOptions = { id: number; @@ -53,6 +56,13 @@ export const superDeleteDocument = async ({ id, requestMetadata }: SuperDeleteDo assetBaseUrl, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template, { lang: document.documentMeta?.language }), + renderEmailWithI18N(template, { lang: document.documentMeta?.language, plainText: true }), + ]); + + const i18n = await getI18nInstance(document.documentMeta?.language); + await mailer.sendMail({ to: { address: recipient.email, @@ -62,9 +72,9 @@ export const superDeleteDocument = async ({ id, requestMetadata }: SuperDeleteDo name: FROM_NAME, address: FROM_ADDRESS, }, - subject: 'Document Cancelled', - html: render(template), - text: render(template, { plainText: true }), + subject: i18n._(msg`Document Cancelled`), + html, + text, }); }), ); diff --git a/packages/lib/server-only/recipient/set-recipients-for-document.ts b/packages/lib/server-only/recipient/set-recipients-for-document.ts index d5ab3c3d5..b9fc0e6af 100644 --- a/packages/lib/server-only/recipient/set-recipients-for-document.ts +++ b/packages/lib/server-only/recipient/set-recipients-for-document.ts @@ -1,8 +1,9 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; + import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise'; import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import RecipientRemovedFromDocumentTemplate from '@documenso/email/templates/recipient-removed-from-document'; import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; import { @@ -21,10 +22,12 @@ import type { Recipient } from '@documenso/prisma/client'; import { RecipientRole } from '@documenso/prisma/client'; import { SendStatus, SigningStatus } from '@documenso/prisma/client'; +import { getI18nInstance } from '../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; import { FROM_ADDRESS, FROM_NAME } from '../../constants/email'; import { AppError, AppErrorCode } from '../../errors/app-error'; import { canRecipientBeModified } from '../../utils/recipients'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; export interface SetRecipientsForDocumentOptions { userId: number; @@ -62,6 +65,7 @@ export const setRecipientsForDocument = async ({ }, include: { Field: true, + documentMeta: true, }, }); @@ -291,6 +295,13 @@ export const setRecipientsForDocument = async ({ assetBaseUrl, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template, { lang: document.documentMeta?.language }), + renderEmailWithI18N(template, { lang: document.documentMeta?.language, plainText: true }), + ]); + + const i18n = await getI18nInstance(document.documentMeta?.language); + await mailer.sendMail({ to: { address: recipient.email, @@ -300,9 +311,9 @@ export const setRecipientsForDocument = async ({ name: FROM_NAME, address: FROM_ADDRESS, }, - subject: 'You have been removed from a document', - html: render(template), - text: render(template, { plainText: true }), + subject: i18n._(msg`You have been removed from a document`), + html, + text, }); }), ); diff --git a/packages/lib/server-only/team/accept-team-invitation.ts b/packages/lib/server-only/team/accept-team-invitation.ts index 0a7da6d15..1bf8611e4 100644 --- a/packages/lib/server-only/team/accept-team-invitation.ts +++ b/packages/lib/server-only/team/accept-team-invitation.ts @@ -81,7 +81,7 @@ export const acceptTeamInvitation = async ({ userId, teamId }: AcceptTeamInvitat await jobs.triggerJob({ name: 'send.team-member-joined.email', payload: { - teamId: team.id, + teamId: teamMember.teamId, memberId: teamMember.id, }, }); diff --git a/packages/lib/server-only/team/create-team-email-verification.ts b/packages/lib/server-only/team/create-team-email-verification.ts index 86cded7a9..f43eb9530 100644 --- a/packages/lib/server-only/team/create-team-email-verification.ts +++ b/packages/lib/server-only/team/create-team-email-verification.ts @@ -1,9 +1,9 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; import { z } from 'zod'; import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import { ConfirmTeamEmailTemplate } from '@documenso/email/templates/confirm-team-email'; import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email'; @@ -13,6 +13,9 @@ import { createTokenVerification } from '@documenso/lib/utils/token-verification import { prisma } from '@documenso/prisma'; import { Prisma } from '@documenso/prisma/client'; +import { getI18nInstance } from '../../client-only/providers/i18n.server'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; + export type CreateTeamEmailVerificationOptions = { userId: number; teamId: number; @@ -122,14 +125,23 @@ export const sendTeamEmailVerificationEmail = async ( token, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template), + renderEmailWithI18N(template, { plainText: true }), + ]); + + const i18n = await getI18nInstance(); + await mailer.sendMail({ to: email, from: { name: FROM_NAME, address: FROM_ADDRESS, }, - subject: `A request to use your email has been initiated by ${teamName} on Documenso`, - html: render(template), - text: render(template, { plainText: true }), + subject: i18n._( + msg`A request to use your email has been initiated by ${teamName} on Documenso`, + ), + html, + text, }); }; diff --git a/packages/lib/server-only/team/create-team-member-invites.ts b/packages/lib/server-only/team/create-team-member-invites.ts index f167d2112..c47401f56 100644 --- a/packages/lib/server-only/team/create-team-member-invites.ts +++ b/packages/lib/server-only/team/create-team-member-invites.ts @@ -1,9 +1,9 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; import { nanoid } from 'nanoid'; import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import type { TeamInviteEmailProps } from '@documenso/email/templates/team-invite'; import { TeamInviteEmailTemplate } from '@documenso/email/templates/team-invite'; import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; @@ -15,6 +15,9 @@ import { prisma } from '@documenso/prisma'; import { TeamMemberInviteStatus } from '@documenso/prisma/client'; import type { TCreateTeamMemberInvitesMutationSchema } from '@documenso/trpc/server/team-router/schema'; +import { getI18nInstance } from '../../client-only/providers/i18n.server'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; + export type CreateTeamMemberInvitesOptions = { userId: number; userName: string; @@ -148,14 +151,23 @@ export const sendTeamMemberInviteEmail = async ({ ...emailTemplateOptions, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template), + renderEmailWithI18N(template, { plainText: true }), + ]); + + const i18n = await getI18nInstance(); + await mailer.sendMail({ to: email, from: { name: FROM_NAME, address: FROM_ADDRESS, }, - subject: `You have been invited to join ${emailTemplateOptions.teamName} on Documenso`, - html: render(template), - text: render(template, { plainText: true }), + subject: i18n._( + msg`You have been invited to join ${emailTemplateOptions.teamName} on Documenso`, + ), + html, + text, }); }; diff --git a/packages/lib/server-only/team/delete-team-email.ts b/packages/lib/server-only/team/delete-team-email.ts index c5139a971..a3f6e906b 100644 --- a/packages/lib/server-only/team/delete-team-email.ts +++ b/packages/lib/server-only/team/delete-team-email.ts @@ -1,13 +1,17 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; + import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import { TeamEmailRemovedTemplate } from '@documenso/email/templates/team-email-removed'; import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email'; import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams'; import { prisma } from '@documenso/prisma'; +import { getI18nInstance } from '../../client-only/providers/i18n.server'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; + export type DeleteTeamEmailOptions = { userId: number; userEmail: string; @@ -73,6 +77,13 @@ export const deleteTeamEmail = async ({ userId, userEmail, teamId }: DeleteTeamE teamUrl: team.url, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template), + renderEmailWithI18N(template, { plainText: true }), + ]); + + const i18n = await getI18nInstance(); + await mailer.sendMail({ to: { address: team.owner.email, @@ -82,9 +93,9 @@ export const deleteTeamEmail = async ({ userId, userEmail, teamId }: DeleteTeamE name: FROM_NAME, address: FROM_ADDRESS, }, - subject: `Team email has been revoked for ${team.name}`, - html: render(template), - text: render(template, { plainText: true }), + subject: i18n._(msg`Team email has been revoked for ${team.name}`), + html, + text, }); } catch (e) { // Todo: Teams - Alert us. diff --git a/packages/lib/server-only/team/delete-team.ts b/packages/lib/server-only/team/delete-team.ts index 57c761e72..260344bd0 100644 --- a/packages/lib/server-only/team/delete-team.ts +++ b/packages/lib/server-only/team/delete-team.ts @@ -1,7 +1,6 @@ import { createElement } from 'react'; import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import type { TeamDeleteEmailProps } from '@documenso/email/templates/team-delete'; import { TeamDeleteEmailTemplate } from '@documenso/email/templates/team-delete'; import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; @@ -11,6 +10,7 @@ import { stripe } from '@documenso/lib/server-only/stripe'; import { prisma } from '@documenso/prisma'; import { jobs } from '../../jobs/client'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; export type DeleteTeamOptions = { userId: number; @@ -95,6 +95,11 @@ export const sendTeamDeleteEmail = async ({ ...emailTemplateOptions, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template), + renderEmailWithI18N(template, { plainText: true }), + ]); + await mailer.sendMail({ to: email, from: { @@ -102,7 +107,7 @@ export const sendTeamDeleteEmail = async ({ address: FROM_ADDRESS, }, subject: `Team "${emailTemplateOptions.teamName}" has been deleted on Documenso`, - html: render(template), - text: render(template, { plainText: true }), + html, + text, }); }; diff --git a/packages/lib/server-only/team/request-team-ownership-transfer.ts b/packages/lib/server-only/team/request-team-ownership-transfer.ts index 92fd5b61e..5da2f6c5b 100644 --- a/packages/lib/server-only/team/request-team-ownership-transfer.ts +++ b/packages/lib/server-only/team/request-team-ownership-transfer.ts @@ -1,13 +1,17 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; + import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import { TeamTransferRequestTemplate } from '@documenso/email/templates/team-transfer-request'; import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email'; import { createTokenVerification } from '@documenso/lib/utils/token-verification'; import { prisma } from '@documenso/prisma'; +import { getI18nInstance } from '../../client-only/providers/i18n.server'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; + export type RequestTeamOwnershipTransferOptions = { /** * The ID of the user initiating the transfer. @@ -93,15 +97,24 @@ export const requestTeamOwnershipTransfer = async ({ token, }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(template), + renderEmailWithI18N(template, { plainText: true }), + ]); + + const i18n = await getI18nInstance(); + await mailer.sendMail({ to: newOwnerUser.email, from: { name: FROM_NAME, address: FROM_ADDRESS, }, - subject: `You have been requested to take ownership of team ${team.name} on Documenso`, - html: render(template), - text: render(template, { plainText: true }), + subject: i18n._( + msg`You have been requested to take ownership of team ${team.name} on Documenso`, + ), + html, + text, }); }, { timeout: 30_000 }, 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 24fdc90ff..733ca9c86 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 @@ -1,10 +1,10 @@ import { createElement } from 'react'; +import { msg } from '@lingui/macro'; import { DateTime } from 'luxon'; import { match } from 'ts-pattern'; import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; import { DocumentCreatedFromDirectTemplateEmailTemplate } from '@documenso/email/templates/document-created-from-direct-template'; import { nanoid } from '@documenso/lib/universal/id'; import { prisma } from '@documenso/prisma'; @@ -22,6 +22,7 @@ import { } from '@documenso/prisma/client'; import type { TSignFieldWithTokenMutationSchema } from '@documenso/trpc/server/field-router/schema'; +import { getI18nInstance } from '../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; import { DEFAULT_DOCUMENT_DATE_FORMAT } from '../../constants/date-formats'; import { DEFAULT_DOCUMENT_TIME_ZONE } from '../../constants/time-zones'; @@ -38,6 +39,7 @@ import { createRecipientAuthOptions, extractDocumentAuthMethods, } from '../../utils/document-auth'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; import { formatDocumentsPath } from '../../utils/teams'; import { sendDocument } from '../document/send-document'; import { validateFieldAuth } from '../document/validate-field-auth'; @@ -143,6 +145,7 @@ export const createDocumentFromDirectTemplate = async ({ const metaDateFormat = template.templateMeta?.dateFormat || DEFAULT_DOCUMENT_DATE_FORMAT; const metaEmailMessage = template.templateMeta?.message || ''; const metaEmailSubject = template.templateMeta?.subject || ''; + const metaLanguage = template.templateMeta?.language; const metaSigningOrder = template.templateMeta?.signingOrder || DocumentSigningOrder.PARALLEL; // Associate, validate and map to a query every direct template recipient field with the provided fields. @@ -270,6 +273,7 @@ export const createDocumentFromDirectTemplate = async ({ dateFormat: metaDateFormat, message: metaEmailMessage, subject: metaEmailSubject, + language: metaLanguage, signingOrder: metaSigningOrder, }, }, @@ -529,6 +533,13 @@ export const createDocumentFromDirectTemplate = async ({ assetBaseUrl: NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000', }); + const [html, text] = await Promise.all([ + renderEmailWithI18N(emailTemplate, { lang: metaLanguage }), + renderEmailWithI18N(emailTemplate, { lang: metaLanguage, plainText: true }), + ]); + + const i18n = await getI18nInstance(metaLanguage); + await mailer.sendMail({ to: [ { @@ -540,9 +551,9 @@ export const createDocumentFromDirectTemplate = async ({ name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso', address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com', }, - subject: 'Document created from direct template', - html: render(emailTemplate), - text: render(emailTemplate, { plainText: true }), + subject: i18n._(msg`Document created from direct template`), + html, + text, }); return { 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 ea5a45760..f468cdf0e 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 @@ -46,6 +46,7 @@ export const createDocumentFromTemplateLegacy = async ({ Recipient: true, Field: true, templateDocumentData: true, + templateMeta: true, }, }); @@ -78,6 +79,17 @@ export const createDocumentFromTemplateLegacy = async ({ token: nanoid(), })), }, + documentMeta: { + create: { + subject: template.templateMeta?.subject, + message: template.templateMeta?.message, + timezone: template.templateMeta?.timezone, + dateFormat: template.templateMeta?.dateFormat, + redirectUrl: template.templateMeta?.redirectUrl, + signingOrder: template.templateMeta?.signingOrder ?? undefined, + language: template.templateMeta?.language, + }, + }, }, include: { 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 1c989fa5b..04bf46dde 100644 --- a/packages/lib/server-only/template/create-document-from-template.ts +++ b/packages/lib/server-only/template/create-document-from-template.ts @@ -11,6 +11,7 @@ import { WebhookTriggerEvents, } from '@documenso/prisma/client'; +import type { SupportedLanguageCodes } from '../../constants/i18n'; import { AppError, AppErrorCode } from '../../errors/app-error'; import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; import { ZRecipientAuthOptionsSchema } from '../../types/document-auth'; @@ -60,6 +61,7 @@ export type CreateDocumentFromTemplateOptions = { dateFormat?: string; redirectUrl?: string; signingOrder?: DocumentSigningOrder; + language?: SupportedLanguageCodes; }; requestMetadata?: RequestMetadata; }; @@ -179,6 +181,7 @@ export const createDocumentFromTemplate = async ({ override?.signingOrder || template.templateMeta?.signingOrder || DocumentSigningOrder.PARALLEL, + language: override?.language || template.templateMeta?.language, }, }, Recipient: { diff --git a/packages/lib/server-only/user/send-confirmation-token.ts b/packages/lib/server-only/user/send-confirmation-token.ts index ef7c4b104..d2bc0a3aa 100644 --- a/packages/lib/server-only/user/send-confirmation-token.ts +++ b/packages/lib/server-only/user/send-confirmation-token.ts @@ -39,7 +39,7 @@ export const sendConfirmationToken = async ({ mostRecentToken?.createdAt && DateTime.fromJSDate(mostRecentToken.createdAt).diffNow('minutes').minutes > -5 ) { - return; + // return; } const createdToken = await prisma.verificationToken.create({ @@ -64,6 +64,7 @@ export const sendConfirmationToken = async ({ return { success: true }; } catch (err) { + console.log(err); throw new Error(`Failed to send the confirmation email`); } }; diff --git a/packages/lib/translations/de/common.po b/packages/lib/translations/de/common.po index 557739d1d..6960ce450 100644 --- a/packages/lib/translations/de/common.po +++ b/packages/lib/translations/de/common.po @@ -18,14 +18,104 @@ msgstr "" "X-Crowdin-File: common.po\n" "X-Crowdin-File-ID: 4\n" +#: packages/email/template-components/template-document-super-delete.tsx:27 +msgid "\"{documentName}\" has been deleted by an admin." +msgstr "" + +#: packages/email/template-components/template-document-pending.tsx:37 +msgid "“{documentName}” has been signed" +msgstr "" + +#: packages/email/template-components/template-document-completed.tsx:41 +#: packages/lib/server-only/document/resend-document.tsx:109 +msgid "{0}" +msgstr "" + +#: packages/email/template-components/template-document-invite.tsx:74 +msgid "{0} Document" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:117 +msgid "{0} invited you to {recipientActionVerb} a document" +msgstr "" + +#: packages/email/templates/team-join.tsx:55 +msgid "{0} joined the team {teamName} on Documenso" +msgstr "" + +#: packages/email/templates/team-leave.tsx:55 +msgid "{0} left the team {teamName} on Documenso" +msgstr "" + #: packages/ui/primitives/data-table-pagination.tsx:30 msgid "{0} of {1} row(s) selected." msgstr "{0} von {1} Zeile(n) ausgewählt." +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:119 +#: packages/lib/server-only/document/resend-document.tsx:119 +msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"." +msgstr "" + +#: packages/email/templates/document-invite.tsx:79 +msgid "{inviterName} <0>({inviterEmail})" +msgstr "" + +#: packages/email/templates/document-cancel.tsx:19 +msgid "{inviterName} has cancelled the document {documentName}, you don't need to sign it anymore." +msgstr "" + +#: packages/email/template-components/template-document-cancel.tsx:24 +msgid "{inviterName} has cancelled the document<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/template-components/template-document-invite.tsx:57 +msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/templates/document-invite.tsx:41 +msgid "{inviterName} has invited you to {action} {documentName}" +msgstr "" + +#: packages/email/templates/recipient-removed-from-document.tsx:18 +msgid "{inviterName} has removed you from the document {documentName}." +msgstr "" + +#: packages/email/template-components/template-document-invite.tsx:49 +msgid "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/templates/document-invite.tsx:40 +msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}" +msgstr "" + +#: packages/email/templates/team-join.tsx:61 +msgid "{memberEmail} joined the following team" +msgstr "" + +#: packages/email/templates/team-leave.tsx:61 +msgid "{memberEmail} left the following team" +msgstr "" + +#: packages/email/templates/document-created-from-direct-template.tsx:55 +msgid "{recipientName} {action} a document by using one of your direct links" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:55 +msgid "{teamName} ownership transfer request" +msgstr "" + #: packages/ui/primitives/data-table-pagination.tsx:41 msgid "{visibleRows, plural, one {Showing # result.} other {Showing # results.}}" msgstr "{visibleRows, plural, one {Eine # Ergebnis wird angezeigt.} other {# Ergebnisse werden angezeigt.}}" +#: packages/email/templates/document-invite.tsx:91 +msgid "`${inviterName} has invited you to ${action} the document \"${documentName}\".`" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:59 +msgid "<0>{senderName} has requested that you take ownership of the following team" +msgstr "" + #: packages/ui/components/recipient/recipient-action-auth-select.tsx:53 msgid "<0>Inherit authentication method - Use the global action signing authentication method configured in the \"General Settings\" step" msgstr "<0>Authentifizierungsmethode erben - Verwenden Sie die in den \"Allgemeinen Einstellungen\" konfigurierte globale Aktionssignatur-Authentifizierungsmethode" @@ -56,20 +146,66 @@ msgstr "<0>Konto erforderlich - Der Empfänger muss angemeldet sein, um das msgid "<0>Require passkey - The recipient must have an account and passkey configured via their settings" msgstr "<0>Passkey erforderlich - Der Empfänger muss ein Konto haben und den Passkey über seine Einstellungen konfiguriert haben" +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:109 +msgid "A document was created by your direct template that requires you to {recipientActionVerb} it." +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts:90 +msgid "A new member has joined your team" +msgstr "" + +#: packages/lib/server-only/team/create-team-email-verification.ts:142 +msgid "A request to use your email has been initiated by {teamName} on Documenso" +msgstr "" + +#: packages/email/templates/team-join.tsx:29 +msgid "A team member has joined a team on Documenso" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-team-member-left-email.ts:79 +msgid "A team member has left {0}" +msgstr "" + +#: packages/email/templates/team-leave.tsx:29 +msgid "A team member has left a team on Documenso" +msgstr "" + +#: packages/email/templates/team-delete.tsx:27 +#: packages/email/templates/team-delete.tsx:31 +msgid "A team you were a part of has been deleted" +msgstr "" + +#: packages/email/templates/team-invite.tsx:77 +#: packages/email/templates/team-transfer-request.tsx:81 +msgid "Accept" +msgstr "" + +#: packages/email/templates/team-invite.tsx:29 +msgid "Accept invitation to join a team on Documenso" +msgstr "" + +#: packages/email/templates/confirm-team-email.tsx:38 +msgid "Accept team email request for {teamName} on Documenso" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:29 +msgid "Accept team transfer request on Documenso" +msgstr "" + #: packages/ui/primitives/document-dropzone.tsx:69 msgid "Add a document" msgstr "Dokument hinzufügen" -#: packages/ui/primitives/document-flow/add-settings.tsx:336 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:339 +#: packages/ui/primitives/document-flow/add-settings.tsx:378 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:378 msgid "Add a URL to redirect the user to once the document is signed" msgstr "Fügen Sie eine URL hinzu, um den Benutzer nach der Unterzeichnung des Dokuments weiterzuleiten" -#: packages/ui/primitives/document-flow/add-settings.tsx:248 +#: packages/ui/primitives/document-flow/add-settings.tsx:290 msgid "Add an external ID to the document. This can be used to identify the document in external systems." msgstr "Fügen Sie dem Dokument eine externe ID hinzu. Diese kann verwendet werden, um das Dokument in externen Systemen zu identifizieren." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:256 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:295 msgid "Add an external ID to the template. This can be used to identify in external systems." msgstr "Fügen Sie der Vorlage eine externe ID hinzu. Diese kann zur Identifizierung in externen Systemen verwendet werden." @@ -110,8 +246,8 @@ msgstr "Text zum Feld hinzufügen" msgid "Admin" msgstr "Admin" -#: packages/ui/primitives/document-flow/add-settings.tsx:230 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:238 +#: packages/ui/primitives/document-flow/add-settings.tsx:272 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:277 msgid "Advanced Options" msgstr "Erweiterte Optionen" @@ -124,6 +260,14 @@ msgstr "Erweiterte Einstellungen" msgid "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email." msgstr "Nach der Übermittlung wird ein Dokument automatisch generiert und zu Ihrer Dokumentenseite hinzugefügt. Sie erhalten außerdem eine Benachrichtigung per E-Mail." +#: packages/email/template-components/template-document-cancel.tsx:31 +msgid "All signatures have been voided." +msgstr "" + +#: packages/email/templates/document-super-delete.tsx:20 +msgid "An admin has deleted your document \"{documentName}\"." +msgstr "" + #: packages/ui/primitives/pdf-viewer.tsx:167 msgid "An error occurred while loading the document." msgstr "Ein Fehler ist beim Laden des Dokuments aufgetreten." @@ -132,6 +276,10 @@ msgstr "Ein Fehler ist beim Laden des Dokuments aufgetreten." msgid "Approve" msgstr "Genehmigen" +#: packages/lib/constants/recipient-roles.ts:68 +#~ msgid "APPROVE_REQUEST" +#~ msgstr "" + #: packages/lib/constants/recipient-roles.ts:9 msgid "Approved" msgstr "Genehmigt" @@ -148,6 +296,10 @@ msgstr "Genehmigende" msgid "Approving" msgstr "Genehmigung" +#: packages/email/template-components/template-confirmation-email.tsx:28 +msgid "Before you get started, please confirm your email address by clicking the button below:" +msgstr "" + #: packages/ui/primitives/signature-pad/signature-pad.tsx:377 msgid "Black" msgstr "Schwarz" @@ -156,6 +308,14 @@ msgstr "Schwarz" msgid "Blue" msgstr "Blau" +#: packages/email/templates/team-invite.tsx:67 +msgid "by <0>{senderName}" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:70 +msgid "By accepting this request, you will take responsibility for any billing items associated with this team." +msgstr "" + #: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356 #: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58 msgid "Cancel" @@ -206,6 +366,16 @@ msgstr "Klicken, um das Feld einzufügen" msgid "Close" msgstr "Schließen" +#: packages/email/template-components/template-document-completed.tsx:35 +#: packages/email/template-components/template-document-self-signed.tsx:36 +msgid "Completed" +msgstr "" + +#: packages/email/templates/document-completed.tsx:21 +#: packages/email/templates/document-self-signed.tsx:17 +msgid "Completed Document" +msgstr "" + #: packages/lib/constants/template.ts:12 msgid "Configure Direct Recipient" msgstr "Direkten Empfänger konfigurieren" @@ -215,10 +385,22 @@ msgstr "Direkten Empfänger konfigurieren" msgid "Configure the {0} field" msgstr "Konfigurieren Sie das Feld {0}" +#: packages/email/template-components/template-confirmation-email.tsx:38 +msgid "Confirm email" +msgstr "" + #: packages/ui/primitives/document-flow/document-flow-root.tsx:141 msgid "Continue" msgstr "Fortsetzen" +#: packages/email/template-components/template-document-invite.tsx:66 +msgid "Continue by {0} the document." +msgstr "" + +#: packages/email/template-components/template-document-completed.tsx:45 +msgid "Continue by downloading the document." +msgstr "" + #: packages/ui/components/document/document-share-button.tsx:46 msgid "Copied to clipboard" msgstr "In die Zwischenablage kopiert" @@ -227,6 +409,14 @@ msgstr "In die Zwischenablage kopiert" msgid "Copy Link" msgstr "Link kopieren" +#: packages/email/template-components/template-document-self-signed.tsx:46 +msgid "Create a <0>free account to access your signed documents at any time." +msgstr "" + +#: packages/email/template-components/template-document-self-signed.tsx:68 +msgid "Create account" +msgstr "" + #: packages/ui/primitives/document-flow/add-signature.tsx:360 msgid "Custom Text" msgstr "Benutzerdefinierter Text" @@ -237,25 +427,47 @@ msgstr "Benutzerdefinierter Text" msgid "Date" msgstr "Datum" -#: packages/ui/primitives/document-flow/add-settings.tsx:271 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:279 +#: packages/ui/primitives/document-flow/add-settings.tsx:313 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:318 msgid "Date Format" msgstr "Datumsformat" +#: packages/email/templates/team-invite.tsx:83 +msgid "Decline" +msgstr "" + +#: packages/email/templates/reset-password.tsx:65 +msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us." +msgstr "" + #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570 msgid "Direct link receiver" msgstr "Empfänger des direkten Links" #: packages/ui/components/document/document-global-auth-access-select.tsx:62 -#: packages/ui/primitives/document-flow/add-settings.tsx:174 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:151 +#: packages/ui/primitives/document-flow/add-settings.tsx:216 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:190 msgid "Document access" msgstr "Dokumentenzugriff" +#: packages/lib/server-only/document/super-delete-document.ts:75 +msgid "Document Cancelled" +msgstr "" + +#: packages/email/templates/document-created-from-direct-template.tsx:30 +#: packages/lib/server-only/template/create-document-from-direct-template.ts:554 +msgid "Document created from direct template" +msgstr "" + #: packages/lib/constants/template.ts:20 msgid "Document Creation" msgstr "Dokumenterstellung" +#: packages/lib/server-only/document/send-delete-email.ts:58 +msgid "Document Deleted!" +msgstr "" + +#: packages/email/template-components/template-document-completed.tsx:64 #: packages/ui/components/document/document-download-button.tsx:68 msgid "Download" msgstr "Herunterladen" @@ -288,7 +500,7 @@ msgstr "E-Mail" msgid "Email is required" msgstr "E-Mail ist erforderlich" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:184 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:223 msgid "Email Options" msgstr "E-Mail-Optionen" @@ -318,8 +530,8 @@ msgstr "Passwort eingeben" msgid "Error" msgstr "Fehler" -#: packages/ui/primitives/document-flow/add-settings.tsx:241 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:249 +#: packages/ui/primitives/document-flow/add-settings.tsx:283 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:288 msgid "External ID" msgstr "Externe ID" @@ -361,6 +573,14 @@ msgstr "Feldplatzhalter" msgid "Font Size" msgstr "Schriftgröße" +#: packages/lib/server-only/auth/send-forgot-password.ts:61 +msgid "Forgot Password?" +msgstr "" + +#: packages/email/template-components/template-forgot-password.tsx:21 +msgid "Forgot your password?" +msgstr "" + #: packages/ui/primitives/document-flow/types.ts:50 msgid "Free Signature" msgstr "Freie Unterschrift" @@ -377,6 +597,10 @@ msgstr "Zurück" msgid "Green" msgstr "Grün" +#: packages/email/templates/reset-password.tsx:50 +msgid "Hi, {userName} <0>({userEmail})" +msgstr "" + #: packages/lib/constants/recipient-roles.ts:76 msgid "I am a signer of this document" msgstr "Ich bin ein Unterzeichner dieses Dokuments" @@ -410,12 +634,25 @@ msgstr "Ungültige E-Mail" msgid "Invalid email address" msgstr "Ungültige E-Mail-Adresse" +#: packages/email/templates/team-invite.tsx:55 +msgid "Join {teamName} on Documenso" +msgstr "" + #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72 #: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48 msgid "Label" msgstr "Beschriftung" +#: packages/ui/primitives/document-flow/add-settings.tsx:176 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:150 +msgid "Language" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:87 +msgid "Link expires in 1 hour." +msgstr "" + #: packages/ui/primitives/lazy-pdf-viewer.tsx:15 #: packages/ui/primitives/pdf-viewer.tsx:44 msgid "Loading document..." @@ -434,7 +671,7 @@ msgid "Member" msgstr "Mitglied" #: packages/ui/primitives/document-flow/add-subject.tsx:95 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:215 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:254 msgid "Message <0>(Optional)" msgstr "Nachricht <0>(Optional)" @@ -525,6 +762,22 @@ msgstr "Seite {0} von {numPages}" msgid "Password Required" msgstr "Passwort erforderlich" +#: packages/email/templates/forgot-password.tsx:17 +msgid "Password Reset Requested" +msgstr "" + +#: packages/email/templates/reset-password.tsx:18 +msgid "Password Reset Successful" +msgstr "" + +#: packages/email/template-components/template-reset-password.tsx:22 +msgid "Password updated!" +msgstr "" + +#: packages/email/templates/document-pending.tsx:17 +msgid "Pending Document" +msgstr "" + #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156 msgid "Pick a number" msgstr "Wählen Sie eine Zahl" @@ -535,6 +788,34 @@ msgstr "Wählen Sie eine Zahl" msgid "Placeholder" msgstr "Platzhalter" +#: packages/email/template-components/template-document-invite.tsx:43 +msgid "Please {0} your document<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/templates/document-invite.tsx:38 +msgid "Please {action} your document {documentName}" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:98 +msgid "Please {recipientActionVerb} this document" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:112 +msgid "Please {recipientActionVerb} this document created by your direct template" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:104 +msgid "Please {recipientActionVerb} your document" +msgstr "" + +#: packages/lib/server-only/auth/send-confirmation-email.ts:67 +msgid "Please confirm your email" +msgstr "" + +#: packages/email/templates/confirm-email.tsx:15 +msgid "Please confirm your email address" +msgstr "" + #: packages/ui/primitives/pdf-viewer.tsx:223 #: packages/ui/primitives/pdf-viewer.tsx:238 msgid "Please try again or contact our support." @@ -561,8 +842,8 @@ msgid "Receives copy" msgstr "Erhält Kopie" #: packages/ui/components/recipient/recipient-action-auth-select.tsx:39 -#: packages/ui/primitives/document-flow/add-settings.tsx:215 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:169 +#: packages/ui/primitives/document-flow/add-settings.tsx:257 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:208 msgid "Recipient action authentication" msgstr "Empfängeraktion Authentifizierung" @@ -570,11 +851,27 @@ msgstr "Empfängeraktion Authentifizierung" msgid "Red" msgstr "Rot" -#: packages/ui/primitives/document-flow/add-settings.tsx:329 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:332 +#: packages/ui/primitives/document-flow/add-settings.tsx:371 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:371 msgid "Redirect URL" msgstr "Weiterleitungs-URL" +#: packages/lib/server-only/document/resend-document.tsx:165 +msgid "Reminder: {0}" +msgstr "" + +#: packages/lib/server-only/document/resend-document.tsx:118 +msgid "Reminder: {0} invited you to {recipientActionVerb} a document" +msgstr "" + +#: packages/lib/server-only/document/resend-document.tsx:110 +msgid "Reminder: Please {recipientActionVerb} this document" +msgstr "" + +#: packages/lib/server-only/document/resend-document.tsx:114 +msgid "Reminder: Please {recipientActionVerb} your document" +msgstr "" + #: packages/ui/primitives/document-flow/add-fields.tsx:1110 msgid "Remove" msgstr "Entfernen" @@ -587,6 +884,10 @@ msgstr "Entfernen" msgid "Required field" msgstr "Pflichtfeld" +#: packages/email/template-components/template-forgot-password.tsx:33 +msgid "Reset Password" +msgstr "" + #: packages/ui/components/document/document-share-button.tsx:147 msgid "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!" msgstr "Seien Sie versichert, Ihr Dokument ist streng vertraulich und wird niemals geteilt. Nur Ihre Unterzeichnungserfahrung wird hervorgehoben. Teilen Sie Ihre personalisierte Unterschriftkarte, um Ihre Unterschrift zu präsentieren!" @@ -654,6 +955,10 @@ msgstr "Erweiterte Einstellungen anzeigen" msgid "Sign" msgstr "Unterschreiben" +#: packages/email/template-components/template-reset-password.tsx:34 +msgid "Sign In" +msgstr "" + #: packages/ui/primitives/document-flow/add-fields.tsx:823 #: packages/ui/primitives/document-flow/add-signature.tsx:323 #: packages/ui/primitives/document-flow/field-icon.tsx:52 @@ -682,6 +987,15 @@ msgstr "Unterzeichner müssen eindeutige E-Mails haben" msgid "Signing" msgstr "Unterzeichnung" +#: packages/lib/server-only/document/send-completed-email.ts:93 +#: packages/lib/server-only/document/send-completed-email.ts:161 +msgid "Signing Complete!" +msgstr "" + +#: packages/lib/constants/recipient-roles.ts:66 +#~ msgid "SIGNING_REQUEST" +#~ msgstr "" + #: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:34 msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding." msgstr "Einige Unterzeichner haben noch kein Unterschriftsfeld zugewiesen bekommen. Bitte weisen Sie jedem Unterzeichner mindestens ein Unterschriftsfeld zu, bevor Sie fortfahren." @@ -704,7 +1018,7 @@ msgid "Step <0>{step} of {maxStep}" msgstr "Schritt <0>{step} von {maxStep}" #: packages/ui/primitives/document-flow/add-subject.tsx:78 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:195 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:234 msgid "Subject <0>(Optional)" msgstr "Betreff <0>(Optional)" @@ -712,7 +1026,19 @@ msgstr "Betreff <0>(Optional)" msgid "Submit" msgstr "Einreichen" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:134 +#: packages/lib/server-only/team/delete-team-email.ts:96 +msgid "Team email has been revoked for {0}" +msgstr "" + +#: packages/email/templates/team-email-removed.tsx:53 +msgid "Team email removed" +msgstr "" + +#: packages/email/templates/team-email-removed.tsx:27 +msgid "Team email removed for {teamName} on Documenso" +msgstr "" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:133 msgid "Template title" msgstr "Vorlagentitel" @@ -722,6 +1048,10 @@ msgstr "Vorlagentitel" msgid "Text" msgstr "Text" +#: packages/email/template-components/template-forgot-password.tsx:25 +msgid "That's okay, it happens! Click the button below to reset your password." +msgstr "" + #: packages/ui/components/recipient/recipient-action-auth-select.tsx:44 msgid "The authentication required for recipients to sign fields" msgstr "Die Authentifizierung, die erforderlich ist, damit Empfänger Felder signieren" @@ -738,10 +1068,22 @@ msgstr "Die Authentifizierung, die erforderlich ist, damit Empfänger das Dokume msgid "The document's name" msgstr "Der Name des Dokuments" +#: packages/email/templates/team-delete.tsx:35 +msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents" +msgstr "" + +#: packages/email/templates/team-delete.tsx:34 +msgid "The following team has been deleted by you" +msgstr "" + #: packages/ui/primitives/document-password-dialog.tsx:52 msgid "The password you have entered is incorrect. Please try again." msgstr "Das eingegebene Passwort ist falsch. Bitte versuchen Sie es erneut." +#: packages/email/template-components/template-document-super-delete.tsx:38 +msgid "The reason provided for deletion is the following:" +msgstr "" + #: packages/ui/components/recipient/recipient-role-select.tsx:103 msgid "The recipient is not required to take any action and receives a copy of the document after it is completed." msgstr "Der Empfänger muss keine Aktion ausführen und erhält nach Abschluss eine Kopie des Dokuments." @@ -774,10 +1116,18 @@ msgstr "Die E-Mail des Unterzeichners" msgid "The signer's name" msgstr "Der Name des Unterzeichners" +#: packages/email/templates/team-email-removed.tsx:57 +msgid "The team email <0>{teamEmail} has been removed from the following team" +msgstr "" + #: packages/ui/components/document/document-global-auth-action-select.tsx:72 msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step." msgstr "Dies kann überschrieben werden, indem die Authentifizierungsanforderungen im nächsten Schritt direkt für jeden Empfänger festgelegt werden." +#: packages/email/template-components/template-document-super-delete.tsx:31 +msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." +msgstr "" + #: packages/ui/primitives/document-flow/add-fields.tsx:757 msgid "This document has already been sent to this recipient. You can no longer edit this recipient." msgstr "Dieses Dokument wurde bereits an diesen Empfänger gesendet. Sie können diesen Empfänger nicht mehr bearbeiten." @@ -786,6 +1136,10 @@ msgstr "Dieses Dokument wurde bereits an diesen Empfänger gesendet. Sie können msgid "This document is password protected. Please enter the password to view the document." msgstr "Dieses Dokument ist durch ein Passwort geschützt. Bitte geben Sie das Passwort ein, um das Dokument anzusehen." +#: packages/email/template-components/template-footer.tsx:14 +msgid "This document was sent using <0>Documenso." +msgstr "" + #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:573 msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them." msgstr "Dieses Feld kann nicht geändert oder gelöscht werden. Wenn Sie den direkten Link dieser Vorlage teilen oder zu Ihrem öffentlichen Profil hinzufügen, kann jeder, der darauf zugreift, seinen Namen und seine E-Mail-Adresse eingeben und die ihm zugewiesenen Felder ausfüllen." @@ -802,12 +1156,12 @@ msgstr "Dieser Unterzeichner hat das Dokument bereits unterschrieben." msgid "This will override any global settings." msgstr "Dies überschreibt alle globalen Einstellungen." -#: packages/ui/primitives/document-flow/add-settings.tsx:305 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:309 +#: packages/ui/primitives/document-flow/add-settings.tsx:347 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:348 msgid "Time Zone" msgstr "Zeitzone" -#: packages/ui/primitives/document-flow/add-settings.tsx:153 +#: packages/ui/primitives/document-flow/add-settings.tsx:155 msgid "Title" msgstr "Titel" @@ -846,6 +1200,18 @@ msgstr "Wert" msgid "View" msgstr "Betrachten" +#: packages/email/templates/document-created-from-direct-template.tsx:69 +msgid "View document" +msgstr "" + +#: packages/email/template-components/template-document-self-signed.tsx:79 +msgid "View plans" +msgstr "" + +#: packages/lib/constants/recipient-roles.ts:67 +#~ msgid "VIEW_REQUEST" +#~ msgstr "" + #: packages/lib/constants/recipient-roles.ts:27 msgid "Viewed" msgstr "Betrachtet" @@ -862,10 +1228,34 @@ msgstr "Betrachter" msgid "Viewing" msgstr "Betrachten" +#: packages/email/template-components/template-document-pending.tsx:31 +msgid "Waiting for others" +msgstr "" + +#: packages/lib/server-only/document/send-pending-email.ts:73 +msgid "Waiting for others to complete signing." +msgstr "" + +#: packages/email/template-components/template-document-pending.tsx:41 +msgid "We're still waiting for other signers to sign this document.<0/>We'll notify you as soon as it's ready." +msgstr "" + +#: packages/email/templates/reset-password.tsx:59 +msgid "We've changed your password as you asked. You can now sign in with your new password." +msgstr "" + +#: packages/email/template-components/template-confirmation-email.tsx:24 +msgid "Welcome to Documenso!" +msgstr "" + #: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:44 msgid "You are about to send this document to the recipients. Are you sure you want to continue?" msgstr "Sie sind dabei, dieses Dokument an die Empfänger zu senden. Sind Sie sicher, dass Sie fortfahren möchten?" +#: packages/email/template-components/template-confirmation-email.tsx:41 +msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)" +msgstr "" + #: packages/ui/components/document/document-send-email-message-helper.tsx:11 msgid "You can use the following variables in your message:" msgstr "Sie können die folgenden Variablen in Ihrer Nachricht verwenden:" @@ -874,7 +1264,48 @@ msgstr "Sie können die folgenden Variablen in Ihrer Nachricht verwenden:" msgid "You cannot upload documents at this time." msgstr "Sie können derzeit keine Dokumente hochladen." +#: packages/email/template-components/template-document-cancel.tsx:35 +msgid "You don't need to sign it anymore." +msgstr "" + +#: packages/lib/server-only/team/create-team-member-invites.ts:168 +msgid "You have been invited to join {0} on Documenso" +msgstr "" + +#: packages/email/templates/team-invite.tsx:59 +msgid "You have been invited to join the following team" +msgstr "" + +#: packages/lib/server-only/recipient/set-recipients-for-document.ts:314 +msgid "You have been removed from a document" +msgstr "" + +#: packages/lib/server-only/team/request-team-ownership-transfer.ts:114 +msgid "You have been requested to take ownership of team {0} on Documenso" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:102 +#: packages/lib/server-only/document/resend-document.tsx:113 +msgid "You have initiated the document {0} that requires you to {recipientActionVerb} it." +msgstr "" + #: packages/ui/primitives/document-dropzone.tsx:69 msgid "You have reached your document limit." msgstr "Sie haben Ihr Dokumentenlimit erreicht." +#: packages/email/template-components/template-document-self-signed.tsx:42 +msgid "You have signed “{documentName}”" +msgstr "" + +#: packages/email/template-components/template-document-super-delete.tsx:23 +msgid "Your document has been deleted by an admin!" +msgstr "" + +#: packages/email/template-components/template-reset-password.tsx:26 +msgid "Your password has been updated." +msgstr "" + +#: packages/email/templates/team-delete.tsx:26 +#: packages/email/templates/team-delete.tsx:30 +msgid "Your team has been deleted" +msgstr "" diff --git a/packages/lib/translations/de/marketing.po b/packages/lib/translations/de/marketing.po index 51b162dde..9f97b6734 100644 --- a/packages/lib/translations/de/marketing.po +++ b/packages/lib/translations/de/marketing.po @@ -42,7 +42,7 @@ msgstr "Dokument hinzufügen" msgid "Add More Users for {0}" msgstr "Mehr Benutzer hinzufügen für {0}" -#: apps/marketing/src/app/(marketing)/open/page.tsx:165 +#: apps/marketing/src/app/(marketing)/open/page.tsx:164 msgid "All our metrics, finances, and learnings are public. We believe in transparency and want to share our journey with you. You can read more about why here: <0>Announcing Open Metrics" msgstr "Alle unsere Kennzahlen, Finanzen und Erkenntnisse sind öffentlich. Wir glauben an Transparenz und möchten unsere Reise mit Ihnen teilen. Mehr erfahren Sie hier: <0>Ankündigung Offene Kennzahlen" @@ -90,7 +90,7 @@ msgstr "Änderungsprotokoll" msgid "Choose a template from the community app store. Or submit your own template for others to use." msgstr "Wählen Sie eine Vorlage aus dem Community-App-Store. Oder reichen Sie Ihre eigene Vorlage ein, damit andere sie benutzen können." -#: apps/marketing/src/app/(marketing)/open/page.tsx:219 +#: apps/marketing/src/app/(marketing)/open/page.tsx:218 msgid "Community" msgstr "Gemeinschaft" @@ -193,7 +193,7 @@ msgstr "Schnell." msgid "Faster, smarter and more beautiful." msgstr "Schneller, intelligenter und schöner." -#: apps/marketing/src/app/(marketing)/open/page.tsx:210 +#: apps/marketing/src/app/(marketing)/open/page.tsx:209 msgid "Finances" msgstr "Finanzen" @@ -246,15 +246,15 @@ msgstr "Fangen Sie heute an." msgid "Get the latest news from Documenso, including product updates, team announcements and more!" msgstr "Erhalten Sie die neuesten Nachrichten von Documenso, einschließlich Produkt-Updates, Team-Ankündigungen und mehr!" -#: apps/marketing/src/app/(marketing)/open/page.tsx:233 +#: apps/marketing/src/app/(marketing)/open/page.tsx:232 msgid "GitHub: Total Merged PRs" msgstr "GitHub: Gesamte PRs zusammengeführt" -#: apps/marketing/src/app/(marketing)/open/page.tsx:251 +#: apps/marketing/src/app/(marketing)/open/page.tsx:250 msgid "GitHub: Total Open Issues" msgstr "GitHub: Gesamte offene Issues" -#: apps/marketing/src/app/(marketing)/open/page.tsx:225 +#: apps/marketing/src/app/(marketing)/open/page.tsx:224 msgid "GitHub: Total Stars" msgstr "GitHub: Gesamtanzahl Sterne" @@ -262,7 +262,7 @@ msgstr "GitHub: Gesamtanzahl Sterne" msgid "Global Salary Bands" msgstr "Globale Gehaltsbänder" -#: apps/marketing/src/app/(marketing)/open/page.tsx:261 +#: apps/marketing/src/app/(marketing)/open/page.tsx:260 msgid "Growth" msgstr "Wachstum" @@ -286,7 +286,7 @@ msgstr "Integrierte Zahlungen mit Stripe, sodass Sie sich keine Sorgen ums Bezah msgid "Integrates with all your favourite tools." msgstr "Integriert sich mit all Ihren Lieblingstools." -#: apps/marketing/src/app/(marketing)/open/page.tsx:289 +#: apps/marketing/src/app/(marketing)/open/page.tsx:288 msgid "Is there more?" msgstr "Gibt es mehr?" @@ -310,11 +310,11 @@ msgstr "Standort" msgid "Make it your own through advanced customization and adjustability." msgstr "Machen Sie es zu Ihrem eigenen durch erweiterte Anpassung und Einstellbarkeit." -#: apps/marketing/src/app/(marketing)/open/page.tsx:199 +#: apps/marketing/src/app/(marketing)/open/page.tsx:198 msgid "Merged PR's" msgstr "Zusammengeführte PRs" -#: apps/marketing/src/app/(marketing)/open/page.tsx:234 +#: apps/marketing/src/app/(marketing)/open/page.tsx:233 msgid "Merged PRs" msgstr "Zusammengeführte PRs" @@ -345,8 +345,8 @@ msgstr "Keine Kreditkarte erforderlich" msgid "None of these work for you? Try self-hosting!" msgstr "Keines dieser Angebote passt zu Ihnen? Versuchen Sie das Selbst-Hosting!" -#: apps/marketing/src/app/(marketing)/open/page.tsx:194 -#: apps/marketing/src/app/(marketing)/open/page.tsx:252 +#: apps/marketing/src/app/(marketing)/open/page.tsx:193 +#: apps/marketing/src/app/(marketing)/open/page.tsx:251 msgid "Open Issues" msgstr "Offene Issues" @@ -354,7 +354,7 @@ msgstr "Offene Issues" msgid "Open Source or Hosted." msgstr "Open Source oder Hosted." -#: apps/marketing/src/app/(marketing)/open/page.tsx:161 +#: apps/marketing/src/app/(marketing)/open/page.tsx:160 #: apps/marketing/src/components/(marketing)/footer.tsx:37 #: apps/marketing/src/components/(marketing)/header.tsx:64 #: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:40 @@ -466,7 +466,7 @@ msgstr "Intelligent." msgid "Star on GitHub" msgstr "Auf GitHub favorisieren" -#: apps/marketing/src/app/(marketing)/open/page.tsx:226 +#: apps/marketing/src/app/(marketing)/open/page.tsx:225 msgid "Stars" msgstr "Favoriten" @@ -501,7 +501,7 @@ msgstr "Vorlagen-Shop (Demnächst)." msgid "That's awesome. You can take a look at the current <0>Issues and join our <1>Discord Community to keep up to date, on what the current priorities are. In any case, we are an open community and welcome all input, technical and non-technical ❤️" msgstr "Das ist großartig. Sie können sich die aktuellen <0>Issues ansehen und unserer <1>Discord-Community beitreten, um auf dem neuesten Stand zu bleiben, was die aktuellen Prioritäten sind. In jedem Fall sind wir eine offene Gemeinschaft und begrüßen jegliche Beiträge, technische und nicht-technische ❤️" -#: apps/marketing/src/app/(marketing)/open/page.tsx:293 +#: apps/marketing/src/app/(marketing)/open/page.tsx:292 msgid "This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share." msgstr "Diese Seite entwickelt sich weiter, während wir lernen, was ein großartiges Signing-Unternehmen ausmacht. Wir werden sie aktualisieren, wenn wir mehr zu teilen haben." @@ -514,8 +514,8 @@ msgstr "Titel" msgid "Total Completed Documents" msgstr "Insgesamt Abgeschlossene Dokumente" +#: apps/marketing/src/app/(marketing)/open/page.tsx:266 #: apps/marketing/src/app/(marketing)/open/page.tsx:267 -#: apps/marketing/src/app/(marketing)/open/page.tsx:268 msgid "Total Customers" msgstr "Insgesamt Kunden" @@ -602,4 +602,3 @@ msgstr "Sie können Documenso kostenlos selbst hosten oder unsere sofort einsatz #: apps/marketing/src/components/(marketing)/carousel.tsx:272 msgid "Your browser does not support the video tag." msgstr "Ihr Browser unterstützt das Video-Tag nicht." - diff --git a/packages/lib/translations/de/web.po b/packages/lib/translations/de/web.po index 81d733570..c3bd391fb 100644 --- a/packages/lib/translations/de/web.po +++ b/packages/lib/translations/de/web.po @@ -260,12 +260,12 @@ msgstr "Aktive Abonnements" msgid "Add" msgstr "Hinzufügen" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:176 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:88 msgid "Add all relevant fields for each recipient." msgstr "Fügen Sie alle relevanten Felder für jeden Empfänger hinzu." -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:83 msgid "Add all relevant placeholders for each recipient." msgstr "Fügen Sie alle relevanten Platzhalter für jeden Empfänger hinzu." @@ -281,8 +281,8 @@ msgstr "Fügen Sie einen Authenticator hinzu, um als sekundäre Authentifizierun msgid "Add email" msgstr "E-Mail hinzufügen" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:174 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87 msgid "Add Fields" msgstr "Felder hinzufügen" @@ -295,15 +295,15 @@ msgstr "Mehr hinzufügen" msgid "Add passkey" msgstr "Passkey hinzufügen" -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:81 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82 msgid "Add Placeholders" msgstr "Platzhalter hinzufügen" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170 msgid "Add Signers" msgstr "Unterzeichner hinzufügen" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180 msgid "Add Subject" msgstr "Betreff hinzufügen" @@ -311,7 +311,7 @@ msgstr "Betreff hinzufügen" msgid "Add team email" msgstr "Team-E-Mail hinzufügen" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:171 msgid "Add the people who will sign the document." msgstr "Fügen Sie die Personen hinzu, die das Dokument unterschreiben werden." @@ -319,7 +319,7 @@ msgstr "Fügen Sie die Personen hinzu, die das Dokument unterschreiben werden." msgid "Add the recipients to create the document with" msgstr "Fügen Sie die Empfänger hinzu, um das Dokument zu erstellen" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181 msgid "Add the subject and message you wish to send to signers." msgstr "Fügen Sie den Betreff und die Nachricht hinzu, die Sie den Unterzeichnern senden möchten." @@ -414,13 +414,13 @@ msgstr "Eine E-Mail, in der die Übertragung dieses Teams angefordert wird, wurd msgid "An error occurred" msgstr "Ein Fehler ist aufgetreten" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:266 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:268 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:201 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:235 msgid "An error occurred while adding signers." msgstr "Ein Fehler ist aufgetreten, während Unterzeichner hinzugefügt wurden." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 msgid "An error occurred while adding the fields." msgstr "Ein Fehler ist aufgetreten, während die Felder hinzugefügt wurden." @@ -482,7 +482,7 @@ msgstr "Ein Fehler ist aufgetreten, während die Unterschrift entfernt wurde." msgid "An error occurred while removing the text." msgstr "Ein Fehler ist aufgetreten, während der Text entfernt wurde." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:332 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:334 msgid "An error occurred while sending the document." msgstr "Ein Fehler ist aufgetreten, während das Dokument gesendet wurde." @@ -507,8 +507,8 @@ msgstr "Ein Fehler ist aufgetreten, während das Dokument unterzeichnet wurde." msgid "An error occurred while trying to create a checkout session." msgstr "Ein Fehler ist aufgetreten, während versucht wurde, eine Checkout-Sitzung zu erstellen." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:232 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:234 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:170 msgid "An error occurred while updating the document settings." msgstr "Ein Fehler ist aufgetreten, während die Dokumenteinstellungen aktualisiert wurden." @@ -869,11 +869,11 @@ msgstr "Abgeschlossene Dokumente" msgid "Completed Documents" msgstr "Abgeschlossene Dokumente" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:166 msgid "Configure general settings for the document." msgstr "Konfigurieren Sie die allgemeinen Einstellungen für das Dokument." -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:78 msgid "Configure general settings for the template." msgstr "Konfigurieren Sie die allgemeinen Einstellungen für die Vorlage." @@ -1350,7 +1350,7 @@ msgstr "Dokument erneut gesendet" msgid "Document resealed" msgstr "Dokument wieder versiegelt" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:323 msgid "Document sent" msgstr "Dokument gesendet" @@ -1579,16 +1579,16 @@ msgstr "Geben Sie hier Ihren Text ein" #: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:231 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:233 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:267 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:302 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:333 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57 #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:165 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:196 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:230 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:169 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:200 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:234 #: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56 #: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:160 @@ -1679,8 +1679,8 @@ msgstr "Haben Sie Ihr Passwort vergessen?" msgid "Full Name" msgstr "Vollständiger Name" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:164 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:51 @@ -3244,7 +3244,7 @@ msgstr "Vorlage wurde aktualisiert." msgid "Template moved" msgstr "Vorlage verschoben" -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:219 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:223 msgid "Template saved" msgstr "Vorlage gespeichert" @@ -4521,7 +4521,7 @@ msgstr "Ihr Dokument wurde erfolgreich aus der Vorlage erstellt." msgid "Your document has been re-sent successfully." msgstr "Ihr Dokument wurde erfolgreich erneut gesendet." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:322 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:324 msgid "Your document has been sent successfully." msgstr "Ihr Dokument wurde erfolgreich gesendet." @@ -4612,7 +4612,7 @@ msgstr "Ihre Vorlage wurde erfolgreich gelöscht." msgid "Your template will be duplicated." msgstr "Ihre Vorlage wird dupliziert." -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:220 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:224 msgid "Your templates has been saved successfully." msgstr "Ihre Vorlagen wurden erfolgreich gespeichert." @@ -4628,4 +4628,3 @@ msgstr "Ihr Token wurde erfolgreich erstellt! Stellen Sie sicher, dass Sie es ko #: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86 msgid "Your tokens will be shown here once you create them." msgstr "Ihre Tokens werden hier angezeigt, sobald Sie sie erstellt haben." - diff --git a/packages/lib/translations/en/common.po b/packages/lib/translations/en/common.po index 37f959cf7..596ff4e27 100644 --- a/packages/lib/translations/en/common.po +++ b/packages/lib/translations/en/common.po @@ -13,14 +13,104 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" +#: packages/email/template-components/template-document-super-delete.tsx:27 +msgid "\"{documentName}\" has been deleted by an admin." +msgstr "\"{documentName}\" has been deleted by an admin." + +#: packages/email/template-components/template-document-pending.tsx:37 +msgid "“{documentName}” has been signed" +msgstr "“{documentName}” has been signed" + +#: packages/email/template-components/template-document-completed.tsx:41 +#: packages/lib/server-only/document/resend-document.tsx:109 +msgid "{0}" +msgstr "{0}" + +#: packages/email/template-components/template-document-invite.tsx:74 +msgid "{0} Document" +msgstr "{0} Document" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:117 +msgid "{0} invited you to {recipientActionVerb} a document" +msgstr "{0} invited you to {recipientActionVerb} a document" + +#: packages/email/templates/team-join.tsx:55 +msgid "{0} joined the team {teamName} on Documenso" +msgstr "{0} joined the team {teamName} on Documenso" + +#: packages/email/templates/team-leave.tsx:55 +msgid "{0} left the team {teamName} on Documenso" +msgstr "{0} left the team {teamName} on Documenso" + #: packages/ui/primitives/data-table-pagination.tsx:30 msgid "{0} of {1} row(s) selected." msgstr "{0} of {1} row(s) selected." +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:119 +#: packages/lib/server-only/document/resend-document.tsx:119 +msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"." +msgstr "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"." + +#: packages/email/templates/document-invite.tsx:79 +msgid "{inviterName} <0>({inviterEmail})" +msgstr "{inviterName} <0>({inviterEmail})" + +#: packages/email/templates/document-cancel.tsx:19 +msgid "{inviterName} has cancelled the document {documentName}, you don't need to sign it anymore." +msgstr "{inviterName} has cancelled the document {documentName}, you don't need to sign it anymore." + +#: packages/email/template-components/template-document-cancel.tsx:24 +msgid "{inviterName} has cancelled the document<0/>\"{documentName}\"" +msgstr "{inviterName} has cancelled the document<0/>\"{documentName}\"" + +#: packages/email/template-components/template-document-invite.tsx:57 +msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "{inviterName} has invited you to {0}<0/>\"{documentName}\"" + +#: packages/email/templates/document-invite.tsx:41 +msgid "{inviterName} has invited you to {action} {documentName}" +msgstr "{inviterName} has invited you to {action} {documentName}" + +#: packages/email/templates/recipient-removed-from-document.tsx:18 +msgid "{inviterName} has removed you from the document {documentName}." +msgstr "{inviterName} has removed you from the document {documentName}." + +#: packages/email/template-components/template-document-invite.tsx:49 +msgid "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\"" + +#: packages/email/templates/document-invite.tsx:40 +msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}" +msgstr "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}" + +#: packages/email/templates/team-join.tsx:61 +msgid "{memberEmail} joined the following team" +msgstr "{memberEmail} joined the following team" + +#: packages/email/templates/team-leave.tsx:61 +msgid "{memberEmail} left the following team" +msgstr "{memberEmail} left the following team" + +#: packages/email/templates/document-created-from-direct-template.tsx:55 +msgid "{recipientName} {action} a document by using one of your direct links" +msgstr "{recipientName} {action} a document by using one of your direct links" + +#: packages/email/templates/team-transfer-request.tsx:55 +msgid "{teamName} ownership transfer request" +msgstr "{teamName} ownership transfer request" + #: packages/ui/primitives/data-table-pagination.tsx:41 msgid "{visibleRows, plural, one {Showing # result.} other {Showing # results.}}" msgstr "{visibleRows, plural, one {Showing # result.} other {Showing # results.}}" +#: packages/email/templates/document-invite.tsx:91 +msgid "`${inviterName} has invited you to ${action} the document \"${documentName}\".`" +msgstr "`${inviterName} has invited you to ${action} the document \"${documentName}\".`" + +#: packages/email/templates/team-transfer-request.tsx:59 +msgid "<0>{senderName} has requested that you take ownership of the following team" +msgstr "<0>{senderName} has requested that you take ownership of the following team" + #: packages/ui/components/recipient/recipient-action-auth-select.tsx:53 msgid "<0>Inherit authentication method - Use the global action signing authentication method configured in the \"General Settings\" step" msgstr "<0>Inherit authentication method - Use the global action signing authentication method configured in the \"General Settings\" step" @@ -51,20 +141,66 @@ msgstr "<0>Require account - The recipient must be signed in to view the doc msgid "<0>Require passkey - The recipient must have an account and passkey configured via their settings" msgstr "<0>Require passkey - The recipient must have an account and passkey configured via their settings" +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:109 +msgid "A document was created by your direct template that requires you to {recipientActionVerb} it." +msgstr "A document was created by your direct template that requires you to {recipientActionVerb} it." + +#: packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts:90 +msgid "A new member has joined your team" +msgstr "A new member has joined your team" + +#: packages/lib/server-only/team/create-team-email-verification.ts:142 +msgid "A request to use your email has been initiated by {teamName} on Documenso" +msgstr "A request to use your email has been initiated by {teamName} on Documenso" + +#: packages/email/templates/team-join.tsx:29 +msgid "A team member has joined a team on Documenso" +msgstr "A team member has joined a team on Documenso" + +#: packages/lib/jobs/definitions/emails/send-team-member-left-email.ts:79 +msgid "A team member has left {0}" +msgstr "A team member has left {0}" + +#: packages/email/templates/team-leave.tsx:29 +msgid "A team member has left a team on Documenso" +msgstr "A team member has left a team on Documenso" + +#: packages/email/templates/team-delete.tsx:27 +#: packages/email/templates/team-delete.tsx:31 +msgid "A team you were a part of has been deleted" +msgstr "A team you were a part of has been deleted" + +#: packages/email/templates/team-invite.tsx:77 +#: packages/email/templates/team-transfer-request.tsx:81 +msgid "Accept" +msgstr "Accept" + +#: packages/email/templates/team-invite.tsx:29 +msgid "Accept invitation to join a team on Documenso" +msgstr "Accept invitation to join a team on Documenso" + +#: packages/email/templates/confirm-team-email.tsx:38 +msgid "Accept team email request for {teamName} on Documenso" +msgstr "Accept team email request for {teamName} on Documenso" + +#: packages/email/templates/team-transfer-request.tsx:29 +msgid "Accept team transfer request on Documenso" +msgstr "Accept team transfer request on Documenso" + #: packages/ui/primitives/document-dropzone.tsx:69 msgid "Add a document" msgstr "Add a document" -#: packages/ui/primitives/document-flow/add-settings.tsx:336 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:339 +#: packages/ui/primitives/document-flow/add-settings.tsx:378 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:378 msgid "Add a URL to redirect the user to once the document is signed" msgstr "Add a URL to redirect the user to once the document is signed" -#: packages/ui/primitives/document-flow/add-settings.tsx:248 +#: packages/ui/primitives/document-flow/add-settings.tsx:290 msgid "Add an external ID to the document. This can be used to identify the document in external systems." msgstr "Add an external ID to the document. This can be used to identify the document in external systems." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:256 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:295 msgid "Add an external ID to the template. This can be used to identify in external systems." msgstr "Add an external ID to the template. This can be used to identify in external systems." @@ -105,8 +241,8 @@ msgstr "Add text to the field" msgid "Admin" msgstr "Admin" -#: packages/ui/primitives/document-flow/add-settings.tsx:230 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:238 +#: packages/ui/primitives/document-flow/add-settings.tsx:272 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:277 msgid "Advanced Options" msgstr "Advanced Options" @@ -119,6 +255,14 @@ msgstr "Advanced settings" msgid "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email." msgstr "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email." +#: packages/email/template-components/template-document-cancel.tsx:31 +msgid "All signatures have been voided." +msgstr "All signatures have been voided." + +#: packages/email/templates/document-super-delete.tsx:20 +msgid "An admin has deleted your document \"{documentName}\"." +msgstr "An admin has deleted your document \"{documentName}\"." + #: packages/ui/primitives/pdf-viewer.tsx:167 msgid "An error occurred while loading the document." msgstr "An error occurred while loading the document." @@ -127,6 +271,10 @@ msgstr "An error occurred while loading the document." msgid "Approve" msgstr "Approve" +#: packages/lib/constants/recipient-roles.ts:68 +#~ msgid "APPROVE_REQUEST" +#~ msgstr "APPROVE_REQUEST" + #: packages/lib/constants/recipient-roles.ts:9 msgid "Approved" msgstr "Approved" @@ -143,6 +291,10 @@ msgstr "Approvers" msgid "Approving" msgstr "Approving" +#: packages/email/template-components/template-confirmation-email.tsx:28 +msgid "Before you get started, please confirm your email address by clicking the button below:" +msgstr "Before you get started, please confirm your email address by clicking the button below:" + #: packages/ui/primitives/signature-pad/signature-pad.tsx:377 msgid "Black" msgstr "Black" @@ -151,6 +303,14 @@ msgstr "Black" msgid "Blue" msgstr "Blue" +#: packages/email/templates/team-invite.tsx:67 +msgid "by <0>{senderName}" +msgstr "by <0>{senderName}" + +#: packages/email/templates/team-transfer-request.tsx:70 +msgid "By accepting this request, you will take responsibility for any billing items associated with this team." +msgstr "By accepting this request, you will take responsibility for any billing items associated with this team." + #: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356 #: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58 msgid "Cancel" @@ -201,6 +361,16 @@ msgstr "Click to insert field" msgid "Close" msgstr "Close" +#: packages/email/template-components/template-document-completed.tsx:35 +#: packages/email/template-components/template-document-self-signed.tsx:36 +msgid "Completed" +msgstr "Completed" + +#: packages/email/templates/document-completed.tsx:21 +#: packages/email/templates/document-self-signed.tsx:17 +msgid "Completed Document" +msgstr "Completed Document" + #: packages/lib/constants/template.ts:12 msgid "Configure Direct Recipient" msgstr "Configure Direct Recipient" @@ -210,10 +380,22 @@ msgstr "Configure Direct Recipient" msgid "Configure the {0} field" msgstr "Configure the {0} field" +#: packages/email/template-components/template-confirmation-email.tsx:38 +msgid "Confirm email" +msgstr "Confirm email" + #: packages/ui/primitives/document-flow/document-flow-root.tsx:141 msgid "Continue" msgstr "Continue" +#: packages/email/template-components/template-document-invite.tsx:66 +msgid "Continue by {0} the document." +msgstr "Continue by {0} the document." + +#: packages/email/template-components/template-document-completed.tsx:45 +msgid "Continue by downloading the document." +msgstr "Continue by downloading the document." + #: packages/ui/components/document/document-share-button.tsx:46 msgid "Copied to clipboard" msgstr "Copied to clipboard" @@ -222,6 +404,14 @@ msgstr "Copied to clipboard" msgid "Copy Link" msgstr "Copy Link" +#: packages/email/template-components/template-document-self-signed.tsx:46 +msgid "Create a <0>free account to access your signed documents at any time." +msgstr "Create a <0>free account to access your signed documents at any time." + +#: packages/email/template-components/template-document-self-signed.tsx:68 +msgid "Create account" +msgstr "Create account" + #: packages/ui/primitives/document-flow/add-signature.tsx:360 msgid "Custom Text" msgstr "Custom Text" @@ -232,25 +422,47 @@ msgstr "Custom Text" msgid "Date" msgstr "Date" -#: packages/ui/primitives/document-flow/add-settings.tsx:271 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:279 +#: packages/ui/primitives/document-flow/add-settings.tsx:313 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:318 msgid "Date Format" msgstr "Date Format" +#: packages/email/templates/team-invite.tsx:83 +msgid "Decline" +msgstr "Decline" + +#: packages/email/templates/reset-password.tsx:65 +msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us." +msgstr "Didn't request a password change? We are here to help you secure your account, just <0>contact us." + #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570 msgid "Direct link receiver" msgstr "Direct link receiver" #: packages/ui/components/document/document-global-auth-access-select.tsx:62 -#: packages/ui/primitives/document-flow/add-settings.tsx:174 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:151 +#: packages/ui/primitives/document-flow/add-settings.tsx:216 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:190 msgid "Document access" msgstr "Document access" +#: packages/lib/server-only/document/super-delete-document.ts:75 +msgid "Document Cancelled" +msgstr "Document Cancelled" + +#: packages/email/templates/document-created-from-direct-template.tsx:30 +#: packages/lib/server-only/template/create-document-from-direct-template.ts:554 +msgid "Document created from direct template" +msgstr "Document created from direct template" + #: packages/lib/constants/template.ts:20 msgid "Document Creation" msgstr "Document Creation" +#: packages/lib/server-only/document/send-delete-email.ts:58 +msgid "Document Deleted!" +msgstr "Document Deleted!" + +#: packages/email/template-components/template-document-completed.tsx:64 #: packages/ui/components/document/document-download-button.tsx:68 msgid "Download" msgstr "Download" @@ -283,7 +495,7 @@ msgstr "Email" msgid "Email is required" msgstr "Email is required" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:184 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:223 msgid "Email Options" msgstr "Email Options" @@ -313,8 +525,8 @@ msgstr "Enter password" msgid "Error" msgstr "Error" -#: packages/ui/primitives/document-flow/add-settings.tsx:241 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:249 +#: packages/ui/primitives/document-flow/add-settings.tsx:283 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:288 msgid "External ID" msgstr "External ID" @@ -356,6 +568,14 @@ msgstr "Field placeholder" msgid "Font Size" msgstr "Font Size" +#: packages/lib/server-only/auth/send-forgot-password.ts:61 +msgid "Forgot Password?" +msgstr "Forgot Password?" + +#: packages/email/template-components/template-forgot-password.tsx:21 +msgid "Forgot your password?" +msgstr "Forgot your password?" + #: packages/ui/primitives/document-flow/types.ts:50 msgid "Free Signature" msgstr "Free Signature" @@ -372,6 +592,10 @@ msgstr "Go Back" msgid "Green" msgstr "Green" +#: packages/email/templates/reset-password.tsx:50 +msgid "Hi, {userName} <0>({userEmail})" +msgstr "Hi, {userName} <0>({userEmail})" + #: packages/lib/constants/recipient-roles.ts:76 msgid "I am a signer of this document" msgstr "I am a signer of this document" @@ -405,12 +629,25 @@ msgstr "Invalid email" msgid "Invalid email address" msgstr "Invalid email address" +#: packages/email/templates/team-invite.tsx:55 +msgid "Join {teamName} on Documenso" +msgstr "Join {teamName} on Documenso" + #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72 #: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48 msgid "Label" msgstr "Label" +#: packages/ui/primitives/document-flow/add-settings.tsx:176 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:150 +msgid "Language" +msgstr "Language" + +#: packages/email/templates/team-transfer-request.tsx:87 +msgid "Link expires in 1 hour." +msgstr "Link expires in 1 hour." + #: packages/ui/primitives/lazy-pdf-viewer.tsx:15 #: packages/ui/primitives/pdf-viewer.tsx:44 msgid "Loading document..." @@ -429,7 +666,7 @@ msgid "Member" msgstr "Member" #: packages/ui/primitives/document-flow/add-subject.tsx:95 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:215 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:254 msgid "Message <0>(Optional)" msgstr "Message <0>(Optional)" @@ -520,6 +757,22 @@ msgstr "Page {0} of {numPages}" msgid "Password Required" msgstr "Password Required" +#: packages/email/templates/forgot-password.tsx:17 +msgid "Password Reset Requested" +msgstr "Password Reset Requested" + +#: packages/email/templates/reset-password.tsx:18 +msgid "Password Reset Successful" +msgstr "Password Reset Successful" + +#: packages/email/template-components/template-reset-password.tsx:22 +msgid "Password updated!" +msgstr "Password updated!" + +#: packages/email/templates/document-pending.tsx:17 +msgid "Pending Document" +msgstr "Pending Document" + #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156 msgid "Pick a number" msgstr "Pick a number" @@ -530,6 +783,34 @@ msgstr "Pick a number" msgid "Placeholder" msgstr "Placeholder" +#: packages/email/template-components/template-document-invite.tsx:43 +msgid "Please {0} your document<0/>\"{documentName}\"" +msgstr "Please {0} your document<0/>\"{documentName}\"" + +#: packages/email/templates/document-invite.tsx:38 +msgid "Please {action} your document {documentName}" +msgstr "Please {action} your document {documentName}" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:98 +msgid "Please {recipientActionVerb} this document" +msgstr "Please {recipientActionVerb} this document" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:112 +msgid "Please {recipientActionVerb} this document created by your direct template" +msgstr "Please {recipientActionVerb} this document created by your direct template" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:104 +msgid "Please {recipientActionVerb} your document" +msgstr "Please {recipientActionVerb} your document" + +#: packages/lib/server-only/auth/send-confirmation-email.ts:67 +msgid "Please confirm your email" +msgstr "Please confirm your email" + +#: packages/email/templates/confirm-email.tsx:15 +msgid "Please confirm your email address" +msgstr "Please confirm your email address" + #: packages/ui/primitives/pdf-viewer.tsx:223 #: packages/ui/primitives/pdf-viewer.tsx:238 msgid "Please try again or contact our support." @@ -556,8 +837,8 @@ msgid "Receives copy" msgstr "Receives copy" #: packages/ui/components/recipient/recipient-action-auth-select.tsx:39 -#: packages/ui/primitives/document-flow/add-settings.tsx:215 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:169 +#: packages/ui/primitives/document-flow/add-settings.tsx:257 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:208 msgid "Recipient action authentication" msgstr "Recipient action authentication" @@ -565,11 +846,27 @@ msgstr "Recipient action authentication" msgid "Red" msgstr "Red" -#: packages/ui/primitives/document-flow/add-settings.tsx:329 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:332 +#: packages/ui/primitives/document-flow/add-settings.tsx:371 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:371 msgid "Redirect URL" msgstr "Redirect URL" +#: packages/lib/server-only/document/resend-document.tsx:165 +msgid "Reminder: {0}" +msgstr "Reminder: {0}" + +#: packages/lib/server-only/document/resend-document.tsx:118 +msgid "Reminder: {0} invited you to {recipientActionVerb} a document" +msgstr "Reminder: {0} invited you to {recipientActionVerb} a document" + +#: packages/lib/server-only/document/resend-document.tsx:110 +msgid "Reminder: Please {recipientActionVerb} this document" +msgstr "Reminder: Please {recipientActionVerb} this document" + +#: packages/lib/server-only/document/resend-document.tsx:114 +msgid "Reminder: Please {recipientActionVerb} your document" +msgstr "Reminder: Please {recipientActionVerb} your document" + #: packages/ui/primitives/document-flow/add-fields.tsx:1110 msgid "Remove" msgstr "Remove" @@ -582,6 +879,10 @@ msgstr "Remove" msgid "Required field" msgstr "Required field" +#: packages/email/template-components/template-forgot-password.tsx:33 +msgid "Reset Password" +msgstr "Reset Password" + #: packages/ui/components/document/document-share-button.tsx:147 msgid "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!" msgstr "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!" @@ -649,6 +950,10 @@ msgstr "Show advanced settings" msgid "Sign" msgstr "Sign" +#: packages/email/template-components/template-reset-password.tsx:34 +msgid "Sign In" +msgstr "Sign In" + #: packages/ui/primitives/document-flow/add-fields.tsx:823 #: packages/ui/primitives/document-flow/add-signature.tsx:323 #: packages/ui/primitives/document-flow/field-icon.tsx:52 @@ -677,6 +982,15 @@ msgstr "Signers must have unique emails" msgid "Signing" msgstr "Signing" +#: packages/lib/server-only/document/send-completed-email.ts:93 +#: packages/lib/server-only/document/send-completed-email.ts:161 +msgid "Signing Complete!" +msgstr "Signing Complete!" + +#: packages/lib/constants/recipient-roles.ts:66 +#~ msgid "SIGNING_REQUEST" +#~ msgstr "SIGNING_REQUEST" + #: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:34 msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding." msgstr "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding." @@ -699,7 +1013,7 @@ msgid "Step <0>{step} of {maxStep}" msgstr "Step <0>{step} of {maxStep}" #: packages/ui/primitives/document-flow/add-subject.tsx:78 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:195 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:234 msgid "Subject <0>(Optional)" msgstr "Subject <0>(Optional)" @@ -707,7 +1021,19 @@ msgstr "Subject <0>(Optional)" msgid "Submit" msgstr "Submit" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:134 +#: packages/lib/server-only/team/delete-team-email.ts:96 +msgid "Team email has been revoked for {0}" +msgstr "Team email has been revoked for {0}" + +#: packages/email/templates/team-email-removed.tsx:53 +msgid "Team email removed" +msgstr "Team email removed" + +#: packages/email/templates/team-email-removed.tsx:27 +msgid "Team email removed for {teamName} on Documenso" +msgstr "Team email removed for {teamName} on Documenso" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:133 msgid "Template title" msgstr "Template title" @@ -717,6 +1043,10 @@ msgstr "Template title" msgid "Text" msgstr "Text" +#: packages/email/template-components/template-forgot-password.tsx:25 +msgid "That's okay, it happens! Click the button below to reset your password." +msgstr "That's okay, it happens! Click the button below to reset your password." + #: packages/ui/components/recipient/recipient-action-auth-select.tsx:44 msgid "The authentication required for recipients to sign fields" msgstr "The authentication required for recipients to sign fields" @@ -733,10 +1063,22 @@ msgstr "The authentication required for recipients to view the document." msgid "The document's name" msgstr "The document's name" +#: packages/email/templates/team-delete.tsx:35 +msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents" +msgstr "The following team has been deleted by its owner. You will no longer be able to access this team and its documents" + +#: packages/email/templates/team-delete.tsx:34 +msgid "The following team has been deleted by you" +msgstr "The following team has been deleted by you" + #: packages/ui/primitives/document-password-dialog.tsx:52 msgid "The password you have entered is incorrect. Please try again." msgstr "The password you have entered is incorrect. Please try again." +#: packages/email/template-components/template-document-super-delete.tsx:38 +msgid "The reason provided for deletion is the following:" +msgstr "The reason provided for deletion is the following:" + #: packages/ui/components/recipient/recipient-role-select.tsx:103 msgid "The recipient is not required to take any action and receives a copy of the document after it is completed." msgstr "The recipient is not required to take any action and receives a copy of the document after it is completed." @@ -769,10 +1111,18 @@ msgstr "The signer's email" msgid "The signer's name" msgstr "The signer's name" +#: packages/email/templates/team-email-removed.tsx:57 +msgid "The team email <0>{teamEmail} has been removed from the following team" +msgstr "The team email <0>{teamEmail} has been removed from the following team" + #: packages/ui/components/document/document-global-auth-action-select.tsx:72 msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step." msgstr "This can be overriden by setting the authentication requirements directly on each recipient in the next step." +#: packages/email/template-components/template-document-super-delete.tsx:31 +msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." +msgstr "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." + #: packages/ui/primitives/document-flow/add-fields.tsx:757 msgid "This document has already been sent to this recipient. You can no longer edit this recipient." msgstr "This document has already been sent to this recipient. You can no longer edit this recipient." @@ -781,6 +1131,10 @@ msgstr "This document has already been sent to this recipient. You can no longer msgid "This document is password protected. Please enter the password to view the document." msgstr "This document is password protected. Please enter the password to view the document." +#: packages/email/template-components/template-footer.tsx:14 +msgid "This document was sent using <0>Documenso." +msgstr "This document was sent using <0>Documenso." + #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:573 msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them." msgstr "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them." @@ -797,12 +1151,12 @@ msgstr "This signer has already signed the document." msgid "This will override any global settings." msgstr "This will override any global settings." -#: packages/ui/primitives/document-flow/add-settings.tsx:305 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:309 +#: packages/ui/primitives/document-flow/add-settings.tsx:347 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:348 msgid "Time Zone" msgstr "Time Zone" -#: packages/ui/primitives/document-flow/add-settings.tsx:153 +#: packages/ui/primitives/document-flow/add-settings.tsx:155 msgid "Title" msgstr "Title" @@ -841,6 +1195,18 @@ msgstr "Value" msgid "View" msgstr "View" +#: packages/email/templates/document-created-from-direct-template.tsx:69 +msgid "View document" +msgstr "View document" + +#: packages/email/template-components/template-document-self-signed.tsx:79 +msgid "View plans" +msgstr "View plans" + +#: packages/lib/constants/recipient-roles.ts:67 +#~ msgid "VIEW_REQUEST" +#~ msgstr "VIEW_REQUEST" + #: packages/lib/constants/recipient-roles.ts:27 msgid "Viewed" msgstr "Viewed" @@ -857,10 +1223,34 @@ msgstr "Viewers" msgid "Viewing" msgstr "Viewing" +#: packages/email/template-components/template-document-pending.tsx:31 +msgid "Waiting for others" +msgstr "Waiting for others" + +#: packages/lib/server-only/document/send-pending-email.ts:73 +msgid "Waiting for others to complete signing." +msgstr "Waiting for others to complete signing." + +#: packages/email/template-components/template-document-pending.tsx:41 +msgid "We're still waiting for other signers to sign this document.<0/>We'll notify you as soon as it's ready." +msgstr "We're still waiting for other signers to sign this document.<0/>We'll notify you as soon as it's ready." + +#: packages/email/templates/reset-password.tsx:59 +msgid "We've changed your password as you asked. You can now sign in with your new password." +msgstr "We've changed your password as you asked. You can now sign in with your new password." + +#: packages/email/template-components/template-confirmation-email.tsx:24 +msgid "Welcome to Documenso!" +msgstr "Welcome to Documenso!" + #: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:44 msgid "You are about to send this document to the recipients. Are you sure you want to continue?" msgstr "You are about to send this document to the recipients. Are you sure you want to continue?" +#: packages/email/template-components/template-confirmation-email.tsx:41 +msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)" +msgstr "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)" + #: packages/ui/components/document/document-send-email-message-helper.tsx:11 msgid "You can use the following variables in your message:" msgstr "You can use the following variables in your message:" @@ -869,6 +1259,48 @@ msgstr "You can use the following variables in your message:" msgid "You cannot upload documents at this time." msgstr "You cannot upload documents at this time." +#: packages/email/template-components/template-document-cancel.tsx:35 +msgid "You don't need to sign it anymore." +msgstr "You don't need to sign it anymore." + +#: packages/lib/server-only/team/create-team-member-invites.ts:168 +msgid "You have been invited to join {0} on Documenso" +msgstr "You have been invited to join {0} on Documenso" + +#: packages/email/templates/team-invite.tsx:59 +msgid "You have been invited to join the following team" +msgstr "You have been invited to join the following team" + +#: packages/lib/server-only/recipient/set-recipients-for-document.ts:314 +msgid "You have been removed from a document" +msgstr "You have been removed from a document" + +#: packages/lib/server-only/team/request-team-ownership-transfer.ts:114 +msgid "You have been requested to take ownership of team {0} on Documenso" +msgstr "You have been requested to take ownership of team {0} on Documenso" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:102 +#: packages/lib/server-only/document/resend-document.tsx:113 +msgid "You have initiated the document {0} that requires you to {recipientActionVerb} it." +msgstr "You have initiated the document {0} that requires you to {recipientActionVerb} it." + #: packages/ui/primitives/document-dropzone.tsx:69 msgid "You have reached your document limit." msgstr "You have reached your document limit." + +#: packages/email/template-components/template-document-self-signed.tsx:42 +msgid "You have signed “{documentName}”" +msgstr "You have signed “{documentName}”" + +#: packages/email/template-components/template-document-super-delete.tsx:23 +msgid "Your document has been deleted by an admin!" +msgstr "Your document has been deleted by an admin!" + +#: packages/email/template-components/template-reset-password.tsx:26 +msgid "Your password has been updated." +msgstr "Your password has been updated." + +#: packages/email/templates/team-delete.tsx:26 +#: packages/email/templates/team-delete.tsx:30 +msgid "Your team has been deleted" +msgstr "Your team has been deleted" diff --git a/packages/lib/translations/en/marketing.po b/packages/lib/translations/en/marketing.po index 427ba58e5..d85ccda92 100644 --- a/packages/lib/translations/en/marketing.po +++ b/packages/lib/translations/en/marketing.po @@ -37,7 +37,7 @@ msgstr "Add document" msgid "Add More Users for {0}" msgstr "Add More Users for {0}" -#: apps/marketing/src/app/(marketing)/open/page.tsx:165 +#: apps/marketing/src/app/(marketing)/open/page.tsx:164 msgid "All our metrics, finances, and learnings are public. We believe in transparency and want to share our journey with you. You can read more about why here: <0>Announcing Open Metrics" msgstr "All our metrics, finances, and learnings are public. We believe in transparency and want to share our journey with you. You can read more about why here: <0>Announcing Open Metrics" @@ -85,7 +85,7 @@ msgstr "Changelog" msgid "Choose a template from the community app store. Or submit your own template for others to use." msgstr "Choose a template from the community app store. Or submit your own template for others to use." -#: apps/marketing/src/app/(marketing)/open/page.tsx:219 +#: apps/marketing/src/app/(marketing)/open/page.tsx:218 msgid "Community" msgstr "Community" @@ -188,7 +188,7 @@ msgstr "Fast." msgid "Faster, smarter and more beautiful." msgstr "Faster, smarter and more beautiful." -#: apps/marketing/src/app/(marketing)/open/page.tsx:210 +#: apps/marketing/src/app/(marketing)/open/page.tsx:209 msgid "Finances" msgstr "Finances" @@ -241,15 +241,15 @@ msgstr "Get started today." msgid "Get the latest news from Documenso, including product updates, team announcements and more!" msgstr "Get the latest news from Documenso, including product updates, team announcements and more!" -#: apps/marketing/src/app/(marketing)/open/page.tsx:233 +#: apps/marketing/src/app/(marketing)/open/page.tsx:232 msgid "GitHub: Total Merged PRs" msgstr "GitHub: Total Merged PRs" -#: apps/marketing/src/app/(marketing)/open/page.tsx:251 +#: apps/marketing/src/app/(marketing)/open/page.tsx:250 msgid "GitHub: Total Open Issues" msgstr "GitHub: Total Open Issues" -#: apps/marketing/src/app/(marketing)/open/page.tsx:225 +#: apps/marketing/src/app/(marketing)/open/page.tsx:224 msgid "GitHub: Total Stars" msgstr "GitHub: Total Stars" @@ -257,7 +257,7 @@ msgstr "GitHub: Total Stars" msgid "Global Salary Bands" msgstr "Global Salary Bands" -#: apps/marketing/src/app/(marketing)/open/page.tsx:261 +#: apps/marketing/src/app/(marketing)/open/page.tsx:260 msgid "Growth" msgstr "Growth" @@ -281,7 +281,7 @@ msgstr "Integrated payments with Stripe so you don’t have to worry about getti msgid "Integrates with all your favourite tools." msgstr "Integrates with all your favourite tools." -#: apps/marketing/src/app/(marketing)/open/page.tsx:289 +#: apps/marketing/src/app/(marketing)/open/page.tsx:288 msgid "Is there more?" msgstr "Is there more?" @@ -305,11 +305,11 @@ msgstr "Location" msgid "Make it your own through advanced customization and adjustability." msgstr "Make it your own through advanced customization and adjustability." -#: apps/marketing/src/app/(marketing)/open/page.tsx:199 +#: apps/marketing/src/app/(marketing)/open/page.tsx:198 msgid "Merged PR's" msgstr "Merged PR's" -#: apps/marketing/src/app/(marketing)/open/page.tsx:234 +#: apps/marketing/src/app/(marketing)/open/page.tsx:233 msgid "Merged PRs" msgstr "Merged PRs" @@ -340,8 +340,8 @@ msgstr "No Credit Card required" msgid "None of these work for you? Try self-hosting!" msgstr "None of these work for you? Try self-hosting!" -#: apps/marketing/src/app/(marketing)/open/page.tsx:194 -#: apps/marketing/src/app/(marketing)/open/page.tsx:252 +#: apps/marketing/src/app/(marketing)/open/page.tsx:193 +#: apps/marketing/src/app/(marketing)/open/page.tsx:251 msgid "Open Issues" msgstr "Open Issues" @@ -349,7 +349,7 @@ msgstr "Open Issues" msgid "Open Source or Hosted." msgstr "Open Source or Hosted." -#: apps/marketing/src/app/(marketing)/open/page.tsx:161 +#: apps/marketing/src/app/(marketing)/open/page.tsx:160 #: apps/marketing/src/components/(marketing)/footer.tsx:37 #: apps/marketing/src/components/(marketing)/header.tsx:64 #: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:40 @@ -461,7 +461,7 @@ msgstr "Smart." msgid "Star on GitHub" msgstr "Star on GitHub" -#: apps/marketing/src/app/(marketing)/open/page.tsx:226 +#: apps/marketing/src/app/(marketing)/open/page.tsx:225 msgid "Stars" msgstr "Stars" @@ -496,7 +496,7 @@ msgstr "Template Store (Soon)." msgid "That's awesome. You can take a look at the current <0>Issues and join our <1>Discord Community to keep up to date, on what the current priorities are. In any case, we are an open community and welcome all input, technical and non-technical ❤️" msgstr "That's awesome. You can take a look at the current <0>Issues and join our <1>Discord Community to keep up to date, on what the current priorities are. In any case, we are an open community and welcome all input, technical and non-technical ❤️" -#: apps/marketing/src/app/(marketing)/open/page.tsx:293 +#: apps/marketing/src/app/(marketing)/open/page.tsx:292 msgid "This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share." msgstr "This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share." @@ -509,8 +509,8 @@ msgstr "Title" msgid "Total Completed Documents" msgstr "Total Completed Documents" +#: apps/marketing/src/app/(marketing)/open/page.tsx:266 #: apps/marketing/src/app/(marketing)/open/page.tsx:267 -#: apps/marketing/src/app/(marketing)/open/page.tsx:268 msgid "Total Customers" msgstr "Total Customers" diff --git a/packages/lib/translations/en/web.po b/packages/lib/translations/en/web.po index bcd28a642..b91dad148 100644 --- a/packages/lib/translations/en/web.po +++ b/packages/lib/translations/en/web.po @@ -255,12 +255,12 @@ msgstr "Active Subscriptions" msgid "Add" msgstr "Add" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:176 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:88 msgid "Add all relevant fields for each recipient." msgstr "Add all relevant fields for each recipient." -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:83 msgid "Add all relevant placeholders for each recipient." msgstr "Add all relevant placeholders for each recipient." @@ -276,8 +276,8 @@ msgstr "Add an authenticator to serve as a secondary authentication method when msgid "Add email" msgstr "Add email" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:174 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87 msgid "Add Fields" msgstr "Add Fields" @@ -290,15 +290,15 @@ msgstr "Add more" msgid "Add passkey" msgstr "Add passkey" -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:81 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82 msgid "Add Placeholders" msgstr "Add Placeholders" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170 msgid "Add Signers" msgstr "Add Signers" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180 msgid "Add Subject" msgstr "Add Subject" @@ -306,7 +306,7 @@ msgstr "Add Subject" msgid "Add team email" msgstr "Add team email" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:171 msgid "Add the people who will sign the document." msgstr "Add the people who will sign the document." @@ -314,7 +314,7 @@ msgstr "Add the people who will sign the document." msgid "Add the recipients to create the document with" msgstr "Add the recipients to create the document with" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181 msgid "Add the subject and message you wish to send to signers." msgstr "Add the subject and message you wish to send to signers." @@ -409,13 +409,13 @@ msgstr "An email requesting the transfer of this team has been sent." msgid "An error occurred" msgstr "An error occurred" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:266 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:268 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:201 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:235 msgid "An error occurred while adding signers." msgstr "An error occurred while adding signers." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 msgid "An error occurred while adding the fields." msgstr "An error occurred while adding the fields." @@ -477,7 +477,7 @@ msgstr "An error occurred while removing the signature." msgid "An error occurred while removing the text." msgstr "An error occurred while removing the text." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:332 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:334 msgid "An error occurred while sending the document." msgstr "An error occurred while sending the document." @@ -502,8 +502,8 @@ msgstr "An error occurred while signing the document." msgid "An error occurred while trying to create a checkout session." msgstr "An error occurred while trying to create a checkout session." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:232 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:234 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:170 msgid "An error occurred while updating the document settings." msgstr "An error occurred while updating the document settings." @@ -864,11 +864,11 @@ msgstr "Completed documents" msgid "Completed Documents" msgstr "Completed Documents" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:166 msgid "Configure general settings for the document." msgstr "Configure general settings for the document." -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:78 msgid "Configure general settings for the template." msgstr "Configure general settings for the template." @@ -1345,7 +1345,7 @@ msgstr "Document re-sent" msgid "Document resealed" msgstr "Document resealed" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:323 msgid "Document sent" msgstr "Document sent" @@ -1574,16 +1574,16 @@ msgstr "Enter your text here" #: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:231 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:233 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:267 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:302 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:333 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57 #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:165 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:196 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:230 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:169 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:200 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:234 #: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56 #: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:160 @@ -1674,8 +1674,8 @@ msgstr "Forgot your password?" msgid "Full Name" msgstr "Full Name" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:164 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:51 @@ -3239,7 +3239,7 @@ msgstr "Template has been updated." msgid "Template moved" msgstr "Template moved" -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:219 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:223 msgid "Template saved" msgstr "Template saved" @@ -4516,7 +4516,7 @@ msgstr "Your document has been created from the template successfully." msgid "Your document has been re-sent successfully." msgstr "Your document has been re-sent successfully." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:322 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:324 msgid "Your document has been sent successfully." msgstr "Your document has been sent successfully." @@ -4607,7 +4607,7 @@ msgstr "Your template has been successfully deleted." msgid "Your template will be duplicated." msgstr "Your template will be duplicated." -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:220 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:224 msgid "Your templates has been saved successfully." msgstr "Your templates has been saved successfully." diff --git a/packages/lib/translations/es/common.po b/packages/lib/translations/es/common.po index 4a8a9071f..2ca30cc27 100644 --- a/packages/lib/translations/es/common.po +++ b/packages/lib/translations/es/common.po @@ -18,14 +18,104 @@ msgstr "" "X-Crowdin-File: common.po\n" "X-Crowdin-File-ID: 4\n" +#: packages/email/template-components/template-document-super-delete.tsx:27 +msgid "\"{documentName}\" has been deleted by an admin." +msgstr "" + +#: packages/email/template-components/template-document-pending.tsx:37 +msgid "“{documentName}” has been signed" +msgstr "" + +#: packages/email/template-components/template-document-completed.tsx:41 +#: packages/lib/server-only/document/resend-document.tsx:109 +msgid "{0}" +msgstr "" + +#: packages/email/template-components/template-document-invite.tsx:74 +msgid "{0} Document" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:117 +msgid "{0} invited you to {recipientActionVerb} a document" +msgstr "" + +#: packages/email/templates/team-join.tsx:55 +msgid "{0} joined the team {teamName} on Documenso" +msgstr "" + +#: packages/email/templates/team-leave.tsx:55 +msgid "{0} left the team {teamName} on Documenso" +msgstr "" + #: packages/ui/primitives/data-table-pagination.tsx:30 msgid "{0} of {1} row(s) selected." msgstr "{0} de {1} fila(s) seleccionada." +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:119 +#: packages/lib/server-only/document/resend-document.tsx:119 +msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"." +msgstr "" + +#: packages/email/templates/document-invite.tsx:79 +msgid "{inviterName} <0>({inviterEmail})" +msgstr "" + +#: packages/email/templates/document-cancel.tsx:19 +msgid "{inviterName} has cancelled the document {documentName}, you don't need to sign it anymore." +msgstr "" + +#: packages/email/template-components/template-document-cancel.tsx:24 +msgid "{inviterName} has cancelled the document<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/template-components/template-document-invite.tsx:57 +msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/templates/document-invite.tsx:41 +msgid "{inviterName} has invited you to {action} {documentName}" +msgstr "" + +#: packages/email/templates/recipient-removed-from-document.tsx:18 +msgid "{inviterName} has removed you from the document {documentName}." +msgstr "" + +#: packages/email/template-components/template-document-invite.tsx:49 +msgid "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/templates/document-invite.tsx:40 +msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}" +msgstr "" + +#: packages/email/templates/team-join.tsx:61 +msgid "{memberEmail} joined the following team" +msgstr "" + +#: packages/email/templates/team-leave.tsx:61 +msgid "{memberEmail} left the following team" +msgstr "" + +#: packages/email/templates/document-created-from-direct-template.tsx:55 +msgid "{recipientName} {action} a document by using one of your direct links" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:55 +msgid "{teamName} ownership transfer request" +msgstr "" + #: packages/ui/primitives/data-table-pagination.tsx:41 msgid "{visibleRows, plural, one {Showing # result.} other {Showing # results.}}" msgstr "{visibleRows, plural, one {Mostrando # resultado.} other {Mostrando # resultados.}}" +#: packages/email/templates/document-invite.tsx:91 +msgid "`${inviterName} has invited you to ${action} the document \"${documentName}\".`" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:59 +msgid "<0>{senderName} has requested that you take ownership of the following team" +msgstr "" + #: packages/ui/components/recipient/recipient-action-auth-select.tsx:53 msgid "<0>Inherit authentication method - Use the global action signing authentication method configured in the \"General Settings\" step" msgstr "<0>Heredar método de autenticación - Use el método de autenticación de firma de acción global configurado en el paso \"Configuración General\"" @@ -56,20 +146,66 @@ msgstr "<0>Requerir cuenta - El destinatario debe haber iniciado sesión par msgid "<0>Require passkey - The recipient must have an account and passkey configured via their settings" msgstr "<0>Requerir clave de acceso - El destinatario debe tener una cuenta y clave de acceso configurada a través de sus configuraciones" +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:109 +msgid "A document was created by your direct template that requires you to {recipientActionVerb} it." +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts:90 +msgid "A new member has joined your team" +msgstr "" + +#: packages/lib/server-only/team/create-team-email-verification.ts:142 +msgid "A request to use your email has been initiated by {teamName} on Documenso" +msgstr "" + +#: packages/email/templates/team-join.tsx:29 +msgid "A team member has joined a team on Documenso" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-team-member-left-email.ts:79 +msgid "A team member has left {0}" +msgstr "" + +#: packages/email/templates/team-leave.tsx:29 +msgid "A team member has left a team on Documenso" +msgstr "" + +#: packages/email/templates/team-delete.tsx:27 +#: packages/email/templates/team-delete.tsx:31 +msgid "A team you were a part of has been deleted" +msgstr "" + +#: packages/email/templates/team-invite.tsx:77 +#: packages/email/templates/team-transfer-request.tsx:81 +msgid "Accept" +msgstr "" + +#: packages/email/templates/team-invite.tsx:29 +msgid "Accept invitation to join a team on Documenso" +msgstr "" + +#: packages/email/templates/confirm-team-email.tsx:38 +msgid "Accept team email request for {teamName} on Documenso" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:29 +msgid "Accept team transfer request on Documenso" +msgstr "" + #: packages/ui/primitives/document-dropzone.tsx:69 msgid "Add a document" msgstr "Agregar un documento" -#: packages/ui/primitives/document-flow/add-settings.tsx:336 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:339 +#: packages/ui/primitives/document-flow/add-settings.tsx:378 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:378 msgid "Add a URL to redirect the user to once the document is signed" msgstr "Agregue una URL para redirigir al usuario una vez que se firme el documento" -#: packages/ui/primitives/document-flow/add-settings.tsx:248 +#: packages/ui/primitives/document-flow/add-settings.tsx:290 msgid "Add an external ID to the document. This can be used to identify the document in external systems." msgstr "Agregue un ID externo al documento. Esto se puede usar para identificar el documento en sistemas externos." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:256 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:295 msgid "Add an external ID to the template. This can be used to identify in external systems." msgstr "Agregue un ID externo a la plantilla. Esto se puede usar para identificar en sistemas externos." @@ -110,8 +246,8 @@ msgstr "Agregar texto al campo" msgid "Admin" msgstr "Admin" -#: packages/ui/primitives/document-flow/add-settings.tsx:230 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:238 +#: packages/ui/primitives/document-flow/add-settings.tsx:272 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:277 msgid "Advanced Options" msgstr "Opciones avanzadas" @@ -124,6 +260,14 @@ msgstr "Configuraciones avanzadas" msgid "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email." msgstr "Después de la presentación, se generará automáticamente un documento y se agregará a su página de documentos. También recibirá una notificación por correo electrónico." +#: packages/email/template-components/template-document-cancel.tsx:31 +msgid "All signatures have been voided." +msgstr "" + +#: packages/email/templates/document-super-delete.tsx:20 +msgid "An admin has deleted your document \"{documentName}\"." +msgstr "" + #: packages/ui/primitives/pdf-viewer.tsx:167 msgid "An error occurred while loading the document." msgstr "Se produjo un error al cargar el documento." @@ -132,6 +276,10 @@ msgstr "Se produjo un error al cargar el documento." msgid "Approve" msgstr "Aprobar" +#: packages/lib/constants/recipient-roles.ts:68 +#~ msgid "APPROVE_REQUEST" +#~ msgstr "" + #: packages/lib/constants/recipient-roles.ts:9 msgid "Approved" msgstr "Aprobado" @@ -148,6 +296,10 @@ msgstr "Aprobadores" msgid "Approving" msgstr "Aprobando" +#: packages/email/template-components/template-confirmation-email.tsx:28 +msgid "Before you get started, please confirm your email address by clicking the button below:" +msgstr "" + #: packages/ui/primitives/signature-pad/signature-pad.tsx:377 msgid "Black" msgstr "Negro" @@ -156,6 +308,14 @@ msgstr "Negro" msgid "Blue" msgstr "Azul" +#: packages/email/templates/team-invite.tsx:67 +msgid "by <0>{senderName}" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:70 +msgid "By accepting this request, you will take responsibility for any billing items associated with this team." +msgstr "" + #: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356 #: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58 msgid "Cancel" @@ -206,6 +366,16 @@ msgstr "Haga clic para insertar campo" msgid "Close" msgstr "Cerrar" +#: packages/email/template-components/template-document-completed.tsx:35 +#: packages/email/template-components/template-document-self-signed.tsx:36 +msgid "Completed" +msgstr "" + +#: packages/email/templates/document-completed.tsx:21 +#: packages/email/templates/document-self-signed.tsx:17 +msgid "Completed Document" +msgstr "" + #: packages/lib/constants/template.ts:12 msgid "Configure Direct Recipient" msgstr "Configurar destinatario directo" @@ -215,10 +385,22 @@ msgstr "Configurar destinatario directo" msgid "Configure the {0} field" msgstr "Configurar el campo {0}" +#: packages/email/template-components/template-confirmation-email.tsx:38 +msgid "Confirm email" +msgstr "" + #: packages/ui/primitives/document-flow/document-flow-root.tsx:141 msgid "Continue" msgstr "Continuar" +#: packages/email/template-components/template-document-invite.tsx:66 +msgid "Continue by {0} the document." +msgstr "" + +#: packages/email/template-components/template-document-completed.tsx:45 +msgid "Continue by downloading the document." +msgstr "" + #: packages/ui/components/document/document-share-button.tsx:46 msgid "Copied to clipboard" msgstr "Copiado al portapapeles" @@ -227,6 +409,14 @@ msgstr "Copiado al portapapeles" msgid "Copy Link" msgstr "Copiar enlace" +#: packages/email/template-components/template-document-self-signed.tsx:46 +msgid "Create a <0>free account to access your signed documents at any time." +msgstr "" + +#: packages/email/template-components/template-document-self-signed.tsx:68 +msgid "Create account" +msgstr "" + #: packages/ui/primitives/document-flow/add-signature.tsx:360 msgid "Custom Text" msgstr "Texto personalizado" @@ -237,25 +427,47 @@ msgstr "Texto personalizado" msgid "Date" msgstr "Fecha" -#: packages/ui/primitives/document-flow/add-settings.tsx:271 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:279 +#: packages/ui/primitives/document-flow/add-settings.tsx:313 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:318 msgid "Date Format" msgstr "Formato de fecha" +#: packages/email/templates/team-invite.tsx:83 +msgid "Decline" +msgstr "" + +#: packages/email/templates/reset-password.tsx:65 +msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us." +msgstr "" + #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570 msgid "Direct link receiver" msgstr "Receptor de enlace directo" #: packages/ui/components/document/document-global-auth-access-select.tsx:62 -#: packages/ui/primitives/document-flow/add-settings.tsx:174 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:151 +#: packages/ui/primitives/document-flow/add-settings.tsx:216 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:190 msgid "Document access" msgstr "Acceso al documento" +#: packages/lib/server-only/document/super-delete-document.ts:75 +msgid "Document Cancelled" +msgstr "" + +#: packages/email/templates/document-created-from-direct-template.tsx:30 +#: packages/lib/server-only/template/create-document-from-direct-template.ts:554 +msgid "Document created from direct template" +msgstr "" + #: packages/lib/constants/template.ts:20 msgid "Document Creation" msgstr "Creación de documento" +#: packages/lib/server-only/document/send-delete-email.ts:58 +msgid "Document Deleted!" +msgstr "" + +#: packages/email/template-components/template-document-completed.tsx:64 #: packages/ui/components/document/document-download-button.tsx:68 msgid "Download" msgstr "Descargar" @@ -288,7 +500,7 @@ msgstr "Correo electrónico" msgid "Email is required" msgstr "Se requiere email" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:184 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:223 msgid "Email Options" msgstr "Opciones de correo electrónico" @@ -318,8 +530,8 @@ msgstr "Ingrese la contraseña" msgid "Error" msgstr "Error" -#: packages/ui/primitives/document-flow/add-settings.tsx:241 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:249 +#: packages/ui/primitives/document-flow/add-settings.tsx:283 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:288 msgid "External ID" msgstr "ID externo" @@ -361,6 +573,14 @@ msgstr "Marcador de posición de campo" msgid "Font Size" msgstr "Tamaño de fuente" +#: packages/lib/server-only/auth/send-forgot-password.ts:61 +msgid "Forgot Password?" +msgstr "" + +#: packages/email/template-components/template-forgot-password.tsx:21 +msgid "Forgot your password?" +msgstr "" + #: packages/ui/primitives/document-flow/types.ts:50 msgid "Free Signature" msgstr "Firma gratuita" @@ -377,6 +597,10 @@ msgstr "Regresar" msgid "Green" msgstr "Verde" +#: packages/email/templates/reset-password.tsx:50 +msgid "Hi, {userName} <0>({userEmail})" +msgstr "" + #: packages/lib/constants/recipient-roles.ts:76 msgid "I am a signer of this document" msgstr "Soy un firmante de este documento" @@ -410,12 +634,25 @@ msgstr "Email inválido" msgid "Invalid email address" msgstr "Dirección de email inválida" +#: packages/email/templates/team-invite.tsx:55 +msgid "Join {teamName} on Documenso" +msgstr "" + #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72 #: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48 msgid "Label" msgstr "Etiqueta" +#: packages/ui/primitives/document-flow/add-settings.tsx:176 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:150 +msgid "Language" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:87 +msgid "Link expires in 1 hour." +msgstr "" + #: packages/ui/primitives/lazy-pdf-viewer.tsx:15 #: packages/ui/primitives/pdf-viewer.tsx:44 msgid "Loading document..." @@ -434,7 +671,7 @@ msgid "Member" msgstr "Miembro" #: packages/ui/primitives/document-flow/add-subject.tsx:95 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:215 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:254 msgid "Message <0>(Optional)" msgstr "Mensaje <0>(Opcional)" @@ -525,6 +762,22 @@ msgstr "Página {0} de {numPages}" msgid "Password Required" msgstr "Se requiere contraseña" +#: packages/email/templates/forgot-password.tsx:17 +msgid "Password Reset Requested" +msgstr "" + +#: packages/email/templates/reset-password.tsx:18 +msgid "Password Reset Successful" +msgstr "" + +#: packages/email/template-components/template-reset-password.tsx:22 +msgid "Password updated!" +msgstr "" + +#: packages/email/templates/document-pending.tsx:17 +msgid "Pending Document" +msgstr "" + #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156 msgid "Pick a number" msgstr "Seleccione un número" @@ -535,6 +788,34 @@ msgstr "Seleccione un número" msgid "Placeholder" msgstr "Marcador de posición" +#: packages/email/template-components/template-document-invite.tsx:43 +msgid "Please {0} your document<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/templates/document-invite.tsx:38 +msgid "Please {action} your document {documentName}" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:98 +msgid "Please {recipientActionVerb} this document" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:112 +msgid "Please {recipientActionVerb} this document created by your direct template" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:104 +msgid "Please {recipientActionVerb} your document" +msgstr "" + +#: packages/lib/server-only/auth/send-confirmation-email.ts:67 +msgid "Please confirm your email" +msgstr "" + +#: packages/email/templates/confirm-email.tsx:15 +msgid "Please confirm your email address" +msgstr "" + #: packages/ui/primitives/pdf-viewer.tsx:223 #: packages/ui/primitives/pdf-viewer.tsx:238 msgid "Please try again or contact our support." @@ -561,8 +842,8 @@ msgid "Receives copy" msgstr "Recibe copia" #: packages/ui/components/recipient/recipient-action-auth-select.tsx:39 -#: packages/ui/primitives/document-flow/add-settings.tsx:215 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:169 +#: packages/ui/primitives/document-flow/add-settings.tsx:257 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:208 msgid "Recipient action authentication" msgstr "Autenticación de acción de destinatario" @@ -570,11 +851,27 @@ msgstr "Autenticación de acción de destinatario" msgid "Red" msgstr "Rojo" -#: packages/ui/primitives/document-flow/add-settings.tsx:329 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:332 +#: packages/ui/primitives/document-flow/add-settings.tsx:371 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:371 msgid "Redirect URL" msgstr "URL de redirección" +#: packages/lib/server-only/document/resend-document.tsx:165 +msgid "Reminder: {0}" +msgstr "" + +#: packages/lib/server-only/document/resend-document.tsx:118 +msgid "Reminder: {0} invited you to {recipientActionVerb} a document" +msgstr "" + +#: packages/lib/server-only/document/resend-document.tsx:110 +msgid "Reminder: Please {recipientActionVerb} this document" +msgstr "" + +#: packages/lib/server-only/document/resend-document.tsx:114 +msgid "Reminder: Please {recipientActionVerb} your document" +msgstr "" + #: packages/ui/primitives/document-flow/add-fields.tsx:1110 msgid "Remove" msgstr "Eliminar" @@ -587,6 +884,10 @@ msgstr "Eliminar" msgid "Required field" msgstr "Campo obligatorio" +#: packages/email/template-components/template-forgot-password.tsx:33 +msgid "Reset Password" +msgstr "" + #: packages/ui/components/document/document-share-button.tsx:147 msgid "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!" msgstr "Ten la seguridad de que tu documento es estrictamente confidencial y nunca será compartido. Solo se destacará tu experiencia de firma. ¡Comparte tu tarjeta de firma personalizada para mostrar tu firma!" @@ -654,6 +955,10 @@ msgstr "Mostrar configuraciones avanzadas" msgid "Sign" msgstr "Firmar" +#: packages/email/template-components/template-reset-password.tsx:34 +msgid "Sign In" +msgstr "" + #: packages/ui/primitives/document-flow/add-fields.tsx:823 #: packages/ui/primitives/document-flow/add-signature.tsx:323 #: packages/ui/primitives/document-flow/field-icon.tsx:52 @@ -682,6 +987,15 @@ msgstr "Los firmantes deben tener correos electrónicos únicos" msgid "Signing" msgstr "Firmando" +#: packages/lib/server-only/document/send-completed-email.ts:93 +#: packages/lib/server-only/document/send-completed-email.ts:161 +msgid "Signing Complete!" +msgstr "" + +#: packages/lib/constants/recipient-roles.ts:66 +#~ msgid "SIGNING_REQUEST" +#~ msgstr "" + #: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:34 msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding." msgstr "Algunos firmantes no han sido asignados a un campo de firma. Asigne al menos 1 campo de firma a cada firmante antes de continuar." @@ -704,7 +1018,7 @@ msgid "Step <0>{step} of {maxStep}" msgstr "Paso <0>{step} de {maxStep}" #: packages/ui/primitives/document-flow/add-subject.tsx:78 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:195 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:234 msgid "Subject <0>(Optional)" msgstr "Asunto <0>(Opcional)" @@ -712,7 +1026,19 @@ msgstr "Asunto <0>(Opcional)" msgid "Submit" msgstr "Enviar" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:134 +#: packages/lib/server-only/team/delete-team-email.ts:96 +msgid "Team email has been revoked for {0}" +msgstr "" + +#: packages/email/templates/team-email-removed.tsx:53 +msgid "Team email removed" +msgstr "" + +#: packages/email/templates/team-email-removed.tsx:27 +msgid "Team email removed for {teamName} on Documenso" +msgstr "" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:133 msgid "Template title" msgstr "Título de plantilla" @@ -722,6 +1048,10 @@ msgstr "Título de plantilla" msgid "Text" msgstr "Texto" +#: packages/email/template-components/template-forgot-password.tsx:25 +msgid "That's okay, it happens! Click the button below to reset your password." +msgstr "" + #: packages/ui/components/recipient/recipient-action-auth-select.tsx:44 msgid "The authentication required for recipients to sign fields" msgstr "La autenticación requerida para que los destinatarios firmen campos" @@ -738,10 +1068,22 @@ msgstr "La autenticación requerida para que los destinatarios vean el documento msgid "The document's name" msgstr "El nombre del documento" +#: packages/email/templates/team-delete.tsx:35 +msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents" +msgstr "" + +#: packages/email/templates/team-delete.tsx:34 +msgid "The following team has been deleted by you" +msgstr "" + #: packages/ui/primitives/document-password-dialog.tsx:52 msgid "The password you have entered is incorrect. Please try again." msgstr "La contraseña que ha ingresado es incorrecta. Por favor, inténtelo de nuevo." +#: packages/email/template-components/template-document-super-delete.tsx:38 +msgid "The reason provided for deletion is the following:" +msgstr "" + #: packages/ui/components/recipient/recipient-role-select.tsx:103 msgid "The recipient is not required to take any action and receives a copy of the document after it is completed." msgstr "El destinatario no está obligado a tomar ninguna acción y recibe una copia del documento una vez completado." @@ -774,10 +1116,18 @@ msgstr "El correo electrónico del firmante" msgid "The signer's name" msgstr "El nombre del firmante" +#: packages/email/templates/team-email-removed.tsx:57 +msgid "The team email <0>{teamEmail} has been removed from the following team" +msgstr "" + #: packages/ui/components/document/document-global-auth-action-select.tsx:72 msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step." msgstr "Esto se puede anular configurando los requisitos de autenticación directamente en cada destinatario en el siguiente paso." +#: packages/email/template-components/template-document-super-delete.tsx:31 +msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." +msgstr "" + #: packages/ui/primitives/document-flow/add-fields.tsx:757 msgid "This document has already been sent to this recipient. You can no longer edit this recipient." msgstr "Este documento ya ha sido enviado a este destinatario. Ya no puede editar a este destinatario." @@ -786,6 +1136,10 @@ msgstr "Este documento ya ha sido enviado a este destinatario. Ya no puede edita msgid "This document is password protected. Please enter the password to view the document." msgstr "Este documento está protegido por contraseña. Por favor ingrese la contraseña para ver el documento." +#: packages/email/template-components/template-footer.tsx:14 +msgid "This document was sent using <0>Documenso." +msgstr "" + #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:573 msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them." msgstr "Este campo no se puede modificar ni eliminar. Cuando comparta el enlace directo de esta plantilla o lo agregue a su perfil público, cualquiera que acceda podrá ingresar su nombre y correo electrónico, y completar los campos que se le hayan asignado." @@ -802,12 +1156,12 @@ msgstr "Este firmante ya ha firmado el documento." msgid "This will override any global settings." msgstr "Esto anulará cualquier configuración global." -#: packages/ui/primitives/document-flow/add-settings.tsx:305 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:309 +#: packages/ui/primitives/document-flow/add-settings.tsx:347 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:348 msgid "Time Zone" msgstr "Zona horaria" -#: packages/ui/primitives/document-flow/add-settings.tsx:153 +#: packages/ui/primitives/document-flow/add-settings.tsx:155 msgid "Title" msgstr "Título" @@ -846,6 +1200,18 @@ msgstr "Valor" msgid "View" msgstr "Ver" +#: packages/email/templates/document-created-from-direct-template.tsx:69 +msgid "View document" +msgstr "" + +#: packages/email/template-components/template-document-self-signed.tsx:79 +msgid "View plans" +msgstr "" + +#: packages/lib/constants/recipient-roles.ts:67 +#~ msgid "VIEW_REQUEST" +#~ msgstr "" + #: packages/lib/constants/recipient-roles.ts:27 msgid "Viewed" msgstr "Visto" @@ -862,10 +1228,34 @@ msgstr "Espectadores" msgid "Viewing" msgstr "Viendo" +#: packages/email/template-components/template-document-pending.tsx:31 +msgid "Waiting for others" +msgstr "" + +#: packages/lib/server-only/document/send-pending-email.ts:73 +msgid "Waiting for others to complete signing." +msgstr "" + +#: packages/email/template-components/template-document-pending.tsx:41 +msgid "We're still waiting for other signers to sign this document.<0/>We'll notify you as soon as it's ready." +msgstr "" + +#: packages/email/templates/reset-password.tsx:59 +msgid "We've changed your password as you asked. You can now sign in with your new password." +msgstr "" + +#: packages/email/template-components/template-confirmation-email.tsx:24 +msgid "Welcome to Documenso!" +msgstr "" + #: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:44 msgid "You are about to send this document to the recipients. Are you sure you want to continue?" msgstr "Está a punto de enviar este documento a los destinatarios. ¿Está seguro de que desea continuar?" +#: packages/email/template-components/template-confirmation-email.tsx:41 +msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)" +msgstr "" + #: packages/ui/components/document/document-send-email-message-helper.tsx:11 msgid "You can use the following variables in your message:" msgstr "Puede usar las siguientes variables en su mensaje:" @@ -874,7 +1264,48 @@ msgstr "Puede usar las siguientes variables en su mensaje:" msgid "You cannot upload documents at this time." msgstr "No puede cargar documentos en este momento." +#: packages/email/template-components/template-document-cancel.tsx:35 +msgid "You don't need to sign it anymore." +msgstr "" + +#: packages/lib/server-only/team/create-team-member-invites.ts:168 +msgid "You have been invited to join {0} on Documenso" +msgstr "" + +#: packages/email/templates/team-invite.tsx:59 +msgid "You have been invited to join the following team" +msgstr "" + +#: packages/lib/server-only/recipient/set-recipients-for-document.ts:314 +msgid "You have been removed from a document" +msgstr "" + +#: packages/lib/server-only/team/request-team-ownership-transfer.ts:114 +msgid "You have been requested to take ownership of team {0} on Documenso" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:102 +#: packages/lib/server-only/document/resend-document.tsx:113 +msgid "You have initiated the document {0} that requires you to {recipientActionVerb} it." +msgstr "" + #: packages/ui/primitives/document-dropzone.tsx:69 msgid "You have reached your document limit." msgstr "Ha alcanzado su límite de documentos." +#: packages/email/template-components/template-document-self-signed.tsx:42 +msgid "You have signed “{documentName}”" +msgstr "" + +#: packages/email/template-components/template-document-super-delete.tsx:23 +msgid "Your document has been deleted by an admin!" +msgstr "" + +#: packages/email/template-components/template-reset-password.tsx:26 +msgid "Your password has been updated." +msgstr "" + +#: packages/email/templates/team-delete.tsx:26 +#: packages/email/templates/team-delete.tsx:30 +msgid "Your team has been deleted" +msgstr "" diff --git a/packages/lib/translations/es/marketing.po b/packages/lib/translations/es/marketing.po index 34766aa42..41bce34a4 100644 --- a/packages/lib/translations/es/marketing.po +++ b/packages/lib/translations/es/marketing.po @@ -42,7 +42,7 @@ msgstr "Agregar documento" msgid "Add More Users for {0}" msgstr "Agregar más usuarios por {0}" -#: apps/marketing/src/app/(marketing)/open/page.tsx:165 +#: apps/marketing/src/app/(marketing)/open/page.tsx:164 msgid "All our metrics, finances, and learnings are public. We believe in transparency and want to share our journey with you. You can read more about why here: <0>Announcing Open Metrics" msgstr "Todos nuestros métricas, finanzas y aprendizajes son públicos. Creemos en la transparencia y queremos compartir nuestro viaje contigo. Puedes leer más sobre por qué aquí: <0>Anunciando Métricas Abiertas" @@ -90,7 +90,7 @@ msgstr "Registro de cambios" msgid "Choose a template from the community app store. Or submit your own template for others to use." msgstr "Elige una plantilla de la tienda de aplicaciones de la comunidad. O envía tu propia plantilla para que otros la usen." -#: apps/marketing/src/app/(marketing)/open/page.tsx:219 +#: apps/marketing/src/app/(marketing)/open/page.tsx:218 msgid "Community" msgstr "Comunidad" @@ -193,7 +193,7 @@ msgstr "Rápido." msgid "Faster, smarter and more beautiful." msgstr "Más rápido, más inteligente y más hermoso." -#: apps/marketing/src/app/(marketing)/open/page.tsx:210 +#: apps/marketing/src/app/(marketing)/open/page.tsx:209 msgid "Finances" msgstr "Finanzas" @@ -246,15 +246,15 @@ msgstr "Comienza hoy." msgid "Get the latest news from Documenso, including product updates, team announcements and more!" msgstr "¡Obtén las últimas noticias de Documenso, incluidas actualizaciones de productos, anuncios del equipo y más!" -#: apps/marketing/src/app/(marketing)/open/page.tsx:233 +#: apps/marketing/src/app/(marketing)/open/page.tsx:232 msgid "GitHub: Total Merged PRs" msgstr "GitHub: Total de PRs fusionados" -#: apps/marketing/src/app/(marketing)/open/page.tsx:251 +#: apps/marketing/src/app/(marketing)/open/page.tsx:250 msgid "GitHub: Total Open Issues" msgstr "GitHub: Total de problemas abiertos" -#: apps/marketing/src/app/(marketing)/open/page.tsx:225 +#: apps/marketing/src/app/(marketing)/open/page.tsx:224 msgid "GitHub: Total Stars" msgstr "GitHub: Total de estrellas" @@ -262,7 +262,7 @@ msgstr "GitHub: Total de estrellas" msgid "Global Salary Bands" msgstr "Bandas salariales globales" -#: apps/marketing/src/app/(marketing)/open/page.tsx:261 +#: apps/marketing/src/app/(marketing)/open/page.tsx:260 msgid "Growth" msgstr "Crecimiento" @@ -286,7 +286,7 @@ msgstr "Pagos integrados con Stripe para que no tengas que preocuparte por cobra msgid "Integrates with all your favourite tools." msgstr "Se integra con todas tus herramientas favoritas." -#: apps/marketing/src/app/(marketing)/open/page.tsx:289 +#: apps/marketing/src/app/(marketing)/open/page.tsx:288 msgid "Is there more?" msgstr "¿Hay más?" @@ -310,11 +310,11 @@ msgstr "Ubicación" msgid "Make it your own through advanced customization and adjustability." msgstr "Hazlo tuyo a través de personalización y ajustabilidad avanzadas." -#: apps/marketing/src/app/(marketing)/open/page.tsx:199 +#: apps/marketing/src/app/(marketing)/open/page.tsx:198 msgid "Merged PR's" msgstr "PRs fusionados" -#: apps/marketing/src/app/(marketing)/open/page.tsx:234 +#: apps/marketing/src/app/(marketing)/open/page.tsx:233 msgid "Merged PRs" msgstr "PRs fusionados" @@ -345,8 +345,8 @@ msgstr "No se requiere tarjeta de crédito" msgid "None of these work for you? Try self-hosting!" msgstr "¿Ninguna de estas opciones funciona para ti? ¡Prueba el autoalojamiento!" -#: apps/marketing/src/app/(marketing)/open/page.tsx:194 -#: apps/marketing/src/app/(marketing)/open/page.tsx:252 +#: apps/marketing/src/app/(marketing)/open/page.tsx:193 +#: apps/marketing/src/app/(marketing)/open/page.tsx:251 msgid "Open Issues" msgstr "Problemas Abiertos" @@ -354,7 +354,7 @@ msgstr "Problemas Abiertos" msgid "Open Source or Hosted." msgstr "Código Abierto o Alojado." -#: apps/marketing/src/app/(marketing)/open/page.tsx:161 +#: apps/marketing/src/app/(marketing)/open/page.tsx:160 #: apps/marketing/src/components/(marketing)/footer.tsx:37 #: apps/marketing/src/components/(marketing)/header.tsx:64 #: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:40 @@ -466,7 +466,7 @@ msgstr "Inteligente." msgid "Star on GitHub" msgstr "Estrella en GitHub" -#: apps/marketing/src/app/(marketing)/open/page.tsx:226 +#: apps/marketing/src/app/(marketing)/open/page.tsx:225 msgid "Stars" msgstr "Estrellas" @@ -501,7 +501,7 @@ msgstr "Tienda de Plantillas (Pronto)." msgid "That's awesome. You can take a look at the current <0>Issues and join our <1>Discord Community to keep up to date, on what the current priorities are. In any case, we are an open community and welcome all input, technical and non-technical ❤️" msgstr "Eso es increíble. Puedes echar un vistazo a los <0>Problemas actuales y unirte a nuestra <1>Comunidad de Discord para mantenerte al día sobre cuáles son las prioridades actuales. En cualquier caso, somos una comunidad abierta y agradecemos todas las aportaciones, técnicas y no técnicas ❤️" -#: apps/marketing/src/app/(marketing)/open/page.tsx:293 +#: apps/marketing/src/app/(marketing)/open/page.tsx:292 msgid "This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share." msgstr "Esta página está evolucionando a medida que aprendemos lo que hace una gran empresa de firmas. La actualizaremos cuando tengamos más para compartir." @@ -514,8 +514,8 @@ msgstr "Título" msgid "Total Completed Documents" msgstr "Total de Documentos Completados" +#: apps/marketing/src/app/(marketing)/open/page.tsx:266 #: apps/marketing/src/app/(marketing)/open/page.tsx:267 -#: apps/marketing/src/app/(marketing)/open/page.tsx:268 msgid "Total Customers" msgstr "Total de Clientes" @@ -602,4 +602,3 @@ msgstr "Puedes autoalojar Documenso de forma gratuita o usar nuestra versión al #: apps/marketing/src/components/(marketing)/carousel.tsx:272 msgid "Your browser does not support the video tag." msgstr "Tu navegador no soporta la etiqueta de video." - diff --git a/packages/lib/translations/es/web.po b/packages/lib/translations/es/web.po index 33b35aafc..9049f6ed5 100644 --- a/packages/lib/translations/es/web.po +++ b/packages/lib/translations/es/web.po @@ -260,12 +260,12 @@ msgstr "Suscripciones Activas" msgid "Add" msgstr "Agregar" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:176 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:88 msgid "Add all relevant fields for each recipient." msgstr "Agrega todos los campos relevantes para cada destinatario." -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:83 msgid "Add all relevant placeholders for each recipient." msgstr "Agrega todos los marcadores de posición relevantes para cada destinatario." @@ -281,8 +281,8 @@ msgstr "Agrega un autenticador para servir como método de autenticación secund msgid "Add email" msgstr "Agregar correo electrónico" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:174 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87 msgid "Add Fields" msgstr "Agregar Campos" @@ -295,15 +295,15 @@ msgstr "Agregar más" msgid "Add passkey" msgstr "Agregar clave" -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:81 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82 msgid "Add Placeholders" msgstr "Agregar Marcadores de posición" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170 msgid "Add Signers" msgstr "Agregar Firmantes" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180 msgid "Add Subject" msgstr "Agregar Asunto" @@ -311,7 +311,7 @@ msgstr "Agregar Asunto" msgid "Add team email" msgstr "Agregar correo electrónico del equipo" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:171 msgid "Add the people who will sign the document." msgstr "Agrega a las personas que firmarán el documento." @@ -319,7 +319,7 @@ msgstr "Agrega a las personas que firmarán el documento." msgid "Add the recipients to create the document with" msgstr "Agrega los destinatarios con los que crear el documento" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181 msgid "Add the subject and message you wish to send to signers." msgstr "Agrega el asunto y el mensaje que deseas enviar a los firmantes." @@ -414,13 +414,13 @@ msgstr "Se ha enviado un correo electrónico solicitando la transferencia de est msgid "An error occurred" msgstr "Ocurrió un error" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:266 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:268 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:201 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:235 msgid "An error occurred while adding signers." msgstr "Ocurrió un error al agregar firmantes." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 msgid "An error occurred while adding the fields." msgstr "Ocurrió un error al agregar los campos." @@ -482,7 +482,7 @@ msgstr "Ocurrió un error al eliminar la firma." msgid "An error occurred while removing the text." msgstr "Ocurrió un error al eliminar el texto." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:332 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:334 msgid "An error occurred while sending the document." msgstr "Ocurrió un error al enviar el documento." @@ -507,8 +507,8 @@ msgstr "Ocurrió un error al firmar el documento." msgid "An error occurred while trying to create a checkout session." msgstr "Ocurrió un error al intentar crear una sesión de pago." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:232 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:234 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:170 msgid "An error occurred while updating the document settings." msgstr "Ocurrió un error al actualizar la configuración del documento." @@ -869,11 +869,11 @@ msgstr "Documentos completados" msgid "Completed Documents" msgstr "Documentos Completados" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:166 msgid "Configure general settings for the document." msgstr "Configurar ajustes generales para el documento." -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:78 msgid "Configure general settings for the template." msgstr "Configurar ajustes generales para la plantilla." @@ -1350,7 +1350,7 @@ msgstr "Documento reenviado" msgid "Document resealed" msgstr "Documento sellado nuevamente" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:323 msgid "Document sent" msgstr "Documento enviado" @@ -1579,16 +1579,16 @@ msgstr "Ingresa tu texto aquí" #: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:231 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:233 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:267 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:302 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:333 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57 #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:165 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:196 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:230 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:169 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:200 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:234 #: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56 #: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:160 @@ -1679,8 +1679,8 @@ msgstr "¿Olvidaste tu contraseña?" msgid "Full Name" msgstr "Nombre completo" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:164 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:51 @@ -3244,7 +3244,7 @@ msgstr "La plantilla ha sido actualizada." msgid "Template moved" msgstr "Plantilla movida" -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:219 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:223 msgid "Template saved" msgstr "Plantilla guardada" @@ -4521,7 +4521,7 @@ msgstr "Tu documento se ha creado exitosamente a partir de la plantilla." msgid "Your document has been re-sent successfully." msgstr "Tu documento ha sido reenviado con éxito." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:322 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:324 msgid "Your document has been sent successfully." msgstr "Tu documento ha sido enviado con éxito." @@ -4612,7 +4612,7 @@ msgstr "Tu plantilla ha sido eliminada con éxito." msgid "Your template will be duplicated." msgstr "Tu plantilla será duplicada." -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:220 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:224 msgid "Your templates has been saved successfully." msgstr "Tus plantillas han sido guardadas con éxito." @@ -4628,4 +4628,3 @@ msgstr "¡Tu token se creó con éxito! ¡Asegúrate de copiarlo porque no podr #: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86 msgid "Your tokens will be shown here once you create them." msgstr "Tus tokens se mostrarán aquí una vez que los crees." - diff --git a/packages/lib/translations/fr/common.po b/packages/lib/translations/fr/common.po index d29872c63..6b5a1d366 100644 --- a/packages/lib/translations/fr/common.po +++ b/packages/lib/translations/fr/common.po @@ -18,14 +18,104 @@ msgstr "" "X-Crowdin-File: common.po\n" "X-Crowdin-File-ID: 4\n" +#: packages/email/template-components/template-document-super-delete.tsx:27 +msgid "\"{documentName}\" has been deleted by an admin." +msgstr "" + +#: packages/email/template-components/template-document-pending.tsx:37 +msgid "“{documentName}” has been signed" +msgstr "" + +#: packages/email/template-components/template-document-completed.tsx:41 +#: packages/lib/server-only/document/resend-document.tsx:109 +msgid "{0}" +msgstr "" + +#: packages/email/template-components/template-document-invite.tsx:74 +msgid "{0} Document" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:117 +msgid "{0} invited you to {recipientActionVerb} a document" +msgstr "" + +#: packages/email/templates/team-join.tsx:55 +msgid "{0} joined the team {teamName} on Documenso" +msgstr "" + +#: packages/email/templates/team-leave.tsx:55 +msgid "{0} left the team {teamName} on Documenso" +msgstr "" + #: packages/ui/primitives/data-table-pagination.tsx:30 msgid "{0} of {1} row(s) selected." msgstr "{0} sur {1} ligne(s) sélectionnée(s)." +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:119 +#: packages/lib/server-only/document/resend-document.tsx:119 +msgid "{0} on behalf of {1} has invited you to {recipientActionVerb} the document \"{2}\"." +msgstr "" + +#: packages/email/templates/document-invite.tsx:79 +msgid "{inviterName} <0>({inviterEmail})" +msgstr "" + +#: packages/email/templates/document-cancel.tsx:19 +msgid "{inviterName} has cancelled the document {documentName}, you don't need to sign it anymore." +msgstr "" + +#: packages/email/template-components/template-document-cancel.tsx:24 +msgid "{inviterName} has cancelled the document<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/template-components/template-document-invite.tsx:57 +msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/templates/document-invite.tsx:41 +msgid "{inviterName} has invited you to {action} {documentName}" +msgstr "" + +#: packages/email/templates/recipient-removed-from-document.tsx:18 +msgid "{inviterName} has removed you from the document {documentName}." +msgstr "" + +#: packages/email/template-components/template-document-invite.tsx:49 +msgid "{inviterName} on behalf of {teamName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/templates/document-invite.tsx:40 +msgid "{inviterName} on behalf of {teamName} has invited you to {action} {documentName}" +msgstr "" + +#: packages/email/templates/team-join.tsx:61 +msgid "{memberEmail} joined the following team" +msgstr "" + +#: packages/email/templates/team-leave.tsx:61 +msgid "{memberEmail} left the following team" +msgstr "" + +#: packages/email/templates/document-created-from-direct-template.tsx:55 +msgid "{recipientName} {action} a document by using one of your direct links" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:55 +msgid "{teamName} ownership transfer request" +msgstr "" + #: packages/ui/primitives/data-table-pagination.tsx:41 msgid "{visibleRows, plural, one {Showing # result.} other {Showing # results.}}" msgstr "{visibleRows, plural, one {Affichage de # résultat.} other {Affichage de # résultats.}}" +#: packages/email/templates/document-invite.tsx:91 +msgid "`${inviterName} has invited you to ${action} the document \"${documentName}\".`" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:59 +msgid "<0>{senderName} has requested that you take ownership of the following team" +msgstr "" + #: packages/ui/components/recipient/recipient-action-auth-select.tsx:53 msgid "<0>Inherit authentication method - Use the global action signing authentication method configured in the \"General Settings\" step" msgstr "<0>Hériter du méthode d'authentification - Utiliser la méthode d'authentification de signature d'action globale configurée dans l'étape \"Paramètres Générales\"" @@ -56,20 +146,66 @@ msgstr "<0>Exiger un compte - Le destinataire doit être connecté pour voir msgid "<0>Require passkey - The recipient must have an account and passkey configured via their settings" msgstr "<0>Exiger une clé d'accès - Le destinataire doit avoir un compte et une clé d'accès configurée via ses paramètres" +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:109 +msgid "A document was created by your direct template that requires you to {recipientActionVerb} it." +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts:90 +msgid "A new member has joined your team" +msgstr "" + +#: packages/lib/server-only/team/create-team-email-verification.ts:142 +msgid "A request to use your email has been initiated by {teamName} on Documenso" +msgstr "" + +#: packages/email/templates/team-join.tsx:29 +msgid "A team member has joined a team on Documenso" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-team-member-left-email.ts:79 +msgid "A team member has left {0}" +msgstr "" + +#: packages/email/templates/team-leave.tsx:29 +msgid "A team member has left a team on Documenso" +msgstr "" + +#: packages/email/templates/team-delete.tsx:27 +#: packages/email/templates/team-delete.tsx:31 +msgid "A team you were a part of has been deleted" +msgstr "" + +#: packages/email/templates/team-invite.tsx:77 +#: packages/email/templates/team-transfer-request.tsx:81 +msgid "Accept" +msgstr "" + +#: packages/email/templates/team-invite.tsx:29 +msgid "Accept invitation to join a team on Documenso" +msgstr "" + +#: packages/email/templates/confirm-team-email.tsx:38 +msgid "Accept team email request for {teamName} on Documenso" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:29 +msgid "Accept team transfer request on Documenso" +msgstr "" + #: packages/ui/primitives/document-dropzone.tsx:69 msgid "Add a document" msgstr "Ajouter un document" -#: packages/ui/primitives/document-flow/add-settings.tsx:336 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:339 +#: packages/ui/primitives/document-flow/add-settings.tsx:378 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:378 msgid "Add a URL to redirect the user to once the document is signed" msgstr "Ajouter une URL pour rediriger l'utilisateur une fois le document signé" -#: packages/ui/primitives/document-flow/add-settings.tsx:248 +#: packages/ui/primitives/document-flow/add-settings.tsx:290 msgid "Add an external ID to the document. This can be used to identify the document in external systems." msgstr "Ajouter un ID externe au document. Cela peut être utilisé pour identifier le document dans des systèmes externes." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:256 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:295 msgid "Add an external ID to the template. This can be used to identify in external systems." msgstr "Ajouter un ID externe au modèle. Cela peut être utilisé pour identifier dans des systèmes externes." @@ -110,8 +246,8 @@ msgstr "Ajouter du texte au champ" msgid "Admin" msgstr "Administrateur" -#: packages/ui/primitives/document-flow/add-settings.tsx:230 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:238 +#: packages/ui/primitives/document-flow/add-settings.tsx:272 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:277 msgid "Advanced Options" msgstr "Options avancées" @@ -124,6 +260,14 @@ msgstr "Paramètres avancés" msgid "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email." msgstr "Après soumission, un document sera automatiquement généré et ajouté à votre page de documents. Vous recevrez également une notification par email." +#: packages/email/template-components/template-document-cancel.tsx:31 +msgid "All signatures have been voided." +msgstr "" + +#: packages/email/templates/document-super-delete.tsx:20 +msgid "An admin has deleted your document \"{documentName}\"." +msgstr "" + #: packages/ui/primitives/pdf-viewer.tsx:167 msgid "An error occurred while loading the document." msgstr "Une erreur s'est produite lors du chargement du document." @@ -132,6 +276,10 @@ msgstr "Une erreur s'est produite lors du chargement du document." msgid "Approve" msgstr "Approuver" +#: packages/lib/constants/recipient-roles.ts:68 +#~ msgid "APPROVE_REQUEST" +#~ msgstr "" + #: packages/lib/constants/recipient-roles.ts:9 msgid "Approved" msgstr "Approuvé" @@ -148,6 +296,10 @@ msgstr "Approbateurs" msgid "Approving" msgstr "En attente d'approbation" +#: packages/email/template-components/template-confirmation-email.tsx:28 +msgid "Before you get started, please confirm your email address by clicking the button below:" +msgstr "" + #: packages/ui/primitives/signature-pad/signature-pad.tsx:377 msgid "Black" msgstr "Noir" @@ -156,6 +308,14 @@ msgstr "Noir" msgid "Blue" msgstr "Bleu" +#: packages/email/templates/team-invite.tsx:67 +msgid "by <0>{senderName}" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:70 +msgid "By accepting this request, you will take responsibility for any billing items associated with this team." +msgstr "" + #: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356 #: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58 msgid "Cancel" @@ -206,6 +366,16 @@ msgstr "Cliquez pour insérer un champ" msgid "Close" msgstr "Fermer" +#: packages/email/template-components/template-document-completed.tsx:35 +#: packages/email/template-components/template-document-self-signed.tsx:36 +msgid "Completed" +msgstr "" + +#: packages/email/templates/document-completed.tsx:21 +#: packages/email/templates/document-self-signed.tsx:17 +msgid "Completed Document" +msgstr "" + #: packages/lib/constants/template.ts:12 msgid "Configure Direct Recipient" msgstr "Configurer le destinataire direct" @@ -215,10 +385,22 @@ msgstr "Configurer le destinataire direct" msgid "Configure the {0} field" msgstr "Configurer le champ {0}" +#: packages/email/template-components/template-confirmation-email.tsx:38 +msgid "Confirm email" +msgstr "" + #: packages/ui/primitives/document-flow/document-flow-root.tsx:141 msgid "Continue" msgstr "Continuer" +#: packages/email/template-components/template-document-invite.tsx:66 +msgid "Continue by {0} the document." +msgstr "" + +#: packages/email/template-components/template-document-completed.tsx:45 +msgid "Continue by downloading the document." +msgstr "" + #: packages/ui/components/document/document-share-button.tsx:46 msgid "Copied to clipboard" msgstr "Copié dans le presse-papiers" @@ -227,6 +409,14 @@ msgstr "Copié dans le presse-papiers" msgid "Copy Link" msgstr "Copier le lien" +#: packages/email/template-components/template-document-self-signed.tsx:46 +msgid "Create a <0>free account to access your signed documents at any time." +msgstr "" + +#: packages/email/template-components/template-document-self-signed.tsx:68 +msgid "Create account" +msgstr "" + #: packages/ui/primitives/document-flow/add-signature.tsx:360 msgid "Custom Text" msgstr "Texte personnalisé" @@ -237,25 +427,47 @@ msgstr "Texte personnalisé" msgid "Date" msgstr "Date" -#: packages/ui/primitives/document-flow/add-settings.tsx:271 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:279 +#: packages/ui/primitives/document-flow/add-settings.tsx:313 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:318 msgid "Date Format" msgstr "Format de date" +#: packages/email/templates/team-invite.tsx:83 +msgid "Decline" +msgstr "" + +#: packages/email/templates/reset-password.tsx:65 +msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us." +msgstr "" + #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570 msgid "Direct link receiver" msgstr "Receveur de lien direct" #: packages/ui/components/document/document-global-auth-access-select.tsx:62 -#: packages/ui/primitives/document-flow/add-settings.tsx:174 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:151 +#: packages/ui/primitives/document-flow/add-settings.tsx:216 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:190 msgid "Document access" msgstr "Accès au document" +#: packages/lib/server-only/document/super-delete-document.ts:75 +msgid "Document Cancelled" +msgstr "" + +#: packages/email/templates/document-created-from-direct-template.tsx:30 +#: packages/lib/server-only/template/create-document-from-direct-template.ts:554 +msgid "Document created from direct template" +msgstr "" + #: packages/lib/constants/template.ts:20 msgid "Document Creation" msgstr "Création de document" +#: packages/lib/server-only/document/send-delete-email.ts:58 +msgid "Document Deleted!" +msgstr "" + +#: packages/email/template-components/template-document-completed.tsx:64 #: packages/ui/components/document/document-download-button.tsx:68 msgid "Download" msgstr "Télécharger" @@ -288,7 +500,7 @@ msgstr "Email" msgid "Email is required" msgstr "L'email est requis" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:184 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:223 msgid "Email Options" msgstr "Options d'email" @@ -318,8 +530,8 @@ msgstr "Entrez le mot de passe" msgid "Error" msgstr "Erreur" -#: packages/ui/primitives/document-flow/add-settings.tsx:241 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:249 +#: packages/ui/primitives/document-flow/add-settings.tsx:283 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:288 msgid "External ID" msgstr "ID externe" @@ -361,6 +573,14 @@ msgstr "Espace réservé du champ" msgid "Font Size" msgstr "Taille de Police" +#: packages/lib/server-only/auth/send-forgot-password.ts:61 +msgid "Forgot Password?" +msgstr "" + +#: packages/email/template-components/template-forgot-password.tsx:21 +msgid "Forgot your password?" +msgstr "" + #: packages/ui/primitives/document-flow/types.ts:50 msgid "Free Signature" msgstr "Signature gratuite" @@ -377,6 +597,10 @@ msgstr "Retourner" msgid "Green" msgstr "Vert" +#: packages/email/templates/reset-password.tsx:50 +msgid "Hi, {userName} <0>({userEmail})" +msgstr "" + #: packages/lib/constants/recipient-roles.ts:76 msgid "I am a signer of this document" msgstr "Je suis un signataire de ce document" @@ -410,12 +634,25 @@ msgstr "Email invalide" msgid "Invalid email address" msgstr "Adresse email invalide" +#: packages/email/templates/team-invite.tsx:55 +msgid "Join {teamName} on Documenso" +msgstr "" + #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72 #: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48 msgid "Label" msgstr "Étiquette" +#: packages/ui/primitives/document-flow/add-settings.tsx:176 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:150 +msgid "Language" +msgstr "" + +#: packages/email/templates/team-transfer-request.tsx:87 +msgid "Link expires in 1 hour." +msgstr "" + #: packages/ui/primitives/lazy-pdf-viewer.tsx:15 #: packages/ui/primitives/pdf-viewer.tsx:44 msgid "Loading document..." @@ -434,7 +671,7 @@ msgid "Member" msgstr "Membre" #: packages/ui/primitives/document-flow/add-subject.tsx:95 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:215 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:254 msgid "Message <0>(Optional)" msgstr "Message <0>(Optionnel)" @@ -525,6 +762,22 @@ msgstr "Page {0} sur {numPages}" msgid "Password Required" msgstr "Mot de passe requis" +#: packages/email/templates/forgot-password.tsx:17 +msgid "Password Reset Requested" +msgstr "" + +#: packages/email/templates/reset-password.tsx:18 +msgid "Password Reset Successful" +msgstr "" + +#: packages/email/template-components/template-reset-password.tsx:22 +msgid "Password updated!" +msgstr "" + +#: packages/email/templates/document-pending.tsx:17 +msgid "Pending Document" +msgstr "" + #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156 msgid "Pick a number" msgstr "Choisissez un numéro" @@ -535,6 +788,34 @@ msgstr "Choisissez un numéro" msgid "Placeholder" msgstr "Espace réservé" +#: packages/email/template-components/template-document-invite.tsx:43 +msgid "Please {0} your document<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/templates/document-invite.tsx:38 +msgid "Please {action} your document {documentName}" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:98 +msgid "Please {recipientActionVerb} this document" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:112 +msgid "Please {recipientActionVerb} this document created by your direct template" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:104 +msgid "Please {recipientActionVerb} your document" +msgstr "" + +#: packages/lib/server-only/auth/send-confirmation-email.ts:67 +msgid "Please confirm your email" +msgstr "" + +#: packages/email/templates/confirm-email.tsx:15 +msgid "Please confirm your email address" +msgstr "" + #: packages/ui/primitives/pdf-viewer.tsx:223 #: packages/ui/primitives/pdf-viewer.tsx:238 msgid "Please try again or contact our support." @@ -561,8 +842,8 @@ msgid "Receives copy" msgstr "Recevoir une copie" #: packages/ui/components/recipient/recipient-action-auth-select.tsx:39 -#: packages/ui/primitives/document-flow/add-settings.tsx:215 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:169 +#: packages/ui/primitives/document-flow/add-settings.tsx:257 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:208 msgid "Recipient action authentication" msgstr "Authentification d'action de destinataire" @@ -570,11 +851,27 @@ msgstr "Authentification d'action de destinataire" msgid "Red" msgstr "Rouge" -#: packages/ui/primitives/document-flow/add-settings.tsx:329 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:332 +#: packages/ui/primitives/document-flow/add-settings.tsx:371 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:371 msgid "Redirect URL" msgstr "URL de redirection" +#: packages/lib/server-only/document/resend-document.tsx:165 +msgid "Reminder: {0}" +msgstr "" + +#: packages/lib/server-only/document/resend-document.tsx:118 +msgid "Reminder: {0} invited you to {recipientActionVerb} a document" +msgstr "" + +#: packages/lib/server-only/document/resend-document.tsx:110 +msgid "Reminder: Please {recipientActionVerb} this document" +msgstr "" + +#: packages/lib/server-only/document/resend-document.tsx:114 +msgid "Reminder: Please {recipientActionVerb} your document" +msgstr "" + #: packages/ui/primitives/document-flow/add-fields.tsx:1110 msgid "Remove" msgstr "Retirer" @@ -587,6 +884,10 @@ msgstr "Retirer" msgid "Required field" msgstr "Champ requis" +#: packages/email/template-components/template-forgot-password.tsx:33 +msgid "Reset Password" +msgstr "" + #: packages/ui/components/document/document-share-button.tsx:147 msgid "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!" msgstr "Soyez assuré, votre document eststrictement confidentiel et ne sera jamais partagé. Seule votre expérience de signature sera mise en avant. Partagez votre carte de signature personnalisée pour mettre en valeur votre signature !" @@ -654,6 +955,10 @@ msgstr "Afficher les paramètres avancés" msgid "Sign" msgstr "Signer" +#: packages/email/template-components/template-reset-password.tsx:34 +msgid "Sign In" +msgstr "" + #: packages/ui/primitives/document-flow/add-fields.tsx:823 #: packages/ui/primitives/document-flow/add-signature.tsx:323 #: packages/ui/primitives/document-flow/field-icon.tsx:52 @@ -682,6 +987,15 @@ msgstr "Les signataires doivent avoir des e-mails uniques" msgid "Signing" msgstr "Signature en cours" +#: packages/lib/server-only/document/send-completed-email.ts:93 +#: packages/lib/server-only/document/send-completed-email.ts:161 +msgid "Signing Complete!" +msgstr "" + +#: packages/lib/constants/recipient-roles.ts:66 +#~ msgid "SIGNING_REQUEST" +#~ msgstr "" + #: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:34 msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding." msgstr "Certains signataires n'ont pas été assignés à un champ de signature. Veuillez assigner au moins 1 champ de signature à chaque signataire avant de continuer." @@ -704,7 +1018,7 @@ msgid "Step <0>{step} of {maxStep}" msgstr "Étape <0>{step} sur {maxStep}" #: packages/ui/primitives/document-flow/add-subject.tsx:78 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:195 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:234 msgid "Subject <0>(Optional)" msgstr "Objet <0>(Optionnel)" @@ -712,7 +1026,19 @@ msgstr "Objet <0>(Optionnel)" msgid "Submit" msgstr "Soumettre" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:134 +#: packages/lib/server-only/team/delete-team-email.ts:96 +msgid "Team email has been revoked for {0}" +msgstr "" + +#: packages/email/templates/team-email-removed.tsx:53 +msgid "Team email removed" +msgstr "" + +#: packages/email/templates/team-email-removed.tsx:27 +msgid "Team email removed for {teamName} on Documenso" +msgstr "" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:133 msgid "Template title" msgstr "Titre du modèle" @@ -722,6 +1048,10 @@ msgstr "Titre du modèle" msgid "Text" msgstr "Texte" +#: packages/email/template-components/template-forgot-password.tsx:25 +msgid "That's okay, it happens! Click the button below to reset your password." +msgstr "" + #: packages/ui/components/recipient/recipient-action-auth-select.tsx:44 msgid "The authentication required for recipients to sign fields" msgstr "L'authentification requise pour que les destinataires signent des champs" @@ -738,10 +1068,22 @@ msgstr "L'authentification requise pour que les destinataires visualisent le doc msgid "The document's name" msgstr "Le nom du document" +#: packages/email/templates/team-delete.tsx:35 +msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents" +msgstr "" + +#: packages/email/templates/team-delete.tsx:34 +msgid "The following team has been deleted by you" +msgstr "" + #: packages/ui/primitives/document-password-dialog.tsx:52 msgid "The password you have entered is incorrect. Please try again." msgstr "Le mot de passe que vous avez entré est incorrect. Veuillez réessayer." +#: packages/email/template-components/template-document-super-delete.tsx:38 +msgid "The reason provided for deletion is the following:" +msgstr "" + #: packages/ui/components/recipient/recipient-role-select.tsx:103 msgid "The recipient is not required to take any action and receives a copy of the document after it is completed." msgstr "Le destinataire n'est pas tenu de prendre des mesures et reçoit une copie du document après son achèvement." @@ -774,10 +1116,18 @@ msgstr "L'email du signataire" msgid "The signer's name" msgstr "Le nom du signataire" +#: packages/email/templates/team-email-removed.tsx:57 +msgid "The team email <0>{teamEmail} has been removed from the following team" +msgstr "" + #: packages/ui/components/document/document-global-auth-action-select.tsx:72 msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step." msgstr "Cela peut être remplacé par le paramétrage direct des exigences d'authentification pour chaque destinataire à l'étape suivante." +#: packages/email/template-components/template-document-super-delete.tsx:31 +msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." +msgstr "" + #: packages/ui/primitives/document-flow/add-fields.tsx:757 msgid "This document has already been sent to this recipient. You can no longer edit this recipient." msgstr "Ce document a déjà été envoyé à ce destinataire. Vous ne pouvez plus modifier ce destinataire." @@ -786,6 +1136,10 @@ msgstr "Ce document a déjà été envoyé à ce destinataire. Vous ne pouvez pl msgid "This document is password protected. Please enter the password to view the document." msgstr "Ce document est protégé par mot de passe. Veuillez entrer le mot de passe pour visualiser le document." +#: packages/email/template-components/template-footer.tsx:14 +msgid "This document was sent using <0>Documenso." +msgstr "Ce document a été envoyé via <0>Documenso." + #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:573 msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them." msgstr "Ce champ ne peut pas être modifié ou supprimé. Lorsque vous partagez le lien direct de ce modèle ou l'ajoutez à votre profil public, toute personne qui y accède peut saisir son nom et son email, et remplir les champs qui lui sont attribués." @@ -802,12 +1156,12 @@ msgstr "Ce signataire a déjà signé le document." msgid "This will override any global settings." msgstr "Cela remplacera tous les paramètres globaux." -#: packages/ui/primitives/document-flow/add-settings.tsx:305 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:309 +#: packages/ui/primitives/document-flow/add-settings.tsx:347 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:348 msgid "Time Zone" msgstr "Fuseau horaire" -#: packages/ui/primitives/document-flow/add-settings.tsx:153 +#: packages/ui/primitives/document-flow/add-settings.tsx:155 msgid "Title" msgstr "Titre" @@ -844,7 +1198,19 @@ msgstr "Valeur" #: packages/lib/constants/recipient-roles.ts:26 msgid "View" -msgstr "Vue" +msgstr "Voir" + +#: packages/email/templates/document-created-from-direct-template.tsx:69 +msgid "View document" +msgstr "Voir le document" + +#: packages/email/template-components/template-document-self-signed.tsx:79 +msgid "View plans" +msgstr "Voir les forfaits" + +#: packages/lib/constants/recipient-roles.ts:67 +#~ msgid "VIEW_REQUEST" +#~ msgstr "DEMANDE_DE_CONSULTATION" #: packages/lib/constants/recipient-roles.ts:27 msgid "Viewed" @@ -860,12 +1226,36 @@ msgstr "Spectateurs" #: packages/lib/constants/recipient-roles.ts:28 msgid "Viewing" -msgstr "Visionnage" +msgstr "Consultation" + +#: packages/email/template-components/template-document-pending.tsx:31 +msgid "Waiting for others" +msgstr "En attente des autres" + +#: packages/lib/server-only/document/send-pending-email.ts:73 +msgid "Waiting for others to complete signing." +msgstr "" + +#: packages/email/template-components/template-document-pending.tsx:41 +msgid "We're still waiting for other signers to sign this document.<0/>We'll notify you as soon as it's ready." +msgstr "Nous attendons encore que d'autres signataires signent ce document.<0/>Nous vous préviendrons dès qu'il sera prêt." + +#: packages/email/templates/reset-password.tsx:59 +msgid "We've changed your password as you asked. You can now sign in with your new password." +msgstr "Nous avons changé votre mot de passe comme demandé. Vous pouvez maintenant vous connecter avec votre nouveau mot de passe." + +#: packages/email/template-components/template-confirmation-email.tsx:24 +msgid "Welcome to Documenso!" +msgstr "" #: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:44 msgid "You are about to send this document to the recipients. Are you sure you want to continue?" msgstr "Vous êtes sur le point d'envoyer ce document aux destinataires. Êtes-vous sûr de vouloir continuer ?" +#: packages/email/template-components/template-confirmation-email.tsx:41 +msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)" +msgstr "" + #: packages/ui/components/document/document-send-email-message-helper.tsx:11 msgid "You can use the following variables in your message:" msgstr "Vous pouvez utiliser les variables suivantes dans votre message :" @@ -874,7 +1264,52 @@ msgstr "Vous pouvez utiliser les variables suivantes dans votre message :" msgid "You cannot upload documents at this time." msgstr "Vous ne pouvez pas télécharger de documents pour le moment." +#: packages/email/template-components/template-document-cancel.tsx:35 +msgid "You don't need to sign it anymore." +msgstr "Vous n'avez plus besoin de le signer." + +#: packages/lib/server-only/team/create-team-member-invites.ts:168 +msgid "You have been invited to join {0} on Documenso" +msgstr "" + +#: packages/email/templates/team-invite.tsx:59 +msgid "You have been invited to join the following team" +msgstr "Vous avez été invité à rejoindre l'équipe suivante" + +#: packages/lib/server-only/recipient/set-recipients-for-document.ts:314 +msgid "You have been removed from a document" +msgstr "" + +#: packages/lib/server-only/team/request-team-ownership-transfer.ts:114 +msgid "You have been requested to take ownership of team {0} on Documenso" +msgstr "" + +#: packages/lib/jobs/definitions/emails/send-signing-email.ts:102 +#: packages/lib/server-only/document/resend-document.tsx:113 +msgid "You have initiated the document {0} that requires you to {recipientActionVerb} it." +msgstr "" + #: packages/ui/primitives/document-dropzone.tsx:69 msgid "You have reached your document limit." msgstr "Vous avez atteint votre limite de documents." +#: packages/email/template-components/template-document-self-signed.tsx:42 +#~ msgid "You have signed \"{documentName}\"" +#~ msgstr "Vous avez signé \"{documentName}\"" + +#: packages/email/template-components/template-document-self-signed.tsx:42 +msgid "You have signed “{documentName}”" +msgstr "" + +#: packages/email/template-components/template-document-super-delete.tsx:23 +msgid "Your document has been deleted by an admin!" +msgstr "Votre document a été supprimé par un administrateur !" + +#: packages/email/template-components/template-reset-password.tsx:26 +msgid "Your password has been updated." +msgstr "Votre mot de passe a été mis à jour." + +#: packages/email/templates/team-delete.tsx:26 +#: packages/email/templates/team-delete.tsx:30 +msgid "Your team has been deleted" +msgstr "Votre équipe a été supprimée" diff --git a/packages/lib/translations/fr/marketing.po b/packages/lib/translations/fr/marketing.po index 825a8d817..617549e8f 100644 --- a/packages/lib/translations/fr/marketing.po +++ b/packages/lib/translations/fr/marketing.po @@ -42,7 +42,7 @@ msgstr "Ajouter un document" msgid "Add More Users for {0}" msgstr "Ajouter plus d'utilisateurs pour {0}" -#: apps/marketing/src/app/(marketing)/open/page.tsx:165 +#: apps/marketing/src/app/(marketing)/open/page.tsx:164 msgid "All our metrics, finances, and learnings are public. We believe in transparency and want to share our journey with you. You can read more about why here: <0>Announcing Open Metrics" msgstr "Tous nos indicateurs, finances et apprentissages sont publics. Nous croyons en la transparence et souhaitons partager notre parcours avec vous. Vous pouvez en lire plus sur pourquoi ici : <0>Annonce de Open Metrics" @@ -90,7 +90,7 @@ msgstr "Changelog" msgid "Choose a template from the community app store. Or submit your own template for others to use." msgstr "Choisissez un modèle dans la boutique d'applications communautaires. Ou soumettez votre propre modèle pour que d'autres puissent l'utiliser." -#: apps/marketing/src/app/(marketing)/open/page.tsx:219 +#: apps/marketing/src/app/(marketing)/open/page.tsx:218 msgid "Community" msgstr "Communauté" @@ -193,7 +193,7 @@ msgstr "Rapide." msgid "Faster, smarter and more beautiful." msgstr "Plus rapide, plus intelligent et plus beau." -#: apps/marketing/src/app/(marketing)/open/page.tsx:210 +#: apps/marketing/src/app/(marketing)/open/page.tsx:209 msgid "Finances" msgstr "Finances" @@ -246,15 +246,15 @@ msgstr "Commencez aujourd'hui." msgid "Get the latest news from Documenso, including product updates, team announcements and more!" msgstr "Obtenez les dernières nouvelles de Documenso, y compris les mises à jour de produits, les annonces d'équipe et plus encore !" -#: apps/marketing/src/app/(marketing)/open/page.tsx:233 +#: apps/marketing/src/app/(marketing)/open/page.tsx:232 msgid "GitHub: Total Merged PRs" msgstr "GitHub : Total des PRs fusionnées" -#: apps/marketing/src/app/(marketing)/open/page.tsx:251 +#: apps/marketing/src/app/(marketing)/open/page.tsx:250 msgid "GitHub: Total Open Issues" msgstr "GitHub : Total des problèmes ouverts" -#: apps/marketing/src/app/(marketing)/open/page.tsx:225 +#: apps/marketing/src/app/(marketing)/open/page.tsx:224 msgid "GitHub: Total Stars" msgstr "GitHub : Nombre total d'étoiles" @@ -262,7 +262,7 @@ msgstr "GitHub : Nombre total d'étoiles" msgid "Global Salary Bands" msgstr "Bandes de salaire globales" -#: apps/marketing/src/app/(marketing)/open/page.tsx:261 +#: apps/marketing/src/app/(marketing)/open/page.tsx:260 msgid "Growth" msgstr "Croissance" @@ -286,7 +286,7 @@ msgstr "Paiements intégrés avec Stripe afin que vous n'ayez pas à vous soucie msgid "Integrates with all your favourite tools." msgstr "S'intègre à tous vos outils préférés." -#: apps/marketing/src/app/(marketing)/open/page.tsx:289 +#: apps/marketing/src/app/(marketing)/open/page.tsx:288 msgid "Is there more?" msgstr "Y a-t-il plus ?" @@ -310,11 +310,11 @@ msgstr "Emplacement" msgid "Make it your own through advanced customization and adjustability." msgstr "Faites-en votre propre grâce à une personnalisation avancée et un ajustement." -#: apps/marketing/src/app/(marketing)/open/page.tsx:199 +#: apps/marketing/src/app/(marketing)/open/page.tsx:198 msgid "Merged PR's" msgstr "PRs fusionnées" -#: apps/marketing/src/app/(marketing)/open/page.tsx:234 +#: apps/marketing/src/app/(marketing)/open/page.tsx:233 msgid "Merged PRs" msgstr "PRs fusionnées" @@ -345,8 +345,8 @@ msgstr "Aucune carte de crédit requise" msgid "None of these work for you? Try self-hosting!" msgstr "Aucune de ces options ne fonctionne pour vous ? Essayez l'hébergement autonome !" -#: apps/marketing/src/app/(marketing)/open/page.tsx:194 -#: apps/marketing/src/app/(marketing)/open/page.tsx:252 +#: apps/marketing/src/app/(marketing)/open/page.tsx:193 +#: apps/marketing/src/app/(marketing)/open/page.tsx:251 msgid "Open Issues" msgstr "Problèmes ouverts" @@ -354,7 +354,7 @@ msgstr "Problèmes ouverts" msgid "Open Source or Hosted." msgstr "Open Source ou hébergé." -#: apps/marketing/src/app/(marketing)/open/page.tsx:161 +#: apps/marketing/src/app/(marketing)/open/page.tsx:160 #: apps/marketing/src/components/(marketing)/footer.tsx:37 #: apps/marketing/src/components/(marketing)/header.tsx:64 #: apps/marketing/src/components/(marketing)/mobile-navigation.tsx:40 @@ -466,7 +466,7 @@ msgstr "Intelligent." msgid "Star on GitHub" msgstr "Étoile sur GitHub" -#: apps/marketing/src/app/(marketing)/open/page.tsx:226 +#: apps/marketing/src/app/(marketing)/open/page.tsx:225 msgid "Stars" msgstr "Étoiles" @@ -501,7 +501,7 @@ msgstr "Boutique de modèles (Bientôt)." msgid "That's awesome. You can take a look at the current <0>Issues and join our <1>Discord Community to keep up to date, on what the current priorities are. In any case, we are an open community and welcome all input, technical and non-technical ❤️" msgstr "C'est génial. Vous pouvez consulter les <0>Problèmes actuels et rejoindre notre <1>Communauté Discord pour rester à jour sur ce qui est actuellement prioritaire. Dans tous les cas, nous sommes une communauté ouverte et accueillons toutes les contributions, techniques et non techniques ❤️" -#: apps/marketing/src/app/(marketing)/open/page.tsx:293 +#: apps/marketing/src/app/(marketing)/open/page.tsx:292 msgid "This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share." msgstr "Cette page évolue à mesure que nous apprenons ce qui fait une grande entreprise de signature. Nous la mettrons à jour lorsque nous aurons plus à partager." @@ -514,8 +514,8 @@ msgstr "Titre" msgid "Total Completed Documents" msgstr "Documents totalisés complétés" +#: apps/marketing/src/app/(marketing)/open/page.tsx:266 #: apps/marketing/src/app/(marketing)/open/page.tsx:267 -#: apps/marketing/src/app/(marketing)/open/page.tsx:268 msgid "Total Customers" msgstr "Total des clients" @@ -602,4 +602,3 @@ msgstr "Vous pouvez auto-héberger Documenso gratuitement ou utiliser notre vers #: apps/marketing/src/components/(marketing)/carousel.tsx:272 msgid "Your browser does not support the video tag." msgstr "Votre navigateur ne prend pas en charge la balise vidéo." - diff --git a/packages/lib/translations/fr/web.po b/packages/lib/translations/fr/web.po index b8d3fc56a..5ab0eaad8 100644 --- a/packages/lib/translations/fr/web.po +++ b/packages/lib/translations/fr/web.po @@ -260,12 +260,12 @@ msgstr "Abonnements actifs" msgid "Add" msgstr "Ajouter" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:176 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:88 msgid "Add all relevant fields for each recipient." msgstr "Ajouter tous les champs pertinents pour chaque destinataire." -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:83 msgid "Add all relevant placeholders for each recipient." msgstr "Ajouter tous les espaces réservés pertinents pour chaque destinataire." @@ -281,8 +281,8 @@ msgstr "Ajouter un authentificateur pour servir de méthode d'authentification s msgid "Add email" msgstr "Ajouter un e-mail" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:174 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87 msgid "Add Fields" msgstr "Ajouter des champs" @@ -295,15 +295,15 @@ msgstr "Ajouter davantage" msgid "Add passkey" msgstr "Ajouter une clé de passe" -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:81 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:82 msgid "Add Placeholders" msgstr "Ajouter des espaces réservés" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170 msgid "Add Signers" msgstr "Ajouter des signataires" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180 msgid "Add Subject" msgstr "Ajouter un sujet" @@ -311,7 +311,7 @@ msgstr "Ajouter un sujet" msgid "Add team email" msgstr "Ajouter un e-mail d'équipe" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:171 msgid "Add the people who will sign the document." msgstr "Ajouter les personnes qui signeront le document." @@ -319,7 +319,7 @@ msgstr "Ajouter les personnes qui signeront le document." msgid "Add the recipients to create the document with" msgstr "Ajouter les destinataires pour créer le document avec" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181 msgid "Add the subject and message you wish to send to signers." msgstr "Ajouter le sujet et le message que vous souhaitez envoyer aux signataires." @@ -414,13 +414,13 @@ msgstr "Un e-mail demandant le transfert de cette équipe a été envoyé." msgid "An error occurred" msgstr "Une erreur est survenue" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:266 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:268 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:201 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:235 msgid "An error occurred while adding signers." msgstr "Une erreur est survenue lors de l'ajout de signataires." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 msgid "An error occurred while adding the fields." msgstr "Une erreur est survenue lors de l'ajout des champs." @@ -482,7 +482,7 @@ msgstr "Une erreur est survenue lors de la suppression de la signature." msgid "An error occurred while removing the text." msgstr "Une erreur est survenue lors de la suppression du texte." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:332 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:334 msgid "An error occurred while sending the document." msgstr "Une erreur est survenue lors de l'envoi du document." @@ -507,8 +507,8 @@ msgstr "Une erreur est survenue lors de la signature du document." msgid "An error occurred while trying to create a checkout session." msgstr "Une erreur est survenue lors de la création d'une session de paiement." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:232 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:234 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:170 msgid "An error occurred while updating the document settings." msgstr "Une erreur est survenue lors de la mise à jour des paramètres du document." @@ -869,11 +869,11 @@ msgstr "Documents complétés" msgid "Completed Documents" msgstr "Documents Complétés" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:166 msgid "Configure general settings for the document." msgstr "Configurer les paramètres généraux pour le document." -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:78 msgid "Configure general settings for the template." msgstr "Configurer les paramètres généraux pour le modèle." @@ -1350,7 +1350,7 @@ msgstr "Document renvoyé" msgid "Document resealed" msgstr "Document resealé" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:323 msgid "Document sent" msgstr "Document envoyé" @@ -1579,16 +1579,16 @@ msgstr "Entrez votre texte ici" #: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:231 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:233 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:267 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:302 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:333 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57 #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:165 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:196 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:230 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:169 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:200 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:234 #: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56 #: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:160 @@ -1679,8 +1679,8 @@ msgstr "Mot de passe oublié ?" msgid "Full Name" msgstr "Nom complet" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:164 -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:77 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:51 @@ -3244,7 +3244,7 @@ msgstr "Le modèle a été mis à jour." msgid "Template moved" msgstr "Modèle déplacé" -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:219 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:223 msgid "Template saved" msgstr "Modèle enregistré" @@ -4521,7 +4521,7 @@ msgstr "Votre document a été créé à partir du modèle avec succès." msgid "Your document has been re-sent successfully." msgstr "Votre document a été renvoyé avec succès." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:322 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:324 msgid "Your document has been sent successfully." msgstr "Votre document a été envoyé avec succès." @@ -4612,7 +4612,7 @@ msgstr "Votre modèle a été supprimé avec succès." msgid "Your template will be duplicated." msgstr "Votre modèle sera dupliqué." -#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:220 +#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:224 msgid "Your templates has been saved successfully." msgstr "Vos modèles ont été enregistrés avec succès." @@ -4628,4 +4628,3 @@ msgstr "Votre jeton a été créé avec succès ! Assurez-vous de le copier car #: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86 msgid "Your tokens will be shown here once you create them." msgstr "Vos jetons seront affichés ici une fois que vous les aurez créés." - diff --git a/packages/lib/utils/is-valid-redirect-url.ts b/packages/lib/utils/is-valid-redirect-url.ts index e89818ac2..de827f69c 100644 --- a/packages/lib/utils/is-valid-redirect-url.ts +++ b/packages/lib/utils/is-valid-redirect-url.ts @@ -4,7 +4,6 @@ export const isValidRedirectUrl = (value: string) => { try { const url = new URL(value); - console.log({ protocol: url.protocol }); if (!ALLOWED_PROTOCOLS.includes(url.protocol.slice(0, -1).toLowerCase())) { return false; } diff --git a/packages/lib/utils/remember.ts b/packages/lib/utils/remember.ts new file mode 100644 index 000000000..1ee146dd1 --- /dev/null +++ b/packages/lib/utils/remember.ts @@ -0,0 +1,18 @@ +declare global { + // eslint-disable-next-line no-var, @typescript-eslint/no-explicit-any + var __documenso_util_remember: Map; +} + +export function remember(name: string, getValue: () => T): T { + const thusly = globalThis; + + if (!thusly.__documenso_util_remember) { + thusly.__documenso_util_remember = new Map(); + } + + if (!thusly.__documenso_util_remember.has(name)) { + thusly.__documenso_util_remember.set(name, getValue()); + } + + return thusly.__documenso_util_remember.get(name); +} diff --git a/packages/lib/utils/render-email-with-i18n.tsx b/packages/lib/utils/render-email-with-i18n.tsx new file mode 100644 index 000000000..172e8d563 --- /dev/null +++ b/packages/lib/utils/render-email-with-i18n.tsx @@ -0,0 +1,36 @@ +import { I18nProvider } from '@lingui/react'; + +import { render } from '@documenso/email/render'; + +import { getI18nInstance } from '../client-only/providers/i18n.server'; +import { + APP_I18N_OPTIONS, + type SupportedLanguageCodes, + isValidLanguageCode, +} from '../constants/i18n'; + +export const renderEmailWithI18N = async ( + component: React.ReactElement, + options?: { + plainText?: boolean; + // eslint-disable-next-line @typescript-eslint/ban-types + lang?: SupportedLanguageCodes | (string & {}); + }, +) => { + try { + const providedLang = options?.lang; + + const lang = isValidLanguageCode(providedLang) ? providedLang : APP_I18N_OPTIONS.sourceLang; + + const i18n = await getI18nInstance(lang); + + i18n.activate(lang); + + return render({component}, { + plainText: options?.plainText, + }); + } catch (err) { + console.error(err); + throw new Error('Failed to render email'); + } +}; diff --git a/packages/prisma/migrations/20241101103425_add_language_column_for_documents_and_templates/migration.sql b/packages/prisma/migrations/20241101103425_add_language_column_for_documents_and_templates/migration.sql new file mode 100644 index 000000000..5a4dde1d8 --- /dev/null +++ b/packages/prisma/migrations/20241101103425_add_language_column_for_documents_and_templates/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "DocumentMeta" ADD COLUMN "language" TEXT NOT NULL DEFAULT 'en'; + +-- AlterTable +ALTER TABLE "TemplateMeta" ADD COLUMN "language" TEXT NOT NULL DEFAULT 'en'; diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 7c858c897..343ee2988 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -370,6 +370,7 @@ model DocumentMeta { redirectUrl String? signingOrder DocumentSigningOrder @default(PARALLEL) typedSignatureEnabled Boolean @default(false) + language String @default("en") } enum ReadStatus { @@ -612,6 +613,7 @@ model TemplateMeta { templateId Int @unique template Template @relation(fields: [templateId], references: [id], onDelete: Cascade) redirectUrl String? + language String @default("en") } model Template { diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts index e869eb9a4..d49dd07ef 100644 --- a/packages/trpc/server/document-router/router.ts +++ b/packages/trpc/server/document-router/router.ts @@ -232,6 +232,7 @@ export const documentRouter = router({ dateFormat: meta.dateFormat, timezone: meta.timezone, redirectUrl: meta.redirectUrl, + language: meta.language, userId: ctx.user.id, requestMetadata, }); diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts index 8d3063315..64540b077 100644 --- a/packages/trpc/server/document-router/schema.ts +++ b/packages/trpc/server/document-router/schema.ts @@ -1,5 +1,6 @@ import { z } from 'zod'; +import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n'; import { ZDocumentAccessAuthTypesSchema, ZDocumentActionAuthTypesSchema, @@ -70,6 +71,7 @@ export const ZSetSettingsForDocumentMutationSchema = z.object({ message: 'Please enter a valid URL, make sure you include http:// or https:// part of the url.', }), + language: z.enum(SUPPORTED_LANGUAGE_CODES).optional(), }), }); diff --git a/packages/trpc/server/singleplayer-router/router.ts b/packages/trpc/server/singleplayer-router/router.ts index 6e8533c32..5cf62cb53 100644 --- a/packages/trpc/server/singleplayer-router/router.ts +++ b/packages/trpc/server/singleplayer-router/router.ts @@ -3,7 +3,6 @@ import { createElement } from 'react'; import { PDFDocument } from 'pdf-lib'; import { mailer } from '@documenso/email/mailer'; -import { renderAsync } from '@documenso/email/render'; import { DocumentSelfSignedEmailTemplate } from '@documenso/email/templates/document-self-signed'; import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { FROM_ADDRESS, FROM_NAME, SERVICE_USER_EMAIL } from '@documenso/lib/constants/email'; @@ -11,6 +10,7 @@ import { insertFieldInPDF } from '@documenso/lib/server-only/pdf/insert-field-in import { alphaid } from '@documenso/lib/universal/id'; import { getFile } from '@documenso/lib/universal/upload/get-file'; import { putPdfFile } from '@documenso/lib/universal/upload/put-file'; +import { renderEmailWithI18N } from '@documenso/lib/utils/render-email-with-i18n'; import { prisma } from '@documenso/prisma'; import { DocumentSource, @@ -158,8 +158,8 @@ export const singleplayerRouter = router({ }); const [html, text] = await Promise.all([ - renderAsync(template), - renderAsync(template, { plainText: true }), + renderEmailWithI18N(template), + renderEmailWithI18N(template, { plainText: true }), ]); // Send email to signer. diff --git a/packages/trpc/server/template-router/router.ts b/packages/trpc/server/template-router/router.ts index a1a17d688..ddd4a73ad 100644 --- a/packages/trpc/server/template-router/router.ts +++ b/packages/trpc/server/template-router/router.ts @@ -1,6 +1,7 @@ import { TRPCError } from '@trpc/server'; import { getServerLimits } from '@documenso/ee/server-only/limits/server'; +import { isValidLanguageCode } from '@documenso/lib/constants/i18n'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { sendDocument } from '@documenso/lib/server-only/document/send-document'; import { createDocumentFromDirectTemplate } from '@documenso/lib/server-only/template/create-document-from-direct-template'; @@ -214,7 +215,10 @@ export const templateRouter = router({ teamId, templateId, data, - meta, + meta: { + ...meta, + language: isValidLanguageCode(meta?.language) ? meta?.language : undefined, + }, requestMetadata, }); } catch (err) { diff --git a/packages/trpc/server/template-router/schema.ts b/packages/trpc/server/template-router/schema.ts index d7807ad3d..41847a333 100644 --- a/packages/trpc/server/template-router/schema.ts +++ b/packages/trpc/server/template-router/schema.ts @@ -1,5 +1,6 @@ import { z } from 'zod'; +import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n'; import { ZDocumentAccessAuthTypesSchema, ZDocumentActionAuthTypesSchema, @@ -87,6 +88,10 @@ export const ZUpdateTemplateSettingsMutationSchema = z.object({ .max(MAX_TEMPLATE_PUBLIC_DESCRIPTION_LENGTH) .optional(), type: z.nativeEnum(TemplateType).optional(), + language: z + .union([z.string(), z.enum(SUPPORTED_LANGUAGE_CODES)]) + .optional() + .default('en'), }), meta: z .object({ @@ -101,6 +106,7 @@ export const ZUpdateTemplateSettingsMutationSchema = z.object({ message: 'Please enter a valid URL, make sure you include http:// or https:// part of the url.', }), + language: z.enum(SUPPORTED_LANGUAGE_CODES).optional(), }) .optional(), }); diff --git a/packages/ui/primitives/document-flow/add-settings.tsx b/packages/ui/primitives/document-flow/add-settings.tsx index 06cf5e9ea..9b73336f5 100644 --- a/packages/ui/primitives/document-flow/add-settings.tsx +++ b/packages/ui/primitives/document-flow/add-settings.tsx @@ -8,6 +8,7 @@ import { InfoIcon } from 'lucide-react'; import { useForm } from 'react-hook-form'; import { DATE_FORMATS, DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats'; +import { SUPPORTED_LANGUAGES } from '@documenso/lib/constants/i18n'; import { DEFAULT_DOCUMENT_TIME_ZONE, TIME_ZONES } from '@documenso/lib/constants/time-zones'; import { extractDocumentAuthMethods } from '@documenso/lib/utils/document-auth'; import type { TeamMemberRole } from '@documenso/prisma/client'; @@ -98,6 +99,7 @@ export const AddSettingsFormPartial = ({ DATE_FORMATS.find((format) => format.value === document.documentMeta?.dateFormat) ?.value ?? DEFAULT_DOCUMENT_DATE_FORMAT, redirectUrl: document.documentMeta?.redirectUrl ?? '', + language: document.documentMeta?.language ?? 'en', }, }, }); @@ -165,6 +167,46 @@ export const AddSettingsFormPartial = ({ )} /> + ( + + + Language + + + + + + + Controls the language for the document, including the language to be used + for email notifications, and the final certificate that is generated and + attached to the document. + + + + + + + + + + )} + /> + + ( + + + Language + + + + + + + Controls the language for the document, including the language to be used + for email notifications, and the final certificate that is generated and + attached to the document. + + + + + + + + + + )} + /> +