mirror of
https://github.com/documenso/documenso.git
synced 2025-11-10 04:22:32 +10:00
Compare commits
3 Commits
feat/docum
...
v1.12.0-rc
| Author | SHA1 | Date | |
|---|---|---|---|
| 8be7137b59 | |||
| 31e2a6443e | |||
| 400d2a2b1a |
@ -0,0 +1,94 @@
|
||||
import { useState } from 'react';
|
||||
|
||||
import { Trans, useLingui } from '@lingui/react/macro';
|
||||
|
||||
import { authClient } from '@documenso/auth/client';
|
||||
import { Button } from '@documenso/ui/primitives/button';
|
||||
import {
|
||||
Dialog,
|
||||
DialogClose,
|
||||
DialogContent,
|
||||
DialogDescription,
|
||||
DialogFooter,
|
||||
DialogHeader,
|
||||
DialogTitle,
|
||||
DialogTrigger,
|
||||
} from '@documenso/ui/primitives/dialog';
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
|
||||
type SessionLogoutAllDialogProps = {
|
||||
onSuccess?: () => Promise<unknown>;
|
||||
disabled?: boolean;
|
||||
};
|
||||
|
||||
export const SessionLogoutAllDialog = ({ onSuccess, disabled }: SessionLogoutAllDialogProps) => {
|
||||
const { t } = useLingui();
|
||||
const { toast } = useToast();
|
||||
|
||||
const [isOpen, setIsOpen] = useState(false);
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
|
||||
const handleSignOutAllSessions = async () => {
|
||||
setIsLoading(true);
|
||||
|
||||
try {
|
||||
await authClient.signOutAllSessions();
|
||||
|
||||
if (onSuccess) {
|
||||
await onSuccess();
|
||||
}
|
||||
|
||||
toast({
|
||||
title: t`Sessions have been revoked`,
|
||||
});
|
||||
|
||||
setIsOpen(false);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
|
||||
toast({
|
||||
title: t`Error`,
|
||||
description: t`Failed to sign out all sessions`,
|
||||
variant: 'destructive',
|
||||
});
|
||||
}
|
||||
|
||||
setIsLoading(false);
|
||||
};
|
||||
|
||||
return (
|
||||
<Dialog open={isOpen} onOpenChange={(value) => (isLoading ? undefined : setIsOpen(value))}>
|
||||
<DialogTrigger asChild>
|
||||
<Button variant="secondary" disabled={disabled}>
|
||||
<Trans>Revoke all sessions</Trans>
|
||||
</Button>
|
||||
</DialogTrigger>
|
||||
|
||||
<DialogContent>
|
||||
<DialogHeader>
|
||||
<DialogTitle>
|
||||
<Trans>Revoke all sessions</Trans>
|
||||
</DialogTitle>
|
||||
<DialogDescription>
|
||||
<Trans>
|
||||
This will sign you out of all other devices. You will need to sign in again on those
|
||||
devices to continue using your account.
|
||||
</Trans>
|
||||
</DialogDescription>
|
||||
</DialogHeader>
|
||||
|
||||
<DialogFooter>
|
||||
<DialogClose asChild>
|
||||
<Button variant="secondary" disabled={isLoading}>
|
||||
<Trans>Cancel</Trans>
|
||||
</Button>
|
||||
</DialogClose>
|
||||
|
||||
<Button loading={isLoading} variant="destructive" onClick={handleSignOutAllSessions}>
|
||||
<Trans>Revoke all sessions</Trans>
|
||||
</Button>
|
||||
</DialogFooter>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
);
|
||||
};
|
||||
@ -171,6 +171,27 @@ export default function SettingsSecurity({ loaderData }: Route.ComponentProps) {
|
||||
</Link>
|
||||
</Button>
|
||||
</Alert>
|
||||
|
||||
<Alert
|
||||
className="mt-6 flex flex-col justify-between p-6 sm:flex-row sm:items-center"
|
||||
variant="neutral"
|
||||
>
|
||||
<div className="mb-4 mr-4 sm:mb-0">
|
||||
<AlertTitle>
|
||||
<Trans>Active sessions</Trans>
|
||||
</AlertTitle>
|
||||
|
||||
<AlertDescription className="mr-2">
|
||||
<Trans>View and manage all active sessions for your account.</Trans>
|
||||
</AlertDescription>
|
||||
</div>
|
||||
|
||||
<Button asChild variant="outline" className="bg-background">
|
||||
<Link to="/settings/security/sessions">
|
||||
<Trans>Manage sessions</Trans>
|
||||
</Link>
|
||||
</Button>
|
||||
</Alert>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@ -0,0 +1,192 @@
|
||||
import { useMemo, useState } from 'react';
|
||||
|
||||
import { useLingui } from '@lingui/react/macro';
|
||||
import { Trans } from '@lingui/react/macro';
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import { DateTime } from 'luxon';
|
||||
import { UAParser } from 'ua-parser-js';
|
||||
|
||||
import { authClient } from '@documenso/auth/client';
|
||||
import { useSession } from '@documenso/lib/client-only/providers/session';
|
||||
import { Badge } from '@documenso/ui/primitives/badge';
|
||||
import { Button } from '@documenso/ui/primitives/button';
|
||||
import type { DataTableColumnDef } from '@documenso/ui/primitives/data-table';
|
||||
import { DataTable } from '@documenso/ui/primitives/data-table';
|
||||
import { Skeleton } from '@documenso/ui/primitives/skeleton';
|
||||
import { TableCell } from '@documenso/ui/primitives/table';
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
|
||||
import { SessionLogoutAllDialog } from '~/components/dialogs/session-logout-all-dialog';
|
||||
import { SettingsHeader } from '~/components/general/settings-header';
|
||||
import { appMetaTags } from '~/utils/meta';
|
||||
|
||||
export function meta() {
|
||||
return appMetaTags('Active Sessions');
|
||||
}
|
||||
|
||||
const parser = new UAParser();
|
||||
|
||||
export default function SettingsSecuritySessions() {
|
||||
const { t } = useLingui();
|
||||
|
||||
const { data, isLoading, isLoadingError, refetch } = useQuery({
|
||||
queryKey: ['active-sessions'],
|
||||
queryFn: async () => await authClient.getSessions(),
|
||||
});
|
||||
|
||||
const { session } = useSession();
|
||||
|
||||
const results = data?.sessions ?? [];
|
||||
|
||||
const columns = useMemo(() => {
|
||||
return [
|
||||
{
|
||||
header: t`Device`,
|
||||
accessorKey: 'userAgent',
|
||||
cell: ({ row }) => {
|
||||
const userAgent = row.original.userAgent || '';
|
||||
parser.setUA(userAgent);
|
||||
|
||||
const result = parser.getResult();
|
||||
const browser = result.browser.name || t`Unknown`;
|
||||
const os = result.os.name || t`Unknown`;
|
||||
const isCurrentSession = row.original.id === session?.id;
|
||||
|
||||
return (
|
||||
<div className="flex items-center gap-2">
|
||||
<span>
|
||||
{browser} ({os})
|
||||
</span>
|
||||
{isCurrentSession && (
|
||||
<Badge>
|
||||
<Trans>Current</Trans>
|
||||
</Badge>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
header: t`IP Address`,
|
||||
accessorKey: 'ipAddress',
|
||||
cell: ({ row }) => row.original.ipAddress || t`Unknown`,
|
||||
},
|
||||
{
|
||||
header: t`Last Active`,
|
||||
accessorKey: 'updatedAt',
|
||||
cell: ({ row }) => DateTime.fromJSDate(row.original.updatedAt).toRelative(),
|
||||
},
|
||||
{
|
||||
header: t`Created`,
|
||||
accessorKey: 'createdAt',
|
||||
cell: ({ row }) => DateTime.fromJSDate(row.original.createdAt).toRelative(),
|
||||
},
|
||||
{
|
||||
id: 'actions',
|
||||
cell: ({ row }) => (
|
||||
<SessionRevokeButton
|
||||
sessionId={row.original.id}
|
||||
isCurrentSession={row.original.id === session?.id}
|
||||
onSuccess={refetch}
|
||||
/>
|
||||
),
|
||||
},
|
||||
] satisfies DataTableColumnDef<(typeof results)[number]>[];
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div>
|
||||
<SettingsHeader
|
||||
title={t`Active sessions`}
|
||||
subtitle={t`View and manage all active sessions for your account.`}
|
||||
>
|
||||
<SessionLogoutAllDialog onSuccess={refetch} disabled={results.length === 1 || isLoading} />
|
||||
</SettingsHeader>
|
||||
|
||||
<div className="mt-4">
|
||||
<DataTable
|
||||
columns={columns}
|
||||
data={results}
|
||||
hasFilters={false}
|
||||
error={{
|
||||
enable: isLoadingError,
|
||||
}}
|
||||
skeleton={{
|
||||
enable: isLoading,
|
||||
rows: 3,
|
||||
component: (
|
||||
<>
|
||||
<TableCell>
|
||||
<Skeleton className="h-4 w-40 rounded-full" />
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<Skeleton className="h-4 w-24 rounded-full" />
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<Skeleton className="h-4 w-24 rounded-full" />
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<Skeleton className="h-4 w-24 rounded-full" />
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<Skeleton className="h-8 w-16 rounded" />
|
||||
</TableCell>
|
||||
</>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
type SessionRevokeButtonProps = {
|
||||
sessionId: string;
|
||||
isCurrentSession: boolean;
|
||||
onSuccess: () => Promise<unknown>;
|
||||
};
|
||||
|
||||
const SessionRevokeButton = ({
|
||||
sessionId,
|
||||
isCurrentSession,
|
||||
onSuccess,
|
||||
}: SessionRevokeButtonProps) => {
|
||||
const { toast } = useToast();
|
||||
const { t } = useLingui();
|
||||
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
|
||||
const handleRevoke = async () => {
|
||||
setIsLoading(true);
|
||||
try {
|
||||
await authClient.signOutSession({
|
||||
sessionId,
|
||||
redirectPath: isCurrentSession ? '/signin' : undefined,
|
||||
});
|
||||
|
||||
if (!isCurrentSession) {
|
||||
await onSuccess();
|
||||
}
|
||||
|
||||
toast({
|
||||
title: t`Session revoked`,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
|
||||
toast({
|
||||
title: t`Error`,
|
||||
description: t`Failed to revoke session`,
|
||||
variant: 'destructive',
|
||||
});
|
||||
}
|
||||
|
||||
setIsLoading(false);
|
||||
};
|
||||
|
||||
return (
|
||||
<Button variant="destructive" size="sm" onClick={handleRevoke} loading={isLoading}>
|
||||
<Trans>Revoke</Trans>
|
||||
</Button>
|
||||
);
|
||||
};
|
||||
@ -100,5 +100,5 @@
|
||||
"vite-plugin-babel-macros": "^1.0.6",
|
||||
"vite-tsconfig-paths": "^5.1.4"
|
||||
},
|
||||
"version": "1.12.0-rc.3"
|
||||
"version": "1.12.0-rc.4"
|
||||
}
|
||||
|
||||
6
package-lock.json
generated
6
package-lock.json
generated
@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@documenso/root",
|
||||
"version": "1.12.0-rc.3",
|
||||
"version": "1.12.0-rc.4",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@documenso/root",
|
||||
"version": "1.12.0-rc.3",
|
||||
"version": "1.12.0-rc.4",
|
||||
"workspaces": [
|
||||
"apps/*",
|
||||
"packages/*"
|
||||
@ -89,7 +89,7 @@
|
||||
},
|
||||
"apps/remix": {
|
||||
"name": "@documenso/remix",
|
||||
"version": "1.12.0-rc.3",
|
||||
"version": "1.12.0-rc.4",
|
||||
"dependencies": {
|
||||
"@documenso/api": "*",
|
||||
"@documenso/assets": "*",
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"private": true,
|
||||
"version": "1.12.0-rc.3",
|
||||
"version": "1.12.0-rc.4",
|
||||
"scripts": {
|
||||
"build": "turbo run build",
|
||||
"dev": "turbo run dev --filter=@documenso/remix",
|
||||
|
||||
@ -176,8 +176,16 @@ export const ZCreateDocumentMutationSchema = z.object({
|
||||
.default({}),
|
||||
authOptions: z
|
||||
.object({
|
||||
globalAccessAuth: z.array(ZDocumentAccessAuthTypesSchema).optional().default([]),
|
||||
globalActionAuth: z.array(ZDocumentActionAuthTypesSchema).optional().default([]),
|
||||
globalAccessAuth: z
|
||||
.union([ZDocumentAccessAuthTypesSchema, z.array(ZDocumentAccessAuthTypesSchema)])
|
||||
.transform((val) => (Array.isArray(val) ? val : [val]))
|
||||
.optional()
|
||||
.default([]),
|
||||
globalActionAuth: z
|
||||
.union([ZDocumentActionAuthTypesSchema, z.array(ZDocumentActionAuthTypesSchema)])
|
||||
.transform((val) => (Array.isArray(val) ? val : [val]))
|
||||
.optional()
|
||||
.default([]),
|
||||
})
|
||||
.optional()
|
||||
.openapi({
|
||||
@ -236,8 +244,16 @@ export const ZCreateDocumentFromTemplateMutationSchema = z.object({
|
||||
.optional(),
|
||||
authOptions: z
|
||||
.object({
|
||||
globalAccessAuth: z.array(ZDocumentAccessAuthTypesSchema).optional().default([]),
|
||||
globalActionAuth: z.array(ZDocumentActionAuthTypesSchema).optional().default([]),
|
||||
globalAccessAuth: z
|
||||
.union([ZDocumentAccessAuthTypesSchema, z.array(ZDocumentAccessAuthTypesSchema)])
|
||||
.transform((val) => (Array.isArray(val) ? val : [val]))
|
||||
.optional()
|
||||
.default([]),
|
||||
globalActionAuth: z
|
||||
.union([ZDocumentActionAuthTypesSchema, z.array(ZDocumentActionAuthTypesSchema)])
|
||||
.transform((val) => (Array.isArray(val) ? val : [val]))
|
||||
.optional()
|
||||
.default([]),
|
||||
})
|
||||
.optional(),
|
||||
formValues: z.record(z.string(), z.union([z.string(), z.boolean(), z.number()])).optional(),
|
||||
@ -309,8 +325,16 @@ export const ZGenerateDocumentFromTemplateMutationSchema = z.object({
|
||||
.optional(),
|
||||
authOptions: z
|
||||
.object({
|
||||
globalAccessAuth: z.array(ZDocumentAccessAuthTypesSchema).optional().default([]),
|
||||
globalActionAuth: z.array(ZDocumentActionAuthTypesSchema).optional().default([]),
|
||||
globalAccessAuth: z
|
||||
.union([ZDocumentAccessAuthTypesSchema, z.array(ZDocumentAccessAuthTypesSchema)])
|
||||
.transform((val) => (Array.isArray(val) ? val : [val]))
|
||||
.optional()
|
||||
.default([]),
|
||||
globalActionAuth: z
|
||||
.union([ZDocumentActionAuthTypesSchema, z.array(ZDocumentActionAuthTypesSchema)])
|
||||
.transform((val) => (Array.isArray(val) ? val : [val]))
|
||||
.optional()
|
||||
.default([]),
|
||||
})
|
||||
.optional(),
|
||||
formValues: z.record(z.string(), z.union([z.string(), z.boolean(), z.number()])).optional(),
|
||||
@ -349,7 +373,11 @@ export const ZCreateRecipientMutationSchema = z.object({
|
||||
signingOrder: z.number().nullish(),
|
||||
authOptions: z
|
||||
.object({
|
||||
actionAuth: z.array(ZRecipientActionAuthTypesSchema).optional().default([]),
|
||||
actionAuth: z
|
||||
.union([ZRecipientActionAuthTypesSchema, z.array(ZRecipientActionAuthTypesSchema)])
|
||||
.transform((val) => (Array.isArray(val) ? val : [val]))
|
||||
.optional()
|
||||
.default([]),
|
||||
})
|
||||
.optional()
|
||||
.openapi({
|
||||
|
||||
82
packages/app-tests/e2e/user/auth-sessions.spec.ts
Normal file
82
packages/app-tests/e2e/user/auth-sessions.spec.ts
Normal file
@ -0,0 +1,82 @@
|
||||
import { type Page, expect, test } from '@playwright/test';
|
||||
|
||||
import { seedUser } from '@documenso/prisma/seed/users';
|
||||
|
||||
import { apiSignin } from '../fixtures/authentication';
|
||||
import { expectTextToBeVisible } from '../fixtures/generic';
|
||||
|
||||
test('[USER] revoke sessions', async ({ page }: { page: Page }) => {
|
||||
const { user, team } = await seedUser();
|
||||
|
||||
await apiSignin({
|
||||
page,
|
||||
email: user.email,
|
||||
password: 'password',
|
||||
redirectPath: '/settings/security/sessions',
|
||||
});
|
||||
|
||||
// Expect 2 rows length (header + 1)
|
||||
await expect(page.getByRole('row')).toHaveCount(2);
|
||||
|
||||
// Clear cookies
|
||||
await page.context().clearCookies();
|
||||
|
||||
await apiSignin({
|
||||
page,
|
||||
email: user.email,
|
||||
password: 'password',
|
||||
redirectPath: '/settings/security/sessions',
|
||||
});
|
||||
|
||||
await page.context().clearCookies();
|
||||
|
||||
await apiSignin({
|
||||
page,
|
||||
email: user.email,
|
||||
password: 'password',
|
||||
redirectPath: '/settings/security/sessions',
|
||||
});
|
||||
|
||||
// Expect 4 (3 sessions + 1 header) rows length
|
||||
await expect(page.getByRole('row')).toHaveCount(4);
|
||||
|
||||
// Revoke all sessions
|
||||
await page.getByRole('button', { name: 'Revoke all sessions' }).click();
|
||||
await page.getByRole('button', { name: 'Revoke all sessions' }).click();
|
||||
|
||||
await expectTextToBeVisible(page, 'Sessions have been revoked');
|
||||
|
||||
// Expect (1 sessions + 1 header) rows length
|
||||
await expect(page.getByRole('row')).toHaveCount(2);
|
||||
|
||||
await page.context().clearCookies();
|
||||
|
||||
await apiSignin({
|
||||
page,
|
||||
email: user.email,
|
||||
password: 'password',
|
||||
redirectPath: '/settings/security/sessions',
|
||||
});
|
||||
|
||||
// Find table row which does not have text 'Current' and click the button called Revoke within the row.
|
||||
await page
|
||||
.getByRole('row')
|
||||
.filter({ hasNotText: 'Current' })
|
||||
.nth(1)
|
||||
.getByRole('button', { name: 'Revoke' })
|
||||
.click();
|
||||
await expectTextToBeVisible(page, 'Session revoked');
|
||||
|
||||
// Expect (1 sessions + 1 header) rows length
|
||||
await expect(page.getByRole('row')).toHaveCount(2);
|
||||
|
||||
// Revoke own session.
|
||||
await page
|
||||
.getByRole('row')
|
||||
.filter({ hasText: 'Current' })
|
||||
.first()
|
||||
.getByRole('button', { name: 'Revoke' })
|
||||
.click();
|
||||
|
||||
await expect(page).toHaveURL('/signin');
|
||||
});
|
||||
@ -7,6 +7,7 @@ import { AppError } from '@documenso/lib/errors/app-error';
|
||||
|
||||
import type { AuthAppType } from '../server';
|
||||
import type { SessionValidationResult } from '../server/lib/session/session';
|
||||
import type { ActiveSession } from '../server/lib/utils/get-session';
|
||||
import { handleSignInRedirect } from '../server/lib/utils/redirect';
|
||||
import type {
|
||||
TDisableTwoFactorRequestSchema,
|
||||
@ -47,6 +48,26 @@ export class AuthClient {
|
||||
window.location.href = redirectPath ?? this.signOutredirectPath;
|
||||
}
|
||||
|
||||
public async signOutAllSessions() {
|
||||
await this.client['signout-all'].$post();
|
||||
}
|
||||
|
||||
public async signOutSession({
|
||||
sessionId,
|
||||
redirectPath,
|
||||
}: {
|
||||
sessionId: string;
|
||||
redirectPath?: string;
|
||||
}) {
|
||||
await this.client['signout-session'].$post({
|
||||
json: { sessionId },
|
||||
});
|
||||
|
||||
if (redirectPath) {
|
||||
window.location.href = redirectPath;
|
||||
}
|
||||
}
|
||||
|
||||
public async getSession() {
|
||||
const response = await this.client['session-json'].$get();
|
||||
|
||||
@ -57,6 +78,16 @@ export class AuthClient {
|
||||
return superjson.deserialize<SessionValidationResult>(result);
|
||||
}
|
||||
|
||||
public async getSessions() {
|
||||
const response = await this.client['sessions'].$get();
|
||||
|
||||
await this.handleError(response);
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
return superjson.deserialize<{ sessions: ActiveSession[] }>(result);
|
||||
}
|
||||
|
||||
private async handleError<T>(response: ClientResponse<T>): Promise<void> {
|
||||
if (!response.ok) {
|
||||
const error = await response.json();
|
||||
|
||||
@ -1,2 +1 @@
|
||||
export * from './server/lib/errors/errors';
|
||||
export * from './server/lib/errors/error-codes';
|
||||
|
||||
@ -2,6 +2,7 @@ import { sha256 } from '@oslojs/crypto/sha2';
|
||||
import { encodeBase32LowerCaseNoPadding, encodeHexLowerCase } from '@oslojs/encoding';
|
||||
import { type Session, type User, UserSecurityAuditLogType } from '@prisma/client';
|
||||
|
||||
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
|
||||
import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
|
||||
import { prisma } from '@documenso/prisma';
|
||||
|
||||
@ -129,18 +130,46 @@ export const validateSessionToken = async (token: string): Promise<SessionValida
|
||||
return { session, user, isAuthenticated: true };
|
||||
};
|
||||
|
||||
export const invalidateSession = async (
|
||||
sessionId: string,
|
||||
metadata: RequestMetadata,
|
||||
): Promise<void> => {
|
||||
const session = await prisma.session.delete({ where: { id: sessionId } });
|
||||
type InvalidateSessionsOptions = {
|
||||
userId: number;
|
||||
sessionIds: string[];
|
||||
metadata: RequestMetadata;
|
||||
isRevoke?: boolean;
|
||||
};
|
||||
|
||||
await prisma.userSecurityAuditLog.create({
|
||||
data: {
|
||||
userId: session.userId,
|
||||
ipAddress: metadata.ipAddress,
|
||||
userAgent: metadata.userAgent,
|
||||
type: UserSecurityAuditLogType.SIGN_OUT,
|
||||
},
|
||||
export const invalidateSessions = async ({
|
||||
userId,
|
||||
sessionIds,
|
||||
metadata,
|
||||
isRevoke,
|
||||
}: InvalidateSessionsOptions): Promise<void> => {
|
||||
if (sessionIds.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
await prisma.$transaction(async (tx) => {
|
||||
const { count } = await tx.session.deleteMany({
|
||||
where: {
|
||||
userId,
|
||||
id: { in: sessionIds },
|
||||
},
|
||||
});
|
||||
|
||||
if (count !== sessionIds.length) {
|
||||
throw new AppError(AppErrorCode.INVALID_REQUEST, {
|
||||
message: 'One or more sessions are not valid.',
|
||||
});
|
||||
}
|
||||
|
||||
await tx.userSecurityAuditLog.createMany({
|
||||
data: sessionIds.map(() => ({
|
||||
userId,
|
||||
ipAddress: metadata.ipAddress,
|
||||
userAgent: metadata.userAgent,
|
||||
type: isRevoke
|
||||
? UserSecurityAuditLogType.SESSION_REVOKED
|
||||
: UserSecurityAuditLogType.SIGN_OUT,
|
||||
})),
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
import type { Session } from '@prisma/client';
|
||||
import type { Context } from 'hono';
|
||||
|
||||
import { AppError } from '@documenso/lib/errors/app-error';
|
||||
import { prisma } from '@documenso/prisma';
|
||||
|
||||
import { AuthenticationErrorCode } from '../errors/error-codes';
|
||||
import type { SessionValidationResult } from '../session/session';
|
||||
@ -37,6 +39,33 @@ export const getOptionalSession = async (
|
||||
return await validateSessionToken(sessionId);
|
||||
};
|
||||
|
||||
export type ActiveSession = Omit<Session, 'sessionToken'>;
|
||||
|
||||
export const getActiveSessions = async (c: Context | Request): Promise<ActiveSession[]> => {
|
||||
const { user } = await getSession(c);
|
||||
|
||||
return await prisma.session.findMany({
|
||||
where: {
|
||||
userId: user.id,
|
||||
expiresAt: {
|
||||
gt: new Date(),
|
||||
},
|
||||
},
|
||||
orderBy: {
|
||||
updatedAt: 'desc',
|
||||
},
|
||||
select: {
|
||||
id: true,
|
||||
userId: true,
|
||||
expiresAt: true,
|
||||
updatedAt: true,
|
||||
createdAt: true,
|
||||
ipAddress: true,
|
||||
userAgent: true,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Todo: (RR7) Rethink, this is pretty sketchy.
|
||||
*/
|
||||
|
||||
@ -2,7 +2,7 @@ import { Hono } from 'hono';
|
||||
import superjson from 'superjson';
|
||||
|
||||
import type { SessionValidationResult } from '../lib/session/session';
|
||||
import { getOptionalSession } from '../lib/utils/get-session';
|
||||
import { getActiveSessions, getOptionalSession } from '../lib/utils/get-session';
|
||||
|
||||
export const sessionRoute = new Hono()
|
||||
.get('/session', async (c) => {
|
||||
@ -10,6 +10,11 @@ export const sessionRoute = new Hono()
|
||||
|
||||
return c.json(session);
|
||||
})
|
||||
.get('/sessions', async (c) => {
|
||||
const sessions = await getActiveSessions(c);
|
||||
|
||||
return c.json(superjson.serialize({ sessions }));
|
||||
})
|
||||
.get('/session-json', async (c) => {
|
||||
const session: SessionValidationResult = await getOptionalSession(c);
|
||||
|
||||
|
||||
@ -1,27 +1,114 @@
|
||||
import { sValidator } from '@hono/standard-validator';
|
||||
import { Hono } from 'hono';
|
||||
import { z } from 'zod';
|
||||
|
||||
import { invalidateSession, validateSessionToken } from '../lib/session/session';
|
||||
import { prisma } from '@documenso/prisma';
|
||||
|
||||
import { invalidateSessions, validateSessionToken } from '../lib/session/session';
|
||||
import { deleteSessionCookie, getSessionCookie } from '../lib/session/session-cookies';
|
||||
import type { HonoAuthContext } from '../types/context';
|
||||
|
||||
export const signOutRoute = new Hono<HonoAuthContext>().post('/signout', async (c) => {
|
||||
const metadata = c.get('requestMetadata');
|
||||
|
||||
const sessionId = await getSessionCookie(c);
|
||||
|
||||
if (!sessionId) {
|
||||
return new Response('No session found', { status: 401 });
|
||||
}
|
||||
|
||||
const { session } = await validateSessionToken(sessionId);
|
||||
|
||||
if (!session) {
|
||||
return new Response('No session found', { status: 401 });
|
||||
}
|
||||
|
||||
await invalidateSession(session.id, metadata);
|
||||
|
||||
deleteSessionCookie(c);
|
||||
|
||||
return c.status(200);
|
||||
const ZSignoutSessionSchema = z.object({
|
||||
sessionId: z.string().trim().min(1),
|
||||
});
|
||||
|
||||
export const signOutRoute = new Hono<HonoAuthContext>()
|
||||
.post('/signout', async (c) => {
|
||||
const metadata = c.get('requestMetadata');
|
||||
|
||||
const sessionToken = await getSessionCookie(c);
|
||||
|
||||
if (!sessionToken) {
|
||||
return new Response('No session found', { status: 401 });
|
||||
}
|
||||
|
||||
const { session } = await validateSessionToken(sessionToken);
|
||||
|
||||
if (!session) {
|
||||
deleteSessionCookie(c);
|
||||
return new Response('No session found', { status: 401 });
|
||||
}
|
||||
|
||||
await invalidateSessions({
|
||||
userId: session.userId,
|
||||
sessionIds: [session.id],
|
||||
metadata,
|
||||
isRevoke: false,
|
||||
});
|
||||
|
||||
deleteSessionCookie(c);
|
||||
|
||||
return c.status(200);
|
||||
})
|
||||
.post('/signout-all', async (c) => {
|
||||
const metadata = c.get('requestMetadata');
|
||||
|
||||
const sessionToken = await getSessionCookie(c);
|
||||
|
||||
if (!sessionToken) {
|
||||
return new Response('No session found', { status: 401 });
|
||||
}
|
||||
|
||||
const { session } = await validateSessionToken(sessionToken);
|
||||
|
||||
if (!session) {
|
||||
deleteSessionCookie(c);
|
||||
return new Response('No session found', { status: 401 });
|
||||
}
|
||||
|
||||
const userId = session.userId;
|
||||
|
||||
const userSessionIds = await prisma.session
|
||||
.findMany({
|
||||
where: {
|
||||
userId,
|
||||
id: {
|
||||
not: session.id,
|
||||
},
|
||||
},
|
||||
select: {
|
||||
id: true,
|
||||
},
|
||||
})
|
||||
.then((sessions) => sessions.map((session) => session.id));
|
||||
|
||||
await invalidateSessions({
|
||||
userId,
|
||||
sessionIds: userSessionIds,
|
||||
metadata,
|
||||
isRevoke: true,
|
||||
});
|
||||
|
||||
return c.status(200);
|
||||
})
|
||||
.post('/signout-session', sValidator('json', ZSignoutSessionSchema), async (c) => {
|
||||
const metadata = c.get('requestMetadata');
|
||||
|
||||
const { sessionId: sessionIdToRevoke } = c.req.valid('json');
|
||||
|
||||
const sessionToken = await getSessionCookie(c);
|
||||
|
||||
if (!sessionToken) {
|
||||
return new Response('No session found', { status: 401 });
|
||||
}
|
||||
|
||||
const { session } = await validateSessionToken(sessionToken);
|
||||
|
||||
if (!session) {
|
||||
deleteSessionCookie(c);
|
||||
return new Response('No session found', { status: 401 });
|
||||
}
|
||||
|
||||
await invalidateSessions({
|
||||
userId: session.userId,
|
||||
sessionIds: [sessionIdToRevoke],
|
||||
metadata,
|
||||
isRevoke: true,
|
||||
});
|
||||
|
||||
if (session.id === sessionIdToRevoke) {
|
||||
deleteSessionCookie(c);
|
||||
}
|
||||
|
||||
return c.status(200);
|
||||
});
|
||||
|
||||
@ -31,6 +31,7 @@ export const USER_SECURITY_AUDIT_LOG_MAP: Record<string, string> = {
|
||||
PASSKEY_UPDATED: 'Passkey updated',
|
||||
PASSWORD_RESET: 'Password reset',
|
||||
PASSWORD_UPDATE: 'Password updated',
|
||||
SESSION_REVOKED: 'Session revoked',
|
||||
SIGN_OUT: 'Signed Out',
|
||||
SIGN_IN: 'Signed In',
|
||||
SIGN_IN_FAIL: 'Sign in attempt failed',
|
||||
|
||||
@ -752,6 +752,11 @@ msgstr "Aktionen"
|
||||
msgid "Active"
|
||||
msgstr "Aktiv"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "Active sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
|
||||
msgid "Active Subscriptions"
|
||||
msgstr "Aktive Abonnements"
|
||||
@ -817,13 +822,13 @@ msgstr "Felder hinzufügen"
|
||||
msgid "Add group roles"
|
||||
msgstr "Gruppenrollen hinzufügen"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Add groups"
|
||||
msgstr "Gruppen hinzufügen"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Add members"
|
||||
msgstr "Mitglieder hinzufügen"
|
||||
|
||||
@ -1614,6 +1619,7 @@ msgstr "Kann vorbereiten"
|
||||
#: apps/remix/app/components/dialogs/team-delete-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@ -2221,6 +2227,7 @@ msgstr "Erstellen Sie Ihr Konto und beginnen Sie mit dem modernen Dokumentensign
|
||||
msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
||||
msgstr "Erstellen Sie Ihr Konto und beginnen Sie mit dem modernen Dokumentensignieren. Offenes und schönes Signieren liegt in Ihrer Reichweite."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
|
||||
#: apps/remix/app/components/tables/templates-table.tsx
|
||||
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx
|
||||
@ -2260,6 +2267,10 @@ msgstr "Erstellt am {0}"
|
||||
msgid "CSV Structure"
|
||||
msgstr "CSV-Struktur"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Current"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/password.tsx
|
||||
msgid "Current Password"
|
||||
msgstr "Aktuelles Passwort"
|
||||
@ -2453,6 +2464,7 @@ msgid "Details"
|
||||
msgstr "Einzelheiten"
|
||||
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/tables/settings-security-activity-table.tsx
|
||||
msgid "Device"
|
||||
msgstr "Gerät"
|
||||
@ -3179,6 +3191,7 @@ msgstr "Unternehmen"
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/template.edit.$id.tsx
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
|
||||
@ -3221,6 +3234,7 @@ msgstr "Unternehmen"
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
|
||||
@ -3286,10 +3300,18 @@ msgstr "Fehler beim Laden des Dokuments"
|
||||
msgid "Failed to reseal document"
|
||||
msgstr "Dokument konnte nicht erneut versiegelt werden"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Failed to revoke session"
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
|
||||
msgid "Failed to save settings."
|
||||
msgstr "Einstellungen konnten nicht gespeichert werden."
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Failed to sign out all sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
msgid "Failed to update document"
|
||||
msgstr "Dokument konnte nicht aktualisiert werden"
|
||||
@ -3747,7 +3769,6 @@ msgstr "Ungültiger Code. Bitte versuchen Sie es erneut."
|
||||
msgid "Invalid email"
|
||||
msgstr "Ungültige E-Mail"
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
msgid "Invalid link"
|
||||
msgstr "Ungültiger Link"
|
||||
@ -3811,6 +3832,7 @@ msgid "Invoice"
|
||||
msgstr "Rechnung"
|
||||
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/tables/internal-audit-log-table.tsx
|
||||
msgid "IP Address"
|
||||
msgstr "IP-Adresse"
|
||||
@ -3881,6 +3903,10 @@ msgstr "Die letzten 30 Tage"
|
||||
msgid "Last 7 days"
|
||||
msgstr "Die letzten 7 Tage"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Last Active"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/template/template-page-view-information.tsx
|
||||
#: apps/remix/app/components/general/document/document-page-view-information.tsx
|
||||
msgid "Last modified"
|
||||
@ -4030,6 +4056,10 @@ msgstr "Passkeys verwalten"
|
||||
msgid "Manage permissions and access controls"
|
||||
msgstr "Verwalten Sie Berechtigungen und Zugangskontrollen"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "Manage sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Manage subscription"
|
||||
@ -5305,7 +5335,6 @@ msgstr "Aufbewahrung von Dokumenten"
|
||||
msgid "Retry"
|
||||
msgstr "Wiederholen"
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
|
||||
@ -5321,6 +5350,7 @@ msgstr "Zurück zur Startseite"
|
||||
msgid "Return to sign in"
|
||||
msgstr "Zurück zur Anmeldung"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/general/teams/team-email-usage.tsx
|
||||
msgid "Revoke"
|
||||
msgstr "Zugriff widerrufen"
|
||||
@ -5329,6 +5359,12 @@ msgstr "Zugriff widerrufen"
|
||||
msgid "Revoke access"
|
||||
msgstr "Zugriff widerrufen"
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Revoke all sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/tables/user-organisations-table.tsx
|
||||
#: apps/remix/app/components/tables/team-members-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
@ -5481,6 +5517,10 @@ msgstr "Standardoption auswählen"
|
||||
msgid "Select groups"
|
||||
msgstr "Gruppen auswählen"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select groups of members to add to the team."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select groups to add to this team"
|
||||
msgstr "Wählen Sie Gruppen aus, die diesem Team hinzugefügt werden sollen"
|
||||
@ -5492,7 +5532,6 @@ msgid "Select members"
|
||||
msgstr "Mitglieder auswählen"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select members or groups of members to add to the team."
|
||||
msgstr "Wählen Sie Mitglieder oder Gruppen von Mitgliedern, die dem Team hinzugefügt werden sollen."
|
||||
|
||||
@ -5602,6 +5641,14 @@ msgstr "Senden..."
|
||||
msgid "Sent"
|
||||
msgstr "Gesendet"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Sessions have been revoked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Set a password"
|
||||
msgstr "Ein Passwort festlegen"
|
||||
@ -6476,7 +6523,8 @@ msgid "The following team has been deleted. You will no longer be able to access
|
||||
msgstr "Das folgende Team wurde gelöscht. Sie können nicht mehr auf dieses Team und seine Dokumente zugreifen."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "The organisation group you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation group you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Die Organisationsgruppe, nach der Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
|
||||
|
||||
@ -6485,12 +6533,14 @@ msgid "The organisation role that will be applied to all members in this group."
|
||||
msgstr "Die Organisationsrolle, die auf alle Mitglieder in dieser Gruppe angewendet wird."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Die Organisation, nach der Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/_layout.tsx
|
||||
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Die Organisation, nach der Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
|
||||
|
||||
@ -6574,12 +6624,14 @@ msgid "The team email <0>{teamEmail}</0> has been removed from the following tea
|
||||
msgstr "Die Team-E-Mail <0>{teamEmail}</0> wurde aus dem folgenden Team entfernt"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/_layout.tsx
|
||||
msgid "The team you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The team you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Das Team, das Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
|
||||
msgid "The team you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The team you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Das Team, das Sie suchen, könnte entfernt, umbenannt oder nie existiert haben."
|
||||
|
||||
@ -6617,7 +6669,8 @@ msgid "The URL for Documenso to send webhook events to."
|
||||
msgstr "Die URL für Documenso, um Webhook-Ereignisse zu senden."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
|
||||
msgid "The user you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The user you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Der Benutzer, nach dem Sie suchen, wurde möglicherweise entfernt, umbenannt oder hat möglicherweise nie existiert."
|
||||
|
||||
@ -6784,10 +6837,6 @@ msgstr "So wird das Dokument die Empfänger erreichen, sobald es zum Unterschrei
|
||||
msgid "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
|
||||
msgstr "Dies ist der Anspruch, mit dem diese Organisation ursprünglich erstellt wurde. Alle Änderungen an Funktionsflags für diesen Anspruch werden in diese Organisation übernommen."
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
msgid "This link is invalid or has expired."
|
||||
msgstr "Dieser Link ist ungültig oder abgelaufen."
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
msgid "This link is invalid or has expired. Please contact your team to resend a verification."
|
||||
msgstr "Dieser Link ist ungültig oder abgelaufen. Bitte kontaktieren Sie Ihr Team, um eine neue Bestätigungsanfrage zu senden."
|
||||
@ -6858,6 +6907,10 @@ msgstr "Dies wird an den Dokumenteneigentümer gesendet, sobald das Dokument vol
|
||||
msgid "This will ONLY backport feature flags which are set to true, anything disabled in the initial claim will not be backported"
|
||||
msgstr "Diese werden NUR Funktionsflags zurückspielen, die auf wahr gesetzt sind; alles, was im ursprünglichen Anspruch deaktiviert ist, wird nicht zurückportiert."
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "This will sign you out of all other devices. You will need to sign in again on those devices to continue using your account."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/tables/internal-audit-log-table.tsx
|
||||
#: apps/remix/app/components/tables/document-logs-table.tsx
|
||||
msgid "Time"
|
||||
@ -7144,6 +7197,9 @@ msgstr "Unvollendet"
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Unknown"
|
||||
msgstr "Unbekannt"
|
||||
|
||||
@ -7497,6 +7553,11 @@ msgstr "Alle verwandten Dokumente anzeigen"
|
||||
msgid "View all security activity related to your account."
|
||||
msgstr "Sehen Sie sich alle Sicherheitsaktivitäten in Ihrem Konto an."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "View and manage all active sessions for your account."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
|
||||
msgid "View Codes"
|
||||
msgstr "Codes ansehen"
|
||||
@ -8563,4 +8624,3 @@ msgstr "Ihr Token wurde erfolgreich erstellt! Stellen Sie sicher, dass Sie es ko
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.tokens.tsx
|
||||
msgid "Your tokens will be shown here once you create them."
|
||||
msgstr "Ihre Tokens werden hier angezeigt, sobald Sie sie erstellt haben."
|
||||
|
||||
|
||||
@ -747,6 +747,11 @@ msgstr "Actions"
|
||||
msgid "Active"
|
||||
msgstr "Active"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "Active sessions"
|
||||
msgstr "Active sessions"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
|
||||
msgid "Active Subscriptions"
|
||||
msgstr "Active Subscriptions"
|
||||
@ -812,13 +817,13 @@ msgstr "Add Fields"
|
||||
msgid "Add group roles"
|
||||
msgstr "Add group roles"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Add groups"
|
||||
msgstr "Add groups"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Add members"
|
||||
msgstr "Add members"
|
||||
|
||||
@ -1609,6 +1614,7 @@ msgstr "Can prepare"
|
||||
#: apps/remix/app/components/dialogs/team-delete-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@ -2216,6 +2222,7 @@ msgstr "Create your account and start using state-of-the-art document signing."
|
||||
msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
||||
msgstr "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
|
||||
#: apps/remix/app/components/tables/templates-table.tsx
|
||||
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx
|
||||
@ -2255,6 +2262,10 @@ msgstr "Created on {0}"
|
||||
msgid "CSV Structure"
|
||||
msgstr "CSV Structure"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Current"
|
||||
msgstr "Current"
|
||||
|
||||
#: apps/remix/app/components/forms/password.tsx
|
||||
msgid "Current Password"
|
||||
msgstr "Current Password"
|
||||
@ -2448,6 +2459,7 @@ msgid "Details"
|
||||
msgstr "Details"
|
||||
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/tables/settings-security-activity-table.tsx
|
||||
msgid "Device"
|
||||
msgstr "Device"
|
||||
@ -3174,6 +3186,7 @@ msgstr "Enterprise"
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/template.edit.$id.tsx
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
|
||||
@ -3216,6 +3229,7 @@ msgstr "Enterprise"
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
|
||||
@ -3281,10 +3295,18 @@ msgstr "Failed to load document"
|
||||
msgid "Failed to reseal document"
|
||||
msgstr "Failed to reseal document"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Failed to revoke session"
|
||||
msgstr "Failed to revoke session"
|
||||
|
||||
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
|
||||
msgid "Failed to save settings."
|
||||
msgstr "Failed to save settings."
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Failed to sign out all sessions"
|
||||
msgstr "Failed to sign out all sessions"
|
||||
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
msgid "Failed to update document"
|
||||
msgstr "Failed to update document"
|
||||
@ -3742,7 +3764,6 @@ msgstr "Invalid code. Please try again."
|
||||
msgid "Invalid email"
|
||||
msgstr "Invalid email"
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
msgid "Invalid link"
|
||||
msgstr "Invalid link"
|
||||
@ -3806,6 +3827,7 @@ msgid "Invoice"
|
||||
msgstr "Invoice"
|
||||
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/tables/internal-audit-log-table.tsx
|
||||
msgid "IP Address"
|
||||
msgstr "IP Address"
|
||||
@ -3876,6 +3898,10 @@ msgstr "Last 30 days"
|
||||
msgid "Last 7 days"
|
||||
msgstr "Last 7 days"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Last Active"
|
||||
msgstr "Last Active"
|
||||
|
||||
#: apps/remix/app/components/general/template/template-page-view-information.tsx
|
||||
#: apps/remix/app/components/general/document/document-page-view-information.tsx
|
||||
msgid "Last modified"
|
||||
@ -4025,6 +4051,10 @@ msgstr "Manage passkeys"
|
||||
msgid "Manage permissions and access controls"
|
||||
msgstr "Manage permissions and access controls"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "Manage sessions"
|
||||
msgstr "Manage sessions"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Manage subscription"
|
||||
@ -5300,7 +5330,6 @@ msgstr "Retention of Documents"
|
||||
msgid "Retry"
|
||||
msgstr "Retry"
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
|
||||
@ -5316,6 +5345,7 @@ msgstr "Return to Home"
|
||||
msgid "Return to sign in"
|
||||
msgstr "Return to sign in"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/general/teams/team-email-usage.tsx
|
||||
msgid "Revoke"
|
||||
msgstr "Revoke"
|
||||
@ -5324,6 +5354,12 @@ msgstr "Revoke"
|
||||
msgid "Revoke access"
|
||||
msgstr "Revoke access"
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Revoke all sessions"
|
||||
msgstr "Revoke all sessions"
|
||||
|
||||
#: apps/remix/app/components/tables/user-organisations-table.tsx
|
||||
#: apps/remix/app/components/tables/team-members-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
@ -5476,6 +5512,10 @@ msgstr "Select default option"
|
||||
msgid "Select groups"
|
||||
msgstr "Select groups"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select groups of members to add to the team."
|
||||
msgstr "Select groups of members to add to the team."
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select groups to add to this team"
|
||||
msgstr "Select groups to add to this team"
|
||||
@ -5487,7 +5527,6 @@ msgid "Select members"
|
||||
msgstr "Select members"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select members or groups of members to add to the team."
|
||||
msgstr "Select members or groups of members to add to the team."
|
||||
|
||||
@ -5597,6 +5636,14 @@ msgstr "Sending..."
|
||||
msgid "Sent"
|
||||
msgstr "Sent"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr "Session revoked"
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Sessions have been revoked"
|
||||
msgstr "Sessions have been revoked"
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Set a password"
|
||||
msgstr "Set a password"
|
||||
@ -6797,10 +6844,6 @@ msgstr "This is how the document will reach the recipients once the document is
|
||||
msgid "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
|
||||
msgstr "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
msgid "This link is invalid or has expired."
|
||||
msgstr "This link is invalid or has expired."
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
msgid "This link is invalid or has expired. Please contact your team to resend a verification."
|
||||
msgstr "This link is invalid or has expired. Please contact your team to resend a verification."
|
||||
@ -6871,6 +6914,10 @@ msgstr "This will be sent to the document owner once the document has been fully
|
||||
msgid "This will ONLY backport feature flags which are set to true, anything disabled in the initial claim will not be backported"
|
||||
msgstr "This will ONLY backport feature flags which are set to true, anything disabled in the initial claim will not be backported"
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "This will sign you out of all other devices. You will need to sign in again on those devices to continue using your account."
|
||||
msgstr "This will sign you out of all other devices. You will need to sign in again on those devices to continue using your account."
|
||||
|
||||
#: apps/remix/app/components/tables/internal-audit-log-table.tsx
|
||||
#: apps/remix/app/components/tables/document-logs-table.tsx
|
||||
msgid "Time"
|
||||
@ -7157,6 +7204,9 @@ msgstr "Uncompleted"
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Unknown"
|
||||
msgstr "Unknown"
|
||||
|
||||
@ -7510,6 +7560,11 @@ msgstr "View all related documents"
|
||||
msgid "View all security activity related to your account."
|
||||
msgstr "View all security activity related to your account."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "View and manage all active sessions for your account."
|
||||
msgstr "View and manage all active sessions for your account."
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
|
||||
msgid "View Codes"
|
||||
msgstr "View Codes"
|
||||
|
||||
@ -752,6 +752,11 @@ msgstr "Acciones"
|
||||
msgid "Active"
|
||||
msgstr "Activo"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "Active sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
|
||||
msgid "Active Subscriptions"
|
||||
msgstr "Suscripciones Activas"
|
||||
@ -817,13 +822,13 @@ msgstr "Agregar Campos"
|
||||
msgid "Add group roles"
|
||||
msgstr "Agregar roles de grupo"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Add groups"
|
||||
msgstr "Agregar grupos"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Add members"
|
||||
msgstr "Agregar miembros"
|
||||
|
||||
@ -1614,6 +1619,7 @@ msgstr "Puede preparar"
|
||||
#: apps/remix/app/components/dialogs/team-delete-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@ -2221,6 +2227,7 @@ msgstr "Crea tu cuenta y comienza a utilizar la firma de documentos de última g
|
||||
msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
||||
msgstr "Crea tu cuenta y comienza a utilizar la firma de documentos de última generación. La firma abierta y hermosa está al alcance de tu mano."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
|
||||
#: apps/remix/app/components/tables/templates-table.tsx
|
||||
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx
|
||||
@ -2260,6 +2267,10 @@ msgstr "Creado el {0}"
|
||||
msgid "CSV Structure"
|
||||
msgstr "Estructura CSV"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Current"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/password.tsx
|
||||
msgid "Current Password"
|
||||
msgstr "Contraseña actual"
|
||||
@ -2453,6 +2464,7 @@ msgid "Details"
|
||||
msgstr "Detalles"
|
||||
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/tables/settings-security-activity-table.tsx
|
||||
msgid "Device"
|
||||
msgstr "Dispositivo"
|
||||
@ -3179,6 +3191,7 @@ msgstr "Enterprise"
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/template.edit.$id.tsx
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
|
||||
@ -3221,6 +3234,7 @@ msgstr "Enterprise"
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
|
||||
@ -3286,10 +3300,18 @@ msgstr "Error al cargar el documento"
|
||||
msgid "Failed to reseal document"
|
||||
msgstr "Falló al volver a sellar el documento"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Failed to revoke session"
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
|
||||
msgid "Failed to save settings."
|
||||
msgstr "Fallo al guardar configuraciones."
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Failed to sign out all sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
msgid "Failed to update document"
|
||||
msgstr "No se pudo actualizar el documento"
|
||||
@ -3747,7 +3769,6 @@ msgstr "Código inválido. Por favor, intenta nuevamente."
|
||||
msgid "Invalid email"
|
||||
msgstr "Email inválido"
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
msgid "Invalid link"
|
||||
msgstr "Enlace inválido"
|
||||
@ -3811,6 +3832,7 @@ msgid "Invoice"
|
||||
msgstr "Factura"
|
||||
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/tables/internal-audit-log-table.tsx
|
||||
msgid "IP Address"
|
||||
msgstr "Dirección IP"
|
||||
@ -3881,6 +3903,10 @@ msgstr "Últimos 30 días"
|
||||
msgid "Last 7 days"
|
||||
msgstr "Últimos 7 días"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Last Active"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/template/template-page-view-information.tsx
|
||||
#: apps/remix/app/components/general/document/document-page-view-information.tsx
|
||||
msgid "Last modified"
|
||||
@ -4030,6 +4056,10 @@ msgstr "Gestionar claves de acceso"
|
||||
msgid "Manage permissions and access controls"
|
||||
msgstr "Gestiona permisos y controles de acceso"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "Manage sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Manage subscription"
|
||||
@ -5305,7 +5335,6 @@ msgstr "Retención de Documentos"
|
||||
msgid "Retry"
|
||||
msgstr "Reintentar"
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
|
||||
@ -5321,6 +5350,7 @@ msgstr "Regresar a la página de inicio"
|
||||
msgid "Return to sign in"
|
||||
msgstr "Regresar para iniciar sesión"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/general/teams/team-email-usage.tsx
|
||||
msgid "Revoke"
|
||||
msgstr "Revocar"
|
||||
@ -5329,6 +5359,12 @@ msgstr "Revocar"
|
||||
msgid "Revoke access"
|
||||
msgstr "Revocar acceso"
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Revoke all sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/tables/user-organisations-table.tsx
|
||||
#: apps/remix/app/components/tables/team-members-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
@ -5481,6 +5517,10 @@ msgstr "Seleccionar opción predeterminada"
|
||||
msgid "Select groups"
|
||||
msgstr "Seleccionar grupos"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select groups of members to add to the team."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select groups to add to this team"
|
||||
msgstr "Seleccionar grupos para añadir a este equipo"
|
||||
@ -5492,7 +5532,6 @@ msgid "Select members"
|
||||
msgstr "Seleccione miembros"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select members or groups of members to add to the team."
|
||||
msgstr "Seleccione miembros o grupos de miembros para agregar al equipo."
|
||||
|
||||
@ -5602,6 +5641,14 @@ msgstr "Enviando..."
|
||||
msgid "Sent"
|
||||
msgstr "Enviado"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Sessions have been revoked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Set a password"
|
||||
msgstr "Establecer una contraseña"
|
||||
@ -6476,7 +6523,8 @@ msgid "The following team has been deleted. You will no longer be able to access
|
||||
msgstr "El siguiente equipo ha sido eliminado. Ya no podrá acceder a este equipo y sus documentos"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "The organisation group you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation group you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "El grupo de organización que está buscando puede haber sido eliminado, renombrado o puede que nunca haya existido."
|
||||
|
||||
@ -6485,12 +6533,14 @@ msgid "The organisation role that will be applied to all members in this group."
|
||||
msgstr "El rol de organización que se aplicará a todos los miembros de este grupo."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "La organización que está buscando puede haber sido eliminada, renombrada o puede que nunca haya existido."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/_layout.tsx
|
||||
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "La organización que está buscando puede haber sido eliminada, renombrada o puede que nunca haya existido."
|
||||
|
||||
@ -6574,14 +6624,17 @@ msgid "The team email <0>{teamEmail}</0> has been removed from the following tea
|
||||
msgstr "El correo electrónico del equipo <0>{teamEmail}</0> ha sido eliminado del siguiente equipo"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/_layout.tsx
|
||||
msgid "The team you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The team you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "El equipo que está buscando puede haber sido eliminado, renombrado o puede que nunca haya existido."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
|
||||
msgid "The team you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The team you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "El equipo que buscas puede haber sido eliminado, renombrado o quizás nunca\n"
|
||||
msgstr ""
|
||||
"El equipo que buscas puede haber sido eliminado, renombrado o quizás nunca\n"
|
||||
" existió."
|
||||
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
@ -6618,7 +6671,8 @@ msgid "The URL for Documenso to send webhook events to."
|
||||
msgstr "La URL para Documenso para enviar eventos de webhook."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
|
||||
msgid "The user you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The user you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "El usuario que está buscando puede haber sido eliminado, renombrado o puede que nunca haya existido."
|
||||
|
||||
@ -6785,10 +6839,6 @@ msgstr "Así es como el documento llegará a los destinatarios una vez que esté
|
||||
msgid "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
|
||||
msgstr "Esta es la reclamo con la que se creó inicialmente esta organización. Cualquier cambio en la bandera de características de esta reclamo se retroalimentará en esta organización."
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
msgid "This link is invalid or has expired."
|
||||
msgstr "Este enlace no es válido o ha expirado."
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
msgid "This link is invalid or has expired. Please contact your team to resend a verification."
|
||||
msgstr "Este enlace es inválido o ha expirado. Por favor, contacta a tu equipo para reenviar una verificación."
|
||||
@ -6859,6 +6909,10 @@ msgstr "Esto se enviará al propietario del documento una vez que el documento s
|
||||
msgid "This will ONLY backport feature flags which are set to true, anything disabled in the initial claim will not be backported"
|
||||
msgstr "Esto solo retroalimentará las banderas de características que estén configuradas como verdaderas, cualquier cosa desactivada en la reclamo inicial no será retroalimentada"
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "This will sign you out of all other devices. You will need to sign in again on those devices to continue using your account."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/tables/internal-audit-log-table.tsx
|
||||
#: apps/remix/app/components/tables/document-logs-table.tsx
|
||||
msgid "Time"
|
||||
@ -7145,6 +7199,9 @@ msgstr "Incompleto"
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Unknown"
|
||||
msgstr "Desconocido"
|
||||
|
||||
@ -7498,6 +7555,11 @@ msgstr "Ver todos los documentos relacionados"
|
||||
msgid "View all security activity related to your account."
|
||||
msgstr "Ver toda la actividad de seguridad relacionada con tu cuenta."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "View and manage all active sessions for your account."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
|
||||
msgid "View Codes"
|
||||
msgstr "Ver Códigos"
|
||||
@ -8564,4 +8626,3 @@ msgstr "¡Tu token se creó con éxito! ¡Asegúrate de copiarlo porque no podr
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.tokens.tsx
|
||||
msgid "Your tokens will be shown here once you create them."
|
||||
msgstr "Tus tokens se mostrarán aquí una vez que los crees."
|
||||
|
||||
|
||||
@ -752,6 +752,11 @@ msgstr "Actions"
|
||||
msgid "Active"
|
||||
msgstr "Actif"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "Active sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
|
||||
msgid "Active Subscriptions"
|
||||
msgstr "Abonnements actifs"
|
||||
@ -817,13 +822,13 @@ msgstr "Ajouter des champs"
|
||||
msgid "Add group roles"
|
||||
msgstr "Ajouter des rôles de groupe"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Add groups"
|
||||
msgstr "Ajouter des groupes"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Add members"
|
||||
msgstr "Ajouter des membres"
|
||||
|
||||
@ -1614,6 +1619,7 @@ msgstr "Peut préparer"
|
||||
#: apps/remix/app/components/dialogs/team-delete-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@ -2221,6 +2227,7 @@ msgstr "Créez votre compte et commencez à utiliser la signature de documents
|
||||
msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
||||
msgstr "Créez votre compte et commencez à utiliser la signature de documents à la pointe de la technologie. Une signature ouverte et magnifique est à votre portée."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
|
||||
#: apps/remix/app/components/tables/templates-table.tsx
|
||||
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx
|
||||
@ -2260,6 +2267,10 @@ msgstr "Créé le {0}"
|
||||
msgid "CSV Structure"
|
||||
msgstr "Structure CSV"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Current"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/password.tsx
|
||||
msgid "Current Password"
|
||||
msgstr "Mot de passe actuel"
|
||||
@ -2453,6 +2464,7 @@ msgid "Details"
|
||||
msgstr "Détails"
|
||||
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/tables/settings-security-activity-table.tsx
|
||||
msgid "Device"
|
||||
msgstr "Appareil"
|
||||
@ -3179,6 +3191,7 @@ msgstr "Entreprise"
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/template.edit.$id.tsx
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
|
||||
@ -3221,6 +3234,7 @@ msgstr "Entreprise"
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
|
||||
@ -3286,10 +3300,18 @@ msgstr "Échec du chargement du document"
|
||||
msgid "Failed to reseal document"
|
||||
msgstr "Échec du reseal du document"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Failed to revoke session"
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
|
||||
msgid "Failed to save settings."
|
||||
msgstr "Échec de l'enregistrement des paramètres."
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Failed to sign out all sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
msgid "Failed to update document"
|
||||
msgstr "Échec de la mise à jour du document"
|
||||
@ -3747,7 +3769,6 @@ msgstr "Code invalide. Veuillez réessayer."
|
||||
msgid "Invalid email"
|
||||
msgstr "Email invalide"
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
msgid "Invalid link"
|
||||
msgstr "Lien invalide"
|
||||
@ -3811,6 +3832,7 @@ msgid "Invoice"
|
||||
msgstr "Facture"
|
||||
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/tables/internal-audit-log-table.tsx
|
||||
msgid "IP Address"
|
||||
msgstr "Adresse IP"
|
||||
@ -3881,6 +3903,10 @@ msgstr "30 derniers jours"
|
||||
msgid "Last 7 days"
|
||||
msgstr "7 derniers jours"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Last Active"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/template/template-page-view-information.tsx
|
||||
#: apps/remix/app/components/general/document/document-page-view-information.tsx
|
||||
msgid "Last modified"
|
||||
@ -4030,6 +4056,10 @@ msgstr "Gérer les clés d'accès"
|
||||
msgid "Manage permissions and access controls"
|
||||
msgstr "Gérez les autorisations et les contrôles d'accès"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "Manage sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Manage subscription"
|
||||
@ -5305,7 +5335,6 @@ msgstr "Conservation des documents"
|
||||
msgid "Retry"
|
||||
msgstr "Réessayer"
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
|
||||
@ -5321,6 +5350,7 @@ msgstr "Retour à l'accueil"
|
||||
msgid "Return to sign in"
|
||||
msgstr "Retour à la connexion"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/general/teams/team-email-usage.tsx
|
||||
msgid "Revoke"
|
||||
msgstr "Révoquer"
|
||||
@ -5329,6 +5359,12 @@ msgstr "Révoquer"
|
||||
msgid "Revoke access"
|
||||
msgstr "Révoquer l'accès"
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Revoke all sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/tables/user-organisations-table.tsx
|
||||
#: apps/remix/app/components/tables/team-members-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
@ -5481,6 +5517,10 @@ msgstr "Sélectionner l'option par défaut"
|
||||
msgid "Select groups"
|
||||
msgstr "Sélectionnez des groupes"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select groups of members to add to the team."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select groups to add to this team"
|
||||
msgstr "Sélectionnez des groupes à ajouter à cette équipe"
|
||||
@ -5492,7 +5532,6 @@ msgid "Select members"
|
||||
msgstr "Sélectionnez des membres"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select members or groups of members to add to the team."
|
||||
msgstr "Sélectionnez des membres ou groupes de membres à ajouter à l'équipe."
|
||||
|
||||
@ -5602,6 +5641,14 @@ msgstr "Envoi..."
|
||||
msgid "Sent"
|
||||
msgstr "Envoyé"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Sessions have been revoked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Set a password"
|
||||
msgstr "Définir un mot de passe"
|
||||
@ -6476,7 +6523,8 @@ msgid "The following team has been deleted. You will no longer be able to access
|
||||
msgstr "L'équipe suivante a été supprimée. Vous ne pourrez plus accéder à cette équipe et à ses documents"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "The organisation group you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation group you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Le groupe d'organisation que vous cherchez peut avoir été supprimé, renommé ou n'a peut-être jamais existé."
|
||||
|
||||
@ -6485,12 +6533,14 @@ msgid "The organisation role that will be applied to all members in this group."
|
||||
msgstr "Le rôle d'organisation qui sera appliqué à tous les membres de ce groupe."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "L'organisation que vous cherchez peut avoir été supprimée, renommée ou n'a peut-être jamais existé."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/_layout.tsx
|
||||
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "L'organisation que vous cherchez peut avoir été supprimée, renommée ou n'a peut-être jamais existé."
|
||||
|
||||
@ -6574,12 +6624,14 @@ msgid "The team email <0>{teamEmail}</0> has been removed from the following tea
|
||||
msgstr "L'email d'équipe <0>{teamEmail}</0> a été supprimé de l'équipe suivante"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/_layout.tsx
|
||||
msgid "The team you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The team you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "L'équipe que vous cherchez peut avoir été supprimée, renommée ou n'a peut-être jamais existé."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
|
||||
msgid "The team you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The team you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "L'équipe que vous cherchez a peut-être été supprimée, renommée ou n'a peut-être jamais existé."
|
||||
|
||||
@ -6617,7 +6669,8 @@ msgid "The URL for Documenso to send webhook events to."
|
||||
msgstr "L'URL pour Documenso pour envoyer des événements webhook."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
|
||||
msgid "The user you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The user you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "L'utilisateur que vous cherchez peut avoir été supprimé, renommé ou n'a peut-être jamais existé."
|
||||
|
||||
@ -6784,10 +6837,6 @@ msgstr "Voici comment le document atteindra les destinataires une fois qu'il ser
|
||||
msgid "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
|
||||
msgstr "Il s'agit de la réclamation avec laquelle cette organisation a initialement été créée. Tout changement de drapeau de fonctionnalité à cette revendication sera rétroporté dans cette organisation."
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
msgid "This link is invalid or has expired."
|
||||
msgstr "Ce lien est invalide ou a expiré."
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
msgid "This link is invalid or has expired. Please contact your team to resend a verification."
|
||||
msgstr "Ce lien est invalide ou a expiré. Veuillez contacter votre équipe pour renvoyer une vérification."
|
||||
@ -6858,6 +6907,10 @@ msgstr "Cela sera envoyé au propriétaire du document une fois que le document
|
||||
msgid "This will ONLY backport feature flags which are set to true, anything disabled in the initial claim will not be backported"
|
||||
msgstr "Cela ne fera que rétroporter les drapeaux de fonctionnalité qui sont activés, tout ce qui est désactivé dans la réclamation initiale ne sera pas rétroporté"
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "This will sign you out of all other devices. You will need to sign in again on those devices to continue using your account."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/tables/internal-audit-log-table.tsx
|
||||
#: apps/remix/app/components/tables/document-logs-table.tsx
|
||||
msgid "Time"
|
||||
@ -7144,6 +7197,9 @@ msgstr "Non complet"
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Unknown"
|
||||
msgstr "Inconnu"
|
||||
|
||||
@ -7497,6 +7553,11 @@ msgstr "Voir tous les documents associés"
|
||||
msgid "View all security activity related to your account."
|
||||
msgstr "Voir toute l'activité de sécurité liée à votre compte."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "View and manage all active sessions for your account."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
|
||||
msgid "View Codes"
|
||||
msgstr "Voir les codes"
|
||||
@ -8563,4 +8624,3 @@ msgstr "Votre token a été créé avec succès ! Assurez-vous de le copier car
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.tokens.tsx
|
||||
msgid "Your tokens will be shown here once you create them."
|
||||
msgstr "Vos tokens seront affichés ici une fois que vous les aurez créés."
|
||||
|
||||
|
||||
@ -752,6 +752,11 @@ msgstr "Azioni"
|
||||
msgid "Active"
|
||||
msgstr "Attivo"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "Active sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
|
||||
msgid "Active Subscriptions"
|
||||
msgstr "Abbonamenti attivi"
|
||||
@ -817,13 +822,13 @@ msgstr "Aggiungi campi"
|
||||
msgid "Add group roles"
|
||||
msgstr "Aggiungi ruoli di gruppo"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Add groups"
|
||||
msgstr "Aggiungi gruppi"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Add members"
|
||||
msgstr "Aggiungi membri"
|
||||
|
||||
@ -1614,6 +1619,7 @@ msgstr "Può preparare"
|
||||
#: apps/remix/app/components/dialogs/team-delete-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@ -2221,6 +2227,7 @@ msgstr "Crea il tuo account e inizia a utilizzare firme digitali all'avanguardia
|
||||
msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
||||
msgstr "Crea il tuo account e inizia a utilizzare firme digitali all'avanguardia. Una firma aperta e bella è a tua portata."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
|
||||
#: apps/remix/app/components/tables/templates-table.tsx
|
||||
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx
|
||||
@ -2260,6 +2267,10 @@ msgstr "Creato il {0}"
|
||||
msgid "CSV Structure"
|
||||
msgstr "Struttura CSV"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Current"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/password.tsx
|
||||
msgid "Current Password"
|
||||
msgstr "Password attuale"
|
||||
@ -2453,6 +2464,7 @@ msgid "Details"
|
||||
msgstr "Dettagli"
|
||||
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/tables/settings-security-activity-table.tsx
|
||||
msgid "Device"
|
||||
msgstr "Dispositivo"
|
||||
@ -3179,6 +3191,7 @@ msgstr "Impresa"
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/template.edit.$id.tsx
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
|
||||
@ -3221,6 +3234,7 @@ msgstr "Impresa"
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
|
||||
@ -3286,10 +3300,18 @@ msgstr "Caricamento documento fallito."
|
||||
msgid "Failed to reseal document"
|
||||
msgstr "Fallito il risigillo del documento"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Failed to revoke session"
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
|
||||
msgid "Failed to save settings."
|
||||
msgstr "Impossibile salvare le impostazioni."
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Failed to sign out all sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
msgid "Failed to update document"
|
||||
msgstr "Aggiornamento documento fallito"
|
||||
@ -3747,7 +3769,6 @@ msgstr "Codice non valido. Riprova."
|
||||
msgid "Invalid email"
|
||||
msgstr "Email non valida"
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
msgid "Invalid link"
|
||||
msgstr "Link non valido"
|
||||
@ -3811,6 +3832,7 @@ msgid "Invoice"
|
||||
msgstr "Fattura"
|
||||
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/tables/internal-audit-log-table.tsx
|
||||
msgid "IP Address"
|
||||
msgstr "Indirizzo IP"
|
||||
@ -3881,6 +3903,10 @@ msgstr "Ultimi 30 giorni"
|
||||
msgid "Last 7 days"
|
||||
msgstr "Ultimi 7 giorni"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Last Active"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/template/template-page-view-information.tsx
|
||||
#: apps/remix/app/components/general/document/document-page-view-information.tsx
|
||||
msgid "Last modified"
|
||||
@ -4030,6 +4056,10 @@ msgstr "Gestisci chiavi di accesso"
|
||||
msgid "Manage permissions and access controls"
|
||||
msgstr "Gestisci le autorizzazioni e i controlli di accesso"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "Manage sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Manage subscription"
|
||||
@ -5305,7 +5335,6 @@ msgstr "Conservazione dei documenti"
|
||||
msgid "Retry"
|
||||
msgstr "Riprova"
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
|
||||
@ -5321,6 +5350,7 @@ msgstr "Torna alla home"
|
||||
msgid "Return to sign in"
|
||||
msgstr "Torna a accedere"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/general/teams/team-email-usage.tsx
|
||||
msgid "Revoke"
|
||||
msgstr "Revoca"
|
||||
@ -5329,6 +5359,12 @@ msgstr "Revoca"
|
||||
msgid "Revoke access"
|
||||
msgstr "Revoca l'accesso"
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Revoke all sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/tables/user-organisations-table.tsx
|
||||
#: apps/remix/app/components/tables/team-members-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
@ -5481,6 +5517,10 @@ msgstr "Seleziona opzione predefinita"
|
||||
msgid "Select groups"
|
||||
msgstr "Seleziona gruppi"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select groups of members to add to the team."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select groups to add to this team"
|
||||
msgstr "Seleziona i gruppi da aggiungere a questo team"
|
||||
@ -5492,7 +5532,6 @@ msgid "Select members"
|
||||
msgstr "Seleziona membri"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select members or groups of members to add to the team."
|
||||
msgstr "Seleziona membri o gruppi di membri da aggiungere al team."
|
||||
|
||||
@ -5602,6 +5641,14 @@ msgstr "Invio..."
|
||||
msgid "Sent"
|
||||
msgstr "Inviato"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Sessions have been revoked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Set a password"
|
||||
msgstr "Imposta una password"
|
||||
@ -6476,9 +6523,11 @@ msgid "The following team has been deleted. You will no longer be able to access
|
||||
msgstr "Il seguente team è stato eliminato. Non potrai più accedere a questo team e ai suoi documenti"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "The organisation group you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation group you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Il gruppo organizzativo che cerchi potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
|
||||
msgstr ""
|
||||
"Il gruppo organizzativo che cerchi potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
|
||||
" esistito."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
@ -6486,15 +6535,19 @@ msgid "The organisation role that will be applied to all members in this group."
|
||||
msgstr "Il ruolo organizzativo che verrà applicato a tutti i membri in questo gruppo."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "L'organizzazione che cerchi potrebbe essere stata rimossa, rinominata o potrebbe non essere mai\n"
|
||||
msgstr ""
|
||||
"L'organizzazione che cerchi potrebbe essere stata rimossa, rinominata o potrebbe non essere mai\n"
|
||||
" esistita."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/_layout.tsx
|
||||
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "L'organizzazione che cerchi potrebbe essere stata rimossa, rinominata o potrebbe non essere mai\n"
|
||||
msgstr ""
|
||||
"L'organizzazione che cerchi potrebbe essere stata rimossa, rinominata o potrebbe non essere mai\n"
|
||||
" esistita."
|
||||
|
||||
#: apps/remix/app/components/general/generic-error-layout.tsx
|
||||
@ -6577,15 +6630,19 @@ msgid "The team email <0>{teamEmail}</0> has been removed from the following tea
|
||||
msgstr "L'email del team <0>{teamEmail}</0> è stata rimossa dal seguente team"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/_layout.tsx
|
||||
msgid "The team you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The team you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Il team che cerchi potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
|
||||
msgstr ""
|
||||
"Il team che cerchi potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
|
||||
" esistito."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
|
||||
msgid "The team you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The team you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "La squadra che stai cercando potrebbe essere stata rimossa, rinominata o potrebbe non essere mai\n"
|
||||
msgstr ""
|
||||
"La squadra che stai cercando potrebbe essere stata rimossa, rinominata o potrebbe non essere mai\n"
|
||||
" esistita."
|
||||
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
@ -6622,9 +6679,11 @@ msgid "The URL for Documenso to send webhook events to."
|
||||
msgstr "L'URL per Documenso per inviare eventi webhook."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
|
||||
msgid "The user you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The user you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "L'utente che cerchi potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
|
||||
msgstr ""
|
||||
"L'utente che cerchi potrebbe essere stato rimosso, rinominato o potrebbe non essere mai\n"
|
||||
" esistito."
|
||||
|
||||
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx
|
||||
@ -6790,10 +6849,6 @@ msgstr "È così che il documento raggiungerà i destinatari una volta pronto pe
|
||||
msgid "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
|
||||
msgstr "Questo è il reclamo con cui questa organizzazione è stata inizialmente creata. Qualunque cambiamento agli indicatori delle funzionalità di questo reclamo sarà retroportato in questa organizzazione."
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
msgid "This link is invalid or has expired."
|
||||
msgstr "Questo link non è valido o è scaduto."
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
msgid "This link is invalid or has expired. Please contact your team to resend a verification."
|
||||
msgstr "Questo link è invalido o è scaduto. Si prega di contattare il tuo team per inviare nuovamente una verifica."
|
||||
@ -6864,6 +6919,10 @@ msgstr "Questo sarà inviato al proprietario del documento una volta che il docu
|
||||
msgid "This will ONLY backport feature flags which are set to true, anything disabled in the initial claim will not be backported"
|
||||
msgstr "Questo farà SOLO il retroporting degli indicatori delle funzionalità impostati su vero, qualsiasi cosa disabilitata nel reclamo iniziale non sarà retroportata"
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "This will sign you out of all other devices. You will need to sign in again on those devices to continue using your account."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/tables/internal-audit-log-table.tsx
|
||||
#: apps/remix/app/components/tables/document-logs-table.tsx
|
||||
msgid "Time"
|
||||
@ -7150,6 +7209,9 @@ msgstr "Incompleto"
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Unknown"
|
||||
msgstr "Sconosciuto"
|
||||
|
||||
@ -7503,6 +7565,11 @@ msgstr "Visualizza tutti i documenti correlati"
|
||||
msgid "View all security activity related to your account."
|
||||
msgstr "Visualizza tutte le attività di sicurezza relative al tuo account."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "View and manage all active sessions for your account."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
|
||||
msgid "View Codes"
|
||||
msgstr "Visualizza Codici"
|
||||
@ -8569,4 +8636,3 @@ msgstr "Il tuo token è stato creato con successo! Assicurati di copiarlo perch
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.tokens.tsx
|
||||
msgid "Your tokens will be shown here once you create them."
|
||||
msgstr "I tuoi token verranno mostrati qui una volta creati."
|
||||
|
||||
|
||||
@ -752,6 +752,11 @@ msgstr "Akcje"
|
||||
msgid "Active"
|
||||
msgstr "Aktywne"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "Active sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
|
||||
msgid "Active Subscriptions"
|
||||
msgstr "Aktywne subskrypcje"
|
||||
@ -817,13 +822,13 @@ msgstr "Dodaj pola"
|
||||
msgid "Add group roles"
|
||||
msgstr "Dodaj role grupowe"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Add groups"
|
||||
msgstr "Dodaj grupy"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Add members"
|
||||
msgstr "Dodaj członków"
|
||||
|
||||
@ -1614,6 +1619,7 @@ msgstr "Może przygotować"
|
||||
#: apps/remix/app/components/dialogs/team-delete-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@ -2221,6 +2227,7 @@ msgstr "Utwórz swoje konto i zacznij korzystać z nowoczesnego podpisywania dok
|
||||
msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
||||
msgstr "Utwórz swoje konto i zacznij korzystać z nowoczesnego podpisywania dokumentów. Otwarty i piękny podpis jest w zasięgu ręki."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx
|
||||
#: apps/remix/app/components/tables/templates-table.tsx
|
||||
#: apps/remix/app/components/tables/settings-security-passkey-table.tsx
|
||||
@ -2260,6 +2267,10 @@ msgstr "Utworzono {0}"
|
||||
msgid "CSV Structure"
|
||||
msgstr "Struktura CSV"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Current"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/password.tsx
|
||||
msgid "Current Password"
|
||||
msgstr "Obecne hasło"
|
||||
@ -2453,6 +2464,7 @@ msgid "Details"
|
||||
msgstr "Szczegóły"
|
||||
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/tables/settings-security-activity-table.tsx
|
||||
msgid "Device"
|
||||
msgstr "Urządzenie"
|
||||
@ -3179,6 +3191,7 @@ msgstr "Enterprise"
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/template.edit.$id.tsx
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
|
||||
@ -3221,6 +3234,7 @@ msgstr "Enterprise"
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/template-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/document-move-to-folder-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx
|
||||
@ -3286,10 +3300,18 @@ msgstr "Nie udało się załadować dokumentu"
|
||||
msgid "Failed to reseal document"
|
||||
msgstr "Nie udało się ponownie zaplombować dokumentu"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Failed to revoke session"
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
|
||||
msgid "Failed to save settings."
|
||||
msgstr "Nie udało się zapisać ustawień."
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Failed to sign out all sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/embed+/v1+/authoring+/document.edit.$id.tsx
|
||||
msgid "Failed to update document"
|
||||
msgstr "Nie udało się aktualizować dokumentu"
|
||||
@ -3747,7 +3769,6 @@ msgstr "Nieprawidłowy kod. Proszę spróbuj ponownie."
|
||||
msgid "Invalid email"
|
||||
msgstr "Nieprawidłowy email"
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
msgid "Invalid link"
|
||||
msgstr "Nieprawidłowy link"
|
||||
@ -3811,6 +3832,7 @@ msgid "Invoice"
|
||||
msgstr "Faktura"
|
||||
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/tables/internal-audit-log-table.tsx
|
||||
msgid "IP Address"
|
||||
msgstr "Adres IP"
|
||||
@ -3881,6 +3903,10 @@ msgstr "Ostatnie 30 dni"
|
||||
msgid "Last 7 days"
|
||||
msgstr "Ostatnie 7 dni"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Last Active"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/template/template-page-view-information.tsx
|
||||
#: apps/remix/app/components/general/document/document-page-view-information.tsx
|
||||
msgid "Last modified"
|
||||
@ -4030,6 +4056,10 @@ msgstr "Zarządzaj kluczami dostępu"
|
||||
msgid "Manage permissions and access controls"
|
||||
msgstr "Zarządzaj uprawnieniami i kontrolą dostępu"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "Manage sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Manage subscription"
|
||||
@ -5305,7 +5335,6 @@ msgstr "Przechowywanie dokumentów"
|
||||
msgid "Retry"
|
||||
msgstr "Spróbuj ponownie"
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx
|
||||
#: apps/remix/app/routes/_unauthenticated+/organisation.decline.$token.tsx
|
||||
@ -5321,6 +5350,7 @@ msgstr "Powrót do strony głównej"
|
||||
msgid "Return to sign in"
|
||||
msgstr "Powrót do logowania"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/components/general/teams/team-email-usage.tsx
|
||||
msgid "Revoke"
|
||||
msgstr "Cofnij"
|
||||
@ -5329,6 +5359,12 @@ msgstr "Cofnij"
|
||||
msgid "Revoke access"
|
||||
msgstr "Cofnij dostęp"
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Revoke all sessions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/tables/user-organisations-table.tsx
|
||||
#: apps/remix/app/components/tables/team-members-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
@ -5481,6 +5517,10 @@ msgstr "Wybierz domyślną opcję"
|
||||
msgid "Select groups"
|
||||
msgstr "Wybierz grupy"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select groups of members to add to the team."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select groups to add to this team"
|
||||
msgstr "Wybierz grupy, które chcesz dodać do tego zespołu"
|
||||
@ -5492,7 +5532,6 @@ msgid "Select members"
|
||||
msgstr "Wybierz członków"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-group-create-dialog.tsx
|
||||
msgid "Select members or groups of members to add to the team."
|
||||
msgstr "Wybierz członków lub grupy członków, aby dodać do zespołu."
|
||||
|
||||
@ -5602,6 +5641,14 @@ msgstr "Wysyłanie..."
|
||||
msgid "Sent"
|
||||
msgstr "Wysłano"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "Sessions have been revoked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Set a password"
|
||||
msgstr "Ustaw hasło"
|
||||
@ -6476,7 +6523,8 @@ msgid "The following team has been deleted. You will no longer be able to access
|
||||
msgstr "Poniższy zespół został usunięty. Nie będziesz mógł już uzyskać dostępu do tego zespołu i jego dokumentów."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "The organisation group you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation group you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Grupa organizacji, której szukasz, mogła zostać usunięta, zmieniona nazwa lub mogła nigdy nie istnieć."
|
||||
|
||||
@ -6485,12 +6533,14 @@ msgid "The organisation role that will be applied to all members in this group."
|
||||
msgstr "Rola organizacji, która zostanie zastosowana do wszystkich członków tej grupy."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Organizacja, której szukasz, mogła zostać usunięta, zmieniona nazwa lub mogła nigdy nie istnieć."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/_layout.tsx
|
||||
msgid "The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The organisation you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Organizacja, której szukasz, mogła zostać usunięta, zmieniona nazwa lub mogła nigdy nie istnieć."
|
||||
|
||||
@ -6574,12 +6624,14 @@ msgid "The team email <0>{teamEmail}</0> has been removed from the following tea
|
||||
msgstr "Email zespołowy <0>{teamEmail}</0> został usunięty z następującego zespołu"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/_layout.tsx
|
||||
msgid "The team you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The team you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Zespół, którego szukasz, mógł zostać usunięty, zmienić nazwę lub mógł nigdy nie istnieć."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx
|
||||
msgid "The team you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The team you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Zespół, którego szukasz, mógł zostać usunięty, zmieniony na, albo nigdy nie istniał."
|
||||
|
||||
@ -6617,7 +6669,8 @@ msgid "The URL for Documenso to send webhook events to."
|
||||
msgstr "URL dla Documenso do wysyłania zdarzeń webhook."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/users.$id.tsx
|
||||
msgid "The user you are looking for may have been removed, renamed or may have never\n"
|
||||
msgid ""
|
||||
"The user you are looking for may have been removed, renamed or may have never\n"
|
||||
" existed."
|
||||
msgstr "Użytkownik, którego szukasz, mógł zostać usunięty, zmieniony nazwę lub mógł nigdy nie istnieć."
|
||||
|
||||
@ -6784,10 +6837,6 @@ msgstr "W ten sposób dokument dotrze do odbiorców, gdy tylko dokument będzie
|
||||
msgid "This is the claim that this organisation was initially created with. Any feature flag changes to this claim will be backported into this organisation."
|
||||
msgstr "To jest roszczenie, z którym pierwotnie została utworzona ta organizacja. Wszelkie zmiany flag funkcji w tym roszczeniu zostaną przeniesione do tej organizacji."
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.transfer.$token.tsx
|
||||
msgid "This link is invalid or has expired."
|
||||
msgstr "Ten link jest nieprawidłowy lub wygasł."
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx
|
||||
msgid "This link is invalid or has expired. Please contact your team to resend a verification."
|
||||
msgstr "Ten link jest nieprawidłowy lub wygasł. Proszę skontaktować się ze swoim zespołem, aby ponownie wysłać weryfikację."
|
||||
@ -6858,6 +6907,10 @@ msgstr "To zostanie wysłane do właściciela dokumentu, gdy dokument zostanie w
|
||||
msgid "This will ONLY backport feature flags which are set to true, anything disabled in the initial claim will not be backported"
|
||||
msgstr "To będzie TYLKO przenoś funkcje flag, które są ustawione na true, wszystko, co wyłączone w początkowym roszczeniu, nie zostanie przeniesione"
|
||||
|
||||
#: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx
|
||||
msgid "This will sign you out of all other devices. You will need to sign in again on those devices to continue using your account."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/tables/internal-audit-log-table.tsx
|
||||
#: apps/remix/app/components/tables/document-logs-table.tsx
|
||||
msgid "Time"
|
||||
@ -7144,6 +7197,9 @@ msgstr "Niezakończony"
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Unknown"
|
||||
msgstr "Nieznany"
|
||||
|
||||
@ -7497,6 +7553,11 @@ msgstr "Zobacz wszystkie powiązane dokumenty"
|
||||
msgid "View all security activity related to your account."
|
||||
msgstr "Wyświetl wszystkie aktywności związane z bezpieczeństwem twojego konta."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
|
||||
msgid "View and manage all active sessions for your account."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx
|
||||
msgid "View Codes"
|
||||
msgstr "Wyświetl kody"
|
||||
@ -8563,4 +8624,3 @@ msgstr "Twój token został pomyślnie utworzony! Upewnij się, że go skopiujes
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.tokens.tsx
|
||||
msgid "Your tokens will be shown here once you create them."
|
||||
msgstr "Twoje tokeny będą tutaj wyświetlane po ich utworzeniu."
|
||||
|
||||
|
||||
@ -0,0 +1,2 @@
|
||||
-- AlterEnum
|
||||
ALTER TYPE "UserSecurityAuditLogType" ADD VALUE 'SESSION_REVOKED';
|
||||
@ -97,6 +97,7 @@ enum UserSecurityAuditLogType {
|
||||
PASSKEY_UPDATED
|
||||
PASSWORD_RESET
|
||||
PASSWORD_UPDATE
|
||||
SESSION_REVOKED
|
||||
SIGN_OUT
|
||||
SIGN_IN
|
||||
SIGN_IN_FAIL
|
||||
|
||||
Reference in New Issue
Block a user