{ "profile": { "tabs": { "profile": "Profil", "security": "Sécurité", "sso": "SSO", "apiKeys": "Clés API", "notifications": "Notifications", "calendar": "Calendrier", "keyboardShortcuts": "Keyboard Shortcuts" }, "basicInfo": { "title": "Informations de base" }, "fields": { "firstName": { "label": "Prénom *" }, "lastName": { "label": "Nom *" }, "email": { "label": "Courriel *" }, "phoneNumber": { "label": "Numéro de téléphone" }, "timeZone": { "label": "Fuseau horaire" } }, "actions": { "saveChanges": "Enregistrer les modifications" }, "notifications": { "title": "Préférences de notification", "viewSwitcher": { "email": "Courriel", "internal": "Interne" } }, "loading": "Chargement du profil...", "messages": { "success": { "profileUpdated": "Profil mis à jour avec succès" }, "error": { "userNotFound": "Utilisateur introuvable", "fillRequiredFields": "Veuillez remplir tous les champs obligatoires", "loadFailed": "Échec du chargement du profil", "saveFailed": "Échec de l'enregistrement du profil", "errorPrefix": "Erreur : {{error}}" } }, "validation": { "firstNameRequired": "Le prénom est obligatoire", "lastNameRequired": "Le nom est obligatoire" }, "pageTitle": "Votre profil", "changePassword": { "title": "Changer le mot de passe", "current": "Mot de passe actuel", "new": "Nouveau mot de passe", "confirm": "Confirmer le nouveau mot de passe", "requirements": "Le mot de passe doit contenir au moins 8 caractères", "submit": "Changer le mot de passe", "success": "Mot de passe modifié avec succès", "error": "Échec de la modification du mot de passe", "passwordMismatch": "Les nouveaux mots de passe ne correspondent pas", "unknownError": "Une erreur est survenue lors du changement de mot de passe", "validationFailed": "Le mot de passe ne respecte pas toutes les exigences" }, "loadingStates": { "sso": { "title": "Authentification unique", "description": "Chargement des paramètres SSO..." }, "calendar": { "title": "Calendrier", "description": "Chargement des paramètres du calendrier..." } } }, "security": { "title": "Paramètres de sécurité", "tabs": { "roles": "Rôles", "sessions": "Sessions", "sso": "SSO", "permissions": "Autorisations", "userRoles": "Rôles des utilisateurs", "policies": "Politiques", "apiKeys": "Clés API", "webhooks": "Webhooks" }, "loading": { "roles": "Chargement de la configuration des rôles...", "permissions": "Chargement de la configuration des permissions...", "userRoles": "Chargement de la configuration des rôles des utilisateurs...", "policies": "Chargement de la configuration des politiques...", "apiKeys": "Chargement de la configuration des clés API...", "webhooks": "Chargement de la configuration des webhooks...", "sso": "Chargement des outils de gestion SSO...", "sessions": "Chargement des sessions actives..." }, "userRoles": { "title": "Attribuer des rôles aux utilisateurs", "description": { "msp": "Gérer les attributions de rôles pour les utilisateurs MSP", "client": "Gérer les attributions de rôles pour les utilisateurs du portail client" }, "viewSwitcher": { "msp": "MSP", "clientPortal": "Portail client" }, "showInactive": "Afficher les utilisateurs inactifs", "fields": { "selectUser": "Sélectionner un utilisateur", "selectRole": "Sélectionner un rôle" }, "actions": { "assignRole": "Attribuer un rôle" }, "table": { "user": "Utilisateur", "email": "Courriel", "roles": "Rôles", "actions": "Actions" }, "noRolesAssigned": "Aucun rôle attribué", "removeRole": "Supprimer {{role}}", "emptyState": { "noUsers": "Aucun utilisateur {{type}} trouvé", "inactiveHidden": "(utilisateurs inactifs masqués)" }, "inactiveTag": "(Inactif)", "unnamedUser": "Utilisateur sans nom", "messages": { "success": { "roleAssigned": "Rôle attribué avec succès", "roleRemoved": "Rôle supprimé avec succès" }, "error": { "assignFailed": "Échec de l'attribution du rôle. Veuillez réessayer.", "removeFailed": "Échec de la suppression du rôle. Veuillez réessayer.", "permissionDenied": "Vous n'avez pas la permission de modifier les rôles des utilisateurs." } } }, "sessions": { "title": "Toutes les sessions utilisateur", "filters": { "search": "Rechercher", "searchPlaceholder": "Rechercher par nom, courriel, appareil ou IP...", "user": "Utilisateur", "allUsers": "Tous les utilisateurs", "loginMethod": "Méthode de connexion", "allMethods": "Toutes les méthodes", "userType": "Type d'utilisateur", "allTypes": "Tous les types", "from": "Du", "to": "Au", "selectDate": "Sélectionner une date", "reset": "Réinitialiser" }, "loginMethods": { "password": "Mot de passe", "google": "Google OAuth", "microsoft": "Microsoft OAuth", "keycloak": "Keycloak" }, "userTypes": { "internal": "Interne", "client": "Client" }, "session": { "yourSession": "Votre session", "unknownDevice": "Appareil inconnu", "lastActive": "Dernière activité {{time}}", "logout": "Déconnexion", "revoke": "Révoquer", "revoking": "Révocation..." }, "oauthWarning": "La révocation de cette session ne révoquera pas l'accès OAuth {{provider}}. Révoquez l'accès depuis les paramètres de votre compte {{provider}}.", "confirmLogout": "Êtes-vous sûr de vouloir vous déconnecter de cet appareil ?", "messages": { "loggingOut": "Déconnexion en cours...", "revoked": "Session révoquée avec succès", "loadFailed": "Échec du chargement des sessions", "revokeFailed": "Échec de la révocation de la session" }, "emptyState": { "loading": "Chargement des sessions...", "noMatch": "Aucune session ne correspond à votre recherche", "noSessions": "Aucune session active trouvée" }, "subtitle_one": "{{sessionCount}} session active pour {{userCount}} utilisateur", "subtitle_other": "{{sessionCount}} sessions actives pour {{userCount}} utilisateurs" }, "webhooks": { "title": "Webhooks sortants", "description": "Créez des abonnements signés au cycle de vie des tickets, filtrez-les par identifiants de ticket spécifiques, inspectez l'historique des livraisons et faites tourner les secrets sans quitter les paramètres.", "newWebhook": "Nouveau webhook", "tabs": { "configuration": "Configuration", "deliveries": "Livraisons", "inbound": "Entrants", "outbound": "Sortants" }, "inbound": { "title": "Webhooks entrants", "description": "Acceptez les requêtes authentifiées de systèmes externes et dispatchez-les vers des actions directes ou des workflows.", "placeholder": "Configurez des endpoints de webhooks entrants qui vérifient les requêtes, déduisent les livraisons et dispatchent vers des actions ou des workflows.", "newWebhook": "Nouveau webhook", "list": { "title": "Webhooks entrants configurés", "loading": "Chargement…", "configuredCount": "{{count}} configurés", "empty": "Aucun webhook entrant configuré.", "columns": { "name": "Nom", "handler": "Gestionnaire", "lastDelivery": "Dernière livraison", "active": "Actif", "actions": "Actions" } }, "handlers": { "directAction": "Action directe", "workflow": "Workflow" }, "status": { "active": "Actif", "inactive": "Inactif" }, "messages": { "loadFailed": "Échec du chargement des webhooks entrants.", "nameRequired": "Le nom est requis.", "slugRequired": "Le slug est requis.", "actionRequired": "Sélectionnez une action avant d'enregistrer.", "workflowRequired": "Sélectionnez un workflow avant d'enregistrer.", "missingRequiredFields": "Mappez une valeur pour les champs requis : {{fields}}" }, "dialog": { "createTitle": "Créer un webhook entrant", "editTitle": "Modifier le webhook entrant", "cancel": "Annuler", "create": "Créer le webhook", "save": "Enregistrer les modifications", "saveUnavailable": "Continuer" }, "identity": { "title": "Identité", "help": "Nommez le webhook et choisissez le slug compatible URL utilisé dans son endpoint récepteur.", "name": "Nom", "namePlaceholder": "Alertes RMM critiques", "slug": "Slug", "slugPlaceholder": "alertes-rmm-critiques", "description": "Description", "descriptionPlaceholder": "Notes optionnelles sur le système source et la charge utile." }, "auth": { "title": "Authentification", "help": "Choisissez comment les requêtes entrantes prouvent qu'elles sont autorisées à utiliser cet endpoint.", "method": "Méthode d'authentification", "types": { "hmacSha256": "HMAC-SHA256", "bearer": "Jeton Bearer", "ipAllowlist": "Liste blanche IP", "pathToken": "Secret partagé dans le chemin" }, "signatureHeader": "En-tête de signature", "signatureHeaderPlaceholder": "X-Alga-Signature", "bearerToken": "Jeton Bearer", "bearerTokenPlaceholder": "Collez le jeton ou laissez vide pour en générer un", "secretUnchangedPlaceholder": "Laissez vide pour conserver le secret actuel", "ipCidrs": "IPs / CIDRs autorisés", "ipCidrsPlaceholder": "203.0.113.10\n198.51.100.0/24", "queryParam": "Paramètre de requête", "queryParamPlaceholder": "token", "pathToken": "Jeton de chemin", "pathTokenPlaceholder": "Collez le jeton ou laissez vide pour en générer un" }, "secret": { "label": "Secret du webhook", "warning": "Cette valeur n'est affichée que maintenant. Enregistrez-la dans le système source avant de fermer cette boîte de dialogue.", "copy": "Copier", "download": "Télécharger en .txt", "close": "Fermer" }, "idempotency": { "title": "Idempotence", "help": "Utilisez une clé stable pour détecter les livraisons en double dans la fenêtre configurée.", "source": "Source de la clé", "types": { "header": "En-tête HTTP", "jsonata": "Expression JSONata" }, "headerName": "Nom de l'en-tête", "headerNamePlaceholder": "X-Idempotency-Key", "jsonataExpression": "Expression JSONata", "jsonataExpressionPlaceholder": "alert.id", "windowSeconds": "Fenêtre de doublons (secondes)" }, "active": { "title": "État actif", "help": "Mettez en pause l'endpoint sans supprimer son URL, ses mappages ou son historique de livraison.", "toggle": "Webhook actif", "autoDisabled": "Désactivé automatiquement le {{date}} après des échecs répétés.", "updateFailed": "Échec de la mise à jour de l'état du webhook entrant." }, "handler": { "title": "Gestionnaire", "help": "Choisissez ce qu'Alga doit faire après que la requête est vérifiée et déduisée.", "type": "Type de gestionnaire", "types": { "directAction": "Action directe", "workflow": "Workflow" }, "directActionTitle": "Action directe", "directActionHelp": "Sélectionnez une action entrante et mappez les champs de la charge utile à ses champs cibles.", "action": "Action", "actionPlaceholder": "Sélectionnez une action", "actionEmpty": "Aucune action entrante enregistrée. Assurez-vous que le serveur a initialisé le registre d'actions avant d'enregistrer.", "targetFields": "Champs cibles", "required": "Requis", "optional": "Optionnel", "mappingPlaceholder": "Saisissez une expression JSONata, par ex. payload.field", "workflowTitle": "Workflow", "workflowHelp": "Sélectionnez un workflow à démarrer avec l'enveloppe normalisée du webhook.", "workflow": "Workflow", "workflowPlaceholder": "Sélectionnez un workflow", "workflowEmpty": "Aucun workflow visible dans ce locataire. Publiez ou affichez un workflow pour utiliser le gestionnaire de workflow.", "envelopeTitle": "Enveloppe d'entrée du workflow", "fieldTypes": { "string": "chaîne", "int": "entier", "number": "nombre", "boolean": "booléen", "enum": "énumération", "json": "json", "ref": "référence" } }, "sample": { "title": "Charge utile exemple", "help": "Capturez la prochaine requête vérifiée pour l'autocomplétion du mappage.", "createFirst": "Enregistrez le webhook avant de capturer une requête exemple.", "captureButton": "Capturer la requête exemple", "captureActive": "Fenêtre de capture active jusqu'à {{expiresAt}}.", "sampleAvailable": "Charge utile exemple capturée.", "noSample": "Aucun exemple capturé pour le moment.", "captureFailed": "Échec de l'activation de la capture d'exemple." }, "sampleTree": { "title": "Chemins exemples", "help": "Cliquez sur un chemin pour l'insérer dans {{field}}.", "focusHelp": "Focalisez un champ de mappage, puis cliquez sur un chemin pour l'insérer.", "empty": "Capturez une charge utile exemple pour parcourir les champs." }, "mapping": { "modeStatic": "Valeur statique", "modeExpression": "Mapper depuis la charge utile", "unknownReference": "référence inconnue", "loading": "Chargement…", "errors": { "INVALID_INT": "La valeur \"{{value}}\" doit être un entier.", "INVALID_NUMBER": "La valeur \"{{value}}\" doit être un nombre.", "INVALID_BOOLEAN": "La valeur doit être \"true\" ou \"false\".", "INVALID_JSON": "La valeur doit être un JSON valide." } }, "deliveryLog": { "title": "Journal des livraisons", "help": "Livraisons vérifiées récentes pour ce webhook entrant.", "empty": "Aucune livraison enregistrée.", "loadFailed": "Échec du chargement des livraisons.", "pageSummary": "Page {{page}} sur {{total}}", "durationMs": "{{duration}} ms", "allStatuses": "Tous les statuts", "columns": { "received": "Reçu", "status": "Statut", "response": "Réponse", "duration": "Durée", "actions": "Actions" }, "view": "Voir", "status": { "pending": "en attente", "dispatched": "livré", "duplicate": "doublon", "failed": "échec" } }, "deliveryDetail": { "title": "Détail de la livraison", "close": "Fermer", "replay": "Rejouer", "replayConfirm": "Renvoyer cette livraison via la configuration actuelle du webhook ? Tous les effets secondaires (création de tickets, changements de statut, etc.) seront à nouveau exécutés.", "replayFailed": "Échec du rejeu de la livraison.", "received": "Reçu", "status": "Statut", "responseStatus": "Statut de la réponse", "duration": "Durée", "sections": { "headers": "En-têtes de la requête", "requestBody": "Corps de la requête", "responseBody": "Corps de la réponse", "handlerOutcome": "Résultat du gestionnaire" } }, "test": { "openButton": "Envoyer un test", "title": "Envoyer une requête de test", "body": "Corps JSON de la requête", "headers": "En-têtes", "cancel": "Annuler", "send": "Envoyer le test", "sendFailed": "Échec de l'envoi de la requête de test du webhook." } }, "stats": { "total": "Total des webhooks", "active": "Actifs", "autoDisabled": "Désactivés automatiquement" }, "secret": { "label": "Clé de signature", "warning": "Cette valeur n'est affichée qu'une seule fois. Enregistrez-la dans le récepteur avant de quitter la page.", "copy": "Copier", "copied": "Secret de signature copié dans le presse-papiers", "copyFailed": "Échec de la copie du secret de signature dans le presse-papiers", "close": "Fermer", "download": "Télécharger en .txt" }, "form": { "createTitle": "Créer un webhook", "editTitle": "Modifier le webhook", "helper": "La configuration des nouvelles tentatives est stockée au format JSON ; la cadence de livraison utilise toujours le calendrier de backoff standard de la plateforme en v1.", "name": "Nom", "namePlaceholder": "Flux d'attribution des tickets", "url": "URL", "urlPlaceholder": "https://example.com/hooks/alga", "events": "Événements", "customHeaders": "En-têtes personnalisés", "customHeadersPlaceholder": "Authorization: Bearer abc123\nX-Source: alga-psa", "ticketFilter": "Filtre de tickets", "ticketFilterPlaceholder": "Un UUID de ticket par ligne. Laissez vide pour recevoir tous les événements de ticket correspondants.", "retryConfig": "Configuration des nouvelles tentatives (JSON)", "verifySsl": "Vérifier les certificats SSL", "webhookActive": "Le webhook est actif", "save": "Enregistrer les modifications", "saving": "Enregistrement…", "create": "Créer le webhook", "clear": "Effacer", "delete": "Supprimer", "payloadFields": "Champs envoyés", "payloadFieldsHelp": "Tous les champs sont envoyés par défaut. Décochez pour exclure un champ de la livraison. La clé de corrélation de l’entité (p. ex. ticket_id) est toujours incluse.", "payloadFieldsSelectAll": "Tout sélectionner", "payloadFieldsClear": "Effacer" }, "list": { "title": "Webhooks configurés", "loading": "Chargement…", "configuredCount": "{{count}} configurés", "empty": "Aucun webhook configuré pour le moment.", "columns": { "name": "Nom", "status": "Statut", "lastDelivery": "Dernière livraison", "success": "Réussite", "actions": "Actions" }, "actions": { "selected": "Sélectionné", "manage": "Gérer", "pause": "Suspendre", "resume": "Reprendre", "view": "Voir", "edit": "Modifier" } }, "detail": { "summary": "{{total}} livraisons, {{successful}} réussies, {{failed}} échouées.", "sendTest": "Envoyer un test", "sending": "Envoi…", "rotateSecret": "Faire tourner la clé", "rotating": "Rotation…", "back": "Retour aux webhooks" }, "deliveries": { "title": "Historique des livraisons", "page": "Page {{page}} sur {{total}}", "empty": "Aucune livraison enregistrée pour le moment.", "columns": { "event": "Événement", "status": "Statut", "attempted": "Tenté", "response": "Réponse", "action": "Action" }, "testBadge": "Livraison de test", "attempt": "Tentative {{number}}", "noResponseCode": "s.o.", "noResponseBody": "Aucun corps de réponse capturé.", "retry": "Réessayer", "previous": "Précédent", "next": "Suivant" }, "messages": { "loadFailed": "Impossible de charger les paramètres du webhook.", "loadDeliveriesFailed": "Impossible de charger les livraisons du webhook.", "saveFailed": "Impossible d'enregistrer le webhook.", "createSuccess": "Webhook créé.", "updateSuccess": "Webhook mis à jour.", "deleteConfirm": "Supprimer le webhook \"{{name}}\" ?", "deleteSuccess": "Webhook supprimé.", "deleteFailed": "Impossible de supprimer le webhook.", "testSuccess": "Test envoyé avec succès ({{statusCode}}).", "testFailed": "Échec du test : {{message}}", "testRunFailed": "Impossible d'envoyer le test de webhook.", "unknownError": "Erreur inconnue", "secretRotated": "Clé de signature renouvelée.", "rotateFailed": "Impossible de faire tourner la clé du webhook.", "resumed": "Webhook repris.", "paused": "Webhook suspendu.", "stateChangeFailed": "Impossible de mettre à jour l'état du webhook.", "retryQueued": "Nouvelle tentative en file d'attente pour l'événement {{eventId}}.", "retryFailed": "Impossible de réessayer la livraison.", "invalidHeaderLine": "Ligne d'en-tête non valide : \"{{line}}\"", "invalidRetryConfig": "La configuration des nouvelles tentatives doit être un objet JSON" }, "common": { "never": "Jamais" }, "health": { "healthy": "sain", "failing": "en échec", "disabled": "désactivé" }, "deliveryStatus": { "delivered": "livré", "retrying": "nouvelle tentative", "abandoned": "abandonné", "pending": "en attente" } }, "apiKeys": { "rateLimit": { "columnTitle": "Limite de débit", "loading": "Chargement…", "summary": "{{maxTokens}} en rafale / {{refillPerMin}} par min", "source": "Source : {{label}}", "sourceLabels": { "key": "Remplacement", "tenant": "Valeur par défaut du tenant", "default": "Valeur par défaut du système" }, "remaining": " • Restant : {{remaining}}/{{maxTokens}}", "remainingUnavailable": " • Restant : indisponible", "actions": { "edit": "Modifier", "override": "Remplacer", "save": "Enregistrer", "cancel": "Annuler", "reset": "Réinitialiser" }, "errors": { "saveFailed": "Impossible d'enregistrer le remplacement de la limite de débit de l'API.", "clearFailed": "Impossible de supprimer le remplacement de la limite de débit de l'API." } }, "generate": { "title": "Générer une clé API", "description": "Description", "descriptionPlaceholder": "p. ex. Clé API de développement", "expiration": "Date d'expiration (facultatif)", "submit": "Générer une nouvelle clé API" }, "list": { "title": "Vos clés API", "searchPlaceholder": "Rechercher par description", "filters": { "allStatuses": "Tous les statuts", "active": "Active", "inactive": "Inactive", "lastUsedAfter": "Dernière utilisation après", "expiresBefore": "Expire avant", "reset": "Réinitialiser" }, "columns": { "description": "Description", "created": "Créée", "lastUsed": "Dernière utilisation", "expires": "Expiration", "status": "Statut", "actions": "Actions" }, "never": "Jamais", "status": { "active": "Active", "inactive": "Inactive" }, "deactivate": "Désactiver" }, "newKeyDialog": { "title": "Clé API générée", "warning": "Veuillez copier votre clé API maintenant. Pour des raisons de sécurité, elle ne sera plus affichée.", "copy": "Copier dans le presse-papiers", "download": "Télécharger en .txt", "copySuccess": "Clé API copiée dans le presse-papiers !", "copyFailed": "Échec de la copie de la clé API dans le presse-papiers", "downloadFailed": "Échec du téléchargement de la clé API" } } }, "platformUpdates": { "detail": { "back": "Retour", "labels": { "info": "Info", "warning": "Avertissement", "destructive": "Critique", "success": "Succès", "default": "Avis" } } }, "connectSso": { "verify": { "title": "Sécurisez votre compte avec le SSO", "description": "Liez Azure AD ou Google Workspace pour réutiliser les politiques de l'organisation et éviter les invites d'authentification à deux facteurs locales.", "signedInAs": "Connecté en tant que", "currentPassword": "Mot de passe actuel", "twoFactorCode": "Code d'authentification à deux facteurs", "twoFactorPlaceholder": "123456", "verifyCredentials": "Vérifier les identifiants", "verifying": "Vérification...", "reset": "Réinitialiser", "linkedSuccess": "Fournisseur lié avec succès.", "credentialsVerified": "Identifiants vérifiés. Choisissez un fournisseur ci-dessous pour finaliser la liaison de votre compte.", "verifyFailed": "Impossible de vérifier les identifiants.", "verifyBeforeProvider": "Vérifiez votre mot de passe (et le code d'authentification à deux facteurs si requis) avant de connecter un fournisseur." }, "providers": { "title": "Connecter un fournisseur", "description": "Choisissez un fournisseur pour finaliser la liaison SSO. Vous serez redirigé vers le flux de connexion du fournisseur.", "noneConfigured": "Aucun fournisseur SSO n'est configuré pour cet environnement. Demandez à votre administrateur de configurer les identifiants Google ou Microsoft.", "notConfigured": "Non configuré", "branding": { "google": "Continuer avec Google", "microsoft": "Continuer avec Microsoft", "default": "Continuer" } }, "linked": { "title": "Comptes liés", "description": "Nous actualiserons la liaison la prochaine fois que vous vous connecterez via un fournisseur connecté.", "empty": "Aucun fournisseur SSO lié pour le moment. Suivez les étapes ci-dessus pour en connecter un.", "linkedAt": "Lié le {{date}}", "lastUsed": "Dernière utilisation le {{date}}", "notUsedYet": "Pas encore utilisé" } } }