From 9e504297300ef3486506de3d5442daa4fb7c0194 Mon Sep 17 00:00:00 2001 From: Evgeny Stepanovych Date: Mon, 6 Jan 2025 16:33:27 -0500 Subject: [PATCH] NAS-133365 / 25.04 / Reporting exporters form is broken (#11282) --- .../api/api-call-directory.interface.ts | 4 +- .../reporting-exporters.interface.ts | 4 +- src/app/interfaces/schema.interface.ts | 2 +- ...reporting-exporters-form.component.spec.ts | 7 +- .../reporting-exporters-form.component.ts | 16 ++-- ...reporting-exporters-list.component.spec.ts | 13 ++- .../reporting-exporters-list.component.ts | 12 +-- src/assets/i18n/fr.json | 96 +++++++++---------- 8 files changed, 84 insertions(+), 70 deletions(-) diff --git a/src/app/interfaces/api/api-call-directory.interface.ts b/src/app/interfaces/api/api-call-directory.interface.ts index b536d92a127..378f7e124a0 100644 --- a/src/app/interfaces/api/api-call-directory.interface.ts +++ b/src/app/interfaces/api/api-call-directory.interface.ts @@ -199,7 +199,7 @@ import { ReplicationTask, } from 'app/interfaces/replication-task.interface'; import { - CreateReportingExporter, ReportingExporter, ReportingExporterSchema, UpdateReportingExporter, + ReportingExporter, ReportingExporterSchema, UpdateReportingExporter, } from 'app/interfaces/reporting-exporters.interface'; import { ReportingGraph } from 'app/interfaces/reporting-graph.interface'; import { @@ -695,7 +695,7 @@ export interface ApiCallDirectory { 'replication.update': { params: [id: number, update: Partial]; response: ReplicationTask }; // Reporting - 'reporting.exporters.create': { params: [CreateReportingExporter]; response: ReportingExporter }; + 'reporting.exporters.create': { params: [UpdateReportingExporter]; response: ReportingExporter }; 'reporting.exporters.delete': { params: [id: number]; response: boolean }; 'reporting.exporters.exporter_schemas': { params: void; response: ReportingExporterSchema[] }; 'reporting.exporters.query': { params: QueryParams; response: ReportingExporter[] }; diff --git a/src/app/interfaces/reporting-exporters.interface.ts b/src/app/interfaces/reporting-exporters.interface.ts index 2d0acff06ef..504917c6684 100644 --- a/src/app/interfaces/reporting-exporters.interface.ts +++ b/src/app/interfaces/reporting-exporters.interface.ts @@ -17,10 +17,8 @@ export interface ReportingExporterList { export interface ReportingExporter { name: string; id: number; - type: string; enabled: boolean; attributes: Record; } -export type CreateReportingExporter = Omit; -export type UpdateReportingExporter = Omit; +export type UpdateReportingExporter = Partial>; diff --git a/src/app/interfaces/schema.interface.ts b/src/app/interfaces/schema.interface.ts index 842ffe17c46..19a4fca0274 100644 --- a/src/app/interfaces/schema.interface.ts +++ b/src/app/interfaces/schema.interface.ts @@ -12,7 +12,7 @@ export interface OldSchema { type: SchemaType | SchemaType[]; _name_: string; _required_: boolean; - + const?: string; } export interface SchemaProperties { diff --git a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.spec.ts b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.spec.ts index 6994bab2afe..7871c4ac9b9 100644 --- a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.spec.ts +++ b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.spec.ts @@ -23,8 +23,8 @@ describe('ReportingExportersFormComponent', () => { const existingExporter: ReportingExporter = { name: 'test', id: 123, - type: ReportingExporterKey.Graphite, attributes: { + exporter_type: ReportingExporterKey.Graphite, access_key_id: 'access_key_id', secret_access_key: 'secret_access_key', }, @@ -94,11 +94,11 @@ describe('ReportingExportersFormComponent', () => { expect(spectator.inject(ApiService).call).toHaveBeenCalledWith('reporting.exporters.create', [{ name: 'exporter1', - type: ReportingExporterKey.Graphite, enabled: true, attributes: { access_key_id: 'abcde', secret_access_key: 'abcd', + exporter_type: ReportingExporterKey.Graphite, }, }]); expect(spectator.inject(SlideInRef).close).toHaveBeenCalled(); @@ -130,7 +130,7 @@ describe('ReportingExportersFormComponent', () => { expect(values).toEqual({ Name: existingExporter.name, - Type: existingExporter.type, + Type: existingExporter.attributes.exporter_type, Enable: existingExporter.enabled, 'Secret Access Key ID': existingExporter.attributes.secret_access_key, 'Access Key ID': existingExporter.attributes.access_key_id, @@ -163,6 +163,7 @@ describe('ReportingExportersFormComponent', () => { attributes: { secret_access_key: existingExporter.attributes.secret_access_key, access_key_id: 'efghi', + exporter_type: ReportingExporterKey.Graphite, }, }, ], diff --git a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.ts b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.ts index 9d044425eb7..bd30c3b310c 100644 --- a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.ts +++ b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.ts @@ -131,7 +131,10 @@ export class ReportingExportersFormComponent implements OnInit { this.createExporterControls(schemas); if (!this.isNew) { - this.form.patchValue(this.editingExporter); + this.form.patchValue({ + ...this.editingExporter, + type: this.editingExporter.attributes['exporter_type'] as string, + }); } this.isLoading = false; @@ -162,7 +165,7 @@ export class ReportingExportersFormComponent implements OnInit { for (const input of schema.schema) { this.form.controls.attributes.addControl( input._name_, - new FormControl('', input._required_ ? [Validators.required] : []), + new FormControl(input.const || '', input._required_ ? [Validators.required] : []), ); } } @@ -180,7 +183,9 @@ export class ReportingExportersFormComponent implements OnInit { } parseSchemaForDynamicSchema(schema: ReportingExporterSchema): DynamicFormSchemaNode[] { - return schema.schema.map((input) => getDynamicFormSchemaNode(input)); + return schema.schema + .filter((input) => !input.const) + .map((input) => getDynamicFormSchemaNode(input)); } parseSchemaForExporterList(schema: ReportingExporterSchema): ReportingExporterList { @@ -217,9 +222,8 @@ export class ReportingExportersFormComponent implements OnInit { ...this.form.value, }; - if (!this.isNew) { - delete values.type; - } + values.attributes['exporter_type'] = values.type; + delete values.type; for (const [key, value] of Object.entries(values.attributes)) { if (value == null || value === '') { diff --git a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.spec.ts b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.spec.ts index bc478c4578b..3b7299c51ea 100644 --- a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.spec.ts +++ b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.spec.ts @@ -1,6 +1,7 @@ import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { MatButtonHarness } from '@angular/material/button/testing'; +import { MatSlideToggleHarness } from '@angular/material/slide-toggle/testing'; import { Spectator, createComponentFactory, mockProvider } from '@ngneat/spectator/jest'; import { of } from 'rxjs'; import { mockCall, mockApi } from 'app/core/testing/utils/mock-api.utils'; @@ -23,10 +24,10 @@ const exporters: ReportingExporter[] = [ attributes: { secret: 'abcd', email: 'testemail', + exporter_type: ReportingExporterKey.Graphite, }, enabled: true, name: 'test', - type: ReportingExporterKey.Graphite, }, ]; @@ -98,6 +99,16 @@ describe('ReportingExportersListComponent', () => { expect(spectator.inject(ApiService).call).toHaveBeenCalledWith('reporting.exporters.delete', [1]); }); + it('updates a reporting exporter when Enabled checkbox is toggled', async () => { + const toggle = await table.getHarnessInCell(MatSlideToggleHarness, 1, 2); + await toggle.toggle(); + + expect(spectator.inject(ApiService).call).toHaveBeenCalledWith('reporting.exporters.update', [ + 1, + { enabled: false }, + ]); + }); + it('should show table rows', async () => { const expectedRows = [ ['Name', 'Type', 'Enabled', ''], diff --git a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.ts b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.ts index 86b4328beb1..1346943151e 100644 --- a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.ts +++ b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.ts @@ -80,7 +80,7 @@ export class ReportingExporterListComponent implements OnInit { }), textColumn({ title: this.translate.instant('Type'), - propertyName: 'type', + getValue: (row) => row.attributes['exporter_type'], }), toggleColumn({ title: this.translate.instant('Enabled'), @@ -93,13 +93,13 @@ export class ReportingExporterListComponent implements OnInit { { name: row.name, checked: checked ? 'Enabling' : 'Disabling' }, ), ); - const exporter = { ...row }; - delete exporter.type; - delete exporter.id; - this.api.call('reporting.exporters.update', [row.id, { ...exporter, enabled: checked }]).pipe( + this.api.call('reporting.exporters.update', [row.id, { enabled: checked }]).pipe( untilDestroyed(this), ).subscribe({ - complete: () => this.appLoader.close(), + complete: () => { + this.appLoader.close(); + this.getExporters(); + }, error: (error: unknown) => this.errorCaught(error), }); }, diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index bf72ea89fb9..bf9a5ea2e4e 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -97,7 +97,6 @@ "Certificate Subject": "", "Certificate Write": "", "Check": "", - "Choose a new virtual port": "Choisissez un nouveau port virtuel", "Clear": "", "Client ID": "", "Close Instance Form": "", @@ -273,10 +272,8 @@ "HTTP Proxy:": "", "HTTPS Port": "", "HTTPS Redirect": "", - "Hardware Change": "Changement de matériel", "Has Allow List": "", "Healthy": "", - "Hide Password": "Masquer le mot de passe", "Home Widgets": "", "Host Model": "", "Host Mounts": "", @@ -390,7 +387,6 @@ "Machine": "", "Macvlan NICs": "", "Main menu": "", - "Maintenance Window": "Maintenance programmée", "Manual Test": "", "Manual Upgrade": "", "Mapall Group": "", @@ -444,12 +440,7 @@ "Network Interface Read": "", "Network Interface Write": "", "Network Reconnection Issue": "", - "Network Reset": "Réinitialisation du réseau", - "Network Settings": "Paramètres réseau", - "Network Stats": "Stats réseau", - "Network Traffic": "Trafic réseau", "Network Usage": "", - "Network Utilization": "Utilisation du réseau", "New Backup Credential": "", "New Bucket Name": "", "New CSR": "", @@ -503,7 +494,6 @@ "Parent Interface": "", "Passive Controller": "", "Passthrough": "", - "Password Login": "Mot de passe de connexion", "Pattern": "", "Pause Scrub": "", "Pending": "", @@ -519,9 +509,6 @@ "Privilege": "", "Privileges": "", "Processor": "", - "Product": "Produit", - "Product ID": "ID produit", - "Promote": "Promouvoir", "Prompt": "", "Properties Exclude": "", "Properties Override": "", @@ -540,15 +527,9 @@ "RAM": "", "Range Size": "", "Raw Filesize": "", - "Re-Open": "Réouvrir", - "Re-Open All Alerts": "Réouvrir toutes les alertes", "Read Only": "", "Readonly Admin": "", "Rear": "", - "Reason": "Raison", - "Reboot Local": "Redémarrage local", - "Reboot Remote": "Redémarrage à distance", - "Reboot Required": "Redémarrage requis", "Release": "", "Remove extent association": "", "Replication Admin": "", @@ -577,7 +558,6 @@ "Routing": "", "Rsync": "", "Run As Context": "", - "Running Jobs": "Tâches en cours", "S.M.A.R.T.": "", "SAS Connector": "", "SAS Expander": "", @@ -705,7 +685,6 @@ "Snapshot Time": "", "Snapshot Time {time}": "", "Snapshot Write": "", - "Software Installation": "Installation logiciel", "Sort": "", "Source Path": "", "Spares": "", @@ -731,10 +710,7 @@ "Support License": "", "Support Read": "", "Support Write": "", - "Switch To Advanced": "Basculer vers les optiond avancées", - "Switch To Wizard": "Basculer vers l'assistant", "Synced": "", - "Syslog Settings": "Paramètres Syslog", "Syslog TLS Certificate": "", "Syslog TLS Certificate Authority": "", "System Advanced Read": "", @@ -743,25 +719,13 @@ "System Audit Write": "", "System Data Pool": "", "System Dataset": "", - "System Freeze": "Freeze du système", "System General Read": "", "System General Write": "", - "System Image": "Image système", "System Information – Active": "", "System Information – Standby": "", - "System Overload": "Surcharge du système", - "System Reports": "Rapports système", - "System Security Settings": "Paramètres de sécurité du système", "System Serial": "", - "System Stats": "Stats du système", - "System Update": "Mise à jour du système", - "System Uptime": "Durée de fonctionnement du système", - "System Utilization": "Utilisation du système", - "System Version": "Version du Système", - "TLS No Empty Fragments": "TLS Aucun fragment vide", "TLS Policy": "", "Table Actions of Expandable Table": "", - "Task": "Tâche", "Tenant Domain": "", "Terminal": "", "Test": "", @@ -771,8 +735,6 @@ "Timestamp": "", "Toggle Sidenav": "", "Tolerance Window": "", - "Toolbar": "Barre d'outils", - "Tools": "Outils", "Top": "", "Top bar": "", "Total": "", @@ -782,7 +744,6 @@ "Translate App": "", "Transmit Hash Policy": "", "Transport Encryption Behavior": "", - "Troubleshooting Issues": "Résolution des problèmes", "TrueCommand Read": "", "TrueCommand Write": "", "Tunable": "", @@ -790,14 +751,9 @@ "UNIX Charset": "", "URL": "", "Unix NSS Info": "", - "Unix Primary Group": "Groupe primaire Unix", - "Unix Socket": "Socket Unix", "Unlink": "", - "Updating pool settings": "Mise à jour des paramètres du volume", "Usage Collection": "", "Usages": "", - "Use an existing port": "Utiliser un port existant", - "Use current port": "Utiliser le port actuel", "User API Keys": "", "User Bind Path": "", "User CN": "", @@ -819,8 +775,6 @@ "VMWare Sync": "", "VMware Snapshot": "", "Validate Certificates": "", - "Validate Remote Path": "Valider le chemin d'accès distant", - "Validate effective ACL": "Valider l'ACL effective", "Variant": "", "Vdevs spans enclosure": "", "Vendor ID": "", @@ -838,7 +792,6 @@ "Voltage": "", "WWPN": "", "WWPN (B)": "", - "Warning: iSCSI Target is currently in use.
": "Avertissement : la cible iSCSI est en cours d'utilisation.
.", "Watch List": "", "Weak Ciphers": "", "WebDAV": "", @@ -1624,6 +1577,7 @@ "Choose a date format.": "Choisissez un format de date.", "Choose a location to store the installer image file.": "Choisissez un emplacement pour stocker le fichier image du programme d'installation.", "Choose a new disk for the pool. To protect any existing data, adding the selected disk is stopped when the disk is already in use or has partitions present.": "Choisissez un nouveau disque pour la volume. Pour protéger les données existantes, l'ajout du disque sélectionné est arrêté lorsque le disque est déjà utilisé ou qu'il y a des partitions présentes.", + "Choose a new virtual port": "Choisissez un nouveau port virtuel", "Choose a path to the user's home directory. If the directory exists and matches the username, it is set as the user's home directory. When the path does not end with a subdirectory matching the username, a new subdirectory is created only if the 'Create Home Directory' field is marked checked. The full path to the user's home directory is shown here when editing a user.": "Choisissez un chemin vers le répertoire personnel de l'utilisateur. Si le répertoire existe et correspond au nom d'utilisateur, il est défini comme répertoire personnel de l'utilisateur. Lorsque le chemin ne se termine pas par un sous-répertoire correspondant au nom d'utilisateur, un nouveau sous-répertoire est créé uniquement si le champ 'Créer un répertoire personnel' est coché. Le chemin complet vers le répertoire personnel de l'utilisateur est affiché ici lors de l'édition d'un utilisateur.", "Choose a pool for Apps": "Choisissez un volume pour les applications", "Choose a pool to scrub.": "Choisissez un volume à nettoyer.", @@ -2738,6 +2692,7 @@ "HTTP host URL.": "URL de l'hôte HTTP.", "HTTPS Protocols": "Protocoles HTTPS", "Hardware": "Matériel", + "Hardware Change": "Changement de matériel", "Hardware Disk Encryption": "Chiffrement matériel du disque", "Help": "Aide", "Hidden": "Caché", @@ -2745,6 +2700,7 @@ "Hide": "Cacher", "Hide Extra Columns": "Cacher les colonnes supplémentaires", "Hide Job": "Cacher la tâche", + "Hide Password": "Masquer le mot de passe", "Hide Standard Error": "Masquer l'erreur standard", "Hide Standard Output": "Masquer la sortie standard", "Hide Stderr": "Masquer Stderr", @@ -3133,6 +3089,7 @@ "Mac Address": "Adresse Mac", "Machine Time: {machineTime} \n Browser Time: {browserTime}": "Machine Time: {machineTime} \n Heure du navigateur : {browserTime}", "Mail Server Port": "Port du serveur de messagerie", + "Maintenance Window": "Maintenance programmée", "Major": "Majeure", "Make Destination Dataset Read-only?": "Rendre le dataset de destination en lecture seule ?", "Make the currently active TrueNAS controller the default when both TrueNAS controllers are online and HA is enabled. To change the default TrueNAS controller, unset this option on the default TrueNAS controller and allow the system to fail over. This briefly interrupts system services.": "Faire du contrôleur TrueNAS actuellement actif le contrôleur par défaut lorsque les deux contrôleurs TrueNAS sont en ligne et que HA est activé. Pour changer le contrôleur TrueNAS par défaut, désactivez cette option sur le contrôleur TrueNAS par défaut et permettez au système de basculer. Cela interrompt brièvement les services du système.", @@ -3310,7 +3267,12 @@ "Network Configuration": "Configuration réseau", "Network Interface": "Interface réseau", "Network Reports": "Rapports réseau", + "Network Reset": "Réinitialisation du réseau", + "Network Settings": "Paramètres réseau", + "Network Stats": "Stats réseau", "Network Timeout Before Initiating Failover": "Délai d'attente réseau avant d'initier le basculement", + "Network Traffic": "Trafic réseau", + "Network Utilization": "Utilisation du réseau", "Network addresses allowed to use this initiator. Leave blank to allow all networks or list network addresses with a CIDR mask. Separate entries by pressing Enter.": "Les adresses de réseau sont autorisées à utiliser cet initiateur. Laissez vide pour autoriser tous les réseaux ou pour énumérer les adresses de réseau avec un masque CIDR. Séparez les entrées en appuyant sur la touche Entrée.", "Network addresses allowed use this initiator. Each address can include an optional CIDR netmask. Click + to add the network address to the list. Example: 192.168.2.0/24.": "Les adresses réseau autorisées utilisent cet initiateur. Chaque adresse peut inclure un masque de réseau CIDR en option. Cliquez sur + pour ajouter l'adresse réseau à la liste. Exemple : 192.168.2.0.0/24.", "Network changes applied successfully.": "Les modifications apportées au réseau ont été appliquées avec succès.", @@ -3560,6 +3522,7 @@ "Passphrase value must match Confirm Passphrase": "La valeur de la passphrase doit correspondre à : Confirmer la passphrase", "Password": "Mot de passe", "Password Disabled": "Mot de passe désactivé", + "Password Login": "Mot de passe de connexion", "Password Login Groups": "Groupes de connexion par mot de passe", "Password Server": "Serveur de mots de passe", "Password Servers": "Serveurs de mots de passe", @@ -3701,10 +3664,13 @@ "Proactive support settings is not available.": "Les paramètres de support proactif ne sont pas disponibles.", "Proceed": "Procéder", "Proceed with upgrading the pool? WARNING: Upgrading a pool is a one-way operation that might make some features of the pool incompatible with older versions of TrueNAS: ": "Procéder à la mise à niveau du volume ? AVERTISSEMENT : La mise à niveau d'un volume est une opération à sens unique qui pourrait rendre certaines fonctionnalités du volume incompatibles avec les anciennes versions de TrueNAS: ", + "Product": "Produit", + "Product ID": "ID produit", "Production": "Production", "Production status successfully updated": "Statut de production mis à jour avec succès", "Profile": "Profil", "Prohibits writes to this share.": "Interdit les écritures sur ce partage.", + "Promote": "Promouvoir", "Prototyping": "Prototypage", "Provide helpful notations related to the share, e.g. ‘Shared to everybody’. Maximum length is 120 characters.": "Fournissez des notations utiles liées au partage, par ex. « Partagé avec tout le monde ». La longueur maximale est de 120 caractères.", "Provide keys/passphrases manually": "Fournir manuellement les clés/phrases de passe", @@ -3744,6 +3710,8 @@ "Range Low and Range High set the range of UID/GID numbers which this IDMap backend translates. If an external credential like a Windows SID maps to a UID or GID number outside this range, the external credential is ignored.": "Range Low et Range High définissent la plage de numéros UID/GID que ce backend IDMap traduit. Si un identifiant externe tel qu'un SID Windows correspond à un numéro UID ou GID en dehors de cette plage, l'identifiant externe est ignoré.", "Rate this page": "Évaluer cette page", "Raw File": "Fichier brut", + "Re-Open": "Réouvrir", + "Re-Open All Alerts": "Réouvrir toutes les alertes", "Read": "Lire", "Read ACL": "Lire ACL", "Read Attributes": "Lire les attributs", @@ -3752,7 +3720,11 @@ "Read Named Attributes": "Lire les attributs nommés", "Read-only": "Lecture seule", "Realm": "Domaine", + "Reason": "Raison", "Reboot": "Redémarrer", + "Reboot Local": "Redémarrage local", + "Reboot Remote": "Redémarrage à distance", + "Reboot Required": "Redémarrage requis", "Reboot of the other node is required for FIPS changes.": "Le redémarrage de l'autre nœud est requis pour les modifications FIPS.", "Reboot of this node is required for FIPS changes.": "Le redémarrage de ce nœud est requis pour les modifications FIPS.", "Rebuild Directory Service Cache": "Reconstruction du cache du service d'annuaire", @@ -3959,6 +3931,7 @@ "Run «{name}» Cloud Sync now?": "Exécuter cette synchronisation cloud maintenant ?", "Run «{name}» Rsync now?": "Exécuter «{name}» Rsync maintenant?", "Running": "Actif", + "Running Jobs": "Tâches en cours", "S.M.A.R.T. Extra Options": "Options supplémentaires S.M.A.R.T.", "S.M.A.R.T. Info for {disk}": "Informations S.M.A.R.T. pour {disk}", "S.M.A.R.T. Options": "Options S.M.A.R.T", @@ -4396,6 +4369,7 @@ "Snapshots could not be loaded": "Les instantanés ne peuvent pas être chargés", "Snapshots must not have dependent clones": "Les instantanés ne doivent pas avoir de clones dépendants", "Snapshots will be created automatically.": "Les instantanés seront créés automatiquement.", + "Software Installation": "Installation logiciel", "Some of the disks are attached to the exported pools\n mentioned in this list. Checking a pool name means you want to\n allow reallocation of the disks attached to that pool.": "Certains des disques sont attachés aux volumes exportés\n mentionnés dans cette liste. Cocher un nom de volume signifie que vous souhaitez\n autoriser la réallocation des disques attachés à ce volume.", "Some of the selected disks have exported pools on them. Using those disks will make existing pools on them unable to be imported. You will lose any and all data in selected disks.": "Certains des disques sélectionnés contiennent des volumes exportés. L'utilisation de ces disques empêchera l'importation des volumes existants sur ces disques. Vous perdrez toutes les données des disques sélectionnés.", "Source": "Source", @@ -4503,7 +4477,9 @@ "Sun": "Dim", "Sunday": "Dimanche", "Support": "Support", + "Switch To Advanced": "Basculer vers les optiond avancées", "Switch To Basic": "Basculé sur Basique", + "Switch To Wizard": "Basculer vers l'assistant", "Switch Train": "Changer de canal", "Switch to Advanced Options": "Basculer sur Options avancées", "Switch update trains?": "Changer de canal de mise à jour ?", @@ -4524,14 +4500,25 @@ "Syslog": "Syslog", "Syslog Level": "Niveau Syslog", "Syslog Server": "Serveur syslog", + "Syslog Settings": "Paramètres Syslog", "Syslog Transport": "Transport Syslog", "System": "Système", "System Clock": "Horloge système", "System Dataset Pool": "Volume du dataset système", + "System Freeze": "Freeze du système", + "System Image": "Image système", "System Information": "Informations système", + "System Overload": "Surcharge du système", + "System Reports": "Rapports système", "System Security": "Sécurité du système", + "System Security Settings": "Paramètres de sécurité du système", "System Security Settings Updated.": "Paramètres de sécurité du système mis à jour.", + "System Stats": "Stats du système", "System Time Zone:": "Fuseau horaire du système :", + "System Update": "Mise à jour du système", + "System Uptime": "Durée de fonctionnement du système", + "System Utilization": "Utilisation du système", + "System Version": "Version du Système", "System dataset updated.": "Le dataset système a été mis à jour.", "System domain name, like example.com": "Nom de domaine système, comme exemple.com", "System hostname.": "Nom d'hôte du système.", @@ -4550,6 +4537,7 @@ "TLS Export Certificate Data": "TLS - Données du certificat d'exportation", "TLS Export Standard Vars": "TLS - Variables standard d'exportation", "TLS IP Address Required": "TLS - Aucun fragment vide", + "TLS No Empty Fragments": "TLS Aucun fragment vide", "TLS No Session Reuse Required": "TLS - Aucune réutilisation de session requise", "Tag": "Étiquette", "Tags": "Tags", @@ -4565,6 +4553,7 @@ "Target dataset encryption will be inherited from its parent dataset.": "Le chiffrement du dataset cible sera hérité de son dataset parent.", "Target with this name already exists": "La cible portant ce nom existe déjà", "Targets": "Cibles", + "Task": "Tâche", "Task Details for {task}": "Détails de la tâche pour {task}", "Task Name": "Nom de la tâche", "Task Settings": "Paramètres des tâches", @@ -4793,6 +4782,8 @@ "Token created with Google Drive.": "Jeton créé avec Google Drive.", "Token created with Google Drive. Access Tokens expire periodically and must be refreshed.": "Token créé avec Google Drive. Les jetons d'accès expirent périodiquement et doivent être actualisés.", "Token expired": "Le jeton a expiré", + "Toolbar": "Barre d'outils", + "Tools": "Outils", "Top level of the LDAP directory tree to be used when searching for resources. Example: dc=test,dc=org.": "Niveau supérieur de l'arborescence LDAP à utiliser lors de la recherche de ressources. Exemple : dc=test,dc=org.", "Topic Amazon Resource Name (ARN) for publishing. Example: arn:aws:sns:us-west-2:111122223333:MyTopic.": "Sujet Amazon Resource Name (ARN) pour la publication. Exemple : arn:aws:aws:sns:us-west-2:11112122223333:MyTopic.", "Topology": "Topologie", @@ -4814,6 +4805,7 @@ "Transport Options": "Options de transport", "Traverse": "Traverser", "Treat Disk Size as Minimum": "Considérer la taille du disque comme minimum", + "Troubleshooting Issues": "Résolution des problèmes", "TrueCloud Backup Tasks": "Tâches de sauvegarde TrueCloud", "TrueCommand": "TrueCommand", "TrueCommand Cloud Service": "Service Cloud TrueCommand", @@ -4878,6 +4870,8 @@ "Unit": "Unité", "Unix Permissions": "Permissions Unix", "Unix Permissions Editor": "Éditeur de permissions Unix", + "Unix Primary Group": "Groupe primaire Unix", + "Unix Socket": "Socket Unix", "Unkeep": "Enlever", "Unknown": "Inconnu", "Unknown CPU": "CPU inconnu", @@ -4936,6 +4930,7 @@ "Updating Instance": "Mise à jour de l'instance", "Updating custom app": "Mise à jour de l'app personnalisée", "Updating key type": "Mise à jour du type de clé", + "Updating pool settings": "Mise à jour des paramètres du volume", "Updating settings": "Mise à jour des paramètres", "Upgrade": "Mise à niveau ", "Upgrade All Selected": "Mettre à jour tous les éléments sélectionnés", @@ -4977,9 +4972,11 @@ "Use Sudo For ZFS Commands": "Utiliser Sudo pour les commandes ZFS", "Use Syslog Only": "Utiliser uniquement Syslog", "Use all disk space": "Utiliser tout l'espace disque", + "Use an existing port": "Utiliser un port existant", "Use an exported encryption key file to unlock datasets.": "Utilisez un fichier de clé de chiffrement exporté pour déverrouiller les datasets.", "Use as Home Share": "Utiliser comme partage d'accueil (home)", "Use compressed WRITE records to make the stream more efficient. The destination system must also support compressed WRITE records. See zfs(8).": "Utilisez des enregistrements WRITE compressés pour rendre le flux plus efficace. Le système de destination doit également prendre en charge les enregistrements WRITE compressés. Voir zfs(8).", + "Use current port": "Utiliser le port actuel", "Use default network settings": "Utiliser les paramètres réseau par défaut", "Use existing disk image": "Utiliser l'image disque existante", "Use settings from a saved replication.": "Utilisez les paramètres d'une réplication enregistrée.", @@ -5053,6 +5050,8 @@ "VMware Sync": "VMWare Sync", "VMware: Extent block size 512b, TPC enabled, no Xen compat mode, SSD speed": "VMware : taille de bloc étendue 512b, TPC activé, pas de mode de compatibilité Xen, vitesse SSD", "Validate Connection": "Valider la connexion", + "Validate Remote Path": "Valider le chemin d'accès distant", + "Validate effective ACL": "Valider l'ACL effective", "Value": "Valeur", "Value must be a number": "La valeur doit être un nombre", "Value must be a valid email address": "La valeur doit être une adresse email valide", @@ -5119,6 +5118,7 @@ "Warning": "Attention", "Warning!": "Attention !", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "Avertissement : les debugs peuvent contenir des fichiers journaux contenant des informations personnelles telles que des noms d'utilisateur ou d'autres informations d'identification sur votre système. Veuillez examiner les debugs et rédiger toute information sensible avant de la partager avec des entités externes.", + "Warning: iSCSI Target is currently in use.
": "Avertissement : la cible iSCSI est en cours d'utilisation.
.", "Warning: {n} of {total} boot environments could not be deleted.": "Avertissement: {n} sur {total} environments de boot n'ont pas pu être supprimés.", "Warning: {n} of {total} docker images could not be deleted.": "Avertissement: {n} sur {total} images docker n'ont pas pu être supprimées.", "Warning: {n} of {total} snapshots could not be deleted.": "Avertissement: {n} sur {total} instantanés n'ont pas pu être supprimés.", @@ -5318,4 +5318,4 @@ "{used} of {total} ({used_pct})": "{used} de {total} ({used_pct})", "{version} is available!": "{version} est disponible !", "{view} on {enclosure}": "{view} sur {enclosure}" -} +} \ No newline at end of file