From 21cff7a727e2a4bca1e08772c8290b4f8543d2b9 Mon Sep 17 00:00:00 2001 From: roshboi Date: Sun, 12 Jul 2026 14:13:23 +0800 Subject: [PATCH 1/7] docs: update rate limit doc for organisation limit for self hosters (#3089) --- .../docs/developers/api/rate-limits.mdx | 1 + .../configuration/environment.mdx | 1 + .../docs/self-hosting/configuration/index.mdx | 5 + .../docs/self-hosting/configuration/meta.json | 1 + .../configuration/organisation-limits.mdx | 111 ++++++++++++++++++ 5 files changed, 119 insertions(+) create mode 100644 apps/docs/content/docs/self-hosting/configuration/organisation-limits.mdx diff --git a/apps/docs/content/docs/developers/api/rate-limits.mdx b/apps/docs/content/docs/developers/api/rate-limits.mdx index ecd50558e..d2e31b1d4 100644 --- a/apps/docs/content/docs/developers/api/rate-limits.mdx +++ b/apps/docs/content/docs/developers/api/rate-limits.mdx @@ -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) diff --git a/apps/docs/content/docs/self-hosting/configuration/environment.mdx b/apps/docs/content/docs/self-hosting/configuration/environment.mdx index e90e1b099..bc4acd1a6 100644 --- a/apps/docs/content/docs/self-hosting/configuration/environment.mdx +++ b/apps/docs/content/docs/self-hosting/configuration/environment.mdx @@ -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 diff --git a/apps/docs/content/docs/self-hosting/configuration/index.mdx b/apps/docs/content/docs/self-hosting/configuration/index.mdx index 0e80e0efc..de5830a4d 100644 --- a/apps/docs/content/docs/self-hosting/configuration/index.mdx +++ b/apps/docs/content/docs/self-hosting/configuration/index.mdx @@ -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" /> + ## Required Configuration diff --git a/apps/docs/content/docs/self-hosting/configuration/meta.json b/apps/docs/content/docs/self-hosting/configuration/meta.json index f38183703..6cc250f64 100644 --- a/apps/docs/content/docs/self-hosting/configuration/meta.json +++ b/apps/docs/content/docs/self-hosting/configuration/meta.json @@ -9,6 +9,7 @@ "background-jobs", "signing-certificate", "telemetry", + "organisation-limits", "advanced" ] } diff --git a/apps/docs/content/docs/self-hosting/configuration/organisation-limits.mdx b/apps/docs/content/docs/self-hosting/configuration/organisation-limits.mdx new file mode 100644 index 000000000..2459812ce --- /dev/null +++ b/apps/docs/content/docs/self-hosting/configuration/organisation-limits.mdx @@ -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**. + + + 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. + + +## 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. + + + 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. + + +### 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 From c5efd34e95737f98f64c31214cebee80fb598f29 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Mon, 13 Jul 2026 12:43:22 +1000 Subject: [PATCH 2/7] v2.15.0 --- apps/remix/package.json | 2 +- package-lock.json | 126 +--------------------------------------- package.json | 2 +- 3 files changed, 5 insertions(+), 125 deletions(-) diff --git a/apps/remix/package.json b/apps/remix/package.json index b3bd1b5fd..b44c2e273 100644 --- a/apps/remix/package.json +++ b/apps/remix/package.json @@ -106,5 +106,5 @@ "vite-plugin-babel-macros": "^1.0.6", "vite-tsconfig-paths": "^5.1.4" }, - "version": "2.14.0" + "version": "2.15.0" } diff --git a/package-lock.json b/package-lock.json index 03bd9771a..ac1c7d2f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@documenso/root", - "version": "2.14.0", + "version": "2.15.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@documenso/root", - "version": "2.14.0", + "version": "2.15.0", "hasInstallScript": true, "workspaces": [ "apps/*", @@ -406,7 +406,7 @@ }, "apps/remix": { "name": "@documenso/remix", - "version": "2.14.0", + "version": "2.15.0", "dependencies": { "@cantoo/pdf-lib": "^2.5.3", "@documenso/api": "*", @@ -31817,126 +31817,6 @@ "react": "^18", "typescript": "5.6.2" } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz", - "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz", - "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz", - "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz", - "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz", - "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz", - "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz", - "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz", - "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } } } } diff --git a/package.json b/package.json index 27e69e864..808577cbc 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "apps/*", "packages/*" ], - "version": "2.14.0", + "version": "2.15.0", "scripts": { "postinstall": "patch-package", "build": "turbo run build", From 4e0038f2e8750978bbde37f66d21ae28e2e9e9d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 17:16:21 +0900 Subject: [PATCH 3/7] chore: extract translations (#3060) --- packages/lib/translations/de/web.po | 127 ++++++++++++++++--------- packages/lib/translations/en/web.po | 127 ++++++++++++++++--------- packages/lib/translations/es/web.po | 127 ++++++++++++++++--------- packages/lib/translations/fr/web.po | 127 ++++++++++++++++--------- packages/lib/translations/it/web.po | 127 ++++++++++++++++--------- packages/lib/translations/ja/web.po | 127 ++++++++++++++++--------- packages/lib/translations/ko/web.po | 127 ++++++++++++++++--------- packages/lib/translations/nl/web.po | 127 ++++++++++++++++--------- packages/lib/translations/pl/web.po | 127 ++++++++++++++++--------- packages/lib/translations/pt-BR/web.po | 121 +++++++++++++++-------- packages/lib/translations/zh/web.po | 127 ++++++++++++++++--------- 11 files changed, 921 insertions(+), 470 deletions(-) diff --git a/packages/lib/translations/de/web.po b/packages/lib/translations/de/web.po index 596094b11..311dcf750 100644 --- a/packages/lib/translations/de/web.po +++ b/packages/lib/translations/de/web.po @@ -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 Organisations­einladungen" 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" diff --git a/packages/lib/translations/en/web.po b/packages/lib/translations/en/web.po index 23d2f1c8f..054d2915d 100644 --- a/packages/lib/translations/en/web.po +++ b/packages/lib/translations/en/web.po @@ -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" diff --git a/packages/lib/translations/es/web.po b/packages/lib/translations/es/web.po index eaa06c120..b3bedc425 100644 --- a/packages/lib/translations/es/web.po +++ b/packages/lib/translations/es/web.po @@ -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" diff --git a/packages/lib/translations/fr/web.po b/packages/lib/translations/fr/web.po index a6ca6fd07..db950a4b2 100644 --- a/packages/lib/translations/fr/web.po +++ b/packages/lib/translations/fr/web.po @@ -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" diff --git a/packages/lib/translations/it/web.po b/packages/lib/translations/it/web.po index af3f6de43..e8f43c9f2 100644 --- a/packages/lib/translations/it/web.po +++ b/packages/lib/translations/it/web.po @@ -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" diff --git a/packages/lib/translations/ja/web.po b/packages/lib/translations/ja/web.po index a71b944ec..6c240d982 100644 --- a/packages/lib/translations/ja/web.po +++ b/packages/lib/translations/ja/web.po @@ -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 "公開プロフィールに表示する説明文を入力してください" diff --git a/packages/lib/translations/ko/web.po b/packages/lib/translations/ko/web.po index f7844a294..6355a8098 100644 --- a/packages/lib/translations/ko/web.po +++ b/packages/lib/translations/ko/web.po @@ -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 "공개 프로필에 표시될 설명을 작성하세요." diff --git a/packages/lib/translations/nl/web.po b/packages/lib/translations/nl/web.po index 0eedbcad7..ea27be4b1 100644 --- a/packages/lib/translations/nl/web.po +++ b/packages/lib/translations/nl/web.po @@ -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" diff --git a/packages/lib/translations/pl/web.po b/packages/lib/translations/pl/web.po index 4c6cd062f..523e75fc2 100644 --- a/packages/lib/translations/pl/web.po +++ b/packages/lib/translations/pl/web.po @@ -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" diff --git a/packages/lib/translations/pt-BR/web.po b/packages/lib/translations/pt-BR/web.po index ba02bfa14..2bf5edf61 100644 --- a/packages/lib/translations/pt-BR/web.po +++ b/packages/lib/translations/pt-BR/web.po @@ -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" diff --git a/packages/lib/translations/zh/web.po b/packages/lib/translations/zh/web.po index 1f191746c..c28a8d965 100644 --- a/packages/lib/translations/zh/web.po +++ b/packages/lib/translations/zh/web.po @@ -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 "撰写将在您的公共主页上展示的简介" From db031e2865fe0ef474f1b2df72b34f6518a76d40 Mon Sep 17 00:00:00 2001 From: Ephraim Duncan <55143799+ephraimduncan@users.noreply.github.com> Date: Tue, 14 Jul 2026 08:21:30 +0000 Subject: [PATCH 4/7] fix: replace tailwind class typos --- apps/remix/app/components/dialogs/folder-delete-dialog.tsx | 2 +- .../app/components/dialogs/organisation-create-dialog.tsx | 2 +- .../dialogs/organisation-email-domain-delete-dialog.tsx | 2 +- .../dialogs/organisation-member-invite-dialog.tsx | 2 +- apps/remix/app/components/dialogs/token-delete-dialog.tsx | 2 +- apps/remix/app/components/dialogs/webhook-delete-dialog.tsx | 2 +- .../components/embed/authoring/configure-fields-view.tsx | 2 +- apps/remix/app/components/general/admin-license-card.tsx | 2 +- .../envelope-editor/envelope-editor-fields-drag-drop.tsx | 2 +- .../general/envelope/envelope-drop-zone-wrapper.tsx | 2 +- apps/remix/app/routes/_recipient+/sign.$token+/waiting.tsx | 2 +- .../email/template-components/template-document-invite.tsx | 2 +- packages/ui/primitives/command.tsx | 2 +- packages/ui/primitives/document-flow/add-fields.tsx | 2 +- .../field-items-advanced-settings/dropdown-field.tsx | 2 +- .../ui/primitives/template-flow/add-template-fields.tsx | 6 ++---- 16 files changed, 17 insertions(+), 19 deletions(-) diff --git a/apps/remix/app/components/dialogs/folder-delete-dialog.tsx b/apps/remix/app/components/dialogs/folder-delete-dialog.tsx index e05f943b3..aca0e7e31 100644 --- a/apps/remix/app/components/dialogs/folder-delete-dialog.tsx +++ b/apps/remix/app/components/dialogs/folder-delete-dialog.tsx @@ -122,7 +122,7 @@ export const FolderDeleteDialog = ({ folder, isOpen, onOpenChange }: FolderDelet Confirm by typing:{' '} - {deleteMessage} + {deleteMessage} diff --git a/apps/remix/app/components/dialogs/organisation-create-dialog.tsx b/apps/remix/app/components/dialogs/organisation-create-dialog.tsx index 183dfbeec..c76bc00a2 100644 --- a/apps/remix/app/components/dialogs/organisation-create-dialog.tsx +++ b/apps/remix/app/components/dialogs/organisation-create-dialog.tsx @@ -336,7 +336,7 @@ const BillingPlanForm = ({ value, onChange, plans, canCreateFreeOrganisation }: >
-

+

Free

diff --git a/apps/remix/app/components/dialogs/organisation-email-domain-delete-dialog.tsx b/apps/remix/app/components/dialogs/organisation-email-domain-delete-dialog.tsx index c903cd079..a0308e530 100644 --- a/apps/remix/app/components/dialogs/organisation-email-domain-delete-dialog.tsx +++ b/apps/remix/app/components/dialogs/organisation-email-domain-delete-dialog.tsx @@ -115,7 +115,7 @@ export const OrganisationEmailDomainDeleteDialog = ({ Confirm by typing{' '} - {deleteMessage} + {deleteMessage} diff --git a/apps/remix/app/components/dialogs/organisation-member-invite-dialog.tsx b/apps/remix/app/components/dialogs/organisation-member-invite-dialog.tsx index a033e7bff..d68c0f5d3 100644 --- a/apps/remix/app/components/dialogs/organisation-member-invite-dialog.tsx +++ b/apps/remix/app/components/dialogs/organisation-member-invite-dialog.tsx @@ -370,7 +370,7 @@ export const OrganisationMemberInviteDialog = ({ trigger, ...props }: Organisati From b16f979eb33622aee5a85252be501bbeae0eb9f9 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Tue, 14 Jul 2026 16:44:22 +0800 Subject: [PATCH 5/7] fix: improve editor autosave (#3057) --- .../envelope-recipient-autosave-race.spec.ts | 199 ++++++++++++++++++ .../hooks/use-envelope-autosave.ts | 116 +++++----- 2 files changed, 265 insertions(+), 50 deletions(-) create mode 100644 packages/app-tests/e2e/envelope-editor-v2/envelope-recipient-autosave-race.spec.ts diff --git a/packages/app-tests/e2e/envelope-editor-v2/envelope-recipient-autosave-race.spec.ts b/packages/app-tests/e2e/envelope-editor-v2/envelope-recipient-autosave-race.spec.ts new file mode 100644 index 000000000..1d1035527 --- /dev/null +++ b/packages/app-tests/e2e/envelope-editor-v2/envelope-recipient-autosave-race.spec.ts @@ -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; + /** 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 => { + let markFirstInFlight: () => void = () => {}; + + const firstRecipientSetInFlight = new Promise((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); + }); +}); diff --git a/packages/lib/client-only/hooks/use-envelope-autosave.ts b/packages/lib/client-only/hooks/use-envelope-autosave.ts index 1ca70c28c..93cc8a162 100644 --- a/packages/lib/client-only/hooks/use-envelope-autosave.ts +++ b/packages/lib/client-only/hooks/use-envelope-autosave.ts @@ -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(saveFn: (data: T) => Promise, delay = 1000) { const timeoutRef = useRef | null>(null); - const lastArgsRef = useRef(null); - const pendingPromiseRef = useRef | 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 | 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 => { + 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(); } }; From 12223c79cb6469108480bbd5c42c3aa39708a3de Mon Sep 17 00:00:00 2001 From: Ephraim Duncan <55143799+ephraimduncan@users.noreply.github.com> Date: Tue, 14 Jul 2026 09:40:40 +0000 Subject: [PATCH 6/7] fix(ui): improve destructive button contrast in dark mode (#3071) --- apps/docs/src/app/global.css | 2 +- packages/ui/styles/theme.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/docs/src/app/global.css b/apps/docs/src/app/global.css index 7d9c89316..ce71134c8 100644 --- a/apps/docs/src/app/global.css +++ b/apps/docs/src/app/global.css @@ -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%); diff --git a/packages/ui/styles/theme.css b/packages/ui/styles/theme.css index caa767433..fb125c026 100644 --- a/packages/ui/styles/theme.css +++ b/packages/ui/styles/theme.css @@ -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%; From d6268b1d7df560d984cb019ea719c972a68b6ee7 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Tue, 14 Jul 2026 19:13:40 +0800 Subject: [PATCH 7/7] fix: missing noreply email for resend (#3094) --- package-lock.json | 22 ++++---- package.json | 2 +- packages/email/package.json | 4 +- packages/email/transports/mailchannels.ts | 5 ++ .../email/transports/normalize-headers.ts | 55 +++++++++++++++++++ 5 files changed, 74 insertions(+), 14 deletions(-) create mode 100644 packages/email/transports/normalize-headers.ts diff --git a/package-lock.json b/package-lock.json index ac1c7d2f1..4f4159749 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,7 +49,7 @@ "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", @@ -3048,15 +3048,15 @@ "link": true }, "node_modules/@documenso/nodemailer-resend": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@documenso/nodemailer-resend/-/nodemailer-resend-4.0.0.tgz", - "integrity": "sha512-o2Wpz8jJXOov+CbEzWUhqXlBsdx/l/W0au054j5HUExaLpS+sCoJfdOM0A5uHGTInWOxqbNB0WSvxf9dWAzVSg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@documenso/nodemailer-resend/-/nodemailer-resend-5.0.0.tgz", + "integrity": "sha512-PDC7Yjzg35cS5i2TSJEZSP9j86BsYv4pEZOODurkK8+KFd3ymtWUqJrM6PrSNQ4MQpFp7chHlbBFP0ALYl8n0A==", "license": "MIT", "dependencies": { - "resend": "^4.0.0" + "resend": "^4.8.0" }, "peerDependencies": { - "nodemailer": "^6.9.3" + "nodemailer": "^9.0.0" } }, "node_modules/@documenso/nodemailer-resend/node_modules/@react-email/render": { @@ -24494,9 +24494,9 @@ "license": "MIT" }, "node_modules/nodemailer": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-8.0.11.tgz", - "integrity": "sha512-nrO/pDAUKl+wXX+lx16tDLbnm0fW6sK/x8mgohaCpg+CdCEl482bD4tCuAZk2DyliruiNTIZxRCoWkDqJEnAiA==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-9.0.3.tgz", + "integrity": "sha512-n+YP+NKwR5zRWa60k3GiQ6Q3B4KXCoAw40dAKeCtYn020iNN74aWK2liXIC3ZEATeGql7we3tE3t8QwhY0eskw==", "license": "MIT-0", "engines": { "node": ">=6.0.0" @@ -31270,7 +31270,7 @@ "version": "0.0.0", "license": "MIT", "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", @@ -31291,7 +31291,7 @@ "@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" }, diff --git a/package.json b/package.json index 808577cbc..2800c7f84 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "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", diff --git a/packages/email/package.json b/packages/email/package.json index bb549f70b..5fbc4a88c 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -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,7 +38,7 @@ "@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" }, diff --git a/packages/email/transports/mailchannels.ts b/packages/email/transports/mailchannels.ts index 93e82804d..923346f79 100644 --- a/packages/email/transports/mailchannels.ts +++ b/packages/email/transports/mailchannels.ts @@ -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 | undefined; @@ -54,6 +56,7 @@ export class MailChannelsTransport implements Transport { 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 { headers: requestHeaders, body: JSON.stringify({ from: from, + reply_to: replyTo, + headers: normalizeMailHeaders(mail.data.headers), subject: mail.data.subject, personalizations: [ { diff --git a/packages/email/transports/normalize-headers.ts b/packages/email/transports/normalize-headers.ts new file mode 100644 index 000000000..4dca6c8f1 --- /dev/null +++ b/packages/email/transports/normalize-headers.ts @@ -0,0 +1,55 @@ +import type Mail from 'nodemailer/lib/mailer'; + +/** + * Normalizes nodemailer mail headers into the flat `Record` + * 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 | undefined => { + if (!headers) { + return undefined; + } + + const normalized: Record = {}; + + 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; +};