{ "integrations": { "accounting": { "dialog": { "cancel": "Annuler", "enterPlaceholder": "Saisir {{field}}...", "errors": { "enterExternal": "Veuillez saisir {{field}}.", "invalidJson": "Format JSON non valide pour les métadonnées.", "saveFailed": "Échec de l'enregistrement du mappage.", "selectAlga": "Veuillez sélectionner {{field}}.", "selectExternal": "Veuillez sélectionner {{field}}." }, "manualEntryHelp": "Saisissez l'identifiant exactement tel qu'il apparaît dans votre système comptable.", "metadataLabel": "Métadonnées (JSON)", "metadataPlaceholder": "Métadonnées optionnelles au format JSON", "realmIdLabel": "ID du Realm", "saveMapping": "Enregistrer le mappage", "saving": "Enregistrement…", "selectPlaceholder": "Sélectionner {{field}}..." }, "manager": { "noModules": "Aucun module de mappage n'est configuré." }, "moduleView": { "actionsColumn": "Actions", "delete": "Supprimer", "edit": "Modifier", "errors": { "deleteFailed": "Échec de la suppression du mappage.", "loadFailed": "Échec du chargement des mappages." }, "loading": "Chargement des mappages…", "noMappings": "Aucun mappage trouvé.", "notAvailable": "N/D", "openMenu": "Ouvrir le menu" }, "setup": { "activeConfiguration": "Configuration active", "badges": { "enterprise": "Enterprise" }, "comingSoon": "Bientôt disponible", "configure": "Configurer l'intégration", "highlightValues": { "csv": "CSV", "instant": "Instantané", "live": "Live", "manual": "Manuel", "twoWay": "Bidirectionnel" }, "highlights": { "delivery": "Livraison", "export": "Export", "format": "Format", "sync": "Synchronisation" }, "options": { "qbo": { "description": "Connectez votre realm pour synchroniser les factures et gérer les mappages." }, "qboCsv": { "description": "Exportez les factures au format CSV pour un import manuel dans QuickBooks et importez les données fiscales depuis les rapports." }, "xero": { "description": "Connectez votre organisation avec des identifiants OAuth propres au tenant pour des exports comptables en direct et des mappages." }, "xeroCsv": { "description": "Exportez les factures au format CSV pour un import manuel dans Xero et importez les données fiscales depuis les rapports Xero." } }, "selected": "{{title}} sélectionné", "unavailable": { "description": "Cette intégration n'est pas encore disponible. Sélectionnez QuickBooks CSV ou Xero CSV pour configurer des exports manuels.", "title": "Configuration indisponible" } }, "modules": { "tabs": { "clients": "Clients", "itemsServices": "Articles / Services", "taxCodes": "Codes fiscaux", "paymentTerms": "Conditions de paiement" } } }, "calendar": { "enterprise": { "loading": "Chargement des paramètres du calendrier..." } }, "csv": { "export": { "actions": { "exportCsv": "Exporter en CSV", "generating": "Génération..." }, "description": "Exporter les factures au format CSV pour un import manuel dans QuickBooks.", "errors": { "configureMissingMappings": "Configurez les mappages manquants ci-dessus, puis relancez l'export.", "failed": "Échec de l'export", "missingItemMapping": "Mappage d'article manquant", "missingItemMappingId": "Mappage d'article manquant ({{serviceId}})", "missingItemMappingNamed": "Mappage d'article manquant : {{serviceName}}" }, "fields": { "dateRange": "Plage de dates (optionnelle)", "invoiceStatuses": "Statuts de facture" }, "lockReset": { "actions": { "reset": "Réinitialiser le verrou d'export" }, "description": "Effacer les verrous d'export pour permettre de réexporter les factures via CSV.", "dialog": { "cancel": "Annuler", "confirm": "Réinitialiser le verrou", "confirmBatch": "Cela permettra à Alga PSA de réexporter les factures du lot {{batchId}}. Si certaines de ces factures existent encore dans QuickBooks, l'import du CSV peut créer des doublons.", "confirmInvoice": "Cela permettra à Alga PSA de réexporter la facture {{invoiceNumber}}. Si cette facture existe encore dans QuickBooks, l'import du CSV peut créer des doublons.", "resetting": "Réinitialisation…", "title": "Réinitialiser le verrou d'export ?", "warning": "Ne poursuivez que si vous êtes certain que la facture n'a pas été importée ou si vous l'avez supprimée/annulée dans QuickBooks." }, "errors": { "unable": "Impossible de réinitialiser le verrou d'export" }, "fields": { "batchId": "ID du lot d'export", "batchIdPlaceholder": "p. ex. e793a514-34bd-4d7b-b266-9bb15f7087c4", "invoiceNumber": "Numéro de facture", "invoiceNumberPlaceholder": "p. ex. INV-1001" }, "modes": { "ariaLabel": "Mode de réinitialisation du verrou d'export", "batch": "Lot", "invoice": "Facture" }, "success": { "batchCleared": "Les verrous d'export de ce lot ont été effacés. Vous pouvez réexporter ces factures.", "invoiceCleared": "Verrou d'export effacé. Vous pouvez réexporter cette facture.", "noBatchLocks": "Aucun verrou d'export trouvé pour ce lot.", "noInvoiceLock": "Aucun verrou d'export trouvé pour cette facture." }, "title": "Réexporter une facture", "warnings": { "duplicates": "Cela peut provoquer des doublons dans QuickBooks si la facture y existe encore." } }, "success": { "one": "{{count}} facture exportée vers {{filename}}", "other": "{{count}} factures exportées vers {{filename}}" }, "title": "Export CSV pour QuickBooks" }, "preview": { "duplicates": { "description": "Les factures suivantes apparaissent plusieurs fois. Leurs montants de taxe seront additionnés :", "title": "Factures dupliquées ({{count}})" }, "errors": { "more": "... et {{count}} erreurs supplémentaires", "title": "Erreurs ({{count}})" }, "importResults": "Résultats de l'import", "importSummary": { "difference": "Écart :", "failedUpdates": "Mises à jour échouées :", "importedTax": "Taxe importée :", "originalTax": "Taxe d'origine :", "successfulUpdates": "Mises à jour réussies :", "title": "Résumé de l'import" }, "rowLabel": "Ligne {{row}} :", "stats": { "matchedInvoices": "Factures rapprochées", "totalRows": "Lignes totales", "uniqueInvoices": "Factures uniques", "validRows": "Lignes valides" }, "status": { "databaseMatch": "Correspondance en base", "rowData": "Données de ligne", "structure": "Structure" }, "validationPassed": { "one": "Validation réussie. Prêt à importer les données fiscales pour {{count}} facture.", "other": "Validation réussie. Prêt à importer les données fiscales pour {{count}} factures." }, "validationResults": "Résultats de la validation", "warnings": { "more": "... et {{count}} avertissements supplémentaires", "title": "Avertissements ({{count}})" } }, "settings": { "exports": { "description": "Créer des lots d'export, télécharger des fichiers CSV, importer des rapports fiscaux et consulter l'historique des exports.", "managedTitle": "Géré depuis Facturation", "openButton": "Ouvrir les exports comptables", "path": "Facturation → Exports comptables", "title": "Exports comptables" }, "qbo": { "bullets": { "exportLabel": "Export", "exportText": "Générer des fichiers CSV compatibles avec la fonction d'import de factures de QuickBooks", "taxImportLabel": "Import de taxes", "taxImportText": "En cas d'utilisation d'un calcul fiscal externe, importer les montants de taxe depuis les rapports fiscaux QuickBooks" }, "description": "Exporter les factures au format CSV pour un import manuel dans QuickBooks et importer les données fiscales depuis les rapports QuickBooks.", "exports": { "managedPrefix": "Allez dans", "managedSuffix": "pour sélectionner des factures, générer des exports CSV QuickBooks, importer des rapports fiscaux et gérer les lots." }, "intro": "Cette intégration offre une alternative à la connectivité QuickBooks basée sur OAuth :", "mappings": { "description": "Mappez les clients, services, codes fiscaux et conditions de paiement Alga aux identifiants utilisés dans votre société QuickBooks. Ces valeurs sont utilisées lors de la génération de l'export CSV.", "title": "Mappages CSV QuickBooks" }, "note": "Remarque : configurez les mappages ci-dessous avant d'exporter. Les exports CSV et les imports de taxes sont gérés depuis Facturation → Exports comptables.", "title": "Intégration CSV QuickBooks" } }, "taxImport": { "actions": { "importTaxData": "Importer les données fiscales", "importing": "Import en cours...", "validate": "Valider", "validating": "Validation en cours..." }, "errors": { "importFailed": "Échec de l'import", "readFile": "Échec de la lecture du fichier", "selectFile": "Veuillez sélectionner un fichier CSV", "selectFileAndRange": "Veuillez sélectionner un fichier et une plage de dates", "templateDownloadFailed": "Échec du téléchargement du modèle", "validationFailed": "Échec de la validation" }, "fields": { "csvFile": "Fichier CSV", "dateRangeHelp": "Seules les factures dans cette plage de dates seront traitées.", "dateRangeRequired": "Plage de dates (requise)", "dropZone": "Glissez-déposez un fichier CSV ici, ou cliquez pour parcourir", "fileSize": "({{size}} Ko)" }, "preview": { "alreadyImported": "{{count}} facture(s) disposent déjà de taxes importées.", "alreadyImportedSkip": "{{count}} facture(s) disposent déjà de taxes importées et seront ignorées.", "badges": { "databaseMatch": "Correspondance en base", "rowData": "Données de ligne", "structure": "Structure" }, "columns": { "algaInvoice": "Facture Alga", "contact": "Contact", "status": "Statut", "taxAmount": "Montant de taxe", "xeroInvoice": "Facture Xero" }, "errorsTitle": "Erreurs ({{count}})", "matched": "Rapproché", "matchedInvoices": "Factures rapprochées", "notPendingDescription": "Ces factures ont été créées avec un calcul fiscal interne. Pour importer des taxes depuis Xero, les factures doivent être configurées avec la source fiscale « Pending External » à l'export.", "notPendingSkip": "{{count}} facture(s) n'ont pas de taxe externe en attente et seront ignorées.", "notPendingTitle": "{{count}} facture(s) n'utilisent pas de calcul fiscal externe.", "showingFirst20": "Affichage des 20 premières lignes sur {{count}}", "taxToImport": "Taxe à importer", "title": "Résultats de la validation", "totalRows": "Lignes totales", "uniqueInvoices": "Factures uniques", "unmatched": "Non rapproché", "validRows": "Lignes valides", "warningsTitle": "Avertissements ({{count}})" }, "qbo": { "description": "Importer les montants de taxe depuis un fichier CSV de rapport fiscal QuickBooks.", "help": { "csvRequirement": "Le CSV doit inclure les colonnes Numéro de facture, Date de facture et Montant de taxe.", "downloadTemplate": "Télécharger le modèle CSV", "steps": { "s1": "Dans QuickBooks, allez dans Reports > All Reports", "s2": "Sélectionnez Sales Tax Liability ou Transaction Detail by Account", "s3": "Définissez la plage de dates correspondant à vos factures exportées", "s4": "Cliquez sur Export et choisissez Export to Excel ou Export to CSV", "s5": "Enregistrez le fichier et téléversez-le ici" }, "title": "Comment exporter les données fiscales depuis QuickBooks" }, "success": { "one": "Taxe importée avec succès pour {{count}} facture. Total de taxe importée : ${{amount}}", "other": "Taxe importée avec succès pour {{count}} factures. Total de taxe importée : ${{amount}}" }, "title": "Importer les taxes depuis CSV QuickBooks" }, "result": { "failed": "{{count}} en échec.", "one": "Taxe importée pour {{count}} facture. Total de taxe importée : {{amount}}.", "other": "Taxe importée pour {{count}} factures. Total de taxe importée : {{amount}}.", "skipped": "{{count}} ignorée(s)." }, "unified": { "description": "Importer les montants de taxe depuis l'export CSV de votre système comptable.", "qbResult": { "one": "Taxe importée avec succès pour {{count}} facture. Total de taxe importée : {{amount}}", "other": "Taxe importée avec succès pour {{count}} factures. Total de taxe importée : {{amount}}" }, "source": { "ariaLabel": "Source d'import CSV", "quickbooks": "QuickBooks", "xero": "Xero" }, "title": "Importer les taxes depuis un CSV", "xeroCsvDescription": "Le CSV exporté contient Numéro de facture, Nom du contact, Montant de ligne, Montant de taxe et catégories de suivi.", "xeroHelp": { "note": "Remarque : seules les factures initialement exportées depuis Alga PSA (avec le suivi Source System = AlgaPSA) seront rapprochées.", "s1": "Dans Xero, allez dans Sales > Invoices", "s2": "Sélectionnez l'onglet de facture à exporter (p. ex. Paid, Awaiting Payment)", "s3": "(Optionnel) Cliquez sur Search pour filtrer par date de début, date de fin ou type de date", "s4": "Cliquez sur Export", "s5": "Xero télécharge un fichier CSV sur votre ordinateur", "s6": "Téléversez ce fichier CSV ici" }, "xeroResult": { "one": "Taxe importée pour {{count}} facture. Total : {{amount}}.", "other": "Taxe importée pour {{count}} factures. Total : {{amount}}." } }, "xero": { "description": "Importer les montants de taxe depuis un fichier CSV du rapport Xero Invoice Details.", "dropZone": "Glissez-déposez un CSV de rapport Xero Invoice Details ici, ou cliquez pour parcourir", "help": { "csvRequirement": "Le rapport doit inclure les colonnes Numéro de facture, Nom du contact, Montant de ligne et Montant de taxe. Les factures sont rapprochées via le champ Reference ou les catégories de suivi définies à l'export.", "steps": { "s1": "Dans Xero, allez dans Reports > All Reports", "s2": "Sélectionnez Sales (Invoices and Revenue)", "s3": "Exécutez le rapport Invoice Details", "s4": "Définissez la plage de dates correspondant à vos factures exportées", "s5": "Cliquez sur Export et choisissez CSV", "s6": "Téléversez le fichier exporté ici" }, "title": "Comment exporter les données fiscales depuis Xero" }, "title": "Importer les taxes depuis CSV Xero" } } }, "entra": { "settings": { "actions": { "disconnect": "Déconnecter", "reconnect": "Reconnecter", "reconnecting": "Reconnexion…", "refresh": "Actualiser", "resetFieldSync": "Réinitialiser", "reviewMappings": "Vérifier les mappages", "reviewRemap": "Vérifier / Remapper", "hideReviewRemap": "Masquer Vérifier / Remapper", "runDiscovery": "Exécuter la découverte", "runDiscoveryAgain": "Réexécuter la découverte", "runDiscoveryRunning": "Découverte en cours…", "runInitialSync": "Exécuter la synchronisation initiale", "runInitialSyncRunning": "Démarrage de la synchronisation initiale…", "saveFieldSync": "Enregistrer les contrôles de synchronisation des champs", "savingFieldSync": "Enregistrement…", "syncAll": "Synchroniser tous les tenants maintenant", "syncAllStarting": "Démarrage…" }, "badges": { "enterprise": "Enterprise", "reviewBeforeInitialSync": "Vérifier avant la synchronisation initiale" }, "connection": { "connectingSuffix": " (Connexion...)", "details": "Détails de la connexion", "directCredentialSourceLabel": "Source des identifiants :", "directTenantDefault": "common (multi-tenant)", "directTenantLabel": "Tenant Microsoft :", "cippServerLabel": "Serveur CIPP :", "notAvailable": "Non disponible", "notConfigured": "Non configuré", "notConnectedStatus": "not_connected", "optionsTitle": "Options de connexion", "promptDetails": "Connectez Entra pour remplir les détails du fournisseur." }, "currentStep": { "connect": { "guidance": "Sélectionnez une option de connexion pour continuer l'intégration.", "title": "Étape 1 : Connecter" }, "connectionsBelow": "Les options de connexion apparaissent ci-dessous.", "discover": { "guidance": "Exécutez la découverte pour charger les tenants Entra gérés avant le mappage.", "title": "Étape 2 : Découvrir" }, "label": "Étape actuelle", "map": { "guidance": "Confirmez ou ajustez les mappages de tenants pour déverrouiller la synchronisation initiale.", "title": "Étape 3 : Mapper" }, "sync": { "guidance": "Démarrez la première exécution de synchronisation pour les mappages confirmés.", "title": "Étape 4 : Synchronisation initiale" } }, "description": "Configurez l'accès Entra au niveau partenaire, découvrez les tenants gérés, mappez-les aux clients et exécutez les workflows de synchronisation.", "disabled": { "description": "L'interface d'intégration Entra est actuellement désactivée pour ce tenant.", "title": "Intégration Microsoft Entra" }, "discovery": { "completed": "Découverte terminée. {{count}} tenants découverts.", "completedOne": "Découverte terminée. {{count}} tenant découvert.", "failed": "Échec de l'exécution de la découverte de tenants." }, "errors": { "loadStatus": "Échec du chargement du statut de connexion Entra.", "unknown": "Erreur inconnue" }, "fieldSync": { "description": "Choisissez quels champs du profil Entra peuvent écraser les champs de contact locaux lors de la synchronisation.", "feedback": { "saveFailed": "Échec de l'enregistrement des contrôles de synchronisation des champs.", "saved": "Contrôles de synchronisation des champs enregistrés." }, "options": { "displayName": { "description": "Autoriser le nom d'affichage Entra à écraser le nom complet du contact sur les contacts liés.", "label": "Nom affiché" }, "email": { "description": "Autoriser l'e-mail/UPN Entra à écraser l'e-mail du contact sur les contacts liés.", "label": "E-mail" }, "phone": { "description": "Autoriser les valeurs de téléphone Entra à écraser le numéro de téléphone du contact sur les contacts liés.", "label": "Téléphone" }, "role": { "description": "Autoriser le titre du poste Entra à écraser le rôle du contact sur les contacts liés.", "label": "Rôle" }, "upn": { "description": "Autoriser l'UPN Entra à écraser le nom du principal Entra stocké sur les contacts liés.", "label": "UPN" } }, "title": "Contrôles de synchronisation des champs" }, "guidedStep": { "current": "en cours", "complete": "terminé", "locked": "verrouillé", "stepLabel": "Étape {{number}}", "thisIsCurrent": "Il s'agit de votre étape d'intégration actuelle." }, "initialSync": { "failed": "Échec du démarrage de la synchronisation initiale Entra.", "started": "Synchronisation initiale démarrée. ID d'exécution : {{runId}}", "startedNoId": "Demande de démarrage de synchronisation initiale acceptée." }, "maintenance": { "description": "La configuration initiale est terminée. Concentrez-vous ici sur les opérations de synchronisation, les vérifications de santé et les examens de maintenance.", "healthDescription": "Examinez la santé de la connexion, exécutez des opérations de maintenance et surveillez l'activité de synchronisation.", "healthTitle": "Résumé de santé", "title": "Mode opérations continues" }, "mapping": { "description": "Examinez les correspondances suggérées, choisissez le bon client pour chaque tenant et confirmez les mappages avant la synchronisation initiale.", "needsReviewLabel": "Nécessite un examen :", "savedLabel": "Enregistré :", "selectedLabel": "Sélectionné :", "skippedLabel": "Ignoré :", "stepLabel": "Étape 3", "title": "Mapper les tenants aux clients" }, "onboarding": { "description": "Complétez chaque étape d'intégration dans l'ordre : connecter, découvrir, mapper, puis exécuter votre première synchronisation.", "title": "Mode configuration" }, "ongoing": { "description": "Utilisez ces contrôles pour les opérations de synchronisation manuelle une fois les étapes d'intégration terminées.", "title": "Opérations continues" }, "overview": { "connectionLabel": "Connexion :", "connectionTypeLabel": "Type de connexion :", "label": "Vue d'ensemble", "mappedTenantsLabel": "Tenants mappés :", "nextSyncIntervalEvery": "Toutes les {{minutes}} minutes", "nextSyncIntervalLabel": "Intervalle de prochaine synchronisation :" }, "skipped": { "empty": "Aucun tenant n'est actuellement marqué comme ignoré.", "noPrimaryDomain": "Aucun domaine principal", "remap": "Remapper", "title": "Tenants ignorés" }, "status": { "connectionHealth": "Santé de la connexion", "label": "Statut" }, "syncAll": { "failed": "Échec du démarrage de la synchronisation Entra complète.", "started": "Synchronisation démarrée. ID d'exécution : {{runId}}", "startedNoId": "Demande de démarrage de synchronisation acceptée." }, "title": "Intégration Microsoft Entra", "validation": { "label": "Validation et découverte", "lastDiscoveryLabel": "Dernière découverte :", "lastValidatedLabel": "Dernière validation :", "neverFormatted": "Jamais", "noneValidationError": "Aucune", "validationErrorLabel": "Erreur de validation :" }, "wizard": { "connect": { "description": "Autorisez l'authentification partenaire Microsoft directe pour lier ce tenant Entra.", "title": "Connecter" }, "discover": { "description": "Charger et persister les tenants Entra gérés pour ce tenant MSP.", "title": "Découvrir les tenants" }, "map": { "description": "Examinez les suggestions de correspondance automatique et confirmez les mappages.", "title": "Mapper les tenants aux clients" }, "sync": { "description": "Démarrez la première exécution de synchronisation pour les mappages confirmés.", "title": "Synchronisation initiale" } } }, "tenantMapping": { "actions": { "confirmSelected": "Confirmer les mappages sélectionnés", "confirming": "Confirmation…", "import": "Importer comme nouveau client", "importing": "Importation…", "preselectExact": "Présélectionner les correspondances exactes", "refresh": "Actualiser l'aperçu", "skip": "Ignorer", "skipped": "Ignoré" }, "columns": { "actions": "Actions", "confidence": "Confiance", "entraTenant": "Tenant Entra", "primaryDomain": "Domaine principal", "selectClient": "Sélectionner un client", "status": "Statut", "suggestedClient": "Client suggéré" }, "empty": "Aucun tenant découvert disponible pour l'aperçu de mappage.", "errors": { "confirmFailed": "Échec de la confirmation des mappages sélectionnés.", "importFailed": "Échec de l'importation du tenant en tant que client.", "loadFailed": "Échec du chargement de l'aperçu de mappage des tenants.", "selectAtLeastOne": "Sélectionnez au moins un client pour confirmer un mappage.", "skipFailed": "Échec de l'ignorance de ce mappage de tenant." }, "feedback": { "confirmed": "{{count}} mappages confirmés.", "confirmedOne": "{{count}} mappage confirmé." }, "noSuggestion": "Aucune suggestion", "picker": { "placeholder": "Sélectionner un client...", "unknownClient": "Client inconnu" }, "reasons": { "exactDomain": "Domaine exact", "fuzzyName": "Nom approximatif", "secondaryDomain": "Domaine secondaire" }, "states": { "autoMatched": "Correspondance automatique", "imported": "Importé", "needsReview": "Nécessite un examen", "skipped": "Ignoré", "unmatched": "Non apparié" }, "title": "Aperçu du mappage des tenants" }, "cippDialog": { "actions": { "cancel": "Annuler", "connect": "Connecter", "connecting": "Connexion..." }, "description": "Saisissez l'URL de votre instance CIPP et un jeton API pour permettre à Alga de découvrir et de synchroniser les données Entra.", "errors": { "missingFields": "L'URL de base et le jeton API sont requis.", "unknown": "Une erreur inconnue s'est produite." }, "fields": { "apiToken": "Jeton API", "apiTokenPlaceholder": "Saisir le jeton...", "baseUrl": "URL de base CIPP", "baseUrlPlaceholder": "https://cipp.yourdomain.com" }, "title": "Connecter CIPP" }, "reconciliation": { "actions": { "refresh": "Actualiser", "resolveExisting": "Résoudre vers existant", "resolveNew": "Résoudre vers nouveau" }, "candidate": { "fallback": "candidat", "label": "Contacts candidats : {{count}}" }, "contactPicker": { "label": "Contact existant", "placeholder": "Sélectionner un contact existant..." }, "errors": { "enterContactId": "Saisissez un ID de contact pour résoudre vers un contact existant.", "loadQueue": "Échec du chargement de la file de réconciliation.", "resolveFailed": "Échec de la résolution de l'élément de file." }, "empty": "Aucune correspondance ambiguë en attente d'examen.", "loading": "Chargement de la file…", "noEmailIdentity": "Aucune identité e-mail", "queuedAt": "{{identity}} · mis en file {{time}}", "scopedToMappedClient": "Les options de contact existant sont limitées à ce client mappé.", "success": { "resolvedExisting": "Élément de file {{queueItemId}} résolu vers le contact existant {{contactNameId}}.", "resolvedNew": "Élément de file {{queueItemId}} résolu en créant le contact {{contactNameId}}." }, "title": "File de correspondances ambiguës" }, "syncHistory": { "actions": { "hideDetails": "Masquer les détails", "refresh": "Actualiser", "viewDetails": "Voir les détails" }, "details": { "noResults": "Aucun résultat de tenant enregistré.", "stats": "créés {{created}}, liés {{linked}}, mis à jour {{updated}}, ambigus {{ambiguous}}, désactivés {{inactivated}}", "tenantHeader": "Tenant {{tenant}} · {{status}}", "unknownTenant": "inconnu" }, "empty": "Aucune exécution de synchronisation trouvée pour le moment.", "errors": { "loadDetailFailed": "Échec du chargement du détail de l'exécution.", "loadFailed": "Échec du chargement de l'historique de synchronisation.", "loadRunFailed": "Échec du chargement de l'exécution {{runId}}." }, "loading": "Chargement de l'historique de synchronisation…", "run": { "header": "{{runType}} · {{status}}", "inProgress": "En cours", "tenants": "Tenants : {{processed}}/{{total}} · Succès : {{success}} · Échecs : {{failed}}", "timing": "Démarré {{started}} · Terminé {{completed}}" }, "title": "Exécutions de synchronisation récentes" } }, "google": { "settings": { "actions": { "refresh": "Actualiser", "resetProviders": "Réinitialiser les fournisseurs Google", "resetting": "Réinitialisation…", "save": "Enregistrer", "saving": "Enregistrement…" }, "afterSaveNotice": "Après l'enregistrement, rendez-vous dans les intégrations E-mail entrant et Calendrier et ré-autorisez les fournisseurs. Les fournisseurs Google existants ne sont pas migrés.", "consoleLink": "Google Cloud Console", "description": "Configurez les identifiants Google Cloud propres au tenant pour Gmail (e-mail entrant) et Google Calendar.", "errors": { "loadFailed": "Échec du chargement des paramètres Google", "resetFailed": "Échec de la réinitialisation des fournisseurs Google", "saveFailed": "Échec de l'enregistrement des paramètres Google" }, "fields": { "projectIdHelp": "Utilisé pour le provisionnement Pub/Sub de Gmail (compte de service propre au tenant).", "projectIdLabel": "ID du projet Google Cloud", "projectIdPlaceholder": "my-project-id" }, "loading": "Chargement…", "oauth": { "calendarClientId": "Calendar OAuth Client ID", "calendarClientSecret": "Calendar OAuth Client Secret", "enterSecret": "Saisir le client secret", "gmailClientId": "Gmail OAuth Client ID", "gmailClientSecret": "Gmail OAuth Client Secret", "sectionTitle": "Application OAuth", "shareApp": "Utiliser la même application OAuth pour Gmail et Calendar", "shareAppHelp": "Recommandé. Vous pouvez toujours autoriser des comptes Google distincts par intégration.", "storedSecret": "Secret enregistré : {{secret}}" }, "redirectUrisLabel": "Redirect URIs (à copier dans le client OAuth Google)", "scopes": "Scopes", "scopesCalendar": "Calendar : {{scopes}}", "scopesGmail": "Gmail : {{scopes}}", "serviceAccount": { "alreadyStored": "Une clé de compte de service est déjà enregistrée (non affichée).", "description": "Collez le JSON de la clé du compte de service propre au tenant utilisé pour provisionner Pub/Sub.", "title": "Compte de service Pub/Sub (requis pour Gmail)" }, "setupGuide": "Guide de configuration", "title": "Google", "toasts": { "resetDescription": "Tous les fournisseurs Google sont désormais déconnectés et nécessitent une nouvelle autorisation.", "resetFailedTitle": "Échec de la réinitialisation", "resetTitle": "Fournisseurs Google réinitialisés", "saveFailedTitle": "Impossible d'enregistrer les paramètres Google", "savedDescription": "La configuration Google du tenant a été mise à jour avec succès.", "savedTitle": "Paramètres Google enregistrés", "unknownError": "Erreur inconnue" } } }, "hudu": { "clientTab": { "source": "Source : Hudu", "openInHudu": "Ouvrir dans Hudu", "refresh": "Actualiser", "loading": "Chargement des données Hudu...", "notConnected": "Hudu n'est pas connecté. Un administrateur peut le connecter dans Paramètres → Intégrations.", "unmapped": "Ce client n'est pas encore mappé à une entreprise Hudu. Mappez-le dans Paramètres → Intégrations → Hudu.", "unreachable": "Impossible de joindre Hudu. Réessayez plus tard.", "assetsTitle": "Actifs", "assetsEmpty": "Aucun actif Hudu pour cette entreprise.", "articlesTitle": "Articles", "articlesEmpty": "Aucun article Hudu pour cette entreprise.", "serial": "Numéro de série", "folder": "Dossier" }, "passwordsTab": { "source": "Source : Hudu", "openInHudu": "Ouvrir dans Hudu", "refresh": "Actualiser", "loading": "Chargement des mots de passe Hudu...", "notConnected": "Hudu n'est pas connecté. Un administrateur peut le connecter dans Paramètres → Intégrations.", "unmapped": "Ce client n'est pas encore mappé à une entreprise Hudu. Mappez-le dans Paramètres → Intégrations → Hudu.", "unreachable": "Impossible de joindre Hudu. Réessayez plus tard.", "noPasswordAccess": "L'accès aux mots de passe n'est pas activé pour la clé API Hudu, les mots de passe ne peuvent donc pas être listés. Générez une clé avec accès aux mots de passe dans l'administration Hudu.", "title": "Mots de passe", "empty": "Aucun mot de passe Hudu pour cette entreprise.", "reveal": "Afficher", "hide": "Masquer", "copy": "Copier", "revealNoAccess": "L'accès aux mots de passe n'est pas activé pour la clé API Hudu.", "revealNotFound": "Ce mot de passe est introuvable dans Hudu.", "revealFailed": "Le mot de passe n'a pas pu être affiché. Réessayez plus tard." }, "assets": { "title": "Actifs", "description": "Mappez les actifs Hudu aux actifs AlgaPSA, importez les actifs sans correspondance et récupérez les mises à jour depuis Hudu.", "loading": "Chargement des mappages d'actifs...", "empty": "Aucun actif Hudu pour cette entreprise.", "selectAsset": "Sélectionner un actif", "serial": "Numéro de série", "archivedLabel": "Archivé", "excludedHint": "Non importé (modèle exclu)", "buttons": { "importAll": "Importer tous les actifs sans correspondance", "importingAll": "Importation...", "sync": "Synchroniser depuis Hudu", "syncing": "Synchronisation...", "import": "Importer", "importing": "Importation...", "save": "Enregistrer les mappages", "saving": "Enregistrement...", "discard": "Abandonner" }, "counters": { "mapped": "mappés", "suggested": "suggérés", "unmapped": "non mappés", "total": "total" }, "table": { "huduAsset": "Actif Hudu", "algaAsset": "Actif AlgaPSA", "status": "Statut", "actions": "Actions" }, "status": { "mapped": "Mappé", "suggested": "Suggéré", "unmapped": "Non mappé", "pending": "En attente", "stale": "Obsolète" }, "suggestion": { "label": "Suggestion", "source": { "serial": "Correspondance de numéro de série", "exactName": "Nom exact", "fuzzyName": "Nom similaire" } }, "rowActions": { "unmap": "Supprimer le mappage", "revert": "Annuler la modification", "dismiss": "Ignorer la suggestion" }, "pendingSummary": "Modifications non enregistrées : {{total}}", "sync": { "summary": "Synchronisation terminée : {{updated}} mis à jour · {{unchanged}} inchangés · {{stale}} obsolètes.", "rmmSkipped": "{{rmmSkipped}} gérés par RMM ignorés.", "lastSynced": "Dernière synchronisation : {{timestamp}}" }, "import": { "summary": "Importation terminée : {{created}} créés · {{skipped}} ignorés · {{failed}} en échec." }, "success": { "saved": "Mappages d'actifs enregistrés : {{total}}", "imported": "« {{name}} » importé depuis Hudu." }, "errors": { "load": "Échec du chargement des mappages d'actifs Hudu.", "save": "Échec de la mise à jour du mappage de l'actif.", "import": "Échec de l'importation de l'actif Hudu.", "importAll": "Échec de l'importation en masse.", "serialConflict": "Le numéro de série est déjà utilisé par « {{name}} ».", "sync": "Échec de la synchronisation depuis Hudu.", "rateLimited": "Limite de requêtes Hudu atteinte. Réessayez plus tard.", "unmapped": "Ce client n'est pas mappé à une entreprise Hudu.", "assetAlreadyMapped": "Cet actif est déjà mappé à un autre actif Hudu. Supprimez d'abord le mappage existant.", "huduAssetAlreadyMapped": "Cet actif Hudu est déjà mappé à un actif. Supprimez d'abord le mappage existant.", "mappingConflict": "Ce mappage est en conflit avec un mappage existant. Actualisez et réessayez.", "notFound": "Mappage introuvable. Actualisez et réessayez." }, "toasts": { "errorTitle": "Erreur de mappage d'actif Hudu" } }, "documents": { "sectionTitle": "Documentation Hudu", "loading": "Chargement des articles Hudu...", "empty": "Aucun article Hudu", "unreachable": "Impossible de joindre Hudu. Réessayez plus tard." }, "documentsTab": { "title": "Articles Hudu", "source": "Source : Hudu", "searchPlaceholder": "Rechercher des articles Hudu...", "loading": "Chargement des articles Hudu...", "empty": "Aucun article Hudu trouvé.", "notConnected": "Hudu n'est pas connecté. Un administrateur peut le connecter dans Paramètres → Intégrations.", "unreachable": "Impossible de joindre Hudu. Réessayez plus tard.", "articleColumn": "Article", "clientColumn": "Client", "companyColumn": "Entreprise Hudu", "updatedColumn": "Mis à jour", "unmapped": "Non mappé", "previous": "Précédent", "next": "Suivant", "pageLabel": "Page" }, "mapping": { "title": "Mappages d'entreprises", "description": "Mappez les entreprises Hudu aux clients AlgaPSA pour afficher leur documentation.", "loading": "Chargement des mappages d'entreprises...", "companyId": "ID", "idInIntegration": "ID PSA", "selectClient": "Sélectionner un client", "buttons": { "refresh": "Actualiser les entreprises", "refreshing": "Actualisation...", "save": "Enregistrer les mappages", "saving": "Enregistrement...", "discard": "Abandonner" }, "counters": { "mapped": "mappées", "suggested": "suggérées", "unmapped": "non mappées", "total": "total" }, "table": { "huduCompany": "Entreprise Hudu", "algaClient": "Client AlgaPSA", "status": "Statut" }, "status": { "mapped": "Mappée", "suggested": "Suggérée", "unmapped": "Non mappée", "pending": "En attente" }, "suggestion": { "label": "Suggestion", "source": { "integrationId": "ID d'intégration PSA", "exactName": "Nom exact", "fuzzyName": "Nom similaire" } }, "empty": { "title": "Aucune entreprise Hudu chargée pour le moment.", "hint": "Cliquez sur « Actualiser les entreprises » pour récupérer les entreprises depuis Hudu." }, "unmappedHint": "La documentation n'est affichée que pour les clients mappés. Mappez chaque entreprise Hudu à un client AlgaPSA pour l'activer.", "success": { "refreshed": "Entreprises Hudu actualisées.", "saved": "Mappages enregistrés : {{total}}" }, "errors": { "load": "Échec du chargement des mappages d'entreprises Hudu.", "refresh": "Échec de l'actualisation des entreprises Hudu.", "save": "Échec de la mise à jour du mappage.", "clientAlreadyMapped": "Ce client est déjà mappé à une autre entreprise Hudu. Supprimez d'abord le mappage existant.", "companyAlreadyMapped": "Cette entreprise Hudu est déjà mappée à un autre client. Supprimez d'abord le mappage existant.", "mappingConflict": "Ce mappage est en conflit avec un mappage existant. Actualisez et réessayez.", "notFound": "Mappage introuvable. Actualisez et réessayez." }, "toasts": { "errorTitle": "Erreur de mappage Hudu" }, "pendingSummary": "Modifications non enregistrées : {{total}}", "rowActions": { "unmap": "Supprimer le mappage", "revert": "Annuler la modification", "dismiss": "Ignorer la suggestion" } }, "layoutMap": { "title": "Modèles d'actifs", "description": "Choisissez le type d'actif AlgaPSA sous lequel chaque modèle d'actif Hudu est importé. Les modèles non configurés sont importés comme Inconnu.", "loading": "Chargement des modèles d'actifs...", "empty": "Aucun modèle d'actif trouvé dans Hudu.", "suggested": "Suggestion", "table": { "huduLayout": "Modèle Hudu", "algaAssetType": "Type d'actif AlgaPSA" }, "types": { "workstation": "Poste de travail", "networkDevice": "Périphérique réseau", "server": "Serveur", "mobileDevice": "Appareil mobile", "printer": "Imprimante", "unknown": "Inconnu" }, "excludeOption": "Ne pas importer", "buttons": { "save": "Enregistrer le mappage des modèles", "saving": "Enregistrement..." }, "success": { "saved": "Mappage des modèles d'actifs enregistré." }, "errors": { "load": "Échec du chargement des modèles d'actifs Hudu.", "save": "Échec de l'enregistrement du mappage des modèles d'actifs." }, "createType": { "button": "Créer un type à partir du modèle", "creating": "Création...", "success": "Type d'actif créé et affecté à ce modèle.", "errors": { "create": "Échec de la création d'un type d'actif à partir de ce modèle.", "slugConflict": "Un type d'actif portant ce nom existe déjà. Sélectionnez-le plutôt dans la liste." } } }, "settings": { "title": "Hudu", "description": "Connectez votre instance Hudu pour afficher la documentation et les identifiants des clients dans AlgaPSA.", "loading": "Chargement du statut de connexion Hudu...", "detectedInstance": "Instance Hudu", "status": { "connected": "Connecté", "notConnected": "Non connecté", "error": "Erreur" }, "passwordAccess": { "enabled": "Accès aux mots de passe activé", "disabled": "Accès aux mots de passe non activé pour cette clé" }, "fields": { "baseUrl": { "label": "URL de base", "placeholder": "https://votre-instance.huducloud.com" }, "apiKey": { "label": "Clé API", "placeholder": "Saisissez votre clé API Hudu", "keepExisting": "Laissez vide pour conserver la clé API actuelle", "writeOnlyHint": "La clé API enregistrée n'est jamais affichée. Laissez ce champ vide pour continuer à l'utiliser." } }, "buttons": { "test": "Tester la connexion", "testing": "Test en cours...", "connect": "Connecter", "connecting": "Connexion...", "disconnect": "Déconnecter", "disconnecting": "Déconnexion..." }, "success": { "connected": "Connecté à Hudu.", "testPassedWithPasswords": "Test de connexion Hudu réussi. L'accès aux mots de passe est activé pour cette clé.", "testPassedNoPasswords": "Test de connexion Hudu réussi. L'accès aux mots de passe n'est pas activé pour cette clé.", "disconnected": "Connexion Hudu déconnectée." }, "errors": { "loadStatus": "Échec du chargement du statut de connexion Hudu.", "baseUrlRequired": "L'URL de base est requise.", "baseUrlFormat": "Saisissez une URL valide, p. ex. https://votre-instance.huducloud.com", "invalidBaseUrl": "Aucune API Hudu n'a été trouvée à cette URL de base (404). Vérifiez l'URL de base.", "unreachable": "Impossible de joindre Hudu à cette URL de base. Vérifiez l'URL et votre réseau.", "invalidKey": "Hudu a rejeté la clé API (401). Saisissez une clé API valide.", "testFailed": "Échec du test de connexion Hudu.", "connectFailed": "Échec de la connexion à Hudu.", "disconnectFailed": "Échec de la déconnexion de Hudu." }, "toasts": { "errorTitle": "Erreur de connexion Hudu" } } }, "microsoft": { "settings": { "actions": { "entraLink": "Microsoft Entra", "newProfile": "Nouveau profil", "openTeamsSetup": "Ouvrir la configuration Teams", "refresh": "Actualiser", "resetProviders": "Réinitialiser les fournisseurs Microsoft", "resetting": "Réinitialisation…" }, "archiveDialog": { "archiving": "Archivage…", "cancel": "Conserver le profil", "confirm": "Archiver le profil", "message": "Archiver {{name}} ? Les références historiques existantes restent intactes, mais le profil ne sera plus disponible pour les nouvelles liaisons.", "title": "Archiver le profil Microsoft ?" }, "binding": { "bound": "Lié", "boundProfileLabel": "Profil lié", "createFirst": "Créez d'abord un profil", "needsAttention": "Nécessite une attention", "saving": "Enregistrement…", "selectProfile": "Sélectionner un profil", "unbound": "Non lié" }, "bindings": { "summaryBound": "{{consumer}} est lié à {{profile}}.", "summaryNone": "Aucun profil Microsoft n'est actuellement lié à {{consumer}}.", "summaryUnavailable": "{{consumer}} est lié à un profil indisponible.", "warningArchived": "{{consumer}} est toujours lié à un profil archivé. Relisez-le à un profil actif.", "warningNoBinding": "Aucune liaison {{consumer}} n'est encore configurée.", "warningNotReady": "{{consumer}} est lié à {{profile}}, mais ce profil nécessite encore une configuration.", "warningProfileMissing": "{{consumer}} est lié à un profil qui n'est plus disponible. Relisez-le à un profil actif." }, "bindingsAlertCe": "Les liaisons explicites font foi pour la sélection du profil MSP SSO. Configurez les domaines de connexion séparément après avoir choisi le profil lié.", "bindingsAlertEe": "Les liaisons explicites font foi pour la sélection des profils MSP SSO, e-mail, calendrier et Teams.", "consumerBindings": { "descriptionCe": "Liez un profil Microsoft à MSP SSO pour la connexion et l'utilisation du domaine de connexion.", "descriptionEe": "Liez un profil Microsoft par consommateur pris en charge. La réaffectation d'un consommateur ne modifie pas les autres.", "title": "Liaisons de consommateur explicites" }, "consumers": { "calendar": { "description": "Choisissez quel profil Microsoft la synchronisation du calendrier Outlook doit utiliser.", "label": "Calendrier", "reconnect": "Les connexions calendrier Microsoft existantes peuvent nécessiter une nouvelle autorisation après le changement de profil lié." }, "email": { "description": "Choisissez quel profil Microsoft l'e-mail entrant Outlook doit utiliser.", "label": "E-mail", "reconnect": "Les connexions e-mail Outlook existantes peuvent nécessiter une nouvelle autorisation après le changement de profil lié." }, "mspSso": { "description": "Choisissez quel profil Microsoft sous-tend les domaines de connexion MSP SSO, la connexion Microsoft et la découverte de tenant.", "label": "MSP SSO" }, "teams": { "description": "Choisissez quel profil Microsoft l'installation de Microsoft Teams et les flux d'authentification doivent utiliser.", "label": "Teams" } }, "descriptionCe": "Gérez les profils Microsoft propres au tenant pour MSP SSO, la connexion Microsoft et la découverte des domaines de connexion.", "descriptionEe": "Gérez les profils Microsoft propres au tenant pour MSP SSO, l'e-mail Outlook, la synchronisation du calendrier et Microsoft Teams.", "dialog": { "cancel": "Annuler", "clientId": "Client ID", "clientSecret": "Client secret", "clientSecretPlaceholder": "Saisir le client secret", "clientSecretPlaceholderEdit": "Laisser vide pour conserver le secret actuel", "createProfile": "Créer le profil", "createTitle": "Créer un profil Microsoft", "descriptionCreate": "Créez un profil Microsoft propre au tenant, puis liez-le explicitement aux consommateurs Microsoft que vous souhaitez utiliser.", "descriptionEdit": "Mettez à jour le profil Microsoft sélectionné. Laissez le secret vide pour conserver la valeur existante.", "displayName": "Nom affiché", "displayNamePlaceholder": "Tenant de production Acme", "editTitle": "Modifier le profil Microsoft", "saveChanges": "Enregistrer les modifications", "saving": "Enregistrement…", "setDefault": "Définir ce profil comme profil Microsoft par défaut", "setDefaultHelp": "Les profils par défaut restent disponibles pour les workflows de gestion de profil et les métadonnées sûres pour la migration, mais pas pour le routage de consommateur.", "storedSecretHint": "Secret enregistré : {{secret}}. Laissez ce champ vide pour le conserver inchangé.", "tenantId": "Tenant ID" }, "empty": { "createButton": "Créer un profil Microsoft", "descriptionCe": "Créez d'abord un profil nommé, puis liez-le explicitement aux flux MSP SSO et de connexion par domaine.", "descriptionEe": "Créez d'abord un profil nommé, puis liez-le explicitement à MSP SSO, e-mail Outlook, synchronisation du calendrier et Teams.", "title": "Pas encore de profils Microsoft" }, "errors": { "archive": "Échec de l'archivage du profil Microsoft", "loadBindings": "Échec du chargement des liaisons Microsoft", "loadStatus": "Échec du chargement des paramètres Microsoft", "resetProviders": "Échec de la réinitialisation des fournisseurs Microsoft", "saveProfile": "Échec de l'enregistrement du profil Microsoft", "setDefault": "Échec de la définition du profil Microsoft par défaut", "updateBinding": "Échec de la mise à jour de la liaison Microsoft" }, "guidance": { "applicationIdUri": "Application ID URI", "calendarRedirect": "Redirect URI de synchronisation du calendrier", "calendarTitle": "Guide du calendrier", "clientId": "Client ID", "currentProfileTitle": "Valeurs du profil actuel", "emailRedirect": "Redirect URI de l'e-mail entrant", "emailTitle": "Guide de l'e-mail", "mspSsoTitle": "Guide MSP SSO", "notConfigured": "Non configuré", "redirectUri": "Redirect URI", "requiresBaseUrl": "Nécessite une URL de base et un Client ID", "scopes": "Scopes", "teamsBotRedirect": "Redirect URI du bot personnel", "teamsMessageRedirect": "Redirect URI de message extension", "teamsScopes": "Scopes Teams", "teamsTabRedirect": "Redirect URI d'onglet personnel", "teamsTitle": "Guide Teams", "tenantId": "Tenant ID", "unavailable": "Indisponible" }, "profileCard": { "activeBindings": "Liaisons actives", "archive": "Archiver", "clientId": "Client ID", "defaultBadge": "Par défaut", "edit": "Modifier", "guidanceSummary": "Guide d'enregistrement de l'application Microsoft", "noVisibleBindings": "Aucune liaison consommateur visible", "readinessTitle": "Disponibilité du profil", "readyCe": "Ce profil est prêt pour la liaison MSP SSO et les flux de connexion par domaine.", "readyEe": "Ce profil est prêt pour les liaisons MSP SSO, e-mail Outlook et calendrier.", "readyEeTeams": "Ce profil est prêt pour les liaisons MSP SSO, e-mail Outlook, synchronisation du calendrier et Teams.", "setDefault": "Définir par défaut", "storedSecret": "Secret enregistré", "teamsAppIdUri": "Application ID URI Teams", "tenantIdLabel": "Tenant ID :", "updating": "Mise à jour…" }, "providerReconnect": { "description": "Utilisez ceci si vous effectuez une rotation des identifiants ou si vous reliez volontairement l'e-mail Outlook ou le calendrier à un autre profil Microsoft.", "title": "Reconnexion du fournisseur" }, "readiness": { "archived": "Les profils archivés ne peuvent pas être utilisés pour de nouvelles liaisons Microsoft.", "clientIdMissing": "Le Client ID est manquant.", "clientSecretMissing": "Le client secret n'a pas été configuré.", "tenantIdMissing": "Le Tenant ID est manquant." }, "statusBadges": { "archived": "Archivé", "needsAttention": "Nécessite une attention", "ready": "Prêt" }, "title": "Microsoft", "toasts": { "archiveFailedTitle": "Impossible d'archiver le profil Microsoft", "archivedDescription": "{{name}} a été archivé avec succès.", "archivedTitle": "Profil Microsoft archivé", "bindingFailedTitle": "Impossible de mettre à jour la liaison {{consumer}}", "bindingUpdatedDescription": "{{consumer}} utilise désormais {{profile}}.", "bindingUpdatedTitle": "Liaison {{consumer}} mise à jour", "defaultUpdatedDescription": "{{name}} est désormais le profil Microsoft par défaut.", "defaultUpdatedTitle": "Profil Microsoft par défaut mis à jour", "profileCreated": "Profil Microsoft créé", "profileCreatedDescription": "Le profil Microsoft est prêt à être lié aux consommateurs Microsoft visibles.", "profileUpdated": "Profil Microsoft mis à jour", "profileUpdatedDescription": "Les modifications du profil Microsoft ont été enregistrées avec succès.", "resetDescription": "Les connexions e-mail Outlook et calendrier existantes nécessitent désormais une nouvelle autorisation.", "resetFailedTitle": "Échec de la réinitialisation", "resetTitle": "Fournisseurs Microsoft réinitialisés", "saveFailedTitle": "Impossible d'enregistrer le profil Microsoft", "selectedProfile": "le profil sélectionné", "setDefaultFailedTitle": "Impossible de définir le profil par défaut" }, "validation": { "clientIdRequired": "Le Microsoft OAuth Client ID est requis", "clientSecretRequired": "Le Microsoft OAuth Client Secret est requis", "displayNameRequired": "Le nom affiché du profil Microsoft est requis", "tenantIdRequired": "Le Microsoft Tenant ID est requis" } } }, "qbo": { "live": { "defaultCompany": "Entreprise QuickBooks connectée" }, "settings": { "actions": { "connect": "Connecter QuickBooks", "disconnect": "Déconnecter QuickBooks", "disconnecting": "Déconnexion…", "reconnect": "Reconnecter QuickBooks", "refresh": "Actualiser", "saveCredentials": "Enregistrer les identifiants QuickBooks", "saving": "Enregistrement…" }, "badges": { "connectionExpired": "La connexion nécessite une attention", "credentialsReady": "Identifiants prêts", "credentialsRequired": "Identifiants requis", "defaultConnected": "Entreprise connectée", "noCompany": "Aucune entreprise connectée" }, "callback": { "accessDenied": "L'accès QuickBooks a été refusé avant la fin de la connexion.", "configMissing": "Impossible de démarrer QuickBooks OAuth car le client ID et le client secret n'étaient pas entièrement configurés.", "generic": "QuickBooks a retourné une erreur OAuth : {{code}}", "invalidState": "L'état OAuth QuickBooks était invalide ou expiré. Relancez le flux de connexion.", "missingParams": "Des paramètres requis étaient absents du rappel QuickBooks. Relancez le flux de connexion.", "oauthFailed": "Le rappel OAuth QuickBooks a échoué. Essayez de vous reconnecter. Si le problème persiste, vérifiez votre redirect URI et vos scopes.", "tokenExchangeFailed": "Intuit n'a pas retourné les jetons attendus. Essayez de vous reconnecter." }, "clientIdLabel": "QuickBooks Client ID", "clientIdPlaceholder": "Collez le client ID de votre application Intuit", "clientSecretLabel": "QuickBooks Client Secret", "clientSecretPlaceholder": "Collez le client secret de votre application Intuit", "connectSuccess": "QuickBooks connecté avec succès. L'entreprise connectée est désormais le contexte QuickBooks live par défaut.", "connection": { "defaultCompany": "Entreprise connectée", "description": "Ne démarrez OAuth qu'après avoir configuré les identifiants de l'application QuickBooks. La déconnexion supprime les jetons d'accès QuickBooks enregistrés mais conserve les identifiants de l'application propre au tenant.", "notConnected": "Aucune entreprise QuickBooks n'est encore connectée. Enregistrez les identifiants, puis cliquez sur Connecter QuickBooks.", "realmId": "Realm ID : {{id}}", "title": "Connexion QuickBooks live", "unknown": "inconnu" }, "credentialsSaved": "Identifiants QuickBooks enregistrés. Vous pouvez maintenant lancer le flux OAuth QuickBooks.", "csvAvailableMiddle": "dans cette même section Comptabilité et gérez les exports depuis", "csvAvailablePrefix": "Si vous préférez un flux manuel, continuez à utiliser", "csvAvailableTitle": "QuickBooks CSV reste disponible", "description": "Configurez les identifiants OAuth QuickBooks, connectez votre entreprise QuickBooks et conservez QuickBooks live aux côtés du flux manuel QuickBooks CSV.", "disconnectSuccess": "La connexion QuickBooks enregistrée a été supprimée. Les identifiants de l'application QuickBooks propres au tenant ont été préservés.", "environment": "Environnement Intuit", "environmentProduction": "Production", "environmentSandbox": "Sandbox", "errors": { "disconnect": "Échec de la déconnexion de QuickBooks.", "load": "Échec du chargement des paramètres QuickBooks.", "saveCredentials": "Échec de l'enregistrement des identifiants QuickBooks." }, "howItWorksDescription": "Enregistrez ici les identifiants de l'application QuickBooks, terminez le flux OAuth Intuit et Alga PSA utilisera l'entreprise QuickBooks connectée comme contexte live par défaut pour les exports et les mappages.", "howItWorksTitle": "Comment fonctionne QuickBooks live dans cette version", "loading": "Chargement des paramètres QuickBooks…", "mapping": { "alert": "Les articles, codes fiscaux et conditions QuickBooks sont chargés depuis l'entreprise connectée afin que les exports live puissent continuer à utiliser la première connexion QuickBooks enregistrée en v1.", "descriptionPrefix": "Configurez les mappages QuickBooks live pour l'entreprise connectée. Ces mappages sont limités à", "placeholderAlert": "Le gestionnaire de mappages devient disponible une fois la première entreprise QuickBooks connectée et définie comme contexte QuickBooks live par défaut.", "placeholderDescription": "Connectez une entreprise QuickBooks avant de configurer les mappages d'articles et de taxes QuickBooks live.", "title": "Mappage et configuration QuickBooks live" }, "noClientId": "Aucun client ID n'est encore enregistré pour ce tenant.", "noClientSecret": "Aucun client secret n'est encore enregistré pour ce tenant.", "quickbooksCsv": "QuickBooks CSV", "redirectUri": "Redirect URI", "requiredScopes": "Scopes requis", "storedClientId": "Client ID enregistré : {{value}}", "storedClientSecret": "Client secret enregistré : {{value}}", "tenantOauthDescription": "Collez les identifiants de l'application Intuit enregistrés pour ce tenant, ou laissez vide pour utiliser l'application QuickBooks au niveau de l'application si une est configurée. Les valeurs de secret ne sont jamais renvoyées au navigateur après l'enregistrement.", "tenantOauthTitle": "Application OAuth propre au tenant", "title": "QuickBooks Online" }, "sync": { "healthCardTitle": "État de la synchronisation", "healthCardDescription": "État et commandes de la synchronisation comptable QuickBooks. S'exécute toutes les 15 minutes.", "lastCycleTitle": "Dernier cycle de synchronisation", "lastCycleStatus": "Statut", "lastCycleFinishedAt": "Terminé", "lastCycleStats": "Résultats", "statOpsProcessed": "{{count}} opérations traitées", "statDriftFound": "{{count}} écarts", "statPaymentsApplied": "{{count}} paiements appliqués", "noLastCycle": "Aucun cycle de synchronisation n'a encore été exécuté.", "nextRunHint": "S'exécute automatiquement toutes les 15 minutes lorsque la synchronisation automatique est activée.", "pendingOps": "Opérations en attente", "erroredOps": "Opérations en erreur", "driftCount": "Écarts", "openExceptions": "Exceptions ouvertes", "refreshTokenExpiry": "Le jeton QuickBooks expire le {{date}}", "refreshTokenExpired": "Jeton QuickBooks expiré — reconnectez-vous pour reprendre la synchronisation.", "autoSyncLabel": "Synchronisation automatique activée", "syncNowButton": "Synchroniser maintenant", "syncNowRunning": "Synchronisation…", "syncNowSuccess": "Synchronisation terminée avec succès.", "syncNowSkipped": "Synchronisation ignorée : {{reason}}", "syncNowError": "Échec de la synchronisation : {{error}}", "viewExceptionsLink": "Voir les exceptions", "autoApplyCreditsWarning": "QuickBooks est configuré pour appliquer automatiquement les crédits, ce qui entre en conflit avec les applications de crédit pilotées depuis Alga : QuickBooks peut appliquer les avoirs exportés à une autre facture avant la synchronisation. Dans QuickBooks, ouvrez « Account and Settings → Advanced → Automation » et désactivez « Automatically apply credits ».", "configTitle": "Configuration de la synchronisation", "connectedCompanies": "Sociétés connectées", "defaultClass": "Classe par défaut", "defaultDepartment": "Département par défaut", "defaultRealm": "Par défaut", "depositAccount": "Compte de dépôt", "makeDefault": "Définir par défaut", "noDefault": "Aucun par défaut", "saving": "Enregistrement…", "undepositedFunds": "Fonds non déposés (par défaut)" } }, "rmm": { "ninjaOne": { "loading": "Chargement des paramètres d’intégration NinjaOne...", "card": { "title": "Intégration NinjaOne RMM", "description": "Connectez votre compte NinjaOne pour synchroniser les appareils, recevoir des alertes et activer les fonctionnalités d'accès à distance.", "skeletonDescription": "Chargement de l'intégration NinjaOne..." }, "status": { "checking": "Vérification de la connexion NinjaOne...", "notConnected": { "title": "Non connecté à NinjaOne", "description": "Connectez votre compte NinjaOne pour synchroniser les appareils, recevoir des alertes et activer l'accès à distance." }, "connected": "Connecté à NinjaOne", "connectedWithErrors": "NinjaOne connecté avec des erreurs de synchronisation", "instanceLabel": "Instance :", "organizations": "{{count}} organisations", "devices": "{{count}} appareils", "activeAlerts": "{{count}} alertes actives", "lastSynced": "Dernière synchronisation : {{time}}" }, "setup": { "title": "Instructions de configuration", "steps": { "login": "Connectez-vous à votre tableau de bord NinjaOne", "navigate": "Allez dans Administration → Apps → API", "addClient": "Cliquez sur « + Add client app » pour créer une nouvelle application API", "platform": "Définissez Application Platform sur « Web (PHP, Java, .Net Core, etc.) »", "name": "Saisissez un Name (p. ex. « Alga PSA »)", "redirectUri": "Ajoutez l'URI de redirection :", "scopes": "Sous « Scopes », cochez « Monitoring » et « Management »", "grantTypes": "Sous « Allowed grant types », cochez « Authorization code », « Client credentials » et « Refresh token »", "addAndCopy": "Cliquez sur « Add » et copiez le Client ID et le Client Secret ci-dessous" }, "docsPrefix": "Pour des instructions de configuration détaillées, voir", "docsSection": "Section 10.15", "docsSuffix": "dans la documentation.", "openApiSettings": "Ouvrir les paramètres API NinjaOne" }, "credentials": { "title": "Identifiants API", "saved": "Identifiants enregistrés", "clientIdLabel": "Client ID", "clientIdPlaceholder": "Saisissez votre Client ID NinjaOne", "clientSecretLabel": "Client Secret", "clientSecretPlaceholder": "Saisissez votre Client Secret NinjaOne", "clientSecretUpdatePlaceholder": "Saisissez un nouveau secret pour mettre à jour", "secretMaskedLabel": "Secret", "saving": "Enregistrement...", "save": "Enregistrer les identifiants" }, "region": { "hint": "Sélectionnez votre région NinjaOne, puis cliquez sur « Se connecter à NinjaOne » pour autoriser l'accès.", "label": "Région :" }, "actions": { "refreshing": "Actualisation...", "refreshStatus": "Actualiser le statut", "syncing": "Synchronisation...", "syncOrganizations": "Synchroniser les organisations", "syncingDevices": "Synchronisation des appareils...", "syncDevices": "Synchroniser les appareils", "disconnecting": "Déconnexion...", "disconnect": "Déconnecter", "connect": "Se connecter à NinjaOne" }, "disconnectModal": { "title": "Déconnecter NinjaOne", "description": "Êtes-vous sûr de vouloir déconnecter NinjaOne ? Cela arrêtera la synchronisation des appareils et les notifications d'alerte, et supprimera vos identifiants API enregistrés. Les mappages d'organisation seront préservés.", "cancel": "Annuler", "confirm": "Déconnecter" }, "toasts": { "connectSuccess": "Connecté avec succès à NinjaOne.", "connectFailed": "Échec de la connexion NinjaOne.", "connectFailedWithDetail": "Échec de la connexion NinjaOne : {{detail}}", "disconnectSuccess": "Connexion NinjaOne déconnectée avec succès.", "credentialsSaved": "Identifiants API NinjaOne enregistrés avec succès.", "orgSyncSuccess": "Synchronisation des organisations terminée. Traitées : {{processed}}, Créées : {{created}}, Mises à jour : {{updated}}", "deviceSyncSuccess": "Synchronisation des appareils terminée. Traités : {{processed}}, Créés : {{created}}, Mis à jour : {{updated}}" }, "errors": { "loadStatus": "Échec du chargement du statut de connexion NinjaOne.", "saveCredentials": "Échec de l'enregistrement des identifiants.", "connect": "Échec du lancement de la connexion NinjaOne.", "disconnect": "Échec de la déconnexion de NinjaOne.", "disconnectUnexpected": "Une erreur inattendue s'est produite lors de la déconnexion.", "orgSyncFailed": "Échec de la synchronisation des organisations.", "deviceSyncFailed": "Échec de la synchronisation des appareils." }, "compliance": { "actions": { "retry": "Réessayer", "syncing": "Synchronisation...", "syncPatches": "Synchroniser les correctifs", "syncSoftware": "Synchroniser les logiciels" }, "description": "Aperçu de la santé des appareils gérés par RMM", "loading": "Chargement des données de conformité...", "metrics": { "devicesOffline": "Appareils hors ligne", "devicesOnline": "Appareils en ligne", "devicesWithAlerts": "Appareils avec alertes", "patchesFailed": "Correctifs en échec", "patchesPending": "Correctifs en attente" }, "noData": "Aucune donnée de conformité disponible", "summaryError": "Échec du chargement du résumé de conformité", "title": "Conformité du parc" } }, "setup": { "activeConfiguration": "Configuration active", "comingSoon": "Intégration RMM bientôt disponible", "configure": "Configurer l'intégration", "selected": "{{title}} sélectionné", "title": "Intégrations RMM", "backToList": "Toutes les intégrations RMM", "loadingProvider": "Chargement des paramètres de l'intégration {{title}}...", "status": { "connected": "Connecté", "connectedOneDevice": "Connecté · 1 appareil", "connectedWithDevices": "Connecté · {{count}} appareils", "notConnected": "Non connecté", "syncError": "Erreur de synchronisation" } }, "tactical": { "actions": { "disconnect": "Déconnecter", "disconnecting": "Déconnexion...", "ingestSoftware": "Ingérer les logiciels", "ingesting": "Ingestion...", "refresh": "Actualiser", "save": "Enregistrer", "saving": "Enregistrement...", "syncAlerts": "Synchroniser les alertes", "syncClients": "Synchroniser les clients", "syncDevices": "Synchroniser les appareils", "syncing": "Synchronisation...", "testConnection": "Tester la connexion", "testing": "Test en cours..." }, "auth": { "apiKey": "Clé API", "enterApiKey": "Saisir la clé API", "enterPassword": "Saisir le mot de passe", "enterUsername": "Saisir le nom d'utilisateur", "knox": "Knox", "knoxOption": "Nom d'utilisateur/mot de passe (jeton Knox)", "knoxTokenSaved": "Jeton Knox enregistré : {{value}}", "mode": "Authentification", "password": "Mot de passe", "saved": "Enregistré : {{value}}", "savedEnterToUpdate": "Enregistré (saisir pour mettre à jour)", "totp": "Code TOTP", "username": "Nom d'utilisateur" }, "autoSync": "Synchronisation automatique", "client": { "loading": "Chargement des clients…", "select": "Sélectionner un client" }, "counts": { "activeAlerts": "Alertes actives", "lastSync": "Dernière synchronisation", "mappedOrgs": "Organisations mappées", "never": "Jamais", "syncedDevices": "Appareils synchronisés" }, "description": "Connectez Tactical RMM pour synchroniser les actifs et ingérer les alertes.", "errors": { "backfillAlerts": "Échec du backfill des alertes", "connectionTest": "Échec du test de connexion", "disconnect": "Échec de la déconnexion", "ingestSoftware": "Échec de l'ingestion des logiciels", "loadOrgMappings": "Échec du chargement des mappages d'organisation", "loadSettings": "Échec du chargement des paramètres Tactical RMM", "saveConfig": "Échec de l'enregistrement de la configuration Tactical RMM", "someAlertsFailed": "Certaines alertes n'ont pas pu être mises à jour : {{errors}}", "someDevicesFailed": "Certains appareils n'ont pas pu être synchronisés : {{errors}}", "someOrgsFailed": "Certaines organisations n'ont pas pu être synchronisées : {{errors}}", "someSoftwareFailed": "Certaines lignes de logiciels n'ont pas pu être ingérées : {{errors}}", "syncDevices": "Échec de la synchronisation des appareils", "syncOrgs": "Échec de la synchronisation des organisations", "totpRequired": "Le TOTP est requis. Saisissez votre code actuel et testez à nouveau.", "updateMapping": "Échec de la mise à jour du mappage" }, "fields": { "instanceUrl": "URL d'instance", "instanceUrlHelp": "Utilisez l'hôte de l'API Tactical — le sous-domaine api., par ex. https://api.example.com. Pas l'URL du tableau de bord (rmm.) et sans /api à la fin.", "betaApiNote": "Nécessite l'activation de l'API Bêta de Tactical sur le serveur : définissez BETA_API_ENABLED = True dans Tactical, puis redémarrez-le. Sans l'API Bêta, le test de connexion et la synchronisation échoueront." }, "lastError": "Dernière erreur : {{error}}", "loadingSettings": "Chargement des paramètres Tactical RMM...", "sections": { "alerts": "Alertes", "alertsDescription": "Optionnel : remplir les alertes historiques ou actives depuis Tactical vers Alga.", "devices": "Appareils", "devicesDescription": "Synchroniser les agents Tactical en actifs Alga pour les organisations mappées.", "orgMapping": "Mappage d'organisation", "orgMappingDescription": "Affectez chaque client Tactical à un client Alga et contrôlez la synchronisation automatique par organisation.", "orgMappingEmpty": "Aucune organisation trouvée. Exécutez d'abord « Synchroniser les clients ».", "organizations": "Organisations", "organizationsDescription": "Synchronisez les clients Tactical dans les mappages d'organisation Alga, puis affectez-les aux clients Alga.", "softwareInventory": "Inventaire logiciel", "softwareInventoryDescription": "Optionnel : ingérer l'inventaire logiciel en cache via Tactical /api/software/ (aucun appel d'actualisation par agent).", "webhooks": "Webhooks (alertes)", "webhooksDescription": "Configurez un webhook d'action d'alerte Tactical à l'aide de l'en-tête de secret partagé ci-dessous." }, "status": { "authPrefix": "Authentification :", "connected": "Connecté", "disconnected": "Déconnecté", "instanceUrlNotSet": "URL d'instance non définie" }, "statusLine": { "configured": "Statut : Configuré", "notConfigured": "Statut : Non configuré" }, "success": { "alertBackfillCompleted": "Backfill des alertes terminé. Traitées : {{processed}}, Créées : {{created}}, Mises à jour : {{updated}}, Échecs : {{failed}}", "connection": "Connexion réussie.", "deviceSyncCompleted": "Synchronisation des appareils terminée. Traités : {{processed}}, Créés : {{created}}, Mis à jour : {{updated}}, Supprimés : {{deleted}}, Échecs : {{failed}}", "disconnected": "Déconnecté.", "orgSyncCompleted": "Synchronisation des organisations terminée. Traitées : {{processed}}, Créées : {{created}}, Mises à jour : {{updated}}, Échecs : {{failed}}", "saved": "Configuration Tactical RMM enregistrée.", "softwareIngestionCompleted": "Ingestion des logiciels terminée. Traités : {{processed}}, Installés/Mis à jour : {{created}}, Actifs mis à jour : {{updated}}, Échecs : {{failed}}" }, "tacticalIdLabel": "ID Tactical : {{id}}", "title": "Tactical RMM", "toasts": { "alertsSyncedDescription": "Les alertes Tactical ont été remplies.", "alertsSyncedTitle": "Alertes synchronisées", "backfillFailedTitle": "Échec du backfill", "connectedDescription": "Connexion Tactical RMM vérifiée.", "connectedTitle": "Connecté", "connectionFailedTitle": "Échec de la connexion", "devicesSyncedDescription": "Les agents Tactical ont été synchronisés en actifs.", "devicesSyncedTitle": "Appareils synchronisés", "disconnectFailedTitle": "Échec de la déconnexion", "disconnectedDescription": "Identifiants Tactical RMM effacés.", "disconnectedTitle": "Déconnecté", "ingestionFailedTitle": "Échec de l'ingestion", "orgsSyncedDescription": "Les clients Tactical ont été synchronisés dans les mappages d'organisation.", "orgsSyncedTitle": "Organisations synchronisées", "saveFailedTitle": "Échec de l'enregistrement", "savedDescription": "Configuration Tactical RMM mise à jour.", "savedTitle": "Enregistré", "softwareIngestedDescription": "L'inventaire logiciel Tactical en cache a été ingéré.", "softwareIngestedTitle": "Logiciels ingérés", "syncFailedTitle": "Échec de la synchronisation", "unknownError": "Erreur inconnue", "updateFailedTitle": "Échec de la mise à jour" }, "webhook": { "copiedTitle": "Copié", "copy": "Copier", "headerName": "Nom de l'en-tête", "payloadTemplate": "Modèle de charge utile", "secret": "Secret d'en-tête", "secretCopied": "Secret du webhook copié dans le presse-papiers.", "unavailable": "Informations du webhook indisponibles. (Nécessite l'autorisation de lecture des paramètres.)", "url": "URL du webhook", "urlCopied": "URL du webhook copiée dans le presse-papiers." } }, "tanium": { "loading": "Chargement des paramètres d'intégration Tanium...", "actions": { "discoverScopes": "Découvrir les portées", "disconnect": "Déconnecter", "runInventorySync": "Exécuter la synchronisation de l'inventaire", "saveConfiguration": "Enregistrer la configuration", "testConnection": "Tester la connexion" }, "connection": { "connectedAt": "Connecté à : {{time}}", "description": "Configurez les identifiants Tanium Gateway et vérifiez l'accès à portée tenant.", "never": "Jamais", "syncLabel": "Synchronisation : {{status}}", "syncLabelWithError": "Synchronisation : {{status}} ({{error}})", "title": "Connexion Tanium" }, "errors": { "loadMappings": "Échec du chargement des mappages Tanium.", "loadSettings": "Échec du chargement des paramètres Tanium.", "loadState": "Échec du chargement de l'état d'intégration Tanium.", "saveConfiguration": "Échec de l'enregistrement de la configuration Tanium.", "testConnectionFailed": "Le test de connexion Tanium a échoué.", "disconnectFailed": "Échec de la déconnexion de l'intégration Tanium.", "scopeDiscoveryFailed": "Échec de la découverte des portées.", "inventorySyncFailed": "Échec de la synchronisation de l'inventaire.", "updateMappingFailed": "Échec de la mise à jour du mappage." }, "fields": { "apiToken": "Jeton API {{state}}", "apiTokenPlaceholderExisting": "Laissez vide pour conserver le jeton existant", "apiTokenPlaceholderNew": "Collez le jeton API Tanium", "apiTokenStateRequired": "(requis)", "apiTokenStateSaved": "(enregistré)", "assetApiUrl": "URL Asset API (facultatif)", "assetApiUrlPlaceholder": "https://example.cloud.tanium.com/plugin/products/asset", "assetFallbackLabel": "Activer la solution de repli Asset API pour la couverture des points de terminaison expirés", "gatewayUrl": "URL Gateway", "gatewayUrlPlaceholder": "https://example.cloud.tanium.com" }, "mappings": { "autoSync": "Synchronisation automatique", "autoSyncDisabled": "Désactivée", "autoSyncEnabled": "Activée", "externalScope": "Portée externe", "loading": "Chargement des mappages...", "mappedClient": "Client mappé", "noScopes": "Aucune portée Tanium découverte pour le moment.", "scopeIdLabel": "ID : {{id}}", "unmapped": "Non mappé" }, "status": { "connected": "Connecté", "disconnected": "Déconnecté", "label": "Statut : " }, "success": { "configurationSaved": "Configuration Tanium enregistrée.", "connectionTestSucceeded": "Test de connexion Tanium réussi.", "disconnected": "Intégration Tanium déconnectée.", "inventorySyncCompleted": "Synchronisation de l'inventaire terminée. Traités : {{processed}}, Créés : {{created}}, Mis à jour : {{updated}}", "scopeDiscoveryCompleted": "Découverte des portées terminée. Traitées : {{processed}}, Créées : {{created}}, Mises à jour : {{updated}}" }, "sync": { "description": "Découvrez les portées depuis les groupes d'ordinateurs Tanium, mappez-les aux clients, puis exécutez la synchronisation de l'inventaire.", "title": "Synchronisation Tanium" } }, "levelio": { "actions": { "backfillAlerts": "Rattraper les alertes", "disconnect": "Déconnecter", "discoverGroups": "Découvrir les groupes", "runDeviceSync": "Lancer la synchronisation des appareils", "saveConfiguration": "Enregistrer la configuration", "testConnection": "Tester la connexion" }, "connection": { "connectedAt": "Connecté : {{time}}", "description": "Connectez-vous à Level (level.io) avec une clé API. Les clés se créent dans Level sous Settings > API.", "never": "jamais", "syncLabel": "Synchronisation : {{status}}", "syncLabelWithError": "Synchronisation : {{status}} ({{error}})", "title": "Connexion Level" }, "errors": { "alertBackfillFailed": "Échec du rattrapage des alertes", "deviceSyncFailed": "Échec de la synchronisation des appareils", "disconnectFailed": "Échec de la déconnexion de l'intégration Level", "groupSyncFailed": "Échec de la découverte des groupes", "loadMappings": "Échec du chargement des mappages de groupes Level", "loadSettings": "Échec du chargement des paramètres Level", "loadState": "Échec du chargement de l'état de l'intégration Level", "loadSummary": "Échec du chargement du résumé de connexion Level", "loadWebhook": "Échec du chargement des détails du webhook Level", "saveConfiguration": "Échec de l'enregistrement de la configuration Level", "testConnectionFailed": "Échec du test de connexion", "updateMappingFailed": "Échec de la mise à jour du mappage" }, "fields": { "apiKey": "Clé API ({{state}})", "apiKeyPlaceholderExisting": "Saisissez une nouvelle clé pour remplacer celle enregistrée", "apiKeyPlaceholderNew": "Collez votre clé API Level", "apiKeyStateRequired": "requise", "apiKeyStateSaved": "enregistrée" }, "mappings": { "autoSync": "Synchronisation auto", "autoSyncDisabled": "Désactivée", "autoSyncEnabled": "Activée", "group": "Groupe Level", "groupIdLabel": "ID : {{id}}", "loading": "Chargement…", "mappedClient": "Client mappé", "noGroups": "Aucun groupe découvert pour le moment. Lancez d'abord Découvrir les groupes.", "unmapped": "Non mappé" }, "status": { "connected": "Connecté", "disconnected": "Non connecté", "label": "Statut : " }, "success": { "alertBackfillCompleted": "Rattrapage des alertes terminé : {{processed}} alertes traitées", "configurationSaved": "Configuration Level enregistrée", "connectionTestSucceeded": "Connexion à Level réussie", "deviceSyncCompleted": "Synchronisation des appareils terminée : {{processed}} traités, {{created}} créés, {{updated}} mis à jour", "disconnected": "Intégration Level déconnectée", "groupSyncCompleted": "Découverte des groupes terminée : {{processed}} traités, {{created}} créés, {{updated}} mis à jour" }, "sync": { "description": "Découvrez les groupes Level, mappez-les aux clients et synchronisez les appareils. Les appareils des groupes non mappés sont ignorés ; les sous-groupes héritent de l'ancêtre mappé le plus proche.", "summary": "{{mappedGroups}} groupes mappés · {{devices}} appareils · {{activeAlerts}} alertes actives", "title": "Synchronisation et mappages de groupes" }, "webhook": { "copied": "Copié", "copy": "Copier", "description": "Level ne peut pas enregistrer de webhooks via son API. Dans Level, créez une automatisation avec une action HTTP POST utilisant l'URL, l'en-tête et la charge utile ci-dessous pour pousser les alertes vers Alga en temps réel.", "header": "En-tête : {{name}}", "hideSecret": "Masquer le secret", "loading": "Les détails du webhook se chargent une fois l'intégration configurée.", "payload": "Modèle de charge utile", "showSecret": "Afficher le secret", "title": "Webhook d'alertes", "url": "URL du webhook" } } }, "sso": { "msp": { "actions": { "add": "Ajouter", "refresh": "Actualiser", "request": "Demander", "resetChallenge": "Réinitialiser le défi", "revoke": "Révoquer", "saveDomains": "Enregistrer les domaines", "saving": "Enregistrement…", "verify": "Vérifier" }, "addDomainLabel": "Ajouter un domaine de connexion", "advisoryNotice": "Mode consultatif : l'enregistrement de domaine aide à router la découverte MSP SSO mais n'exige pas de vérification de propriété dans l'édition Community.", "claimStatus": { "advisory": "Consultatif", "pending": "En attente", "rejected": "Rejeté", "revoked": "Révoqué", "verified": "Vérifié", "verifiedLegacy": "Vérifié (Legacy)" }, "descriptionCe": "Enregistrez des domaines consultatifs pour la découverte du SSO de connexion MSP. La vérification de propriété n'est pas imposée dans l'édition Community, et les domaines non gérés basculent vers les fournisseurs au niveau application de Nine Minds.", "descriptionEe": "Gérez le cycle de vie des revendications de domaine pour la découverte des fournisseurs SSO de connexion MSP. Les domaines non revendiqués ou non éligibles basculent vers les fournisseurs au niveau application de Nine Minds.", "dnsHost": "Hôte :", "dnsInstructions": "Ajoutez l'enregistrement DNS TXT, puis cliquez sur Vérifier :", "dnsValue": "Valeur :", "emptyClaims": "Aucune revendication de domaine n'est encore configurée.", "emptyDomains": "Aucun domaine configuré. Les domaines inconnus utiliseront le fallback du fournisseur au niveau application.", "errors": { "conflicts": "Conflits : {{conflicts}}.", "loadClaims": "Impossible de charger les revendications de domaine MSP SSO.", "loadDomains": "Impossible de charger les domaines de connexion MSP SSO.", "refreshChallenge": "Impossible d'actualiser le défi.", "requestClaim": "Impossible de demander la revendication de domaine.", "revokeClaim": "Impossible de révoquer la revendication de domaine.", "saveDomains": "Impossible d'enregistrer les domaines de connexion MSP SSO.", "verifyClaim": "Impossible de vérifier la revendication de domaine." }, "fallbackInfo": "Les domaines sans revendication de tenant éligible utilisent la configuration du fournisseur SSO au niveau application de Nine Minds.", "loading": "Chargement…", "removeDomainAria": "Supprimer le domaine {{number}}", "requestClaim": "Demander une revendication", "requestClaimLabel": "Demander une revendication de domaine", "title": "Domaines de connexion MSP SSO", "toasts": { "claimRequestedDescription": "Revendication de domaine en attente créée et défi de vérification généré.", "claimRequestedTitle": "Revendication de domaine demandée", "claimUnchangedDescription": "La revendication en attente et le défi existants sont déjà actifs.", "claimUnchangedTitle": "Revendication de domaine inchangée", "refreshFailedTitle": "Impossible d'actualiser le défi", "refreshedDescription": "Un nouveau défi de vérification est actif pour cette revendication.", "refreshedTitle": "Défi actualisé", "requestClaimFailedTitle": "Impossible de demander la revendication de domaine", "revokeFailedTitle": "Impossible de révoquer la revendication", "revokedDescription": "La prise en charge tenant de ce domaine est désactivée.", "revokedTitle": "Revendication de domaine révoquée", "saveDomainsFailedTitle": "Impossible d'enregistrer les domaines de connexion MSP SSO", "savedDescription": "Les paramètres de découverte SSO basés sur le domaine sont à jour.", "savedTitle": "Domaines de connexion MSP SSO enregistrés", "verifiedDescription": "La prise en charge du domaine est désormais éligible au routage de fournisseur par tenant.", "verifiedTitle": "Revendication de domaine vérifiée", "verifyFailedTitle": "Échec de la vérification du domaine" } } }, "teams": { "settings": { "actions": { "activate": "Activer Teams", "addNote": { "description": "Autoriser les actions rapides de note interne.", "label": "Ajouter une note" }, "approvalResponse": { "description": "Autoriser les actions rapides d'approbation et de rejet.", "label": "Réponse d'approbation" }, "assignTicket": { "description": "Autoriser les actions rapides d'affectation de ticket.", "label": "Affecter le ticket" }, "deactivate": "Désactiver", "logTime": { "description": "Autoriser les actions rapides de saisie de temps.", "label": "Saisir le temps" }, "reload": "Recharger", "replyToContact": { "description": "Autoriser les actions rapides de réponse visibles par le client.", "label": "Répondre au contact" }, "saveChanges": "Enregistrer les modifications", "saveDraft": "Enregistrer le brouillon", "saving": "Enregistrement...", "teamsActive": "Teams actif" }, "capabilities": { "activityNotifications": { "description": "Délivrer des notifications personnelles au flux d'activité Teams.", "label": "Notifications d'activité" }, "groupChatBot": { "description": "Permettre au bot de répondre dans les chats de groupe Teams. Les réponses du bot (y compris les détails de ticket) sont visibles par tous les membres du chat.", "label": "Bot en chat de groupe" }, "messageExtension": { "description": "Activer la recherche et les actions PSA pilotées par message.", "label": "Message extension" }, "personalBot": { "description": "Activer les commandes de bot en portée personnelle pour les techniciens.", "label": "Bot personnel" }, "personalTab": { "description": "Lancer le point d'entrée de l'onglet personnel PSA.", "label": "Onglet personnel" } }, "checklist": { "installState": { "active": "Teams est actif pour ce tenant.", "error": "La configuration Teams contient une erreur à corriger.", "label": "État d'installation Teams", "notConfigured": "Enregistrez un brouillon ou activez Teams lorsque la configuration est prête.", "pending": "Le brouillon de configuration est enregistré et prêt pour l'installation ou le consentement." }, "needsAction": "Action requise", "profileReady": { "completed": "Le profil sélectionné possède un Client ID, un Tenant ID et du matériel de secret enregistré.", "label": "Profil prêt pour l'installation Teams", "pending": "Aucun profil Teams sélectionné n'est encore prêt." }, "profileSelected": { "completed": "{{name}} est lié à Teams.", "label": "Profil Microsoft sélectionné", "pending": "Sélectionnez un profil Microsoft éligible avant d'enregistrer ou d'activer Teams." }, "ready": "Prêt" }, "description": "Liez Teams à un profil Microsoft, activez des capacités et générez le package du tenant.", "errors": { "downloadPackage": "Échec du téléchargement du package d'application Teams", "generatePackage": "Échec de la génération du package d'application Teams", "loadGuidance": "Échec du chargement du guide de configuration Teams", "saveSettings": "Échec de l'enregistrement des paramètres Teams" }, "guidance": { "applicationIdUri": "Application ID URI", "messageExtension": "Message extension", "personalBot": "Bot personnel", "personalTab": "Onglet personnel", "redirectUris": "Redirect URIs", "requiredScopes": "Scopes requis", "teamsAppIdUri": "Teams App ID URI", "unavailable": "Indisponible" }, "installStatus": { "active": "Actif", "error": "Erreur", "installPending": "Installation en attente", "notConfigured": "Non configuré" }, "noEligibleProfiles": "Aucun profil Microsoft n'est prêt pour Teams. Terminez d'abord la configuration Microsoft.", "notifications": { "approvalRequest": { "description": "Notifier les approbateurs des décisions en attente.", "label": "Demandes d'approbation" }, "assignment": { "description": "Notifier les techniciens lorsqu'une tâche leur est affectée.", "label": "Événements d'affectation" }, "customerReply": { "description": "Notifier les techniciens lorsque les clients répondent.", "label": "Réponses des clients" }, "escalation": { "description": "Notifier les responsables lorsque le travail est escaladé.", "label": "Escalades" }, "slaRisk": { "description": "Notifier les techniciens lorsque les seuils de risque SLA sont atteints.", "label": "Risque SLA" } }, "package": { "appId": "App ID", "appIds": "App IDs", "botId": "Bot ID", "deepLinks": "Deep links", "description": "Générez le manifeste de l'application et les liens d'installation pour le profil Microsoft sélectionné.", "downloadManifest": "Télécharger le manifeste JSON", "downloadZip": "Télécharger le package d'application (.zip)", "downloading": "Téléchargement...", "fileName": "Nom de fichier", "generate": "Générer le package", "generating": "Génération...", "manifestVersion": "Version du manifeste", "myWork": "Mon travail", "openBaseUrl": "Ouvrir l'URL de base PSA", "openDeeplink": "Ouvrir le deep link Teams", "packageVersion": "Version du package", "projectTaskTemplate": "Modèle de tâche de projet", "section": "Package", "ticketTemplate": "Modèle de ticket", "title": "Package Teams", "validDomains": "Domaines valides", "webResource": "Ressource d'application web" }, "profileLabel": "Profil Microsoft", "profileSummary": { "needsRepair": "Le profil sélectionné nécessite une réparation", "none": "Aucun profil sélectionné" }, "section": { "allowedActions": "Actions autorisées", "capabilities": "Capacités", "notifications": "Notifications" }, "selectProfile": "Sélectionner un profil", "statusMessage": { "activated": "Configuration Teams activée.", "deactivated": "Configuration Teams désactivée.", "packageDownloaded": "Package d'application Teams téléchargé.", "packageGenerated": "Package d'application Teams généré.", "saved": "Configuration Teams enregistrée." }, "title": "Microsoft Teams", "diagnostics": { "title": "Diagnostics et message de test", "description": "Vérifiez la configuration de Teams et envoyez un message de test proactif à votre conversation de bot Teams.", "run": "Exécuter les diagnostics", "running": "Exécution en cours...", "sendTest": "Envoyer un message de test", "sending": "Envoi en cours...", "disabled": "Les diagnostics et les messages de test sont disponibles une fois l'intégration Teams active.", "completedAt": "Terminé {{time}}", "lastSuccess": "Dernière réussite", "lastFailure": "Dernier échec", "noneRecorded": "Aucun enregistrement", "recommendations": "Recommandations", "status": { "pass": "Réussite", "warn": "Avertissement", "fail": "Échec", "skip": "Ignoré" }, "errors": { "run": "Échec de l'exécution des diagnostics Teams", "testMessage": "Échec de l'envoi du message de test Teams" }, "test": { "sent": "Message de test Teams envoyé.", "failed": "Échec du message de test Teams.", "addonInactive": "Le module complémentaire Teams n'est pas actif pour ce locataire.", "integrationInactive": "Activez l'intégration Teams avant d'envoyer un message de test.", "capabilityDisabled": "Activez la fonctionnalité de bot personnel avant d'envoyer un message de test.", "botNotConfigured": "Configurez les identifiants du bot Teams avant d'envoyer un message de test.", "missingUserLinkage": "Liez votre compte Microsoft avant d'envoyer un message de test Teams.", "missingConversationReference": "Ouvrez le bot Alga PSA dans Teams et envoyez-lui d'abord un message, puis réessayez.", "skipped": "Le message de test Teams a été ignoré." }, "steps": { "addonEntitlement": "Droit au module complémentaire Teams", "integrationStatus": "État de l'intégration Teams", "capabilities": "Fonctionnalités Teams", "microsoftProfile": "Disponibilité du profil Microsoft", "recordingPermissions": "Autorisations d'enregistrement et de transcription Teams", "packageMetadata": "Métadonnées du package Teams", "botConnector": "Identifiants du connecteur de bot", "userLinkage": "Liaison du compte Microsoft de l'administrateur", "conversationReference": "Référence de conversation Teams de l'administrateur", "recentDeliveryHealth": "Santé récente de la distribution Teams" }, "recommendation": { "addon": "Activez le module complémentaire Microsoft Teams pour ce locataire.", "activate": "Activez l'intégration Teams dans les paramètres.", "capabilities": "Activez le bot personnel et les notifications d'activité pour Teams.", "profile": "Sélectionnez un profil Microsoft prêt pour Teams.", "activeProfile": "Sélectionnez un profil Microsoft actif pour Teams.", "profileCredentials": "Complétez les identifiants du profil Microsoft avant d'activer Teams.", "meetingOrganizer": "Configurez l'organisateur de réunion Teams par défaut dans les paramètres Teams.", "meetingOrganizerObjectId": "Enregistrez à nouveau l'organisateur de réunion Teams par défaut afin qu'Alga PSA puisse résoudre son ID d'objet Microsoft Entra.", "package": "Générez le package de l'application Teams avant d'exécuter la validation de bout en bout.", "baseUrl": "Régénérez le package Teams avec une URL de base accessible.", "botEnv": "Configurez TEAMS_BOT_APP_ID, TEAMS_BOT_APP_TENANT_ID et TEAMS_BOT_APP_PASSWORD.", "userLinkage": "Liez votre compte Microsoft dans les paramètres de votre profil.", "conversationReference": "Ouvrez le bot Alga PSA dans Teams et envoyez-lui d'abord un message, puis réessayez.", "deliveryFailure": "Examinez le dernier échec de distribution Teams et réessayez après avoir corrigé la cause." } }, "meetings": { "title": "Réunions en ligne et enregistrements", "description": "Utilisez un seul compte de service Microsoft pour organiser les réunions Teams et contrôler la conservation des enregistrements.", "organizer": { "label": "UPN de l'organisateur de réunion par défaut", "placeholder": "scheduler@acme.com", "help": "L'enregistrement résout et stocke l'ID d'objet Microsoft Entra utilisé pour les appels de réunion Graph.", "resolved": "ID d'objet résolu : {{objectId}}" }, "downloadRecordings": { "label": "Télécharger les enregistrements vers le stockage interne", "description": "Lorsque cette option est activée, les blobs d'enregistrement sont copiés dans le stockage du locataire, en plus du proxy Graph authentifié." }, "exposeRecordingsInPortal": { "label": "Afficher les enregistrements et les transcriptions dans le portail client", "description": "Désactivé par défaut ; les utilisateurs MSP peuvent toujours consulter les artefacts depuis les détails des interactions et des rendez-vous." } } } }, "xero": { "csv": { "clientSync": { "cancel": "Annuler", "createNew": "Créer de nouveaux clients", "description": "Exporter les clients au format CSV Xero Contacts ou importer les contacts depuis Xero.", "errorRow": "Ligne {{row}} : {{name}} - {{error}}", "errors": { "export": "Échec de l'export des clients", "import": "Échec de l'import des clients", "processCsv": "Échec du traitement du fichier CSV" }, "errorsTitle": "Erreurs ({{count}})", "exportButton": "Exporter les clients en CSV", "exportClients": "Exporter les clients", "exportDescription": "Exportez vos clients Alga dans un fichier CSV qui peut être importé dans Xero en tant que Contacts.", "exportSuccess": "{{count}} clients exportés vers {{filename}}", "importCompleteDescription": "{{count}} contacts traités avec succès.", "importCompleteTitle": "Import terminé", "importContacts": "Importer les contacts", "importContactsButton": "Importer {{count}} contacts", "importDescription": "Importer des contacts depuis un export CSV Xero Contacts. Les clients existants peuvent être rapprochés et mis à jour.", "importing": "Import des contacts...", "matchBy": { "algaClientId": "ID client Alga (depuis la catégorie de suivi)", "contactName": "Nom du contact", "emailAddress": "Adresse e-mail" }, "matchByLabel": "Rapprocher les contacts par :", "moreErrors": "...et {{count}} erreurs supplémentaires", "preview": { "columns": { "action": "Action", "contactName": "Nom du contact", "email": "E-mail", "matchedClient": "Client rapproché" }, "moreWarnings": "...et {{count}} supplémentaires", "showing20of": "Affichage de 20 lignes sur {{count}}", "toCreate": "À créer", "toSkip": "À ignorer", "toUpdate": "À mettre à jour", "warnings": "Avertissements" }, "processing": "Traitement de {{filename}}...", "result": { "created": "Créés", "mappings": "Mappages", "skipped": "Ignorés", "updated": "Mis à jour" }, "selectCsvFile": "Sélectionner un fichier CSV", "startNewImport": "Démarrer un nouvel import", "title": "Synchronisation des clients", "updateExisting": "Mettre à jour les clients existants", "workflow": { "s1": "Exporter les clients depuis Alga vers un CSV Xero Contacts", "s2": "Importer le CSV dans Xero (Contacts → Import)", "s3": "Après modifications dans Xero, exporter les contacts depuis Xero", "s4": "Réimporter le CSV des contacts Xero dans Alga pour synchroniser les mises à jour" }, "workflowTitle": "Flux de synchronisation des clients" }, "settings": { "dateFormat": "Format de date", "dateFormatHelp": "Faites correspondre ceci aux paramètres régionaux de votre Xero.", "dateFormatOptions": { "dmy": "JJ/MM/AAAA (Jour/Mois/Année)", "mdy": "MM/JJ/AAAA (Mois/Jour/Année)" }, "defaultCurrency": "Devise par défaut", "defaultCurrencyHelp": "Laissez vide pour utiliser la devise de la facture.", "errors": { "load": "Échec du chargement des paramètres", "save": "Échec de l'enregistrement des paramètres" }, "exportSettings": { "description": "Configurer la façon dont les factures sont exportées au format CSV pour Xero.", "title": "Paramètres d'export CSV" }, "loading": "Chargement des paramètres CSV Xero...", "managedPrefix": "Allez dans", "managedSuffix": "pour sélectionner des factures, générer des exports CSV Xero, importer des rapports fiscaux et gérer les lots.", "mappings": { "description": "Mappez les clients, services et codes fiscaux Alga aux identifiants utilisés dans votre organisation Xero. Ces valeurs sont utilisées lors de la génération de l'export CSV.", "title": "Mappages CSV Xero" }, "overview": { "description": "Exporter les factures au format CSV pour un import manuel dans Xero et importer les données fiscales depuis les rapports Xero.", "exportLabel": "Export", "exportText": "Générer des fichiers CSV compatibles avec la fonction d'import de factures de Xero", "intro": "Cette intégration offre une alternative à la connectivité Xero basée sur OAuth :", "note": "Remarque : configurez les mappages ci-dessous avant d'exporter. Les exports CSV et les imports de taxes sont gérés depuis Facturation → Exports comptables.", "taxImportLabel": "Import de taxes", "taxImportText": "En cas d'utilisation d'un calcul fiscal externe, importer les montants de taxe depuis le rapport Xero Invoice Details", "title": "Intégration CSV Xero" }, "savedMessage": "Paramètres enregistrés avec succès", "selectCurrency": "Sélectionner une devise", "setup": { "acknowledge": "J'ai terminé la configuration", "description": "Effectuez ces étapes dans Xero avant d'utiliser l'import/export CSV.", "externalInvoiceId": "ID externe de facture", "externalInvoiceIdHelp": "Les options seront créées automatiquement lors de l'import", "sourceSystem": "Système source", "sourceSystemHelp": "Ajoutez une option nommée", "step1Description": "Dans Xero, allez dans Settings → Tracking Categories et créez ces deux catégories :", "step1Title": "Étape 1 : Créer les catégories de suivi", "step2Description": "Assurez-vous que votre organisation Xero a les taux de taxe dont vous avez besoin configurés dans Settings → Tax Rates.", "step2Title": "Étape 2 : Configurer les taux de taxe", "step3Description": "Utilisez la section de mappage ci-dessous pour lier vos services Alga aux codes d'article Xero, et vos régions fiscales aux taux de taxe Xero.", "step3Title": "Étape 3 : Mapper les services et les régions fiscales", "title": "Configuration Xero requise" }, "useInvoiceCurrency": "Utiliser la devise de la facture", "workflow": { "description": "Comment exporter les factures et importer les calculs fiscaux.", "export": { "s1": "Allez dans Facturation → Exports comptables", "s2": "Sélectionnez des factures et choisissez « Xero CSV » comme adaptateur", "s3": "Téléchargez le fichier CSV généré", "s4": "Dans Xero : Business → Invoices → Import", "s5": "Téléversez le CSV et importez comme factures brouillons", "s6": "Xero calculera la taxe selon vos paramètres fiscaux" }, "exportInvoices": "Exporter les factures", "import": { "s1": "Dans Xero : Reports → All Reports → Invoice Details", "s2": "Définissez la plage de dates et exportez au format CSV", "s3": "Dans Alga : Facturation → Exports comptables → Importer les taxes", "s4": "Téléversez le CSV du rapport Xero", "s5": "Vérifiez les factures rapprochées et confirmez l'import" }, "importTax": "Importer les calculs fiscaux", "title": "Flux CSV", "trackingDescription": "L'export CSV inclut des colonnes de catégories de suivi qui relient chaque facture Xero à sa source Alga. Lors de l'import des taxes depuis Xero, ces catégories de suivi permettent de rapprocher automatiquement les factures, sans rapprochement manuel.", "trackingTitle": "Catégories de suivi pour le rapprochement" } } }, "live": { "defaultOrganisation": "Organisation Xero par défaut" }, "settings": { "actions": { "connect": "Connecter Xero", "disconnect": "Déconnecter Xero", "disconnecting": "Déconnexion…", "reconnect": "Reconnecter Xero", "refresh": "Actualiser", "saveCredentials": "Enregistrer les identifiants Xero", "saving": "Enregistrement…" }, "badges": { "connectionExpired": "Connexion expirée", "credentialsReady": "Identifiants prêts", "credentialsRequired": "Identifiants requis", "defaultConnected": "Organisation par défaut connectée", "noOrganisation": "Aucune organisation connectée" }, "callback": { "accessDenied": "L'accès Xero a été refusé avant la fin de la connexion.", "configMissing": "Impossible de démarrer Xero OAuth car le client ID et le client secret du tenant n'étaient pas entièrement configurés.", "connectionsUnmapped": "Xero a retourné des organisations, mais aucune n'incluait les identifiants requis pour enregistrer une connexion.", "generic": "Xero a retourné une erreur OAuth : {{code}}", "invalidState": "L'état OAuth Xero était invalide ou expiré. Relancez le flux de connexion.", "missingParams": "Des paramètres requis étaient absents du rappel Xero. Relancez le flux de connexion.", "noConnections": "Xero n'a retourné aucune organisation pour cette connexion. Vérifiez votre application Xero et l'accès aux organisations, puis réessayez.", "oauthFailed": "Le rappel OAuth Xero a échoué. Essayez de vous reconnecter. Si le problème persiste, vérifiez votre redirect URI et vos scopes." }, "clientIdLabel": "Xero Client ID", "clientIdPlaceholder": "Collez votre Xero Client ID propre au tenant", "clientSecretLabel": "Xero Client Secret", "clientSecretPlaceholder": "Collez votre Xero Client Secret propre au tenant", "connectSuccess": "Xero connecté avec succès. La première organisation connectée est désormais le contexte Xero live par défaut.", "connection": { "connectionId": "ID de connexion : {{id}}", "defaultOrganisation": "Organisation par défaut", "description": "Ne démarrez OAuth qu'après avoir configuré l'application Xero propre au tenant. La déconnexion supprime les jetons d'accès Xero enregistrés mais conserve les identifiants de l'application propre au tenant.", "notConnected": "Aucune organisation Xero live n'est encore connectée. Enregistrez les identifiants, puis cliquez sur Connecter Xero.", "title": "Connexion Xero live", "unknown": "inconnu" }, "credentialsSaved": "Identifiants Xero enregistrés. Vous pouvez maintenant lancer le flux OAuth Xero live.", "csvAvailableMiddle": "dans cette même section Comptabilité et gérez les exports depuis", "csvAvailablePrefix": "Si vous préférez un flux manuel, continuez à utiliser", "csvAvailableTitle": "Xero CSV reste disponible", "description": "Configurez les identifiants OAuth Xero propres au tenant, connectez votre organisation par défaut et conservez Xero live aux côtés du flux manuel Xero CSV.", "disconnectSuccess": "La connexion Xero enregistrée a été supprimée. Les identifiants de l'application Xero propres au tenant ont été préservés.", "errors": { "disconnect": "Échec de la déconnexion de Xero.", "load": "Échec du chargement des paramètres Xero.", "saveCredentials": "Échec de l'enregistrement des identifiants Xero." }, "howItWorksDescription": "Enregistrez ici un Xero Client ID et un Client Secret propres au tenant, terminez le flux OAuth Xero et Alga PSA utilisera la première organisation Xero connectée comme contexte live par défaut.", "howItWorksTitle": "Comment fonctionne Xero live dans cette version", "loading": "Chargement des paramètres Xero…", "mapping": { "alert": "Les articles, comptes de revenus, taux de taxe et catégories de suivi Xero sont chargés depuis l'organisation par défaut connectée afin que les exports live puissent continuer à utiliser la première connexion Xero enregistrée en v1.", "descriptionPrefix": "Configurez les mappages Xero live pour l'organisation par défaut connectée. Ces mappages sont limités à", "placeholderAlert": "Le gestionnaire de mappages devient disponible une fois la première organisation Xero connectée et définie comme contexte Xero live par défaut.", "placeholderDescription": "Connectez une organisation Xero live avant de configurer les mappages d'articles et de taxes Xero live.", "title": "Mappage et configuration Xero live" }, "noClientId": "Aucun client ID n'est encore enregistré pour ce tenant.", "noClientSecret": "Aucun client secret n'est encore enregistré pour ce tenant.", "redirectUri": "Redirect URI", "requiredScopes": "Scopes requis", "storedClientId": "Client ID enregistré : {{value}}", "storedClientSecret": "Client secret enregistré : {{value}}", "tenantOauthDescription": "Collez les identifiants de l'application Xero enregistrés pour ce tenant. Les valeurs de secret ne sont jamais renvoyées au navigateur après l'enregistrement.", "tenantOauthTitle": "Application OAuth propre au tenant", "title": "Xero", "xeroCsv": "Xero CSV" } }, "stripe": { "title": "Stripe Payments", "description": "Accept credit card payments for your invoices", "connected": { "title": "Stripe Connected", "publishableKey": "Publishable key: {{key}}..." }, "empty": { "description": "Connect your Stripe account to accept online payments for invoices" }, "actions": { "testConnection": "Test Connection", "disconnect": "Disconnect", "connect": "Connect Stripe", "connecting": "Connecting...", "cancel": "Cancel" }, "form": { "secretKeyLabel": "Secret Key", "secretKeyPlaceholder": "sk_live_... or sk_test_...", "publishableKeyLabel": "Publishable Key", "publishableKeyPlaceholder": "pk_live_... or pk_test_...", "findKeyPrefix": "Find this in your", "dashboardLink": "Stripe Dashboard → API Keys" }, "webhook": { "heading": "Webhook Configuration", "configuredAutomatically": "Webhooks configured automatically", "receiveNotifications": "Alga PSA will receive payment notifications for:", "failedTitle": "Webhook configuration failed", "failedBody": "Automatic webhook configuration failed. Click retry to attempt configuration again.", "configuring": "Configuring...", "retry": "Retry Configuration" }, "disconnectDialog": { "title": "Disconnect Stripe", "message": "Are you sure you want to disconnect Stripe? Payment links will no longer work.", "confirm": "Disconnect", "cancel": "Cancel" }, "toasts": { "connectedWithWebhook": "Stripe connected and webhooks configured automatically!", "connectedWebhookFailed": "Stripe connected! Note: Webhook auto-configuration failed - you may need to configure webhooks manually in Stripe Dashboard.", "disconnected": "Stripe disconnected", "connectionSuccess": "Connection successful!", "webhookConfigured": "Webhook configured successfully!" }, "errors": { "loadConfig": "Failed to load Stripe configuration", "connect": "Failed to connect Stripe", "disconnect": "Failed to disconnect Stripe", "testConnection": "Connection test failed", "configureWebhook": "Failed to configure webhook", "bothKeysRequired": "Please enter both secret key and publishable key", "secretKeyFormat": "Secret key should start with sk_", "publishableKeyFormat": "Publishable key should start with pk_" } } }, "ninjaone": { "selectCompany": "Sélectionner une entreprise" } }