Files
huly-platform/plugins/setting-assets/lang/fr.json
T
Don KendallandGitHub 5a3d673e84 feat(account): revocable API tokens managed from account settings (#10624)
* feat: API token management in workspace settings

Add UI and backend support for creating, listing, and revoking
API tokens scoped to workspaces. Includes owner-level workspace
token visibility, OpenAPI documentation, Mongo/Postgres persistence,
and i18n translations.

Signed-off-by: Don Kendall <kendall@donkendall.com>

* feat: enforce API token revocation at transactor level

Embed apiTokenId in JWT extra field and add a per-token revocation
cache (60s TTL) in the transactor REST handler. Revoked tokens are
now rejected within ~60 seconds instead of remaining valid until
JWT expiry.

Adds checkApiTokenRevoked account service method for the transactor
to query individual token revocation status.

Signed-off-by: Don Kendall <kendall@donkendall.com>

* feat: implement Phase 1 API token scopes (read/write/delete)

Add coarse-grained scope enforcement for API tokens. Tokens can now
be created with scopes ['read:*'], ['read:*','write:*'], or
['read:*','write:*','delete:*']. Existing tokens without scopes
retain full access (backward compatible).

- DB: v26 migration adds scopes TEXT[] column to api_tokens
- Types: add scopes field to ApiToken and ApiTokenInfo
- Operations: createApiToken accepts/validates/persists scopes,
  embeds in JWT via extra.scopes
- Enforcement: withSession checks scopes against method; tx handler
  additionally requires delete:* for TxRemoveDoc
- Client: createApiToken signature accepts optional scopes param
- UI: scope preset dropdown in create popup (default: Read Only),
  permissions column in token list with i18n labels
- Also fixes 3 pre-existing TS2322/TS2345 errors in operations.ts

Signed-off-by: Don Kendall <kendall@donkendall.com>

* test: add unit tests for API token scope enforcement

- scopes.test.ts: 8 tests for hasScope() and getRequiredScope() logic
- apiTokenScopes.test.ts: 7 tests for createApiToken scope validation
  (valid scopes, multiple scopes, no scopes backward compat, invalid
  format rejection, empty array rejection, domain-scope rejection)
  and listApiTokens scopes inclusion
- Export hasScope/getRequiredScope from rpc.ts for testability

Signed-off-by: Don Kendall <kendall@donkendall.com>

* fix: address review feedback — role restriction, locale parity, formatting

- Restrict API token creation/revocation to AccountRole.User or higher
  (guests cannot use API tokens), per reviewer suggestion
- Add 5 missing translation keys (ApiTokenPermissions, ApiTokenScopePreset,
  ApiTokenScopeReadOnly, ApiTokenScopeReadWrite, ApiTokenScopeFullAccess)
  to all non-en locale files to fix locale parity CI test
- Fix prettier formatting in apiTokenScopes.test.ts
- Rename local `extra` to `tokenExtra` in createApiToken to avoid
  shadowing the decoded token's `extra` field

Signed-off-by: Don Kendall <kendall@donkendall.com>

* fix: address aonnikov architectural review feedback

- rpc.ts: use system service token for checkApiTokenRevoked so the
  revocation check is not coupled to the user's potentially-revoked
  bearer token; systemAccountUuid + service:'server' ensures account
  service always accepts the call
- ApiDocsSection.svelte: derive transactor base URL from
  login.metadata.LoginEndpoint (set on auth) instead of
  window.location.origin, which is not necessarily the transactor host
- ApiTokenCreatePopup.svelte: replace manual translate() calls and
  themeStore language watch with DropdownLabelsIntl + DropdownIntlItem[],
  which handle i18n automatically; error state is now IntlString
- General.svelte: remove legacy GenerateApiToken button, handler, and
  ApiTokenPopup import in favour of the new ApiTokens settings panel

Signed-off-by: Don Kendall <kendall@donkendall.com>

* fix: formatting in ApiTokenPopup, apiTokenScopes test, and operations

Signed-off-by: Don Kendall <kendall@donkendall.com>

* fix: apply rushx fmt to pass CI formatting check

Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* fix: restore (s as any) cast in server_http.ts removed by ESLint autofix

Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* refactor(token): centralize API token revocation/expiry in verifyToken

Address @aonnikov's review: the bespoke checkApiTokenRevoked RPC and the
ad-hoc revocation cache in the transactor are replaced by a reusable
verifyToken in server-token that checks signature, expiry, and (for
revokable API tokens) revocation via a pluggable checker.

- server-token: add verifyToken + isTokenExpired + setApiTokenRevocationChecker
  (the 'method to verify' metadata the plugin needs, without depending on the
  account client). Revocation cache (60s TTL) now lives here, reusable by any
  service (transactor, blob access, etc.).
- account: the account is now authoritative — wrap() rejects revoked/expired
  API tokens, so any account method (selectWorkspace/getWorkspaceInfo/...)
  naturally 401s. Removed the redundant checkApiTokenRevoked method.
- account-client: drop checkApiTokenRevoked.
- transactor: withSession uses verifyToken; the registered checker reuses the
  existing getLoginInfoByToken instead of a dedicated boolean RPC. Scopes are
  parsed once and threaded through (no re-decode in the tx handler).
- tests: verifyToken/isTokenExpired unit coverage.

Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* fix(setting): derive REST API base from account-provided transactor endpoint

Address @aonnikov: the REST API host must come from the transactor endpoint
returned by the account service (the login endpoint, a ws(s):// URL), not be
constructed from window.location. Convert ws->http and append /api/v1, matching
the existing ServerManagerGeneral pattern.

Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* i18n(setting): translate API token strings across all locales

Address @ArtyomSavchenko: the new API token UI strings were left in English
in non-en locales. Provide translations for ru/de/es/fr/it/pt/pt-br/zh/ja/cs/tr.
The en/ru locale-parity test passes (the prior failure was an en/ru key
mismatch, resolved by the develop merge).

Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* style: wrap long lines to satisfy prettier (account utils import, ApiDocsSection)

Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* fix(api-token): drop unenforceable scopes, harden the token lifecycle

The scopes were only ever consulted in the transactor's REST handler, so
they promised a boundary the platform did not keep:

- the WebSocket transport decodes the token and never looks at scopes, so
  a read-only token could open a socket and issue any transaction;
- even on the REST path, delete:* only matched a top-level TxRemoveDoc and
  was bypassed by nesting the removal in a TxApplyIf;
- nothing stopped a scoped token from calling createApiToken and minting
  an unscoped one.

Narrowing a token's rights has to happen in the pipeline, where it covers
every transport, and that is a larger design than this feature. Until then
a token carries its account's rights and says so, rather than displaying a
restriction that does not hold. Scopes are removed end to end.

What is kept is made to work:

- API tokens can no longer create, list or revoke API tokens. Otherwise a
  leaked token renews itself and revokes the tokens meant to stop it.
- Revocation fails closed. The account is the only authority on it, so an
  unreachable account now rejects the token instead of admitting a revoked
  one to whoever can keep the account busy. Verdicts stay trusted for the
  cache TTL so brief outages do not cut off healthy tokens.
- The revocation cache is bounded and re-checks negative verdicts.
- Revoking your own token no longer requires a role in its workspace, so
  leaving a workspace cannot strand a credential you can never revoke.
- The per-account limit counts only usable tokens; revoked and expired
  ones are kept for the audit trail and used to lock out anyone rotating.
- Rejected REST tokens are logged with a reason, since expired, revoked
  and unverifiable are one opaque 401 from outside.

The unused listWorkspaceApiTokens/revokeWorkspaceApiToken pair is removed;
it had no caller and no test.

Tests cover the role restriction, the API-token guard, ownership on
revoke, the limit accounting and fail-closed revocation. Removing any of
those checks fails them.

Claude-Session: https://claude.ai/code/session_01ANdoXbdn5k2hZy734EwKe7
Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* fix(setting): correct the API token settings page

- Moves the page from workspace settings to account settings. Tokens
  belong to the account: the page already lists them across every
  workspace, and creating one only needs the User role the account
  service checks, not Owner as the category required.
- Surfaces failures. A failed revoke was logged to the console and the
  row re-rendered unchanged; loading workspaces could reject unhandled
  and leave an empty dropdown with no explanation.
- Outside a secure context there is no clipboard API, so the OK button
  did nothing and the dialog had no way out but Cancel. It now closes,
  leaving the token selectable.
- Replaces hardcoded English labels, adds aria-expanded on the docs
  disclosure and labels on the copy targets.
- Fills in the Korean and Polish translations, which were the only two
  locales missing these keys, and drops the API access strings orphaned
  when this PR replaced the old Generate API token button.

Claude-Session: https://claude.ai/code/session_01ANdoXbdn5k2hZy734EwKe7
Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* chore: drop docs/openapi.yaml from the API token PR

Unrelated to this feature and wrong for this repo: it documents a
/_tokens minting service and a tools/mint-token CLI that do not exist
here, uses reverse-proxy prefixes from a self-hosted deployment rather
than the transactor's /api/v1 routes, and states that revocation is a
future enhancement, which is what this PR implements. Nothing references
it. REST API docs belong in their own change, generated against the
routes that exist.

Claude-Session: https://claude.ai/code/session_01ANdoXbdn5k2hZy734EwKe7
Signed-off-by: Don Kendall <dkendall@ledoweb.com>

---------

Signed-off-by: Don Kendall <kendall@donkendall.com>
Signed-off-by: Don Kendall <dkendall@ledoweb.com>
2026-08-04 13:10:48 +07:00

287 lines
18 KiB
JSON
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"string": {
"Setting": "Paramètre",
"Spaces": "Espaces",
"Integrations": "Intégrations",
"Support": "Support",
"Privacy": "Confidentialité",
"Terms": "Conditions",
"AccountSettings": "Paramètres du compte",
"Categories": "Catégories",
"Delete": "Supprimer",
"ChangePassword": "Changer le mot de passe",
"Disconnect": "Déconnecter",
"DisconnectAll": "Déconnecter tous",
"Saving": "Enregistrement...",
"Saved": "Enregistré",
"Add": "Ajouter",
"AddNew": "Ajouter {type}",
"Proceed": "Continuer",
"NewEmail": "Nouveau courriel",
"SendConfirmation": "Envoyer le code de confirmation",
"CodeSent": "Le code a été envoyé. Veuillez le saisir dans le champ ci-dessous.",
"SendAgain": "Envoyer à nouveau",
"SendAgainIn": "Peut être envoyé à nouveau dans",
"Value": "Valeur",
"Signout": "Déconnexion",
"Settings": "Paramètres",
"SelectWorkspace": "Sélectionner un espace de travail",
"InviteWorkspace": "Inviter à l'espace de travail",
"DeleteStatus": "Supprimer le statut",
"DeleteStatusConfirm": "Voulez-vous supprimer ce statut ?",
"Reconnect": "Reconnecter",
"IntegrationDisabled": " a été désactivé",
"IntegrationDisabledSetting": "L'intégration a été désactivée",
"IntegrationDisabledDescr": "Intégration désactivée",
"IntegrationWith": "Intégration avec ",
"ClassSetting": "Paramètre de classe",
"ClassSettingHint": "Un ensemble ou une catégorie de choses ayant une propriété ou un attribut en commun avec d'autres par genre, type ou qualité.",
"ClassProperties": "Propriétés de classe",
"Classes": "Classes",
"Attributes": "Attributs",
"DeleteAttribute": "Supprimer l'attribut",
"DeleteAttributeConfirm": "Voulez-vous supprimer cet attribut ?",
"DeleteAttributeExistConfirm": "Voulez-vous supprimer cet attribut ? Les données seront perdues",
"DeleteMixin": "Supprimer le Mixin",
"DeleteMixinConfirm": "Voulez-vous supprimer ce Mixin ?",
"DeleteMixinExistConfirm": "Voulez-vous supprimer ce Mixin ? Les données ne seront pas disponibles",
"Attribute": "Attribut",
"Custom": "Personnalisé",
"Type": "Type",
"WithTime": "Avec heure",
"DateMode": "Mode de date",
"CreatingAttribute": "Création d'un attribut",
"EditAttribute": "Modifier l'attribut",
"CreateEnum": "Créer un énumérateur",
"EditEnum": "Modifier l'énumérateur",
"Enums": "Énumérateurs",
"EnumsSettingHint": "Un ensemble ou une catégorie de choses ayant une propriété ou un attribut en commun avec d'autres par genre, type ou qualité.",
"EnumTitle": "Titre de l'énumérateur",
"EnumsCount": "{count, plural, =1 {# option} other {# options}}",
"ProjectTypesCount": "{count, plural, =0 {Aucun type de projet} =1 {# type de projet} other {# types de projet}}",
"Options": "Options",
"EnterOptionTitle": "Entrez le titre de l'option",
"NewEnumDialogClose": "Voulez-vous fermer cette fenêtre ?",
"NewEnumDialogCloseNote": "Tous les changements seront perdus",
"NewValue": "Nouvelle valeur",
"Leave": "Quitter l'espace de travail",
"LeaveDescr": "Êtes-vous sûr de vouloir quitter l'espace de travail ? Cette action est irréversible.",
"Members": "Membres",
"WorkspaceSettings": "Paramètres de l'espace de travail",
"Select": "Sélectionner",
"AddOwner": "Ajouter un propriétaire",
"ReadonlyGuest": "Lecture seule",
"Guest": "Invité",
"User": "Utilisateur",
"Maintainer": "Mainteneur",
"Owner": "Propriétaire",
"OwnerFirstName": "Prénom du propriétaire",
"OwnerLastName": "Nom de famille du propriétaire",
"Role": "Rôle",
"FailedToSave": "Échec de la mise à jour du mot de passe",
"ImportEnum": "Importer des valeurs d'énumération",
"ImportEnumCopy": "Copier les valeurs d'énumération depuis le presse-papiers",
"CreateMixin": "Créer un Mixin",
"OldNames": "Anciennes valeurs",
"NewClassName": "Tapez un nouveau nom de classe ou sélectionnez parmi les valeurs précédentes...",
"ShowAttribute": "Afficher l'attribut",
"HideAttribute": "Masquer l'attribut",
"Visibility": "Visibilité",
"Hidden": "Caché",
"Configure": "Configurer",
"InviteSettings": "Paramètres d'invitation",
"RoleCapabilitySettings": "Autorisations de rôle",
"DefaultInviteRoleForJoin": "Rôle attribué par défaut après avoir rejoint via un lien d'invitation :",
"InviteLinkGeneratorRoles": "Sélectionnez les rôles utilisateurs pouvant générer des liens d'invitation :",
"DefaultValue": "Valeur par défaut",
"SelectAValue": "Sélectionnez une valeur",
"DateOnly": "Date uniquement",
"OnlyTime": "Heure uniquement",
"DateAndTime": "Date et heure",
"Configuration": "Configuration",
"ConfigurationEnabled": "Activé",
"ConfigurationDisabled": "Désactivé",
"ConfigDisable": "Désactiver",
"ConfigEnable": "Activer",
"ConfigBeta": "Version bêta",
"Properties": "Propriétés",
"TaskTypes": "Types de tâches",
"Automations": "Automatisations",
"Collections": "Collections",
"ClassColon": "Classe :",
"SpaceTypes": "Types d'espace",
"NewSpaceType": "Nouveau type d'espace",
"SpaceTypeTitle": "Titre du type d'espace",
"General": "Général",
"Description": "Description",
"CountSpaces": "{count, plural, =0 {Aucun espace} =1 {# espace} other {# espaces}}",
"Roles": "Rôles",
"RoleName": "Nom du rôle",
"Permissions": "Permissions",
"Assignees": "Assignés",
"DeleteRole": "Supprimer le rôle",
"DeleteRoleConfirmation": "Êtes-vous sûr de vouloir supprimer ce rôle ? Tous les utilisateurs ayant ce rôle perdront leurs permissions.",
"DeleteWorkspace": "Supprimer l'espace de travail",
"DeleteWorkspaceConfirm": "Êtes-vous sûr de vouloir supprimer cet espace de travail ? Vous et tous les autres membres perdrez l'accès à cet espace de travail. Toutes les informations de l'espace de travail seront perdues. Cette action est irréversible. Voulez-vous continuer?",
"DeleteSpaceType": "Supprimer le type d'espace",
"DeleteSpaceTypeConfirm": "Êtes-vous sûr de vouloir supprimer ce type d'espace ?",
"WorkspaceName": "Nom de l'espace de travail",
"Workspace": "Espace de travail",
"OwnerOrMaintainerRequired": "Vous devez être propriétaire ou responsable d'un espace de travail",
"LastOwnerLeaveTitle": "Impossible de quitter l'espace de travail",
"LastOwnerLeaveMessage": "Vous êtes le seul propriétaire de cet espace de travail. Pour le quitter, attribuez d'abord les droits de propriétaire à un autre membre. Si personne n'a plus besoin de cet espace de travail, envisagez de le supprimer.",
"Backup": "Sauvegarde",
"BackupLast": "Dernière sauvegarde",
"BackupTotalSnapshots": "Total des instantanés",
"BackupTotalFiles": "Fichiers",
"BackupSize": "Taille de la sauvegarde",
"BackupLinkInfo": "L'URL d'un répertoire de sauvegarde pouvant être téléchargé de manière récursive à l'aide d'outils comme wget ou curl.",
"BackupBearerTokenInfo": "Un jeton d'accès est requis pour accéder à la sauvegarde.",
"BackupSnapshots": "Instantanés de sauvegarde",
"BackupFileDownload": "Télécharger le fichier",
"BackupFiles": "Fichiers de sauvegarde",
"BackupNoBackup": "Aucune sauvegarde n'est actuellement disponible.",
"BackupDownloadAll": "Télécharger la sauvegarde complète",
"BackupPreparingDownload": "Préparation de la sauvegarde…",
"BackupDownloadAllInfo": "Téléchargez tous les fichiers de sauvegarde dans une seule archive .zip que vous pouvez conserver sur votre ordinateur.",
"BackupCopyScript": "Copier le script de téléchargement",
"BackupCopyToken": "Copier le jeton",
"BackupScriptInfo": "Un script shell qui télécharge tous les fichiers de sauvegarde avec curl. Enregistrez-le et exécutez-le dans un terminal ; il demande votre jeton de sauvegarde, aucun secret n'est donc stocké dans le script.",
"BackupRestoreGuide": "Guide de sauvegarde et restauration",
"BackupRestoreGuideInfo": "Instructions étape par étape pour télécharger cette sauvegarde et la restaurer sur une autre instance Huly.",
"NonBackupedBlobs": "Non Backed up blobs",
"Calendar": "Calendrier",
"StartOfTheWeek": "Début de semaine",
"SystemSetupString": "Configuration du système ({day})",
"DefaultString": "Par défaut ({day})",
"AddAttribute": "Ajouter un attribut",
"WorkspaceNamePattern": "Le nom doit comporter 40 caractères ou moins, ne doit pas être vide et ne doit pas contenir de caractères spéciaux (<, >, /)",
"Mailboxes": "Boîtes aux lettres",
"CreateMailbox": "Créer une boîte aux lettres",
"CreateMailboxPlaceholder": "my-cool-name",
"MailboxNoDomains": "Les domaines de messagerie ne sont pas configurés",
"MailboxLimitReached": "Limite de boîtes aux lettres atteinte",
"MailboxErrorInvalidName": "Nom de la boîte aux lettres invalide",
"MailboxErrorDomainNotFound": "Domaine introuvable",
"MailboxErrorNameRulesViolated": "Le nom de la boîte aux lettres doit comporter {minLen} à {maxLen} caractères",
"MailboxErrorMailboxExists": "Cette boîte aux lettres est déjà occupée",
"MailboxErrorMailboxCountLimit": "Limite de boîtes aux lettres atteinte pour votre compte",
"DeleteMailbox": "Supprimer la boîte aux lettres",
"MailboxDeleteConfirmation": "Êtes-vous sûr de vouloir supprimer cette boîte aux lettres ?",
"DisablePermissions": "Désactiver le contrôle d'accès basé sur les rôles",
"EnablePermissions": "Activer le contrôle d'accès basé sur les rôles",
"DisablePermissionsConfirmation": "Êtes-vous sûr de vouloir désactiver le contrôle d'accès basé sur les rôles ? Tous les rôles et permissions seront désactivés.",
"EnablePermissionsConfirmation": "Êtes-vous sûr de vouloir activer le contrôle d'accès basé sur les rôles ? Tous les rôles et permissions seront activés.",
"BetaWarning": "Les modules étiquetés comme bêta sont disponibles à des fins expérimentales et peuvent ne pas être entièrement fonctionnels. Nous ne recommandons pas de compter sur les fonctionnalités bêta pour un travail critique pour le moment.",
"IntegrationFailed": "Échec de la création de l'intégration",
"IntegrationError": "Veuillez réessayer ou contacter le support si le problème persiste",
"EmailIsUsed": "L'adresse e-mail est déjà utilisée par un autre compte",
"Customize": "Personnaliser",
"GuestAccess": "Invités anonymes",
"GuestAccessDescription": "Autorise les utilisateurs anonymes à accéder à l'espace de travail en lecture seule",
"GuestSignUpDescription": "Permet aux utilisateurs anonymes de rejoindre votre espace de travail en tant qu'invités avec des droits d'édition limités",
"GuestChannelsDescription": "Canaux où les invités peuvent écrire des messages après leur adhésion",
"GuestChannelsArrayLabel": "Sélectionner des canaux",
"GuestSelectSpaces": "Sélectionner des espaces",
"GuestAutoJoinAvailableSpaces": "Espaces en adhésion automatique",
"GuestAutoJoinAvailableSpacesHint": "Chaque carte dapplication a sa propre ligne « Espaces en adhésion automatique » : choisissez où les invités sont ajoutés lorsquils activent leur accès. Les changements sont immédiats.",
"GuestAnonymousVisibleSpaces": "Espaces visibles en anonyme",
"GuestAnonymousVisibleSpacesHint": "Chaque carte dapplication a sa propre ligne : choisissez les espaces où le compte anonyme en lecture seule est ajouté comme membre afin que les visiteurs sans compte puissent les ouvrir. Les changements sont immédiats.",
"ManageIdentities": "Gérer les identités",
"Release": "Libération",
"ReleaseSocialId": "Libérer l'ID social",
"ReleaseSocialIdConfirm": "Êtes-vous sûr de vouloir libérer cet ID social : {socialId} ? Cela le supprimera de votre compte et vous ne pourrez plus l'utiliser pour vous connecter. De plus, toutes les intégrations associées seront supprimées.",
"ReleasePrimarySocialId": "Libérer l'ID social principal",
"ReleasePrimarySocialIdConfirm": "Libérer votre ID social principal actuel nécessitera de recharger la page. Êtes-vous sûr de vouloir continuer ?",
"Login": "Connexion",
"Primary": "Principal",
"MyIntegrations": "Mes intégrations",
"AllIntegrations": "Toutes",
"ConnectedIntegrations": "Connectées",
"AvailableIntegrations": "Disponibles",
"Connect": "Connecter",
"Integrate": "Intégrer",
"FailedToLoadIntegrations": "Échec du chargement des intégrations",
"FailedToDisconnect": "Échec de la déconnexion de l'intégration",
"ServiceIsUnavailable": "Le service n'est pas disponible",
"Integrated": "Intégré",
"Connected": "Connecté",
"Disconnected": "Déconnecté",
"Available": "Disponible",
"NotConnectedIntegration": "Le compte {account} n'est pas intégré au workspace",
"IntegrationIsUnstable": "Le service d'intégration rencontre des problèmes. Certaines fonctionnalités peuvent ne pas fonctionner correctement.",
"MinValue": "Valeur minimale",
"Restricted": "Restreint",
"RestrictedAttributeWarning": "Êtes-vous sûr de vouloir restreindre la modification de cet attribut ? Cette action créera des permissions pour cet attribut et ne peut pas être annulée.",
"MaxValue": "Valeur maximale",
"IntegerOnly": "Nombres entiers uniquement",
"AccessControl": "Contrôle d'accès",
"DangerZone": "Zone dangereuse",
"IdentifierExists": "Identifiant déjà utilisé",
"PasswordAgingRule": "Règle de vieillissement du mot de passe",
"PasswordAgingRuleDescription": "Nombre de jours après lesquels les utilisateurs devront changer leur mot de passe.",
"OfficeSettings": "Paramètres du bureau",
"OfficeDefaultSettings": "Paramètres par défaut pour les salles de réunion",
"DefaultStartWithTranscription": "Activer la transcription dans les nouveaux bureaux",
"DefaultStartWithRecording": "Activer l'enregistrement dans les nouveaux bureaux",
"GuestPermissionsSettings": "Invités",
"GuestPermissionsApplicationPermissions": "Permissions des applications",
"GuestPermissionsApplicationPermissionsHint": "Choisissez les applications accessibles aux invités, puis ajustez les permissions pour chaque application ci-dessous.",
"GuestPermissionsTabGuest": "Invité",
"GuestPermissionsTabAnonymousGuest": "Invité anonyme",
"GuestPermissionsAnonymousApplicationHint": "Accès aux applications pour les invités anonymes (lecture seule). Les applications visibles peuvent aussi dépendre de la configuration de déploiement.",
"ImportDocumentPermission": "Importer des documents",
"ImportDocumentDescription": "Accorde aux utilisateurs la possibilité d'importer des documents dans l'espace de travail",
"SelectUsers": "Sélectionner des utilisateurs",
"ShowInTitle": "Afficher dans le titre",
"SpaceMembersOnly": "Membres de l'espace uniquement",
"Reset": "Réinitialiser",
"Security": "Sécurité",
"TwoFactorAuth": "Authentification à deux facteurs",
"TwoFactorAuthDescription": "L'authentification à deux facteurs ajoute une couche de sécurité supplémentaire à votre compte",
"EnableTwoFactorAuth": "Activer l'authentification à deux facteurs",
"DisableTwoFactorAuth": "Désactiver l'authentification à deux facteurs",
"TwoFactorAuthEnabled": "L'authentification à deux facteurs est activée",
"TwoFactorAuthDisabled": "L'authentification à deux facteurs est désactivée",
"ShowQRCode": "Afficher le code QR",
"EnterVerificationCode": "Entrer le code de vérification",
"OverrideAttribute": "Surcharger l'attribut",
"Required": "Requis",
"ApiBaseUrl": "URL de base",
"ApiEndpointAccount": "Obtenir les informations du compte",
"ApiEndpointFindAll": "Interroger les documents par classe",
"ApiEndpointFindAllPost": "Requête avec filtres (corps JSON)",
"ApiEndpointLoadModel": "Charger le modèle de données",
"ApiEndpointPing": "Vérification de l’état",
"ApiEndpointTx": "Créer ou mettre à jour des documents",
"ApiTokenCopyWarning": "Copiez ce jeton maintenant. Vous ne pourrez plus le revoir.",
"ApiTokenCreated": "Jeton créé",
"ApiTokenExpiry": "Expiration",
"ApiTokenName": "Nom du jeton",
"ApiTokenNoTokens": "Aucun jeton API pour le moment",
"ApiTokenRevoke": "Révoquer le jeton",
"ApiTokenRevokeConfirm": "Voulez-vous vraiment révoquer ce jeton ? Il ne pourra plus être utilisé pour accéder à lAPI.",
"ApiTokenWorkspace": "Espace de travail",
"ApiTokens": "Jetons API",
"ApiUsageDescription": "Utilisez votre jeton API avec lAPI REST intégrée pour interroger et modifier les données de lespace de travail. Transmettez le jeton en tant que jeton Bearer dans len-tête Authorization.",
"ApiUsageTitle": "Utilisation de lAPI REST",
"ApiWorkspaceId": "Lidentifiant de votre espace de travail (UUID) est inclus dans le jeton. Transmettez-le en tant que :workspaceId dans lURL.",
"CreateApiToken": "Créer un jeton",
"Created": "Créé",
"Expires": "Expire",
"TokenStatus": "Statut",
"ApiTokenStatusActive": "Actif",
"ApiTokenStatusExpiring": "Expire bientôt",
"ApiTokenStatusRevoked": "Révoqué",
"ApiTokenStatusExpired": "Expiré",
"ApiTokenExpiry7Days": "7 jours",
"ApiTokenExpiry30Days": "30 jours",
"ApiTokenExpiry90Days": "90 jours",
"ApiTokenExpiry180Days": "180 jours",
"ApiTokenExpiry365Days": "365 jours",
"ApiTokenLoadError": "Échec du chargement des jetons API",
"ApiTokenCreateError": "Échec de la création du jeton. Veuillez réessayer.",
"ApiTokenRevokeError": "Échec de la révocation du jeton. Veuillez réessayer."
}
}