mirror of
https://github.com/documenso/documenso.git
synced 2026-07-17 00:30:21 +10:00
Merge branch 'main' into feat/default-reset-button-document-preferences
This commit is contained in:
@@ -1,3 +1,3 @@
|
||||
legacy-peer-deps = true
|
||||
prefer-dedupe = true
|
||||
min-release-age = 7
|
||||
# min-release-age = 7
|
||||
|
||||
@@ -65,3 +65,4 @@ When you exceed a resource limit:
|
||||
- [Authentication](/docs/developers/getting-started/authentication) - API authentication guide
|
||||
- [API Versioning](/docs/developers/api/versioning) - API version management
|
||||
- [First API Call](/docs/developers/getting-started/first-api-call) - Getting started with the API
|
||||
- [Organisation Limits](/docs/self-hosting/configuration/organisation-limits) - Admins: set per-organisation resource quotas and rate limits (the HTTP rate limit above is separate and not admin-settable)
|
||||
|
||||
@@ -510,4 +510,5 @@ NEXT_PRIVATE_SIGNING_PASSPHRASE="your-certificate-password"
|
||||
- [Email Configuration](/docs/self-hosting/configuration/email) - Configure email delivery
|
||||
- [Storage Configuration](/docs/self-hosting/configuration/storage) - Set up S3 storage
|
||||
- [Signing Certificate](/docs/self-hosting/configuration/signing-certificate) - Configure document signing
|
||||
- [Organisation Limits](/docs/self-hosting/configuration/organisation-limits) - Set per-organisation document, email, and API limits from the admin panel
|
||||
- [Troubleshooting](/docs/self-hosting/maintenance/troubleshooting) - Common configuration issues
|
||||
|
||||
@@ -29,6 +29,11 @@ description: Configure your self-hosted Documenso instance with environment vari
|
||||
description="Digital signature certificate setup."
|
||||
href="/docs/self-hosting/configuration/signing-certificate"
|
||||
/>
|
||||
<Card
|
||||
title="Organisation Limits"
|
||||
description="Set per-organisation document, email, and API limits via the admin panel."
|
||||
href="/docs/self-hosting/configuration/organisation-limits"
|
||||
/>
|
||||
</Cards>
|
||||
|
||||
## Required Configuration
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"background-jobs",
|
||||
"signing-certificate",
|
||||
"telemetry",
|
||||
"organisation-limits",
|
||||
"advanced"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
---
|
||||
title: Organisation Limits
|
||||
description: View and set per-organisation document, email, and API limits on a self-hosted Documenso instance using the admin panel's subscription claims.
|
||||
---
|
||||
|
||||
import { Callout } from 'fumadocs-ui/components/callout';
|
||||
|
||||
Per-organisation limits — document, email, and API usage, plus feature toggles and team/member caps — are controlled by **subscription claims**. You configure them in the admin panel, not through environment variables.
|
||||
|
||||
There are three distinct kinds of limit:
|
||||
|
||||
| Limit | Caps | Admin-settable |
|
||||
| ---------------------- | ------------------------------------------------- | ----------------------- |
|
||||
| Resource quota | Documents, emails, and API requests **per month** | Yes — per claim and org |
|
||||
| Resource rate limit | The same resources over a short window (e.g. `1h`) | Yes — per claim and org |
|
||||
| Global HTTP rate limit | API requests per IP (100/min, hardcoded) | No — see [Limitations](#limitations) |
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- A running self-hosted Documenso instance.
|
||||
- An account with the **`ADMIN`** role — an account-level role, separate from organisation and team roles. New accounts are created with the `USER` role only. Grant the first admin by adding `ADMIN` to that user's `roles` directly in the database; after that, an existing admin can grant the role to others under **Admin Panel > Users > _(user)_ > Roles > Update user**.
|
||||
|
||||
Open the admin panel at `/admin`. The sidebar sections used below are **Claims**, **Organisations**, and **Organisation Stats**.
|
||||
|
||||
## Viewing usage
|
||||
|
||||
**One organisation:** open **Admin Panel > Organisations** and select it. The **Organisation usage** section shows the current period's document, email, and API usage against its quotas.
|
||||
|
||||
**All organisations:** open **Admin Panel > Organisation Stats** to sort and filter monthly usage. Filter by **claim** and by **period** (a UTC calendar month, shown as `YYYY-MM`), and switch between **Show usage**, **Show usage with quotas**, and **Show daily averages**.
|
||||
|
||||
<Callout type="warn">
|
||||
Usage counts **attempts**, not only successful actions. A request that exceeds a quota is still counted before it is rejected, so displayed usage can read higher than the number of actions that succeeded.
|
||||
</Callout>
|
||||
|
||||
## Subscription claims
|
||||
|
||||
A subscription claim is a named bundle of limits and feature flags (for example `Free`, `Individual`, `Teams`, `Platform`, or `Enterprise`). Claims are **templates**: when an organisation is created it receives a private copy of its claim and reads from that copy afterwards. Editing a claim template therefore affects organisations created later, not existing ones — to change an existing organisation, [edit it directly](#change-limits-for-one-organisation).
|
||||
|
||||
### Claim fields
|
||||
|
||||
Under **Admin Panel > Claims** (`/admin/claims`), each claim has:
|
||||
|
||||
| Field | Controls |
|
||||
| ----------------------- | --------------------------------------------------------------------------------- |
|
||||
| **Name** | The claim's display name. |
|
||||
| **Team Count** | Teams allowed. `0` = unlimited. |
|
||||
| **Member Count** | Members allowed. `0` = unlimited. |
|
||||
| **Envelope Item Count** | Uploaded files allowed per envelope. Minimum `1`. |
|
||||
| **Recipient Count** | Recipients allowed per document. `0` = unlimited. |
|
||||
| **Feature Flags** | Feature toggles (see [Feature flags](#feature-flags)). |
|
||||
| **Limits** | Monthly quota and rate-limit windows for Documents, Emails, and API. |
|
||||
| **Email transport** | Transport the claim uses. *Default (system mailer)* uses the instance default. |
|
||||
|
||||
### Quotas and rate limits
|
||||
|
||||
The **Limits** section has a column for **Documents**, **Emails**, and **API**, each with two controls:
|
||||
|
||||
- **Monthly quota** — how many of that resource are allowed per calendar month. An **empty** field is unlimited; **`0`** blocks the resource entirely.
|
||||
- **Rate limit windows** — optional short-window caps, each a duration and a maximum. A window is a number and a unit (`s`, `m`, `h`, `d`), such as `5m`, `1h`, or `24h`, and must be unique within the resource.
|
||||
|
||||
<Callout type="warn">
|
||||
Quotas and counts use opposite conventions for "unlimited": an **empty** quota is unlimited (and `0` blocks the resource), whereas `0` in the **Team**, **Member**, and **Recipient Count** fields means unlimited.
|
||||
</Callout>
|
||||
|
||||
### Feature flags
|
||||
|
||||
The **Feature Flags** section toggles capabilities such as Unlimited documents, Branding, Hide Documenso branding, Email domains, Embed authoring, Embed signing, White label for embed authoring/signing, 21 CFR, HIPAA, Authentication portal, Allow Legacy Envelopes, Signing reminders, QES signing, and Disable emails.
|
||||
|
||||
Some flags are Enterprise features. If your license does not include one, it is marked and cannot be enabled (you can still turn it off). See [Enterprise Edition](/docs/policies/enterprise-edition).
|
||||
|
||||
### Create or edit a claim template
|
||||
|
||||
1. Go to **Admin Panel > Claims**.
|
||||
2. Select **New claim**, or select an existing claim to edit it.
|
||||
3. Set the counts, feature flags, and the **Limits** section.
|
||||
4. Save. Changes apply to organisations created afterwards, not existing ones.
|
||||
|
||||
### Change limits for one organisation
|
||||
|
||||
To change limits for an existing organisation, edit it directly rather than its claim template.
|
||||
|
||||
1. Go to **Admin Panel > Organisations** and open the organisation.
|
||||
2. Adjust its quota, rate-limit, feature-flag, or email-transport fields.
|
||||
3. Save. Changes take effect immediately.
|
||||
|
||||
The organisation also shows the **Inherited subscription claim** it was created from.
|
||||
|
||||
## Usage reset
|
||||
|
||||
Monthly quota usage is keyed to the **UTC calendar month**. There is no scheduled reset job — when the month rolls over, the new period's counter starts at `0`.
|
||||
|
||||
## Limitations
|
||||
|
||||
The **global HTTP rate limit is not configurable.** Documenso enforces a hardcoded **100 requests per minute per IP address** on its API endpoint groups (`/api/v1`, `/api/v2`, and the tRPC API are limited separately), returning `429 Too Many Requests`. It is a per-IP safeguard applied at the HTTP layer — not per-organisation, not stored on any claim, and not adjustable from the admin panel. See [Rate Limits](/docs/developers/api/rate-limits).
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
| Symptom | Cause and fix |
|
||||
| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| An organisation hit its limit unexpectedly | Usage counts rejected over-quota attempts. Compare usage against the quota under **Organisation Stats > Show usage with quotas**. |
|
||||
| A resource is blocked entirely, not just capped | The **Monthly quota** is `0`, which blocks the resource. Leave it empty for unlimited. |
|
||||
| Emails are not sending for an organisation | Check whether the **Disable emails** flag is enabled on the organisation's claim — it blocks all emails regardless of quota. |
|
||||
| A claim template edit had no effect | Template edits are not retroactive. Edit the organisation directly under **Admin Panel > Organisations**. |
|
||||
|
||||
---
|
||||
|
||||
## See Also
|
||||
|
||||
- [Environment Variables](/docs/self-hosting/configuration/environment) - All configuration options
|
||||
- [Rate Limits](/docs/developers/api/rate-limits) - The global HTTP API rate limit (separate from claims)
|
||||
- [Enterprise Edition](/docs/policies/enterprise-edition) - Features unlocked by license flags
|
||||
@@ -3,7 +3,7 @@
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "next build",
|
||||
"build": "NEXT_IGNORE_INCORRECT_LOCKFILE=true next build",
|
||||
"dev": "next dev",
|
||||
"start": "next start",
|
||||
"types:check": "fumadocs-mdx && next typegen && tsc --noEmit",
|
||||
@@ -29,7 +29,7 @@
|
||||
"@types/node": "^25.1.0",
|
||||
"@types/react": "^19.2.10",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"postcss": "^8.5.14",
|
||||
"postcss": "^8.5.19",
|
||||
"tailwindcss": "^4.1.18",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
--accent: hsl(0 0% 27.8431%);
|
||||
--accent-foreground: hsl(95.0847 71.0843% 67.451%);
|
||||
--destructive: hsl(0 86.5979% 61.9608%);
|
||||
--destructive-foreground: hsl(0 87.6289% 19.0196%);
|
||||
--destructive-foreground: hsl(0 0% 98.0392%);
|
||||
--border: hsl(0 0% 27.8431%);
|
||||
--input: hsl(0 0% 27.8431%);
|
||||
--ring: hsl(95.0847 71.0843% 67.451%);
|
||||
|
||||
@@ -122,7 +122,7 @@ export const FolderDeleteDialog = ({ folder, isOpen, onOpenChange }: FolderDelet
|
||||
<FormLabel>
|
||||
<Trans>
|
||||
Confirm by typing:{' '}
|
||||
<span className="font-semibold font-sm text-destructive">{deleteMessage}</span>
|
||||
<span className="font-semibold text-destructive text-sm">{deleteMessage}</span>
|
||||
</Trans>
|
||||
</FormLabel>
|
||||
<FormControl>
|
||||
|
||||
@@ -336,7 +336,7 @@ const BillingPlanForm = ({ value, onChange, plans, canCreateFreeOrganisation }:
|
||||
>
|
||||
<div className="w-full text-left">
|
||||
<div className="flex items-center justify-between">
|
||||
<p className="text-medium">
|
||||
<p className="font-medium">
|
||||
<Trans context="Plan price">Free</Trans>
|
||||
</p>
|
||||
|
||||
|
||||
@@ -115,7 +115,7 @@ export const OrganisationEmailDomainDeleteDialog = ({
|
||||
<FormLabel>
|
||||
<Trans>
|
||||
Confirm by typing{' '}
|
||||
<span className="font-semibold font-sm text-destructive">{deleteMessage}</span>
|
||||
<span className="font-semibold text-destructive text-sm">{deleteMessage}</span>
|
||||
</Trans>
|
||||
</FormLabel>
|
||||
<FormControl>
|
||||
|
||||
@@ -370,7 +370,7 @@ export const OrganisationMemberInviteDialog = ({ trigger, ...props }: Organisati
|
||||
<button
|
||||
type="button"
|
||||
className={cn(
|
||||
'justify-left inline-flex h-10 w-10 items-center text-slate-500 hover:opacity-80 disabled:cursor-not-allowed disabled:opacity-50',
|
||||
'inline-flex h-10 w-10 items-center justify-start text-slate-500 hover:opacity-80 disabled:cursor-not-allowed disabled:opacity-50',
|
||||
index === 0 ? 'mt-8' : 'mt-0',
|
||||
)}
|
||||
disabled={organisationMemberInvites.length === 1}
|
||||
|
||||
@@ -0,0 +1,250 @@
|
||||
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
|
||||
import { trpc } from '@documenso/trpc/react';
|
||||
import { ZCreateApiTokenRequestSchema } from '@documenso/trpc/server/api-token-router/create-api-token.types';
|
||||
import { CopyTextButton } from '@documenso/ui/components/common/copy-text-button';
|
||||
import { Button } from '@documenso/ui/primitives/button';
|
||||
import {
|
||||
Dialog,
|
||||
DialogContent,
|
||||
DialogDescription,
|
||||
DialogFooter,
|
||||
DialogHeader,
|
||||
DialogTitle,
|
||||
DialogTrigger,
|
||||
} from '@documenso/ui/primitives/dialog';
|
||||
import {
|
||||
Form,
|
||||
FormControl,
|
||||
FormDescription,
|
||||
FormField,
|
||||
FormItem,
|
||||
FormLabel,
|
||||
FormMessage,
|
||||
} from '@documenso/ui/primitives/form/form';
|
||||
import { Input } from '@documenso/ui/primitives/input';
|
||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@documenso/ui/primitives/select';
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
import { zodResolver } from '@hookform/resolvers/zod';
|
||||
import { msg } from '@lingui/core/macro';
|
||||
import { useLingui } from '@lingui/react';
|
||||
import { Trans } from '@lingui/react/macro';
|
||||
import type * as DialogPrimitive from '@radix-ui/react-dialog';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { match } from 'ts-pattern';
|
||||
import type { z } from 'zod';
|
||||
|
||||
import { useCurrentTeam } from '~/providers/team';
|
||||
|
||||
const NEVER_EXPIRE = 'NEVER' as const;
|
||||
|
||||
export const EXPIRATION_DATES = {
|
||||
ONE_WEEK: msg`7 days`,
|
||||
ONE_MONTH: msg`1 month`,
|
||||
THREE_MONTHS: msg`3 months`,
|
||||
SIX_MONTHS: msg`6 months`,
|
||||
ONE_YEAR: msg`12 months`,
|
||||
[NEVER_EXPIRE]: msg`Never`,
|
||||
} as const;
|
||||
|
||||
const ZCreateTokenFormSchema = ZCreateApiTokenRequestSchema.pick({
|
||||
tokenName: true,
|
||||
expirationDate: true,
|
||||
});
|
||||
|
||||
type TCreateTokenFormSchema = z.infer<typeof ZCreateTokenFormSchema>;
|
||||
|
||||
export type TokenCreateDialogProps = {
|
||||
trigger?: React.ReactNode;
|
||||
} & Omit<DialogPrimitive.DialogProps, 'children'>;
|
||||
|
||||
export const TokenCreateDialog = ({ trigger, ...props }: TokenCreateDialogProps) => {
|
||||
const { _ } = useLingui();
|
||||
const { toast } = useToast();
|
||||
|
||||
const team = useCurrentTeam();
|
||||
|
||||
const [open, setOpen] = useState(false);
|
||||
const [createdToken, setCreatedToken] = useState<string | null>(null);
|
||||
|
||||
const form = useForm<TCreateTokenFormSchema>({
|
||||
resolver: zodResolver(ZCreateTokenFormSchema),
|
||||
defaultValues: {
|
||||
tokenName: '',
|
||||
expirationDate: 'THREE_MONTHS',
|
||||
},
|
||||
});
|
||||
|
||||
const { mutateAsync: createToken } = trpc.apiToken.create.useMutation();
|
||||
|
||||
const onSubmit = async ({ tokenName, expirationDate }: TCreateTokenFormSchema) => {
|
||||
try {
|
||||
const { token } = await createToken({
|
||||
teamId: team.id,
|
||||
tokenName,
|
||||
expirationDate: expirationDate === NEVER_EXPIRE ? null : expirationDate,
|
||||
});
|
||||
|
||||
setCreatedToken(token);
|
||||
} catch (err) {
|
||||
const error = AppError.parseError(err);
|
||||
|
||||
const errorMessage = match(error.code)
|
||||
.with(AppErrorCode.UNAUTHORIZED, () => msg`You do not have permission to create a token for this team.`)
|
||||
.otherwise(() => msg`Something went wrong. Please try again later.`);
|
||||
|
||||
toast({
|
||||
title: _(msg`An error occurred`),
|
||||
description: _(errorMessage),
|
||||
variant: 'destructive',
|
||||
duration: 5000,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (open) {
|
||||
form.reset();
|
||||
setCreatedToken(null);
|
||||
}
|
||||
}, [open, form]);
|
||||
|
||||
return (
|
||||
<Dialog open={open} onOpenChange={(value) => !form.formState.isSubmitting && setOpen(value)} {...props}>
|
||||
<DialogTrigger onClick={(e) => e.stopPropagation()} asChild>
|
||||
{trigger ?? (
|
||||
<Button className="flex-shrink-0">
|
||||
<Trans>Create token</Trans>
|
||||
</Button>
|
||||
)}
|
||||
</DialogTrigger>
|
||||
|
||||
<DialogContent
|
||||
className="max-w-lg"
|
||||
position="center"
|
||||
onInteractOutside={(event) => {
|
||||
// Prevent losing the created token by accidentally clicking outside the dialog.
|
||||
if (createdToken) {
|
||||
event.preventDefault();
|
||||
}
|
||||
}}
|
||||
>
|
||||
{createdToken ? (
|
||||
<>
|
||||
<DialogHeader>
|
||||
<DialogTitle>
|
||||
<Trans>Token created</Trans>
|
||||
</DialogTitle>
|
||||
|
||||
<DialogDescription>
|
||||
<Trans>Copy your token now. For security reasons you will not be able to see it again.</Trans>
|
||||
</DialogDescription>
|
||||
</DialogHeader>
|
||||
|
||||
<div className="relative">
|
||||
<Input
|
||||
className="pr-12 font-mono text-sm"
|
||||
aria-label={_(msg`Your new API token`)}
|
||||
name="createdToken"
|
||||
readOnly
|
||||
value={createdToken}
|
||||
/>
|
||||
<div className="absolute top-0 right-2 bottom-0 flex items-center justify-center">
|
||||
<CopyTextButton
|
||||
value={createdToken}
|
||||
onCopySuccess={() => toast({ title: _(msg`Token copied to clipboard`) })}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<DialogFooter>
|
||||
<Button type="button" onClick={() => setOpen(false)}>
|
||||
<Trans>Done</Trans>
|
||||
</Button>
|
||||
</DialogFooter>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<DialogHeader>
|
||||
<DialogTitle>
|
||||
<Trans>Create API token</Trans>
|
||||
</DialogTitle>
|
||||
|
||||
<DialogDescription>
|
||||
<Trans>Use API tokens to authenticate with the Documenso API.</Trans>
|
||||
</DialogDescription>
|
||||
</DialogHeader>
|
||||
|
||||
<Form {...form}>
|
||||
<form onSubmit={form.handleSubmit(onSubmit)}>
|
||||
<fieldset className="flex h-full flex-col space-y-4" disabled={form.formState.isSubmitting}>
|
||||
<FormField
|
||||
control={form.control}
|
||||
name="tokenName"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel required>
|
||||
<Trans>Name</Trans>
|
||||
</FormLabel>
|
||||
|
||||
<FormControl>
|
||||
<Input className="bg-background" {...field} />
|
||||
</FormControl>
|
||||
|
||||
<FormDescription>
|
||||
<Trans>A name to help you identify this token later.</Trans>
|
||||
</FormDescription>
|
||||
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
|
||||
<FormField
|
||||
control={form.control}
|
||||
name="expirationDate"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>
|
||||
<Trans>Expires in</Trans>
|
||||
</FormLabel>
|
||||
|
||||
<FormControl>
|
||||
<Select value={field.value ?? NEVER_EXPIRE} onValueChange={field.onChange}>
|
||||
<SelectTrigger className="bg-background">
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
|
||||
<SelectContent>
|
||||
{Object.entries(EXPIRATION_DATES).map(([key, date]) => (
|
||||
<SelectItem key={key} value={key}>
|
||||
{_(date)}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormControl>
|
||||
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
|
||||
<DialogFooter>
|
||||
<Button type="button" variant="secondary" onClick={() => setOpen(false)}>
|
||||
<Trans>Cancel</Trans>
|
||||
</Button>
|
||||
|
||||
<Button type="submit" loading={form.formState.isSubmitting}>
|
||||
<Trans>Create token</Trans>
|
||||
</Button>
|
||||
</DialogFooter>
|
||||
</fieldset>
|
||||
</form>
|
||||
</Form>
|
||||
</>
|
||||
)}
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
);
|
||||
};
|
||||
@@ -105,7 +105,7 @@ export default function TokenDeleteDialog({ token, onDelete, children }: TokenDe
|
||||
<DialogContent>
|
||||
<DialogHeader>
|
||||
<DialogTitle>
|
||||
<Trans>Are you sure you want to delete this token?</Trans>
|
||||
<Trans>Delete token</Trans>
|
||||
</DialogTitle>
|
||||
|
||||
<DialogDescription>
|
||||
@@ -126,7 +126,7 @@ export default function TokenDeleteDialog({ token, onDelete, children }: TokenDe
|
||||
<FormLabel>
|
||||
<Trans>
|
||||
Confirm by typing:{' '}
|
||||
<span className="font-semibold font-sm text-destructive">{deleteMessage}</span>
|
||||
<span className="font-semibold text-destructive text-sm">{deleteMessage}</span>
|
||||
</Trans>
|
||||
</FormLabel>
|
||||
|
||||
@@ -139,21 +139,18 @@ export default function TokenDeleteDialog({ token, onDelete, children }: TokenDe
|
||||
/>
|
||||
|
||||
<DialogFooter>
|
||||
<div className="flex w-full flex-nowrap gap-4">
|
||||
<Button type="button" variant="secondary" className="flex-1" onClick={() => setIsOpen(false)}>
|
||||
<Trans>Cancel</Trans>
|
||||
</Button>
|
||||
<Button type="button" variant="secondary" onClick={() => setIsOpen(false)}>
|
||||
<Trans>Cancel</Trans>
|
||||
</Button>
|
||||
|
||||
<Button
|
||||
type="submit"
|
||||
variant="destructive"
|
||||
className="flex-1"
|
||||
disabled={!form.formState.isValid}
|
||||
loading={form.formState.isSubmitting}
|
||||
>
|
||||
<Trans>I'm sure! Delete it</Trans>
|
||||
</Button>
|
||||
</div>
|
||||
<Button
|
||||
type="submit"
|
||||
variant="destructive"
|
||||
disabled={!form.formState.isValid}
|
||||
loading={form.formState.isSubmitting}
|
||||
>
|
||||
<Trans>Delete</Trans>
|
||||
</Button>
|
||||
</DialogFooter>
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
@@ -117,7 +117,7 @@ export const WebhookDeleteDialog = ({ webhook, children }: WebhookDeleteDialogPr
|
||||
<FormLabel>
|
||||
<Trans>
|
||||
Confirm by typing:{' '}
|
||||
<span className="font-semibold font-sm text-destructive">{deleteMessage}</span>
|
||||
<span className="font-semibold text-destructive text-sm">{deleteMessage}</span>
|
||||
</Trans>
|
||||
</FormLabel>
|
||||
<FormControl>
|
||||
|
||||
@@ -503,7 +503,7 @@ export const ConfigureFieldsView = ({
|
||||
{selectedField && (
|
||||
<div
|
||||
className={cn(
|
||||
'pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center bg-white text-muted-foreground transition duration-200 [container-type:size] dark:text-muted-background',
|
||||
'pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center bg-white text-muted-foreground transition duration-200 [container-type:size] dark:text-muted',
|
||||
selectedRecipientStyles.base,
|
||||
{
|
||||
'-rotate-6 scale-90 opacity-50 dark:bg-black/20': !isFieldWithinBounds,
|
||||
|
||||
@@ -96,7 +96,7 @@ export const SignUpForm = ({
|
||||
password: '',
|
||||
signature: '',
|
||||
},
|
||||
mode: 'onBlur',
|
||||
mode: 'onChange',
|
||||
resolver: zodResolver(ZSignUpFormSchema),
|
||||
});
|
||||
|
||||
|
||||
@@ -1,254 +0,0 @@
|
||||
import { useCopyToClipboard } from '@documenso/lib/client-only/hooks/use-copy-to-clipboard';
|
||||
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
|
||||
import { trpc } from '@documenso/trpc/react';
|
||||
import { ZCreateApiTokenRequestSchema } from '@documenso/trpc/server/api-token-router/create-api-token.types';
|
||||
import { cn } from '@documenso/ui/lib/utils';
|
||||
import { Button } from '@documenso/ui/primitives/button';
|
||||
import { Card, CardContent } from '@documenso/ui/primitives/card';
|
||||
import {
|
||||
Form,
|
||||
FormControl,
|
||||
FormDescription,
|
||||
FormField,
|
||||
FormItem,
|
||||
FormLabel,
|
||||
FormMessage,
|
||||
} from '@documenso/ui/primitives/form/form';
|
||||
import { Input } from '@documenso/ui/primitives/input';
|
||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@documenso/ui/primitives/select';
|
||||
import { Switch } from '@documenso/ui/primitives/switch';
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
import { zodResolver } from '@hookform/resolvers/zod';
|
||||
import { msg } from '@lingui/core/macro';
|
||||
import { useLingui } from '@lingui/react';
|
||||
import { Trans } from '@lingui/react/macro';
|
||||
import type { ApiToken } from '@prisma/client';
|
||||
import { AnimatePresence, motion } from 'framer-motion';
|
||||
import { useState } from 'react';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { match } from 'ts-pattern';
|
||||
import type { z } from 'zod';
|
||||
|
||||
import { useCurrentTeam } from '~/providers/team';
|
||||
|
||||
export const EXPIRATION_DATES = {
|
||||
ONE_WEEK: msg`7 days`,
|
||||
ONE_MONTH: msg`1 month`,
|
||||
THREE_MONTHS: msg`3 months`,
|
||||
SIX_MONTHS: msg`6 months`,
|
||||
ONE_YEAR: msg`12 months`,
|
||||
} as const;
|
||||
|
||||
const ZCreateTokenFormSchema = ZCreateApiTokenRequestSchema.pick({
|
||||
tokenName: true,
|
||||
expirationDate: true,
|
||||
});
|
||||
|
||||
type TCreateTokenFormSchema = z.infer<typeof ZCreateTokenFormSchema>;
|
||||
|
||||
type NewlyCreatedToken = {
|
||||
id: number;
|
||||
token: string;
|
||||
};
|
||||
|
||||
export type ApiTokenFormProps = {
|
||||
className?: string;
|
||||
tokens?: Pick<ApiToken, 'id'>[];
|
||||
};
|
||||
|
||||
export const ApiTokenForm = ({ className, tokens }: ApiTokenFormProps) => {
|
||||
const [, copy] = useCopyToClipboard();
|
||||
|
||||
const team = useCurrentTeam();
|
||||
|
||||
const { _ } = useLingui();
|
||||
const { toast } = useToast();
|
||||
|
||||
const [newlyCreatedToken, setNewlyCreatedToken] = useState<NewlyCreatedToken | null>();
|
||||
const [noExpirationDate, setNoExpirationDate] = useState(false);
|
||||
|
||||
const { mutateAsync: createTokenMutation } = trpc.apiToken.create.useMutation({
|
||||
onSuccess(data) {
|
||||
setNewlyCreatedToken(data);
|
||||
},
|
||||
});
|
||||
|
||||
const form = useForm<TCreateTokenFormSchema>({
|
||||
resolver: zodResolver(ZCreateTokenFormSchema),
|
||||
defaultValues: {
|
||||
tokenName: '',
|
||||
expirationDate: '',
|
||||
},
|
||||
});
|
||||
|
||||
const copyToken = async (token: string) => {
|
||||
try {
|
||||
const copied = await copy(token);
|
||||
|
||||
if (!copied) {
|
||||
throw new Error('Unable to copy the token');
|
||||
}
|
||||
|
||||
toast({
|
||||
title: _(msg`Token copied to clipboard`),
|
||||
description: _(msg`The token was copied to your clipboard.`),
|
||||
});
|
||||
} catch (error) {
|
||||
toast({
|
||||
title: _(msg`Unable to copy token`),
|
||||
description: _(msg`We were unable to copy the token to your clipboard. Please try again.`),
|
||||
variant: 'destructive',
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const onSubmit = async ({ tokenName, expirationDate }: TCreateTokenFormSchema) => {
|
||||
try {
|
||||
await createTokenMutation({
|
||||
teamId: team.id,
|
||||
tokenName,
|
||||
expirationDate: noExpirationDate ? null : expirationDate,
|
||||
});
|
||||
|
||||
toast({
|
||||
title: _(msg`Token created`),
|
||||
description: _(msg`A new token was created successfully.`),
|
||||
duration: 5000,
|
||||
});
|
||||
|
||||
form.reset();
|
||||
} catch (err) {
|
||||
const error = AppError.parseError(err);
|
||||
|
||||
const errorMessage = match(error.code)
|
||||
.with(AppErrorCode.UNAUTHORIZED, () => msg`You do not have permission to create a token for this team.`)
|
||||
.otherwise(() => msg`Something went wrong. Please try again later.`);
|
||||
|
||||
toast({
|
||||
title: _(msg`An error occurred`),
|
||||
description: _(errorMessage),
|
||||
variant: 'destructive',
|
||||
duration: 5000,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className={cn(className)}>
|
||||
<Form {...form}>
|
||||
<form onSubmit={form.handleSubmit(onSubmit)}>
|
||||
<fieldset className="mt-6 flex w-full flex-col gap-4" disabled={form.formState.isSubmitting}>
|
||||
<FormField
|
||||
control={form.control}
|
||||
name="tokenName"
|
||||
render={({ field }) => (
|
||||
<FormItem className="flex-1">
|
||||
<FormLabel className="text-muted-foreground">
|
||||
<Trans>Token name</Trans>
|
||||
</FormLabel>
|
||||
|
||||
<div className="flex items-center gap-x-4">
|
||||
<FormControl className="flex-1">
|
||||
<Input type="text" {...field} />
|
||||
</FormControl>
|
||||
</div>
|
||||
|
||||
<FormDescription className="text-xs italic">
|
||||
<Trans>Please enter a meaningful name for your token. This will help you identify it later.</Trans>
|
||||
</FormDescription>
|
||||
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
|
||||
<div className="flex flex-col gap-4 md:flex-row">
|
||||
<FormField
|
||||
control={form.control}
|
||||
name="expirationDate"
|
||||
render={({ field }) => (
|
||||
<FormItem className="flex-1">
|
||||
<FormLabel className="text-muted-foreground">
|
||||
<Trans>Token expiration date</Trans>
|
||||
</FormLabel>
|
||||
|
||||
<div className="flex items-center gap-x-4">
|
||||
<FormControl className="flex-1">
|
||||
<Select onValueChange={field.onChange} disabled={noExpirationDate}>
|
||||
<SelectTrigger className="w-full">
|
||||
<SelectValue placeholder={_(msg`Choose...`)} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{Object.entries(EXPIRATION_DATES).map(([key, date]) => (
|
||||
<SelectItem key={key} value={key}>
|
||||
{_(date)}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormControl>
|
||||
</div>
|
||||
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
|
||||
<div>
|
||||
<FormLabel className="mt-2 text-muted-foreground">
|
||||
<Trans>Never expire</Trans>
|
||||
</FormLabel>
|
||||
<div className="block md:py-1.5">
|
||||
<Switch
|
||||
className="mt-2 bg-background"
|
||||
checked={noExpirationDate}
|
||||
onCheckedChange={setNoExpirationDate}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Button type="submit" className="hidden md:inline-flex" loading={form.formState.isSubmitting}>
|
||||
<Trans>Create token</Trans>
|
||||
</Button>
|
||||
|
||||
<div className="md:hidden">
|
||||
<Button type="submit" loading={form.formState.isSubmitting}>
|
||||
<Trans>Create token</Trans>
|
||||
</Button>
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
</Form>
|
||||
|
||||
<AnimatePresence>
|
||||
{newlyCreatedToken && tokens && tokens.find((token) => token.id === newlyCreatedToken.id) && (
|
||||
<motion.div
|
||||
className="mt-8"
|
||||
initial={{ opacity: 0, y: -40 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
exit={{ opacity: 0, y: 40 }}
|
||||
>
|
||||
<Card gradient>
|
||||
<CardContent className="p-4">
|
||||
<p className="mt-2 text-muted-foreground text-sm">
|
||||
<Trans>
|
||||
Your token was created successfully! Make sure to copy it because you won't be able to see it again!
|
||||
</Trans>
|
||||
</p>
|
||||
|
||||
<p className="my-4 rounded-md bg-muted-foreground/10 px-2.5 py-1 font-mono text-sm">
|
||||
{newlyCreatedToken.token}
|
||||
</p>
|
||||
|
||||
<Button variant="outline" onClick={() => void copyToken(newlyCreatedToken.token)}>
|
||||
<Trans>Copy token</Trans>
|
||||
</Button>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -87,7 +87,7 @@ export const AdminLicenseCard = ({ licenseData }: AdminLicenseCardProps) => {
|
||||
<KeyRoundIcon className="h-4 w-4 text-muted-foreground" />
|
||||
</div>
|
||||
|
||||
<h3 className="mb-2 flex items-end font-medium text-primary-forground text-sm leading-tight">
|
||||
<h3 className="mb-2 flex items-end font-medium text-foreground text-sm leading-tight">
|
||||
<Trans>Documenso License</Trans>
|
||||
</h3>
|
||||
|
||||
|
||||
+1
-1
@@ -270,7 +270,7 @@ export const EnvelopeEditorFieldDragDrop = ({
|
||||
{selectedField && (
|
||||
<div
|
||||
className={cn(
|
||||
'pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center rounded-[2px] bg-white font-noto text-muted-foreground ring-2 transition duration-200 [container-type:size] dark:text-muted-background',
|
||||
'pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center rounded-[2px] bg-white font-noto text-muted-foreground ring-2 transition duration-200 [container-type:size] dark:text-muted',
|
||||
selectedRecipientStyles.base,
|
||||
selectedField === FieldType.SIGNATURE && 'font-signature',
|
||||
{
|
||||
|
||||
@@ -174,7 +174,7 @@ export const EnvelopeDropZoneWrapper = ({ children, type, className }: EnvelopeD
|
||||
{type === EnvelopeType.DOCUMENT ? <Trans>Upload Document</Trans> : <Trans>Upload Template</Trans>}
|
||||
</h2>
|
||||
|
||||
<p className="mt-4 text-md text-muted-foreground">
|
||||
<p className="mt-4 text-base text-muted-foreground">
|
||||
<Trans>Drag and drop your document here</Trans>
|
||||
</p>
|
||||
|
||||
|
||||
@@ -3,27 +3,32 @@ import { dynamicActivate } from '@documenso/lib/utils/i18n';
|
||||
import { i18n } from '@lingui/core';
|
||||
import { detect, fromHtmlTag } from '@lingui/detect-locale';
|
||||
import { I18nProvider } from '@lingui/react';
|
||||
import { StrictMode, startTransition, useEffect } from 'react';
|
||||
import { StrictMode, startTransition } from 'react';
|
||||
import { hydrateRoot } from 'react-dom/client';
|
||||
import { HydratedRouter } from 'react-router/dom';
|
||||
|
||||
import './utils/polyfills/promise-with-resolvers';
|
||||
|
||||
function PosthogInit() {
|
||||
/**
|
||||
* Initialised imperatively (not as a component inside `hydrateRoot`) because
|
||||
* rendering extra client-only siblings changes the React tree structure
|
||||
* relative to the server render in `entry.server.tsx`. That shifts every
|
||||
* `useId` value (used by Radix for `id`/`htmlFor`/`aria-*`), causing hydration
|
||||
* mismatches which can abort hydration entirely when the user interacts with
|
||||
* the page early, leaving dead event handlers (broken dropdowns, native form
|
||||
* submits).
|
||||
*/
|
||||
function initPosthog() {
|
||||
const postHogConfig = extractPostHogConfig();
|
||||
|
||||
useEffect(() => {
|
||||
if (postHogConfig) {
|
||||
void import('posthog-js').then(({ default: posthog }) => {
|
||||
posthog.init(postHogConfig.key, {
|
||||
api_host: postHogConfig.host,
|
||||
capture_exceptions: true,
|
||||
});
|
||||
if (postHogConfig) {
|
||||
void import('posthog-js').then(({ default: posthog }) => {
|
||||
posthog.init(postHogConfig.key, {
|
||||
api_host: postHogConfig.host,
|
||||
capture_exceptions: true,
|
||||
});
|
||||
}
|
||||
}, []);
|
||||
|
||||
return null;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
@@ -38,11 +43,11 @@ async function main() {
|
||||
<I18nProvider i18n={i18n}>
|
||||
<HydratedRouter />
|
||||
</I18nProvider>
|
||||
|
||||
<PosthogInit />
|
||||
</StrictMode>,
|
||||
);
|
||||
});
|
||||
|
||||
void initPosthog();
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
||||
|
||||
+10
-2
@@ -119,7 +119,11 @@ export function LayoutContent({ children }: { children: React.ReactNode }) {
|
||||
const isRecipientRoute = matches.some((m) => m.id?.startsWith('routes/_recipient+'));
|
||||
|
||||
return (
|
||||
<html translate="no" lang={lang} data-theme={theme} className={theme ?? ''}>
|
||||
// `suppressHydrationWarning` because `remix-themes` intentionally mutates
|
||||
// `data-theme`/`class` on <html> before hydration (PreventFlashOnWrongTheme),
|
||||
// so the server-rendered attributes never match the client render when the
|
||||
// theme is resolved from the system preference. Attribute-only, one level deep.
|
||||
<html translate="no" lang={lang} data-theme={theme} className={theme ?? ''} suppressHydrationWarning>
|
||||
<head>
|
||||
<meta charSet="utf-8" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||
@@ -173,7 +177,11 @@ export function LayoutContent({ children }: { children: React.ReactNode }) {
|
||||
<script
|
||||
nonce={nonce(cspNonce)}
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: `window.__ENV__ = ${JSON.stringify(publicEnv)}`,
|
||||
// `__webpack_nonce__` is read by `get-nonce` (used by
|
||||
// react-remove-scroll / react-style-singleton inside Radix menus and
|
||||
// dialogs) to stamp runtime-injected <style> elements. Without it the
|
||||
// strict `style-src-elem` CSP blocks the scroll-lock styles.
|
||||
__html: `window.__ENV__ = ${JSON.stringify(publicEnv)}; window.__webpack_nonce__ = ${JSON.stringify(cspNonce ?? '')}`,
|
||||
}}
|
||||
/>
|
||||
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
import { trpc } from '@documenso/trpc/react';
|
||||
import type { TGetApiTokensResponse } from '@documenso/trpc/server/api-token-router/get-api-tokens.types';
|
||||
import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert';
|
||||
import { Badge } from '@documenso/ui/primitives/badge';
|
||||
import { Button } from '@documenso/ui/primitives/button';
|
||||
import { DataTable, type DataTableColumnDef } from '@documenso/ui/primitives/data-table';
|
||||
import { Skeleton } from '@documenso/ui/primitives/skeleton';
|
||||
import { TableCell } from '@documenso/ui/primitives/table';
|
||||
import { msg } from '@lingui/core/macro';
|
||||
import { useLingui } from '@lingui/react';
|
||||
import { Trans } from '@lingui/react/macro';
|
||||
import { Trans, useLingui } from '@lingui/react/macro';
|
||||
import { TeamMemberRole } from '@prisma/client';
|
||||
import { DateTime } from 'luxon';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
import { TokenCreateDialog } from '~/components/dialogs/token-create-dialog';
|
||||
import TokenDeleteDialog from '~/components/dialogs/token-delete-dialog';
|
||||
import { ApiTokenForm } from '~/components/forms/token';
|
||||
import { SettingsHeader } from '~/components/general/settings-header';
|
||||
import { useOptionalCurrentTeam } from '~/providers/team';
|
||||
import { appMetaTags } from '~/utils/meta';
|
||||
@@ -18,33 +22,88 @@ export function meta() {
|
||||
}
|
||||
|
||||
export default function ApiTokensPage() {
|
||||
const { i18n } = useLingui();
|
||||
|
||||
const { data: tokens } = trpc.apiToken.getMany.useQuery();
|
||||
const { t, i18n } = useLingui();
|
||||
|
||||
const team = useOptionalCurrentTeam();
|
||||
|
||||
const isUnauthorized = !!team && team.currentTeamRole !== TeamMemberRole.ADMIN;
|
||||
|
||||
const {
|
||||
data: tokens,
|
||||
isLoading,
|
||||
isError,
|
||||
} = trpc.apiToken.getMany.useQuery(undefined, {
|
||||
enabled: !isUnauthorized,
|
||||
});
|
||||
|
||||
const columns = useMemo(() => {
|
||||
return [
|
||||
{
|
||||
header: t`Name`,
|
||||
cell: ({ row }) => <span className="font-medium text-foreground">{row.original.name}</span>,
|
||||
},
|
||||
{
|
||||
header: t`Created`,
|
||||
cell: ({ row }) => i18n.date(row.original.createdAt),
|
||||
},
|
||||
{
|
||||
header: t`Expires`,
|
||||
cell: ({ row }) => {
|
||||
if (!row.original.expires) {
|
||||
return (
|
||||
<span className="text-muted-foreground">
|
||||
<Trans>Never</Trans>
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
if (row.original.expires < new Date()) {
|
||||
return (
|
||||
<Badge variant="destructive" size="small">
|
||||
<Trans>Expired</Trans>
|
||||
</Badge>
|
||||
);
|
||||
}
|
||||
|
||||
return i18n.date(row.original.expires);
|
||||
},
|
||||
},
|
||||
{
|
||||
header: t`Actions`,
|
||||
cell: ({ row }) => (
|
||||
<TokenDeleteDialog token={row.original}>
|
||||
<Button variant="destructive">
|
||||
<Trans>Delete</Trans>
|
||||
</Button>
|
||||
</TokenDeleteDialog>
|
||||
),
|
||||
},
|
||||
] satisfies DataTableColumnDef<TGetApiTokensResponse[number]>[];
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div>
|
||||
<SettingsHeader
|
||||
title={<Trans>API Tokens</Trans>}
|
||||
subtitle={
|
||||
<Trans>
|
||||
On this page, you can create and manage API tokens. See our{' '}
|
||||
Create and manage API tokens. See our{' '}
|
||||
<a
|
||||
className="text-primary underline"
|
||||
href={'https://docs.documenso.com/developers/public-api'}
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>
|
||||
Documentation
|
||||
documentation
|
||||
</a>{' '}
|
||||
for more information.
|
||||
</Trans>
|
||||
}
|
||||
/>
|
||||
>
|
||||
{!isUnauthorized && <TokenCreateDialog />}
|
||||
</SettingsHeader>
|
||||
|
||||
{team && team?.currentTeamRole !== TeamMemberRole.ADMIN ? (
|
||||
{isUnauthorized ? (
|
||||
<Alert className="flex flex-col items-center justify-between gap-4 p-6 md:flex-row" variant="warning">
|
||||
<div>
|
||||
<AlertTitle>
|
||||
@@ -56,58 +115,43 @@ export default function ApiTokensPage() {
|
||||
</div>
|
||||
</Alert>
|
||||
) : (
|
||||
<>
|
||||
<ApiTokenForm className="max-w-xl" tokens={tokens} />
|
||||
|
||||
<hr className="mt-8 mb-4" />
|
||||
|
||||
<h4 className="font-medium text-xl">
|
||||
<Trans>Your existing tokens</Trans>
|
||||
</h4>
|
||||
|
||||
{tokens && tokens.length === 0 && (
|
||||
<div className="mb-4">
|
||||
<p className="mt-2 text-muted-foreground text-sm italic">
|
||||
<Trans>Your tokens will be shown here once you create them.</Trans>
|
||||
<DataTable
|
||||
columns={columns}
|
||||
data={tokens ?? []}
|
||||
perPage={0}
|
||||
currentPage={0}
|
||||
totalPages={0}
|
||||
error={{
|
||||
enable: isError,
|
||||
}}
|
||||
emptyState={
|
||||
<div className="flex h-60 flex-col items-center justify-center gap-y-4 text-muted-foreground/60">
|
||||
<p>
|
||||
<Trans>You have no API tokens yet. Your tokens will be shown here once you create them.</Trans>
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{tokens && tokens.length > 0 && (
|
||||
<div className="mt-4 flex max-w-xl flex-col gap-y-4">
|
||||
{tokens.map((token) => (
|
||||
<div key={token.id} className="rounded-lg border border-border p-4">
|
||||
<div className="flex items-center justify-between gap-x-4">
|
||||
<div>
|
||||
<h5 className="text-base">{token.name}</h5>
|
||||
|
||||
<p className="mt-2 text-muted-foreground text-xs">
|
||||
<Trans>Created on {i18n.date(token.createdAt, DateTime.DATETIME_FULL)}</Trans>
|
||||
</p>
|
||||
{token.expires ? (
|
||||
<p className="mt-1 text-muted-foreground text-xs">
|
||||
<Trans>Expires on {i18n.date(token.expires, DateTime.DATETIME_FULL)}</Trans>
|
||||
</p>
|
||||
) : (
|
||||
<p className="mt-1 text-muted-foreground text-xs">
|
||||
<Trans>Token doesn't have an expiration date</Trans>
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<TokenDeleteDialog token={token}>
|
||||
<Button variant="destructive">
|
||||
<Trans>Delete</Trans>
|
||||
</Button>
|
||||
</TokenDeleteDialog>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
}
|
||||
skeleton={{
|
||||
enable: isLoading,
|
||||
rows: 3,
|
||||
component: (
|
||||
<>
|
||||
<TableCell>
|
||||
<Skeleton className="h-4 w-24 rounded-full" />
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<Skeleton className="h-4 w-16 rounded-full" />
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<Skeleton className="h-4 w-16 rounded-full" />
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<Skeleton className="h-4 w-12 rounded-full" />
|
||||
</TableCell>
|
||||
</>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -82,7 +82,7 @@ export default function WaitingForTurnToSignPage({ loaderData }: Route.Component
|
||||
<RecipientBranding branding={branding} cspNonce={cspNonce} />
|
||||
<div className="relative flex flex-col items-center justify-center px-4 py-12 sm:px-6 lg:px-8">
|
||||
<div className="w-full max-w-md text-center">
|
||||
<h2 className="font-bold text-3xl tracking-tigh">
|
||||
<h2 className="font-bold text-3xl tracking-tight">
|
||||
<Trans>Waiting for Your Turn</Trans>
|
||||
</h2>
|
||||
|
||||
|
||||
@@ -100,11 +100,11 @@
|
||||
"esbuild": "^0.27.0",
|
||||
"remix-flat-routes": "^0.8.5",
|
||||
"rollup": "^4.53.3",
|
||||
"tsx": "^4.20.6",
|
||||
"tsx": "^4.23.1",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^7.2.4",
|
||||
"vite-plugin-babel-macros": "^1.0.6",
|
||||
"vite-tsconfig-paths": "^5.1.4"
|
||||
},
|
||||
"version": "2.14.0"
|
||||
"version": "2.15.0"
|
||||
}
|
||||
|
||||
+2
-2
@@ -19,7 +19,7 @@ WORKDIR /app
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN npm install -g "turbo@^1.9.3"
|
||||
RUN npm install -g "turbo@^2.10.0"
|
||||
|
||||
# Outputs to the /out folder
|
||||
# source: https://turbo.build/repo/docs/reference/command-line-reference/prune#--docker
|
||||
@@ -79,7 +79,7 @@ COPY --from=builder /app/out/full/ .
|
||||
# Finally copy the turbo.json file so that we can run turbo commands
|
||||
COPY turbo.json turbo.json
|
||||
|
||||
RUN npm install -g "turbo@^1.9.3"
|
||||
RUN npm install -g "turbo@^2.10.0"
|
||||
|
||||
RUN turbo run build --filter=@documenso/remix...
|
||||
|
||||
|
||||
Generated
+3590
-1551
File diff suppressed because it is too large
Load Diff
+5
-3
@@ -5,7 +5,7 @@
|
||||
"apps/*",
|
||||
"packages/*"
|
||||
],
|
||||
"version": "2.14.0",
|
||||
"version": "2.15.0",
|
||||
"scripts": {
|
||||
"postinstall": "patch-package",
|
||||
"build": "turbo run build",
|
||||
@@ -61,12 +61,13 @@
|
||||
"@ts-rest/serverless": "^3.52.1",
|
||||
"dotenv": "^17.2.3",
|
||||
"dotenv-cli": "^11.0.0",
|
||||
"esbuild": "^0.27.0",
|
||||
"husky": "^9.1.7",
|
||||
"inngest": "^3.54.0",
|
||||
"inngest-cli": "^1.17.9",
|
||||
"lint-staged": "^16.2.7",
|
||||
"nanoid": "^5.1.6",
|
||||
"nodemailer": "^8.0.5",
|
||||
"nodemailer": "^9.0.0",
|
||||
"pdfjs-dist": "5.4.296",
|
||||
"pino": "^9.14.0",
|
||||
"pino-pretty": "^13.1.2",
|
||||
@@ -78,7 +79,7 @@
|
||||
"rimraf": "^6.1.2",
|
||||
"superjson": "^2.2.5",
|
||||
"syncpack": "^14.0.0-alpha.27",
|
||||
"turbo": "^1.13.4",
|
||||
"turbo": "^2.10.0",
|
||||
"vite": "^7.2.4",
|
||||
"vite-plugin-static-copy": "^3.1.4",
|
||||
"zod-openapi": "^4.2.4",
|
||||
@@ -104,6 +105,7 @@
|
||||
"overrides": {
|
||||
"lodash": "4.18.1",
|
||||
"pdfjs-dist": "5.4.296",
|
||||
"postcss": "^8.5.19",
|
||||
"typescript": "5.6.2",
|
||||
"zod": "$zod",
|
||||
"fumadocs-mdx": {
|
||||
|
||||
@@ -0,0 +1,199 @@
|
||||
import { prisma } from '@documenso/prisma';
|
||||
import { expect, type Page, test } from '@playwright/test';
|
||||
|
||||
import {
|
||||
clickAddSignerButton,
|
||||
clickEnvelopeEditorStep,
|
||||
getRecipientEmailInputs,
|
||||
openDocumentEnvelopeEditor,
|
||||
setRecipientEmail,
|
||||
setRecipientName,
|
||||
type TEnvelopeEditorSurface,
|
||||
} from '../fixtures/envelope-editor';
|
||||
|
||||
/**
|
||||
* Reproduction for the recipient autosave race condition.
|
||||
*
|
||||
* Symptom (production only, where there is real network lag):
|
||||
* 1. The author adds a recipient and types its name/email.
|
||||
* 2. They navigate to the "Add Fields" step.
|
||||
* 3. The recipient selector shows the default "Recipient 1" placeholder
|
||||
* instead of the recipient they just typed, and the typed name/email is
|
||||
* silently lost.
|
||||
*
|
||||
* Theory (see packages/lib/client-only/hooks/use-envelope-autosave.ts):
|
||||
* When the author navigates, `flushAutosave()` is awaited before the Add
|
||||
* Fields page renders. If an *earlier* (empty) recipient save is still
|
||||
* in-flight at that moment, `flush()` awaits that in-flight save and returns
|
||||
* WITHOUT committing the newer typed data sitting in `lastArgsRef` (whose
|
||||
* debounce timer it just cleared). The typed data is dropped, the empty
|
||||
* recipient persists, and the selector renders "Recipient 1".
|
||||
*
|
||||
* This only happens when a save is still in-flight at navigation time, which is
|
||||
* why it never reproduces locally (fast saves) but does on a laggy network.
|
||||
*
|
||||
* The test below simulates that lag by holding the first `envelope.recipient.set`
|
||||
* request open. It asserts the CORRECT behaviour (typed recipient survives), so
|
||||
* it is RED while the bug exists and GREEN once the autosave hook is fixed.
|
||||
*/
|
||||
|
||||
const RECIPIENT_SET_PROCEDURE = 'envelope.recipient.set';
|
||||
|
||||
// How long to hold the first recipient autosave "in-flight" to emulate prod lag.
|
||||
const SIMULATED_NETWORK_LAG_MS = 5000;
|
||||
|
||||
const FIRST_RECIPIENT = {
|
||||
name: 'Alice Author',
|
||||
email: 'alice-autosave-race@example.com',
|
||||
};
|
||||
|
||||
const SECOND_RECIPIENT = {
|
||||
name: 'Bob Builder',
|
||||
email: 'bob-autosave-race@example.com',
|
||||
};
|
||||
|
||||
type RecipientSetLagHandle = {
|
||||
/** Resolves the instant the first recipient.set request is in-flight on the client. */
|
||||
firstRecipientSetInFlight: Promise<void>;
|
||||
/** Raw request bodies of every recipient.set call we intercepted. */
|
||||
recipientSetRequestBodies: string[];
|
||||
};
|
||||
|
||||
/**
|
||||
* Installs a fake "production network lag" on the recipient autosave mutation.
|
||||
*
|
||||
* Only the FIRST recipient.set request is held open for `lagMs` (this is the save
|
||||
* that must still be in-flight at navigation time for the race to occur). It
|
||||
* resolves `firstRecipientSetInFlight` the instant it is intercepted so the test
|
||||
* can keep typing while that save is pending. Subsequent recipient.set requests
|
||||
* (e.g. the follow-up save the fixed hook issues) are forwarded immediately so the
|
||||
* test does not pay the lag twice.
|
||||
*/
|
||||
const installRecipientSetLag = async (page: Page, lagMs: number): Promise<RecipientSetLagHandle> => {
|
||||
let markFirstInFlight: () => void = () => {};
|
||||
|
||||
const firstRecipientSetInFlight = new Promise<void>((resolve) => {
|
||||
markFirstInFlight = resolve;
|
||||
});
|
||||
|
||||
const recipientSetRequestBodies: string[] = [];
|
||||
|
||||
await page.route('**/api/trpc/**', async (route) => {
|
||||
const request = route.request();
|
||||
|
||||
if (request.method() !== 'POST' || !request.url().includes(RECIPIENT_SET_PROCEDURE)) {
|
||||
await route.continue();
|
||||
return;
|
||||
}
|
||||
|
||||
const callIndex = recipientSetRequestBodies.length + 1;
|
||||
recipientSetRequestBodies.push(request.postData() ?? '');
|
||||
|
||||
if (callIndex === 1) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(`[test] holding first ${RECIPIENT_SET_PROCEDURE} for ${lagMs}ms (simulated network lag)`);
|
||||
|
||||
// The empty save is now in-flight from the client's perspective.
|
||||
markFirstInFlight();
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, lagMs));
|
||||
} else {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(`[test] forwarding ${RECIPIENT_SET_PROCEDURE} #${callIndex} (no lag)`);
|
||||
}
|
||||
|
||||
await route.continue();
|
||||
});
|
||||
|
||||
return { firstRecipientSetInFlight, recipientSetRequestBodies };
|
||||
};
|
||||
|
||||
const assertEnvelopeRecipientsPersisted = async (surface: TEnvelopeEditorSurface) => {
|
||||
if (!surface.envelopeId) {
|
||||
throw new Error('Expected the document editor surface to have an envelopeId');
|
||||
}
|
||||
|
||||
const envelope = await prisma.envelope.findFirstOrThrow({
|
||||
where: { id: surface.envelopeId },
|
||||
include: {
|
||||
recipients: {
|
||||
orderBy: { signingOrder: 'asc' },
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const persistedEmails = envelope.recipients.map((recipient) => recipient.email).filter(Boolean);
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(
|
||||
'[test] persisted recipients:',
|
||||
JSON.stringify(
|
||||
envelope.recipients.map((recipient) => ({ name: recipient.name, email: recipient.email })),
|
||||
null,
|
||||
2,
|
||||
),
|
||||
);
|
||||
|
||||
expect(persistedEmails).toContain(FIRST_RECIPIENT.email);
|
||||
expect(persistedEmails).toContain(SECOND_RECIPIENT.email);
|
||||
};
|
||||
|
||||
test.describe('envelope editor recipient autosave race (network lag)', () => {
|
||||
test('document editor: typed recipient survives navigation to Add Fields', async ({ page }) => {
|
||||
const surface = await openDocumentEnvelopeEditor(page);
|
||||
|
||||
const { firstRecipientSetInFlight, recipientSetRequestBodies } = await installRecipientSetLag(
|
||||
page,
|
||||
SIMULATED_NETWORK_LAG_MS,
|
||||
);
|
||||
|
||||
// 1. Add a second signer row. A blank document already has one empty default
|
||||
// signer, so this schedules an autosave of TWO empty recipients
|
||||
// (name='' / email='') - this is the save that will be in-flight.
|
||||
await clickAddSignerButton(surface.root);
|
||||
await expect(getRecipientEmailInputs(surface.root)).toHaveCount(2);
|
||||
|
||||
// 2. Wait until that empty autosave is actually in-flight on the client. This
|
||||
// is the precondition the bug needs: a slow save holding the autosave lock.
|
||||
await firstRecipientSetInFlight;
|
||||
|
||||
// 3. The author now fills in the recipients they are adding.
|
||||
await setRecipientName(surface.root, 0, FIRST_RECIPIENT.name);
|
||||
await setRecipientEmail(surface.root, 0, FIRST_RECIPIENT.email);
|
||||
await setRecipientName(surface.root, 1, SECOND_RECIPIENT.name);
|
||||
await setRecipientEmail(surface.root, 1, SECOND_RECIPIENT.email);
|
||||
|
||||
// 4. Immediately navigate to Add Fields (before the typed data's debounce
|
||||
// fires). flushAutosave() awaits the in-flight EMPTY save; with the bug
|
||||
// present it returns without ever committing the typed data.
|
||||
await clickEnvelopeEditorStep(surface.root, 'addFields');
|
||||
|
||||
// 5. Wait for the Add Fields page to render (after the lagged flush resolves).
|
||||
await expect(surface.root.getByText('Selected Recipient')).toBeVisible({
|
||||
timeout: SIMULATED_NETWORK_LAG_MS + 15000,
|
||||
});
|
||||
|
||||
// Diagnostics - the request bodies show what actually reached the server.
|
||||
// Buggy: only the first (empty) save is ever sent. Fixed: a follow-up save
|
||||
// carrying the typed recipients is sent too.
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('\n===== AUTOSAVE RACE DIAGNOSTICS =====');
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(`recipient.set requests sent to server: ${recipientSetRequestBodies.length}`);
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(
|
||||
`server ever received "${FIRST_RECIPIENT.email}": ${recipientSetRequestBodies.some((body) => body.includes(FIRST_RECIPIENT.email))}`,
|
||||
);
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('=====================================\n');
|
||||
|
||||
// 6. THE USER-VISIBLE BUG: the selected recipient must be the one we typed
|
||||
// (Alice), not the default "Recipient 1" placeholder.
|
||||
const selectedRecipientSection = surface.root.locator('section').filter({ hasText: 'Selected Recipient' });
|
||||
|
||||
await expect(selectedRecipientSection.getByRole('combobox')).toContainText(FIRST_RECIPIENT.name);
|
||||
|
||||
// 7. THE DATA LOSS: the typed recipients must actually be persisted.
|
||||
await assertEnvelopeRecipientsPersisted(surface);
|
||||
});
|
||||
});
|
||||
@@ -18,7 +18,7 @@
|
||||
"@playwright/test": "1.56.1",
|
||||
"@types/node": "^20",
|
||||
"@types/pngjs": "^6.0.5",
|
||||
"tsx": "^4.20.6",
|
||||
"tsx": "^4.23.1",
|
||||
"pixelmatch": "^7.1.0",
|
||||
"pngjs": "^7.0.0"
|
||||
},
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"clean": "rimraf node_modules"
|
||||
},
|
||||
"dependencies": {
|
||||
"@documenso/nodemailer-resend": "4.0.0",
|
||||
"@documenso/nodemailer-resend": "5.0.0",
|
||||
"@documenso/tailwind-config": "*",
|
||||
"@react-email/body": "0.2.0",
|
||||
"@react-email/button": "0.2.0",
|
||||
@@ -38,12 +38,12 @@
|
||||
"@react-email/section": "0.0.16",
|
||||
"@react-email/tailwind": "^2.0.1",
|
||||
"@react-email/text": "0.1.5",
|
||||
"nodemailer": "^8.0.5",
|
||||
"nodemailer": "^9.0.0",
|
||||
"react-email": "^5.0.6",
|
||||
"resend": "^6.5.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@documenso/tsconfig": "*",
|
||||
"@types/nodemailer": "^8.0.0"
|
||||
"@types/nodemailer": "^8.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ export const TemplateDocumentInvite = ({
|
||||
|
||||
<Section className="mt-8 mb-6 text-center">
|
||||
<Button
|
||||
className="inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-center font-medium text-primary-foreground text-sbase no-underline"
|
||||
className="inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-center font-medium text-base text-primary-foreground no-underline"
|
||||
href={signDocumentLink}
|
||||
>
|
||||
{match(role)
|
||||
|
||||
@@ -3,6 +3,8 @@ import type { SentMessageInfo, Transport } from 'nodemailer';
|
||||
import type { Address } from 'nodemailer/lib/mailer';
|
||||
import type MailMessage from 'nodemailer/lib/mailer/mail-message';
|
||||
|
||||
import { normalizeMailHeaders } from './normalize-headers';
|
||||
|
||||
const VERSION = '1.0.0';
|
||||
|
||||
type NodeMailerAddress = string | Address | Array<string | Address> | undefined;
|
||||
@@ -54,6 +56,7 @@ export class MailChannelsTransport implements Transport<SentMessageInfo> {
|
||||
const mailBcc = this.toMailChannelsAddresses(mail.data.bcc);
|
||||
|
||||
const [from] = this.toMailChannelsAddresses(mail.data.from);
|
||||
const [replyTo] = this.toMailChannelsAddresses(mail.data.replyTo);
|
||||
|
||||
if (!from) {
|
||||
return callback(new Error('Missing required field "from"'), null);
|
||||
@@ -72,6 +75,8 @@ export class MailChannelsTransport implements Transport<SentMessageInfo> {
|
||||
headers: requestHeaders,
|
||||
body: JSON.stringify({
|
||||
from: from,
|
||||
reply_to: replyTo,
|
||||
headers: normalizeMailHeaders(mail.data.headers),
|
||||
subject: mail.data.subject,
|
||||
personalizations: [
|
||||
{
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
import type Mail from 'nodemailer/lib/mailer';
|
||||
|
||||
/**
|
||||
* Normalizes nodemailer mail headers into the flat `Record<string, string>`
|
||||
* shape accepted by HTTP email APIs such as Resend and MailChannels.
|
||||
*
|
||||
* Kept in sync with `toResendHeaders` in the `@documenso/nodemailer-resend`
|
||||
* package, which applies the same normalization for the Resend transport.
|
||||
*/
|
||||
export const normalizeMailHeaders = (headers: Mail.Options['headers']): Record<string, string> | undefined => {
|
||||
if (!headers) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const normalized: Record<string, string> = {};
|
||||
|
||||
const appendHeader = (key: string, value: unknown) => {
|
||||
if (value === null || value === undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
const stringValue = String(value);
|
||||
|
||||
normalized[key] = normalized[key] ? `${normalized[key]}, ${stringValue}` : stringValue;
|
||||
};
|
||||
|
||||
if (Array.isArray(headers)) {
|
||||
for (const { key, value } of headers) {
|
||||
appendHeader(key, value);
|
||||
}
|
||||
} else {
|
||||
for (const [key, value] of Object.entries(headers)) {
|
||||
if (Array.isArray(value)) {
|
||||
for (const item of value) {
|
||||
appendHeader(key, item);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (typeof value === 'object' && value !== null) {
|
||||
appendHeader(key, value.value);
|
||||
continue;
|
||||
}
|
||||
|
||||
appendHeader(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
if (Object.keys(normalized).length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return normalized;
|
||||
};
|
||||
@@ -1,84 +1,100 @@
|
||||
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||
|
||||
/**
|
||||
* Debounced autosave for the envelope editor (recipients, fields, settings).
|
||||
*
|
||||
* Only one save runs at a time and the latest edit always wins. If the user
|
||||
* keeps editing while a save is on the wire, their newest changes get saved
|
||||
* right after, never dropped.
|
||||
*/
|
||||
export function useEnvelopeAutosave<T>(saveFn: (data: T) => Promise<void>, delay = 1000) {
|
||||
const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
||||
const lastArgsRef = useRef<T | null>(null);
|
||||
const pendingPromiseRef = useRef<Promise<void> | null>(null);
|
||||
|
||||
// The edit waiting to be saved. Wrapped in an object so null always means "nothing queued".
|
||||
const pendingRef = useRef<{ value: T } | null>(null);
|
||||
|
||||
// The save currently running, if any. Shared so we never kick off two at once.
|
||||
const commitPromiseRef = useRef<Promise<void> | null>(null);
|
||||
|
||||
// saveFn closes over editor state, so keep the latest one around without
|
||||
// making triggerSave/flush depend on it.
|
||||
const saveFnRef = useRef(saveFn);
|
||||
saveFnRef.current = saveFn;
|
||||
|
||||
const [isPending, setIsPending] = useState(false);
|
||||
const [isCommiting, setIsCommiting] = useState(false);
|
||||
|
||||
/**
|
||||
* Runs saves one at a time until the queue is empty. Anything queued
|
||||
* mid-save gets picked up on the next loop.
|
||||
*/
|
||||
const commit = useCallback((): Promise<void> => {
|
||||
if (commitPromiseRef.current) {
|
||||
return commitPromiseRef.current;
|
||||
}
|
||||
|
||||
if (!pendingRef.current) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
const pump = (async () => {
|
||||
try {
|
||||
setIsCommiting(true);
|
||||
|
||||
while (pendingRef.current) {
|
||||
const { value } = pendingRef.current;
|
||||
pendingRef.current = null;
|
||||
|
||||
await saveFnRef.current(value);
|
||||
}
|
||||
} finally {
|
||||
// eslint-disable-next-line require-atomic-updates
|
||||
commitPromiseRef.current = null;
|
||||
setIsCommiting(false);
|
||||
setIsPending(false);
|
||||
}
|
||||
})();
|
||||
|
||||
commitPromiseRef.current = pump;
|
||||
|
||||
return pump;
|
||||
}, []);
|
||||
|
||||
const triggerSave = useCallback(
|
||||
(data: T) => {
|
||||
lastArgsRef.current = data;
|
||||
pendingRef.current = { value: data };
|
||||
|
||||
// A debounce or promise means something is pending
|
||||
setIsPending(true);
|
||||
|
||||
if (timeoutRef.current) {
|
||||
clearTimeout(timeoutRef.current);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||
timeoutRef.current = setTimeout(async () => {
|
||||
if (!lastArgsRef.current) {
|
||||
return;
|
||||
}
|
||||
|
||||
const args = lastArgsRef.current;
|
||||
lastArgsRef.current = null;
|
||||
timeoutRef.current = setTimeout(() => {
|
||||
timeoutRef.current = null;
|
||||
|
||||
setIsCommiting(true);
|
||||
pendingPromiseRef.current = saveFn(args);
|
||||
|
||||
try {
|
||||
await pendingPromiseRef.current;
|
||||
} finally {
|
||||
// eslint-disable-next-line require-atomic-updates
|
||||
pendingPromiseRef.current = null;
|
||||
setIsCommiting(false);
|
||||
setIsPending(false);
|
||||
}
|
||||
void commit();
|
||||
}, delay);
|
||||
},
|
||||
[saveFn, delay],
|
||||
[commit, delay],
|
||||
);
|
||||
|
||||
/**
|
||||
* Skip the debounce and save now. The editor calls this when it needs
|
||||
* everything persisted, e.g. before sending or switching steps.
|
||||
*/
|
||||
const flush = useCallback(async () => {
|
||||
if (timeoutRef.current) {
|
||||
clearTimeout(timeoutRef.current);
|
||||
timeoutRef.current = null;
|
||||
}
|
||||
|
||||
if (pendingPromiseRef.current) {
|
||||
// Already running → wait for it
|
||||
await pendingPromiseRef.current;
|
||||
return;
|
||||
}
|
||||
|
||||
if (lastArgsRef.current) {
|
||||
const args = lastArgsRef.current;
|
||||
lastArgsRef.current = null;
|
||||
|
||||
setIsCommiting(true);
|
||||
setIsPending(true);
|
||||
|
||||
pendingPromiseRef.current = saveFn(args);
|
||||
try {
|
||||
await pendingPromiseRef.current;
|
||||
} finally {
|
||||
// eslint-disable-next-line require-atomic-updates
|
||||
pendingPromiseRef.current = null;
|
||||
setIsCommiting(false);
|
||||
setIsPending(false);
|
||||
}
|
||||
}
|
||||
}, [saveFn]);
|
||||
await commit();
|
||||
}, [commit]);
|
||||
|
||||
// Last-ditch attempt to save if the tab closes with unsaved edits.
|
||||
useEffect(() => {
|
||||
const handleBeforeUnload = () => {
|
||||
if (timeoutRef.current || pendingPromiseRef.current) {
|
||||
if (timeoutRef.current || pendingRef.current || commitPromiseRef.current) {
|
||||
void flush();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -60,8 +60,8 @@
|
||||
"pino": "^9.14.0",
|
||||
"pino-pretty": "^13.1.2",
|
||||
"playwright": "1.56.1",
|
||||
"postcss": "^8.5.14",
|
||||
"postcss-selector-parser": "^7.1.1",
|
||||
"postcss": "^8.5.19",
|
||||
"postcss-selector-parser": "^7.1.4",
|
||||
"posthog-js": "^1.297.2",
|
||||
"posthog-node": "4.18.0",
|
||||
"react": "^18",
|
||||
|
||||
@@ -1416,8 +1416,8 @@ msgid "Add Placeholders"
|
||||
msgstr "Platzhalter hinzufügen"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Add rate limit"
|
||||
msgstr "Rate-Limit hinzufügen"
|
||||
msgid "Add rate limit window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Add recipients"
|
||||
@@ -2008,6 +2008,7 @@ msgstr "Jede Quelle"
|
||||
msgid "Any Status"
|
||||
msgstr "Jeder Status"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
msgid "API"
|
||||
msgstr "API"
|
||||
@@ -2017,10 +2018,6 @@ msgstr "API"
|
||||
msgid "API key"
|
||||
msgstr "API-Schlüssel"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "API rate limits"
|
||||
msgstr "API-Rate-Limits"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "API requests"
|
||||
msgstr "API-Anfragen"
|
||||
@@ -2681,6 +2678,10 @@ msgstr "Unterzeichner kann nicht entfernt werden"
|
||||
msgid "Cannot upload items after the document has been sent"
|
||||
msgstr "Artikel können nicht hochgeladen werden, nachdem das Dokument versendet wurde."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Capabilities enabled for this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/constants/recipient-roles.ts
|
||||
msgctxt "Recipient role name"
|
||||
msgid "Cc"
|
||||
@@ -4407,10 +4408,6 @@ msgstr "Dokumenteinstellungen"
|
||||
msgid "Document preferences updated"
|
||||
msgstr "Dokumentpräferenzen aktualisiert"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Document rate limits"
|
||||
msgstr "Dokumenten-Rate-Limits"
|
||||
|
||||
#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
|
||||
#: apps/remix/app/components/general/document/document-status.tsx
|
||||
msgid "Document rejected"
|
||||
@@ -4546,6 +4543,7 @@ msgstr "Dokumentation"
|
||||
#: apps/remix/app/components/general/app-command-menu.tsx
|
||||
#: apps/remix/app/components/general/app-nav-desktop.tsx
|
||||
#: apps/remix/app/components/general/app-nav-mobile.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx
|
||||
@@ -4995,10 +4993,6 @@ msgstr "E-Mail-Präferenzen"
|
||||
msgid "Email preferences updated"
|
||||
msgstr "E-Mail-Präferenzen aktualisiert"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Email rate limits"
|
||||
msgstr "E-Mail-Rate-Limits"
|
||||
|
||||
#: packages/ui/components/document/document-email-checkboxes.tsx
|
||||
msgid "Email recipients when a pending document is deleted"
|
||||
msgstr "Empfänger per E-Mail benachrichtigen, wenn ein ausstehendes Dokument gelöscht wird"
|
||||
@@ -5094,6 +5088,7 @@ msgstr "E-Mail-Verifizierung wurde entfernt"
|
||||
msgid "Email verification has been resent"
|
||||
msgstr "E-Mail-Verifizierung wurde erneut gesendet"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
|
||||
@@ -5107,16 +5102,14 @@ msgstr "E-Mails"
|
||||
msgid "Embedding, 5 members included and more"
|
||||
msgstr "Einbettung, 5 Mitglieder enthalten und mehr"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty = Unlimited, 0 = Blocked"
|
||||
msgstr "Leer = Unbegrenzt, 0 = Blockiert"
|
||||
|
||||
#: packages/ui/primitives/document-flow/add-fields.tsx
|
||||
msgid "Empty field"
|
||||
msgstr "Leeres Feld"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty quota means unlimited, 0 blocks the resource. Rate limit windows accept values like 5m, 1h or 24h."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-inherit-member-enable-dialog.tsx
|
||||
msgid "Enable"
|
||||
msgstr "Aktivieren"
|
||||
@@ -5236,6 +5229,10 @@ msgstr "Stellen Sie sicher, dass Sie das Embedding-Token verwenden und nicht das
|
||||
msgid "Enter"
|
||||
msgstr "Eingeben"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a max request count greater than 0"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/folder-create-dialog.tsx
|
||||
msgid "Enter a name for your new folder. Folders help you organise your items."
|
||||
msgstr "Geben Sie einen Namen für Ihren neuen Ordner ein. Ordner helfen Ihnen, Ihre Dateien zu organisieren."
|
||||
@@ -5244,6 +5241,10 @@ msgstr "Geben Sie einen Namen für Ihren neuen Ordner ein. Ordner helfen Ihnen,
|
||||
msgid "Enter a new title"
|
||||
msgstr "Neuen Titel eingeben"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a window, e.g. 5m"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/subscription-claim-form.tsx
|
||||
msgid "Enter claim name"
|
||||
msgstr "Anspruchsname eingeben"
|
||||
@@ -5502,6 +5503,10 @@ msgstr "Alle haben unterschrieben"
|
||||
msgid "Everyone has signed! You will receive an email copy of the signed document."
|
||||
msgstr "Alle haben unterschrieben! Sie erhalten eine Kopie des unterschriebenen Dokuments per E-Mail."
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Exceeded"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
msgid "Exceeded timeout"
|
||||
msgstr "Zeitüberschreitung überschritten"
|
||||
@@ -6765,6 +6770,10 @@ msgstr "Lichtmodus"
|
||||
msgid "Like to have your own public profile with agreements?"
|
||||
msgstr "Möchten Sie Ihr eigenes öffentliches Profil mit Vereinbarungen haben?"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Limit reached"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Limits"
|
||||
msgstr "Limits"
|
||||
@@ -7070,6 +7079,10 @@ msgstr "MAU (angemeldet)"
|
||||
msgid "Max"
|
||||
msgstr "Max"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Max requests"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
|
||||
msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults."
|
||||
msgstr "Maximale Dateigröße: 4MB. Maximal 100 Zeilen pro Upload. Leere Werte verwenden die Vorlagenstandards."
|
||||
@@ -7116,12 +7129,12 @@ msgstr "Mitglied seit"
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-groups-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/teams.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
@@ -7190,16 +7203,12 @@ msgid "Monthly Active Users: Users that had at least one of their documents comp
|
||||
msgstr "Monatlich aktive Benutzer: Benutzer, die mindestens eines ihrer Dokumente abgeschlossen haben"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly API quota"
|
||||
msgstr "Monatliches API-Kontingent"
|
||||
msgid "Monthly quota"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly document quota"
|
||||
msgstr "Monatliches Dokumentenkontingent"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly email quota"
|
||||
msgstr "Monatliches E-Mail-Kontingent"
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Monthly usage"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelopes-bulk-move-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/folder-move-dialog.tsx
|
||||
@@ -7290,7 +7299,6 @@ msgid "Name"
|
||||
msgstr "Name"
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-name-dialog.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Name is required"
|
||||
msgstr "Name ist erforderlich"
|
||||
|
||||
@@ -7298,6 +7306,10 @@ msgstr "Name ist erforderlich"
|
||||
msgid "Name Settings"
|
||||
msgstr "Einstellungen für Namen"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Near limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
|
||||
msgid "Need to sign documents?"
|
||||
msgstr "Müssen Dokumente signieren?"
|
||||
@@ -7437,6 +7449,10 @@ msgstr "Es sind derzeit keine weiteren Maßnahmen Ihrerseits erforderlich."
|
||||
msgid "No groups found"
|
||||
msgstr "Keine Gruppen gefunden"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "No inherited claim"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/admin-license-card.tsx
|
||||
msgid "No License Configured"
|
||||
msgstr "Keine Lizenz konfiguriert"
|
||||
@@ -8153,6 +8169,10 @@ msgstr "Ausstehende Organisationseinladungen"
|
||||
msgid "Pending since"
|
||||
msgstr "Ausstehend seit"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "People with access to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/billing-plans.tsx
|
||||
msgid "per month"
|
||||
@@ -8315,10 +8335,6 @@ msgstr "Bitte geben Sie einen aussagekräftigen Namen für Ihr Token ein. Dies w
|
||||
msgid "Please enter a number"
|
||||
msgstr "Bitte gib eine Zahl ein"
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Please enter a valid name."
|
||||
msgstr "Bitte geben Sie einen gültigen Namen ein."
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-number-dialog.tsx
|
||||
msgid "Please enter a valid number"
|
||||
msgstr "Bitte geben Sie eine gültige Nummer ein."
|
||||
@@ -9057,6 +9073,10 @@ msgstr "Organisationsmitglied entfernen"
|
||||
msgid "Remove Organisation Member"
|
||||
msgstr "Organisationsmitglied entfernen"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Remove rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Remove recipient"
|
||||
msgstr "Empfänger entfernen"
|
||||
@@ -9247,6 +9267,10 @@ msgstr "Zahlung klären"
|
||||
msgid "Resolve payment"
|
||||
msgstr "Zahlung klären"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Resource blocked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/webhook-logs-sheet.tsx
|
||||
msgid "Response"
|
||||
msgstr "Antwort"
|
||||
@@ -9823,6 +9847,10 @@ msgstr "Senden..."
|
||||
msgid "Sent"
|
||||
msgstr "Gesendet"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Sent this period"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr "Sitzung widerrufen"
|
||||
@@ -10805,10 +10833,10 @@ msgid "Team URL"
|
||||
msgstr "Team-URL"
|
||||
|
||||
#: apps/remix/app/components/general/org-menu-switcher.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
|
||||
@@ -10819,6 +10847,10 @@ msgstr "Teams"
|
||||
msgid "Teams help you organise your work and collaborate with others. Create your first team to get started."
|
||||
msgstr "Teams helfen Ihnen, Ihre Arbeit zu organisieren und mit anderen zusammenzuarbeiten. Erstellen Sie Ihr erstes Team, um loszulegen."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Teams that belong to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Teams that this organisation group is currently assigned to"
|
||||
msgstr "Teams, denen diese Organisationsgruppe derzeit zugewiesen ist"
|
||||
@@ -12297,8 +12329,6 @@ msgstr "Unbekannter Name"
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Unlimited"
|
||||
msgstr "Unbegrenzt"
|
||||
|
||||
@@ -12591,15 +12621,18 @@ msgstr "Hochladen"
|
||||
msgid "URL"
|
||||
msgstr "URL"
|
||||
|
||||
#. placeholder {0}: selectedStat?.period || 'N/A'
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Usage for period: {0}"
|
||||
msgstr "Nutzung für Zeitraum: {0}"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
|
||||
msgid "Use"
|
||||
msgstr "Verwenden"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a duration with a unit, e.g. 5m, 1h, or 24h"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a unique window for each rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
|
||||
#: apps/remix/app/components/forms/signin.tsx
|
||||
msgid "Use Authenticator"
|
||||
@@ -13501,10 +13534,18 @@ msgstr "Whitelabeling, unbegrenzte Mitglieder und mehr"
|
||||
msgid "Width:"
|
||||
msgstr "Breite:"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
|
||||
msgid "Withdrawing Consent"
|
||||
msgstr "Zustimmung widerrufen"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Within limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
msgid "Write a description to display on your public profile"
|
||||
msgstr "Schreiben Sie eine Beschreibung, die in Ihrem öffentlichen Profil angezeigt wird"
|
||||
|
||||
@@ -1411,8 +1411,8 @@ msgid "Add Placeholders"
|
||||
msgstr "Add Placeholders"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Add rate limit"
|
||||
msgstr "Add rate limit"
|
||||
msgid "Add rate limit window"
|
||||
msgstr "Add rate limit window"
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Add recipients"
|
||||
@@ -2003,6 +2003,7 @@ msgstr "Any Source"
|
||||
msgid "Any Status"
|
||||
msgstr "Any Status"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
msgid "API"
|
||||
msgstr "API"
|
||||
@@ -2012,10 +2013,6 @@ msgstr "API"
|
||||
msgid "API key"
|
||||
msgstr "API key"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "API rate limits"
|
||||
msgstr "API rate limits"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "API requests"
|
||||
msgstr "API requests"
|
||||
@@ -2676,6 +2673,10 @@ msgstr "Cannot remove signer"
|
||||
msgid "Cannot upload items after the document has been sent"
|
||||
msgstr "Cannot upload items after the document has been sent"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Capabilities enabled for this organisation."
|
||||
msgstr "Capabilities enabled for this organisation."
|
||||
|
||||
#: packages/lib/constants/recipient-roles.ts
|
||||
msgctxt "Recipient role name"
|
||||
msgid "Cc"
|
||||
@@ -4402,10 +4403,6 @@ msgstr "Document Preferences"
|
||||
msgid "Document preferences updated"
|
||||
msgstr "Document preferences updated"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Document rate limits"
|
||||
msgstr "Document rate limits"
|
||||
|
||||
#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
|
||||
#: apps/remix/app/components/general/document/document-status.tsx
|
||||
msgid "Document rejected"
|
||||
@@ -4541,6 +4538,7 @@ msgstr "Documentation"
|
||||
#: apps/remix/app/components/general/app-command-menu.tsx
|
||||
#: apps/remix/app/components/general/app-nav-desktop.tsx
|
||||
#: apps/remix/app/components/general/app-nav-mobile.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx
|
||||
@@ -4990,10 +4988,6 @@ msgstr "Email Preferences"
|
||||
msgid "Email preferences updated"
|
||||
msgstr "Email preferences updated"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Email rate limits"
|
||||
msgstr "Email rate limits"
|
||||
|
||||
#: packages/ui/components/document/document-email-checkboxes.tsx
|
||||
msgid "Email recipients when a pending document is deleted"
|
||||
msgstr "Email recipients when a pending document is deleted"
|
||||
@@ -5089,6 +5083,7 @@ msgstr "Email verification has been removed"
|
||||
msgid "Email verification has been resent"
|
||||
msgstr "Email verification has been resent"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
|
||||
@@ -5102,16 +5097,14 @@ msgstr "Emails"
|
||||
msgid "Embedding, 5 members included and more"
|
||||
msgstr "Embedding, 5 members included and more"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty = Unlimited, 0 = Blocked"
|
||||
msgstr "Empty = Unlimited, 0 = Blocked"
|
||||
|
||||
#: packages/ui/primitives/document-flow/add-fields.tsx
|
||||
msgid "Empty field"
|
||||
msgstr "Empty field"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty quota means unlimited, 0 blocks the resource. Rate limit windows accept values like 5m, 1h or 24h."
|
||||
msgstr "Empty quota means unlimited, 0 blocks the resource. Rate limit windows accept values like 5m, 1h or 24h."
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-inherit-member-enable-dialog.tsx
|
||||
msgid "Enable"
|
||||
msgstr "Enable"
|
||||
@@ -5231,6 +5224,10 @@ msgstr "Ensure that you are using the embedding token, not the API token"
|
||||
msgid "Enter"
|
||||
msgstr "Enter"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a max request count greater than 0"
|
||||
msgstr "Enter a max request count greater than 0"
|
||||
|
||||
#: apps/remix/app/components/dialogs/folder-create-dialog.tsx
|
||||
msgid "Enter a name for your new folder. Folders help you organise your items."
|
||||
msgstr "Enter a name for your new folder. Folders help you organise your items."
|
||||
@@ -5239,6 +5236,10 @@ msgstr "Enter a name for your new folder. Folders help you organise your items."
|
||||
msgid "Enter a new title"
|
||||
msgstr "Enter a new title"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a window, e.g. 5m"
|
||||
msgstr "Enter a window, e.g. 5m"
|
||||
|
||||
#: apps/remix/app/components/forms/subscription-claim-form.tsx
|
||||
msgid "Enter claim name"
|
||||
msgstr "Enter claim name"
|
||||
@@ -5497,6 +5498,10 @@ msgstr "Everyone has signed"
|
||||
msgid "Everyone has signed! You will receive an email copy of the signed document."
|
||||
msgstr "Everyone has signed! You will receive an email copy of the signed document."
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Exceeded"
|
||||
msgstr "Exceeded"
|
||||
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
msgid "Exceeded timeout"
|
||||
msgstr "Exceeded timeout"
|
||||
@@ -6760,6 +6765,10 @@ msgstr "Light Mode"
|
||||
msgid "Like to have your own public profile with agreements?"
|
||||
msgstr "Like to have your own public profile with agreements?"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Limit reached"
|
||||
msgstr "Limit reached"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Limits"
|
||||
msgstr "Limits"
|
||||
@@ -7065,6 +7074,10 @@ msgstr "MAU (signed in)"
|
||||
msgid "Max"
|
||||
msgstr "Max"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Max requests"
|
||||
msgstr "Max requests"
|
||||
|
||||
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
|
||||
msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults."
|
||||
msgstr "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults."
|
||||
@@ -7111,12 +7124,12 @@ msgstr "Member Since"
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-groups-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/teams.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
@@ -7185,16 +7198,12 @@ msgid "Monthly Active Users: Users that had at least one of their documents comp
|
||||
msgstr "Monthly Active Users: Users that had at least one of their documents completed"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly API quota"
|
||||
msgstr "Monthly API quota"
|
||||
msgid "Monthly quota"
|
||||
msgstr "Monthly quota"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly document quota"
|
||||
msgstr "Monthly document quota"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly email quota"
|
||||
msgstr "Monthly email quota"
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Monthly usage"
|
||||
msgstr "Monthly usage"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelopes-bulk-move-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/folder-move-dialog.tsx
|
||||
@@ -7285,7 +7294,6 @@ msgid "Name"
|
||||
msgstr "Name"
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-name-dialog.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Name is required"
|
||||
msgstr "Name is required"
|
||||
|
||||
@@ -7293,6 +7301,10 @@ msgstr "Name is required"
|
||||
msgid "Name Settings"
|
||||
msgstr "Name Settings"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Near limit"
|
||||
msgstr "Near limit"
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
|
||||
msgid "Need to sign documents?"
|
||||
msgstr "Need to sign documents?"
|
||||
@@ -7432,6 +7444,10 @@ msgstr "No further action is required from you at this time."
|
||||
msgid "No groups found"
|
||||
msgstr "No groups found"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "No inherited claim"
|
||||
msgstr "No inherited claim"
|
||||
|
||||
#: apps/remix/app/components/general/admin-license-card.tsx
|
||||
msgid "No License Configured"
|
||||
msgstr "No License Configured"
|
||||
@@ -8148,6 +8164,10 @@ msgstr "Pending Organisation Invites"
|
||||
msgid "Pending since"
|
||||
msgstr "Pending since"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "People with access to this organisation."
|
||||
msgstr "People with access to this organisation."
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/billing-plans.tsx
|
||||
msgid "per month"
|
||||
@@ -8310,10 +8330,6 @@ msgstr "Please enter a meaningful name for your token. This will help you identi
|
||||
msgid "Please enter a number"
|
||||
msgstr "Please enter a number"
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Please enter a valid name."
|
||||
msgstr "Please enter a valid name."
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-number-dialog.tsx
|
||||
msgid "Please enter a valid number"
|
||||
msgstr "Please enter a valid number"
|
||||
@@ -9052,6 +9068,10 @@ msgstr "Remove organisation member"
|
||||
msgid "Remove Organisation Member"
|
||||
msgstr "Remove Organisation Member"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Remove rate limit"
|
||||
msgstr "Remove rate limit"
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Remove recipient"
|
||||
msgstr "Remove recipient"
|
||||
@@ -9242,6 +9262,10 @@ msgstr "Resolve"
|
||||
msgid "Resolve payment"
|
||||
msgstr "Resolve payment"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Resource blocked"
|
||||
msgstr "Resource blocked"
|
||||
|
||||
#: apps/remix/app/components/general/webhook-logs-sheet.tsx
|
||||
msgid "Response"
|
||||
msgstr "Response"
|
||||
@@ -9818,6 +9842,10 @@ msgstr "Sending..."
|
||||
msgid "Sent"
|
||||
msgstr "Sent"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Sent this period"
|
||||
msgstr "Sent this period"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr "Session revoked"
|
||||
@@ -10800,10 +10828,10 @@ msgid "Team URL"
|
||||
msgstr "Team URL"
|
||||
|
||||
#: apps/remix/app/components/general/org-menu-switcher.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
|
||||
@@ -10814,6 +10842,10 @@ msgstr "Teams"
|
||||
msgid "Teams help you organise your work and collaborate with others. Create your first team to get started."
|
||||
msgstr "Teams help you organise your work and collaborate with others. Create your first team to get started."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Teams that belong to this organisation."
|
||||
msgstr "Teams that belong to this organisation."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Teams that this organisation group is currently assigned to"
|
||||
msgstr "Teams that this organisation group is currently assigned to"
|
||||
@@ -12292,8 +12324,6 @@ msgstr "Unknown name"
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Unlimited"
|
||||
msgstr "Unlimited"
|
||||
|
||||
@@ -12586,15 +12616,18 @@ msgstr "Uploading"
|
||||
msgid "URL"
|
||||
msgstr "URL"
|
||||
|
||||
#. placeholder {0}: selectedStat?.period || 'N/A'
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Usage for period: {0}"
|
||||
msgstr "Usage for period: {0}"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
|
||||
msgid "Use"
|
||||
msgstr "Use"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a duration with a unit, e.g. 5m, 1h, or 24h"
|
||||
msgstr "Use a duration with a unit, e.g. 5m, 1h, or 24h"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a unique window for each rate limit"
|
||||
msgstr "Use a unique window for each rate limit"
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
|
||||
#: apps/remix/app/components/forms/signin.tsx
|
||||
msgid "Use Authenticator"
|
||||
@@ -13496,10 +13529,18 @@ msgstr "Whitelabeling, unlimited members and more"
|
||||
msgid "Width:"
|
||||
msgstr "Width:"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Window"
|
||||
msgstr "Window"
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
|
||||
msgid "Withdrawing Consent"
|
||||
msgstr "Withdrawing Consent"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Within limit"
|
||||
msgstr "Within limit"
|
||||
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
msgid "Write a description to display on your public profile"
|
||||
msgstr "Write a description to display on your public profile"
|
||||
|
||||
@@ -1416,8 +1416,8 @@ msgid "Add Placeholders"
|
||||
msgstr "Agregar Marcadores de posición"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Add rate limit"
|
||||
msgstr "Agregar límite de velocidad"
|
||||
msgid "Add rate limit window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Add recipients"
|
||||
@@ -2008,6 +2008,7 @@ msgstr "Cualquier fuente"
|
||||
msgid "Any Status"
|
||||
msgstr "Cualquier estado"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
msgid "API"
|
||||
msgstr "API"
|
||||
@@ -2017,10 +2018,6 @@ msgstr "API"
|
||||
msgid "API key"
|
||||
msgstr "Clave API"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "API rate limits"
|
||||
msgstr "Límites de velocidad de la API"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "API requests"
|
||||
msgstr "Solicitudes de API"
|
||||
@@ -2681,6 +2678,10 @@ msgstr "No se puede eliminar el firmante"
|
||||
msgid "Cannot upload items after the document has been sent"
|
||||
msgstr "No se pueden cargar elementos después de que el documento ha sido enviado"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Capabilities enabled for this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/constants/recipient-roles.ts
|
||||
msgctxt "Recipient role name"
|
||||
msgid "Cc"
|
||||
@@ -4407,10 +4408,6 @@ msgstr "Preferencias del documento"
|
||||
msgid "Document preferences updated"
|
||||
msgstr "Preferencias del documento actualizadas"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Document rate limits"
|
||||
msgstr "Límites de velocidad de documentos"
|
||||
|
||||
#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
|
||||
#: apps/remix/app/components/general/document/document-status.tsx
|
||||
msgid "Document rejected"
|
||||
@@ -4546,6 +4543,7 @@ msgstr "Documentación"
|
||||
#: apps/remix/app/components/general/app-command-menu.tsx
|
||||
#: apps/remix/app/components/general/app-nav-desktop.tsx
|
||||
#: apps/remix/app/components/general/app-nav-mobile.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx
|
||||
@@ -4995,10 +4993,6 @@ msgstr "Preferencias de correo electrónico"
|
||||
msgid "Email preferences updated"
|
||||
msgstr "Preferencias de correo electrónico actualizadas"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Email rate limits"
|
||||
msgstr "Límites de velocidad de correo electrónico"
|
||||
|
||||
#: packages/ui/components/document/document-email-checkboxes.tsx
|
||||
msgid "Email recipients when a pending document is deleted"
|
||||
msgstr "Enviar un correo electrónico a los destinatarios cuando se elimine un documento pendiente"
|
||||
@@ -5094,6 +5088,7 @@ msgstr "La verificación de correo electrónico ha sido eliminada"
|
||||
msgid "Email verification has been resent"
|
||||
msgstr "La verificación de correo electrónico ha sido reenviada"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
|
||||
@@ -5107,16 +5102,14 @@ msgstr "Correos electrónicos"
|
||||
msgid "Embedding, 5 members included and more"
|
||||
msgstr "Incrustación, 5 miembros incluidos y más"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty = Unlimited, 0 = Blocked"
|
||||
msgstr "Vacío = Ilimitado, 0 = Bloqueado"
|
||||
|
||||
#: packages/ui/primitives/document-flow/add-fields.tsx
|
||||
msgid "Empty field"
|
||||
msgstr "Campo vacío"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty quota means unlimited, 0 blocks the resource. Rate limit windows accept values like 5m, 1h or 24h."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-inherit-member-enable-dialog.tsx
|
||||
msgid "Enable"
|
||||
msgstr "Habilitar"
|
||||
@@ -5236,6 +5229,10 @@ msgstr "Asegúrate de que estás utilizando el token de incrustación, no el tok
|
||||
msgid "Enter"
|
||||
msgstr "Ingresar"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a max request count greater than 0"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/folder-create-dialog.tsx
|
||||
msgid "Enter a name for your new folder. Folders help you organise your items."
|
||||
msgstr "Ingrese un nombre para su nueva carpeta. Las carpetas le ayudan a organizar sus elementos."
|
||||
@@ -5244,6 +5241,10 @@ msgstr "Ingrese un nombre para su nueva carpeta. Las carpetas le ayudan a organi
|
||||
msgid "Enter a new title"
|
||||
msgstr "Introduce un nuevo título"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a window, e.g. 5m"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/subscription-claim-form.tsx
|
||||
msgid "Enter claim name"
|
||||
msgstr "Ingresar nombre de la reclamación"
|
||||
@@ -5502,6 +5503,10 @@ msgstr "Todos han firmado"
|
||||
msgid "Everyone has signed! You will receive an email copy of the signed document."
|
||||
msgstr "¡Todos han firmado! Recibirás una copia del documento firmado por correo electrónico."
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Exceeded"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
msgid "Exceeded timeout"
|
||||
msgstr "Tiempo de espera excedido"
|
||||
@@ -6765,6 +6770,10 @@ msgstr "Modo claro"
|
||||
msgid "Like to have your own public profile with agreements?"
|
||||
msgstr "¿Te gustaría tener tu propio perfil público con acuerdos?"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Limit reached"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Limits"
|
||||
msgstr "Límites"
|
||||
@@ -7070,6 +7079,10 @@ msgstr "MAU (con sesión iniciada)"
|
||||
msgid "Max"
|
||||
msgstr "Máx"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Max requests"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
|
||||
msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults."
|
||||
msgstr "Tamaño máximo de archivo: 4MB. Máximo 100 filas por carga. Los valores en blanco usarán los valores predeterminados de la plantilla."
|
||||
@@ -7116,12 +7129,12 @@ msgstr "Miembro desde"
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-groups-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/teams.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
@@ -7190,16 +7203,12 @@ msgid "Monthly Active Users: Users that had at least one of their documents comp
|
||||
msgstr "Usuarios activos mensuales: Usuarios que completaron al menos uno de sus documentos"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly API quota"
|
||||
msgstr "Cuota mensual de API"
|
||||
msgid "Monthly quota"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly document quota"
|
||||
msgstr "Cuota mensual de documentos"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly email quota"
|
||||
msgstr "Cuota mensual de correos electrónicos"
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Monthly usage"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelopes-bulk-move-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/folder-move-dialog.tsx
|
||||
@@ -7290,7 +7299,6 @@ msgid "Name"
|
||||
msgstr "Nombre"
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-name-dialog.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Name is required"
|
||||
msgstr "Se requiere el nombre"
|
||||
|
||||
@@ -7298,6 +7306,10 @@ msgstr "Se requiere el nombre"
|
||||
msgid "Name Settings"
|
||||
msgstr "Configuración de Nombre"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Near limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
|
||||
msgid "Need to sign documents?"
|
||||
msgstr "¿Necesitas firmar documentos?"
|
||||
@@ -7437,6 +7449,10 @@ msgstr "No further action is required from you at this time."
|
||||
msgid "No groups found"
|
||||
msgstr "No se encontraron grupos"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "No inherited claim"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/admin-license-card.tsx
|
||||
msgid "No License Configured"
|
||||
msgstr "Licencia no configurada"
|
||||
@@ -8153,6 +8169,10 @@ msgstr "Invitaciones pendientes de la organización"
|
||||
msgid "Pending since"
|
||||
msgstr "Pendiente desde"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "People with access to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/billing-plans.tsx
|
||||
msgid "per month"
|
||||
@@ -8315,10 +8335,6 @@ msgstr "Por favor, ingresa un nombre significativo para tu token. Esto te ayudar
|
||||
msgid "Please enter a number"
|
||||
msgstr "Por favor ingresa un número"
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Please enter a valid name."
|
||||
msgstr "Por favor, introduce un nombre válido."
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-number-dialog.tsx
|
||||
msgid "Please enter a valid number"
|
||||
msgstr "Por favor, ingresa un número válido"
|
||||
@@ -9057,6 +9073,10 @@ msgstr "Eliminar miembro de la organización"
|
||||
msgid "Remove Organisation Member"
|
||||
msgstr "Eliminar miembro de la organización"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Remove rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Remove recipient"
|
||||
msgstr "Eliminar destinatario"
|
||||
@@ -9247,6 +9267,10 @@ msgstr "Resolver"
|
||||
msgid "Resolve payment"
|
||||
msgstr "Resolver pago"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Resource blocked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/webhook-logs-sheet.tsx
|
||||
msgid "Response"
|
||||
msgstr "Respuesta"
|
||||
@@ -9823,6 +9847,10 @@ msgstr "Enviando..."
|
||||
msgid "Sent"
|
||||
msgstr "Enviado"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Sent this period"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr "Sesión revocada"
|
||||
@@ -10805,10 +10833,10 @@ msgid "Team URL"
|
||||
msgstr "URL del equipo"
|
||||
|
||||
#: apps/remix/app/components/general/org-menu-switcher.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
|
||||
@@ -10819,6 +10847,10 @@ msgstr "Equipos"
|
||||
msgid "Teams help you organise your work and collaborate with others. Create your first team to get started."
|
||||
msgstr "Los equipos te ayudan a organizar tu trabajo y colaborar con otros. Crea tu primer equipo para comenzar."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Teams that belong to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Teams that this organisation group is currently assigned to"
|
||||
msgstr "Equipos a los que actualmente está asignado este grupo de organización"
|
||||
@@ -12297,8 +12329,6 @@ msgstr "Nombre desconocido"
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Unlimited"
|
||||
msgstr "Ilimitado"
|
||||
|
||||
@@ -12591,15 +12621,18 @@ msgstr "Subiendo"
|
||||
msgid "URL"
|
||||
msgstr "URL"
|
||||
|
||||
#. placeholder {0}: selectedStat?.period || 'N/A'
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Usage for period: {0}"
|
||||
msgstr "Uso para el período: {0}"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
|
||||
msgid "Use"
|
||||
msgstr "Usar"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a duration with a unit, e.g. 5m, 1h, or 24h"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a unique window for each rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
|
||||
#: apps/remix/app/components/forms/signin.tsx
|
||||
msgid "Use Authenticator"
|
||||
@@ -13501,10 +13534,18 @@ msgstr "Etiqueta blanca, miembros ilimitados y más"
|
||||
msgid "Width:"
|
||||
msgstr "Ancho:"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
|
||||
msgid "Withdrawing Consent"
|
||||
msgstr "Retirar Consentimiento"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Within limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
msgid "Write a description to display on your public profile"
|
||||
msgstr "Escribe una descripción para mostrar en tu perfil público"
|
||||
|
||||
@@ -1416,8 +1416,8 @@ msgid "Add Placeholders"
|
||||
msgstr "Ajouter des espaces réservés"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Add rate limit"
|
||||
msgstr "Ajouter une limite de fréquence"
|
||||
msgid "Add rate limit window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Add recipients"
|
||||
@@ -2008,6 +2008,7 @@ msgstr "Toute source"
|
||||
msgid "Any Status"
|
||||
msgstr "Tout statut"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
msgid "API"
|
||||
msgstr "API"
|
||||
@@ -2017,10 +2018,6 @@ msgstr "API"
|
||||
msgid "API key"
|
||||
msgstr "Clé d’API"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "API rate limits"
|
||||
msgstr "Limites de fréquence de l’API"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "API requests"
|
||||
msgstr "Requêtes API"
|
||||
@@ -2681,6 +2678,10 @@ msgstr "Impossible de supprimer le signataire"
|
||||
msgid "Cannot upload items after the document has been sent"
|
||||
msgstr "Impossible de télécharger des éléments après l'envoi du document"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Capabilities enabled for this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/constants/recipient-roles.ts
|
||||
msgctxt "Recipient role name"
|
||||
msgid "Cc"
|
||||
@@ -4407,10 +4408,6 @@ msgstr "Préférences de document"
|
||||
msgid "Document preferences updated"
|
||||
msgstr "Préférences de document mises à jour"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Document rate limits"
|
||||
msgstr "Limites de fréquence des documents"
|
||||
|
||||
#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
|
||||
#: apps/remix/app/components/general/document/document-status.tsx
|
||||
msgid "Document rejected"
|
||||
@@ -4546,6 +4543,7 @@ msgstr "Documentation"
|
||||
#: apps/remix/app/components/general/app-command-menu.tsx
|
||||
#: apps/remix/app/components/general/app-nav-desktop.tsx
|
||||
#: apps/remix/app/components/general/app-nav-mobile.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx
|
||||
@@ -4995,10 +4993,6 @@ msgstr "Préférences de messagerie"
|
||||
msgid "Email preferences updated"
|
||||
msgstr "Préférences de messagerie mises à jour"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Email rate limits"
|
||||
msgstr "Limites de fréquence des e-mails"
|
||||
|
||||
#: packages/ui/components/document/document-email-checkboxes.tsx
|
||||
msgid "Email recipients when a pending document is deleted"
|
||||
msgstr "Envoyer un e-mail aux destinataires lorsqu’un document en attente est supprimé"
|
||||
@@ -5094,6 +5088,7 @@ msgstr "La vérification par email a été supprimée"
|
||||
msgid "Email verification has been resent"
|
||||
msgstr "La vérification par email a été renvoyée"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
|
||||
@@ -5107,16 +5102,14 @@ msgstr "E-mails"
|
||||
msgid "Embedding, 5 members included and more"
|
||||
msgstr "Intégration, 5 membres inclus et plus"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty = Unlimited, 0 = Blocked"
|
||||
msgstr "Vide = Illimité, 0 = Bloqué"
|
||||
|
||||
#: packages/ui/primitives/document-flow/add-fields.tsx
|
||||
msgid "Empty field"
|
||||
msgstr "Champ vide"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty quota means unlimited, 0 blocks the resource. Rate limit windows accept values like 5m, 1h or 24h."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-inherit-member-enable-dialog.tsx
|
||||
msgid "Enable"
|
||||
msgstr "Activer"
|
||||
@@ -5236,6 +5229,10 @@ msgstr "Assurez-vous d’utiliser le jeton d’intégration, et non le jeton d
|
||||
msgid "Enter"
|
||||
msgstr "Entrer"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a max request count greater than 0"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/folder-create-dialog.tsx
|
||||
msgid "Enter a name for your new folder. Folders help you organise your items."
|
||||
msgstr "Entrez un nom pour votre nouveau dossier. Les dossiers vous aident à organiser vos éléments."
|
||||
@@ -5244,6 +5241,10 @@ msgstr "Entrez un nom pour votre nouveau dossier. Les dossiers vous aident à or
|
||||
msgid "Enter a new title"
|
||||
msgstr "Saisissez un nouveau titre"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a window, e.g. 5m"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/subscription-claim-form.tsx
|
||||
msgid "Enter claim name"
|
||||
msgstr "Entrez le nom de la réclamation"
|
||||
@@ -5502,6 +5503,10 @@ msgstr "Tout le monde a signé"
|
||||
msgid "Everyone has signed! You will receive an email copy of the signed document."
|
||||
msgstr "Tout le monde a signé ! Vous recevrez une copie du document signé par e-mail."
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Exceeded"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
msgid "Exceeded timeout"
|
||||
msgstr "Délai dépassé"
|
||||
@@ -6765,6 +6770,10 @@ msgstr "Mode clair"
|
||||
msgid "Like to have your own public profile with agreements?"
|
||||
msgstr "Vous voulez avoir votre propre profil public avec des accords ?"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Limit reached"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Limits"
|
||||
msgstr "Limites"
|
||||
@@ -7070,6 +7079,10 @@ msgstr "MAU (connecté)"
|
||||
msgid "Max"
|
||||
msgstr "Maximum"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Max requests"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
|
||||
msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults."
|
||||
msgstr "Taille maximale du fichier : 4 Mo. Maximum de 100 lignes par importation. Les valeurs vides utiliseront les valeurs par défaut du modèle."
|
||||
@@ -7116,12 +7129,12 @@ msgstr "Membre depuis"
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-groups-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/teams.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
@@ -7190,16 +7203,12 @@ msgid "Monthly Active Users: Users that had at least one of their documents comp
|
||||
msgstr "Utilisateurs actifs mensuels : utilisateurs ayant terminé au moins un de leurs documents"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly API quota"
|
||||
msgstr "Quota d’API mensuel"
|
||||
msgid "Monthly quota"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly document quota"
|
||||
msgstr "Quota de documents mensuel"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly email quota"
|
||||
msgstr "Quota d’e-mails mensuel"
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Monthly usage"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelopes-bulk-move-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/folder-move-dialog.tsx
|
||||
@@ -7290,7 +7299,6 @@ msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-name-dialog.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Name is required"
|
||||
msgstr "Le nom est requis"
|
||||
|
||||
@@ -7298,6 +7306,10 @@ msgstr "Le nom est requis"
|
||||
msgid "Name Settings"
|
||||
msgstr "Paramètres du nom"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Near limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
|
||||
msgid "Need to sign documents?"
|
||||
msgstr "Besoin de signer des documents ?"
|
||||
@@ -7437,6 +7449,10 @@ msgstr "Aucune autre action n'est requise de votre part pour le moment."
|
||||
msgid "No groups found"
|
||||
msgstr "Aucun groupe trouvé"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "No inherited claim"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/admin-license-card.tsx
|
||||
msgid "No License Configured"
|
||||
msgstr "Aucune licence configurée"
|
||||
@@ -8153,6 +8169,10 @@ msgstr "Invitations à l’organisation en attente"
|
||||
msgid "Pending since"
|
||||
msgstr "En attente depuis"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "People with access to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/billing-plans.tsx
|
||||
msgid "per month"
|
||||
@@ -8315,10 +8335,6 @@ msgstr "Veuillez entrer un nom significatif pour votre token. Cela vous aidera
|
||||
msgid "Please enter a number"
|
||||
msgstr "Veuillez entrer un nombre"
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Please enter a valid name."
|
||||
msgstr "Veuiillez entrer un nom valide."
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-number-dialog.tsx
|
||||
msgid "Please enter a valid number"
|
||||
msgstr "Veuillez entrer un numéro valide"
|
||||
@@ -9057,6 +9073,10 @@ msgstr "Supprimer le membre de l'organisation"
|
||||
msgid "Remove Organisation Member"
|
||||
msgstr "Supprimer un membre de l’organisation"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Remove rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Remove recipient"
|
||||
msgstr "Supprimer le destinataire"
|
||||
@@ -9247,6 +9267,10 @@ msgstr "Résoudre"
|
||||
msgid "Resolve payment"
|
||||
msgstr "Résoudre le paiement"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Resource blocked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/webhook-logs-sheet.tsx
|
||||
msgid "Response"
|
||||
msgstr "Réponse"
|
||||
@@ -9823,6 +9847,10 @@ msgstr "Envoi..."
|
||||
msgid "Sent"
|
||||
msgstr "Envoyé"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Sent this period"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr "Session révoquée"
|
||||
@@ -10805,10 +10833,10 @@ msgid "Team URL"
|
||||
msgstr "URL de l'équipe"
|
||||
|
||||
#: apps/remix/app/components/general/org-menu-switcher.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
|
||||
@@ -10819,6 +10847,10 @@ msgstr "Équipes"
|
||||
msgid "Teams help you organise your work and collaborate with others. Create your first team to get started."
|
||||
msgstr "Les équipes vous aident à organiser votre travail et à collaborer avec d'autres. Créez votre première équipe pour commencer."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Teams that belong to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Teams that this organisation group is currently assigned to"
|
||||
msgstr "Équipes auxquelles ce groupe d'organisation est actuellement attribué"
|
||||
@@ -12297,8 +12329,6 @@ msgstr "Nom inconnu"
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Unlimited"
|
||||
msgstr "Illimité"
|
||||
|
||||
@@ -12591,15 +12621,18 @@ msgstr "Importation en cours"
|
||||
msgid "URL"
|
||||
msgstr "URL"
|
||||
|
||||
#. placeholder {0}: selectedStat?.period || 'N/A'
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Usage for period: {0}"
|
||||
msgstr "Utilisation pour la période : {0}"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
|
||||
msgid "Use"
|
||||
msgstr "Utiliser"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a duration with a unit, e.g. 5m, 1h, or 24h"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a unique window for each rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
|
||||
#: apps/remix/app/components/forms/signin.tsx
|
||||
msgid "Use Authenticator"
|
||||
@@ -13501,10 +13534,18 @@ msgstr "Marque blanche, membres illimités et plus"
|
||||
msgid "Width:"
|
||||
msgstr "Largeur :"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
|
||||
msgid "Withdrawing Consent"
|
||||
msgstr "Retrait du consentement"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Within limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
msgid "Write a description to display on your public profile"
|
||||
msgstr "Écrivez une description à afficher sur votre profil public"
|
||||
|
||||
@@ -1416,8 +1416,8 @@ msgid "Add Placeholders"
|
||||
msgstr "Aggiungi segnaposto"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Add rate limit"
|
||||
msgstr "Aggiungi limite di velocità"
|
||||
msgid "Add rate limit window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Add recipients"
|
||||
@@ -2008,6 +2008,7 @@ msgstr "Qualsiasi fonte"
|
||||
msgid "Any Status"
|
||||
msgstr "Qualsiasi stato"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
msgid "API"
|
||||
msgstr "API"
|
||||
@@ -2017,10 +2018,6 @@ msgstr "API"
|
||||
msgid "API key"
|
||||
msgstr "Chiave API"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "API rate limits"
|
||||
msgstr "Limiti di velocità API"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "API requests"
|
||||
msgstr "Richieste API"
|
||||
@@ -2681,6 +2678,10 @@ msgstr "Impossibile rimuovere il firmatario"
|
||||
msgid "Cannot upload items after the document has been sent"
|
||||
msgstr "Non è possibile caricare gli elementi dopo che il documento è stato inviato"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Capabilities enabled for this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/constants/recipient-roles.ts
|
||||
msgctxt "Recipient role name"
|
||||
msgid "Cc"
|
||||
@@ -4407,10 +4408,6 @@ msgstr "Preferenze Documento"
|
||||
msgid "Document preferences updated"
|
||||
msgstr "Preferenze del documento aggiornate"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Document rate limits"
|
||||
msgstr "Limiti di velocità documento"
|
||||
|
||||
#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
|
||||
#: apps/remix/app/components/general/document/document-status.tsx
|
||||
msgid "Document rejected"
|
||||
@@ -4546,6 +4543,7 @@ msgstr "Documentazione"
|
||||
#: apps/remix/app/components/general/app-command-menu.tsx
|
||||
#: apps/remix/app/components/general/app-nav-desktop.tsx
|
||||
#: apps/remix/app/components/general/app-nav-mobile.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx
|
||||
@@ -4995,10 +4993,6 @@ msgstr "Preferenze Email"
|
||||
msgid "Email preferences updated"
|
||||
msgstr "Preferenze email aggiornate"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Email rate limits"
|
||||
msgstr "Limiti di velocità email"
|
||||
|
||||
#: packages/ui/components/document/document-email-checkboxes.tsx
|
||||
msgid "Email recipients when a pending document is deleted"
|
||||
msgstr "Invia un'email ai destinatari quando un documento in sospeso viene eliminato"
|
||||
@@ -5094,6 +5088,7 @@ msgstr "Verifica email rimossa"
|
||||
msgid "Email verification has been resent"
|
||||
msgstr "Verifica email rinviata"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
|
||||
@@ -5107,16 +5102,14 @@ msgstr "Email"
|
||||
msgid "Embedding, 5 members included and more"
|
||||
msgstr "Incorporamento, 5 membri inclusi e altro"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty = Unlimited, 0 = Blocked"
|
||||
msgstr "Vuoto = Illimitato, 0 = Bloccato"
|
||||
|
||||
#: packages/ui/primitives/document-flow/add-fields.tsx
|
||||
msgid "Empty field"
|
||||
msgstr "Campo vuoto"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty quota means unlimited, 0 blocks the resource. Rate limit windows accept values like 5m, 1h or 24h."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-inherit-member-enable-dialog.tsx
|
||||
msgid "Enable"
|
||||
msgstr "Abilita"
|
||||
@@ -5236,6 +5229,10 @@ msgstr "Assicurati di utilizzare il token di embedding, e non il token API"
|
||||
msgid "Enter"
|
||||
msgstr "Inserisci"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a max request count greater than 0"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/folder-create-dialog.tsx
|
||||
msgid "Enter a name for your new folder. Folders help you organise your items."
|
||||
msgstr "Inserisci un nome per la tua nuova cartella. Le cartelle ti aiutano a organizzare i tuoi elementi."
|
||||
@@ -5244,6 +5241,10 @@ msgstr "Inserisci un nome per la tua nuova cartella. Le cartelle ti aiutano a or
|
||||
msgid "Enter a new title"
|
||||
msgstr "Inserisci un nuovo titolo"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a window, e.g. 5m"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/subscription-claim-form.tsx
|
||||
msgid "Enter claim name"
|
||||
msgstr "Inserisci nome richiesta"
|
||||
@@ -5502,6 +5503,10 @@ msgstr "Hanno firmato tutti"
|
||||
msgid "Everyone has signed! You will receive an email copy of the signed document."
|
||||
msgstr "Tutti hanno firmato! Riceverai una copia del documento firmato via email."
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Exceeded"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
msgid "Exceeded timeout"
|
||||
msgstr "Tempo scaduto"
|
||||
@@ -6765,6 +6770,10 @@ msgstr "Modalità chiara"
|
||||
msgid "Like to have your own public profile with agreements?"
|
||||
msgstr "Ti piacerebbe avere il tuo profilo pubblico con accordi?"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Limit reached"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Limits"
|
||||
msgstr "Limiti"
|
||||
@@ -7070,6 +7079,10 @@ msgstr "MAU (autenticati)"
|
||||
msgid "Max"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Max requests"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
|
||||
msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults."
|
||||
msgstr "Dimensione massima del file: 4MB. Massimo 100 righe per caricamento. I valori vuoti utilizzeranno i valori predefiniti del modello."
|
||||
@@ -7116,12 +7129,12 @@ msgstr "Membro dal"
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-groups-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/teams.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
@@ -7190,16 +7203,12 @@ msgid "Monthly Active Users: Users that had at least one of their documents comp
|
||||
msgstr "Utenti attivi mensili: Utenti con almeno uno dei loro documenti completati"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly API quota"
|
||||
msgstr "Quota API mensile"
|
||||
msgid "Monthly quota"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly document quota"
|
||||
msgstr "Quota documenti mensile"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly email quota"
|
||||
msgstr "Quota email mensile"
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Monthly usage"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelopes-bulk-move-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/folder-move-dialog.tsx
|
||||
@@ -7290,7 +7299,6 @@ msgid "Name"
|
||||
msgstr "Nome"
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-name-dialog.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Name is required"
|
||||
msgstr "Nome richiesto"
|
||||
|
||||
@@ -7298,6 +7306,10 @@ msgstr "Nome richiesto"
|
||||
msgid "Name Settings"
|
||||
msgstr "Impostazioni Nome"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Near limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
|
||||
msgid "Need to sign documents?"
|
||||
msgstr "Hai bisogno di firmare documenti?"
|
||||
@@ -7437,6 +7449,10 @@ msgstr "Non sono richieste ulteriori azioni da parte tua in questo momento."
|
||||
msgid "No groups found"
|
||||
msgstr "Nessun gruppo trovato"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "No inherited claim"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/admin-license-card.tsx
|
||||
msgid "No License Configured"
|
||||
msgstr "Nessuna licenza configurata"
|
||||
@@ -8153,6 +8169,10 @@ msgstr "Inviti all’organizzazione in sospeso"
|
||||
msgid "Pending since"
|
||||
msgstr "In sospeso dal"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "People with access to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/billing-plans.tsx
|
||||
msgid "per month"
|
||||
@@ -8315,10 +8335,6 @@ msgstr "Si prega di inserire un nome significativo per il proprio token. Questo
|
||||
msgid "Please enter a number"
|
||||
msgstr "Inserisci un numero"
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Please enter a valid name."
|
||||
msgstr "Per favore inserisci un nome valido."
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-number-dialog.tsx
|
||||
msgid "Please enter a valid number"
|
||||
msgstr "Per favore inserisci un numero valido"
|
||||
@@ -9057,6 +9073,10 @@ msgstr "Rimuovere membro dell'organizzazione"
|
||||
msgid "Remove Organisation Member"
|
||||
msgstr "Rimuovi membro dell'organizzazione"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Remove rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Remove recipient"
|
||||
msgstr "Rimuovi destinatario"
|
||||
@@ -9247,6 +9267,10 @@ msgstr "Risolvi"
|
||||
msgid "Resolve payment"
|
||||
msgstr "Risolvere il pagamento"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Resource blocked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/webhook-logs-sheet.tsx
|
||||
msgid "Response"
|
||||
msgstr "Risposta"
|
||||
@@ -9823,6 +9847,10 @@ msgstr "Invio..."
|
||||
msgid "Sent"
|
||||
msgstr "Inviato"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Sent this period"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr "Sessione revocata"
|
||||
@@ -10805,10 +10833,10 @@ msgid "Team URL"
|
||||
msgstr "URL del team"
|
||||
|
||||
#: apps/remix/app/components/general/org-menu-switcher.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
|
||||
@@ -10819,6 +10847,10 @@ msgstr "Team"
|
||||
msgid "Teams help you organise your work and collaborate with others. Create your first team to get started."
|
||||
msgstr "I team ti aiutano a organizzare il tuo lavoro e collaborare con altri. Crea il tuo primo team per iniziare."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Teams that belong to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Teams that this organisation group is currently assigned to"
|
||||
msgstr "Team a cui è attualmente assegnato questo gruppo di organizzazione"
|
||||
@@ -12297,8 +12329,6 @@ msgstr "Nome sconosciuto"
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Unlimited"
|
||||
msgstr "Illimitato"
|
||||
|
||||
@@ -12591,15 +12621,18 @@ msgstr "Caricamento in corso"
|
||||
msgid "URL"
|
||||
msgstr "URL"
|
||||
|
||||
#. placeholder {0}: selectedStat?.period || 'N/A'
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Usage for period: {0}"
|
||||
msgstr "Utilizzo per il periodo: {0}"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
|
||||
msgid "Use"
|
||||
msgstr "Utilizza"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a duration with a unit, e.g. 5m, 1h, or 24h"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a unique window for each rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
|
||||
#: apps/remix/app/components/forms/signin.tsx
|
||||
msgid "Use Authenticator"
|
||||
@@ -13501,10 +13534,18 @@ msgstr "White label, membri illimitati e altro"
|
||||
msgid "Width:"
|
||||
msgstr "Larghezza:"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
|
||||
msgid "Withdrawing Consent"
|
||||
msgstr "Ritiro del consenso"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Within limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
msgid "Write a description to display on your public profile"
|
||||
msgstr "Scrivi una descrizione da mostrare sul tuo profilo pubblico"
|
||||
|
||||
@@ -1416,8 +1416,8 @@ msgid "Add Placeholders"
|
||||
msgstr "プレースホルダーを追加"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Add rate limit"
|
||||
msgstr "レート制限を追加"
|
||||
msgid "Add rate limit window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Add recipients"
|
||||
@@ -2008,6 +2008,7 @@ msgstr "すべてのソース"
|
||||
msgid "Any Status"
|
||||
msgstr "すべてのステータス"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
msgid "API"
|
||||
msgstr "API"
|
||||
@@ -2017,10 +2018,6 @@ msgstr "API"
|
||||
msgid "API key"
|
||||
msgstr "API キー"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "API rate limits"
|
||||
msgstr "API レート制限"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "API requests"
|
||||
msgstr "API リクエスト"
|
||||
@@ -2681,6 +2678,10 @@ msgstr "署名者を削除できません"
|
||||
msgid "Cannot upload items after the document has been sent"
|
||||
msgstr "ドキュメント送信後はアイテムをアップロードできません"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Capabilities enabled for this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/constants/recipient-roles.ts
|
||||
msgctxt "Recipient role name"
|
||||
msgid "Cc"
|
||||
@@ -4407,10 +4408,6 @@ msgstr "ドキュメント設定"
|
||||
msgid "Document preferences updated"
|
||||
msgstr "文書設定を更新しました"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Document rate limits"
|
||||
msgstr "ドキュメントのレート制限"
|
||||
|
||||
#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
|
||||
#: apps/remix/app/components/general/document/document-status.tsx
|
||||
msgid "Document rejected"
|
||||
@@ -4546,6 +4543,7 @@ msgstr "ドキュメント"
|
||||
#: apps/remix/app/components/general/app-command-menu.tsx
|
||||
#: apps/remix/app/components/general/app-nav-desktop.tsx
|
||||
#: apps/remix/app/components/general/app-nav-mobile.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx
|
||||
@@ -4995,10 +4993,6 @@ msgstr "メール設定"
|
||||
msgid "Email preferences updated"
|
||||
msgstr "メール設定を更新しました"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Email rate limits"
|
||||
msgstr "メールのレート制限"
|
||||
|
||||
#: packages/ui/components/document/document-email-checkboxes.tsx
|
||||
msgid "Email recipients when a pending document is deleted"
|
||||
msgstr "保留中のドキュメントが削除されたときに受信者へメール通知する"
|
||||
@@ -5094,6 +5088,7 @@ msgstr "メール認証を削除しました"
|
||||
msgid "Email verification has been resent"
|
||||
msgstr "メール認証を再送しました"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
|
||||
@@ -5107,16 +5102,14 @@ msgstr "メール"
|
||||
msgid "Embedding, 5 members included and more"
|
||||
msgstr "埋め込み、5 メンバー含む など"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty = Unlimited, 0 = Blocked"
|
||||
msgstr "空欄 = 無制限、0 = ブロックされます"
|
||||
|
||||
#: packages/ui/primitives/document-flow/add-fields.tsx
|
||||
msgid "Empty field"
|
||||
msgstr "空のフィールド"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty quota means unlimited, 0 blocks the resource. Rate limit windows accept values like 5m, 1h or 24h."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-inherit-member-enable-dialog.tsx
|
||||
msgid "Enable"
|
||||
msgstr "有効化"
|
||||
@@ -5236,6 +5229,10 @@ msgstr "埋め込みトークンを使用していることを確認し、API
|
||||
msgid "Enter"
|
||||
msgstr "入力してください"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a max request count greater than 0"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/folder-create-dialog.tsx
|
||||
msgid "Enter a name for your new folder. Folders help you organise your items."
|
||||
msgstr "新しいフォルダ名を入力してください。フォルダを使うとアイテムを整理できます。"
|
||||
@@ -5244,6 +5241,10 @@ msgstr "新しいフォルダ名を入力してください。フォルダを使
|
||||
msgid "Enter a new title"
|
||||
msgstr "新しいタイトルを入力してください"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a window, e.g. 5m"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/subscription-claim-form.tsx
|
||||
msgid "Enter claim name"
|
||||
msgstr "クレーム名を入力"
|
||||
@@ -5502,6 +5503,10 @@ msgstr "全員が署名しました"
|
||||
msgid "Everyone has signed! You will receive an email copy of the signed document."
|
||||
msgstr "全員が署名しました。署名済みドキュメントのコピーがメールで送信されます。"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Exceeded"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
msgid "Exceeded timeout"
|
||||
msgstr "タイムアウトを超えました"
|
||||
@@ -6765,6 +6770,10 @@ msgstr "ライトモード"
|
||||
msgid "Like to have your own public profile with agreements?"
|
||||
msgstr "自分の合意書付き公開プロフィールが欲しいですか?"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Limit reached"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Limits"
|
||||
msgstr "上限"
|
||||
@@ -7070,6 +7079,10 @@ msgstr "MAU(サインイン済み)"
|
||||
msgid "Max"
|
||||
msgstr "最大"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Max requests"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
|
||||
msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults."
|
||||
msgstr "最大ファイルサイズ: 4MB。アップロードあたり最大 100 行。空の値はテンプレートのデフォルトが使用されます。"
|
||||
@@ -7116,12 +7129,12 @@ msgstr "メンバー登録日"
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-groups-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/teams.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
@@ -7190,16 +7203,12 @@ msgid "Monthly Active Users: Users that had at least one of their documents comp
|
||||
msgstr "月間アクティブユーザー:1 つ以上の文書が完了したユーザー"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly API quota"
|
||||
msgstr "月間 API クォータ"
|
||||
msgid "Monthly quota"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly document quota"
|
||||
msgstr "月間ドキュメントクォータ"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly email quota"
|
||||
msgstr "月間メールクォータ"
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Monthly usage"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelopes-bulk-move-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/folder-move-dialog.tsx
|
||||
@@ -7290,7 +7299,6 @@ msgid "Name"
|
||||
msgstr "名前"
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-name-dialog.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Name is required"
|
||||
msgstr "名前は必須です"
|
||||
|
||||
@@ -7298,6 +7306,10 @@ msgstr "名前は必須です"
|
||||
msgid "Name Settings"
|
||||
msgstr "名前の設定"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Near limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
|
||||
msgid "Need to sign documents?"
|
||||
msgstr "文書への署名が必要ですか?"
|
||||
@@ -7437,6 +7449,10 @@ msgstr "現在、お客様が行う必要のある操作はありません。"
|
||||
msgid "No groups found"
|
||||
msgstr "グループが見つかりません"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "No inherited claim"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/admin-license-card.tsx
|
||||
msgid "No License Configured"
|
||||
msgstr "ライセンスが設定されていません"
|
||||
@@ -8153,6 +8169,10 @@ msgstr "保留中の組織招待"
|
||||
msgid "Pending since"
|
||||
msgstr "保留開始日時"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "People with access to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/billing-plans.tsx
|
||||
msgid "per month"
|
||||
@@ -8315,10 +8335,6 @@ msgstr "トークンの用途が分かる名前を入力してください。後
|
||||
msgid "Please enter a number"
|
||||
msgstr "数値を入力してください"
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Please enter a valid name."
|
||||
msgstr "有効な名前を入力してください。"
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-number-dialog.tsx
|
||||
msgid "Please enter a valid number"
|
||||
msgstr "有効な数値を入力してください"
|
||||
@@ -9057,6 +9073,10 @@ msgstr "組織メンバーを削除"
|
||||
msgid "Remove Organisation Member"
|
||||
msgstr "組織メンバーを削除"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Remove rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Remove recipient"
|
||||
msgstr "受信者を削除"
|
||||
@@ -9247,6 +9267,10 @@ msgstr "解決"
|
||||
msgid "Resolve payment"
|
||||
msgstr "支払いを解決"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Resource blocked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/webhook-logs-sheet.tsx
|
||||
msgid "Response"
|
||||
msgstr "レスポンス"
|
||||
@@ -9823,6 +9847,10 @@ msgstr "送信中..."
|
||||
msgid "Sent"
|
||||
msgstr "送信日時"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Sent this period"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr "セッションを取り消しました"
|
||||
@@ -10805,10 +10833,10 @@ msgid "Team URL"
|
||||
msgstr "チーム URL"
|
||||
|
||||
#: apps/remix/app/components/general/org-menu-switcher.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
|
||||
@@ -10819,6 +10847,10 @@ msgstr "チーム"
|
||||
msgid "Teams help you organise your work and collaborate with others. Create your first team to get started."
|
||||
msgstr "チームは作業を整理し、他のメンバーとコラボレーションするのに役立ちます。最初のチームを作成して始めましょう。"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Teams that belong to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Teams that this organisation group is currently assigned to"
|
||||
msgstr "この組織グループが現在割り当てられているチーム"
|
||||
@@ -12297,8 +12329,6 @@ msgstr "不明な名前"
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Unlimited"
|
||||
msgstr "無制限"
|
||||
|
||||
@@ -12591,15 +12621,18 @@ msgstr "アップロード中"
|
||||
msgid "URL"
|
||||
msgstr "URL"
|
||||
|
||||
#. placeholder {0}: selectedStat?.period || 'N/A'
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Usage for period: {0}"
|
||||
msgstr "期間内の利用状況: {0}"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
|
||||
msgid "Use"
|
||||
msgstr "使用"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a duration with a unit, e.g. 5m, 1h, or 24h"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a unique window for each rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
|
||||
#: apps/remix/app/components/forms/signin.tsx
|
||||
msgid "Use Authenticator"
|
||||
@@ -13501,10 +13534,18 @@ msgstr "ホワイトラベリング、メンバー無制限など"
|
||||
msgid "Width:"
|
||||
msgstr "幅:"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
|
||||
msgid "Withdrawing Consent"
|
||||
msgstr "同意の撤回"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Within limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
msgid "Write a description to display on your public profile"
|
||||
msgstr "公開プロフィールに表示する説明文を入力してください"
|
||||
|
||||
@@ -1416,8 +1416,8 @@ msgid "Add Placeholders"
|
||||
msgstr "플레이스홀더 추가"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Add rate limit"
|
||||
msgstr "요청 한도 추가"
|
||||
msgid "Add rate limit window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Add recipients"
|
||||
@@ -2008,6 +2008,7 @@ msgstr "모든 소스"
|
||||
msgid "Any Status"
|
||||
msgstr "모든 상태"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
msgid "API"
|
||||
msgstr "API"
|
||||
@@ -2017,10 +2018,6 @@ msgstr "API"
|
||||
msgid "API key"
|
||||
msgstr "API 키"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "API rate limits"
|
||||
msgstr "API 요청 한도"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "API requests"
|
||||
msgstr "API 요청"
|
||||
@@ -2681,6 +2678,10 @@ msgstr "서명자를 제거할 수 없습니다."
|
||||
msgid "Cannot upload items after the document has been sent"
|
||||
msgstr "문서를 전송한 이후에는 항목을 업로드할 수 없습니다."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Capabilities enabled for this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/constants/recipient-roles.ts
|
||||
msgctxt "Recipient role name"
|
||||
msgid "Cc"
|
||||
@@ -4407,10 +4408,6 @@ msgstr "문서 기본 설정"
|
||||
msgid "Document preferences updated"
|
||||
msgstr "문서 환경설정이 업데이트되었습니다"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Document rate limits"
|
||||
msgstr "문서 요청 한도"
|
||||
|
||||
#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
|
||||
#: apps/remix/app/components/general/document/document-status.tsx
|
||||
msgid "Document rejected"
|
||||
@@ -4546,6 +4543,7 @@ msgstr "문서"
|
||||
#: apps/remix/app/components/general/app-command-menu.tsx
|
||||
#: apps/remix/app/components/general/app-nav-desktop.tsx
|
||||
#: apps/remix/app/components/general/app-nav-mobile.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx
|
||||
@@ -4995,10 +4993,6 @@ msgstr "이메일 기본 설정"
|
||||
msgid "Email preferences updated"
|
||||
msgstr "이메일 기본 설정이 업데이트되었습니다."
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Email rate limits"
|
||||
msgstr "이메일 요청 한도"
|
||||
|
||||
#: packages/ui/components/document/document-email-checkboxes.tsx
|
||||
msgid "Email recipients when a pending document is deleted"
|
||||
msgstr "보류 중인 문서가 삭제되면 수신자에게 이메일 보내기"
|
||||
@@ -5094,6 +5088,7 @@ msgstr "이메일 인증이 제거되었습니다"
|
||||
msgid "Email verification has been resent"
|
||||
msgstr "이메일 인증이 다시 전송되었습니다"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
|
||||
@@ -5107,16 +5102,14 @@ msgstr "이메일"
|
||||
msgid "Embedding, 5 members included and more"
|
||||
msgstr "임베딩, 5명의 구성원 포함 등"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty = Unlimited, 0 = Blocked"
|
||||
msgstr "비워 두기 = 무제한, 0 = 차단됨"
|
||||
|
||||
#: packages/ui/primitives/document-flow/add-fields.tsx
|
||||
msgid "Empty field"
|
||||
msgstr "빈 필드"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty quota means unlimited, 0 blocks the resource. Rate limit windows accept values like 5m, 1h or 24h."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-inherit-member-enable-dialog.tsx
|
||||
msgid "Enable"
|
||||
msgstr "활성화"
|
||||
@@ -5236,6 +5229,10 @@ msgstr "임베딩 토큰이 아닌 API 토큰을 사용하고 있지 않은지
|
||||
msgid "Enter"
|
||||
msgstr "입력하세요"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a max request count greater than 0"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/folder-create-dialog.tsx
|
||||
msgid "Enter a name for your new folder. Folders help you organise your items."
|
||||
msgstr "새 폴더 이름을 입력하세요. 폴더는 항목을 정리하는 데 도움이 됩니다."
|
||||
@@ -5244,6 +5241,10 @@ msgstr "새 폴더 이름을 입력하세요. 폴더는 항목을 정리하는
|
||||
msgid "Enter a new title"
|
||||
msgstr "새 제목을 입력하세요."
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a window, e.g. 5m"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/subscription-claim-form.tsx
|
||||
msgid "Enter claim name"
|
||||
msgstr "클레임 이름 입력"
|
||||
@@ -5502,6 +5503,10 @@ msgstr "모든 사람이 서명했습니다"
|
||||
msgid "Everyone has signed! You will receive an email copy of the signed document."
|
||||
msgstr "모두 서명했습니다! 서명된 문서의 사본이 이메일로 전송됩니다."
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Exceeded"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
msgid "Exceeded timeout"
|
||||
msgstr "시간 초과됨"
|
||||
@@ -6765,6 +6770,10 @@ msgstr "라이트 모드"
|
||||
msgid "Like to have your own public profile with agreements?"
|
||||
msgstr "계약이 포함된 나만의 공개 프로필을 원하시나요?"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Limit reached"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Limits"
|
||||
msgstr "제한"
|
||||
@@ -7070,6 +7079,10 @@ msgstr "MAU(로그인 기준)"
|
||||
msgid "Max"
|
||||
msgstr "최대"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Max requests"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
|
||||
msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults."
|
||||
msgstr "최대 파일 크기: 4MB. 업로드당 최대 100행. 비어 있는 값은 템플릿 기본값이 사용됩니다."
|
||||
@@ -7116,12 +7129,12 @@ msgstr "가입일"
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-groups-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/teams.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
@@ -7190,16 +7203,12 @@ msgid "Monthly Active Users: Users that had at least one of their documents comp
|
||||
msgstr "월간 활성 사용자: 문서가 하나 이상 완료된 사용자"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly API quota"
|
||||
msgstr "월간 API 할당량"
|
||||
msgid "Monthly quota"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly document quota"
|
||||
msgstr "월간 문서 할당량"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly email quota"
|
||||
msgstr "월간 이메일 할당량"
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Monthly usage"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelopes-bulk-move-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/folder-move-dialog.tsx
|
||||
@@ -7290,7 +7299,6 @@ msgid "Name"
|
||||
msgstr "이름"
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-name-dialog.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Name is required"
|
||||
msgstr "이름은 필수 항목입니다."
|
||||
|
||||
@@ -7298,6 +7306,10 @@ msgstr "이름은 필수 항목입니다."
|
||||
msgid "Name Settings"
|
||||
msgstr "이름 설정"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Near limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
|
||||
msgid "Need to sign documents?"
|
||||
msgstr "문서에 서명이 필요하신가요?"
|
||||
@@ -7437,6 +7449,10 @@ msgstr "현재 추가로 수행해야 할 작업은 없습니다."
|
||||
msgid "No groups found"
|
||||
msgstr "그룹을 찾을 수 없습니다."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "No inherited claim"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/admin-license-card.tsx
|
||||
msgid "No License Configured"
|
||||
msgstr "라이선스가 구성되지 않았습니다"
|
||||
@@ -8153,6 +8169,10 @@ msgstr "보류 중인 조직 초대"
|
||||
msgid "Pending since"
|
||||
msgstr "다음 시점부터 보류 중"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "People with access to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/billing-plans.tsx
|
||||
msgid "per month"
|
||||
@@ -8315,10 +8335,6 @@ msgstr "토큰을 나중에 식별할 수 있도록 의미 있는 이름을 입
|
||||
msgid "Please enter a number"
|
||||
msgstr "숫자를 입력하세요"
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Please enter a valid name."
|
||||
msgstr "올바른 이름을 입력해 주세요."
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-number-dialog.tsx
|
||||
msgid "Please enter a valid number"
|
||||
msgstr "올바른 숫자를 입력하세요"
|
||||
@@ -9057,6 +9073,10 @@ msgstr "조직 구성원 제거"
|
||||
msgid "Remove Organisation Member"
|
||||
msgstr "조직 구성원 제거"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Remove rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Remove recipient"
|
||||
msgstr "수신자 제거"
|
||||
@@ -9247,6 +9267,10 @@ msgstr "해결"
|
||||
msgid "Resolve payment"
|
||||
msgstr "결제 해결"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Resource blocked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/webhook-logs-sheet.tsx
|
||||
msgid "Response"
|
||||
msgstr "응답"
|
||||
@@ -9823,6 +9847,10 @@ msgstr "전송 중..."
|
||||
msgid "Sent"
|
||||
msgstr "발송됨"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Sent this period"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr "세션이 해지되었습니다."
|
||||
@@ -10805,10 +10833,10 @@ msgid "Team URL"
|
||||
msgstr "팀 URL"
|
||||
|
||||
#: apps/remix/app/components/general/org-menu-switcher.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
|
||||
@@ -10819,6 +10847,10 @@ msgstr "팀"
|
||||
msgid "Teams help you organise your work and collaborate with others. Create your first team to get started."
|
||||
msgstr "팀은 작업을 조직하고 다른 사람과 협업하는 데 도움이 됩니다. 첫 번째 팀을 생성하여 시작하세요."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Teams that belong to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Teams that this organisation group is currently assigned to"
|
||||
msgstr "이 조직 그룹이 현재 할당된 팀"
|
||||
@@ -12297,8 +12329,6 @@ msgstr "이름을 알 수 없음"
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Unlimited"
|
||||
msgstr "무제한"
|
||||
|
||||
@@ -12591,15 +12621,18 @@ msgstr "업로드 중"
|
||||
msgid "URL"
|
||||
msgstr "URL"
|
||||
|
||||
#. placeholder {0}: selectedStat?.period || 'N/A'
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Usage for period: {0}"
|
||||
msgstr "기간별 사용량: {0}"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
|
||||
msgid "Use"
|
||||
msgstr "사용"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a duration with a unit, e.g. 5m, 1h, or 24h"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a unique window for each rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
|
||||
#: apps/remix/app/components/forms/signin.tsx
|
||||
msgid "Use Authenticator"
|
||||
@@ -13501,10 +13534,18 @@ msgstr "화이트라벨, 무제한 구성원 등"
|
||||
msgid "Width:"
|
||||
msgstr "너비:"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
|
||||
msgid "Withdrawing Consent"
|
||||
msgstr "동의 철회"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Within limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
msgid "Write a description to display on your public profile"
|
||||
msgstr "공개 프로필에 표시될 설명을 작성하세요."
|
||||
|
||||
@@ -1416,8 +1416,8 @@ msgid "Add Placeholders"
|
||||
msgstr "Placeholders toevoegen"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Add rate limit"
|
||||
msgstr "Snelheidslimiet toevoegen"
|
||||
msgid "Add rate limit window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Add recipients"
|
||||
@@ -2008,6 +2008,7 @@ msgstr "Elke bron"
|
||||
msgid "Any Status"
|
||||
msgstr "Elke status"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
msgid "API"
|
||||
msgstr "API"
|
||||
@@ -2017,10 +2018,6 @@ msgstr "API"
|
||||
msgid "API key"
|
||||
msgstr "API-sleutel"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "API rate limits"
|
||||
msgstr "API-snelheidslimieten"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "API requests"
|
||||
msgstr "API-verzoeken"
|
||||
@@ -2681,6 +2678,10 @@ msgstr "Ondertekenaar kan niet worden verwijderd"
|
||||
msgid "Cannot upload items after the document has been sent"
|
||||
msgstr "Items kunnen niet worden geüpload nadat het document is verzonden"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Capabilities enabled for this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/constants/recipient-roles.ts
|
||||
msgctxt "Recipient role name"
|
||||
msgid "Cc"
|
||||
@@ -4407,10 +4408,6 @@ msgstr "Documentvoorkeuren"
|
||||
msgid "Document preferences updated"
|
||||
msgstr "Documentvoorkeuren bijgewerkt"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Document rate limits"
|
||||
msgstr "Documentsnelheidslimieten"
|
||||
|
||||
#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
|
||||
#: apps/remix/app/components/general/document/document-status.tsx
|
||||
msgid "Document rejected"
|
||||
@@ -4546,6 +4543,7 @@ msgstr "Documentatie"
|
||||
#: apps/remix/app/components/general/app-command-menu.tsx
|
||||
#: apps/remix/app/components/general/app-nav-desktop.tsx
|
||||
#: apps/remix/app/components/general/app-nav-mobile.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx
|
||||
@@ -4995,10 +4993,6 @@ msgstr "E-mailvoorkeuren"
|
||||
msgid "Email preferences updated"
|
||||
msgstr "E-mailvoorkeuren bijgewerkt"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Email rate limits"
|
||||
msgstr "E-mailsnelheidslimieten"
|
||||
|
||||
#: packages/ui/components/document/document-email-checkboxes.tsx
|
||||
msgid "Email recipients when a pending document is deleted"
|
||||
msgstr "E-mail ontvangers wanneer een in behandeling zijnd document wordt verwijderd"
|
||||
@@ -5094,6 +5088,7 @@ msgstr "E‑mailverificatie is verwijderd"
|
||||
msgid "Email verification has been resent"
|
||||
msgstr "E‑mailverificatie is opnieuw verzonden"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
|
||||
@@ -5107,16 +5102,14 @@ msgstr "E-mails"
|
||||
msgid "Embedding, 5 members included and more"
|
||||
msgstr "Inbedding, 5 leden inbegrepen en meer"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty = Unlimited, 0 = Blocked"
|
||||
msgstr "Leeg = Onbeperkt, 0 = Geblokkeerd"
|
||||
|
||||
#: packages/ui/primitives/document-flow/add-fields.tsx
|
||||
msgid "Empty field"
|
||||
msgstr "Leeg veld"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty quota means unlimited, 0 blocks the resource. Rate limit windows accept values like 5m, 1h or 24h."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-inherit-member-enable-dialog.tsx
|
||||
msgid "Enable"
|
||||
msgstr "Inschakelen"
|
||||
@@ -5236,6 +5229,10 @@ msgstr "Zorg ervoor dat je het embedding-token gebruikt en niet het API-token"
|
||||
msgid "Enter"
|
||||
msgstr "Invoeren"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a max request count greater than 0"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/folder-create-dialog.tsx
|
||||
msgid "Enter a name for your new folder. Folders help you organise your items."
|
||||
msgstr "Voer een naam in voor je nieuwe map. Mappen helpen je je items te organiseren."
|
||||
@@ -5244,6 +5241,10 @@ msgstr "Voer een naam in voor je nieuwe map. Mappen helpen je je items te organi
|
||||
msgid "Enter a new title"
|
||||
msgstr "Voer een nieuwe titel in"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a window, e.g. 5m"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/subscription-claim-form.tsx
|
||||
msgid "Enter claim name"
|
||||
msgstr "Voer claimnaam in"
|
||||
@@ -5502,6 +5503,10 @@ msgstr "Iedereen heeft getekend"
|
||||
msgid "Everyone has signed! You will receive an email copy of the signed document."
|
||||
msgstr "Iedereen heeft ondertekend! U ontvangt een kopie van het ondertekende document per e-mail."
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Exceeded"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
msgid "Exceeded timeout"
|
||||
msgstr "Time‑out overschreden"
|
||||
@@ -6765,6 +6770,10 @@ msgstr "Lichte modus"
|
||||
msgid "Like to have your own public profile with agreements?"
|
||||
msgstr "Wil je een eigen openbaar profiel met overeenkomsten?"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Limit reached"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Limits"
|
||||
msgstr "Limieten"
|
||||
@@ -7070,6 +7079,10 @@ msgstr "MAU (ingelogd)"
|
||||
msgid "Max"
|
||||
msgstr "Max"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Max requests"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
|
||||
msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults."
|
||||
msgstr "Maximale bestandsgrootte: 4 MB. Maximaal 100 rijen per upload. Lege waarden gebruiken de standaardwaarden van de sjabloon."
|
||||
@@ -7116,12 +7129,12 @@ msgstr "Lid sinds"
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-groups-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/teams.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
@@ -7190,16 +7203,12 @@ msgid "Monthly Active Users: Users that had at least one of their documents comp
|
||||
msgstr "Maandelijks actieve gebruikers: gebruikers van wie ten minste één document is voltooid"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly API quota"
|
||||
msgstr "Maandelijkse API-limiet"
|
||||
msgid "Monthly quota"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly document quota"
|
||||
msgstr "Maandelijkse documentlimiet"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly email quota"
|
||||
msgstr "Maandelijkse e-maillimiet"
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Monthly usage"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelopes-bulk-move-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/folder-move-dialog.tsx
|
||||
@@ -7290,7 +7299,6 @@ msgid "Name"
|
||||
msgstr "Naam"
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-name-dialog.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Name is required"
|
||||
msgstr "Naam is verplicht"
|
||||
|
||||
@@ -7298,6 +7306,10 @@ msgstr "Naam is verplicht"
|
||||
msgid "Name Settings"
|
||||
msgstr "Naam-instellingen"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Near limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
|
||||
msgid "Need to sign documents?"
|
||||
msgstr "Moet je documenten ondertekenen?"
|
||||
@@ -7437,6 +7449,10 @@ msgstr "Er is op dit moment geen verdere actie van jou vereist."
|
||||
msgid "No groups found"
|
||||
msgstr "Geen groepen gevonden"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "No inherited claim"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/admin-license-card.tsx
|
||||
msgid "No License Configured"
|
||||
msgstr "Geen licentie geconfigureerd"
|
||||
@@ -8153,6 +8169,10 @@ msgstr "Openstaande organisatie-uitnodigingen"
|
||||
msgid "Pending since"
|
||||
msgstr "In behandeling sinds"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "People with access to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/billing-plans.tsx
|
||||
msgid "per month"
|
||||
@@ -8315,10 +8335,6 @@ msgstr "Voer een betekenisvolle naam in voor je token. Hiermee kun je het later
|
||||
msgid "Please enter a number"
|
||||
msgstr "Voer een nummer in"
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Please enter a valid name."
|
||||
msgstr "Voer een geldige naam in."
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-number-dialog.tsx
|
||||
msgid "Please enter a valid number"
|
||||
msgstr "Voer een geldig nummer in"
|
||||
@@ -9057,6 +9073,10 @@ msgstr "Organisatielid verwijderen"
|
||||
msgid "Remove Organisation Member"
|
||||
msgstr "Organisatielid verwijderen"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Remove rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Remove recipient"
|
||||
msgstr "Ontvanger verwijderen"
|
||||
@@ -9247,6 +9267,10 @@ msgstr "Oplossen"
|
||||
msgid "Resolve payment"
|
||||
msgstr "Betaling oplossen"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Resource blocked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/webhook-logs-sheet.tsx
|
||||
msgid "Response"
|
||||
msgstr "Antwoord"
|
||||
@@ -9823,6 +9847,10 @@ msgstr "Verzenden..."
|
||||
msgid "Sent"
|
||||
msgstr "Verzonden"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Sent this period"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr "Sessie ingetrokken"
|
||||
@@ -10805,10 +10833,10 @@ msgid "Team URL"
|
||||
msgstr "Team‑URL"
|
||||
|
||||
#: apps/remix/app/components/general/org-menu-switcher.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
|
||||
@@ -10819,6 +10847,10 @@ msgstr "Teams"
|
||||
msgid "Teams help you organise your work and collaborate with others. Create your first team to get started."
|
||||
msgstr "Teams helpen je je werk te organiseren en samen te werken met anderen. Maak je eerste team aan om te beginnen."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Teams that belong to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Teams that this organisation group is currently assigned to"
|
||||
msgstr "Teams waaraan deze organisatiegroep momenteel is toegewezen"
|
||||
@@ -12297,8 +12329,6 @@ msgstr "Onbekende naam"
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Unlimited"
|
||||
msgstr "Onbeperkt"
|
||||
|
||||
@@ -12591,15 +12621,18 @@ msgstr "Uploaden"
|
||||
msgid "URL"
|
||||
msgstr "URL"
|
||||
|
||||
#. placeholder {0}: selectedStat?.period || 'N/A'
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Usage for period: {0}"
|
||||
msgstr "Gebruik voor periode: {0}"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
|
||||
msgid "Use"
|
||||
msgstr "Gebruiken"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a duration with a unit, e.g. 5m, 1h, or 24h"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a unique window for each rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
|
||||
#: apps/remix/app/components/forms/signin.tsx
|
||||
msgid "Use Authenticator"
|
||||
@@ -13501,10 +13534,18 @@ msgstr "Whitelabeling, onbeperkte leden en meer"
|
||||
msgid "Width:"
|
||||
msgstr "Breedte:"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
|
||||
msgid "Withdrawing Consent"
|
||||
msgstr "Toestemming intrekken"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Within limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
msgid "Write a description to display on your public profile"
|
||||
msgstr "Schrijf een beschrijving die op je openbare profiel wordt weergegeven"
|
||||
|
||||
@@ -1416,8 +1416,8 @@ msgid "Add Placeholders"
|
||||
msgstr "Dodaj domyślny tekst"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Add rate limit"
|
||||
msgstr "Dodaj limit przepustowości"
|
||||
msgid "Add rate limit window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Add recipients"
|
||||
@@ -2008,6 +2008,7 @@ msgstr "Dowolne źródło"
|
||||
msgid "Any Status"
|
||||
msgstr "Dowolny status"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
msgid "API"
|
||||
msgstr "API"
|
||||
@@ -2017,10 +2018,6 @@ msgstr "API"
|
||||
msgid "API key"
|
||||
msgstr "Klucz API"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "API rate limits"
|
||||
msgstr "Limit przepustowości API"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "API requests"
|
||||
msgstr "Żądania API"
|
||||
@@ -2681,6 +2678,10 @@ msgstr "Nie można usunąć podpisującego"
|
||||
msgid "Cannot upload items after the document has been sent"
|
||||
msgstr "Nie możesz przesłać elementów po wysłaniu dokumentu"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Capabilities enabled for this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/constants/recipient-roles.ts
|
||||
msgctxt "Recipient role name"
|
||||
msgid "Cc"
|
||||
@@ -4407,10 +4408,6 @@ msgstr "Ustawienia dokumentu"
|
||||
msgid "Document preferences updated"
|
||||
msgstr "Ustawienia dokumentu zostały zaktualizowane"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Document rate limits"
|
||||
msgstr "Limit przepustowości dokumentów"
|
||||
|
||||
#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
|
||||
#: apps/remix/app/components/general/document/document-status.tsx
|
||||
msgid "Document rejected"
|
||||
@@ -4546,6 +4543,7 @@ msgstr "Dokumentacja"
|
||||
#: apps/remix/app/components/general/app-command-menu.tsx
|
||||
#: apps/remix/app/components/general/app-nav-desktop.tsx
|
||||
#: apps/remix/app/components/general/app-nav-mobile.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx
|
||||
@@ -4995,10 +4993,6 @@ msgstr "Ustawienia adresu e-mail"
|
||||
msgid "Email preferences updated"
|
||||
msgstr "Ustawienia adresu e-mail zostały zaktualizowane"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Email rate limits"
|
||||
msgstr "Limit przepustowości wiadomości"
|
||||
|
||||
#: packages/ui/components/document/document-email-checkboxes.tsx
|
||||
msgid "Email recipients when a pending document is deleted"
|
||||
msgstr "Wyślij odbiorcom wiadomość, gdy oczekujący dokument zostanie usunięty"
|
||||
@@ -5094,6 +5088,7 @@ msgstr "Weryfikacja adresu e-mail została usunięta"
|
||||
msgid "Email verification has been resent"
|
||||
msgstr "Weryfikacja adresu e-mail została ponownie wysłana"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
|
||||
@@ -5107,16 +5102,14 @@ msgstr "Adresy e-mail"
|
||||
msgid "Embedding, 5 members included and more"
|
||||
msgstr "Osadzanie dokumentów, 5 użytkowników i więcej"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty = Unlimited, 0 = Blocked"
|
||||
msgstr "Puste = bez ograniczeń, 0 = zablokowane"
|
||||
|
||||
#: packages/ui/primitives/document-flow/add-fields.tsx
|
||||
msgid "Empty field"
|
||||
msgstr "Puste pole"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty quota means unlimited, 0 blocks the resource. Rate limit windows accept values like 5m, 1h or 24h."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-inherit-member-enable-dialog.tsx
|
||||
msgid "Enable"
|
||||
msgstr "Włącz"
|
||||
@@ -5236,6 +5229,10 @@ msgstr "Upewnij się, że używasz tokena osadzania, a nie tokenu API."
|
||||
msgid "Enter"
|
||||
msgstr "Wpisz"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a max request count greater than 0"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/folder-create-dialog.tsx
|
||||
msgid "Enter a name for your new folder. Folders help you organise your items."
|
||||
msgstr "Wpisz nazwę nowego folderu. Foldery pomagają uporządkować elementy."
|
||||
@@ -5244,6 +5241,10 @@ msgstr "Wpisz nazwę nowego folderu. Foldery pomagają uporządkować elementy."
|
||||
msgid "Enter a new title"
|
||||
msgstr "Wpisz nowy tytuł"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a window, e.g. 5m"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/subscription-claim-form.tsx
|
||||
msgid "Enter claim name"
|
||||
msgstr "Wpisz nazwę"
|
||||
@@ -5502,6 +5503,10 @@ msgstr "Wszyscy podpisali"
|
||||
msgid "Everyone has signed! You will receive an email copy of the signed document."
|
||||
msgstr "Wszyscy podpisali! Otrzymasz wiadomość z podpisanym dokumentem."
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Exceeded"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
msgid "Exceeded timeout"
|
||||
msgstr "Przekroczono limit czasu"
|
||||
@@ -6765,6 +6770,10 @@ msgstr "Tryb jasny"
|
||||
msgid "Like to have your own public profile with agreements?"
|
||||
msgstr "Czy chcesz mieć własny profil publiczny z umowami?"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Limit reached"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Limits"
|
||||
msgstr "Limity"
|
||||
@@ -7070,6 +7079,10 @@ msgstr "MAU (zalogowani)"
|
||||
msgid "Max"
|
||||
msgstr "Maks."
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Max requests"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
|
||||
msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults."
|
||||
msgstr "Maksymalny rozmiar pliku to 4 MB. Możesz przesłać maksymalnie 100 wierszy na raz. Puste wartości zostaną zastąpione domyślnymi z szablonu."
|
||||
@@ -7116,12 +7129,12 @@ msgstr "Data dołączenia"
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-groups-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/teams.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
@@ -7190,16 +7203,12 @@ msgid "Monthly Active Users: Users that had at least one of their documents comp
|
||||
msgstr "Miesięczna liczba aktywnych użytkowników: Użytkownicy, którzy zakończyli co najmniej jeden dokument"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly API quota"
|
||||
msgstr "Miesięczny limit API"
|
||||
msgid "Monthly quota"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly document quota"
|
||||
msgstr "Miesięczny limit dokumentów"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly email quota"
|
||||
msgstr "Miesięczny limit wiadomości"
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Monthly usage"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelopes-bulk-move-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/folder-move-dialog.tsx
|
||||
@@ -7290,7 +7299,6 @@ msgid "Name"
|
||||
msgstr "Nazwa"
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-name-dialog.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Name is required"
|
||||
msgstr "Nazwa jest wymagana"
|
||||
|
||||
@@ -7298,6 +7306,10 @@ msgstr "Nazwa jest wymagana"
|
||||
msgid "Name Settings"
|
||||
msgstr "Ustawienia nazwy"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Near limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
|
||||
msgid "Need to sign documents?"
|
||||
msgstr "Potrzebujesz podpisywać dokumenty?"
|
||||
@@ -7437,6 +7449,10 @@ msgstr "Nie musisz nic więcej robić."
|
||||
msgid "No groups found"
|
||||
msgstr "Nie znaleziono grup"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "No inherited claim"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/admin-license-card.tsx
|
||||
msgid "No License Configured"
|
||||
msgstr "Brak skonfigurowanej licencji"
|
||||
@@ -8153,6 +8169,10 @@ msgstr "Oczekujące zaproszenia do organizacji"
|
||||
msgid "Pending since"
|
||||
msgstr "Oczekuje od"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "People with access to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/billing-plans.tsx
|
||||
msgid "per month"
|
||||
@@ -8315,10 +8335,6 @@ msgstr "Wpisz nazwę tokena. Pomoże to później w jego identyfikacji."
|
||||
msgid "Please enter a number"
|
||||
msgstr "Wpisz liczbę"
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Please enter a valid name."
|
||||
msgstr "Wpisz prawidłową nazwę."
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-number-dialog.tsx
|
||||
msgid "Please enter a valid number"
|
||||
msgstr "Wpisz prawidłową liczbę"
|
||||
@@ -9057,6 +9073,10 @@ msgstr "Usuń użytkownika organizacji"
|
||||
msgid "Remove Organisation Member"
|
||||
msgstr "Usuń użytkownika organizacji"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Remove rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Remove recipient"
|
||||
msgstr "Usuń odbiorcę"
|
||||
@@ -9247,6 +9267,10 @@ msgstr "Rozwiąż"
|
||||
msgid "Resolve payment"
|
||||
msgstr "Rozwiąż płatność"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Resource blocked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/webhook-logs-sheet.tsx
|
||||
msgid "Response"
|
||||
msgstr "Odpowiedź"
|
||||
@@ -9823,6 +9847,10 @@ msgstr "Wysyłanie..."
|
||||
msgid "Sent"
|
||||
msgstr "Wysłano"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Sent this period"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr "Sesja została unieważniona"
|
||||
@@ -10805,10 +10833,10 @@ msgid "Team URL"
|
||||
msgstr "Adres URL zespołu"
|
||||
|
||||
#: apps/remix/app/components/general/org-menu-switcher.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
|
||||
@@ -10819,6 +10847,10 @@ msgstr "Zespoły"
|
||||
msgid "Teams help you organise your work and collaborate with others. Create your first team to get started."
|
||||
msgstr "Zespoły pomagają organizować pracę i współpracować z innymi. Utwórz swój pierwszy zespół, aby rozpocząć."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Teams that belong to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Teams that this organisation group is currently assigned to"
|
||||
msgstr "Zespoły, do których przypisana jest grupa organizacji"
|
||||
@@ -12297,8 +12329,6 @@ msgstr "Nieznana nazwa"
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Unlimited"
|
||||
msgstr "Bez ograniczeń"
|
||||
|
||||
@@ -12591,15 +12621,18 @@ msgstr "Przesyłanie"
|
||||
msgid "URL"
|
||||
msgstr "Adres URL"
|
||||
|
||||
#. placeholder {0}: selectedStat?.period || 'N/A'
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Usage for period: {0}"
|
||||
msgstr "Okres: {0}"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
|
||||
msgid "Use"
|
||||
msgstr "Użyj"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a duration with a unit, e.g. 5m, 1h, or 24h"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a unique window for each rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
|
||||
#: apps/remix/app/components/forms/signin.tsx
|
||||
msgid "Use Authenticator"
|
||||
@@ -13501,10 +13534,18 @@ msgstr "Własny branding, nieograniczona liczba użytkowników i więcej"
|
||||
msgid "Width:"
|
||||
msgstr "Szerokość:"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
|
||||
msgid "Withdrawing Consent"
|
||||
msgstr "Wycofanie zgody"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Within limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
msgid "Write a description to display on your public profile"
|
||||
msgstr "Wpisz opis, który będzie wyświetlany w profilu publicznym"
|
||||
|
||||
@@ -1411,7 +1411,7 @@ msgid "Add Placeholders"
|
||||
msgstr "Adicionar Espaços Reservados"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Add rate limit"
|
||||
msgid "Add rate limit window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
@@ -2003,6 +2003,7 @@ msgstr "Qualquer Origem"
|
||||
msgid "Any Status"
|
||||
msgstr "Qualquer Status"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
msgid "API"
|
||||
msgstr ""
|
||||
@@ -2012,10 +2013,6 @@ msgstr ""
|
||||
msgid "API key"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "API rate limits"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "API requests"
|
||||
msgstr ""
|
||||
@@ -2676,6 +2673,10 @@ msgstr "Não é possível remover o signatário"
|
||||
msgid "Cannot upload items after the document has been sent"
|
||||
msgstr "Não é possível fazer upload de itens após o envio do documento"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Capabilities enabled for this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/constants/recipient-roles.ts
|
||||
msgctxt "Recipient role name"
|
||||
msgid "Cc"
|
||||
@@ -4402,10 +4403,6 @@ msgstr "Preferências de Documento"
|
||||
msgid "Document preferences updated"
|
||||
msgstr "Preferências de documento atualizadas"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Document rate limits"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
|
||||
#: apps/remix/app/components/general/document/document-status.tsx
|
||||
msgid "Document rejected"
|
||||
@@ -4541,6 +4538,7 @@ msgstr "Documentação"
|
||||
#: apps/remix/app/components/general/app-command-menu.tsx
|
||||
#: apps/remix/app/components/general/app-nav-desktop.tsx
|
||||
#: apps/remix/app/components/general/app-nav-mobile.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx
|
||||
@@ -4990,10 +4988,6 @@ msgstr "Preferências de E-mail"
|
||||
msgid "Email preferences updated"
|
||||
msgstr "Preferências de e-mail atualizadas"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Email rate limits"
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/components/document/document-email-checkboxes.tsx
|
||||
msgid "Email recipients when a pending document is deleted"
|
||||
msgstr ""
|
||||
@@ -5089,6 +5083,7 @@ msgstr "A verificação de e-mail foi removida"
|
||||
msgid "Email verification has been resent"
|
||||
msgstr "A verificação de e-mail foi reenviada"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
|
||||
@@ -5102,16 +5097,14 @@ msgstr "E-mails"
|
||||
msgid "Embedding, 5 members included and more"
|
||||
msgstr "Incorporação, 5 membros incluídos e mais"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty = Unlimited, 0 = Blocked"
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/add-fields.tsx
|
||||
msgid "Empty field"
|
||||
msgstr "Campo vazio"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty quota means unlimited, 0 blocks the resource. Rate limit windows accept values like 5m, 1h or 24h."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-inherit-member-enable-dialog.tsx
|
||||
msgid "Enable"
|
||||
msgstr "Ativar"
|
||||
@@ -5231,6 +5224,10 @@ msgstr ""
|
||||
msgid "Enter"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a max request count greater than 0"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/folder-create-dialog.tsx
|
||||
msgid "Enter a name for your new folder. Folders help you organise your items."
|
||||
msgstr "Digite um nome para sua nova pasta. As pastas ajudam você a organizar seus itens."
|
||||
@@ -5239,6 +5236,10 @@ msgstr "Digite um nome para sua nova pasta. As pastas ajudam você a organizar s
|
||||
msgid "Enter a new title"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a window, e.g. 5m"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/subscription-claim-form.tsx
|
||||
msgid "Enter claim name"
|
||||
msgstr "Digite o nome da reivindicação"
|
||||
@@ -5497,6 +5498,10 @@ msgstr "Todos assinaram"
|
||||
msgid "Everyone has signed! You will receive an email copy of the signed document."
|
||||
msgstr "Todos assinaram! Você receberá uma cópia do documento assinado por e-mail."
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Exceeded"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
msgid "Exceeded timeout"
|
||||
msgstr "Tempo limite excedido"
|
||||
@@ -6760,6 +6765,10 @@ msgstr "Modo Claro"
|
||||
msgid "Like to have your own public profile with agreements?"
|
||||
msgstr "Gostaria de ter seu próprio perfil público com contratos?"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Limit reached"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Limits"
|
||||
msgstr ""
|
||||
@@ -7065,6 +7074,10 @@ msgstr "MAU (entrou)"
|
||||
msgid "Max"
|
||||
msgstr "Máx"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Max requests"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
|
||||
msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults."
|
||||
msgstr "Tamanho máximo do arquivo: 4MB. Máximo de 100 linhas por upload. Valores em branco usarão os padrões do modelo."
|
||||
@@ -7111,12 +7124,12 @@ msgstr "Membro Desde"
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-groups-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/teams.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
@@ -7185,15 +7198,11 @@ msgid "Monthly Active Users: Users that had at least one of their documents comp
|
||||
msgstr "Usuários Ativos Mensais: Usuários que tiveram pelo menos um de seus documentos concluídos"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly API quota"
|
||||
msgid "Monthly quota"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly document quota"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly email quota"
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Monthly usage"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelopes-bulk-move-dialog.tsx
|
||||
@@ -7285,7 +7294,6 @@ msgid "Name"
|
||||
msgstr "Nome"
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-name-dialog.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Name is required"
|
||||
msgstr "O nome é obrigatório"
|
||||
|
||||
@@ -7293,6 +7301,10 @@ msgstr "O nome é obrigatório"
|
||||
msgid "Name Settings"
|
||||
msgstr "Configurações de Nome"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Near limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
|
||||
msgid "Need to sign documents?"
|
||||
msgstr "Precisa assinar documentos?"
|
||||
@@ -7432,6 +7444,10 @@ msgstr "Nenhuma ação adicional é necessária de sua parte neste momento."
|
||||
msgid "No groups found"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "No inherited claim"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/admin-license-card.tsx
|
||||
msgid "No License Configured"
|
||||
msgstr ""
|
||||
@@ -8148,6 +8164,10 @@ msgstr ""
|
||||
msgid "Pending since"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "People with access to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/billing-plans.tsx
|
||||
msgid "per month"
|
||||
@@ -8310,10 +8330,6 @@ msgstr "Por favor, insira um nome significativo para seu token. Isso ajudará vo
|
||||
msgid "Please enter a number"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Please enter a valid name."
|
||||
msgstr "Por favor, insira um nome válido."
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-number-dialog.tsx
|
||||
msgid "Please enter a valid number"
|
||||
msgstr "Por favor, insira um número válido"
|
||||
@@ -9052,6 +9068,10 @@ msgstr "Remover membro da organização"
|
||||
msgid "Remove Organisation Member"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Remove rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Remove recipient"
|
||||
msgstr "Remover destinatário"
|
||||
@@ -9242,6 +9262,10 @@ msgstr "Resolver"
|
||||
msgid "Resolve payment"
|
||||
msgstr "Resolver pagamento"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Resource blocked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/webhook-logs-sheet.tsx
|
||||
msgid "Response"
|
||||
msgstr "Resposta"
|
||||
@@ -9818,6 +9842,10 @@ msgstr "Enviando..."
|
||||
msgid "Sent"
|
||||
msgstr "Enviado"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Sent this period"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr "Sessão revogada"
|
||||
@@ -10800,10 +10828,10 @@ msgid "Team URL"
|
||||
msgstr "URL da Equipe"
|
||||
|
||||
#: apps/remix/app/components/general/org-menu-switcher.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
|
||||
@@ -10814,6 +10842,10 @@ msgstr "Equipes"
|
||||
msgid "Teams help you organise your work and collaborate with others. Create your first team to get started."
|
||||
msgstr "Equipes ajudam você a organizar seu trabalho e colaborar com outros. Crie sua primeira equipe para começar."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Teams that belong to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Teams that this organisation group is currently assigned to"
|
||||
msgstr "Equipes às quais este grupo da organização está atualmente atribuído"
|
||||
@@ -12292,8 +12324,6 @@ msgstr "Nome desconhecido"
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Unlimited"
|
||||
msgstr "Ilimitado"
|
||||
|
||||
@@ -12586,15 +12616,18 @@ msgstr "Enviando"
|
||||
msgid "URL"
|
||||
msgstr "URL"
|
||||
|
||||
#. placeholder {0}: selectedStat?.period || 'N/A'
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Usage for period: {0}"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
|
||||
msgid "Use"
|
||||
msgstr "Usar"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a duration with a unit, e.g. 5m, 1h, or 24h"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a unique window for each rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
|
||||
#: apps/remix/app/components/forms/signin.tsx
|
||||
msgid "Use Authenticator"
|
||||
@@ -13496,10 +13529,18 @@ msgstr "Whitelabeling, membros ilimitados e mais"
|
||||
msgid "Width:"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
|
||||
msgid "Withdrawing Consent"
|
||||
msgstr "Retirada de Consentimento"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Within limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
msgid "Write a description to display on your public profile"
|
||||
msgstr "Escreva uma descrição para exibir em seu perfil público"
|
||||
|
||||
@@ -1416,8 +1416,8 @@ msgid "Add Placeholders"
|
||||
msgstr "添加占位符"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Add rate limit"
|
||||
msgstr "添加速率限制"
|
||||
msgid "Add rate limit window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Add recipients"
|
||||
@@ -2008,6 +2008,7 @@ msgstr "任意来源"
|
||||
msgid "Any Status"
|
||||
msgstr "任意状态"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
msgid "API"
|
||||
msgstr "API"
|
||||
@@ -2017,10 +2018,6 @@ msgstr "API"
|
||||
msgid "API key"
|
||||
msgstr "API 密钥"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "API rate limits"
|
||||
msgstr "API 速率限制"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "API requests"
|
||||
msgstr "API 请求"
|
||||
@@ -2681,6 +2678,10 @@ msgstr "无法移除签署人"
|
||||
msgid "Cannot upload items after the document has been sent"
|
||||
msgstr "文档发送后无法再上传项目"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Capabilities enabled for this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/constants/recipient-roles.ts
|
||||
msgctxt "Recipient role name"
|
||||
msgid "Cc"
|
||||
@@ -4407,10 +4408,6 @@ msgstr "文档偏好"
|
||||
msgid "Document preferences updated"
|
||||
msgstr "文档偏好设置已更新"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Document rate limits"
|
||||
msgstr "文档速率限制"
|
||||
|
||||
#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
|
||||
#: apps/remix/app/components/general/document/document-status.tsx
|
||||
msgid "Document rejected"
|
||||
@@ -4546,6 +4543,7 @@ msgstr "文档"
|
||||
#: apps/remix/app/components/general/app-command-menu.tsx
|
||||
#: apps/remix/app/components/general/app-nav-desktop.tsx
|
||||
#: apps/remix/app/components/general/app-nav-mobile.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-upload-page.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx
|
||||
@@ -4995,10 +4993,6 @@ msgstr "邮件偏好"
|
||||
msgid "Email preferences updated"
|
||||
msgstr "邮件偏好已更新"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Email rate limits"
|
||||
msgstr "电子邮件速率限制"
|
||||
|
||||
#: packages/ui/components/document/document-email-checkboxes.tsx
|
||||
msgid "Email recipients when a pending document is deleted"
|
||||
msgstr "在待处理文档被删除时向收件人发送电子邮件通知"
|
||||
@@ -5094,6 +5088,7 @@ msgstr "邮箱验证已移除"
|
||||
msgid "Email verification has been resent"
|
||||
msgstr "验证邮件已重新发送"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-stats-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-email-domains-table.tsx
|
||||
@@ -5107,16 +5102,14 @@ msgstr "邮箱"
|
||||
msgid "Embedding, 5 members included and more"
|
||||
msgstr "内嵌、包含 5 名成员等更多功能"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty = Unlimited, 0 = Blocked"
|
||||
msgstr "留空 = 不限,0 = 禁用"
|
||||
|
||||
#: packages/ui/primitives/document-flow/add-fields.tsx
|
||||
msgid "Empty field"
|
||||
msgstr "空字段"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Empty quota means unlimited, 0 blocks the resource. Rate limit windows accept values like 5m, 1h or 24h."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-inherit-member-enable-dialog.tsx
|
||||
msgid "Enable"
|
||||
msgstr "启用"
|
||||
@@ -5236,6 +5229,10 @@ msgstr "请确保您使用的是嵌入令牌,而不是 API 令牌"
|
||||
msgid "Enter"
|
||||
msgstr "输入"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a max request count greater than 0"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/folder-create-dialog.tsx
|
||||
msgid "Enter a name for your new folder. Folders help you organise your items."
|
||||
msgstr "为新文件夹输入名称。文件夹可以帮助您整理项目。"
|
||||
@@ -5244,6 +5241,10 @@ msgstr "为新文件夹输入名称。文件夹可以帮助您整理项目。"
|
||||
msgid "Enter a new title"
|
||||
msgstr "输入新标题"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Enter a window, e.g. 5m"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/subscription-claim-form.tsx
|
||||
msgid "Enter claim name"
|
||||
msgstr "输入声明名称"
|
||||
@@ -5502,6 +5503,10 @@ msgstr "所有人都已签署"
|
||||
msgid "Everyone has signed! You will receive an email copy of the signed document."
|
||||
msgstr "所有人都已签署!您将收到一份已签署文档的电子邮件副本。"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Exceeded"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
|
||||
msgid "Exceeded timeout"
|
||||
msgstr "超时"
|
||||
@@ -6765,6 +6770,10 @@ msgstr "浅色模式"
|
||||
msgid "Like to have your own public profile with agreements?"
|
||||
msgstr "想拥有属于自己的公开协议页面吗?"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Limit reached"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Limits"
|
||||
msgstr "限制"
|
||||
@@ -7070,6 +7079,10 @@ msgstr "月活跃用户(已登录)"
|
||||
msgid "Max"
|
||||
msgstr "最大值"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Max requests"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
|
||||
msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults."
|
||||
msgstr "最大文件大小:4MB。每次上传最多 100 行。空值将使用模板默认值。"
|
||||
@@ -7116,12 +7129,12 @@ msgstr "加入时间"
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-group-create-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-groups-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/team-groups-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/teams.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
@@ -7190,16 +7203,12 @@ msgid "Monthly Active Users: Users that had at least one of their documents comp
|
||||
msgstr "月活跃用户:至少有一份文档被完成的用户"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly API quota"
|
||||
msgstr "每月 API 配额"
|
||||
msgid "Monthly quota"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly document quota"
|
||||
msgstr "每月文档配额"
|
||||
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
msgid "Monthly email quota"
|
||||
msgstr "每月邮件配额"
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Monthly usage"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelopes-bulk-move-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/folder-move-dialog.tsx
|
||||
@@ -7290,7 +7299,6 @@ msgid "Name"
|
||||
msgstr "姓名"
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-name-dialog.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Name is required"
|
||||
msgstr "名称为必填项"
|
||||
|
||||
@@ -7298,6 +7306,10 @@ msgstr "名称为必填项"
|
||||
msgid "Name Settings"
|
||||
msgstr "姓名设置"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Near limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx
|
||||
msgid "Need to sign documents?"
|
||||
msgstr "需要签署文档?"
|
||||
@@ -7437,6 +7449,10 @@ msgstr "目前您无需再执行任何操作。"
|
||||
msgid "No groups found"
|
||||
msgstr "未找到群组"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "No inherited claim"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/admin-license-card.tsx
|
||||
msgid "No License Configured"
|
||||
msgstr "未配置许可证"
|
||||
@@ -8153,6 +8169,10 @@ msgstr "待处理的组织邀请"
|
||||
msgid "Pending since"
|
||||
msgstr "待处理起始时间"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "People with access to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/organisation-create-dialog.tsx
|
||||
#: apps/remix/app/components/general/billing-plans.tsx
|
||||
msgid "per month"
|
||||
@@ -8315,10 +8335,6 @@ msgstr "请输入一个有意义的令牌名称,以便日后识别。"
|
||||
msgid "Please enter a number"
|
||||
msgstr "请输入一个数字"
|
||||
|
||||
#: apps/remix/app/components/general/claim-account.tsx
|
||||
msgid "Please enter a valid name."
|
||||
msgstr "请输入有效姓名。"
|
||||
|
||||
#: apps/remix/app/components/dialogs/sign-field-number-dialog.tsx
|
||||
msgid "Please enter a valid number"
|
||||
msgstr "请输入有效的数字"
|
||||
@@ -9057,6 +9073,10 @@ msgstr "移除组织成员"
|
||||
msgid "Remove Organisation Member"
|
||||
msgstr "移除组织成员"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Remove rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx
|
||||
msgid "Remove recipient"
|
||||
msgstr "移除收件人"
|
||||
@@ -9247,6 +9267,10 @@ msgstr "解决"
|
||||
msgid "Resolve payment"
|
||||
msgstr "解决付款问题"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Resource blocked"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/webhook-logs-sheet.tsx
|
||||
msgid "Response"
|
||||
msgstr "响应"
|
||||
@@ -9823,6 +9847,10 @@ msgstr "正在发送..."
|
||||
msgid "Sent"
|
||||
msgstr "已发送"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Sent this period"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx
|
||||
msgid "Session revoked"
|
||||
msgstr "会话已撤销"
|
||||
@@ -10805,10 +10833,10 @@ msgid "Team URL"
|
||||
msgstr "团队 URL"
|
||||
|
||||
#: apps/remix/app/components/general/org-menu-switcher.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-organisation-overview-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/components/tables/organisation-insights-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/dashboard.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings._layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.teams.tsx
|
||||
@@ -10819,6 +10847,10 @@ msgstr "团队"
|
||||
msgid "Teams help you organise your work and collaborate with others. Create your first team to get started."
|
||||
msgstr "团队帮助您组织工作并与他人协作。创建您的第一个团队以开始使用。"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Teams that belong to this organisation."
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx
|
||||
msgid "Teams that this organisation group is currently assigned to"
|
||||
msgstr "当前已将此组织组分配给以下团队"
|
||||
@@ -12297,8 +12329,6 @@ msgstr "未知姓名"
|
||||
#: apps/remix/app/components/general/claim-limit-fields.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
|
||||
msgid "Unlimited"
|
||||
msgstr "不限"
|
||||
|
||||
@@ -12591,15 +12621,18 @@ msgstr "正在上传"
|
||||
msgid "URL"
|
||||
msgstr "URL"
|
||||
|
||||
#. placeholder {0}: selectedStat?.period || 'N/A'
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Usage for period: {0}"
|
||||
msgstr "周期用量:{0}"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx
|
||||
msgid "Use"
|
||||
msgstr "使用"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a duration with a unit, e.g. 5m, 1h, or 24h"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Use a unique window for each rate limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
|
||||
#: apps/remix/app/components/forms/signin.tsx
|
||||
msgid "Use Authenticator"
|
||||
@@ -13501,10 +13534,18 @@ msgstr "白标、自定义域、无限成员等更多功能"
|
||||
msgid "Width:"
|
||||
msgstr "宽度:"
|
||||
|
||||
#: apps/remix/app/components/general/rate-limit-array-input.tsx
|
||||
msgid "Window"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
|
||||
msgid "Withdrawing Consent"
|
||||
msgstr "撤回同意"
|
||||
|
||||
#: apps/remix/app/components/general/organisation-usage-panel.tsx
|
||||
msgid "Within limit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
msgid "Write a description to display on your public profile"
|
||||
msgstr "撰写将在您的公共主页上展示的简介"
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
"devDependencies": {
|
||||
"dotenv": "^17.2.3",
|
||||
"dotenv-cli": "^11.0.0",
|
||||
"tsx": "^4.20.6",
|
||||
"tsx": "^4.23.1",
|
||||
"typescript": "5.6.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"@tailwindcss/container-queries": "^0.1.1",
|
||||
"@tailwindcss/typography": "^0.5.19",
|
||||
"autoprefixer": "^10.4.22",
|
||||
"postcss": "^8.5.14",
|
||||
"postcss": "^8.5.19",
|
||||
"tailwindcss": "^3.4.18",
|
||||
"tailwindcss-animate": "^1.0.7"
|
||||
},
|
||||
|
||||
@@ -41,7 +41,7 @@ const AlertDialogContent = React.forwardRef<
|
||||
<AlertDialogPrimitive.Content
|
||||
ref={ref}
|
||||
className={cn(
|
||||
'fade-in-90 slide-in-from-bottom-10 sm:zoom-in-90 sm:slide-in-from-bottom-0 fixed z-50 grid w-full max-w-lg scale-100 animate-in gap-4 border bg-background p-6 opacity-100 shadow-lg sm:rounded-lg md:w-full',
|
||||
'fade-in-90 slide-in-from-bottom-10 sm:zoom-in-90 sm:slide-in-from-bottom-0 fixed z-50 grid w-full max-w-lg scale-100 animate-in gap-4 border bg-background p-6 opacity-100 shadow-lg focus:outline-none sm:rounded-lg md:w-full',
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
|
||||
@@ -62,7 +62,7 @@ const CommandInput = React.forwardRef<
|
||||
<CommandPrimitive.Input
|
||||
ref={ref}
|
||||
className={cn(
|
||||
'flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-foreground-muted disabled:cursor-not-allowed disabled:opacity-50',
|
||||
'flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
|
||||
@@ -61,7 +61,7 @@ const DialogContent = React.forwardRef<
|
||||
<DialogPrimitive.Content
|
||||
ref={ref}
|
||||
className={cn(
|
||||
'data-[state=open]:fade-in-90 data-[state=open]:slide-in-from-bottom-10 sm:zoom-in-90 data-[state=open]:sm:slide-in-from-bottom-0 fixed z-50 grid w-full animate-in gap-4 border bg-background p-6 shadow-lg sm:max-w-lg sm:rounded-lg',
|
||||
'data-[state=open]:fade-in-90 data-[state=open]:slide-in-from-bottom-10 sm:zoom-in-90 data-[state=open]:sm:slide-in-from-bottom-0 fixed z-50 grid w-full animate-in gap-4 border bg-background p-6 shadow-lg focus:outline-none sm:max-w-lg sm:rounded-lg',
|
||||
{
|
||||
'rounded-b-xl': position === 'start',
|
||||
'rounded-t-xl': position === 'end',
|
||||
|
||||
@@ -577,7 +577,7 @@ export const AddFieldsFormPartial = ({
|
||||
{selectedField && (
|
||||
<div
|
||||
className={cn(
|
||||
'pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center rounded-[2px] bg-white text-muted-foreground ring-2 transition duration-200 [container-type:size] dark:text-muted-background',
|
||||
'pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center rounded-[2px] bg-white text-muted-foreground ring-2 transition duration-200 [container-type:size] dark:text-muted',
|
||||
selectedSignerStyles?.base,
|
||||
{
|
||||
'-rotate-6 scale-90 opacity-50 dark:bg-black/20': !isFieldWithinBounds,
|
||||
|
||||
+1
-1
@@ -89,7 +89,7 @@ export const DropdownFieldAdvancedSettings = ({
|
||||
}, [fieldState.defaultValue]);
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-4 text-dark">
|
||||
<div className="flex flex-col gap-4">
|
||||
<div>
|
||||
<Label>
|
||||
<Trans>Select default option</Trans>
|
||||
|
||||
@@ -49,90 +49,93 @@ const SheetOverlay = React.forwardRef<
|
||||
|
||||
SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
|
||||
|
||||
const sheetVariants = cva('fixed z-[61] scale-100 gap-4 bg-background p-6 opacity-100 shadow-lg border', {
|
||||
variants: {
|
||||
position: {
|
||||
top: 'animate-in slide-in-from-top w-full duration-300',
|
||||
bottom: 'animate-in slide-in-from-bottom w-full duration-300',
|
||||
left: 'animate-in slide-in-from-left h-full duration-300',
|
||||
right: 'animate-in slide-in-from-right h-full duration-300',
|
||||
const sheetVariants = cva(
|
||||
'fixed z-[61] scale-100 gap-4 border bg-background p-6 opacity-100 shadow-lg focus:outline-none',
|
||||
{
|
||||
variants: {
|
||||
position: {
|
||||
top: 'animate-in slide-in-from-top w-full duration-300',
|
||||
bottom: 'animate-in slide-in-from-bottom w-full duration-300',
|
||||
left: 'animate-in slide-in-from-left h-full duration-300',
|
||||
right: 'animate-in slide-in-from-right h-full duration-300',
|
||||
},
|
||||
size: {
|
||||
content: '',
|
||||
default: '',
|
||||
sm: '',
|
||||
lg: '',
|
||||
xl: '',
|
||||
full: '',
|
||||
},
|
||||
},
|
||||
size: {
|
||||
content: '',
|
||||
default: '',
|
||||
sm: '',
|
||||
lg: '',
|
||||
xl: '',
|
||||
full: '',
|
||||
compoundVariants: [
|
||||
{
|
||||
position: ['top', 'bottom'],
|
||||
size: 'content',
|
||||
class: 'max-h-screen',
|
||||
},
|
||||
{
|
||||
position: ['top', 'bottom'],
|
||||
size: 'default',
|
||||
class: 'h-1/3',
|
||||
},
|
||||
{
|
||||
position: ['top', 'bottom'],
|
||||
size: 'sm',
|
||||
class: 'h-1/4',
|
||||
},
|
||||
{
|
||||
position: ['top', 'bottom'],
|
||||
size: 'lg',
|
||||
class: 'h-1/2',
|
||||
},
|
||||
{
|
||||
position: ['top', 'bottom'],
|
||||
size: 'xl',
|
||||
class: 'h-5/6',
|
||||
},
|
||||
{
|
||||
position: ['top', 'bottom'],
|
||||
size: 'full',
|
||||
class: 'h-screen',
|
||||
},
|
||||
{
|
||||
position: ['right', 'left'],
|
||||
size: 'content',
|
||||
class: 'max-w-screen',
|
||||
},
|
||||
{
|
||||
position: ['right', 'left'],
|
||||
size: 'default',
|
||||
class: 'w-1/3',
|
||||
},
|
||||
{
|
||||
position: ['right', 'left'],
|
||||
size: 'sm',
|
||||
class: 'w-1/4',
|
||||
},
|
||||
{
|
||||
position: ['right', 'left'],
|
||||
size: 'lg',
|
||||
class: 'w-1/2',
|
||||
},
|
||||
{
|
||||
position: ['right', 'left'],
|
||||
size: 'xl',
|
||||
class: 'w-5/6',
|
||||
},
|
||||
{
|
||||
position: ['right', 'left'],
|
||||
size: 'full',
|
||||
class: 'w-screen',
|
||||
},
|
||||
],
|
||||
defaultVariants: {
|
||||
position: 'right',
|
||||
size: 'default',
|
||||
},
|
||||
},
|
||||
compoundVariants: [
|
||||
{
|
||||
position: ['top', 'bottom'],
|
||||
size: 'content',
|
||||
class: 'max-h-screen',
|
||||
},
|
||||
{
|
||||
position: ['top', 'bottom'],
|
||||
size: 'default',
|
||||
class: 'h-1/3',
|
||||
},
|
||||
{
|
||||
position: ['top', 'bottom'],
|
||||
size: 'sm',
|
||||
class: 'h-1/4',
|
||||
},
|
||||
{
|
||||
position: ['top', 'bottom'],
|
||||
size: 'lg',
|
||||
class: 'h-1/2',
|
||||
},
|
||||
{
|
||||
position: ['top', 'bottom'],
|
||||
size: 'xl',
|
||||
class: 'h-5/6',
|
||||
},
|
||||
{
|
||||
position: ['top', 'bottom'],
|
||||
size: 'full',
|
||||
class: 'h-screen',
|
||||
},
|
||||
{
|
||||
position: ['right', 'left'],
|
||||
size: 'content',
|
||||
class: 'max-w-screen',
|
||||
},
|
||||
{
|
||||
position: ['right', 'left'],
|
||||
size: 'default',
|
||||
class: 'w-1/3',
|
||||
},
|
||||
{
|
||||
position: ['right', 'left'],
|
||||
size: 'sm',
|
||||
class: 'w-1/4',
|
||||
},
|
||||
{
|
||||
position: ['right', 'left'],
|
||||
size: 'lg',
|
||||
class: 'w-1/2',
|
||||
},
|
||||
{
|
||||
position: ['right', 'left'],
|
||||
size: 'xl',
|
||||
class: 'w-5/6',
|
||||
},
|
||||
{
|
||||
position: ['right', 'left'],
|
||||
size: 'full',
|
||||
class: 'w-screen',
|
||||
},
|
||||
],
|
||||
defaultVariants: {
|
||||
position: 'right',
|
||||
size: 'default',
|
||||
},
|
||||
});
|
||||
);
|
||||
|
||||
export interface DialogContentProps
|
||||
extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,
|
||||
|
||||
@@ -520,7 +520,7 @@ export const AddTemplateFieldsFormPartial = ({
|
||||
{selectedField && (
|
||||
<div
|
||||
className={cn(
|
||||
'pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center rounded-[2px] bg-white text-muted-foreground ring-2 transition duration-200 [container-type:size] dark:text-muted-background',
|
||||
'pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center rounded-[2px] bg-white text-muted-foreground ring-2 transition duration-200 [container-type:size] dark:text-muted',
|
||||
selectedSignerStyles?.base,
|
||||
{
|
||||
'-rotate-6 scale-90 opacity-50 dark:bg-black/20': !isFieldWithinBounds,
|
||||
@@ -603,9 +603,7 @@ export const AddTemplateFieldsFormPartial = ({
|
||||
<span className="flex-1 truncate text-left">{selectedSigner?.name}</span>
|
||||
)}
|
||||
|
||||
{!selectedSigner?.email && (
|
||||
<span className="gradie flex-1 truncate text-left">No recipient selected</span>
|
||||
)}
|
||||
{!selectedSigner?.email && <span className="flex-1 truncate text-left">No recipient selected</span>}
|
||||
|
||||
<ChevronsUpDown className="ml-2 h-4 w-4" />
|
||||
</Button>
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
--accent-foreground: 95.08 71.08% 67.45%;
|
||||
|
||||
--destructive: 0 87% 62%;
|
||||
--destructive-foreground: 0 87% 19%;
|
||||
--destructive-foreground: 0 0% 98%;
|
||||
|
||||
--ring: 95.08 71.08% 67.45%;
|
||||
|
||||
|
||||
+2
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"$schema": "https://turbo.build/schema.json",
|
||||
"pipeline": {
|
||||
"tasks": {
|
||||
"build": {
|
||||
"dependsOn": ["prebuild", "^build"],
|
||||
"outputs": [".next/**", "!.next/cache/**"]
|
||||
@@ -143,6 +143,7 @@
|
||||
"GOOGLE_VERTEX_API_KEY",
|
||||
"CI",
|
||||
"NODE_ENV",
|
||||
"NEXT_IGNORE_INCORRECT_LOCKFILE",
|
||||
"POSTGRES_URL",
|
||||
"DATABASE_URL",
|
||||
"DATABASE_URL_UNPOOLED",
|
||||
|
||||
Reference in New Issue
Block a user