diff --git a/scripts/translations/translator.py b/scripts/translations/translator.py index f4cb2fb121..f6af7ac1a8 100644 --- a/scripts/translations/translator.py +++ b/scripts/translations/translator.py @@ -129,6 +129,30 @@ TERMS = { "records", "zh-CN": "流水线", "zh-TW": "管線", + "fr-FR": "pipeline", + }, + "downtime": { + "sense": "a scheduled window that mutes alert notifications (a maintenance " + "window) — never an outage or unavailability", + "fr-FR": "période de maintenance", + }, + "burn rate": { + "sense": "how fast an SLO's error budget is being spent — never combustion", + "fr-FR": "taux d'épuisement", + }, + "page": { + "sense": "in on-call: a notification that summons a responder, and the " + "record it opens — not a web page", + "fr-FR": "notification", + }, + "scorer": { + "sense": "an evaluator that grades LLM output — never a sports scorer", + "fr-FR": "évaluateur", + }, + "RUM": { + "sense": "Real User Monitoring, a product module name — keep the " + "acronym 'RUM' wherever the source says RUM", + "fr-FR": "RUM", }, "destination": { "sense": "a configured endpoint that alerts or pipeline output are " @@ -489,6 +513,12 @@ def _system_prompt(locale, module_terms): "- Copy vue-i18n literal escapes verbatim: {'@'}, {'{'}, {'}'}, {'|'} — keep the " "quotes and braces exactly, never translate or unescape them.\n" "- Keep any HTML tags, markdown, and URLs intact.\n" + "- Keep quoted code literals verbatim — field names, enum values and query " + "values in quotes ('metrics', 'role', level = 'error') are typed by users " + "and must not be translated.\n" + "- A short label that starts with a verb ('Copy Key', 'Import dashboard', " + "'Search Role') is an action: translate it as a command, never as a noun " + "phrase.\n" "- Do not translate the product name 'OpenObserve' or other proper nouns/brand names.\n" "- Preserve leading/trailing whitespace and terminal punctuation.\n" "- Produce natural, concise wording appropriate for buttons, labels, and short UI messages.\n" diff --git a/web/src/locales/languages/fr-FR.json b/web/src/locales/languages/fr-FR.json index 755be52ef0..f83515c9a4 100644 --- a/web/src/locales/languages/fr-FR.json +++ b/web/src/locales/languages/fr-FR.json @@ -64,14 +64,14 @@ "noPatterns": { "title": "Aucun motif n'a été trouvé", "description": "Essayez d'augmenter la plage de temps ou de sélectionner un autre flux contenant davantage de données de journal. L'extraction de motifs fonctionne mieux avec au moins 1 000 journaux.", - "logsAnalyzed": "Seuls les journaux {count} ont été analysés." + "logsAnalyzed": "Seuls {count} logs ont été analysés." }, "noStreamSelected": { "title": "Sélectionnez un stream pour commencer", "description": "Choisissez un flux, puis exécutez votre requête pour explorer ses données. Affinez les résultats à l'aide de filtres et d'une plage de temps personnalisée." }, "noQueryApplied": { - "title": "Exécutez une requête pour voir les journaux", + "title": "Exécutez une requête pour voir les résultats", "description": "Ajustez vos filtres et cliquez sur « Exécuter la requête » pour charger les événements pour ce flux.", "action": "Exécuter une requête", "actionDesc": "Charger des événements pour les filtres sélectionnés" @@ -85,7 +85,7 @@ "description": "Les tableaux de bord regroupent vos métriques, logs et traces dans une seule vue. Créez-en un pour commencer.", "action": "Nouveau tableau de bord", "actionDesc": "Commencez à partir d'un canevas vide", - "import": "Tableau de bord d'importation", + "import": "Importer un tableau de bord", "importDesc": "Charger un fichier JSON de tableau de bord", "templates": "Parcourir les modèles", "templatesDesc": "Commencez à partir d'un tableau de bord communautaire" @@ -95,7 +95,7 @@ "description": "Ce dossier est vide. Ajoutez un tableau de bord ici ou déplacez-en un depuis un autre dossier.", "action": "Nouveau tableau de bord", "actionDesc": "Créez un tableau de bord dans ce dossier", - "import": "Tableau de bord d'importation", + "import": "Importer un tableau de bord", "importDesc": "Charger un fichier JSON de tableau de bord", "templates": "Parcourir les modèles", "templatesDesc": "Commencez à partir d'un tableau de bord communautaire" @@ -104,7 +104,7 @@ "title": "Pas encore de groupes", "description": "Les groupes vous permettent de gérer les autorisations de plusieurs utilisateurs à la fois. Créez-en un pour commencer.", "action": "Nouveau groupe", - "actionDesc": "Création d'un groupe d'utilisateurs" + "actionDesc": "Créer un groupe d'utilisateurs" }, "noRoles": { "title": "Aucun rôle pour l'instant", @@ -116,7 +116,7 @@ "title": "Aucune détection d'anomalie configurée", "description": "Configurez la détection des anomalies pour identifier automatiquement les tendances inhabituelles dans vos données.", "action": "Nouvelle configuration", - "actionDesc": "Configuration de la détection des anomalies" + "actionDesc": "Configurer la détection des anomalies" }, "noApiLimits": { "title": "Aucune limite d'API configurée", @@ -154,27 +154,27 @@ "title": "Aucune destination pour l'instant.", "description": "Cibles externes pour la sortie du pipeline : points de terminaison HTTP et cibles d'écriture distantes.", "action": "Nouvelle destination", - "actionDesc": "Connecter une destination de canalisation" + "actionDesc": "Connecter une destination de pipeline" }, "noAlertTemplates": { "title": "Pas encore de modèles", "description": "Les modèles définissent le format des messages de notification d'alerte.", "action": "Nouveau modèle", - "actionDesc": "Création d'un modèle de notification", - "import": "Modèle d'importation", + "actionDesc": "Créer un modèle de notification", + "import": "Importer un modèle", "importDesc": "Importer depuis un fichier JSON" }, "noEvalTemplates": { "title": "Aucun modèle d'évaluation pour le moment", "description": "Les modèles d'évaluation définissent des critères de notation réutilisables pour les évaluations LLM.", "action": "Nouveau modèle", - "actionDesc": "Création d'un modèle d'évaluation" + "actionDesc": "Créer un modèle d'évaluation" }, "noEnrichmentTables": { "title": "Pas encore de tables d'enrichissement", "description": "Les tableaux d'enrichissement vous permettent de joindre un contexte supplémentaire aux données de votre journal au moment de la requête.", "action": "Nouveau tableau", - "actionDesc": "Création d'un tableau d'enrichissement" + "actionDesc": "Créer une table d'enrichissement" }, "noCipherKeys": { "title": "Pas encore de clé de chiffrement", @@ -192,7 +192,7 @@ "title": "Aucun fournisseur LLM configuré", "description": "Connectez un fournisseur de modèles linguistiques pour activer les fonctionnalités basées sur l'IA.", "action": "Ajouter un fournisseur", - "actionDesc": "Configuration d'un fournisseur LLM" + "actionDesc": "Configurer un fournisseur LLM" }, "noDiscoveredServices": { "title": "Aucun service n'a été découvert", @@ -213,11 +213,11 @@ "description": "Les tâches de remblayage retraitent les données historiques via un pipeline. Exécutez-en un pour commencer." }, "noRegexPatterns": { - "title": "Pas encore de modèles regex", + "title": "Pas encore de motifs regex", "description": "Créez un modèle réutilisable pour supprimer les données sensibles ou importez-en un depuis votre bibliothèque.", "action": "Nouveau motif", "actionDesc": "Définir un nouveau modèle de regex", - "import": "Modèle d'importation", + "import": "Importer un motif", "importDesc": "Réutilisez un modèle de votre bibliothèque" }, "noNamedEvents": { @@ -235,7 +235,7 @@ "noStorageConfig": { "title": "Aucun compartiment n'est configuré", "description": "Acheminez les données de cette organisation vers un compartiment dédié, indépendamment des autres organisations et des valeurs par défaut globales.", - "action": "Configuration du stockage", + "action": "Configurer le stockage", "actionDesc": "Connectez un compartiment S3, GCS ou Azure" }, "noPhoneProvider": { @@ -259,7 +259,7 @@ "description": "Les pipelines transforment et acheminent vos données au fur et à mesure de leur arrivée. Configurez-en un pour commencer à façonner vos streams.", "action": "Nouveau gazoduc", "actionDesc": "Créez un flux à partir de zéro", - "import": "Pipeline d'importation", + "import": "Importer un pipeline", "importDesc": "Télécharger une définition de pipeline" }, "noQueues": { @@ -327,18 +327,18 @@ "actionDesc": "Étiquetez les spans avec gen_ai_conversation_id" }, "noScorers": { - "title": "Aucun buteur pour l'instant", + "title": "Aucun évaluateur pour l'instant", "description": "Les évaluateurs évaluent les réponses LLM en fonction de vos configurations de score : commencez par un juge LLM ou importez-en un depuis la bibliothèque.", - "action": "Nouveau buteur", - "actionDesc": "Définissez un juge LLM ou un marqueur à distance", - "import": "Marqueur d'importation", + "action": "Nouvel évaluateur", + "actionDesc": "Définissez un juge LLM ou un évaluateur distant", + "import": "Importer un évaluateur", "importDesc": "Importer depuis un fichier JSON" }, "noEvalJobs": { "title": "Aucun poste d'évaluation pour le moment", - "description": "Les jobs planifient les buteurs par rapport à un stream LLM. Créez-en un pour commencer à évaluer les conversations selon une cadence.", + "description": "Les tâches exécutent des évaluateurs sur un flux LLM selon un planning. Créez-en une pour commencer à noter les conversations à intervalles réguliers.", "action": "Nouvel emploi", - "actionDesc": "Choisissez un stream + des buteurs + une cadence" + "actionDesc": "Choisissez un flux + des évaluateurs + une cadence" }, "noScoreConfigs": { "title": "Aucune configuration de score pour le moment", @@ -475,7 +475,7 @@ "evalJobs": "tâches d'évaluation", "scoreConfigs": "configurations de score", "pipelineHistory": "historique du pipeline", - "regexPatterns": "modèles regex", + "regexPatterns": "motifs regex", "namedEvents": "événements nommés", "savedFunnels": "entonnoirs enregistrés", "monitors": "superviseurs", @@ -513,8 +513,8 @@ "actionDesc": "Choisissez dans votre organisation ou collez une liste d'e-mails" }, "noOncallResponses": { - "title": "Aucun incident en cours", - "description": "Les incidents ouverts apparaissent ici dès qu'une alerte est acheminée vers une équipe." + "title": "Aucune notification en cours", + "description": "Les notifications ouvertes apparaissent ici dès qu'une alerte est acheminée vers une équipe." }, "noOncallRules": { "title": "Aucune règle de propriété pour le moment", @@ -568,9 +568,9 @@ "actionDesc": "Pointez OpenObserve vers votre point de terminaison et testez la connexion." }, "noDowntimes": { - "title": "Aucune indisponibilité pour l'instant", - "description": "Une indisponibilité laisse les alertes, les détections d'anomalies et les contrôles synthétiques s'exécuter et suspend leurs notifications pendant une plage que vous planifiez.", - "action": "Planifier une indisponibilité", + "title": "Aucune période de maintenance pour l'instant", + "description": "Une période de maintenance laisse les alertes, les détections d'anomalies et les contrôles synthétiques s'exécuter et suspend leurs notifications pendant une plage que vous planifiez.", + "action": "Planifier une période de maintenance", "actionDesc": "Ponctuelle, quotidienne ou hebdomadaire. Pour un silence rapide, utilisez Mettre en sourdine dans la liste des alertes." }, "searchCancelled": { @@ -639,7 +639,7 @@ "ok": "Ok", "apply": "Appliquer", "goBack": "Retourner", - "stopGenerating": "Arrêtez de générer", + "stopGenerating": "Arrêter la génération", "set": "+ Ensemble", "startTime": "Heure de début", "endTime": "Heure de fin", @@ -707,7 +707,7 @@ "noOfRecords": "Nombre d'enregistrements :", "attributes": "Attributs", "events": "Évènements", - "goHome": "Rentrez chez vous", + "goHome": "Retour à l'accueil", "redirectingHome": "Redirection vers la page d'accueil dans {countdown} secondes...", "name": "Nom", "add": "Ajouter", @@ -741,7 +741,7 @@ "other": "Autre", "search": "Rechercher", "searchEllipsis": "Rechercher...", - "searchFields": "Champs de recherche", + "searchFields": "Rechercher des champs", "noMatchingRelativePresets": "Aucun préréglage correspondant", "reveal": "Révéler", "show": "Afficher", @@ -755,7 +755,7 @@ "collapse": "Réduire", "description": "Descriptif", "cancelChanges": "Annuler les modifications", - "logs": "Journaux", + "logs": "Logs", "addGroup": "Ajouter un groupe", "addCondition": "Ajouter une condition", "required": "La valeur est requise", @@ -991,11 +991,11 @@ "rows": "lignes", "resetFields": "Réinitialiser les champs de table sélectionnés", "metrics": "Métriques", - "selectIndex": "Sélectionnez Stream First", + "selectIndex": "Sélectionnez d'abord un flux", "selectStreamFirst": "Sélectionnez d'abord un flux", - "selectLogsStreamFirst": "Sélectionnez d'abord Logs stream", + "selectLogsStreamFirst": "Sélectionnez d'abord un flux de logs", "searchField": "Rechercher un champ", - "searchDimension": "Dimensions de recherche", + "searchDimension": "Rechercher des dimensions", "maxRecords": "Nombre maximum d'enregistrements à renvoyer", "timestampWithTimezone": "horodatage ({timezone})", "noResult": "Aucun résultat", @@ -1032,7 +1032,7 @@ "patternVariablesWithCount": "Variables ({count})", "patternVariableNameColumn": "Nom de la variable", "patternVariableTypeColumn": "Tapez", - "patternExampleLogsWithCount": "Exemples de journaux ({count})", + "patternExampleLogsWithCount": "Exemples de logs ({count})", "patternNavPrevious": "Précédent", "patternNavNext": "Suivant", "patternNoValuesAvailable": "Aucune valeur disponible", @@ -1100,7 +1100,7 @@ "clickHere": "cliquez ici" }, "legendLabel": "Légende", - "switchToLogs": "Revenir aux journaux", + "switchToLogs": "Revenir aux Logs", "savedViewsLabel": "Vues enregistrées", "savedViewsNotFound": "La vue enregistrée n'a pas été trouvée !", "savedViewName": "Afficher le nom", @@ -1110,7 +1110,7 @@ "updateSavedViewWithCurrent": "Mettre à jour cette vue avec la recherche actuelle", "pinToToolbar": "Ajouter à la barre d'outils", "unpinFromToolbar": "Détacher de la barre d'outils", - "shareLink": "Lien de partage", + "shareLink": "Partager le lien", "downloadTable": "Télécharger le tableau", "customRange": "Gamme personnalisée", "initialNumber": "Numéro initial", @@ -1139,7 +1139,7 @@ "one": "Montrez-moi les erreurs de la dernière heure...", "two": "Trouvez des requêtes lentes qui prennent plus de 5 secondes...", "three": "Comptez 5xx réponses regroupées par service...", - "four": "Filtrer les journaux où level = « erreur »..." + "four": "Filtrer les logs où level = 'error'…" }, "enterPrompt": "Entrez une invite pour générer une requête", "enterFunctionPrompt": "Entrez une invite pour générer une fonction", @@ -1165,7 +1165,7 @@ "flattened": "Aplati", "original": "Original", "resetFilters": "Réinitialiser les filtres", - "redirect_to_logs_page": "Retourner à la page des journaux", + "redirect_to_logs_page": "Retourner à la page Logs", "visualize": "Visualisez", "enableSqlModeOrSelectSingleStream": "Veuillez activer le mode SQL pour visualiser", "drillDown": "Exploration détaillée", @@ -1226,7 +1226,7 @@ "showEditor": "Afficher l'éditeur {type}", "selectedFunctionTooltip": "Fonction : {name}", "addToDashboard": "Ajouter au tableau de bord", - "selectStream": "Sélectionnez Stream", + "selectStream": "Sélectionnez un flux", "pattern_summary": "Affichage de 1 à 50 événements sur {totalEvents} et des modèles {patternsFound} trouvés dans les événements {logsAnalyzed} en {totalTime} ms.", "histogramTitle": "Affichage de {start} à {end} sur {total} événements en {took} ms.", "histogramTitleWithScan": "Affichage de {start} à {end} sur {total} événements en {took} ms. ({scanLabel} : {scanSize})", @@ -1431,11 +1431,11 @@ "incidents": "Incidents", "docs": "Docs", "billings": "Facturation", - "rum": "Surveillance réelle des utilisateurs", + "rum": "RUM", "settings": "Réglages", "iam": "IAM", "report": "Rapports", - "pipeline": "Canalisations", + "pipeline": "Pipelines", "workflows": "Workflows", "language": "Langue", "keyboardShortcuts": "Raccourcis clavier", @@ -1457,7 +1457,7 @@ "topQueries": "Requêtes principales", "profiles": "Profils", "productAnalytics": "Analytique produit", - "downtimes": "Indisponibilités", + "downtimes": "Périodes de maintenance", "trialEndedTitle": "Votre essai est terminé", "trialPageNeedsPlan": "{page} nécessite un plan", "trialPageNeedsPlanToast": "{page} nécessite un plan. Choisissez-en un sur cette page pour continuer à l'utiliser.", @@ -1553,7 +1553,7 @@ "zipFilesOnly": "Fichiers .zip uniquement", "from": "de", "to": "à", - "title": "Surveillance réelle des utilisateurs", + "title": "Surveillance des utilisateurs réels", "subtitle": "Surveillez les sessions utilisateur réelles, les erreurs et les performances frontend", "issueColumn": "Problème", "trendColumn": "Tendance", @@ -1666,7 +1666,7 @@ "seeSessions": "Voir les sessions", "openErrorTracking": "Ouvrir dans le suivi des erreurs", "insightFrustration": "{count} sessions font rage ou cliquent sans arrêt sur « {target} », probablement une interaction interrompue.", - "insightFrustrationWithView": "{count} sessions font rage ou ont cliqué sur « {target} » sur {view} avec le bouton « {target} » enfoncé. Il s'agit probablement d'une interaction interrompue.", + "insightFrustrationWithView": "{count} sessions ont fait des clics de rage ou des clics morts sur « {target} » dans {view} — probablement une interaction défaillante.", "insightError": "{count} sessions ont rencontré la même erreur : « {message} »", "insightErrorSpike": "Les sessions comportant des erreurs sont égales à {rate} × la période précédente ({count} dans cette fenêtre).", "activity": "Activité", @@ -1684,7 +1684,7 @@ "traces": "Traces", "searchEvents": "Rechercher des événements", "loadingSessions": "Tiens bon, on va chercher des séances.", - "errorStack": "Error Stack", + "errorStack": "Pile d'erreur", "sessionReplay": "Rediffusion de la session", "viewSessionReplay": "Afficher la rediffusion de la session", "playSessionReplay": "Replay de la session", @@ -2119,7 +2119,7 @@ "modeOnTooltip": "Part de la cohorte à nouveau active dans cette période exacte", "modeAfterTooltip": "Part de la cohorte active dans cette période ou toute période ultérieure", "cohortCaption": "Cohorte = première période de la plage avec l'événement de départ ; les utilisateurs actifs avant la plage sont comptés dans leur première période ici.", - "dataStart": "Les données de Surveillance réelle des utilisateurs commencent le {date}, donc aucune cohorte ne commence avant.", + "dataStart": "Les données RUM commencent le {date}, donc aucune cohorte ne commence avant.", "tooShort": "Choisissez une plage d'au moins 2 jours", "tooMany": "Choisissez une plage d'au plus 36 périodes", "legend": "Cellule : part de la cohorte à nouveau active dans la période N, dans le fuseau horaire {tz}. Les cellules hachurées sont encore en cours et sont exclues de la moyenne.", @@ -2149,8 +2149,8 @@ "create": "Créer un événement nommé", "save": "Enregistrer", "cancel": "Annuler", - "noAccess": "Votre rôle ne peut pas lire les données de Surveillance réelle des utilisateurs (le flux _rumdata)", - "readOnly": "Votre rôle peut consulter mais pas modifier les événements nommés (autorisation Surveillance réelle des utilisateurs Product Analytics)", + "noAccess": "Votre rôle ne peut pas lire les données RUM (le flux _rumdata)", + "readOnly": "Votre rôle peut consulter mais pas modifier les événements nommés (autorisation RUM Product Analytics)", "unreadable": "{count} événement nommé n'a pas pu être lu | {count} événements nommés n'ont pas pu être lus", "capReached": "Cette application contient {max} événements nommés, le maximum autorisé. Supprimez-en un pour en ajouter un autre.", "search": "Rechercher des événements nommés", @@ -2175,9 +2175,9 @@ "deleteMessage": "Supprimer « {name} » ? Les entonnoirs qui l'utilisent afficheront une étiquette d'étape supprimée.", "loadFailed": "Impossible de charger les événements nommés", "stepsUnavailable": "Impossible de charger les événements nommés ; les étapes qui en utilisent un les attendent avant de compter.", - "stepsForbidden": "Votre rôle ne peut pas lire les données de surveillance réelle des utilisateurs (le flux _rumdata), donc les étapes qui utilisent un événement nommé ne sont pas comptées.", + "stepsForbidden": "Votre rôle ne peut pas lire les données RUM (le flux _rumdata), donc les étapes qui utilisent un événement nommé ne sont pas comptées.", "seriesUnavailable": "Impossible de charger les événements nommés ; la tendance les attend avant de tracer une série d'événements nommés.", - "seriesForbidden": "Votre rôle ne peut pas lire les données de surveillance réelle des utilisateurs (le flux _rumdata), donc une série d'événements nommés n'est pas tracée.", + "seriesForbidden": "Votre rôle ne peut pas lire les données RUM (le flux _rumdata), donc une série d'événements nommés n'est pas tracée.", "saveFailed": "Impossible d'enregistrer l'événement nommé", "deleteFailed": "Impossible de supprimer l'événement nommé", "conflictReloaded": "Quelqu'un d'autre a modifié cet événement nommé ; il a été rechargé", @@ -2340,14 +2340,14 @@ "feature_comparision_good_news": "Bonne nouvelle : OpenObserve Enterprise Edition est totalement gratuite et permet d'ingérer jusqu'à 50 Go/jour (~1.5 To/mois) de données.", "feature_comparision_subtitle": "Comparez les fonctionnalités des offres Open Source, Enterprise et Cloud", "feature_column_name": "Fonctionnalité", - "feature_logs": "Journaux", + "feature_logs": "Logs", "feature_metrics": "Métriques", "feature_traces": "Traces", "feature_alerts": "Alertes", "feature_dashboards": "Tableaux de bord", "feature_reports": "Rapports", "feature_vrl_functions": "Fonctions VRL", - "feature_pipelines": "Canalisations", + "feature_pipelines": "Pipelines", "feature_high_availability": "Haute disponibilité", "feature_multitenancy": "Multilocation (organisations)", "feature_dynamic_schema": "Schéma dynamique et évolution du schéma", @@ -2365,7 +2365,7 @@ "feature_license": "Licence", "feature_support": "soutien", "feature_cost": "Coût", - "feature_pipelines_external": "Canalisations - Destinations externes", + "feature_pipelines_external": "Pipelines - Destinations externes", "feature_extreme_performance": "Performances extrêmes (amélioration de 100 fois pour de nombreuses requêtes)", "feature_query_optimizer": "Optimiseur de requêtes", "value_license_agpl": "AGPL", @@ -2406,7 +2406,7 @@ "update_license_key": "Mettre à jour la clé de licence", "paste_new_license_placeholder": "Collez la nouvelle clé de licence ici...", "your_complete_license_key": "Votre clé de licence complète :", - "copy_key": "Clé de copie", + "copy_key": "Copier la clé", "usage_information": "Informations d'utilisation", "license_allows_ingestion": "La licence actuelle permet l'ingestion de {limit} Go de données par jour.", "license_allows_unlimited_ingestion": "La licence actuelle permet une ingestion de données illimitée.", @@ -2453,7 +2453,7 @@ "offer_text": "Vous utilisez OpenObserve Enterprise avec toutes les fonctionnalités activées", "badge_text_unlimited": "Limite d'ingestion : Illimitée", "badge_text_limited": "Limite d'ingestion : {limit} Go / jour", - "features_title": "Fonctionnalités d'Active Enterprise", + "features_title": "Fonctionnalités Enterprise actives", "features_subtitle": "Toutes les fonctionnalités sont débloquées et prêtes à être utilisées", "primary_button_text": "Gérer la licence" }, @@ -2471,7 +2471,7 @@ "note": "Ingestion et analyse complètes des données d'observabilité" }, "rum": { - "note": "Surveillance réelle des utilisateurs pour les performances du frontend" + "note": "Surveillance des utilisateurs réels pour les performances du frontend" }, "alerts": { "name": "Alertes", @@ -2490,7 +2490,7 @@ "note": "{product} pour la transformation des données" }, "pipelines": { - "name": "Canalisations", + "name": "Pipelines", "note": "Pipelines de traitement et de transformation des données" }, "high_availability": { @@ -2540,7 +2540,7 @@ "note": "Protégez les informations personnelles et sensibles" }, "pipeline_remote_destinations": { - "name": "Canalisations - Destinations distantes", + "name": "Pipelines - Destinations distantes", "note": "Envoyer des données vers des destinations distantes" }, "query_optimizer": { @@ -2675,7 +2675,7 @@ "otel": "Application ou collecteur OpenTelemetry", "http": "Logs via HTTP", "cloud": "AWS, Azure ou GCP", - "rum": "Navigateur (Surveillance réelle des utilisateurs)", + "rum": "Navigateur (RUM)", "llm": "Application LLM ou IA", "agent": "Laisser un agent IA le configurer", "unsure": "Pas encore sûr" @@ -2771,7 +2771,7 @@ "createFailed": "Échec de la création du compte de service. Veuillez réessayer.", "updateFailed": "Échec de la mise à jour du compte de service. Veuillez réessayer.", "headerSubtitle": "Jetons d'accès programmatiques pour les API", - "search": "Compte de service de recherche", + "search": "Rechercher un compte de service", "rotate": "Faire pivoter le jeton", "deleteServiceAccount": "Supprimer le compte de service", "update": "Mettre à jour le compte de service", @@ -2847,7 +2847,7 @@ "deleteError": "Erreur lors de la suppression du compte de service.", "rotateError": "Erreur lors de la rotation du jeton.", "bulkDeleteError": "Erreur lors de la suppression des comptes de service.", - "bulkDeleteSuccess": "Compte(s) de service supprimé(s) : {count}.", + "bulkDeleteSuccess": "{count} compte de service supprimé. | {count} comptes de service supprimés.", "bulkDeletePartial": "{count} compte de service supprimé ; {failed} échec. | {count} comptes de service supprimés ; {failed} échecs.", "bulkDeleteFailed": "Échec de la suppression de {count} compte de service. | Échec de la suppression de {count} comptes de service." } @@ -2886,8 +2886,8 @@ "update": "Mettre à jour", "delete": "Supprimer", "userName": "Nom d'utilisateur", - "searchRole": "Rôle de recherche", - "searchGroup": "Groupe de recherche", + "searchRole": "Rechercher un rôle", + "searchGroup": "Rechercher un groupe d'utilisateurs", "serviceAccounts": "Comptes de service", "ingestionTokens": "Jetons d'ingestion", "syntheticsTokens": "Jetons de synthèse", @@ -2971,7 +2971,7 @@ "moduleGroupData": "Données", "moduleGroupDashboards": "Tableaux de bord et rapports", "moduleGroupAlerting": "Alertes", - "moduleGroupPipelines": "Canalisations et Workflows", + "moduleGroupPipelines": "Pipelines et workflows", "moduleGroupMonitoring": "Surveillance", "moduleGroupAi": "Observabilité de l'IA", "moduleGroupAccess": "Accès", @@ -2991,7 +2991,7 @@ "scopeCoveredByParent": "Les actions verrouillées proviennent de {scope}, défini dans {module}", "scopeAllOf": "Tous les {module}", "scopeIncludesFuture": "Inclut les ressources créées ultérieurement", - "scopeDowntimeHint": "Un dossier d'indisponibilité limite qui gère une indisponibilité, et non ce qu'elle met en sourdine. Pour mettre en sourdine tous les dossiers d'un module, un utilisateur doit avoir le droit de lister chaque dossier de ce module. Les badges et bannières en sourdine peuvent nommer une indisponibilité qu'un utilisateur ne peut pas lister.", + "scopeDowntimeHint": "Un dossier de périodes de maintenance limite qui gère une période de maintenance, et non ce qu'elle met en sourdine. Pour mettre en sourdine tous les dossiers d'un module, un utilisateur doit avoir le droit de lister chaque dossier de ce module. Les badges et bannières en sourdine peuvent nommer une période de maintenance qu'un utilisateur ne peut pas lister.", "grantedByWiderScope": "Accordé par une portée plus large", "grantedHereAndByWiderScope": "Accordé ici et par une portée plus large", "stillGrantedByWiderScope": "Supprimé ici, toujours accordé par une portée plus large", @@ -3085,9 +3085,9 @@ "bulkDeleteGroupsConfirm": "Êtes-vous sûr de vouloir supprimer {count} groupe ? | Êtes-vous sûr de vouloir supprimer {count} groupes ?", "groupDeletedSuccess": "Groupe supprimé avec succès !", "errorDeletingGroup": "Erreur lors de la suppression du groupe !", - "bulkDeleteSuccess": "{count} groupe(s) supprimé(s) avec succès", + "bulkDeleteSuccess": "{count} groupe supprimé avec succès | {count} groupes supprimés avec succès", "bulkDeletePartial": "{count} groupe supprimé. Échec de la suppression de {failCount}. | {count} groupes supprimés. Échec de la suppression de {failCount}.", - "bulkDeleteFailed": "Échec de la suppression de {count} groupe(s)", + "bulkDeleteFailed": "Échec de la suppression de {count} groupe | Échec de la suppression de {count} groupes", "errorDeletingGroups": "Erreur lors de la suppression des groupes" }, "groupRoles": { @@ -3158,9 +3158,9 @@ "bulkDeleteConfirm": "Êtes-vous sûr de vouloir supprimer {count} rôle ? | Êtes-vous sûr de vouloir supprimer {count} rôles ?", "roleDeletedSuccess": "Rôle supprimé avec succès !", "roleDeleteError": "Erreur lors de la suppression du rôle !", - "bulkDeleteSuccess": "{count} rôle(s) supprimé(s) avec succès", + "bulkDeleteSuccess": "{count} rôle supprimé avec succès | {count} rôles supprimés avec succès", "bulkDeletePartial": "{count} rôle supprimé. Échec de la suppression de {unsuccessful}. | {count} rôles supprimés. Échec de la suppression de {unsuccessful}.", - "bulkDeleteFailed": "Échec de la suppression de {count} rôle(s)", + "bulkDeleteFailed": "Échec de la suppression de {count} rôle | Échec de la suppression de {count} rôles", "bulkDeleteRolesError": "Erreur lors de la suppression des rôles" }, "addUser": { @@ -3483,7 +3483,7 @@ "add": "Ajouter une organisation", "save": "Sauver", "cancel": "Annuler", - "search": "Organisation de recherche", + "search": "Rechercher une organisation", "id": "ID de l'organisation", "name": "Nom", "type": "Type", @@ -3499,7 +3499,7 @@ "statusDeleting": "Suppression en cours" }, "template": { - "search": "Modèle de recherche" + "search": "Rechercher un modèle" }, "logStream": { "timelineIcon": "Icône de chronologie", @@ -3528,7 +3528,7 @@ "fieldsSelected": "champs sélectionnés", "waitLoading": "Veuillez patienter pendant le chargement...", "updateChanges": "Appliquer les modifications", - "deleteActionTitle": "Action de suppression", + "deleteActionTitle": "Supprimer l'action", "deleteDatesTitle": "Supprimer les dates", "fetchingFunctions": "Chargement des fonctions...", "associateFunction": "Associer une fonction", @@ -3546,7 +3546,7 @@ "header": "Flux", "subtitle": "Gestion des index et configuration des flux", "streamNameHelpText": "Utilisez uniquement des caractères alphanumériques, un trait de soulignement et deux points.", - "search": "Stream de recherche", + "search": "Rechercher un flux", "emptyOr": "Ou :", "emptyAws": "AWS/CloudWatch", "name": "Nom", @@ -3576,7 +3576,7 @@ "propertyType": "Type", "type": "Type", "refreshStats": "Actualiser les statistiques", - "updateSettings": "Paramètres de mise à jour", + "updateSettings": "Mettre à jour les paramètres", "explore": "Explorez", "timezone": "Fuseau horaire", "deleteActionMessage": "Voulez-vous vraiment supprimer les champs sélectionnés ? Cette action ne peut pas être annulée.", @@ -4046,7 +4046,7 @@ "functionNodeInvalidName": "Le nœud de fonction {id} a un nom de fonction invalide \"{name}\". Doit être l'une des fonctions disponibles.", "outputStreamNodeEmptyName": "Le nœud de flux de sortie {id} a un nom de flux vide", "remoteStreamNodeEmptyDestination": "Le nœud de flux distant {id} a un nom de destination vide", - "remoteStreamNodeInvalidDestination": "Le nœud de flux distant {id} a une destination invalide \"{destination}\". Doit être l'une des destinations de canalisations disponibles.", + "remoteStreamNodeInvalidDestination": "Le nœud de flux distant {id} a une destination invalide \"{destination}\". Doit être l'une des destinations de pipeline disponibles.", "edgeMissingSourceNode": "L'arête {id} référence un nœud source inexistant {source}", "edgeMissingTargetNode": "L'arête {id} référence un nœud cible inexistant {target}", "inputNodeHasIncomingEdges": "Le nœud d'entrée {id} ne doit pas avoir d'arêtes entrantes. {count} arêtes entrantes trouvées.", @@ -4061,19 +4061,19 @@ "importErrors": { "unknownError": "Erreur inconnue", "nameRequired": "Pipeline - {index} : le nom est requis", - "streamTypeInvalid": "Canalisation - {index} : le type de flux est obligatoire et doit être l'un des suivants : 'logs', 'métriques', 'traces'.", + "streamTypeInvalid": "Pipeline - {index} : le type de flux est obligatoire et doit être l'un des suivants : 'logs', 'metrics', 'traces'.", "sourceStreamNameRequired": "Pipeline - {index} : le nom du flux source est requis ", "sqlQueryRequired": "Pipeline - {index} : la requête SQL est requise", "timezoneRequired": "Pipeline - {index} : le fuseau horaire est requis", "orgIdInvalid": "Pipeline - {index} : l'identifiant de l'organisation est obligatoire, doit exister dans la liste des organisations et doit être égal à {orgId} ", - "functionNameRequired": "Canalisation - {index}, Function-{counter} : le nom de la fonction est requis et doit soit exister dans cette organisation, soit être inclus dans le fichier d'export", - "functionCreated": "Canalisation - {index} : fonction « {name} » créée", - "functionCreatedCopy": "Canalisation - {index} : la fonction « {name} » existe déjà avec une logique différente, « {copy} » a été créée", - "functionReusedCopy": "Canalisation - {index} : la fonction « {name} » existe déjà avec une logique différente, la copie correspondante « {copy} » a été réutilisée", - "functionsNotBundled": "Canalisation - {index} : fonctions non incluses dans le fichier d'export : {names}", - "functionBundleConflict": "Canalisation - {index} : le fichier contient deux corps différents pour le même nom de fonction : {names}", - "functionCreateFailed": "Canalisation - {index} : la création de la fonction « {name} » a échoué --> \n Raison : {reason}", - "functionNoFreeName": "Canalisation - {index} : aucun nom disponible pour la fonction « {name} » après {limit} tentatives", + "functionNameRequired": "Pipeline - {index}, Fonction-{counter} : le nom de la fonction est requis et doit soit exister dans cette organisation, soit être inclus dans le fichier d'export", + "functionCreated": "Pipeline - {index} : fonction « {name} » créée", + "functionCreatedCopy": "Pipeline - {index} : la fonction « {name} » existe déjà avec une logique différente, « {copy} » a été créée", + "functionReusedCopy": "Pipeline - {index} : la fonction « {name} » existe déjà avec une logique différente, la copie correspondante « {copy} » a été réutilisée", + "functionsNotBundled": "Pipeline - {index} : fonctions non incluses dans le fichier d'export : {names}", + "functionBundleConflict": "Pipeline - {index} : le fichier contient deux corps différents pour le même nom de fonction : {names}", + "functionCreateFailed": "Pipeline - {index} : la création de la fonction « {name} » a échoué --> \n Raison : {reason}", + "functionNoFreeName": "Pipeline - {index} : aucun nom disponible pour la fonction « {name} » après {limit} tentatives", "conditionRequired": "Pipeline - {index}, Nœud {nodeIndex} : la condition est requise", "v2GroupConditionsArray": "Pipeline - {index}, Nœud {nodeIndex} : le groupe V2 doit avoir un tableau de conditions.", "v2ConditionFields": "Pipeline - {index}, Nœud {nodeIndex} : la condition V2 doit avoir une colonne, un opérateur et une valeur.", @@ -4081,7 +4081,7 @@ "v0ConditionFields": "Pipeline - {index}, Nœud {nodeIndex} : format V0 - chaque condition doit avoir une colonne, un opérateur et une valeur.", "v1ConditionInvalid": "Pipeline - {index}, Nœud {nodeIndex} : format de condition V1 invalide.", "conditionFormatUnrecognized": "Pipeline - {index}, Nœud {nodeIndex} : format de condition non reconnu.", - "remoteDestinationRequired": "Canalisation - {index} : destination distante requise", + "remoteDestinationRequired": "Pipeline - {index} : destination distante requise", "createSuccess": "Pipeline - {index} : \"{name}\" créé avec succès \nRemarque : veuillez supprimer l'objet pipeline créé {name} du fichier json", "createFailed": "Pipeline - {index} : la création de \"{name}\" a échoué --> \n Raison : {reason}", "sqlQueryMismatch": "Pipeline - {index}: La requête SQL doit être identique dans tous les nœuds et doit également correspondre à la requête dans les nœuds \n\n input.sql_query: {sqlQuery} \n\n input.source.query_condition.sql: {sourceSql} \n", @@ -4232,7 +4232,7 @@ "deleteNode": "Supprimer", "addPipeline": "Ajouter un pipeline", "deletePipeline": "Supprimer le pipeline", - "search": "Pipeline de recherche", + "search": "Rechercher un pipeline", "associateFunction": "Fonction associée", "pipelineName": "Entrez le nom du pipeline", "renameHint": "Cliquer pour renommer ce pipeline", @@ -4262,7 +4262,7 @@ "validateAndClose": "Valider et fermer", "editPipelineJson": "Modifier le fichier Json du pipeline", "editPipelineJSON": "Modifier le JSON du pipeline", - "savePipeline": "Sauvez le pipeline", + "savePipeline": "Enregistrer le pipeline", "savePipelineConfirm": "Êtes-vous sûr de vouloir sauver ce pipeline, car cela n'a aucun impact ?", "sourceStreamTooltip": "Source : Stream Node", "sourceQueryTooltip": "Source : Query Node", @@ -4276,7 +4276,7 @@ "destinationNodeRequired": "Le nœud de destination est requis", "connectAllNodes": "Veuillez connecter tous les nœuds avant de sauvegarder", "connectAllNodesShort": "Veuillez connecter tous les nœuds", - "enrichmentTablesScheduledOnly": "Les tables d'enrichissement en tant que flux de destination ne sont disponibles que pour les canalisations planifiées", + "enrichmentTablesScheduledOnly": "Les tables d'enrichissement en tant que flux de destination ne sont disponibles que pour les pipelines planifiés", "savingPipeline": "Sauver un pipeline...", "pipelineUpdated": "Mise à jour réussie du pipeline", "pipelineSaved": "Pipeline enregistré avec succès", @@ -4478,14 +4478,14 @@ "subtitle": "Fonctions VRL réutilisables appliquées aux pipelines", "clickTestFunctionHint": "Cliquez sur Tester la fonction pour voir les événements", "add": "Créer une nouvelle fonction", - "search": "Fonction de recherche", + "search": "Rechercher une fonction", "name": "Nom", "renameHint": "Cliquez pour renommer cette fonction", "save": "Sauver", "jsfunction": "Fonction", "actions": "Des actions", "cancel": "Annuler", - "updateTitle": "Fonction de mise à jour", + "updateTitle": "Mettre à jour la fonction", "delete": "Supprimer la fonction", "vrl": "VRL", "testApplyFailedSome": "Échec de l'application de la fonction {language} sur quelques événements", @@ -4502,13 +4502,13 @@ "enrichmentTablesSubtitle": "Tables de recherche qui enrichissent les données ingérées", "addEnrichmentTable": "Ajouter une table d'enrichissement", "updateEnrichmentTable": "Mettre à jour le tableau d'enrichissement", - "searchEnrichmentTable": "Tableau d'enrichissement des recherches", + "searchEnrichmentTable": "Rechercher une table d'enrichissement", "uploadCSVFile": "Charger un fichier CSV", "selectFunction": "Sélectionnez une fonction", "appendData": "Ajouter des données à la table d'enrichissement existante", "deleteAssociatedFunction": "Supprimer la fonction associée", "streamPipeline": "Pipelines de données", - "testFunction": "Fonction de test", + "testFunction": "Tester la fonction", "errorDetails": "Erreur", "jsErrorDetails": "Détails de l'erreur JavaScript", "function_definition": "Définition de la fonction", @@ -4541,7 +4541,7 @@ "nameInputInvalid": "Utilisez des lettres, des chiffres et des traits de soulignement, en commençant par une lettre ou un trait de soulignement", "nameInputDuplicate": "Une autre fonction de ce fichier utilise déjà ce nom", "nameInputExists": "Ce nom est déjà utilisé dans cette organisation", - "overrideAffects": "Le remplacement modifie aussi ces canalisations : {pipelines}", + "overrideAffects": "Le remplacement modifie aussi ces pipelines : {pipelines}", "createSuccess": "Fonction - {index} : « {name} » importée", "overridden": "Fonction - {index} : « {name} » remplacée", "createFailed": "Fonction - {index} : échec de « {name} » - {reason}", @@ -4966,7 +4966,7 @@ "manualDescription": "Utilisez ces identifiants pour des intégrations AWS personnalisées ou une configuration manuelle.", "searchPlaceholder": "Rechercher des services AWS...", "categoryAll": "Tous les services", - "categoryLogs": "Journaux", + "categoryLogs": "Logs", "categoryMetrics": "Métriques", "categorySecurity": "Sécurité", "categoryNetworking": "Réseau", @@ -5107,7 +5107,7 @@ "chipDashboard": "Tableau de bord", "chipEditor": "Éditeur", "chipInstall": "Installer", - "chipLogs": "Journaux", + "chipLogs": "Logs", "chipMetrics": "Métriques", "chipRun": "Exécuter", "chipTerminal": "Terminal", @@ -5137,7 +5137,7 @@ "dynamodbPipelineTitle": "Transmettre DynamoDB → Firehose", "dynamodbTagline": "Transmettez les modifications d'éléments DynamoDB à OpenObserve via Kinesis Firehose.", "ec2IamNote": "Nécessite un rôle IAM sur l'instance avec ec2:DescribeTags et ec2:DescribeInstances, afin que l'agent puisse lire la balise Name et l'utiliser comme identifiant hôte.", - "enableSessionReplayDesc": "Session Replay est configuré **séparément** de la surveillance réelle des utilisateurs et **n'hérite pas** de `rumConfiguration.customEndpoint`. Donnez-lui sa propre URL de base ci-dessous — de la même forme que celle de la surveillance réelle des utilisateurs/Logs. Le pont ajoute lui-même `/replay`, ne l'ajoutez donc **pas** vous-même : un `/replay` ajouté manuellement double le chemin et chaque envoi est rejeté avec une erreur 401, ce qui est la raison habituelle pour laquelle les événements de la surveillance réelle des utilisateurs arrivent, mais pas les replays.", + "enableSessionReplayDesc": "Session Replay est configuré **séparément** de RUM et **n'hérite pas** de `rumConfiguration.customEndpoint`. Donnez-lui sa propre URL de base ci-dessous — de la même forme que celle de RUM/Logs. Le pont ajoute lui-même `/replay`, ne l'ajoutez donc **pas** vous-même : un `/replay` ajouté manuellement double le chemin et chaque envoi est rejeté avec une erreur 401, ce qui est la raison habituelle pour laquelle les événements RUM arrivent, mais pas les replays.", "enableSessionReplayTitle": "Activer la relecture de session", "endpointLabel": "Point de terminaison", "externalEndpointVariant": "Point de terminaison externe", @@ -5204,7 +5204,7 @@ "mariadbHostLabel": "Hôte MariaDB", "verifyMariadbMetricsDesc": "La vérification ci-dessous passe au vert à l'arrivée des données, ou consultez Flux pour les métriques `mysql_*` (MariaDB remonte via le récepteur MySQL).", "mariadbTagline": "Collectez les métriques MariaDB avec l'OpenTelemetry Collector et envoyez-les à OpenObserve.", - "logsStreamNameLabel": "Nom du flux de journaux", + "logsStreamNameLabel": "Nom du flux de logs", "macosAgentFixBody": "L'installateur enregistre deux daemons launchd : l'agent lui-même et le pont de journal unifié. Si rien n'arrive, confirmez que les deux sont chargés et lisez le log de l'agent pour une erreur d'authentification ou de connectivité :", "macosAgentServicesFixTitle": "Vérifier les services de l'agent", "macosTroubleEmptyLogA": "C'est attendu. L'agent journalise au niveau `warn` et au-dessus, donc une installation saine écrit presque rien. Pour déboguer, augmentez-le temporairement : `sudo sed -i '' 's/level: warn/level: info/' /etc/otel-config.yaml` puis relancez le service.", @@ -5345,7 +5345,7 @@ "rnInstallNote": "Les packages session-replay et navigation sont facultatifs — supprimez l'une ou l'autre ligne si vous n'avez pas besoin d'enregistrement d'écran ni de suivi automatique des vues.", "rnNavigationNote": "Sans cela, vous pouvez toujours enregistrer des vues manuellement avec `O2Rum.startView()` / `O2Rum.stopView()`.", "rnSessionReplayNote": "Session Replay est pris en charge sur iOS et Android à partir du SDK 0.1.2. Les segments sont mis en lot avant l'envoi, attendez-vous donc à un court délai avant qu'ils apparaissent.", - "rnTrouble401A": "Deux causes courantes. Premièrement, le `clientToken` — il doit s'agir du **jeton de la surveillance réelle des utilisateurs** de cette organisation, et non du code d'accès d'ingestion ; s'il a été changé, régénérez-le à partir de l'en-tête de cette page et reconstruisez l'application. Deuxièmement, pour Session Replay en particulier : ajouter vous-même `/replay` à `customEndpoint` double le chemin (le pont l'ajoute déjà), ce que le backend rejette également avec une erreur 401 — passez plutôt l'URL de base nue.", + "rnTrouble401A": "Deux causes courantes. Premièrement, le `clientToken` — il doit s'agir du **jeton RUM** de cette organisation, et non du code d'accès d'ingestion ; s'il a été changé, régénérez-le à partir de l'en-tête de cette page et reconstruisez l'application. Deuxièmement, pour Session Replay en particulier : ajouter vous-même `/replay` à `customEndpoint` double le chemin (le pont l'ajoute déjà), ce que le backend rejette également avec une erreur 401 — passez plutôt l'URL de base nue.", "rnTrouble401Q": "Les requêtes renvoient 401 ou 403", "rnTroubleCleartextA": "Android bloque le trafic en clair par défaut. Pour un point de terminaison `http://`, définissez `additionalConfiguration: {config}` dans la configuration du SDK et autorisez le clair pour votre hôte dans la configuration de sécurité réseau de l'application. Préférez HTTPS en dehors du développement local.", "rnTroubleCleartextQ": "Les builds release/debug Android n'envoient rien via HTTP en clair", @@ -5364,7 +5364,7 @@ "rumFixBody": "Si votre application s'exécute mais que rien n'arrive, le navigateur a probablement bloqué le SDK ou ses requêtes — généralement une Content-Security-Policy ou un bloqueur de publicités. Autorisez le CDN et votre point de terminaison OpenObserve, puis rechargez :", "rumFixTitle": "Autorisez le SDK dans votre politique de sécurité de contenu", "rumInitDesc": "Les deux SDK sont initialisés avec les valeurs de cette organisation — copiez-les tels quels, puis ajustez `service`, `env` et `applicationId` pour décrire votre application. Le `clientToken` est envoyé aux navigateurs des visiteurs par conception (NPM l'empaquète, CDN l'incorpore) — il ne peut qu'écrire des événements RUM, et vous pouvez le faire pivoter à tout moment depuis l'en-tête de cette page.", - "rumInitTitle": "Initialiser RUM + Journaux", + "rumInitTitle": "Initialiser RUM + Logs", "rumInstallDesc": "Choisissez comment le SDK est fourni : empaquetez-le avec **NPM**, ou déposez le chargeur **CDN** dans le `` de votre HTML — aucune étape de build n'est nécessaire.", "rumInstallTitle": "Ajouter le SDK à votre application", "rumNpmInitNote": "Exécutez ceci dans le point d'entrée de votre application (main.js / index.js) avant que l'application ne soit montée, afin de capturer les erreurs précoces et les temps de premier rendu.", @@ -5478,7 +5478,7 @@ "verifyPostgresqlMetricsDesc": "La vérification ci-dessous passe au vert lorsque les données arrivent, ou consultez les Flux pour les métriques `postgresql_*`.", "verifyReactNativeRumDesc": "Lancez l'application sur un simulateur, un émulateur ou un appareil, naviguez entre quelques écrans ; la vérification ci-dessous passe au vert lorsque les données arrivent — les événements React Native arrivent dans le flux `_rumdata`.", "verifyRedisMetricsDesc": "La vérification ci-dessous passe au vert lorsque les données arrivent, ou consultez les Flux pour les métriques `redis_*`.", - "verifyRumDesc": "Ouvrez votre application dans un navigateur, cliquez un peu partout pendant quelques secondes ; la vérification ci-dessous passe au vert lorsque les données arrivent — les événements de Surveillance réelle des utilisateurs arrivent dans le flux `_rumdata`.", + "verifyRumDesc": "Ouvrez votre application dans un navigateur, cliquez un peu partout pendant quelques secondes ; la vérification ci-dessous passe au vert lorsque les données arrivent — les événements RUM arrivent dans le flux `_rumdata`.", "verifySnowflakeMetricsDesc": "La vérification ci-dessous passe au vert lorsque les données arrivent, ou consultez les Flux pour les métriques `snowflake_*`.", "verifySqlserverMetricsDesc": "La vérification ci-dessous passe au vert lorsque les données arrivent, ou consultez les Flux pour les métriques `sqlserver_*`.", "verifyWindowsAgentDesc": "L'agent démarre à l'installation. Laissez-lui quelques secondes ; la vérification ci-dessous passe au vert lorsque les données arrivent — les métriques d'hôte arrivent sous forme de flux `system_*`.", @@ -5960,7 +5960,7 @@ "edit": "Modifier le tableau de bord", "duplicate": "Dupliquer le tableau", "move_to_another_folder": "Déplacer vers un autre dossier", - "search": "Tableau de bord de recherche", + "search": "Rechercher un tableau de bord", "name": "Nom", "typeDesc": "Descriptif", "createdashboard": "Nouveau tableau de bord", @@ -5994,7 +5994,7 @@ "print": "Imprimer le tableau de bord", "refresh": "Actualiser", "reloadDashboards": "Recharger les tableaux de bord", - "export": "Tableau de bord d'exportation", + "export": "Exporter le tableau de bord", "fullscreen": "Passez en mode plein écran", "exitFullscreen": "Quitter le mode plein écran", "generalSettings": "Réglages généraux", @@ -6019,7 +6019,7 @@ "deleteVariableMsg": "Êtes-vous sûr de vouloir supprimer la variable ?", "appliedToTabs": "Appliqué aux onglets :", "appliedToPanels": "Appliqué aux panneaux :", - "selectVariableScope": "Sélectionnez une portée variable", + "selectVariableScope": "Sélectionnez la portée de la variable", "variableScopeHelp": "Les variables seront appliquées à tous les onglets et panneaux si l'option globale est sélectionnée.", "newTab": "Ajouter un onglet", "editTab": "Modifier l'onglet", @@ -6171,7 +6171,7 @@ "layerType": "Type de couche", "addDashboard": "Ajouter au tableau de bord", "panelTitle": "Titre du panneau", - "importDashboard": "Tableau de bord d'importation", + "importDashboard": "Importer un tableau de bord", "dropFileMsg": "Déposez votre fichier ici", "selectFile": "Sélectionnez un fichier", "addURL": "Ajoutez votre URL", @@ -6363,7 +6363,7 @@ "createDrilldown": "Créer Drilldown", "editDrilldown": "Modifier Drilldown", "goTo": "Accédez à :", - "selectLogsMode": "Sélectionnez le mode Journaux :", + "selectLogsMode": "Sélectionnez le mode Logs :", "enterCustomQuery": "Requête SQL personnalisée* :", "sqlQueryRequired": "La requête SQL est requise", "variableNameRequired": "Le nom de la variable est requis.", @@ -6424,7 +6424,7 @@ "configSectionPivotTable": "Tableau croisé dynamique", "configSectionValueTransformations": "Transformations de valeur", "configSectionValueTransformationsTooltip": "Faites correspondre des valeurs à un texte d'affichage personnalisé, une couleur de texte et une couleur d'arrière-plan — y compris les plages, les seuils et les expressions régulières — pour des résultats plus clairs et plus faciles à lire.", - "addValueMapping": "Cartographie de la valeur ajoutée", + "addValueMapping": "Ajouter un mappage de valeur", "editValueMapping": "Modifier le mappage des valeurs", "valueMappingsTitle": "Mappages de valeurs", "valueMappingType": "Tapez", @@ -6716,7 +6716,7 @@ "noneSelectedForDeletion": "Aucun tableau de bord sélectionné pour la suppression", "partialDeleteResult": "{count} tableau de bord supprimé avec succès, {failCount} a échoué | {count} tableaux de bord supprimés avec succès, {failCount} ont échoué", "failedToDeleteCount": "Échec de la suppression de {count} tableau de bord | Échec de la suppression de {count} tableaux de bord", - "deletedSuccessfullyCount": "{count} tableau(x) de bord supprimé(s) avec succès", + "deletedSuccessfullyCount": "{count} tableau de bord supprimé avec succès | {count} tableaux de bord supprimés avec succès", "errorDeleting": "Erreur lors de la suppression des tableaux de bord. Veuillez réessayer.", "titleRequired": "Le titre est obligatoire.", "queryFields": "Champs de requête", @@ -7308,11 +7308,11 @@ "cancel": "Annuler", "name": "Nom du panel", "options": "Options", - "editPanel": "Panneau d'édition", + "editPanel": "Modifier le panneau", "addPanel": "Ajouter un panneau", "createAlert": "Créer une alerte", "fullScreen": "Plein écran", - "refreshPanel": "Panneau d'actualisation", + "refreshPanel": "Actualiser le panneau", "refreshToApplyVariables": "Actualiser pour appliquer les dernières modifications de variables", "refresh": "Actualiser", "editLayout": "Modifier la mise en page", @@ -7321,7 +7321,7 @@ "queryInspector": "Inspecteur de requêtes", "downloadAsCSV": "Télécharger au format CSV", "downloadAsJSON": "Télécharger au format JSON", - "goToLogs": "Accéder aux journaux", + "goToLogs": "Accéder aux Logs", "moveToAnotherTab": "Passer à un autre onglet", "deletePanelTitle": "Supprimer le panneau", "deletePanelMessage": "Êtes-vous sûr de vouloir supprimer ce panneau ?", @@ -7351,8 +7351,8 @@ "valueFields": "Champs de valeur", "noData": "Aucune donnée", "logExplorer": { - "title": "Explorateur de journaux", - "openInLogs": "Ouvrir dans les journaux", + "title": "Explorateur de logs", + "openInLogs": "Ouvrir dans Logs", "invalidParams": "Paramètres d'exploration invalides", "noEvents": "Aucun événement ne correspond à ce filtre", "filterHint": "Cliquer pour explorer les journaux associés", @@ -7451,7 +7451,7 @@ "or": "Ou :", "aws": "AWS/CloudWatch", "aiIntegrations": "Intégrations d'IA", - "shippers": "Expéditeurs de grumes", + "shippers": "Agents d'expédition de logs", "profiles": "Profils", "descriptionOverview": "Il n'y a pas encore de données dans {org}. Les incidents, les anomalies et l'état des services s'affichent ici dès leur arrivée. Choisissez comment démarrer.", "descriptionUsage": "Il n'y a pas encore de données dans {org}. Les flux, les événements et le volume ingéré s'affichent ici dès leur arrivée. Choisissez comment démarrer.", @@ -7463,7 +7463,7 @@ "functionTitle": "Fonctions", "schedulePipelineTitle": "Planifié", "rtPipelineTitle": "En temps réel", - "pipelineTitle": "Canalisations", + "pipelineTitle": "Pipelines", "alertTitle": "Alertes", "dashboardTitle": "Tableaux de bord", "tabAiAssistant": "Assistant O2 AI", @@ -7696,7 +7696,7 @@ "capabilities": { "query": { "title": "Rédiger une requête", - "description": "SQL pour les logs, les traces, la surveillance réelle des utilisateurs, ou PromQL pour les métriques.", + "description": "SQL pour les logs, les traces, le RUM, ou PromQL pour les métriques.", "prompt": "Aide-moi à rédiger une requête" }, "incident": { @@ -7717,7 +7717,7 @@ }, "suggestions": { "vrlParseJson": "Écrire VRL pour analyser le JSON à partir de mes journaux nginx", - "regexRedact": "Générez un modèle regex pour expurger les e-mails", + "regexRedact": "Générez un motif regex pour expurger les e-mails", "mapStreamSchema": "Mapper mon schéma de flux « par défaut »", "promqlCpu": "Écrivez ProMQL pour les pods utilisant > 80 % du processeur", "datadogToO2": "Convertissez cette requête Datadog en OpenObserve SQL", @@ -7848,7 +7848,7 @@ "usageLabel": "Utilisation", "plansLabel": "Plans", "invoiceHistoryLabel": "Historique des factures", - "upgradeNow": "Mettez à jour dès maintenant", + "upgradeNow": "Passer à l'offre supérieure", "subscribe": "Souscrire", "features": "FONCTIONNALITÉS", "included": "Qu'est-ce qui est inclus ?", @@ -8015,9 +8015,9 @@ "createNewOrg": "Créer une nouvelle organisation", "createNewOrgDescription": "Créez une nouvelle organisation grâce à la facturation AWS Marketplace", "orgName": "Nom de l'organisation", - "linkToExisting": "Lien vers l'organisation existante", + "linkToExisting": "Lier à une organisation existante", "selectOrganization": "Sélectionnez une organisation", - "linkAwsBilling": "Lien vers AWS Billing", + "linkAwsBilling": "Lier la facturation AWS", "settingUp": "Configuration de votre abonnement...", "pleaseWait": "Veuillez patienter pendant que nous configurons votre compte.", "waitingConfirmation": "En attente de confirmation par AWS", @@ -8291,7 +8291,7 @@ "v2ConditionFieldsRequired": "Alerte - {index} : La condition V2 doit avoir une colonne, un opérateur et une valeur.", "invalidOperator": "Alerte - {index} : Opérateur invalide '{operator}'. Autorisés : '=', '!=', '>', '<', '>=', '<=', 'Contains', 'NotContains'.", "invalidQueryConditionOperator": "Alerte - {index} : Opérateur invalide dans la condition de requête. Opérateurs autorisés : '=', '!=', '>', '<', '>=', '<=', 'Contains', 'NotContains'.", - "queryConditionFieldsRequired": "Alerte - {index} : Chaque condition de requête doit avoir une 'colonne', un 'opérateur' et une 'valeur'.", + "queryConditionFieldsRequired": "Alerte - {index} : chaque condition de requête doit avoir 'column', 'operator' et 'value'.", "streamListFetchFailed": "Alerte - {index} : Erreur lors de la récupération de la liste des flux. Veuillez réessayer.", "isRealTimeBoolean": "Alerte - {index} : Is Real-Time est obligatoire et doit être une valeur booléenne.", "v2GroupConditionsArray": "Alerte - {index} : le groupe V2 doit avoir un tableau de conditions.", @@ -8453,7 +8453,7 @@ "guidelinesLabel": "Directives :", "selectStreamGuideline": "Sélectionnez un flux existant dans la liste ou saisissez le nom pour en créer un nouveau", "enrichmentTablesTerm": "Enrichment_tables", - "enrichmentTablesDestinationNote": "Le flux de destination n'est disponible que pour les canalisations planifiées.", + "enrichmentTablesDestinationNote": "comme flux de destination n'est disponible que pour les pipelines planifiés", "useCurlyBracesNote": "Utiliser des accolades", "configureStreamNameDynamicNote": "pour configurer dynamiquement le nom du flux, p. ex.", "staticTextBeforeAfterNote": ". Texte statique avant/après", @@ -8587,8 +8587,8 @@ "noTemplatesMsg": "Pour créer une alerte, vous avez besoin d'au moins un modèle. Les modèles définissent le format du message de notification — commencez par en créer un.", "add": "Ajouter une alerte", "edit": "Modifier", - "clone": "Alerte de clonage", - "search": "Alerte de recherche", + "clone": "Cloner l'alerte", + "search": "Rechercher une alerte", "name": "Nom", "addConditions": "Ajouter des conditions", "addCondition": "Ajouter une condition", @@ -8623,7 +8623,7 @@ "anomalyDetection": "Anomalie", "anomalyDetectionConfig": "Configuration de détection", "alerting": "Alerte", - "saveAndTrain": "Économisez et entraînez-vous", + "saveAndTrain": "Enregistrer et entraîner", "anomalyCreated": "Configuration de détection des anomalies créée. La formation débutera prochainement.", "trainingWindow": "Fenêtre de formation", "sensitivity": "Sensibilité", @@ -8669,7 +8669,7 @@ "suggestServerIssue": "Le service de destination rencontre des problèmes. Veuillez réessayer plus tard.", "description": "Descriptif", "stream_name": "Nom du stream", - "cloneTitle": "Alerte de clonage", + "cloneTitle": "Cloner l'alerte", "start": "démarrer", "pause": "Pause", "groupBy": "Regrouper par", @@ -8701,7 +8701,7 @@ "deduplication": { "fingerprintFields": "Champs d'empreintes digitales", "fingerprintFieldsHint": "Sélectionnez les champs à utiliser pour la déduplication. Laissez ce champ vide pour la détection automatique en fonction du type de requête.", - "fingerprintFieldsTooltip": "Champs utilisés pour créer des empreintes digitales uniques pour la déduplication des alertes. Les empreintes digitales incluent le nom de l'alerte, la métrique, la condition et les champs sélectionnés, ce qui garantit que les différents types d'alertes (par exemple, processeur élevé ou mémoire élevée) ne sont jamais dédupliqués ensemble, même s'ils surveillent les mêmes entités. Laissez ce champ vide pour la détection automatique : les requêtes SQL utilisent les colonnes de la clause WHERE + les colonnes GROUP BY, ProMQL utilise le nom de la métrique et les dimensions de l'étiquette, les requêtes personnalisées utilisent des champs de condition.", + "fingerprintFieldsTooltip": "Choisissez les champs qui doivent correspondre pour que des alertes soient considérées comme des doublons. Par exemple, sélectionner 'hostname' regroupe les alertes provenant du même hôte. Des types d'alertes différents (par exemple, CPU élevé et mémoire élevée) ne sont jamais regroupés, même s'ils proviennent du même hôte. Laissez vide pour une détection automatique selon votre type de requête.", "timeWindow": "Fenêtre horaire (minutes)", "timeWindowHint": "Combien de temps faut-il pour suivre les empreintes digitales des alertes ? Laissez ce champ vide pour utiliser la période d'alerte.", "timeWindowTooltip": "Durée nécessaire pour suivre et dédupliquer les empreintes digitales des alertes. Si une alerte avec la même empreinte digitale apparaît dans cette fenêtre, elle sera supprimée. Laissez ce champ vide pour utiliser la période d'évaluation des alertes.", @@ -9157,13 +9157,13 @@ "helpPreviewHeading": "Afficher un aperçu d'un modèle", "helpPreviewSelectPlaceholder": "Sélectionnez un modèle à prévisualiser", "helpApplyToAlert": "Faire une demande d'alerte", - "helpVariablesExplain": "Les variables sont vos propres valeurs que vous pouvez ajouter à un message de notification. Donnez à chacun un nom et une valeur ici, puis écrivez {'{'} your_name {'}'} n'importe où dans le modèle. Il est rempli lorsque l'alerte se déclenche.", + "helpVariablesExplain": "Les variables sont vos propres valeurs que vous pouvez insérer dans un message de notification. Donnez à chacune un nom et une valeur ici, puis écrivez {'{'}your_name{'}'} n'importe où dans le modèle — elle est remplacée lorsque l'alerte se déclenche.", "helpBuiltInHeading": "Parcourir les variables intégrées", "helpBuiltInIntro": "{product} les remplit automatiquement — cliquez sur l'un d'eux pour le copier.", - "helpBuiltInFooter": "Les champs de votre flux fonctionnent également comme des variables. Avancé : {'{'} Rows:N {'}'} limite le nombre de lignes affichées ; {'{'} var:N {'}'} raccourcit une valeur.", + "helpBuiltInFooter": "Les champs de votre flux fonctionnent également comme des variables. Avancé : {'{'}rows:N{'}'} limite le nombre de lignes affichées ; {'{'}var:N{'}'} raccourcit une valeur.", "helpYourVariablesHeading": "Variables que vous avez ajoutées", "helpYourVariablesEmpty": "Vous n'avez encore ajouté aucune variable.", - "helpRowTemplateExplain": "Une alerte peut correspondre à de nombreuses lignes. Le modèle de ligne détermine l'apparence d'une seule ligne. Ensuite, {'{'} rows {'}'} de votre modèle principal est supprimée dans chaque ligne correspondante, déjà formatée.", + "helpRowTemplateExplain": "Une alerte peut correspondre à de nombreuses lignes. Le modèle de ligne détermine l'apparence d'une seule ligne. Ensuite, {'{'}rows{'}'} dans votre modèle principal insère chaque ligne correspondante, déjà formatée.", "helpRowTemplateTypeHeading": "String contre JSON", "helpRowTemplateTypeExplain": "String produit un texte brut par ligne. JSON produit un objet JSON par ligne, adapté aux destinations structurées.", "helpRowTemplateTypeCurrent": "Actuellement sélectionné :", @@ -9180,10 +9180,10 @@ "helpTemplateWhenHeading": "Quand dois-je annuler ?", "helpTemplateWhenDesc": "Laissez ce champ vide et chaque destination utilise son propre modèle. Définissez une substitution lorsque vous souhaitez que cette alerte envoie le même message cohérent à chaque destination — sans modifier le modèle de chaque destination.", "helpRowTemplateWhyHeading": "Pourquoi un modèle de ligne ?", - "helpRowTemplateWhyDesc": "Une alerte peut correspondre à de nombreux enregistrements. Le modèle de ligne met en forme un enregistrement ; {'{'} rows {'}'}, puis place chaque enregistrement formaté dans le modèle principal. Vous pouvez ainsi répertorier toutes les correspondances sans écrire de boucle.", - "helpRowTemplateExampleCaption": "Chaque ligne correspondante est mise en forme par le modèle de ligne, puis {'{'} rows {'}'} les place toutes dans le modèle principal :", + "helpRowTemplateWhyDesc": "Une alerte peut correspondre à de nombreux enregistrements. Le modèle de ligne met en forme un enregistrement ; {'{'}rows{'}'} insère ensuite chaque enregistrement formaté dans le modèle principal. Vous pouvez ainsi lister toutes les correspondances sans écrire de boucle.", + "helpRowTemplateExampleCaption": "Chaque ligne correspondante est mise en forme par le modèle de ligne, puis {'{'}rows{'}'} les insère toutes dans le modèle principal :", "helpRowTemplateExampleRowLabel": "Modèle de ligne (met en forme un enregistrement)", - "helpRowTemplateExampleMainLabel": "Modèle principal (utilise {'{'} lignes {'}'})", + "helpRowTemplateExampleMainLabel": "Modèle principal (utilise {'{'}rows{'}'})", "helpRowTemplatePreviewEmpty": "Pas encore de modèle de ligne : saisissez-en un dans l'onglet Paramètres supplémentaires pour le prévisualiser ici.", "helpPreviewSelectEmpty": "Choisissez un modèle ci-dessus pour prévisualiser le message qu'il enverrait.", "helpCurrentBodyEmpty": "Ce modèle n'a aucun corps à prévisualiser.", @@ -9834,9 +9834,9 @@ "sloCloneDisabled": "Les alertes SLO sont créées sur leur page SLO, elles ne peuvent donc pas être clonées depuis ici.", "seconds": "Secondes", "downtimes": { - "newTitle": "Nouvelle indisponibilité", - "editTitle": "Modifier l'indisponibilité", - "detailTitle": "Indisponibilité", + "newTitle": "Nouvelle période de maintenance", + "editTitle": "Modifier la période de maintenance", + "detailTitle": "Période de maintenance", "modules": { "alerts": "Alertes", "anomaly_detections": "Détections d'anomalies", @@ -9888,7 +9888,7 @@ "validation": { "conditionRequired": "Ajoutez une condition ou supprimez le bloc de conditions.", "pairKey": "Choisissez une dimension pour chaque ligne.", - "pairOperator": "Utilisez = ou != dans une condition d'indisponibilité.", + "pairOperator": "Utilisez = ou != dans une condition de période de maintenance.", "pairValue": "Saisissez une valeur pour chaque ligne.", "loneStar": "Une valeur ne peut pas être un * seul.", "innerStar": "Un * n'est autorisé qu'à la fin d'une valeur.", @@ -9931,8 +9931,8 @@ "allFolders": "Tous les dossiers", "thisFolderTooltip": "Rechercher dans le dossier sélectionné", "allFoldersTooltip": "Rechercher dans tous les dossiers", - "noFolder": "Aucun dossier dans lequel vous pouvez classer une période d'arrêt", - "truncated": "Affichage des {shown} premières périodes d'arrêt sur {total}", + "noFolder": "Aucun dossier dans lequel vous pouvez classer une période de maintenance", + "truncated": "Affichage des {shown} premières périodes de maintenance sur {total}", "stats": { "active": "Actives", "scheduled": "Planifiées", @@ -9957,18 +9957,18 @@ "bannerOn": "Une bannière s'affiche pour tous les membres de l'organisation tant que cette plage de maintenance est active", "endsLabel": "fin", "confirmEndNow": { - "title": "Terminer cette indisponibilité maintenant ?", - "message": "Les notifications reprennent aussitôt. L'indisponibilité reste dans la liste comme terminée plus tôt.", + "title": "Terminer cette période de maintenance maintenant ?", + "message": "Les notifications reprennent aussitôt. La période de maintenance reste dans la liste comme terminée plus tôt.", "ok": "Terminer maintenant", "keep": "Laisser continuer" }, "extend": { "menu": "Prolonger de", - "notActive": "Seule une indisponibilité active peut être prolongée", + "notActive": "Seule une période de maintenance active peut être prolongée", "dialogTitle": "Prolonger {name}", "newEnd": "Nouvelle fin", "confirmUntil": "Prolonger jusqu'à {time}", - "followUp": "Cette indisponibilité se répète, son planning reste donc inchangé. Une indisponibilité ponctuelle nommée {name} est créée à partir de la fin de la fenêtre actuelle.", + "followUp": "Cette période de maintenance se répète, son planning reste donc inchangé. Une période de maintenance ponctuelle nommée {name} est créée à partir de la fin de la fenêtre actuelle.", "endAfterCurrent": "La nouvelle fin doit être postérieure à la fin actuelle." }, "nextLabel": "prochaine", @@ -9990,15 +9990,15 @@ "extend": "Prolonger" }, "confirmCancel": { - "title": "Annuler l'indisponibilité", - "message": "Les notifications reprennent immédiatement. L'indisponibilité reste dans la liste pour l'historique.", - "bulkMessage": "Annuler {count} indisponibilité ? Les notifications reprennent immédiatement. | Annuler {count} indisponibilités ? Les notifications reprennent immédiatement.", - "confirm": "Annuler l'indisponibilité | Annuler les indisponibilités", - "keep": "Conserver l'indisponibilité | Conserver les indisponibilités" + "title": "Annuler la période de maintenance", + "message": "Les notifications reprennent immédiatement. La période de maintenance reste dans la liste pour l'historique.", + "bulkMessage": "Annuler {count} période de maintenance ? Les notifications reprennent immédiatement. | Annuler {count} périodes de maintenance ? Les notifications reprennent immédiatement.", + "confirm": "Annuler la période de maintenance | Annuler les périodes de maintenance", + "keep": "Conserver la période de maintenance | Conserver les périodes de maintenance" }, "confirmDelete": { - "title": "Supprimer l'indisponibilité", - "message": "L'indisponibilité et son historique sont supprimés. Cette action est irréversible." + "title": "Supprimer la période de maintenance", + "message": "La période de maintenance et son historique sont supprimés. Cette action est irréversible." }, "copyOf": "Copie de {name}", "form": { @@ -10033,17 +10033,17 @@ "tabSchedule": "Planification", "tabAdvanced": "Avancé", "modeInFolder": "{mode} dans", - "newMode": "Nouvelle indisponibilité", - "editMode": "Modifier l'indisponibilité", - "namePlaceholder": "Nom de l'indisponibilité", - "nameLabel": "Nom de l'indisponibilité", + "newMode": "Nouvelle période de maintenance", + "editMode": "Modifier la période de maintenance", + "namePlaceholder": "Nom de la période de maintenance", + "nameLabel": "Nom de la période de maintenance", "renameHint": "Cliquez pour renommer", "reason": "Motif", "reasonHelp": "Facultatif. Affiché dans la liste, sur la page de détail et dans l'infobulle « En sourdine ».", "cancel": "Annuler", "save": "Enregistrer", - "activeBanner": "Cette indisponibilité est active. Une modification prend effet à la prochaine évaluation, et un changement du mode SLO recalcule les fenêtres déjà commencées.", - "changedMeanwhile": "Quelqu'un a modifié cette indisponibilité depuis que vous l'avez chargée. Rechargez et réessayez.", + "activeBanner": "Cette période de maintenance est active. Une modification prend effet à la prochaine évaluation, et un changement du mode SLO recalcule les fenêtres déjà commencées.", + "changedMeanwhile": "Quelqu'un a modifié cette période de maintenance depuis que vous l'avez chargée. Rechargez et réessayez.", "reload": "Recharger", "noModule": "Choisissez un module dans S'applique à.", "checkSchedule": "Vérifiez la planification, puis enregistrez à nouveau." @@ -10084,7 +10084,7 @@ "none": "Aucune condition de dimension", "add": "Ajouter", "title": "Condition de dimension", - "onePer": "Une par indisponibilité", + "onePer": "Une par période de maintenance", "remove": "Supprimer la condition de dimension", "caption": "S'applique aux alertes, aux détections d'anomalies et aux SLO. Les vérifications Synthetics n'ont pas de dimensions et utilisent des étiquettes. Toutes les paires doivent correspondre. Utilisez un groupe OU pour les alternatives. Une valeur peut se terminer par *." }, @@ -10140,7 +10140,7 @@ }, "muteAllDialog": { "title": "Mettre en sourdine des modules entiers ?", - "intro": "Aucun dossier, élément, tag ou condition ne restreint ces modules, donc cette indisponibilité met en sourdine :", + "intro": "Aucun dossier, élément, tag ou condition ne restreint ces modules, donc cette période de maintenance met en sourdine :", "every": { "alerts": "Toutes les alertes de cette organisation", "anomaly_detections": "Toutes les détections d'anomalies de cette organisation", @@ -10165,7 +10165,7 @@ "window": "Fenêtre", "nextWindow": "Prochaine fenêtre", "inUtc": "En UTC", - "largeMatch": "{modules} : l'indisponibilité correspond à plus de la moitié des éléments. La majorité de cette organisation ne notifiera pas pendant la fenêtre.", + "largeMatch": "{modules} : la période de maintenance correspond à plus de la moitié des éléments. La majorité de cette organisation ne notifiera pas pendant la fenêtre.", "whatHappens": "Ce qui se passe", "keepRunning": "Les évaluations et les vérifications continuent de s'exécuter et conservent leur historique.", "noNotifications": "Les notifications, les pages d'astreinte et les workflows s'arrêtent.", @@ -10206,9 +10206,9 @@ "wouldHaveNotified": "Aurait notifié", "noSuppressed": "Rien n'a encore été supprimé", "muteHourName": "{name} · sourdine 1 h", - "notFoundTitle": "Période d'arrêt introuvable", + "notFoundTitle": "Période de maintenance introuvable", "notFoundDescription": "Elle a peut-être été supprimée, ou le lien pointe vers une autre organisation.", - "backToList": "Retour aux périodes d'arrêt" + "backToList": "Retour aux périodes de maintenance" }, "mute": { "title": { @@ -10259,7 +10259,7 @@ "firstEndsInMinutes": "la première se termine dans {count} minute | la première se termine dans {count} minutes", "firstEndsIn": "la première se termine dans {duration}", "count": "{module} {count}", - "showBanner": "Afficher une bannière à tous les membres de l'organisation pendant que cette période de silence est active", + "showBanner": "Afficher une bannière à tous les membres de l'organisation pendant que cette période de maintenance est active", "showBannerCaption": "La bannière affiche le nom, les décomptes concernés et le temps restant. Elle ne mentionne jamais une alerte.", "preview": "Aperçu", "previewMessage": "{name} est actif.", @@ -10272,11 +10272,11 @@ }, "notify": { "title": "Notifier", - "caption": "Informer les destinations de l'arrêt planifié lui-même : à son début, avant sa fin et à sa fin.", + "caption": "Informer les destinations de la période de maintenance elle-même : à son début, avant sa fin et à sa fin.", "destinations": "Destinations", "lead": "Rappeler avant la fin", "leadHelp": "Par exemple 10m ou 1h, entre 1 minute et la durée de la fenêtre.", - "regionNote": "Dans un super cluster, la région où l'arrêt planifié a été créé envoie ces messages. Un arrêt créé avant ce réglage envoie depuis chaque région.", + "regionNote": "Dans un super cluster, la région où la période de maintenance a été créée envoie ces messages. Une période de maintenance créée avant ce réglage envoie depuis chaque région.", "tab": "Notifications", "events": { "started": "À son début", @@ -10286,7 +10286,7 @@ "ended": "À sa fin", "endedHelp": "Un message à la fermeture de chaque fenêtre.", "cancelled": "À son annulation", - "cancelledHelp": "Envoyé aussitôt quand quelqu'un termine ou annule l'arrêt planifié.", + "cancelledHelp": "Envoyé aussitôt quand quelqu'un termine ou annule la période de maintenance.", "extended": "À sa prolongation", "extendedHelp": "Envoyé aussitôt avec la nouvelle fin." }, @@ -10356,7 +10356,7 @@ "impactUnused": "Non utilisé", "noConsumers": "Aucun consommateur.", "countCompositeAlert": "{count} alerte composite | {count} alertes composites", - "countPipeline": "{count} canalisation | {count} canalisations", + "countPipeline": "{count} pipeline | {count} pipelines", "countSyntheticCheck": "{count} contrôle synthétique | {count} contrôles synthétiques", "countOncallPolicy": "{count} politique d'escalade | {count} politiques d'escalade", "countOncallTeamChannel": "{count} canal d'équipe | {count} canaux d'équipe", @@ -10364,7 +10364,7 @@ "countAnomalyDetection": "{count} détecteur d'anomalies | {count} détecteurs d'anomalies", "countIncidentIntegration": "{count} intégration d'incident | {count} intégrations d'incident", "sectionOtherConsumers": "Aussi utilisé par", - "countDowntime": "{count} arrêt planifié | {count} arrêts planifiés" + "countDowntime": "{count} période de maintenance | {count} périodes de maintenance" }, "alert_library": { "header": "Bibliothèque d'alertes", @@ -10508,13 +10508,13 @@ "name": "Nom", "actions": "Des actions", "addTitle": "Ajouter un modèle", - "updateTitle": "Modèle de mise à jour", + "updateTitle": "Mettre à jour le modèle", "delete": "Supprimer", "variable_guide_header": "Guide des variables du modèle", "variable_usage_examples": "Exemples d'utilisation", "body": "Corps", "clone": "Cloner", - "cloneTitle": "Modèle de clonage", + "cloneTitle": "Cloner le modèle", "systemReadOnlyEdit": "Modèle prédéfini — la modification est désactivée. Clonez-le pour en faire une copie modifiable.", "systemReadOnlyDelete": "Modèle prédéfini — la suppression est désactivée. Clonez-le pour en faire une copie modifiable.", "prebuiltBadge": "Préconstruit", @@ -10785,8 +10785,8 @@ "separator": "Séparateur", "separator_placeholder": "Saisissez un séparateur (ex. : {'|'}, \\n, \\t, espace)", "separator_hint": "Chaîne de séparation à utiliser entre les enregistrements (espaces autorisés)", - "templateDefaultOption": "Default ({name})", - "templateHelp": "Leave as default to use the standard {type} template ({name}), or pick a custom one.", + "templateDefaultOption": "Par défaut ({name})", + "templateHelp": "Laissez la valeur par défaut pour utiliser le modèle {type} standard ({name}), ou choisissez un modèle personnalisé.", "loadingData": "Chargement des données de destination...", "noEmailTemplates": "Il semble que vous n'ayez pas encore créé de modèles d'e-mail.", "createEmailTemplate": "Créer un modèle d'e-mail", @@ -10887,7 +10887,7 @@ "severityInfoDescription": "Incidents informatifs" }, "pipeline_destinations": { - "header": "Destinations des canalisations", + "header": "Destinations des pipelines", "search": "Rechercher une destination" }, "storage_settings": { @@ -10897,7 +10897,7 @@ "notEnabled": "{product} n'est pas activé pour cette organisation", "heroHeadline": "Apportez votre propre espace de rangement à", "heroSub": "Connectez votre propre bucket cloud, les données restent dans votre infrastructure : contrôle total, aucun verrouillage.", - "configureStorage": "Configuration du stockage", + "configureStorage": "Configurer le stockage", "supportedProviders": "Prestataires pris en charge", "perOrgIsolation": "Isolation par organisation", "appliesImmediately": "S'applique immédiatement aux nouvelles données", @@ -11022,8 +11022,8 @@ "dashboards": "Tableaux de bord ({count})", "alerts": "Alertes ({count})", "slos": "SLO ({count})", - "pipelines": "Canalisations planifiées ({count})", - "empty": "Aucun tableau de bord, aucune alerte, aucun SLO ni aucune canalisation planifiée que vous pouvez voir n'utilise cette métrique.", + "pipelines": "Pipelines planifiés ({count})", + "empty": "Aucun tableau de bord, aucune alerte, aucun SLO ni aucun pipeline planifié que vous pouvez voir n'utilise cette métrique.", "error": "Impossible de déterminer où cette métrique est utilisée", "unparsed": "{count} requête n'a pas pu être analysée et a été mise en correspondance par nom | {count} requêtes n'ont pas pu être analysées et ont été mises en correspondance par nom", "textMatch": "Correspondance par nom", @@ -11202,10 +11202,10 @@ "selectedCount": "{count} sélectionné(s)", "searchPrefixes": "Rechercher des préfixes", "searchSuffixes": "Rechercher des suffixes", - "searchTypes": "Types de recherche", + "searchTypes": "Rechercher des types", "searchPrefixesAria": "Rechercher des filtres de préfixe", "searchSuffixesAria": "Rechercher des filtres de suffixe", - "searchTypesAria": "Filtres de type de recherche", + "searchTypesAria": "Rechercher dans les filtres de type", "facetAria": "{label}, {count} métriques", "noPrefixMatch": "Aucun préfixe ne correspond.", "noSuffixMatch": "Aucun suffixe ne correspond.", @@ -11277,7 +11277,7 @@ "selectLabel": "Sélectionner l'étiquette", "exactMatch": "Correspondance exacte", "notEqualTo": "Différent de", - "regexPattern": "Modèle regex (ex. prod.*)", + "regexPattern": "Motif regex (ex. prod.*)", "regexNotMatching": "Regex ne correspondant pas (ex. test.*)" }, "builderSwitch": { @@ -11407,7 +11407,7 @@ "generalDesc": "Thème, valeurs par défaut des requêtes et préférences principales", "orgDesc": "Paramètres et identifiants de l'organisation", "cipherKeysDesc": "Clés de chiffrement pour les champs sensibles", - "regexPatternsDesc": "Modèles regex réutilisables pour le masquage", + "regexPatternsDesc": "Motifs regex réutilisables pour le masquage", "domainManagementDesc": "Restreindre la connexion aux domaines SSO autorisés", "passwordPolicy": "Politique de mots de passe", "passwordPolicyDesc": "Politiques d'authentification pour les comptes natifs e-mail/mot de passe, appliquées à l'ensemble de l'instance.", @@ -11448,7 +11448,7 @@ "claimParserFunctionInputDescription": "La fonction VRL reçoit un objet JSON contenant des revendications mappées dans Dex depuis votre fournisseur SSO/LDAP (par exemple, e-mail, nom, groupes, rôles).", "claimParserFunctionOutputTitle": "Format de sortie :", "claimParserFunctionOutputDescription": "La fonction VRL doit renvoyer l'un des formats suivants :", - "claimParserFunctionOutputExample1": "• Succès : renvoie un tableau d'objets, chacun avec des champs « org » (chaîne) et « rôle » (chaîne)", + "claimParserFunctionOutputExample1": "• Succès : renvoie un tableau d'objets, chacun avec les champs 'org' (chaîne, l'identifiant de l'organisation — pas son nom — qui doit déjà exister) et 'role' (chaîne)", "claimParserFunctionOutputExample2": "• Refuser : renvoie un objet avec les champs « deny » (booléen true) et « reason » (chaîne)", "claimParserRecentErrors": "Erreurs récentes (dernières 24 heures)", "noRecentErrors": "Aucune erreur n'a été trouvée au cours des dernières 24 heures", @@ -11517,7 +11517,7 @@ "enterpriseFeatures": "Fonctionnalités d'entreprise", "noTextAvailable": "Aucun texte disponible", "customLogoTextDescription": "Le texte du logo personnalisé est utilisé pour modifier le texte de marque par défaut affiché dans l'application.", - "lightMode": "Mode d'éclairage", + "lightMode": "Mode clair", "dragDropUpload": "Glissez-déposez ou cliquez pour télécharger", "customLogoLightDescription": "Logo personnalisé pour le thème du mode lumière. Cela sera affiché lorsque les utilisateurs seront en mode lumière.", "darkMode": "Mode sombre", @@ -11605,7 +11605,7 @@ "telemetryCoverage": "Couverture télémétrique", "serviceName": "Nom du service", "service": "Service", - "logs": "Journaux", + "logs": "Logs", "traces": "Traces", "metrics": "Métriques", "lastSeen": "Vu pour la dernière fois", @@ -11667,11 +11667,11 @@ "addRegexPattern": { "namePlaceholder": "Ex. Mots de passe internes", "descriptionPlaceholder": "Décrivez votre modèle pour aider les utilisateurs à comprendre", - "regexPatternLabel": "Modèle regex", + "regexPatternLabel": "Motif regex", "tryAiAssistant": "Essayez l'assistant O2 pour écrire des expressions", "writePattern": "Écrire le modèle", "patternPlaceholder": "Ex. \\d....\\d ", - "testRegexPattern": "Tester le modèle regex", + "testRegexPattern": "Tester le motif regex", "testInput": "Entrée de test", "inputStringLabel": "Chaîne d'entrée", "testStringPlaceholder": "Ex. 1234567890", @@ -11729,9 +11729,9 @@ "fetchFailed": "Échec de la récupération des clés de chiffrement. Veuillez réessayer.", "processingDelete": "Veuillez patienter pendant le traitement de la demande de suppression...", "deleteSuccess": "Clé de chiffrement supprimée avec succès", - "bulkDeleteSuccess": "{count} clé(s) de chiffrement supprimée(s) avec succès", + "bulkDeleteSuccess": "{count} clé de chiffrement supprimée avec succès | {count} clés de chiffrement supprimées avec succès", "bulkDeletePartial": "{count} clé de chiffrement supprimée, mais {failed} a échoué | {count} clés de chiffrement supprimées, mais {failed} ont échoué", - "bulkDeleteFailed": "Échec de la suppression de {count} clé(s) de chiffrement", + "bulkDeleteFailed": "Échec de la suppression de {count} clé de chiffrement | Échec de la suppression de {count} clés de chiffrement", "bulkDeleteError": "Erreur lors de la suppression des clés de chiffrement" }, "correlationSettingsPage": { @@ -11760,7 +11760,7 @@ "regexPatternCreation": "Création de motif regex", "tabBuiltInPatterns": "Motifs intégrés", "tabFileUploadJson": "Téléchargement de fichier / JSON", - "tabUrlImport": "Importation d'URL", + "tabUrlImport": "Importation par URL", "jsonStringEmpty": "La chaîne JSON est vide", "invalidJsonFormat": "Format JSON invalide", "importSuccess": "{count} modèle importé avec succès | {count} modèles importés avec succès", @@ -11953,22 +11953,22 @@ "sourceBuiltIn": "Intégré" }, "regexPatternList": { - "subtitle": "Modèles regex réutilisables pour le masquage", - "exportTitle": "Exporter le modèle regex", + "subtitle": "Motifs regex réutilisables pour le masquage", + "exportTitle": "Exporter le motif regex", "delete": "Supprimer", - "bulkDeleteTitle": "Supprimer les modèles regex", - "bulkDeleteMessage": "Voulez-vous vraiment supprimer {n} modèle regex ? | Voulez-vous vraiment supprimer {n} modèles regex ?", - "deleteTitle": "Supprimer le modèle regex", - "deleteMessage": "Voulez-vous vraiment supprimer ce modèle regex ?", - "errorFetching": "Erreur lors de la récupération des modèles regex", - "deletedSuccess": "Modèle regex supprimé avec succès.", - "errorDeleting": "Erreur lors de la suppression du modèle regex", - "exportedSuccess": "Modèle regex exporté avec succès", - "errorExporting": "Erreur lors de l'exportation du modèle regex", - "bulkDeleteSuccess": "{n} modèle(s) regex supprimés avec succès", - "bulkDeletePartial": "{count} modèle regex supprimé, mais {unsuccessful} a échoué | {count} modèles regex supprimés, mais {unsuccessful} ont échoué", - "bulkDeleteFailed": "Échec de la suppression de {n} modèle(s) regex", - "errorBulkDeleting": "Erreur lors de la suppression des modèles regex" + "bulkDeleteTitle": "Supprimer les motifs regex", + "bulkDeleteMessage": "Voulez-vous vraiment supprimer {n} motif regex ? | Voulez-vous vraiment supprimer {n} motifs regex ?", + "deleteTitle": "Supprimer le motif regex", + "deleteMessage": "Voulez-vous vraiment supprimer ce motif regex ?", + "errorFetching": "Erreur lors de la récupération des motifs regex", + "deletedSuccess": "Motif regex supprimé avec succès.", + "errorDeleting": "Erreur lors de la suppression du motif regex", + "exportedSuccess": "Motif regex exporté avec succès", + "errorExporting": "Erreur lors de l'exportation du motif regex", + "bulkDeleteSuccess": "{n} motif regex supprimé avec succès | {n} motifs regex supprimés avec succès", + "bulkDeletePartial": "{count} motif regex supprimé, mais {unsuccessful} a échoué | {count} motifs regex supprimés, mais {unsuccessful} ont échoué", + "bulkDeleteFailed": "Échec de la suppression de {n} motif regex | Échec de la suppression de {n} motifs regex", + "errorBulkDeleting": "Erreur lors de la suppression des motifs regex" }, "setAiCreditsFor": "Définir les crédits IA pour {name}", "setSyntheticsBrowserStepsFor": "Définir les étapes navigateur pour {name}", @@ -12048,8 +12048,8 @@ "deleteReportsTitle": "Supprimer des rapports", "deleteReportsMsg": "Voulez-vous vraiment supprimer {count} rapport ? | Voulez-vous vraiment supprimer {count} rapports ?", "add": "Ajouter un rapport", - "search": "Rapport de recherche", - "update": "Rapport de mise à jour", + "search": "Rechercher un rapport", + "update": "Mettre à jour le rapport", "folder": "Dossier", "dashboardFolder": "Dossier", "dashboard": "Tableau de bord", @@ -12228,7 +12228,7 @@ "allAgents": "Tous les agents", "agentCountBadgeSingular": "{count} agent | {count} agents", "serviceGraph": { - "searchPlaceholder": "Services de recherche", + "searchPlaceholder": "Rechercher des services", "noStreamsDetected": "Aucun flux n'a été détecté. Assurez-vous que les métriques du graphique de service incluent les libellés stream_name.", "borderColor": "Couleur de la bordure", "borderColorMetric": "Erreurs", @@ -12289,13 +12289,13 @@ "errorLoadFailed": "Échec du chargement des données du graphe de services. Consultez les journaux du serveur." }, "openInFullView": "Ouvrir en plein écran", - "viewLogs": "Afficher les journaux", + "viewLogs": "Afficher les logs", "viewLogsUnavailable": "Impossible d'ouvrir les logs pour ce span.", "viewProfile": "Voir le profil", - "backToLogs": "Retour aux journaux", + "backToLogs": "Retour aux Logs", "openInTraces": "Ouvrir dans Traces", "loadingStream": "Chargement du flux...", - "noLogsAvailableForService": "Aucun journal disponible pour ce service", + "noLogsAvailableForService": "Aucun log disponible pour ce service", "noCorrelatedLogsFound": "Aucun log corrélé trouvé pour ce span", "spanHasNoLogsShowingTrace": "Ce span n'a aucun log. Affichage des logs pour toute la trace.", "noData": { @@ -12357,7 +12357,7 @@ "fetchingTrace": "Récupération de votre trace.", "traceFilters": "Filtres de traces", "showTraces": "Afficher les traces", - "applyAndSearch": "Postulez et recherchez", + "applyAndSearch": "Appliquer et rechercher", "timestamp": "Horodatage", "noErrorPresent": "Aucune erreur présente pour ce span", "noEventsPresent": "Aucun événement pour ce span", @@ -12431,7 +12431,7 @@ "viewPretty": "Joli", "rail": { "slowestTurns": "Virages les plus lents", - "costHotspots": "Cost Hotspots", + "costHotspots": "Points chauds de coût", "toolHotspots": "Hotspots d'outils", "call": "{n} appel | {n} appels", "usedIn": "Utilisé dans", @@ -12449,7 +12449,7 @@ "turns": "Session complète · {duration}", "errorsLead": "{errors} de {total} · Tours", "errorsLeadMany": "{errors} de {total} tours", - "filterErrors": "Erreurs de filtre", + "filterErrors": "Filtrer les erreurs", "resetFilters": "Réinitialiser les filtres", "errorsNone": "Aucune erreur · {total} tours", "latencyLead": "Le plus lent {slowest} ·", @@ -12640,7 +12640,7 @@ }, "serviceGraphNodeSidePanel": { "viewRelated": "Voir les éléments associés", - "logs": "Journaux", + "logs": "Logs", "traces": "Traces", "databases": "Bases de données", "viewTraces": "Voir les traces", @@ -13032,8 +13032,8 @@ }, "quota": { "header": "Quotas", - "api-search": "Module de recherche", - "role-search": "Rôle de recherche", + "api-search": "Rechercher un module", + "role-search": "Rechercher un rôle", "moduleName": "Nom du module", "roleName": "Rôles", "unitPerSecond": "(Req/s)", @@ -13050,7 +13050,7 @@ "tcpCloseWaitPrefix": ", C:", "tcpTimeWaitPrefix": ", T:", "header": "Tous les nœuds", - "search": "Nœud de recherche", + "search": "Rechercher un nœud", "name": "Nom du nœud", "version": "Version", "cpu": "% DU PROCESSEUR", @@ -13073,12 +13073,12 @@ "waittimeLabel": "Temps d'attente", "applyFilter": "Appliquer des filtres", "searchCluster": "Cluster de recherche", - "searchRegion": "Région de recherche" + "searchRegion": "Rechercher une région" }, "regex_patterns": { "title": "Rédaction de données sensibles", "create_pattern": "Nouveau motif", - "search": "Modèle de recherche", + "search": "Rechercher un motif", "name": "Nom", "pattern": "Motif", "created_at": "Créé à", @@ -13096,7 +13096,7 @@ "unsupported_lookaround_example": "Par exemple.", "create_regex_pattern_field": "Rédiger/Supprimer à l'aide de Regex", "import": "Importer", - "import_title": "Modèle d'importation", + "import_title": "Importer un motif", "filter_by_tag": "Filtrer par tag", "refresh": "Actualiser", "loading_patterns": "Modèles de chargement...", @@ -13135,7 +13135,7 @@ "query": "Requête", "test_pattern": "Tester le modèle", "test_input": "Tester l'entrée", - "regex_pattern_label": "Modèle regex", + "regex_pattern_label": "Motif regex", "input_string": "Chaîne d'entrée", "input_string_placeholder": "Ex. 1234567890", "output": "Sortie", @@ -13185,8 +13185,8 @@ "failedToLoad": "Impossible de charger le tableau de bord de corrélation", "retryButton": "Réessayez", "noMetrics": "Aucune métrique disponible pour la corrélation", - "selectMetrics": "Sélectionnez Metric Streams", - "correlatedLogs": "Journaux corrélés", + "selectMetrics": "Sélectionnez des flux de métriques", + "correlatedLogs": "Logs", "correlatedMetrics": "Métriques corrélées", "correlatedTraces": "Traces", "loadingCorrelation": "Chargement des données de corrélation...", @@ -13198,7 +13198,7 @@ "allValues": "Toutes les valeurs", "loading": "Chargement de journaux corrélés...", "errorDetails": "Une erreur s'est produite lors de la récupération des données de log. Veuillez réessayer.", - "noData": "Aucun journal corrélé n'a été trouvé", + "noData": "Aucun log trouvé", "noDataDetails": "Aucun journal correspondant aux filtres de corrélation n'a été trouvé.", "unstableDimension": "Dimension instable : peut changer au redémarrage du pod", "resultsCount": "{count} journaux trouvés dans {stream} ({time} ms)", @@ -13208,7 +13208,7 @@ } }, "loadingLogs": "Chargement des journaux...", - "noLogsFound": "Aucun journal corrélé n'a été trouvé", + "noLogsFound": "Aucun log trouvé", "noDataFound": "Aucune donnée trouvée", "noLogsDescription": "Aucun journal n'a été trouvé pour cette corrélation dans la plage de temps sélectionnée.", "correlatedTracesFor": "Traces corrélées pour le service : {service}", @@ -13266,10 +13266,10 @@ "noMetricStreamsFor": "Aucun flux de métriques trouvé pour ce {kind}", "correlatedStreamsFor": "Flux corrélés - {service}", "metricsDashboardDescription": "Flux corrélés avec le service {service}", - "logsDashboardDescription": "Journaux corrélés avec le service {service}", + "logsDashboardDescription": "Logs corrélés avec le service {service}", "panelTimeSeriesFor": "Séries chronologiques pour {stream}", "panelTimeSeriesForWithType": "Séries chronologiques pour {stream} ({type})", - "logsPanelTitle": "Journaux - {stream}", + "logsPanelTitle": "Logs - {stream}", "logsPanelDescription": "Journaux corrélés pour le service {service}" }, "search_scheduler_job": { @@ -13307,7 +13307,7 @@ "job_delete_failed": "Impossible de supprimer la tâche de recherche", "job_applied_success": "Les offres d'emploi ont été postulées avec succès", "fetch_failed": "Impossible de récupérer l'historique des recherches. Veuillez réessayer ultérieurement.", - "logs": "Journaux" + "logs": "Logs" }, "pipeline_list": { "createBackfill": "Créer un backfill", @@ -13399,14 +13399,14 @@ "testBtn": "Testez", "importBtn": "Importer", "newModel": "Nouveau modèle", - "importTitle": "Modèle de tarification des importations", + "importTitle": "Importer la tarification des modèles", "errorValidations": "Validations d'erreurs", "outputMessages": "Messages de sortie", "modelNameLabel": "Nom du modèle*", "matchPatternLabel": "Schéma de correspondance *", "modelPricingCreation": "Création d'un modèle de tarification", "fileUploadTab": "Téléchargement de fichiers/JSON", - "urlImportTab": "Importation d'URL", + "urlImportTab": "Importation par URL", "editTitle": "Modifier la tarification du modèle", "newTitle": "Nouveau modèle de tarification", "modelDetails": "Détails du modèle", @@ -13417,10 +13417,10 @@ "matchPatternTooltip": "Expression régulière comparée aux noms de modèles ingérés pour appliquer cette règle de tarification.", "patternExamplesBtn": "Voir des exemples de modèles", "patternExamplesTitle": "Exemples de modèles de correspondance", - "patternExamplesDesc": "Modèles regex courants utilisés pour les modèles populaires", + "patternExamplesDesc": "Motifs regex courants utilisés pour les modèles populaires", "patternExamplesModelCol": "modèle", "patternExamplesPatternCol": "Schéma de match", - "copyPattern": "Motif de copie", + "copyPattern": "Copier le motif", "copied": "Copié !", "pricingTiers": "Niveaux de tarification", "pricingTiersDesc": "Le premier palier est le palier par défaut. Les paliers supplémentaires s'appliquent lorsque leur condition d'utilisation et leur fenêtre horaire UTC sont remplies.", @@ -13446,7 +13446,7 @@ "colActions": "Actions", "colPattern": "Motif", "colPricingSimple": "Tarification", - "testMatchTitle": "Correspondance du modèle de test", + "testMatchTitle": "Tester la correspondance de modèle", "testMatchSubtitle": "Simulez comment un nom de modèle de vos spans correspondrait aux règles de tarification.", "modelNameInput": "Nom du modèle", "modelNameHint": "Le nom du modèle indiqué sur vos générations.", @@ -13464,7 +13464,7 @@ "pricePerMTokens": "Prix/1 million de jetons", "noPricingForTier": "Aucune tarification n'est définie pour ce niveau.", "close": "Fermer", - "testMatch": "Match d'essai", + "testMatch": "Tester la correspondance", "threshold": "Seuil", "sourceBuiltIn": "Modèle intégré fourni par {product}", "sourceInherited": "Hérité de Global", @@ -13495,7 +13495,7 @@ "builtInRefreshed": "Modèles intégrés actualisés", "noModelsSelected": "Aucun modèle sélectionné pour l'exportation", "confirmDeleteSelectedTitle": "Supprimer les modèles sélectionnés", - "confirmDeleteSelectedMessage": "Êtes-vous sûr de vouloir supprimer {count} modèle (s) sélectionné (s) ?", + "confirmDeleteSelectedMessage": "Voulez-vous vraiment supprimer {count} modèle sélectionné ? | Voulez-vous vraiment supprimer {count} modèles sélectionnés ?", "deletedModelsNotif": "{count} modèle supprimé | {count} modèles supprimés", "modelNamePlaceholder": "p. ex. {example}", "matchPatternPlaceholder": "p. ex. {example}", @@ -13603,7 +13603,7 @@ "experiments": "Expériences", "quality": "Qualité", "evalJobs": "Emplois chez Eval", - "scorers": "Buteurs", + "scorers": "Évaluateurs", "scoreConfigs": "Configurations de score", "remoteTasks": "Tâches distantes", "playground": "Bac à sable", @@ -15266,11 +15266,11 @@ "session": "session" }, "description": "Choisissez un Eval Job à exécuter sur cette cible. Le worker d'évaluation chargera la télémétrie source à partir de la plage temporelle de cette page.", - "jobLabel": "Eval Job", - "jobPlaceholder": "Sélectionnez un Eval Job", - "jobRequired": "Sélectionnez un Eval Job", + "jobLabel": "Tâche d'évaluation", + "jobPlaceholder": "Sélectionnez une tâche d'évaluation", + "jobRequired": "Sélectionnez une tâche d'évaluation", "noCompatibleJobs": "Aucun job d'évaluation {scope} n'utilise le flux de traces {stream}.", - "loadJobsError": "Échec du chargement des Eval Jobs.", + "loadJobsError": "Échec du chargement des tâches d'évaluation.", "run": "Exécuter l'évaluation", "queued": "{count} tâche d'évaluation en file d'attente. | {count} tâches d'évaluation en file d'attente.", "runError": "Échec de la mise en file d'attente de l'évaluation." @@ -15278,7 +15278,7 @@ "tabs": { "quality": "Qualité", "jobs": "Emplois chez Eval", - "scorers": "Buteurs", + "scorers": "Évaluateurs", "scoreConfigs": "Configurations de score" }, "quality": { @@ -15310,7 +15310,7 @@ "title": "Succès du scoreur" }, "scorerFailures": { - "title": "Défaillances des buteurs" + "title": "Échecs des évaluateurs" }, "latencyP95": { "title": "Latence du scoreur p95" @@ -15332,7 +15332,7 @@ "distributionTitle": "Répartition des scores", "categoryDistributionTitle": "Distribution des catégories", "healthyRateTitle": "Taux de santé dans le temps", - "trueRateTitle": "Taux de vrai dans le temps", + "trueRateTitle": "Taux de résultats vrais dans le temps", "trueFalseTitle": "Vrai contre faux", "legendAvg": "Moyenne", "legendThreshold": "seuil {'{'}direction{'}'} {'{'}value{'}'}", @@ -15341,7 +15341,7 @@ "legendHealthy": "en bonne santé", "legendUnhealthy": "mauvais pour la santé", "legendHealthyRate": "Taux de santé", - "legendTrueRate": "Taux de vrai", + "legendTrueRate": "Taux de résultats vrais", "legendTrueCount": "vrai ({count})", "legendFalseCount": "faux ({count})", "kpis": { @@ -15350,7 +15350,7 @@ "p95": "P95", "unhealthy": "Malsain", "healthy": "En bonne santé", - "trueRate": "Taux de vrai", + "trueRate": "Taux de résultats vrais", "falseRate": "Taux de faux", "coverage": "Couverture", "targetsScored": "Cibles notées" @@ -15392,7 +15392,7 @@ } }, "overview": { - "searchPlaceholder": "Configurations de filtres...", + "searchPlaceholder": "Filtrer les configurations…", "relativeTime": { "daysAgo": "il y a {day}j", "monthsAgo": "il y a {month}mo" @@ -15423,7 +15423,7 @@ }, "singular": { "jobs": "Emploi Eval", - "scorers": "Buteur", + "scorers": "Évaluateur", "scoreConfigs": "Configuration du score", "providers": "Prestataire" }, @@ -15475,9 +15475,9 @@ "authEditNote": "Les informations d'identification ne peuvent pas être relues. Pour tester un fournisseur nécessitant une authentification, saisissez sa clé API.", "cannotRename": "Ne peut pas être renommé après la création.", "saveError": "Impossible d'enregistrer le fournisseur", - "nameRequired": "Provider name is required", - "typeRequired": "Provider type is required", - "defaultModelRequired": "Default model is required", + "nameRequired": "Le nom du fournisseur est requis", + "typeRequired": "Le type de fournisseur est requis", + "defaultModelRequired": "Le modèle par défaut est requis", "testRunning": "Test de la connexion en cours...", "testPassed": "Connecté", "testFailed": "Échec de la connexion", @@ -15576,8 +15576,8 @@ "thresholdEmptyHint": "Laisser ce champ vide signifie que cette dimension ne contribuera pas aux signaux d'état de qualité dans le produit. Les scores seront tout de même enregistrés mais ne déclencheront pas d'indicateurs de problème.", "saveError": "Impossible d'enregistrer la configuration du score", "validation": { - "nameRequired": "Name is required", - "nameFormat": "Use lowercase letters, numbers, and underscores only", + "nameRequired": "Le nom est requis", + "nameFormat": "Utilisez uniquement des lettres minuscules, des chiffres et des traits de soulignement", "minRequired": "Min is required", "maxRequired": "Max is required", "maxNotGreaterThanMin": "Max doit être supérieur à Min" @@ -15793,29 +15793,29 @@ "addButton": "+ Ajouter un en-tête" }, "requestBodyLabel": "Modèle de corps de demande", - "saveError": "N'a pas réussi à sauver le buteur", + "saveError": "Impossible d'enregistrer l'évaluateur", "validation": { - "nameRequired": "Scorer name is required", - "providerRequired": "A provider is required", - "endpointRequired": "An endpoint URL is required", - "bearerTokenRequired": "Token is required", - "basicUsernameRequired": "Username is required", - "basicPasswordRequired": "Password is required", - "apiKeyHeaderRequired": "Header name is required", - "apiKeyTokenRequired": "Token is required", - "timeoutInvalid": "Timeout must be 0 or greater", - "retriesInvalid": "Retries must be 0 or greater", - "duplicateFieldName": "Field names must be unique" + "nameRequired": "Le nom de l'évaluateur est requis", + "providerRequired": "Un fournisseur est requis", + "endpointRequired": "Une URL de point de terminaison est requise", + "bearerTokenRequired": "Le jeton est requis", + "basicUsernameRequired": "Le nom d'utilisateur est requis", + "basicPasswordRequired": "Le mot de passe est requis", + "apiKeyHeaderRequired": "Le nom de l'en-tête est requis", + "apiKeyTokenRequired": "Le jeton est requis", + "timeoutInvalid": "Le délai d'expiration doit être supérieur ou égal à 0", + "retriesInvalid": "Le nombre de tentatives doit être supérieur ou égal à 0", + "duplicateFieldName": "Les noms de champs doivent être uniques" }, "versionsLoadError": "Impossible de charger les versions de configuration des scores", "testPanel": { - "title": "Testez ce score", - "hint": "Essayez votre marqueur avec des exemples de données avant de sauvegarder. Les essais ne sont pas poursuivis.", + "title": "Tester cet évaluateur", + "hint": "Essayez votre évaluateur avec des exemples de données avant d'enregistrer. Les exécutions de test ne sont pas conservées.", "emptyPrefix": "Ajoutez des variables telles que ", "emptySuffix": " au modèle de score pour tester avec des champs d'échantillonnage.", "runButton": "Exécuter un test", "disabledHint": "Renseignez le nom, le fournisseur, le modèle et chaque valeur de variable pour lancer un test.", - "stateRunning": "Test de buteur en course à pied...", + "stateRunning": "Test de l'évaluateur en cours...", "successHeader": "Succès", "errorHeader": "Échec du test", "errorFallback": "Le test de l'évaluateur a échoué. Consultez les logs du serveur pour plus de détails.", @@ -15911,7 +15911,7 @@ "samplingValuePreview": "Évalue {percent}% des cibles correspondantes.", "samplingValueAllHelp": "Chaque cible correspondante est évaluée.", "samplingHelp": "S'exécute après le filtrage, pour contrôler les coûts.", - "backTo": "Retour à Eval Jobs", + "backTo": "Retour aux tâches d'évaluation", "createTitle": "Nouveau job d'évaluation", "editTitle": "Mettre à jour le job d'évaluation", "stepper": { @@ -15920,7 +15920,7 @@ "detailsSection": "Détails", "targetSection": "Cible d'évaluation", "filteringSection": "Filtrage", - "scorersSection": "Buteurs et cartographie", + "scorersSection": "Évaluateurs et mappage", "nameLabel": "Nom", "namePlaceholder": "Moniteur de fidélité de la production", "streamLabel": "Flux", @@ -15955,7 +15955,7 @@ "all": "Tous" }, "scorerPicker": { - "title": "Buteurs", + "title": "Évaluateurs", "hint": { "span": "Sélectionnez un ou plusieurs évaluateurs à exécuter pour chaque span correspondant.", "trace": "Sélectionnez un ou plusieurs évaluateurs à exécuter pour chaque trace éligible.", @@ -15967,7 +15967,7 @@ "empty": "Aucun évaluateur disponible. Créez-en un d'abord dans l'onglet Évaluateurs." }, "filter": { - "title": "État du filtre", + "title": "Condition de filtre", "hint": { "span": "Seuls les spans correspondant à cette condition entrent dans l'échantillonnage et la notation.", "trace": "Une trace est soumise à l'échantillonnage et à la notation si l'un de ses spans correspond à cette condition.", @@ -16000,7 +16000,7 @@ "systemProvided": "Valeurs fournies par le système · Pour chaque {scope} évalué par ce job", "spanAttributes": "Attributs de span" }, - "selectScorers": "Sélectionnez les marqueurs pour configurer leurs mappages.", + "selectScorers": "Sélectionnez des évaluateurs pour configurer leurs mappages.", "noVariables": "Ce scoreur n'a aucune variable de modèle à mapper.", "variableCount": "{count} variables", "systemProvided": { @@ -16097,24 +16097,24 @@ "statusDraft": "Brouillon", "emptyValue": "—" }, - "selectAtLeastOne": "Sélectionnez au moins un buteur", + "selectAtLeastOne": "Sélectionnez au moins un évaluateur", "saveError": "Impossible d'enregistrer la tâche d'évaluation", "createdAndActivated": "Tâche d'évaluation créée et activée", "createdButActivateFailed": "Tâche d'évaluation créée, mais l'activation a échoué", "savedAndActivated": "Job d'évaluation enregistré et activé", "savedButActivateFailed": "Job d'évaluation enregistré, mais l'activation a échoué", "validation": { - "nameRequired": "Job name is required", - "streamRequired": "A stream is required", + "nameRequired": "Le nom de la tâche est requis", + "streamRequired": "Un flux est requis", "idleWindowMinimum": "La fenêtre d'inactivité doit être d'au moins 1 seconde", "idleWindowMaximumTrace": "La fenêtre d'inactivité de la trace ne peut pas dépasser 30 minutes.", "idleWindowMaximumSession": "La fenêtre d'inactivité de session ne peut pas dépasser 4 heures", "maxAgeMaximumTrace": "L'âge maximal de la trace ne peut pas dépasser 2 heures.", "maxAgeMaximumSession": "L'âge maximal de session ne peut pas dépasser 24 heures", - "samplingValueRequired": "A sampling value is required" + "samplingValueRequired": "Une valeur d'échantillonnage est requise" } }, - "importCount": "Importation ({count})", + "importCount": "Importer ({count})", "count": "Nombre", "failedToDeriveSchema": "Échec de la dérivation du schéma", "failedToImportScoreConfig": "Échec de l'importation de la configuration de score", @@ -16150,7 +16150,7 @@ "tabLabel": "Fournisseurs de LLM", "title": "Fournisseurs de LLM", "newButton": "Nouveau fournisseur", - "searchPlaceholder": "Fournisseurs de recherche", + "searchPlaceholder": "Rechercher des fournisseurs", "defaultBadge": "Par défaut", "loadError": "Impossible de charger les fournisseurs LLM", "columns": { @@ -16170,7 +16170,7 @@ "description": "Il n'y a pas encore de données dans cette organisation, il n'y a donc aucun flux à explorer. Envoyez vos premiers journaux et ils s'afficheront automatiquement ici. Choisissez par où vous voulez commencer.", "curl": "Envoyer via l'API Curl/HTTP", "curlDesc": "Méthode la plus rapide : collez une commande et les journaux commencent à circuler", - "shippers": "Utilisez un chargeur de grumes", + "shippers": "Utilisez un agent d'expédition de logs", "shippersDesc": "{product1}, {product2}, {product3}, {product4}, {product5} et plus", "otelDesc": "Ingestion OTLP indépendante du fournisseur pour les logs, les traces et les métriques.", "or": "Ou :", @@ -16246,9 +16246,9 @@ "sqlQueryLabel": "SQL Query :", "sqlQueryCopied": "Requête SQL copiée avec succès !", "tookSeconds": "{seconds} sec", - "logs": "Journaux", + "logs": "Logs", "inspect": "Inspecter", - "functionDefinitionLabel": "Function Definition :", + "functionDefinitionLabel": "Définition de la fonction :", "functionDefinitionCopied": "Définition de fonction copiée avec succès !", "maxLimit": "Max Limit :", "queryFunctionTab": "Requête / Fonction", @@ -16814,7 +16814,7 @@ "foldersLoading": "Chargement des dossiers...", "foldersUnavailable": "Impossible de charger les dossiers. Actualisez la page et réessayez.", "hostTarget": "Hôte", - "hostTargetPlaceholder": "example.com or example.com:8443", + "hostTargetPlaceholder": "example.com ou example.com:8443", "name": "Nom", "namePlaceholder": "Ma vérification navigateur", "removeTag": "Supprimer le tag {tag}", @@ -16994,9 +16994,9 @@ "locatorOverrideApply": "Ajouter à la liste", "locatorTriedFirst": "Essayé en premier", "locatorDerivedKindHelp": "Lu à partir de ce que vous avez tapé — le préfixe décide comment le runner le résout.", - "locatorOverridePlaceholder": "#my-button or [data-test=\"sign-in\"]", + "locatorOverridePlaceholder": "#my-button ou [data-test=\"sign-in\"]", "locatorEmptyLabel": "Comment trouver cet élément", - "locatorEmptyPlaceholder": "#my-button or [data-test=\"sign-in\"]", + "locatorEmptyPlaceholder": "#my-button ou [data-test=\"sign-in\"]", "locatorDraftPending": "Appuyez sur Entrée ou + pour ajouter ceci à la liste", "locatorOrderHelp": "Essayés dans l'ordre, du haut vers le bas. Le premier qui correspond est utilisé.", "locatorOrigin": { @@ -17578,18 +17578,18 @@ "colStep": "Étape", "colDuration": "Durée", "filterAll": "All", - "firstPartyOnly": "First-party only", - "noEventsInStep": "No events in this step's window.", - "noEvents": "No console, network or page events were captured.", - "unattributed": "Not attributed to a step", + "firstPartyOnly": "Ressources propriétaires uniquement", + "noEventsInStep": "Aucun événement dans la fenêtre de cette étape.", + "noEvents": "Aucun événement de console, de réseau ou de page n'a été capturé.", + "unattributed": "Non attribué à une étape", "unattributedOption": "Non attribué à une étape ({count})", "allSteps": "Toutes les étapes ({count})", "stepOption": "{number} · {name} ({count})", - "truncated": "Capture cap reached (2000 events / 256 KB). Later events are not in this bundle — download to see what was kept.", - "captureOff": "Evidence capture is off for this check.", - "failuresOnly": "Evidence is kept for failed runs only.", - "none": "No evidence bundle was uploaded for this attempt.", - "loadFailed": "Could not load the evidence bundle: {error}", + "truncated": "Limite de capture atteinte (2000 événements / 256 Ko). Les événements suivants ne figurent pas dans ce lot — téléchargez-le pour voir ce qui a été conservé.", + "captureOff": "La capture des preuves est désactivée pour cette vérification.", + "failuresOnly": "Les preuves ne sont conservées que pour les exécutions en échec.", + "none": "Aucun lot de preuves n'a été envoyé pour cette tentative.", + "loadFailed": "Impossible de charger le lot de preuves : {error}", "loadFailedDetail": "Détails : {error}", "loadFailedExpired": "Le lien de téléchargement pour ce pack de preuves a expiré. Rechargez l'exécution pour en obtenir un nouveau.", "loadFailedMissing": "Ce pack de preuves n'est plus en stockage. Les packs sont supprimés lorsque l'exécution dépasse sa période de rétention.", @@ -17696,8 +17696,8 @@ "passRateByEnvironment": "Taux de réussite par environnement", "passRateByLocation": "Taux de réussite par emplacement", "durationByLocation": "Durée par emplacement (moy.)", - "flakyRate": "Flaky Rate", - "stepsWindowTruncated": "Showing the newest {count} executions ({from} – {to}); the selected range holds more.", + "flakyRate": "Taux d'instabilité", + "stepsWindowTruncated": "Affichage des {count} exécutions les plus récentes ({from} – {to}) ; la plage sélectionnée en contient davantage.", "stepsErrorExcluded": "{count} exécutions n'ont pas pu être exécutées (erreur) et ne sont pas affichées ici — voir l'onglet Vue d'ensemble.", "retryRate": "Taux de nouvelle tentative", "statusTimeline": "Chronologie des statuts", @@ -18235,13 +18235,13 @@ "footerMacHint": "⌘= Cmd sur Mac · Ctrl sur Windows", "modules": { "global": "Mondial", - "logs": "Journaux", + "logs": "Logs", "dashboards": "Tableaux de bord", "metrics": "Métriques", "traces": "Traces", "alerts": "Alertes", "streams": "Flux", - "pipelines": "Canalisations", + "pipelines": "Pipelines", "functions": "Fonctions", "reports": "Rapports", "iam": "GIA", @@ -18255,7 +18255,7 @@ }, "pages": { "global": "Mondial", - "logs": "Journaux", + "logs": "Logs", "dashboardsList": "Tableaux de bord", "dashboards": "Affichage du tableau de bord", "dashboardsPanel": "Tableau de bord — Panneau (passez la souris sur un panneau)", @@ -18263,7 +18263,7 @@ "traces": "Traces", "alerts": "Alertes", "streams": "Flux", - "pipelines": "Canalisations", + "pipelines": "Pipelines", "functions": "Fonctions", "reports": "Rapports", "iamUsers": "IAM — Utilisateurs", @@ -18279,11 +18279,11 @@ "ingestionTokens": "IAM — Jetons d'ingestion", "syntheticsTokens": "IAM — Jetons de synthèse", "alertIncidents": "Alertes — Incidents", - "pipelineDestinations": "Canalisations — Destinations", + "pipelineDestinations": "Pipelines — Destinations", "enrichmentTables": "Tableaux d'enrichissement", "iamInvitations": "IAM — Invitations", "iamOrganizations": "IAM — Organisations", - "regexPatterns": "Modèles Regex", + "regexPatterns": "Motifs regex", "cipherKeys": "Clés de chiffrement", "nodes": "Nœuds", "modelPricing": "Tarification des modèles", @@ -18291,7 +18291,7 @@ "searchHistory": "Historique des recherches", "sessions": "Séances", "evalTemplates": "Evaluations en ligne — Modèles", - "scorers": "Evaluations en ligne — Buteurs", + "scorers": "Évaluations en ligne — Évaluateurs", "evalJobs": "Evals en ligne — Offres d'emploi", "scoreConfigs": "Evaluations en ligne — Configurations des scores", "actions": "Actions", @@ -18302,9 +18302,9 @@ "rumSessions": "{product} — Sessions", "sourceMaps": "RUM — Cartes des sources", "oncall": "Astreinte", - "oncallDetail": "Page d'astreinte", + "oncallDetail": "Notification d'astreinte", "syntheticsJourney": "Parcours synthétique", - "downtimes": "Indisponibilités" + "downtimes": "Périodes de maintenance" }, "actions": { "openCheatsheet": "Ouvrir un aide-mémoire sur les raccourcis clavier", @@ -18316,7 +18316,7 @@ "logsToggleHistogram": "Basculer l'histogramme", "logsToggleSidebar": "Barre latérale de désactivation des champs", "dashboardsListAdd": "Nouveau tableau de bord", - "dashboardsListImport": "Tableau de bord d'importation", + "dashboardsListImport": "Importer un tableau de bord", "dashboardsListRefresh": "Actualiser la liste", "dashboardRefresh": "Actualiser tous les panneaux", "dashboardAddPanel": "Ajouter un nouveau panneau", @@ -18325,7 +18325,7 @@ "dashboardLayoutRedo": "Rétablir la modification de disposition", "dashboardLayoutExit": "Quitter la modification de la disposition", "dashboardFullscreen": "Basculer en mode plein écran", - "dashboardExport": "Tableau de bord d'exportation", + "dashboardExport": "Exporter le tableau de bord", "tableRowEdit": "Modifier la ligne survolée", "tableRowDuplicate": "Dupliquer la ligne survolée", "tableRowPause": "Suspendre la ligne survolée", @@ -18333,8 +18333,8 @@ "tableRowDelete": "Supprimer la ligne survolée (ouvre la boîte de dialogue de confirmation)", "panelView": "Afficher le panneau en plein écran", "panelQueryInspector": "Ouvrez l'inspecteur de requêtes", - "panelEdit": "Panneau d'édition", - "panelDuplicate": "Panneau dupliqué", + "panelEdit": "Modifier le panneau", + "panelDuplicate": "Dupliquer le panneau", "panelDelete": "Supprimer le panneau", "panelEditorQueryInspector": "Ouvrez l'inspecteur de requêtes", "metricsRunQuery": "Exécuter une requête ProMQL", @@ -18348,7 +18348,7 @@ "streamsAdd": "Ajouter un nouveau flux", "streamsRefresh": "Actualiser la liste", "pipelinesAdd": "Créer un nouveau pipeline", - "pipelinesImport": "Pipeline d'importation", + "pipelinesImport": "Importer un pipeline", "pipelinesRefresh": "Actualiser la liste", "functionsAdd": "Ajouter une nouvelle fonction", "functionsRefresh": "Actualiser la liste", @@ -18369,9 +18369,9 @@ "alertTemplatesAdd": "Ajouter un nouveau modèle", "alertTemplatesRefresh": "Actualiser la liste", "logsSearchHistory": "Ouvrir l'historique des recherches", - "alertsImport": "Alerte d'importation", + "alertsImport": "Importer une alerte", "panelEditorRun": "Exécuter/appliquer une requête", - "panelEditorSave": "Panneau de sauvegarde", + "panelEditorSave": "Enregistrer le panneau", "panelEditorBack": "Jeter et revenir en arrière", "traceNextSpan": "Span suivant", "tracePrevSpan": "Span précédent", @@ -18410,14 +18410,14 @@ "rumSessionsRefresh": "Actualiser la liste", "rumSessionsCopyUrl": "Copier l'URL de partage de session replay", "sourceMapsRefresh": "Actualiser la liste", - "oncallRefresh": "Actualiser les pages", + "oncallRefresh": "Actualiser les notifications", "oncallNewTeam": "Nouvelle équipe", "oncallAck": "Acquitter", "oncallEscalate": "Escalader", "oncallSnooze": "Reporter", "oncallResolve": "Résoudre", - "downtimesCreate": "Nouvelle indisponibilité", - "downtimesRefresh": "Actualiser les indisponibilités", + "downtimesCreate": "Nouvelle période de maintenance", + "downtimesRefresh": "Actualiser les périodes de maintenance", "functionsImport": "Importer une fonction", "logsNextRow": "Log suivant (ouvre les détails)", "logsPrevRow": "Log précédent (ouvre les détails)", @@ -19204,7 +19204,7 @@ "settings": { "message": "{prefix} : {message}", "aiCreditsUpdatedSuccessfully": "Crédits IA mis à jour avec succès.", - "syntheticsStepsUpdatedSuccessfully": "Synthetics steps updated successfully.", + "syntheticsStepsUpdatedSuccessfully": "Étapes Synthetics mises à jour avec succès.", "updatingAiCredits": "Mise à jour des crédits IA...", "updatingSyntheticsSteps": "Mise à jour des étapes synthétiques..." }, @@ -19276,21 +19276,21 @@ "userSaveFailed": "Impossible d'enregistrer l'utilisateur" }, "downtimes": { - "cancelled": "Indisponibilité annulée", - "cancelledMany": "{count} indisponibilité annulée | {count} indisponibilités annulées", - "cancelFailed": "Impossible d'annuler l'indisponibilité", + "cancelled": "Période de maintenance annulée", + "cancelledMany": "{count} période de maintenance annulée | {count} périodes de maintenance annulées", + "cancelFailed": "Impossible d'annuler la période de maintenance", "extended": "Prolongée jusqu'à {time}", "extendedFollowUp": "{name} créée, active jusqu'à {time}", - "extendFailed": "Impossible de prolonger l'indisponibilité", + "extendFailed": "Impossible de prolonger la période de maintenance", "reload": "Recharger", - "deleted": "Indisponibilité supprimée", - "deleteFailed": "Impossible de supprimer l'indisponibilité", - "created": "Indisponibilité créée", - "updated": "Indisponibilité enregistrée", - "saveFailed": "Impossible d'enregistrer l'indisponibilité", + "deleted": "Période de maintenance supprimée", + "deleteFailed": "Impossible de supprimer la période de maintenance", + "created": "Période de maintenance créée", + "updated": "Période de maintenance enregistrée", + "saveFailed": "Impossible d'enregistrer la période de maintenance", "muted": "Mise en sourdine de {count} élément jusqu'à {time}. Classé dans {folder}. | Mise en sourdine de {count} éléments jusqu'à {time}. Classés dans {folder}.", "muteFailed": "Impossible de créer la sourdine", - "viewDowntime": "Voir l'indisponibilité", + "viewDowntime": "Voir la période de maintenance", "itemsDropped": "{count} élément choisi est en dehors des dossiers choisis et a été supprimé. | {count} éléments choisis sont en dehors des dossiers choisis et ont été supprimés." } }, @@ -19302,7 +19302,7 @@ "title": "SLOs", "notFound": "SLO introuvable", "notFoundDescription": "Ce SLO n'existe plus, ou vous n'y avez pas accès. Il a peut-être été supprimé.", - "subtitle": "Objectifs de niveau de service : cibles, budgets d'erreur, alertes de vitesse de combustion.", + "subtitle": "Objectifs de niveau de service : cibles, budgets d'erreur, alertes de taux d'épuisement.", "new": "Nouveau SLO", "newTitle": "Nouveau SLO", "editTitle": "Modifier le SLO", @@ -19374,7 +19374,7 @@ "status": "Statut", "statusVsTarget": "Statut vs cible", "budgetRemaining": "Budget restant", - "burnRate": "Taux de combustion", + "burnRate": "Taux d'épuisement", "coverage": "Couverture", "window": "Fenêtre", "tags": "Étiquettes", @@ -19387,7 +19387,7 @@ "status": "Statut ({window})", "target": "Cible", "budgetRemaining": "Budget restant", - "burnRate": "Taux de combustion", + "burnRate": "Taux d'épuisement", "timeToExhaust": "Temps avant épuisement", "coverage": "Couverture" }, @@ -19438,7 +19438,7 @@ "groupsEstimate": "Estimation de cardinalité", "groupsEstimateHint": "Utilisé pour dimensionner la réservation de lignes. Le double de cette valeur est réservé, afin de laisser de la marge pour la croissance organique.", "errorBudget": "Budget d'erreur", - "maxBurnRate": "Taux de combustion maximal", + "maxBurnRate": "Taux d'épuisement maximal", "reservation": "Réservation", "sliType": "Type de SLI", "owner": "Propriétaire", @@ -19560,9 +19560,9 @@ }, "chart": { "budgetTitle": "Burndown du budget d'erreur", - "burnTitle": "Taux de combustion", + "burnTitle": "Taux d'épuisement", "budgetRemaining": "Budget restant", - "burnRate": "Taux de combustion", + "burnRate": "Taux d'épuisement", "cumulativeHint": "cumulé sur la fenêtre", "perBucketHint": "par intervalle", "exhausted": "Budget épuisé (0%)", @@ -19581,21 +19581,21 @@ "budgetFormulaPerSlice": "pourcentage restant = 100 × (1 − mauvais jusqu'ici ÷ budget)\nbudget = secondes mesurées dans la fenêtre × (100% − objectif)\n\nUne tranche entière est notée bonne ou mauvaise, donc ce SLI compte les SECONDES.\n\naxe de droite (tranches mauvaises encore abordables) :\n= budget × pourcentage restant ÷ 100 ÷ intervalle de tranche", "budgetNote": "Le dernier point correspond à la tuile Budget restant ci-dessus. La ligne pointillée à 0% est l'épuisement ; en dessous, le SLO a dépensé plus d'erreurs que ne le permet l'objectif. Les lacunes sont des compartiments sans mesure, ce qui n'est pas la même chose que zéro.", "burnExplain": "Vitesse à laquelle le budget se consume dans chaque intervalle, en multiple du taux neutre du budget.", - "burnFormula": "taux de combustion = (100% − SLI) ÷ (100% − objectif)\nSLI = 100 × bon ÷ total, pour ce compartiment uniquement\n\naxe de droite (la même ligne lue comme SLI) :\nSLI = 100% − taux de combustion × (100% − objectif)", - "burnNote": "×1 dépense le budget exactement à la fin de la fenêtre, ×2 dans la moitié du temps ; sous ×1, le budget est mis de côté. Comme c'est par intervalle et non cumulatif, un pic reste visible ici au lieu d'être lissé. L'axe droit descend : plus haut dans le graphique signifie plus de combustion, donc un SLI plus bas.", - "corrected": "Corrigé par une indisponibilité", - "correctedTooltip": "Corrigé par une indisponibilité : exclu, donc la ligne de budget reste plate" + "burnFormula": "taux d'épuisement = (100% − SLI) ÷ (100% − objectif)\nSLI = 100 × bon ÷ total, pour ce compartiment uniquement\n\naxe de droite (la même ligne lue comme SLI) :\nSLI = 100% − taux d'épuisement × (100% − objectif)", + "burnNote": "×1 dépense le budget exactement à la fin de la fenêtre, ×2 dans la moitié du temps ; sous ×1, le budget est mis de côté. Comme c'est par intervalle et non cumulatif, un pic reste visible ici au lieu d'être lissé. L'axe droit descend : plus haut dans le graphique signifie un épuisement plus rapide, donc un SLI plus bas.", + "corrected": "Corrigé par une période de maintenance", + "correctedTooltip": "Corrigé par une période de maintenance : exclu, donc la ligne de budget reste plate" }, "alerts": { "title": "Alertes", "add": "Ajouter une alerte", "disabled": "Désactivé", "emptyTitle": "Aucune alerte sur ce SLO pour le moment.", - "emptyHint": "Les alertes de taux de combustion vous préviennent tant qu'il reste encore du budget à protéger.", + "emptyHint": "Les alertes de taux d'épuisement vous préviennent tant qu'il reste encore du budget à protéger.", "emptyActionDesc": "Soyez averti avant l'épuisement du budget", "loadFailed": "Impossible de charger les alertes de ce SLO.", "editTargetMissing": "Cette alerte ne fait plus partie de ce SLO.", - "describeBurn": "Taux de combustion > {critical} sur {long} et {short}", + "describeBurn": "Taux d'épuisement > {critical} sur {long} et {short}", "describeBudget": "Budget d'erreur consommé > {critical}%" }, "validation": { @@ -21114,9 +21114,9 @@ "railLabel": "Sections de métriques", "noAccess": "Vous n'avez pas la permission de lire {stream}. Demandez à un administrateur l'accès en lecture à ce flux.", "serverStreamMissing": { - "title": "No server activity collected yet", - "description": "This chart reads samples from {stream}, which a database receiver creates. Traces alone cannot fill it.", - "action": "Set up a database receiver" + "title": "Aucune activité serveur collectée pour l'instant", + "description": "Ce graphique lit les échantillons de {stream}, que crée un récepteur de base de données. Les traces seules ne peuvent pas l'alimenter.", + "action": "Configurer un récepteur de base de données" }, "byDims": { "query": "par requête", @@ -21943,7 +21943,7 @@ "railStartPreset": "Démarrer à partir d'un modèle", "rungReachedNobodyRetrying": "Personne n'a été joint — nouvelle tentative", "rungMatchedNobody": "Aucune correspondance — l'escalade s'est immédiatement poursuivie", - "deliveriesRoomPosts": "Messages de salon — diffusions, pas des alertes individuelles", + "deliveriesRoomPosts": "Messages de salon — diffusions, pas des notifications individuelles", "roomPosted": "Publié", "roomPostFailed": "Échec de la publication — personne n'a été joint", "rungImmediately": "immédiatement", @@ -22011,7 +22011,7 @@ "setDefaultTeam": "Définir comme équipe par défaut", "manageTeamCta": "Gérer les membres, le planning et l'escalade", "teamName": "Nom", - "teamNameHint": "Comment cette équipe est désignée sur une page", + "teamNameHint": "Comment cette équipe est désignée dans une notification", "teamNameRequired": "Le nom de l'équipe est obligatoire", "teamNameTooLong": "Le nom de l'équipe ne peut pas dépasser 200 caractères", "timezone": "Fuseau horaire", @@ -22033,7 +22033,7 @@ "shiftDaily": "Quotidien", "shiftWeekly": "Hebdomadaire", "shiftFortnightly": "Toutes les deux semaines", - "responsesTitle": "Pages d'astreinte", + "responsesTitle": "Notifications d'astreinte", "pagesNav": "Notifications", "responsesSubtitle": "Ce qui a envoyé une notification à une personne, et ce qui s'est passé ensuite", "responseDetail": "Notification", @@ -22108,7 +22108,7 @@ "snoozeDuration": "Mettre en pause pour", "snoozed": "En pause", "snoozedUntil": "En pause jusqu'à {time} — toujours non attribuée", - "snoozeFailed": "Impossible de mettre l'alerte en pause", + "snoozeFailed": "Impossible de mettre la notification en pause", "note": "Note", "notePlaceholder": "Qu'avez-vous trouvé ? Qu'avez-vous essayé ?", "addNote": "Ajouter une note", @@ -22121,16 +22121,16 @@ "activityShowSystemCount": "Afficher l'activité système ({count})", "activityHideSystem": "Masquer l'activité système", "handoff": "Transférer", - "handoffTitle": "Transférer cette alerte", + "handoffTitle": "Transférer cette notification", "handoffToPerson": "À une personne", "handoffToTeam": "À une autre équipe", - "handoffPersonHint": "La personne est contactée et l'alerte devient la sienne.", - "handoffTeamHint": "La responsabilité change de main. L'équipe réceptrice est contactée selon sa propre rotation, et l'accusé de réception est effacé pour que l'alerte soit de nouveau ouverte.", + "handoffPersonHint": "La personne est contactée et la notification devient la sienne.", + "handoffTeamHint": "La responsabilité change de main. L'équipe réceptrice est contactée selon sa propre rotation, et l'accusé de réception est effacé pour que la notification soit de nouveau ouverte.", "handoffPerson": "Personne", "handoffTeam": "Équipe", "handoffNote": "Motif (facultatif)", - "handoffDone": "Alerte transférée", - "handoffFailed": "Impossible de transférer l'alerte", + "handoffDone": "Notification transférée", + "handoffFailed": "Impossible de transférer la notification", "handoffPickOne": "Choisissez une personne ou une équipe.", "resolve": "Résoudre", "confirmRecovery": "Confirmer le rétablissement", @@ -22141,30 +22141,30 @@ "recoveryConfirmed": "Rétablissement confirmé", "confirmRecoveryFailed": "Impossible de confirmer le rétablissement", "liaisonTag": "Poste de liaison", - "liaisonBanner": "Cette alerte a été ouverte parce que la défaillance d'une autre équipe atteint votre service. Contenir l'impact est votre rôle ici — la cause appartient à l'équipe propriétaire, et vous clôturez ce dossier en confirmant votre propre rétablissement.", - "liaisonOpenOrigin": "Ouvrir l'alerte de l'équipe propriétaire", - "ladderLiaisonNote": "Une échelle de liaison se compose de l'alerte initiale et d'une relance, puis elle s'arrête. Une équipe impactée n'est jamais escaladée vers tout le monde, et cette échelle ne se répète pas et ne transfère pas l'alerte.", + "liaisonBanner": "Cette notification a été ouverte parce que la défaillance d'une autre équipe atteint votre service. Contenir l'impact est votre rôle ici — la cause appartient à l'équipe propriétaire, et vous clôturez ce dossier en confirmant votre propre rétablissement.", + "liaisonOpenOrigin": "Ouvrir la notification de l'équipe propriétaire", + "ladderLiaisonNote": "Une échelle de liaison se compose de la notification initiale et d'une relance, puis elle s'arrête. Une équipe impactée n'est jamais escaladée vers tout le monde, et cette échelle ne se répète pas et ne transfère pas la notification.", "ladderLiaisonDone": "Les deux échelons ont été envoyés et cette échelle est terminée par conception. Aucune autre action n'est requise ici.", "promote": "Promouvoir en incident", - "promoteTitle": "Promouvoir cette alerte en incident", - "promoteMessage": "Un incident associe ce déclenchement au reste du travail en cours. L'alerte reste ouverte et conserve son échelle.", + "promoteTitle": "Promouvoir cette notification en incident", + "promoteMessage": "Un incident associe ce déclenchement au reste du travail en cours. La notification reste ouverte et conserve son échelle.", "promoteIncidentTitle": "Titre de l'incident", - "promoteIncidentTitlePlaceholder": "Laissez vide pour réutiliser le titre de cette alerte", + "promoteIncidentTitlePlaceholder": "Laissez vide pour réutiliser le titre de cette notification", "promoteSeverity": "Gravité", "promoteSeverityHint": "Une promotion peut augmenter la gravité, mais jamais la réduire par rapport à ce qui a déjà déclenché une alerte.", "promoted": "Promue en incident {incident}", - "promoteFailed": "Impossible de promouvoir cette alerte", - "resolveTitle": "Résoudre cette alerte ?", + "promoteFailed": "Impossible de promouvoir cette notification", + "resolveTitle": "Résoudre cette notification ?", "resolveMessage": "Cela clôt le dossier et interrompt toute escalade ultérieure.", - "resolved": "Alerte résolue", - "resolveFailed": "Impossible de résoudre l'alerte", - "loadResponsesFailed": "Impossible de charger les alertes", - "loadResponseFailed": "Impossible de charger l'alerte", + "resolved": "Notification résolue", + "resolveFailed": "Impossible de résoudre la notification", + "loadResponsesFailed": "Impossible de charger les notifications", + "loadResponseFailed": "Impossible de charger la notification", "loadTeamFailed": "Impossible de charger l'équipe", "onCallNow": "De garde maintenant", "onCallThen": "De garde à ce moment-là", - "nobodyOnCall": "Personne n'est de garde. Ajoutez une rotation pour que les alertes atteignent quelqu'un.", - "nobodyWasOnCall": "Aucune rotation n'a désigné personne lorsque cette alerte a été clôturée.", + "nobodyOnCall": "Personne n'est d'astreinte. Ajoutez une rotation pour que les notifications atteignent quelqu'un.", + "nobodyWasOnCall": "Aucune rotation n'a désigné personne lorsque cette notification a été clôturée.", "members": "Membres", "membersHint": "Toute personne pouvant être contactée pour cette équipe. Les niveaux se définissent dans l'onglet Planning, pas ici.", "memberEmailPlaceholder": "engineer{'@'}example.com, another{'@'}example.com", @@ -22186,8 +22186,8 @@ "policy": "Politique d'escalade", "policyIfNoAck": "Si personne ne confirme, après", "policyEndsStops": "L'échelle se termine — elle s'exécute une fois, puis l'enregistrement est marqué comme sans réponse. | L'échelle se termine — elle s'exécute {count} fois, puis l'enregistrement est marqué comme sans réponse.", - "policyEndsHandsTo": "L'échelle se termine — elle s'exécute une fois, puis transmet l'alerte à l'équipe par défaut, {team}. | L'échelle se termine — elle s'exécute {count} fois, puis transmet l'alerte à l'équipe par défaut, {team}.", - "policyEndsHandsToUnset": "L'échelle se termine — elle s'exécute une fois, puis transmet l'alerte à l'équipe par défaut de l'organisation. | L'échelle se termine — elle s'exécute {count} fois, puis transmet l'alerte à l'équipe par défaut de l'organisation.", + "policyEndsHandsTo": "L'échelle se termine — elle s'exécute une fois, puis transmet la notification à l'équipe par défaut, {team}. | L'échelle se termine — elle s'exécute {count} fois, puis transmet la notification à l'équipe par défaut, {team}.", + "policyEndsHandsToUnset": "L'échelle se termine — elle s'exécute une fois, puis transmet la notification à l'équipe par défaut de l'organisation. | L'échelle se termine — elle s'exécute {count} fois, puis transmet la notification à l'équipe par défaut de l'organisation.", "policyRepeatTimes": "Exécuter l'échelle une fois | Exécuter l'échelle {count} fois", "policyFinalStop": "puis arrêter", "policyFinalNotifyDefault": "puis notifier l'équipe fourre-tout", @@ -22215,7 +22215,7 @@ "verdictTitle": "Verdict de l'IA SRE", "reportTitle": "Ce que le SRE IA a trouvé", "verdictFollowUpNote": "Un verdict reçu après l'envoi de la notification a été envoyé en suivi — la notification d'origine n'est jamais modifiée.", - "l0Hint": "Actions de l'agent entre le déclenchement d'une page et sa notification, par sévérité.", + "l0Hint": "Actions de l'agent entre le déclenchement d'une notification et son envoi, par sévérité.", "l0BySeveritySection": "Par gravité", "l0P1Lead": "Alerter immédiatement.", "l0P1Desc": "L'analyse IA s'exécute en parallèle — les notifications critiques ne sont jamais retardées.", @@ -22229,8 +22229,8 @@ "l0GateSentenceLead": "conservée pendant le délai d'attente, puis envoyée", "l0GateSentenceBold": "avec les analyses de l'IA", "l0ParallelSentence": "envoyée immédiatement ; l'agent agit en parallèle", - "l0OnlySentence": "l'agent enquête ; cette priorité ne déclenche une page que si vos niveaux le prévoient", - "l0OffSentence": "aucun SRE IA n'intervient ; la page se comporte exactement comme sans triage IA", + "l0OnlySentence": "l'agent enquête ; cette priorité n'envoie de notification que si vos niveaux le prévoient", + "l0OffSentence": "aucun SRE IA n'intervient ; la notification se comporte exactement comme sans triage IA", "l0BudgetLabel": "Délai d'attente", "l0BudgetRange": "Entre 30 et 600 secondes — le serveur refuse les valeurs en dehors de cet intervalle plutôt que de les borner", "l0FailOpen": "Fail-open — si l'agent est lent ou ne répond pas, l'alerte est envoyée immédiatement.", @@ -22355,7 +22355,7 @@ "mineNoTeams": "Vous ne faites encore partie d'aucune équipe d'astreinte.", "mineOpenPages": "Notifications qui nécessitent votre action", "phoneTitle": "Téléphone", - "phoneIntro": "Les pages urgentes peuvent vous envoyer des SMS et vous appeler ici, en plus des e-mails.", + "phoneIntro": "Les notifications urgentes peuvent vous envoyer des SMS et vous appeler ici, en plus des e-mails.", "phoneSendCode": "Envoyer le code", "phoneSendHint": "Nous envoyons par SMS un code à 6 chiffres pour confirmer qu'il vous appartient.", "phoneVerified": "Vérifié", @@ -22365,10 +22365,10 @@ "phoneResend": "Renvoyer le code", "phoneResendIn": "Renvoyer dans {time}", "phoneCodeSentTo": "Code envoyé au {phone}. Il est valable 10 minutes.", - "phoneVerifiedPress4": "Les pages qui utilisent SMS ou Voix envoient des SMS et appellent ce numéro. Pendant un appel, appuyez sur 4 pour accuser réception, 6 pour résoudre ou 8 pour escalader.", - "phoneVerifiedAckLink": "Les pages qui utilisent SMS ou Voix envoient des SMS et appellent ce numéro. Accusez réception depuis le lien dans le SMS.", - "phoneChangedHint": "Les pages n'enverront pas de SMS et n'appelleront pas ce numéro tant que vous ne l'aurez pas confirmé.", - "phoneNoProvider": "Cette organisation n'a pas encore de fournisseur téléphonique, donc les pages vous parviennent par e-mail.", + "phoneVerifiedPress4": "Les notifications qui utilisent SMS ou Voix envoient des SMS et appellent ce numéro. Pendant un appel, appuyez sur 4 pour accuser réception, 6 pour résoudre ou 8 pour escalader.", + "phoneVerifiedAckLink": "Les notifications qui utilisent SMS ou Voix envoient des SMS et appellent ce numéro. Accusez réception depuis le lien dans le SMS.", + "phoneChangedHint": "Les notifications n'enverront pas de SMS et n'appelleront pas ce numéro tant que vous ne l'aurez pas confirmé.", + "phoneNoProvider": "Cette organisation n'a pas encore de fournisseur téléphonique, donc les notifications vous parviennent par e-mail.", "phoneNoProviderLink": "Demandez à un administrateur de l'organisation d'en connecter un dans Réglages → Téléphonie.", "phoneLoadFailed": "Impossible de charger votre numéro de téléphone.", "phoneSaveFailed": "Impossible d'enregistrer ce numéro.", @@ -22395,7 +22395,7 @@ "myDeliveriesMarkUnread": "Marquer comme non lu", "myDeliveriesMarkFailed": "Impossible de mettre à jour votre boîte de réception.", "myDeliveriesNew": "Nouveau", - "myDeliveriesPage": "Page", + "myDeliveriesPage": "Notification", "myDeliveriesLandedColumn": "Livraison", "myDeliveriesSent": "Envoyées", "myDeliveriesLanded": "Vous est bien parvenu par {channel}", @@ -22412,12 +22412,12 @@ "statCovered": "Couverts", "statGaps": "Lacunes de couverture", "teamFilterUnavailable": "Liste des équipes indisponible", - "bulkSnoozeDone": "{count} alertes mises en veille", - "bulkSnoozePartial": "{count} alertes n'ont pas pu être mises en veille", - "bulkResolveDone": "{count} alertes résolues", - "bulkResolvePartial": "{count} alertes n'ont pas pu être résolues", - "bulkResolveConfirm": "Résoudre {count} alertes ? Cette action clôt chaque enregistrement et arrête toute escalade ultérieure.", - "bulkResolveTitle": "Résoudre les alertes sélectionnées", + "bulkSnoozeDone": "{count} notifications mises en pause", + "bulkSnoozePartial": "{count} notifications n'ont pas pu être mises en pause", + "bulkResolveDone": "{count} notifications résolues", + "bulkResolvePartial": "{count} notifications n'ont pas pu être résolues", + "bulkResolveConfirm": "Résoudre {count} notifications ? Cette action clôt chaque enregistrement et arrête toute escalade ultérieure.", + "bulkResolveTitle": "Résoudre les notifications sélectionnées", "retry": "Réessayer", "listTruncatedNoTotal": "Affichage des {count} premiers — il en existe plus. Affinez les filtres pour voir le reste.", "liveRefreshPaused": "L'actualisation en direct est en pause pendant que des lignes sont sélectionnées.", @@ -22433,7 +22433,7 @@ "handoffHint": "Transférer la propriété à une autre équipe. Elle est alertée selon sa propre rotation et son planning.", "escalateVsHandoff": "L'escalade : vous restez propriétaire. Le transfert : l'autre équipe devient propriétaire.", "escalated": "Escaladé au sein de {team} — vous êtes toujours le propriétaire.", - "escalatedTo": "Alerte envoyée à {who} — vous êtes toujours le propriétaire de {team}.", + "escalatedTo": "{who} a été contacté — vous restez le propriétaire pour {team}.", "statReachedRung": "Échelon actuel", "statReachedRungOf": "{n} sur {total}", "escalatedNobody": "Escaladé au sein de {team}, mais cet échelon n'a atteint personne.", @@ -22451,7 +22451,7 @@ "eventKind_exhausted": "Escalade épuisée", "responderRole_owner": "Propriétaire", "responderRole_impacted": "Impacté", - "impactedOf": "Ouvert en même temps que l'alerte d'une autre équipe", + "impactedOf": "Ouverte en même temps que la notification d'une autre équipe", "trailTitle": "Ce qui vient de se passer", "trailSubtitleNoIncident": "Ce signal n'a jamais créé d'incident — voici tout le déroulement qu'il a suivi.", "trailFired": "Signal déclenché", @@ -22463,7 +22463,7 @@ "trailNotYet": "pas encore", "trailOpen": "ouvert", "deliveries": "Notifications envoyées", - "deliveriesHint": "Chaque message que cette alerte a produit, et s'il a bien été délivré.", + "deliveriesHint": "Chaque message produit par cette notification, et s'il a bien été délivré.", "deliveryTo": "Destinataire", "deliveryRole": "Rôle", "deliveryRung": "Étape", @@ -22474,21 +22474,21 @@ "deliveryStatus_failed": "Échoué", "role_owner": "Propriétaire", "role_impacted": "Impacté", - "noDeliveries": "Aucune notification n'a encore été envoyée pour cette alerte.", + "noDeliveries": "Rien n'a encore été envoyé pour cette notification.", "loadDeliveriesFailed": "Impossible de charger les notifications", "related": "Connexes et passés", "relatedHint": "Correspondances basées sur des faits déjà en notre possession — la règle, le chemin de propriété, les liens de dépendance et la cause consignée par un humain. Non inférées.", "relatedSameAlert": "Cette alerte, auparavant", "relatedSameAlertHint": "Même règle, même seuil, un autre jour.", "relatedNearby": "En cours à proximité", - "relatedNearbyHint": "Alertes ouvertes sur ce service ou sur un service dont il dépend.", + "relatedNearbyHint": "Notifications ouvertes sur ce service ou sur un service dont il dépend.", "relatedSameService": "Autres défaillances sur ce service", "relatedSameServiceHint": "Alerte différente, même service.", "relatedSameCause": "La même cause ailleurs", "relatedSameCauseHint": "Un schéma à l'échelle de l'organisation plutôt que local.", "relatedEmpty": "Rien pour l'instant — les premiers déclenchements n'ont rien à quoi se comparer.", "relatedMore": "+{count} de plus", - "loadRelatedFailed": "Impossible de charger les alertes liées", + "loadRelatedFailed": "Impossible de charger les notifications liées", "open": "Ouvrir", "review": "Revue post-incident", "reviewHint": "Assemblée à partir de cet enregistrement. Personne ne saisit la chronologie des événements.", @@ -22708,20 +22708,20 @@ "coverageMoreChanges": "+{count} autre modification | +{count} autres modifications", "reachTeamTitle": "Joindre l'équipe", "reachTeamHint": "pendant un incident", - "contactSendTest": "Envoyer une page de test", + "contactSendTest": "Envoyer une notification de test", "takeOverride": "Couvrir un créneau d'astreinte", "reachNoDestinations": "Aucune destination de chat configurée. Ajoutez-en une dans la politique d'escalade.", - "reachDestinationHint": "Destination des alertes · les pages sont répliquées ici", - "testPageSent": "La page de test est parvenue à {count} personne | La page de test est parvenue à {count} personnes", + "reachDestinationHint": "Destination des alertes · les notifications sont répliquées ici", + "testPageSent": "La notification de test est parvenue à {count} personne | La notification de test est parvenue à {count} personnes", "testPageNobody": "Rien n'a été envoyé — {reason}", - "testPageUndelivered": "Page de test envoyée, mais aucune remise n'a réussi : {reason}", - "testPageFailed": "Impossible d'envoyer la page de test", + "testPageUndelivered": "Notification de test envoyée, mais aucune remise n'a réussi : {reason}", + "testPageFailed": "Impossible d'envoyer la notification de test", "riskTeamsPageNobody": "{count} équipe ne joint personne | {count} équipes ne joignent personne", "riskUnroutedPaths": "{count} chemin non routé | {count} chemins non routés", "teamOwnsPaths": "possède {count} chemin de service | possède {count} chemins de service", "causesTitle": "Ce qui nous fait tomber", "causesHint": "les {days} derniers jours", - "causesNone": "Aucune page n'a encore reçu de cause.", + "causesNone": "Aucune notification n'a encore reçu de cause.", "teamLastDays": "Les {days} derniers jours", "activityReachedFinal": "{count} ont atteint toute l'équipe", "teamAlertRules": "possède {count} règle d'alerte | possède {count} règles d'alerte", @@ -22729,22 +22729,22 @@ "riskConfigCount": "{count} risque de configuration | {count} risques de configuration", "attentionOpenPolicy": "Ouvrir l'escalade", "attentionOpenRouting": "Ouvrir le routage", - "attentionNoTransport": "Aucun transport n'est configuré — aucune page de ce déploiement n'atteint qui que ce soit.", + "attentionNoTransport": "Aucun transport n'est configuré — aucune notification de ce déploiement n'atteint qui que ce soit.", "escalationTab": "Politiques d'escalade", "contactReadinessTitle": "Préparation des contacts", - "contactReadinessHint": "Une page arriverait-elle réellement ?", + "contactReadinessHint": "Une notification arriverait-elle réellement ?", "contactReachable": "Joignable", "contactUnreachable": "Injoignable", - "contactNoTransport": "Aucun transport n'est configuré sur ce déploiement, donc aucune page ne peut être envoyée à qui que ce soit.", + "contactNoTransport": "Aucun transport n'est configuré sur ce déploiement, donc aucune notification ne peut être envoyée à qui que ce soit.", "contactNoMembers": "Cette équipe n'a pas encore de membres.", - "contactNoChannel": "Aucun canal ne peut acheminer de page.", + "contactNoChannel": "Aucun canal ne peut acheminer de notification.", "contactAffects": "concerne {names}", "contactAndMore": "{names} et {count} autres", "loadBalanceTitle": "Répartition de charge sur les {days} derniers jours", "loadBalanceHint": "qui a été d'astreinte", - "loadBalanceNone": "Personne n'a reçu de page pendant cette période.", - "loadBalancePages": "{count} page | {count} pages", - "loadBalancePagesNights": "{pages} pages · {nights} de nuit", + "loadBalanceNone": "Personne n'a reçu de notification pendant cette période.", + "loadBalancePages": "{count} notification | {count} notifications", + "loadBalancePagesNights": "{pages} notifications · {nights} de nuit", "legendPersonRamp": "Une couleur par personne — les couleurs séparent les voisins et ne signifient rien en elles-mêmes.", "legendNow": "Maintenant", "legendWeekend": "Week-end", @@ -22853,7 +22853,7 @@ "ruleActive": "Actif", "ruleNeverUsed": "Jamais utilisé", "ruleAlsoClaimedBy": "Également revendiquée par {team}", - "simulatorTitle": "Où cette alerte irait-elle ?", + "simulatorTitle": "Où cette notification irait-elle ?", "simulatorHint": "Décrivez une alerte et voyez tout le chemin — équipe, échelon, personne — sans en déclencher une.", "simulatorEmptyTitle": "Aucune simulation pour l'instant", "simulatorEmptyDescription": "Ajoutez au moins une dimension et une priorité, puis cliquez sur « Tester » pour voir le chemin complet — équipe, échelon, personne.", @@ -22869,7 +22869,7 @@ "simulatorLadder": "échelle {priority}", "simulatorLadderEnds": "{rungs}, se termine à {at}", "simulatorReachableNow": "{channels} · maintenant", - "simulatorSendTest": "Envoyer une alerte de test", + "simulatorSendTest": "Envoyer une notification de test", "unroutedNoneTitle": "Aucune alerte non routée", "unroutedNone": "Chaque alerte déclenchée a atteint une équipe.", "unroutedFires": "{count} déclenchement sur les 30 derniers jours | {count} déclenchements sur les 30 derniers jours", @@ -22965,9 +22965,9 @@ "attentionAddMember": "Ajouter un membre", "attentionAddFinalRung": "Ajouter un dernier échelon", "attentionFindings": "{count} constat | {count} constats", - "attentionCountBlocking": "{count} blocking", + "attentionCountBlocking": "{count} bloquant(s)", "attentionCountGaps": "{count} lacune | {count} lacunes", - "attentionCountInert": "{count} unused", + "attentionCountInert": "{count} inutilisé(s)", "attentionGroupBlocking": "Blocage — les notifications ne seront pas délivrées", "attentionGroupGaps": "Lacunes de couverture — une notification peut ne plus trouver personne à contacter", "attentionGroupInert": "Inactif — peut être laissé tel quel", @@ -23005,16 +23005,16 @@ "section_snoozed": "En pause", "section_handled": "Pris en charge", "section_resolved": "Résolus", - "sectionHint_ringing": "Personne n'a accusé réception — les appels continuent.", - "sectionHint_snoozed": "Appels suspendus — ils reprennent automatiquement.", + "sectionHint_ringing": "Personne n'a accusé réception — les notifications continuent.", + "sectionHint_snoozed": "Notifications en pause — elles reprennent automatiquement.", "sectionHint_handled": "Pris en charge — une personne est responsable de chacun.", "sectionHint_resolved": "Clôturés — conservés pour les archives.", "lastAlertAt": "Créé", - "ladderStartedAfter": "Commencé {duration} après l'appel", + "ladderStartedAfter": "Commencé {duration} après la notification", "ladderFinished": "Escalade terminée — plus personne", "ladderFinishedDetail": "a appelé {people} personne sur {levels} niveaux, sans accusé de réception | a appelé {people} personnes sur {levels} niveaux, sans accusé de réception", - "escalationClimbing": "Escalade en cours — niveau {level}, appel à {who}", - "reachAlarmHeadline": "Personne n'a vu cet appel.", + "escalationClimbing": "Escalade en cours — niveau {level}, notification de {who}", + "reachAlarmHeadline": "Personne n'a vu cette notification.", "reachAlarmFailed": "{count} envoi a échoué. | Les {count} envois ont échoué.", "reachAlarmFailedTo": "{count} envoi à {who} a échoué. | Les {count} envois à {who} ont échoué.", "reachAlarmRetries": "L'escalade réessaiera dans {duration}, mais les messages n'aboutissent pas.", @@ -23039,7 +23039,7 @@ "routingDetails": "Détails de routage", "whatFired": "Déclencheur", "alertId": "ID d'alerte", - "historyFirstPage": "Premier appel pour ce sujet.", + "historyFirstPage": "Première notification pour ce sujet.", "historyFirings": "{count} déclenchement antérieur | {count} déclenchements antérieurs", "responseSubtitle": "{team} · déclenché {firing} · ouvert {opened}", "onCallNowCount": "Équipes d'astreinte ({count})", @@ -23051,13 +23051,13 @@ "policyChipSteps": "{count} étape | {count} étapes", "policyAddStep": "Ajouter une étape", "policyWhenStepsRunOut": "Quand les étapes sont épuisées", - "policyAppliesToNewPages": "Les modifications s'appliquent uniquement aux nouveaux appels.", + "policyAppliesToNewPages": "Les modifications s'appliquent uniquement aux nouvelles notifications.", "policySave": "Enregistrer", "policyFix": "Corriger", "policyProblemCount": "{count} problème | {count} problèmes", "policyReachesNobody": "n'atteint personne", "policyPhoneWithoutEmail": "Les SMS et les appels nécessitent aussi l'e-mail : les personnes sans téléphone ne recevraient rien.", - "policyNoProvider": "Aucun fournisseur téléphonique n'est connecté, donc SMS et Voix sont ignorés et ces pages sont envoyées par e-mail.", + "policyNoProvider": "Aucun fournisseur téléphonique n'est connecté, donc SMS et Voix sont ignorés et ces notifications sont envoyées par e-mail.", "policyNoProviderLink": "Connectez-en un dans Réglages → Téléphonie", "policySentence": "Une alerte {priority} contacte {steps} — {ending}.", "policySentenceNobody": "Une alerte {priority} ne contacte personne — aucune étape n'est configurée.", @@ -23070,7 +23070,7 @@ "policyEndOptionHandOff": "Exécuter une fois, puis passer la main à l'équipe de dernier recours | Exécuter {count} fois, puis passer la main à l'équipe de dernier recours", "policyDeliveryTitle": "Livraison", "policyDeliveryHint": "Comment les notifications atteignent les personnes et les salons.", - "policyChannelsHint": "Toutes les personnes pagées à la priorité {priority} reçoivent le même ensemble. Les SMS et les appels vont aux personnes ayant un téléphone vérifié.", + "policyChannelsHint": "Toutes les personnes contactées à la priorité {priority} reçoivent le même ensemble. Les SMS et les appels vont aux personnes ayant un téléphone vérifié.", "policyTodayIs": "aujourd'hui : {who}", "policyPeopleCount": "{count} personne | {count} personnes", "policyTriageTitle": "Tri par IA", diff --git a/web/src/locales/menuTerms.spec.ts b/web/src/locales/menuTerms.spec.ts index 37b732ffad..383a622f86 100644 --- a/web/src/locales/menuTerms.spec.ts +++ b/web/src/locales/menuTerms.spec.ts @@ -28,6 +28,17 @@ describe("menu terms (AC-12)", () => { expect(load(code).function.streamPipeline).toBe(value); }); + it("fr-FR keeps Pipelines, RUM and Logs, and calls a downtime a maintenance window", () => { + const fr = load("fr-FR"); + expect(fr.menu.pipeline).toBe("Pipelines"); + expect(fr.menu.rum).toBe("RUM"); + expect(fr.menu.search).toBe("Logs"); + expect(fr.common.logs).toBe("Logs"); + expect(fr.menu.downtimes).toBe("Périodes de maintenance"); + expect(fr.settings.lightMode).toBe("Mode clair"); + expect(read("fr-FR")).not.toMatch(/[Cc]analisation|[Ii]ndisponibilit|[Bb]uteur/); + }); + it("de-DE says Alarme in the header and the menu, like its items", () => { const de = load("de-DE"); expect(de.menu.alerts).toBe("Alarme");