From 98c92b70e18905e32f9045bf7c0a7462abcaa28b Mon Sep 17 00:00:00 2001 From: Denys Butenko Date: Wed, 28 Aug 2024 22:21:23 +0700 Subject: [PATCH] NAS-129855: Update default widgets layout --- .../services/default-widgets.constant.ts | 19 +++- .../widget-interface-ip.component.spec.ts | 95 ++++++++++------ .../widget-interface-ip.component.ts | 13 ++- src/assets/i18n/fr.json | 106 +++++++++--------- 4 files changed, 135 insertions(+), 98 deletions(-) diff --git a/src/app/pages/dashboard/services/default-widgets.constant.ts b/src/app/pages/dashboard/services/default-widgets.constant.ts index 9385d65fd23..43bd4a1edd2 100644 --- a/src/app/pages/dashboard/services/default-widgets.constant.ts +++ b/src/app/pages/dashboard/services/default-widgets.constant.ts @@ -9,15 +9,17 @@ export const defaultWidgets: WidgetGroup[] = [ ], }, { - layout: WidgetGroupLayout.Full, + layout: WidgetGroupLayout.Halves, slots: [ - { type: WidgetType.Help }, + { type: WidgetType.CpuModelWidget }, + { type: WidgetType.CpuUsageBar }, ], }, { - layout: WidgetGroupLayout.Full, + layout: WidgetGroupLayout.Halves, slots: [ - { type: WidgetType.Cpu }, + { type: WidgetType.CpuUsageRecent }, + { type: WidgetType.CpuTemperatureBar }, ], }, { @@ -35,13 +37,20 @@ export const defaultWidgets: WidgetGroup[] = [ { layout: WidgetGroupLayout.Full, slots: [ + { type: WidgetType.BackupTasks }, + ], + }, + { + layout: WidgetGroupLayout.Halves, + slots: [ + { type: WidgetType.Ipv4Address }, { type: WidgetType.Interface }, ], }, { layout: WidgetGroupLayout.Full, slots: [ - { type: WidgetType.BackupTasks }, + { type: WidgetType.Help }, ], }, ]; diff --git a/src/app/pages/dashboard/widgets/network/widget-interface-ip/widget-interface-ip.component.spec.ts b/src/app/pages/dashboard/widgets/network/widget-interface-ip/widget-interface-ip.component.spec.ts index e6ec070fa1c..97ff2b9f35e 100644 --- a/src/app/pages/dashboard/widgets/network/widget-interface-ip/widget-interface-ip.component.spec.ts +++ b/src/app/pages/dashboard/widgets/network/widget-interface-ip/widget-interface-ip.component.spec.ts @@ -5,6 +5,7 @@ import { NetworkInterfaceAliasType } from 'app/enums/network-interface.enum'; import { WidgetResourcesService } from 'app/pages/dashboard/services/widget-resources.service'; import { SlotSize } from 'app/pages/dashboard/types/widget.interface'; import { WidgetDatapointComponent } from 'app/pages/dashboard/widgets/common/widget-datapoint/widget-datapoint.component'; +import { WidgetInterfaceIpSettings } from 'app/pages/dashboard/widgets/network/widget-interface-ip/widget-interface-ip.definition'; import { WidgetInterfaceIpComponent } from './widget-interface-ip.component'; describe('WidgetInterfaceIpComponent', () => { @@ -49,55 +50,75 @@ describe('WidgetInterfaceIpComponent', () => { ], }); - beforeEach(() => { - spectator = createComponent({ - props: { - settings: { - interface: 'eth0', + describe('have settings', () => { + beforeEach(() => { + spectator = createComponent({ + props: { + settings: { + interface: 'eth0', + }, + size: SlotSize.Quarter, }, - size: SlotSize.Quarter, - }, + }); }); - }); - it('renders IPv4 addresses for the selected network interface', () => { - const widget = spectator.query(MockComponent(WidgetDatapointComponent)); - expect(widget).toBeTruthy(); - expect(widget.text).toBe('192.168.1.1\n192.168.1.2'); - }); + it('renders IPv4 addresses for the selected network interface', () => { + const widget = spectator.query(MockComponent(WidgetDatapointComponent)); + expect(widget).toBeTruthy(); + expect(widget.text).toBe('192.168.1.1\n192.168.1.2'); + }); - it('renders IPv4 addresses for the selected network interface from state', () => { - spectator.setInput('settings', { interface: 'eth2' }); + it('renders IPv4 addresses for the selected network interface from state', () => { + spectator.setInput('settings', { interface: 'eth2' }); - const widget = spectator.query(MockComponent(WidgetDatapointComponent)); - expect(widget).toBeTruthy(); - expect(widget.text).toBe('192.168.1.10\n192.168.1.11'); - }); + const widget = spectator.query(MockComponent(WidgetDatapointComponent)); + expect(widget).toBeTruthy(); + expect(widget.text).toBe('192.168.1.10\n192.168.1.11'); + }); + + it('renders IPv6 addresses for the selected network interface', () => { + spectator.setInput('settings', { + interface: 'eth1', + widgetName: 'IPv6 Address', + }); - it('renders IPv6 addresses for the selected network interface', () => { - spectator.setInput('settings', { - interface: 'eth1', - widgetName: 'IPv6 Address', + const widget = spectator.query(MockComponent(WidgetDatapointComponent)); + expect(widget).toBeTruthy(); + expect(widget.text).toBe('fe80::1'); }); - const widget = spectator.query(MockComponent(WidgetDatapointComponent)); - expect(widget).toBeTruthy(); - expect(widget.text).toBe('fe80::1'); - }); + it('renders "interface not found" when selected interface is not available in interface data', () => { + spectator.setInput('settings', { interface: 'eth404' }); - it('renders "interface not found" when selected interface is not available in interface data', () => { - spectator.setInput('settings', { interface: 'eth404' }); + const widget = spectator.query(MockComponent(WidgetDatapointComponent)); + expect(widget).toBeTruthy(); + expect(widget.text).toBe('Network interface eth404 not found.'); + }); + + it('renders N/A when an interface has no IPv4 addresses', () => { + spectator.setInput('settings', { interface: 'eth1' }); - const widget = spectator.query(MockComponent(WidgetDatapointComponent)); - expect(widget).toBeTruthy(); - expect(widget.text).toBe('Network interface eth404 not found.'); + const widget = spectator.query(MockComponent(WidgetDatapointComponent)); + expect(widget).toBeTruthy(); + expect(widget.text).toBe('N/A'); + }); }); - it('renders N/A when an interface has no IPv4 addresses', () => { - spectator.setInput('settings', { interface: 'eth1' }); + describe('have no settings', () => { + beforeEach(() => { + spectator = createComponent({ + props: { + settings: {} as WidgetInterfaceIpSettings, + size: SlotSize.Quarter, + }, + }); + }); - const widget = spectator.query(MockComponent(WidgetDatapointComponent)); - expect(widget).toBeTruthy(); - expect(widget.text).toBe('N/A'); + it('renders IPv4 addresses for the first picked network interface', () => { + const widget = spectator.query(MockComponent(WidgetDatapointComponent)); + expect(widget).toBeTruthy(); + expect(widget.label).toBe('eth0 Address'); + expect(widget.text).toBe('192.168.1.1\n192.168.1.2'); + }); }); }); diff --git a/src/app/pages/dashboard/widgets/network/widget-interface-ip/widget-interface-ip.component.ts b/src/app/pages/dashboard/widgets/network/widget-interface-ip/widget-interface-ip.component.ts index ccaaa5845ae..a902716a6c9 100644 --- a/src/app/pages/dashboard/widgets/network/widget-interface-ip/widget-interface-ip.component.ts +++ b/src/app/pages/dashboard/widgets/network/widget-interface-ip/widget-interface-ip.component.ts @@ -23,21 +23,27 @@ export class WidgetInterfaceIpComponent implements WidgetComponent(); settings = input.required(); + protected interfaceId = computed(() => { + if (this.settings()?.interface) { + return this.settings().interface; + } + return mapLoadedValue(this.interfaces(), (nics) => nics[0].name)?.value; + }); protected interfaceType = computed(() => { return this.settings()?.widgetName?.includes('v6') ? NetworkInterfaceAliasType.Inet6 : NetworkInterfaceAliasType.Inet; }); protected widgetName = computed(() => { - return this.translate.instant('{nic} Address', { nic: this.settings()?.interface }) || ''; + return this.translate.instant('{nic} Address', { nic: this.interfaceId() }) || ''; }); protected ips = computed(() => { - const interfaceId = this.settings()?.interface || ''; + const interfaceId = this.interfaceId(); return mapLoadedValue(this.interfaces(), (interfaces) => this.getIp4Addresses(interfaces, interfaceId)); }); - private interfaces = toSignal(this.resources.networkInterfaces$, { initialValue: { isLoading: true } }); + private interfaces = toSignal(this.resources.networkInterfaces$); constructor( private resources: WidgetResourcesService, @@ -52,6 +58,7 @@ export class WidgetInterfaceIpComponent implements WidgetComponentnobody. The chosen account is required to have permissions to the shared pool or dataset. To adjust permissions, edit the dataset Access Control List (ACL), add a new entry for the chosen guest account, and configure the permissions in that entry. If the selected Guest Account is deleted the field resets to nobody.": "Compte à utiliser pour l'accès des invités. La valeur par défaut est \"nobody\". Le compte choisi doit avoir des autorisations pour le volume ou le dataset partagé. Pour ajuster les autorisations, modifiez la liste de contrôle d'accès (ACL) du dataset, ajoutez une nouvelle entrée pour le compte invité choisi et configurez les autorisations dans cette entrée. Si le compte d'invité sélectionné est supprimé, le champ se réinitialise à nobody.", "Account: {account}": "Compte: {account} ", + "Ace has errors.": "Ace a des erreurs.", "Action Not Possible": "Action impossible", "Actions": "Actions", "Activate": "Activer", @@ -1205,6 +1157,7 @@ "Active: TrueNAS Controller {id}": "Actif : contrôleur TrueNAS {id}", "Adapter Type": "Type d'adaptateur", "Add": "Ajouter", + "Add ACME DNS-Authenticator": "Ajouter l'authentificateur DNS ACME", "Add API Key": "Ajouter une clé API", "Add Alert": "Ajouter une alerte", "Add Alert Service": "Ajouter un service d'alerte", @@ -1228,6 +1181,7 @@ "Add Disk Test": "Ajouter un disque de test", "Add Disks": "Ajouter des disques", "Add Disks To:": "Ajouter des disques à", + "Add Exporter": "Ajouter un exporter", "Add Extent": "Ajouter une étendue", "Add External Interfaces": "Ajouter des interfaces externes", "Add Filesystem": "Ajouter un système de fichiers", @@ -1244,11 +1198,13 @@ "Add Kerberos Realm": "Ajouter un Realm Kerberos", "Add Kerberos SPN Entry": "Ajouter une entrée SPN Kerberos", "Add Kernel Parameters": "Ajouter des paramètres au kernel", + "Add Key": "Ajouter clé", "Add License": "Ajouter la licence", "Add Local Group": "Ajouter un groupe local", "Add Local User": "Ajouter un utilsateur local", "Add NFS Share": "Ajouter un partage NFS", "Add NTP Server": "Ajouter un serveur NTP", + "Add New": "Ajouter nouvelle", "Add Periodic S.M.A.R.T. Test": "Ajouter un test S.M.A.R.T. périodique", "Add Periodic Snapshot Task": "Ajouter une tâche d'instantanés périodique", "Add Pool": "Ajouter un volume", @@ -1335,6 +1291,7 @@ "Agree": "Accepter", "Alert": "Alerte", "Alert List Read": "Lecture de la liste d'alertes", + "Alert List Write": "Liste d'alertes Écriture", "Alert Services": "Services d'alerte", "Alert Settings": "Paramètres d'alerte", "Alert service saved": "Service d'alertes sauvegardé", @@ -1349,6 +1306,7 @@ "All disks healthy.": "Tous les disques sont sains.", "All pools are online.": "Tous les volumes sont en ligne.", "All selected directories must be at the same level i.e., must have the same parent directory.": "Tous les répertoires sélectionnés doivent être au même niveau, c'est-à-dire qu'ils doivent avoir le même répertoire parent.", + "All users": "Tous les utilisateurs", "Allocate RAM for the VM. Minimum value is 256 MiB.": "Allouer la RAM pour la VM. La valeur minimale est de 256 MB.", "Allocate at least 256 MiB.": "Attribuer au moins 256 Mo.", "Allocate space for the new zvol.": "Allouer de l’espace pour le nouveau zvol.", @@ -3218,6 +3176,7 @@ "Minutes/Hours/Days": "Minutes/heures/jours", "Mirror": "Miroir", "Missing permissions for this action": "Autorisations manquantes pour cette action", + "Mixing disks of different sizes in a vdev is not recommended.": "Il n'est pas recommandé de mélanger des disques de différentes tailles dans un vdev.", "Mode": "Mode", "Model": "Modèle", "Modify": "Modifier", @@ -3232,6 +3191,7 @@ "Move existing keys from the current key server to a new key server. To switch to a different key server, key synchronization must be Enabled, then enable this setting, update the key server connection configuration, and click SAVE.": "Déplacer les clés existantes du serveur de clés actuel vers un nouveau serveur de clés. Pour passer à un autre serveur de clés, la synchronisation des clés doit être activée, puis activer ce paramètre, mettre à jour la configuration de connexion du serveur de clés et cliquer sur ENREGISTRER.", "Multi-domain support. Enter additional domains to secure. Separate domains by pressing Enter For example, if the primary domain is example.com, entering www.example.com secures both addresses.": "Support multi-domaine. Entrez des domaines supplémentaires à sécuriser. Séparez les domaines en appuyant sur la touche Entrée. Par exemple, si le domaine principal est example.com, la saisie de www.example.com permet de sécuriser les deux adresses.", "Multicast DNS. Uses the system Hostname to advertise enabled and running services. For example, this controls if the server appears under Network on MacOS clients.": "DNS multicast. Utilise le nom d'hôte du système pour annoncer les services activés et en cours d'exécution. Par exemple, cela permet de contrôler si le serveur apparaît sous Réseau sur les clients MacOS.", + "Must be part of the pool to check errors.": "Doit faire partie du volume pour vérifier les erreurs.", "Must match Windows workgroup name. When this is unconfigured and Active Directory or LDAP are active, TrueNAS will detect and set the correct workgroup from these services.": "Doit correspondre au nom du groupe de travail Windows. Lorsque cela n’est pas configuré et qu’Active Directory ou LDAP sont actifs, TrueNAS détecte et définira le groupe de travail correct à partir de ces services.", "Mutual secret password. Required when Peer User is set. Must be different than the Secret.": "Mot de passe secret mutuel. Requis lorsque l'option Peer User est activée. Ça doit être différent du Secret.", "N/A": "N/A", @@ -3245,6 +3205,7 @@ "NIC": "NIC", "NOTICE": "NOTICE", "NTLMv1 Auth": "Authentification NTLMv1", + "NTP Server": "Server NTP", "NTP Server Settings": "Paramètres du Serveur NTP", "NTP Servers": "Serveurs NTP", "Name": "Nom", @@ -3276,11 +3237,13 @@ "Nameserver 3": "Serveur de noms 3 (DNS)", "Nameserver {n}": "Serveur de noms {n}", "Naming Schema": "Schéma de nommage", + "Negotiate – only encrypt transport if explicitly requested by the SMB client": "Négocier – chiffrer le transport uniquement si explicitement demandé par le client SMB", "NetBIOS": "NetBIOS", "NetBIOS Alias": "Alias NetBIOS", "NetBIOS Name": "Nom NetBIOS", "NetBIOS Name of this NAS. This name must differ from the Workgroup name and be no greater than 15 characters.": "Nom NetBIOS de ce NAS. Ce nom doit être différent du nom du Groupe de travail et ne doit pas dépasser 15 caractères.", "Network": "Réseau", + "Network Configuration": "Configuration réseau", "Network Interface": "Interface réseau", "Network Reports": "Rapports réseau", "Network Timeout Before Initiating Failover": "Délai d'attente réseau avant d'initier le basculement", @@ -3293,17 +3256,30 @@ "Network interface changes have been temporarily applied for testing. Keep changes permanently? Changes are automatically reverted after the testing delay if they are not permanently applied.": "Les changements d'interface réseau ont été temporairement appliqués pour les tests. Conserver les modifications de façon permanente ? Les modifications sont automatiquement annulées après le délai de test si elles ne sont pas appliquées de manière permanente.", "Network interface settings have been temporarily changed for testing. The settings will revert to the previous configuration after {x} seconds unless SAVE CHANGES is chosen to make them permanent.": "Les paramètres de l'interface réseau ont été temporairement modifiés à des fins de test. Les paramètres reviendront à la configuration précédente après {x} secondes, à moins que SAUVEGARDER CHANGEMENTS ne soit choisi pour les rendre permanents.", "Network interface updated": "Mise à jour de l'interface réseau", + "Network interface {interface} not found.": "Interface réseau {interface} non trouvée.", + "Network interfaces do not match between storage controllers.": "Les interfaces réseau ne correspondent pas entre les contrôleurs de stockage.", "Network interfaces to include in the bridge.": "Interfaces réseau à inclure dans la passerelle.", "Networking": "Réseau", "Networks": "Réseaux", "Never": "Jamais", "Never Delete": "Jamais effacé", "New & Updated Apps": "Nouvelles applis et mises à jour", + "New ACME DNS-Authenticator": "Nouvel authentificateur DNS ACME", + "New Alert": "Nouvelle alerte", + "New Certificate Authority": "Nouvelle autorité de certification", + "New Certificate Signing Requests": "Nouvelles demandes de signature de certificat", "New Devices": "Nouveaux périphériques", "New Disk": "Nouveau disque", "New IPv4 Default Gateway": "Nouvelle passerelle IPv4 par défaut", + "New Key": "Nouvelle clé", + "New NFS Share": "Nouveau partage NFS", + "New NTP Server": "Nouveau server NTP", "New Password": "Nouveau mot de passe", + "New Periodic S.M.A.R.T. Test": "Nouveau test S.M.A.R.T. périodique", + "New Periodic Snapshot Task": "Nouvelle tâche d'instantané périodique", "New Pool": "Nouveau volume", + "New Privilege": "Nouveau privilège", + "New Replication Task": "Nouvelle tâche de réplication", "New Rsync Task": "Nouvelle tâche Rsync", "New SMB Share": "Nouveau partage SMB", "New SSH Connection": "Nouvelle connexion SSH", @@ -3345,30 +3321,46 @@ "No Safety Check (CAUTION)": "Pas de contrôle de sécurité (ATTENTION)", "No Search Results.": "Aucun résultat trouvé.", "No arguments are passed": "Aucun argument n'est passé", + "No containers are available.": "Aucun conteneur n'est disponible.", "No descriptor provided": "Aucun descripteur n'est fourni", + "No disks available.": "Aucun disque disponible", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "Aucune adresse e-mail n'est définie pour l'utilisateur root ou tout autre administrateur local. Veuillez configurer une telle adresse e-mail en premier lieu.", "No enclosure": "Aucune enceinte", "No errors": "Aucune erreur", "No events to display.": "Aucun événement à afficher.", "No interfaces configured with Virtual IP.": "Aucune interface configurée avec Virtual IP.", + "No items have been added yet.": "Aucun élément n'a encore été ajouté.", "No logs are available": "Aucun log n'est disponible", "No logs are available for this task.": "Aucun log n'est disponible pour cette tâche.", + "No logs available": "Aucun log disponible", + "No logs yet": "Pas encore de logs", "No longer keep this Boot Environment?": "Vous ne conservez plus cet environnement d'amorçage ?", "No matching results found": "Aucun résultat correspondant trouvé", "No network interfaces are marked critical for failover.": "Aucune interface réseau n'est considérée comme critique pour le basculement (failover).", + "No options": "Aucune option", + "No options are passed": "Aucune option n'est transmise", "No pools are configured.": "Aucun volume n'est configuré.", "No ports are being used.": "Aucun port n'est utilisé.", "No records": "Aucun enregistrement", "No records have been added yet": "Aucun enregistrement n'a encore été ajouté", + "No results found in {section}": "Aucun résultat trouvé dans {section}", + "No similar apps found.": "Aucune application similaire trouvée.", "No snapshots sent yet": "Pas encore d'instantanés envoyés", + "No temperature data was reported by the system. There can be a number of reasons why this might occur.": "Aucune donnée de température n'a été signalée par le système. Plusieurs raisons peuvent expliquer ce phénomène.", + "No unused disks": "Aucun disque inutilisé", + "No update found.": "Aucune mise à jour trouvée.", "No updates available.": "Aucune mise à jour disponible.", + "No vdev info for this disk": "Aucune information vdev pour ce disque", + "No volume mounts": "Aucun volume monté", "No warnings": "Pas d'avertissement", "Node set allows setting NUMA nodes for multi NUMA processors when CPU set was defined. Better memory locality can be achieved by setting node set based on assigned CPU set. E.g. if cpus 0,1 belong to NUMA node 0 then setting nodeset to 0 will improve memory locality": "L'ensemble de nœuds permet de définir des nœuds NUMA pour les processeurs multi NUMA lorsque l'ensemble de processeurs a été défini. Un meilleur emplacement de mémoire peut être obtenue en définissant un ensemble de nœuds en fonction de l'ensemble de CPU attribué. Par exemple. si les processeurs 0,1 appartiennent au nœud NUMA 0, la définition de nodeset sur 0 améliorera la localité de la mémoire", "Nodes Virtual IP states do not agree.": "Les états des nœuds des IP virtuelles ne concordent pas.", "None": "Aucun", + "None requested": "Aucune demande", "Normal": "Normal", "Normal VDEV type, used for primary storage operations. ZFS pools always have at least one DATA VDEV.": "Type VDEV normal, utilisé pour les opérations de stockage primaire. Les volumes ZFS ont toujours au moins un DATA VDEV.", "Not Set": "Non défini", + "Not Shared": "Non partagé", "Not enough free space. Maximum available: {space}": "Pas assez d'espace libre. Maximum disponible : {space}", "Notes about this disk.": "Notes sur ce disque.", "Notes about this extent.": "Notes sur cette étendue.", @@ -3377,6 +3369,7 @@ "Nov": "Nov", "Now": "Maintenant", "Now/Reboot": "Maintenant/Redémarrer", + "Num Pending Deletes": "Nombre de suppressions en attente", "Number of VDEVs": "Nombre de VDEVs", "Number of bytes": "Nombre d'octets", "Number of days to renew certificate before expiring.": "Nombre de jours pour renouveler le certificat avant son expiration.", @@ -3407,6 +3400,7 @@ "Off by default. When set, smbd(8) attempts to authenticate users with the insecure and vulnerable NTLMv1 encryption. This setting allows backward compatibility with older versions of Windows, but is not recommended and should not be used on untrusted networks.": "Désactivé par défaut. Lorsqu'il est défini, smbd(8) tente d'authentifier les utilisateurs avec le chiffrement NTLMv1 non sécurisé et vulnérable. Ce paramètre permet une rétrocompatibilité avec les anciennes versions de Windows, mais n'est pas recommandé et ne doit pas être utilisé sur des réseaux non approuvés.", "Offline": "Hors ligne", "Offline Disk": "Disque hors ligne", + "Offline VDEVs": "VDEV hors ligne", "Offline disk {name}?": "Disque {name} hors ligne ?", "On": "Activé", "On a Different System": "Sur un système différent", @@ -3414,15 +3408,19 @@ "Once an enclosure is selected, all other VDEV creation steps will limit disk selection options to disks in the selected enclosure. If the enclosure selection is changed, all disk selections will be reset.": "Une fois qu'un boîtier est sélectionné, toutes les autres étapes de création VDEV limiteront les options de sélection de disque aux disques du boîtier sélectionné. Si la sélection du boîtier est modifiée, toutes les sélections de disques seront réinitialisées.", "Once enabled, users will be required to set up two factor authentication next time they login.": "Une fois activé, les utilisateurs devront configurer une authentification à deux facteurs lors de leur prochaine connexion.", "One or more data VDEVs has disks of different sizes.": "Un ou plusieurs VDEV de données disposent de disques de différentes tailles.", + "One-Time Password (if necessary)": "Mot de passe à usage unique (si nécessaire)", "One-Time Password if two factor authentication is enabled.": "Mot de passe à usage unique si l'authentification à deux facteurs est activée.", "Online": "En ligne", "Online Disk": "Disque en ligne", "Online disk {name}?": "Disque {name} en ligne ?", "Only Readonly Admin, Sharing Admin or Full Admin roles are supported in WebUI.": "Seuls les rôles Lecture seule, Gestionnaire de partage ou Administrateur complet sont pris en charge dans WebUI.", + "Only Replicate Snapshots Matching Schedule": "Répliquer uniquement les instantanés correspondant au calendrier", "Only appears if Device is selected. Select the unused zvol or zvol snapshot.": "N'apparaît que si Périphérique est sélectionné. Sélectionnez l'instantané zvol ou zvol inutilisé.", "Only appears if a File or zvol is selected. When the specified percentage of free space is reached, the system issues an alert.": "N'apparaît que si un fichier ou un zvol est sélectionné. Lorsque le pourcentage d'espace libre spécifié est atteint, le système émet une alerte.", "Only disks that are at least {size} are shown.": "Seuls les disques d'au moins {size} sont affichés.", "Only entered when configuring mutual CHAP. Usually the same value as User.": "Saisie uniquement lors de la configuration du CHAP mutuel. Habituellement la même valeur que l'utilisateur.", + "Only first {number} examples are shown.": "Seuls les {number} premiers exemples sont affichés.", + "Only image(s) will be updated": "Seules les images seront mises à jour", "Only lowercase alphanumeric characters plus dot (.), dash (-), and colon (:) are allowed.": "Seuls les caractères alphanumériques minuscules plus le point (.), le tiret (-) et les deux points (:) sont autorisés.", "Only needed when connecting to a Team Drive. The ID of the top level folder of the Team Drive.": "Nécessaire uniquement lors de la connexion à un Team Drive. L'ID du dossier de niveau supérieur du Team Drive.", "Only numeric ids are allowed.": "Seuls les identifiants numériques sont autorisés.", @@ -3430,7 +3428,9 @@ "Only override the default if the initiator requires a different block size.": "Ne remplacez la valeur par défaut que si l'initiateur a besoin d'une taille de bloc différente.", "Only replicate snapshots that match a defined creation time. To specify which snapshots will be replicated, set this checkbox and define the snapshot creation times that will be replicated. For example, setting this time frame to Hourly will only replicate snapshots that were created at the beginning of each hour.": "Ne répliquez que les clichés qui correspondent à un temps de création défini. Pour spécifier quels instantanés seront répliqués, cochez cette case et définissez les heures de création des instantanés qui seront répliqués. Par exemple, en définissant ce délai comme étant horaire, seuls les instantanés créés au début de chaque heure seront répliqués.", "Open": "Ouvrir", + "Open Files": "Ouvrir les fichiers", "Open TrueCommand User Interface": "Ouvrir l'interface utilisateur TrueCommand", + "Open ticket": "Ouvrir le ticket", "Openstack API key or password. This is the OS_PASSWORD from an OpenStack credentials file.": "Clé API ou mot de passe d'Openstack. Il s'agit du mot de passe OS_PASSWORD d'un fichier d'identification OpenStack.", "Openstack user name for login. This is the OS_USERNAME from an OpenStack credentials file.": "Nom d'utilisateur Openstack pour la connexion. Il s'agit du nom d'utilisateur OS_USERNAME d'un fichier d'identification OpenStack.", "Operating System": "Système d'exploitation", @@ -5067,4 +5067,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