Merge "Imported Translations from Zanata"
This commit is contained in:
commit
2e52f4b95a
507
ironic/locale/fr/LC_MESSAGES/ironic-log-info.po
Normal file
507
ironic/locale/fr/LC_MESSAGES/ironic-log-info.po
Normal file
@ -0,0 +1,507 @@
|
||||
# Gérald LONLAS <g.lonlas@gmail.com>, 2016. #zanata
|
||||
# Ian Y. Choi <ianyrchoi@gmail.com>, 2016. #zanata
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ironic 6.2.1.dev169\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
|
||||
"POT-Creation-Date: 2016-10-14 19:07+0000\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"PO-Revision-Date: 2016-10-14 05:42+0000\n"
|
||||
"Last-Translator: Ian Y. Choi <ianyrchoi@gmail.com>\n"
|
||||
"Language-Team: French\n"
|
||||
"Language: fr\n"
|
||||
"X-Generator: Zanata 3.7.3\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
|
||||
|
||||
#, python-format
|
||||
msgid "Adding cleaning network to node %s"
|
||||
msgstr "Ajout d'un nettoyage du réseau pour le noeud %s"
|
||||
|
||||
#, python-format
|
||||
msgid "Adding provisioning network to node %s"
|
||||
msgstr "Ajout du provisionnement de réseau pour le noeud %s"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"After cleaning up cache dir %(dir)s cache size %(actual)d is still larger "
|
||||
"than threshold %(expected)d"
|
||||
msgstr ""
|
||||
"Après avoir nettoyé le cache du dossier %(dir)s, la taille actuelle du "
|
||||
"dossier(%(actual)d) est encore plus large que la limite (%(expected)d)"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Agent on node %s returned cleaning command success, moving to next clean step"
|
||||
msgstr ""
|
||||
"L'agent en mode %s a retourné que la commande de nettoyage a été un succès, "
|
||||
"passage à la prochaine étape de nettoyage"
|
||||
|
||||
#, python-format
|
||||
msgid "All Firmware update operations completed successfully for node: %s."
|
||||
msgstr ""
|
||||
"Toutes les mises à jours des firmwares pour le noeud %s ont été fait avec "
|
||||
"succès."
|
||||
|
||||
#, python-format
|
||||
msgid "Attached virtual cdrom successfully for node %s"
|
||||
msgstr "Le CD-Rom virtuel pour le noeud %s a été attaché avec succès"
|
||||
|
||||
#, python-format
|
||||
msgid "Attached virtual floppy successfully for node %s"
|
||||
msgstr "La disquette virtuelle pour le noeud %s a été attachée avec succès"
|
||||
|
||||
#, python-format
|
||||
msgid "Attached virtual media %s successfully."
|
||||
msgstr "Média virtuel %s attaché avec succès."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Automated cleaning is disabled, node %s has been successfully moved to "
|
||||
"AVAILABLE state."
|
||||
msgstr ""
|
||||
"Le nettoyage automatique est désactivé, le noeud %s a été changé avec succès "
|
||||
"pour l'état AVAILABLE."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Bringing node %(node_uuid)s back from use by OneView from "
|
||||
"%(provision_state)s state to %(target_state)s state and maintenance mode "
|
||||
"%(maintenance)s."
|
||||
msgstr ""
|
||||
"Ramène le noeud %(node_uuid)s utilisé par OneView de l'état "
|
||||
"%(provision_state)s à l'état %(target_state)s et en mode de maintenance "
|
||||
"%(maintenance)s."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Change has been committed to RAID controller %(controller)s on node "
|
||||
"%(node)s. DRAC job id: %(job_id)s"
|
||||
msgstr ""
|
||||
"Changement appliqué pour le controleur RAID %(controller)s sur le noeud "
|
||||
"%(node)s. ID de la tâche DRAC : %(job_id)s"
|
||||
|
||||
#, python-format
|
||||
msgid "Changed secure boot to %(mode)s for node %(node)s"
|
||||
msgstr "Le Secure boot du noeud %(node)s a été changé pour %(mode)s"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Clean step %(step)s on node %(node)s being executed asynchronously, waiting "
|
||||
"for driver."
|
||||
msgstr ""
|
||||
"L'étape de nettoyage %(step)s sur le noeud %(node)s a été exécuté de manière "
|
||||
"asynchrone. Attente du pilote."
|
||||
|
||||
#, python-format
|
||||
msgid "Created RPC server for service %(service)s on host %(host)s."
|
||||
msgstr ""
|
||||
"Serveur RPC pour le service %(service)s sur l'hôte %(host)s a été créé."
|
||||
|
||||
#, python-format
|
||||
msgid "Deployment to node %s done"
|
||||
msgstr "Déploiement du noeud %s terminé"
|
||||
|
||||
#, python-format
|
||||
msgid "Detached virtual cdrom successfully for node %s"
|
||||
msgstr "Le CD-Rom virtuel pour le noeud %s a été détaché avec succès"
|
||||
|
||||
#, python-format
|
||||
msgid "Detached virtual floppy successfully for node %s"
|
||||
msgstr "La disquette virtuelle pour le noeud %s a été détachée avec succès"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"During automated cleaning, node %s detected a clean version mismatch. "
|
||||
"Resetting clean steps and rebooting the node."
|
||||
msgstr ""
|
||||
"Pendant le nettoyage automatique, le noeud %s a détecté que la version de "
|
||||
"nettoyage ne correspondait pas. Reset des étapes de nettoyage et redémarrage "
|
||||
"du noeud."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"During manual cleaning, node %(node)s detected a clean version mismatch. Re-"
|
||||
"executing and continuing from current step %(step)s."
|
||||
msgstr ""
|
||||
"Pendant le nettoyage manuel, le noeud %(node)s a détecté que la version de "
|
||||
"nettoyage ne correspondait pas. Re-execution de l'étape actuelle %(step)s."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"During query_raid_config_job_status, node %(node)s was already locked by "
|
||||
"another process. Skip."
|
||||
msgstr ""
|
||||
"Pendant la tâche query_raid_config_job_status, le noeud %(node)s a été "
|
||||
"verrouillé par un autre processus. Étape ignorée."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"During query_raid_config_job_status, node %(node)s was not found and "
|
||||
"presumed deleted by another process."
|
||||
msgstr ""
|
||||
"Pendant la tâche query_raid_config_job_status, le noeud %(node)s n'a pas été "
|
||||
"trouvé et probablement supprimé par un autre processus."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"During sync_power_state, node %(node)s has no previous known state. "
|
||||
"Recording current state '%(state)s'."
|
||||
msgstr ""
|
||||
"Pendant l'étape sync_power_state, le noeud %(node)s n'avait pas d'état "
|
||||
"connu. Enregistrement de l'état courant à '%(state)s'."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"During sync_power_state, node %(node)s was already locked by another "
|
||||
"process. Skip."
|
||||
msgstr ""
|
||||
"Pendant l'étape sync_power_state, le noeud %(node)s a été verrouillé par un "
|
||||
"autre processus. Étape ignorée."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"During sync_power_state, node %(node)s was not found and presumed deleted by "
|
||||
"another process."
|
||||
msgstr ""
|
||||
"Pendant l'étape sync_power_state, le noeud %(node)s n'a pas été trouvé et "
|
||||
"probablement supprimé par un autre processus."
|
||||
|
||||
#, python-format
|
||||
msgid "Executing %(state)s on node %(node)s, remaining steps: %(steps)s"
|
||||
msgstr ""
|
||||
"Exécution de %(state)s sur le noeud %(node)s, étapes restantes : %(steps)s"
|
||||
|
||||
#, python-format
|
||||
msgid "Executing %(step)s on node %(node)s"
|
||||
msgstr "Execution de %(step)s sur le noeud %(node)s"
|
||||
|
||||
#, python-format
|
||||
msgid "Final processed firmware location: %s"
|
||||
msgstr "Chemin vers les firmwares finaux : %s"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Got signal SIGUSR1. Not deregistering on next shutdown of service "
|
||||
"%(service)s on host %(host)s."
|
||||
msgstr ""
|
||||
"Signal SIGUSR1 reçu. Il ne sera pas dé-enregistré au prochain arrêt du "
|
||||
"service service %(service)s sur l'hôte %(host)s."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Image %(href)s was last modified at %(remote_time)s. Deleting the cached "
|
||||
"copy \"%(cached_file)s since it was last modified at %(local_time)s and may "
|
||||
"be outdated."
|
||||
msgstr ""
|
||||
"L'image %(href)s a été modifiée à %(remote_time)s. Suppression de la copie "
|
||||
"en cache \"%(cached_file)s depuis qu'il a été modifié à %(local_time)s et "
|
||||
"est probablement périmée."
|
||||
|
||||
#, python-format
|
||||
msgid "Image successfully written to node %s"
|
||||
msgstr "Image écrite avec succès pour le noeud %s"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Inconsistent 'applied_server_profile_uri' parameter value in driver_info. "
|
||||
"There is no Server Profile applied to node %(node_uuid)s. Value deleted."
|
||||
msgstr ""
|
||||
"La valeur du paramètre 'applied_server_profile_uri' est inconsistante dans "
|
||||
"driver_info. Il n'y a pas de Server Profile appliqué au noeud %(node_uuid)s. "
|
||||
"Valeur supprimée."
|
||||
|
||||
#, python-format
|
||||
msgid "Inspection finished successfully for node %s"
|
||||
msgstr "L'inspection du noeud %s a été terminé avec succès"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Inspection via ironic-inspector is disabled in configuration for driver %s. "
|
||||
"To enable, change [inspector] enabled = True."
|
||||
msgstr ""
|
||||
"L'inspection depuis ironic-inspector est désactivé dans la configuration du "
|
||||
"pilote %s. Pour l'activer, changez [inspector] enabled = True."
|
||||
|
||||
#, python-format
|
||||
msgid "Loaded the following drivers: %s"
|
||||
msgstr "Les pilotes suivants ont été chargés : %s"
|
||||
|
||||
#, python-format
|
||||
msgid "Local boot successfully configured for node %s"
|
||||
msgstr "Le boot local a été configuré avec succès sur le noeud %s"
|
||||
|
||||
#, python-format
|
||||
msgid "Mapping instance ports to %s"
|
||||
msgstr "Relie les ports de l'instance à %s"
|
||||
|
||||
#, python-format
|
||||
msgid "Master cache miss for image %(href)s, starting download"
|
||||
msgstr ""
|
||||
"Cache maître manquant pour l'image %(href)s, démarrage du téléchargement"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Missing 'ilo_change_password' parameter in driver_info. Clean step "
|
||||
"'reset_ilo_credential' is not performed on node %s."
|
||||
msgstr ""
|
||||
"Le paramètre 'ilo_change_password' est manquant dans driver_info. L'étape de "
|
||||
"nettoyage 'reset_ilo_credential' ne sera pas effectuée sur le noeud %s."
|
||||
|
||||
#, python-format
|
||||
msgid "No console action was triggered because the console is already %s"
|
||||
msgstr "Aucune action sur la console n'a été appelé car la console est déjà %s"
|
||||
|
||||
#, python-format
|
||||
msgid "Node %(node)s finished clean step %(step)s"
|
||||
msgstr "Le noeud %(node)s vient de finir l'étape de nettoyage %(step)s"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Node %(node)s moved to provision state \"%(state)s\" from state "
|
||||
"\"%(previous)s\"; target provision state is \"%(target)s\""
|
||||
msgstr ""
|
||||
"Noeud %(node)s déplacé de l'état de provisionnement \"%(previous)s\" à "
|
||||
"\"%(state)s\"; L'étape finale de provisionnement est \"%(target)s\""
|
||||
|
||||
#, python-format
|
||||
msgid "Node %(uuid)s boot mode is set to %(boot_mode)s."
|
||||
msgstr "Le boot mode du noeud %(uuid)s est configuré pour %(boot_mode)s."
|
||||
|
||||
#, python-format
|
||||
msgid "Node %(uuid)s pending boot mode is %(boot_mode)s."
|
||||
msgstr ""
|
||||
"La méthode de boot en attente pour le noeud %(uuid)s est %(boot_mode)s."
|
||||
|
||||
#, python-format
|
||||
msgid "Node %s cleaning complete"
|
||||
msgstr "Nettoyage du noeud %s terminé"
|
||||
|
||||
#, python-format
|
||||
msgid "Node %s inspected"
|
||||
msgstr "Noeud %s inspecté"
|
||||
|
||||
#, python-format
|
||||
msgid "Node %s inspected."
|
||||
msgstr "Noeud %s inspecté."
|
||||
|
||||
#, python-format
|
||||
msgid "Node %s successfully inspected."
|
||||
msgstr "Le noeud %s a été inspecté avec succès."
|
||||
|
||||
#, python-format
|
||||
msgid "Node %s was sent to inspection to ironic-inspector"
|
||||
msgstr "Le noeud %s a été envoyé pour inspection à ironic-inspector"
|
||||
|
||||
#, python-format
|
||||
msgid "Option %(opt)s is not supported by ipmitool"
|
||||
msgstr "L'option %(opt)s n'est pas supportée par ipmitool"
|
||||
|
||||
#, python-format
|
||||
msgid "Option %(opt)s is supported by ipmitool"
|
||||
msgstr "L'option %(opt)s est supportée par ipmitool"
|
||||
|
||||
#, python-format
|
||||
msgid "Port created for MAC address %(address)s for node %(node)s"
|
||||
msgstr "Port créé pour l'adresse MAC %(address)s pour le noeud %(node)s"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Port created for MAC address %(address)s for node %(node_uuid)s during "
|
||||
"inspection"
|
||||
msgstr ""
|
||||
"Le port pour l'adresse MAC %(address)s pour le noeud %(node_uuid)s a été "
|
||||
"créé avec succès pendant l'inspection"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Port created with MAC address %(mac)s for node %(node_uuid)s during "
|
||||
"inspection"
|
||||
msgstr ""
|
||||
"Le port avec l'adresse MAC %(mac)s pour le noeud %(node_uuid)s a été créé "
|
||||
"avec succès pendant l'inspection"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Power off called for node %s. Wake-On-Lan does not support this operation. "
|
||||
"Manual intervention required to perform this action."
|
||||
msgstr ""
|
||||
"Coupure de l'alimentation appelée par le noeud %s. Le Wake-On-Lan ne "
|
||||
"supporte pas cette opération. Une intervention manuelle est requise pour "
|
||||
"effectuer cette action."
|
||||
|
||||
#, python-format
|
||||
msgid "Power state set to %(state)s for node %(node_id)s"
|
||||
msgstr "État de l'alimentation mis à %(state)s pour le noeud %(node_id)s"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Reboot called for node %s. Wake-On-Lan does not fully support this "
|
||||
"operation. Trying to power on the node."
|
||||
msgstr ""
|
||||
"Redémarrage appelé par le noeud %s. Le Wake-On-Lan ne supporte pas "
|
||||
"complètement cette opération. Essaye d'allumer le noeud."
|
||||
|
||||
#, python-format
|
||||
msgid "Removing cleaning network from node %s"
|
||||
msgstr "Suppression du réseau de nettoyage pour le noeud %s"
|
||||
|
||||
#, python-format
|
||||
msgid "Removing ports from cleaning network for node %s"
|
||||
msgstr ""
|
||||
"Suppression des ports depuis l'étape de nettoyage du réseau pour le noeud %s"
|
||||
|
||||
#, python-format
|
||||
msgid "Removing provisioning network from node %s"
|
||||
msgstr "Suppression du réseau de provisionnement pour le noeud %s"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Server Profile %(server_profile_uuid)s was successfully applied to node "
|
||||
"%(node_uuid)s."
|
||||
msgstr ""
|
||||
"Le profil serveur %(server_profile_uuid)s a été appliqué avec succès sur le "
|
||||
"noeud %(node_uuid)s."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Server Profile %(server_profile_uuid)s was successfully deleted from node "
|
||||
"%(node_uuid)s."
|
||||
msgstr ""
|
||||
"Le profil serveur %(server_profile_uuid)s a été supprimé avec succès sur le "
|
||||
"noeud %(node_uuid)s."
|
||||
|
||||
#, python-format
|
||||
msgid "Setting up node %s to boot from virtual media"
|
||||
msgstr "Configuration du noeud %s pour booter depuis le média virtuel"
|
||||
|
||||
#, python-format
|
||||
msgid "Stopped RPC server for service %(service)s on host %(host)s."
|
||||
msgstr ""
|
||||
"Serveur RPC pour le service %(service)s sur l'hôte %(host)s a été arrêté."
|
||||
|
||||
#, python-format
|
||||
msgid "Successfully adopted node %(node)s"
|
||||
msgstr "Adoption du noeud %(node)s avec succès"
|
||||
|
||||
#, python-format
|
||||
msgid "Successfully created ports for node %(node_uuid)s in network %(net)s."
|
||||
msgstr ""
|
||||
"Les ports pour le noeud %(node_uuid)s dans le réseau %(net)s ont été créé "
|
||||
"avec succès."
|
||||
|
||||
#, python-format
|
||||
msgid "Successfully deleted node %(node)s."
|
||||
msgstr "Suppression du noeud %(node)s avec succès"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Successfully deleted port %(port)s. The node associated with the port was "
|
||||
"%(node)s"
|
||||
msgstr ""
|
||||
"Port %(port)s supprimé avec succès. Le noeud associé avec ce port était "
|
||||
"%(node)s"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Successfully deleted portgroup %(portgroup)s. The node associated with the "
|
||||
"portgroup was %(node)s"
|
||||
msgstr ""
|
||||
"Suppression avec succès du portgroup %(portgroup)s. Le noeud associé avec le "
|
||||
"portgroup était %(node)s"
|
||||
|
||||
#, python-format
|
||||
msgid "Successfully deployed node %(node)s with instance %(instance)s."
|
||||
msgstr ""
|
||||
"Le noeud %(node)s avec l'instance %(instance)s a été déployé avec succès."
|
||||
|
||||
#, python-format
|
||||
msgid "Successfully enabled boot config for node %(node_id)s."
|
||||
msgstr ""
|
||||
"La configuration de boot pour le noeud %(node_id)s a été activé avec succès."
|
||||
|
||||
#, python-format
|
||||
msgid "Successfully inspected node %(node)s"
|
||||
msgstr "Succès de l'inspection du noeud %(node)s "
|
||||
|
||||
#, python-format
|
||||
msgid "Successfully removed node %(node_uuid)s neutron ports."
|
||||
msgstr "Les ports neutron du noeud %(node_uuid)s ont été supprimé avec succès."
|
||||
|
||||
#, python-format
|
||||
msgid "Successfully set boot device %(boot_device)s for node %(node_id)s"
|
||||
msgstr ""
|
||||
"Le boot device %(boot_device)s pour le noeud %(node_id)s a été appliqué avec "
|
||||
"succès"
|
||||
|
||||
#, python-format
|
||||
msgid "Successfully set node %(node)s power state to %(state)s."
|
||||
msgstr "Le noeud %(node)s a été mis avec succès au power state %(state)s."
|
||||
|
||||
msgid "Successfully shut down periodic tasks"
|
||||
msgstr "Arrêt avec succès des tâches périodiques"
|
||||
|
||||
#, python-format
|
||||
msgid "Successfully started conductor with hostname %(hostname)s."
|
||||
msgstr "Le conducteur pour l'hôte %(hostname)s a démarré avec succès."
|
||||
|
||||
#, python-format
|
||||
msgid "Successfully started console of node %(node)s"
|
||||
msgstr "La console pour le noeud %(node)s a démarré avec succès."
|
||||
|
||||
#, python-format
|
||||
msgid "Successfully stopped conductor with hostname %(hostname)s."
|
||||
msgstr "Le conducteur pour l'hôte %(hostname)s a été arrêté avec succès."
|
||||
|
||||
#, python-format
|
||||
msgid "Successfully unprovisioned node %(node)s with instance %(instance)s."
|
||||
msgstr ""
|
||||
"Déprovisionnement avec succès du noeud %(node)s avec l'instance %(instance)s."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The Server Profile %(applied_sp_uri)s was already applied by ironic on node "
|
||||
"%(node_uuid)s. Reusing."
|
||||
msgstr ""
|
||||
"Le profil serveur %(applied_sp_uri)s a déjà été appliqué par Ironic pour le "
|
||||
"noeud %(node_uuid)s. Reusing."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The current clean step \"%(clean_step)s\" for node %(node)s is not "
|
||||
"abortable. Adding a flag to abort the cleaning after the clean step is "
|
||||
"completed."
|
||||
msgstr ""
|
||||
"L'étape actuelle de nettoyage \"%(clean_step)s\" pour le noeud %(node)s ne "
|
||||
"peut pas être annulée. Ajout d'un marqueur pour annulation après que l'étape "
|
||||
"de nettoyage soit complète."
|
||||
|
||||
#, python-format
|
||||
msgid "The node %s is not powered on. Powering on the node for inspection."
|
||||
msgstr "Le noeud %s n'est pas allumé. Allumage du noeud pour inspection."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The node %s was powered on for inspection. Powered off the node as "
|
||||
"inspection completed."
|
||||
msgstr ""
|
||||
"Le noeud %s a été allumé pour l'inspection. Le noeud sera éteint lorsque "
|
||||
"l'inspection sera terminée."
|
||||
|
||||
#, python-format
|
||||
msgid "Unmapping instance ports from node %s"
|
||||
msgstr "Délie les ports de l'instance du noeud %s"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Updating node %(node_uuid)s in use by OneView from %(provision_state)s state "
|
||||
"to %(target_state)s state and maintenance mode %(maintenance)s."
|
||||
msgstr ""
|
||||
"Mise à jour du noeud %(node_uuid)s utilisé par OneView depuis l'état "
|
||||
"%(provision_state)s vers l'état %(target_state)s et du mode de maintenance "
|
||||
"%(maintenance)s."
|
||||
|
||||
#, python-format
|
||||
msgid "iLO license activated for node %(node)s."
|
||||
msgstr "License iLO activée pour le noeud %(node)s."
|
Loading…
x
Reference in New Issue
Block a user