Files
navidrome/resources/i18n/fr.json
T
Deluan Quintão ab8a58157a feat: add artist image uploads and image-folder artwork source (#5198)
* feat: add shared ImageUploadService for entity image management

* feat: add UploadedImage field and methods to Artist model

* feat: add uploaded_image column to artist table

* feat: add ArtistImageFolder config option

* refactor: wire ImageUploadService and delegate playlist file ops to it

Wire ImageUploadService into the DI container and refactor the playlist
service to delegate image file operations (SetImage/RemoveImage) to the
shared ImageUploadService, removing duplicated file I/O logic. A local
ImageUploadService interface is defined in core/playlists to avoid an
import cycle between core and core/playlists.

* feat: artist artwork reader checks uploaded image first

* feat: add image-folder priority source for artist artwork

* feat: cache key invalidation for image-folder and uploaded images

* refactor: extract shared image upload HTTP helpers

* feat: add artist image upload/delete API endpoints

* refactor: playlist handlers use shared image upload helpers

* feat: add shared ImageUploadOverlay component

* feat: add i18n keys for artist image upload

* feat: add image upload overlay to artist detail pages

* refactor: playlist details uses shared ImageUploadOverlay component

* fix: add gosec nolint directive for ParseMultipartForm

* refactor: deduplicate image upload code and optimize dir scanning

- Remove dead ImageFilename methods from Artist and Playlist models
  (production code uses core.imageFilename exclusively)
- Extract shared uploadedImagePath helper in model/image.go
- Extract findImageInArtistFolder to deduplicate dir-scanning logic
  between fromArtistImageFolder and getArtistImageFolderModTime
- Fix fileInputRef in useCallback dependency array

* fix: include artist UpdatedAt in artwork cache key

Without this, uploading or deleting an artist image would not
invalidate the cached artwork because the cache key was only based
on album folder timestamps, not the artist's own UpdatedAt field.

* feat: add Portuguese translations for artist image upload

* refactor: use shared i18n keys for cover art upload messages

Move cover art upload/remove translations from per-entity sections
(artist, playlist) to a shared top-level "message" section, avoiding
duplication across entity types and translation files.

* refactor: move cover art i18n keys to shared message section for all languages

* refactor: simplify image upload code and eliminate redundancies

Extracted duplicate image loading/lightbox state logic from
DesktopArtistDetails and MobileArtistDetails into a shared
useArtistImageState hook. Moved entity type constants to the consts
package and replaced raw string literals throughout model, core, and
nativeapi packages. Exported model.UploadedImagePath and reused it in
core/image_upload.go to consolidate path construction. Cached the
ArtistImageFolder lookup result in artistReader to eliminate a redundant
os.ReadDir call on every artwork request.

Signed-off-by: Deluan <deluan@navidrome.org>

* style: fix prettier formatting in ImageUploadOverlay

* fix: address code review feedback on image upload error handling

- RemoveImage now returns errors instead of swallowing them
- Artist handlers distinguish not-found from other DB errors
- Defer multipart temp file cleanup after parsing

* fix: enforce hard request size limit with MaxBytesReader for image uploads

Signed-off-by: Deluan <deluan@navidrome.org>

---------

Signed-off-by: Deluan <deluan@navidrome.org>
2026-03-15 22:19:55 -04:00

716 lines
29 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"languageName": "Français",
"resources": {
"song": {
"name": "Titre |||| Titres",
"fields": {
"albumArtist": "Artiste",
"duration": "Durée",
"trackNumber": "#",
"playCount": "Nombre d'écoutes",
"title": "Titre",
"artist": "Artiste",
"album": "Album",
"path": "Chemin d'accès",
"genre": "Genre",
"compilation": "Compilation",
"year": "Année",
"size": "Taille",
"updatedAt": "Mise à jour",
"bitRate": "Bitrate",
"discSubtitle": "Sous-titre du disque",
"starred": "Favoris",
"comment": "Commentaire",
"rating": "Classement",
"quality": "Qualité",
"bpm": "BPM",
"playDate": "Derniers joués",
"channels": "Canaux",
"createdAt": "Date d'ajout",
"grouping": "Regroupement",
"mood": "Humeur",
"participants": "Participants supplémentaires",
"tags": "Étiquettes supplémentaires",
"mappedTags": "Étiquettes correspondantes",
"rawTags": "Étiquettes brutes",
"bitDepth": "Profondeur de bits",
"sampleRate": "Fréquence d'échantillonnage",
"missing": "Manquant",
"libraryName": "Bibliothèque",
"composer": "Compositeur·e",
"disc": ""
},
"actions": {
"addToQueue": "Ajouter à la file",
"playNow": "Lire",
"addToPlaylist": "Ajouter à la playlist",
"shuffleAll": "Tout mélanger",
"download": "Télécharger",
"playNext": "Jouer ensuite",
"info": "Plus d'informations",
"showInPlaylist": "Montrer dans la playlist",
"instantMix": "Mix instantanné"
}
},
"album": {
"name": "Album |||| Albums",
"fields": {
"albumArtist": "Artiste",
"artist": "Artiste",
"duration": "Durée",
"songCount": "Titres",
"playCount": "Nombre d'écoutes",
"name": "Nom",
"genre": "Genre",
"compilation": "Compilation",
"year": "Année",
"updatedAt": "Mis à jour le",
"comment": "Commentaire",
"rating": "Classement",
"createdAt": "Date d'ajout",
"size": "Taille",
"originalDate": "Original",
"releaseDate": "Sortie",
"releases": "Sortie |||| Sorties",
"released": "Sortie",
"recordLabel": "Label",
"catalogNum": "Numéro de catalogue",
"releaseType": "Type",
"grouping": "Regroupement",
"media": "Média",
"mood": "Humeur",
"date": "Date d'enregistrement",
"missing": "Manquant",
"libraryName": "Bibliothèque"
},
"actions": {
"playAll": "Lire",
"playNext": "Lire ensuite",
"addToQueue": "Ajouter à la file",
"shuffle": "Mélanger",
"addToPlaylist": "Ajouter à la playlist",
"download": "Télécharger",
"info": "Plus d'informations",
"share": "Partager"
},
"lists": {
"all": "Tous",
"random": "Aléatoire",
"recentlyAdded": "Récemment ajoutés",
"recentlyPlayed": "Récemment joués",
"mostPlayed": "Plus joués",
"starred": "Favoris",
"topRated": "Les mieux classés"
}
},
"artist": {
"name": "Artiste |||| Artistes",
"fields": {
"name": "Nom",
"albumCount": "Nombre d'albums",
"songCount": "Nombre de titres",
"playCount": "Lectures",
"rating": "Classement",
"genre": "Genre",
"size": "Taille",
"role": "Rôle",
"missing": "Manquant"
},
"roles": {
"albumartist": "Artiste de l'album |||| Artistes de l'album",
"artist": "Artiste |||| Artistes",
"composer": "Compositeur |||| Compositeurs",
"conductor": "Chef d'orchestre |||| Chefs d'orchestre",
"lyricist": "Parolier |||| Paroliers",
"arranger": "Arrangeur |||| Arrangeurs",
"producer": "Producteur |||| Producteurs",
"director": "Réalisateur |||| Réalisateurs",
"engineer": "Ingénieur |||| Ingénieurs",
"mixer": "Mixeur |||| Mixeurs",
"remixer": "Remixeur |||| Remixeurs",
"djmixer": "Mixeur DJ |||| Mixeurs DJ",
"performer": "Interprète |||| Interprètes",
"maincredit": "Artiste de l'album ou Artiste |||| Artistes de l'album ou Artistes"
},
"actions": {
"shuffle": "Lecture aléatoire",
"radio": "Radio",
"topSongs": "Meilleurs titres"
}
},
"user": {
"name": "Utilisateur |||| Utilisateurs",
"fields": {
"userName": "Nom d'utilisateur",
"isAdmin": "Administrateur",
"lastLoginAt": "Dernière connexion",
"updatedAt": "Dernière mise à jour",
"name": "Nom",
"password": "Mot de passe",
"createdAt": "Créé le",
"changePassword": "Changer le mot de passe ?",
"currentPassword": "Mot de passe actuel",
"newPassword": "Nouveau mot de passe",
"token": "Token",
"lastAccessAt": "Dernier accès",
"libraries": "Bibliothèques"
},
"helperTexts": {
"name": "Les changements liés à votre nom ne seront reflétés qu'à la prochaine connexion",
"libraries": "Sélectionner une bibliothèque pour cet utilisateur ou laisser vide pour utiliser la bibliothèque par défaut"
},
"notifications": {
"created": "Utilisateur créé",
"updated": "Utilisateur mis à jour",
"deleted": "Utilisateur supprimé"
},
"message": {
"listenBrainzToken": "Entrez votre token ListenBrainz.",
"clickHereForToken": "Cliquez ici pour recevoir votre token",
"selectAllLibraries": "Sélectionner toutes les bibliothèques",
"adminAutoLibraries": "Les utilisateurs admin ont automatiquement accès à l'ensemble des bibliothèques"
},
"validation": {
"librariesRequired": "Au moins une bibliothèque doit être sélectionnée pour les utilisateurs non administrateurs"
}
},
"player": {
"name": "Lecteur |||| Lecteurs",
"fields": {
"name": "Nom",
"transcodingId": "Transcodage",
"maxBitRate": "Bitrate maximum",
"client": "Client",
"userName": "Nom d'utilisateur",
"lastSeen": "Vu pour la dernière fois",
"reportRealPath": "Rapporter le chemin d'accès absolu",
"scrobbleEnabled": "Scrobbler vers des services externes"
}
},
"transcoding": {
"name": "Conversion |||| Conversions",
"fields": {
"name": "Nom",
"targetFormat": "Format",
"defaultBitRate": "Bitrate par défaut",
"command": "Commande"
}
},
"playlist": {
"name": "Playlist |||| Playlists",
"fields": {
"name": "Nom",
"duration": "Durée",
"ownerName": "Propriétaire",
"public": "Publique",
"updatedAt": "Mise à jour le",
"createdAt": "Créée le",
"songCount": "Morceaux",
"comment": "Commentaire",
"sync": "Import automatique",
"path": "Importer depuis"
},
"actions": {
"selectPlaylist": "Sélectionner une playlist :",
"addNewPlaylist": "Créer \"%{name}\"",
"export": "Exporter",
"makePublic": "Rendre publique",
"makePrivate": "Rendre privée",
"saveQueue": "Sauvegarder la file de lecture dans la playlist",
"searchOrCreate": "Chercher ou créer une nouvelle playlist...",
"pressEnterToCreate": "Appuyer sur entrée pour créer une nouvelle playlist",
"removeFromSelection": "Supprimer de la sélection"
},
"message": {
"duplicate_song": "Ajouter les titres déjà présents dans la playlist",
"song_exist": "Certains des titres sélectionnés font déjà partie de la playlist. Voulez-vous les ajouter ou les ignorer ?",
"noPlaylistsFound": "Aucune playlist trouvée",
"noPlaylists": "Aucune playlist disponible"
}
},
"radio": {
"name": "Radio |||| Radios",
"fields": {
"name": "Nom",
"streamUrl": "Lien du stream",
"homePageUrl": "Lien de la page d'accueil",
"updatedAt": "Mise à jour le",
"createdAt": "Créée le"
},
"actions": {
"playNow": "Jouer"
}
},
"share": {
"name": "Partage |||| Partages",
"fields": {
"username": "Partagé(e) par",
"url": "Lien URL",
"description": "Description",
"contents": "Contenu",
"expiresAt": "Expire le",
"lastVisitedAt": "Visité pour la dernière fois",
"visitCount": "Nombre de visites",
"format": "Format",
"maxBitRate": "Bitrate maximum",
"updatedAt": "Mis à jour le",
"createdAt": "Créé le",
"downloadable": "Autoriser les téléchargements ?"
}
},
"missing": {
"name": "Fichier manquant|||| Fichiers manquants",
"fields": {
"path": "Chemin d'accès",
"size": "Taille",
"updatedAt": "A disparu le",
"libraryName": "Bibliothèque"
},
"actions": {
"remove": "Supprimer",
"remove_all": "Tout supprimer"
},
"notifications": {
"removed": "Fichier(s) manquant(s) supprimé(s)"
},
"empty": "Aucun fichier manquant"
},
"library": {
"name": "Bibliothèque |||| Bibliothèques",
"fields": {
"name": "Nom",
"path": "Chemin d'accès",
"remotePath": "Chemin d'accès distant",
"lastScanAt": "Dernier scan",
"songCount": "Titres",
"albumCount": "Albums",
"artistCount": "Artistes",
"totalSongs": "Titres",
"totalAlbums": "Albums",
"totalArtists": "Artistes",
"totalFolders": "Dossiers",
"totalFiles": "Fichiers",
"totalMissingFiles": "Fichiers manquants",
"totalSize": "Taille totale",
"totalDuration": "Durée",
"defaultNewUsers": "Défaut pour les nouveaux utilisateurs",
"createdAt": "Crée",
"updatedAt": "Mise à jour"
},
"sections": {
"basic": "Informations",
"statistics": "Statistiques"
},
"actions": {
"scan": "Scanner la bibliothèque",
"manageUsers": "Gérer les accès utilisateurs",
"viewDetails": "Voir les détails",
"quickScan": "Scan Rapide",
"fullScan": "Scan Complet"
},
"notifications": {
"created": "Bibliothèque créée avec succès",
"updated": "Bibliothèque mise à jour avec succès",
"deleted": "Bibliothèque supprimée avec succès",
"scanStarted": "Le scan de la bibliothèque a commencé",
"scanCompleted": "Le scan de la bibliothèque est terminé",
"quickScanStarted": "Scan rapide démarré",
"fullScanStarted": "Scan complet démarré",
"scanError": "Une erreur est survenue en démarrant le scan. Veuillez regarder les logs"
},
"validation": {
"nameRequired": "La bibliothèque doit obligatoirement avoir un nom",
"pathRequired": "La bibliothèque doit obligatoirement avoir un chemin d'accès",
"pathNotDirectory": "Le chemin d'accès de la bibliothèque doit pointer sur un dossier",
"pathNotFound": "Impossible de trouver ce chemin d'accès",
"pathNotAccessible": "Impossible d'accéder à ce chemin d'accès",
"pathInvalid": "Ce chemin d'accès n'est pas valide"
},
"messages": {
"deleteConfirm": "Êtes-vous sûr(e) de vouloir supprimer cette bibliothèque ? Cela supprimera toutes les données associées ainsi que les accès utilisateurs.",
"scanInProgress": "Scan en cours...",
"noLibrariesAssigned": "Aucune bibliothèque pour cet utilisateur"
}
},
"plugin": {
"name": "Extension |||| Extensions",
"fields": {
"id": "ID",
"name": "Nom",
"description": "Description",
"version": "Version",
"author": "Auteur.e",
"website": "Site web",
"permissions": "Permissions",
"enabled": "Activée",
"status": "Statut",
"path": "Chemin",
"lastError": "Erreur",
"hasError": "Erreur",
"updatedAt": "Mise à jour",
"createdAt": "Installée",
"configKey": "Clef",
"configValue": "Valeur",
"allUsers": "Autoriser tous les utilisateur·rices",
"selectedUsers": "Utilisateur·rices sélectionné.e.s",
"allLibraries": "Autoriser toutes les bibliothèques",
"selectedLibraries": "Bibliothèques sélectionnées",
"allowWriteAccess": ""
},
"sections": {
"status": "Statut",
"info": "Informations de l'extension",
"configuration": "Configuration",
"manifest": "Manifeste",
"usersPermission": "Permissions utilisateur·ices",
"libraryPermission": "Permissions des bibliothèques"
},
"status": {
"enabled": "Activées",
"disabled": "Désactivées"
},
"actions": {
"enable": "Activer",
"disable": "Désactiver",
"disabledDueToError": "L'erreur doit être réglée avant de pouvoir activer la bibliothèque",
"disabledUsersRequired": "Sélectionner des utilisateur·ices avant d'activer la bibliothèque",
"disabledLibrariesRequired": "Sélectionner au moins une bibliothèque",
"addConfig": "Ajouter une configuration",
"rescan": "Rescanner"
},
"notifications": {
"enabled": "Extension activée",
"disabled": "Extension désactivée",
"updated": "Extension mise à jour",
"error": "Erreur pendant la mise à jour de l'extension"
},
"validation": {
"invalidJson": "La configuration doit être un JSON valide"
},
"messages": {
"configHelp": "Configurer l'extension en utilisant des paires clef/valeurs. Laisser vide si l'extension ne requiert aucune configuration.",
"clickPermissions": "Cliquer sur une permission pour plus de détails",
"noConfig": "Aucune configuration",
"allUsersHelp": "Quand sélectionnée, l'extension aura accès à l'ensemble des utilisateur·rices, y compris ceux créé.e.s dans le future.",
"noUsers": "Aucun.e utilisateur·rice sélectionné.e",
"permissionReason": "Raison",
"usersRequired": "Cette extension nécessite un accès aux informations utilisateurs. Sélectionnez les utilisateur·rices autorisé.e.s ou sélectionnez 'Tout autoriser'.",
"allLibrariesHelp": "Quand sélectionnée, cette extension aura accès à l'ensemble des bibliothèques, y compris celles créées dans le futur.",
"noLibraries": "Aucune bibliothèque sélectionnée",
"librariesRequired": "Cette extension nécessite l'accès aux information de la bibliothèque. Sélectionnez à quelles bibliothèque cette extension a accès, ou sélectionnez 'Autoriser toutes les bibliothèques'.",
"requiredHosts": "Hôtes requis",
"configValidationError": "Erreur lors de la validation de la configuration",
"schemaRenderError": "Impossible de processer la configuration. Le schéma de l'extension n'est peut-être pas valide.",
"allowWriteAccessHelp": ""
},
"placeholders": {
"configKey": "clef",
"configValue": "valeur"
}
}
},
"ra": {
"auth": {
"welcome1": "Merci d'avoir installé Navidrome !",
"welcome2": "Pour commencer, créez un compte administrateur",
"confirmPassword": "Confirmez votre mot de passe",
"buttonCreateAdmin": "Créer un compte administrateur",
"auth_check_error": "Merci de vous connecter pour continuer",
"user_menu": "Profil",
"username": "Identifiant",
"password": "Mot de passe",
"sign_in": "Connexion",
"sign_in_error": "Échec de l'authentification, merci de réessayer",
"logout": "Déconnexion",
"insightsCollectionNote": "Navidrome collecte des données de façon anonyme\nafin d'améliorer le projet. Cliquez [ici] pour en savoir\nplus ou pour désactiver la télémétrie"
},
"validation": {
"invalidChars": "Merci de n'utiliser que des chiffres et des lettres",
"passwordDoesNotMatch": "Les mots de passe ne correspondent pas",
"required": "Ce champ est requis",
"minLength": "Minimum %{min} caractères",
"maxLength": "Maximum %{max} caractères",
"minValue": "Minimum %{min}",
"maxValue": "Maximum %{max}",
"number": "Doit être un nombre",
"email": "Doit être un e-mail",
"oneOf": "Doit être au choix : %{options}",
"regex": "Doit respecter un format spécifique (regexp) : %{pattern}",
"unique": "Doit être unique",
"url": "Doit être un lien URL correct"
},
"action": {
"add_filter": "Ajouter un filtre",
"add": "Ajouter",
"back": "Retour",
"bulk_actions": "%{smart_count} sélectionné |||| %{smart_count} sélectionnés",
"cancel": "Annuler",
"clear_input_value": "Vider le champ",
"clone": "Dupliquer",
"confirm": "Confirmer",
"create": "Créer",
"delete": "Supprimer",
"edit": "Éditer",
"export": "Exporter",
"list": "Liste",
"refresh": "Actualiser",
"remove_filter": "Supprimer ce filtre",
"remove": "Supprimer",
"save": "Enregistrer",
"search": "Rechercher",
"show": "Afficher",
"sort": "Trier",
"undo": "Annuler",
"expand": "Étendre",
"close": "Fermer",
"open_menu": "Ouvrir le menu",
"close_menu": "Fermer le menu",
"unselect": "Désélectionner",
"skip": "Ignorer",
"bulk_actions_mobile": "1 |||| %{smart_count}",
"share": "Partager",
"download": "Télécharger"
},
"boolean": {
"true": "Oui",
"false": "Non"
},
"page": {
"create": "Créer %{name}",
"dashboard": "Tableau de bord",
"edit": "%{name} #%{id}",
"error": "Un problème est survenu",
"list": "%{name}",
"loading": "Chargement",
"not_found": "Introuvable",
"show": "%{name} #%{id}",
"empty": "Pas encore de %{name}.",
"invite": "Voulez-vous en créer un ?"
},
"input": {
"file": {
"upload_several": "Déposez les fichiers à téléverser, ou cliquez pour en sélectionner.",
"upload_single": "Déposez le fichier à téléverser, ou cliquez pour le sélectionner."
},
"image": {
"upload_several": "Déposez les images à téléverser, ou cliquez pour en sélectionner.",
"upload_single": "Déposez l'image à téléverser, ou cliquez pour la sélectionner."
},
"references": {
"all_missing": "Impossible de trouver des données de références.",
"many_missing": "Au moins une des références associées semble ne plus être disponible.",
"single_missing": "La référence associée ne semble plus disponible."
},
"password": {
"toggle_visible": "Cacher le mot de passe",
"toggle_hidden": "Montrer le mot de passe"
}
},
"message": {
"about": "À propos de",
"are_you_sure": "Êtes-vous sûr(e) ?",
"bulk_delete_content": "Êtes-vous sûr(e) de vouloir supprimer cet élément ? |||| Êtes-vous sûr(e) de vouloir supprimer ces %{smart_count} éléments ?",
"bulk_delete_title": "Supprimer %{name} |||| Supprimer %{smart_count} %{name}",
"delete_content": "Êtes-vous sûr(e) de vouloir supprimer cet élément ?",
"delete_title": "Supprimer %{name} #%{id}",
"details": "Détails",
"error": "En raison d'une erreur côté navigateur, votre requête n'a pas pu aboutir.",
"invalid_form": "Le formulaire n'est pas valide.",
"loading": "La page est en cours de chargement, merci de bien vouloir patienter.",
"no": "Non",
"not_found": "L'URL saisie est incorrecte, ou vous avez suivi un mauvais lien.",
"yes": "Oui",
"unsaved_changes": "Certains changements n'ont pas été enregistrés. Êtes-vous sûr(e) de vouloir quitter cette page ?"
},
"navigation": {
"no_results": "Aucun résultat",
"no_more_results": "La page numéro %{page} est en dehors des limites. Essayez la page précédente.",
"page_out_of_boundaries": "La page %{page} est en dehors des limites",
"page_out_from_end": "Fin de la pagination",
"page_out_from_begin": "La page doit être supérieure à 1",
"page_range_info": "%{offsetBegin}-%{offsetEnd} sur %{total}",
"page_rows_per_page": "Lignes par page :",
"next": "Suivant",
"prev": "Précédent",
"skip_nav": "Avancer au contenu"
},
"notification": {
"updated": "Élément mis à jour |||| %{smart_count} éléments mis à jour",
"created": "Élément créé",
"deleted": "Élément supprimé |||| %{smart_count} éléments supprimés",
"bad_item": "Élément inconnu",
"item_doesnt_exist": "L'élément n'existe pas",
"http_error": "Erreur de communication avec le serveur",
"data_provider_error": "Erreur dans le fournisseur de données. Plus de détails dans la console.",
"i18n_error": "Erreur de chargement des traductions pour la langue sélectionnée",
"canceled": "Action annulée",
"logged_out": "Votre session a pris fin, veuillez vous reconnecter.",
"new_version": "Nouvelle version disponible ! Veuillez rafraîchir la page."
},
"toggleFieldsMenu": {
"columnsToDisplay": "Colonnes à afficher",
"layout": "Mise en page",
"grid": "Grille",
"table": "Table"
}
},
"message": {
"note": "NOTE",
"transcodingDisabled": "Le changement de paramètres depuis l'interface web est désactivé pour des raisons de sécurité. Pour changer (éditer ou supprimer) les options de transcodage, relancer le serveur avec l'option %{config} activée.",
"transcodingEnabled": "Navidrome fonctionne actuellement avec %{config}, rendant possible lexécution de commandes arbitraires depuis l'interface web. Il est recommandé d'activer cette fonctionnalité uniquement lors de la configuration du transcodage.",
"songsAddedToPlaylist": "1 titre a été ajouté à la playlist |||| %{smart_count} titres ont été ajoutés à la playlist",
"noPlaylistsAvailable": "Aucune playlist",
"delete_user_title": "Supprimer l'utilisateur '%{name}'",
"delete_user_content": "Êtes-vous sûr(e) de vouloir supprimer cet utilisateur et ses données associées (y compris ses playlists et préférences) ?",
"notifications_blocked": "Votre navigateur bloque les notifications de ce site",
"notifications_not_available": "Votre navigateur ne permet pas d'afficher les notifications sur le bureau ou vous n'accédez pas à Navidrome via HTTPS",
"lastfmLinkSuccess": "Last.fm a été correctement relié et le scrobble a été activé",
"lastfmLinkFailure": "Last.fm n'a pas pu être correctement relié",
"lastfmUnlinkSuccess": "Last.fm n'est plus relié et le scrobble a été désactivé",
"lastfmUnlinkFailure": "Erreur pendant la suppression du lien avec Last.fm",
"openIn": {
"lastfm": "Ouvrir dans Last.fm",
"musicbrainz": "Ouvrir dans MusicBrainz"
},
"lastfmLink": "Lire plus...",
"listenBrainzLinkSuccess": "La liaison et le scrobble avec ListenBrainz sont maintenant activés pour l'utilisateur : %{user}",
"listenBrainzLinkFailure": "Échec lors de la liaison avec ListenBrainz : %{error}",
"listenBrainzUnlinkSuccess": "La liaison et le scrobble avec ListenBrainz sont maintenant désactivés",
"listenBrainzUnlinkFailure": "Échec lors de la désactivation de la liaison avec ListenBrainz",
"downloadOriginalFormat": "Télécharger au format original",
"shareOriginalFormat": "Partager avec le format original",
"shareDialogTitle": "Partager %{resource} '%{name}'",
"shareBatchDialogTitle": "Partager 1 %{resource} |||| Partager %{smart_count} %{resource}",
"shareSuccess": "Lien copié vers le presse-papier : %{url}",
"shareFailure": "Erreur en copiant le lien %{url} vers le presse-papier",
"downloadDialogTitle": "Télécharger %{resource} '%{name}' (%{size})",
"shareCopyToClipboard": "Copier vers le presse-papier : Ctrl+C, Enter",
"remove_missing_title": "Supprimer les fichiers manquants",
"remove_missing_content": "Êtes-vous sûr(e) de vouloir supprimer les fichiers manquants sélectionnés de la base de données ? Ceci supprimera définitivement toute référence à ceux-ci, y compris leurs nombres d'écoutes et leurs notations",
"remove_all_missing_title": "Supprimer tous les fichiers manquants",
"remove_all_missing_content": "Êtes-vous sûr(e) de vouloir supprimer tous les fichiers manquants de la base de données ? Cette action est permanente et supprimera leurs nombres d'écoutes, leur notations et tout ce qui y fait référence.",
"noSimilarSongsFound": "Aucun titre similaire n'a été trouvé",
"noTopSongsFound": "Aucun meilleur titre n'a été trouvé",
"startingInstantMix": "Chargement du mix instantanné..."
},
"menu": {
"library": "Bibliothèque",
"settings": "Paramètres",
"version": "Version",
"theme": "Thème",
"personal": {
"name": "Paramètres personnels",
"options": {
"theme": "Thème",
"language": "Langue",
"defaultView": "Vue par défaut",
"desktop_notifications": "Notifications de bureau",
"lastfmScrobbling": "Scrobbler vers Last.fm",
"listenBrainzScrobbling": "Scrobbler vers ListenBrainz",
"replaygain": "Mode ReplayGain",
"preAmp": "Pré-amplification ReplayGain (dB)",
"gain": {
"none": "Désactivé",
"album": "Utiliser le gain de l'album",
"track": "Utiliser le gain des titres"
},
"lastfmNotConfigured": "La clef API de Last.fm n'est pas configurée"
}
},
"albumList": "Albums",
"about": "À propos",
"playlists": "Playlists",
"sharedPlaylists": "Playlists partagées",
"librarySelector": {
"allLibraries": "Toutes les bibliothèques (%{count})",
"multipleLibraries": "%{selected} bibliothèque(s) sélectionnée(s) sur %{total}",
"selectLibraries": "Sélectionner les bibliothèques",
"none": "Aucune"
}
},
"player": {
"playListsText": "File de lecture",
"openText": "Ouvrir",
"closeText": "Fermer",
"notContentText": "Absence de musique",
"clickToPlayText": "Cliquer pour lire",
"clickToPauseText": "Cliquer pour mettre en pause",
"nextTrackText": "Morceau suivant",
"previousTrackText": "Morceau précédent",
"reloadText": "Recharger",
"volumeText": "Volume",
"toggleLyricText": "Afficher/masquer les paroles",
"toggleMiniModeText": "Minimiser",
"destroyText": "Détruire",
"downloadText": "Télécharger",
"removeAudioListsText": "Vider la liste de lecture",
"clickToDeleteText": "Cliquer pour supprimer %{name}",
"emptyLyricText": "Absence de paroles",
"playModeText": {
"order": "Ordonner",
"orderLoop": "Tout répéter",
"singleLoop": "Répéter",
"shufflePlay": "Aléatoire"
}
},
"about": {
"links": {
"homepage": "Page d'accueil",
"source": "Code source",
"featureRequests": "Demande de fonctionnalités",
"lastInsightsCollection": "Dernière collection des données",
"insights": {
"disabled": "Désactivée",
"waiting": "En attente"
}
},
"tabs": {
"about": "À propos",
"config": "Paramètres"
},
"config": {
"configName": "Nom de la configuration",
"environmentVariable": "Variable d'environnement",
"currentValue": "Valeur actuelle",
"configurationFile": "Fichier de configuration",
"exportToml": "Exporter la configuration (TOML)",
"exportSuccess": "La configuration a été copiée vers le presse-papier au format TOML",
"exportFailed": "Une erreur est survenue en copiant la configuration",
"devFlagsHeader": "Options de développement (peuvent être amenés à changer / être supprimés)",
"devFlagsComment": "Ces paramètres sont expérimentaux et peuvent être amenés à changer dans le futur",
"downloadToml": "Télécharger la configuration (TOML)"
}
},
"activity": {
"title": "Activité",
"totalScanned": "Nombre total de dossiers scannés",
"quickScan": "Scan rapide",
"fullScan": "Scan complet",
"serverUptime": "Disponibilité du serveur",
"serverDown": "HORS LIGNE",
"scanType": "Type",
"status": "Erreur de scan",
"elapsedTime": "Temps écoulé",
"selectiveScan": "Sélectif"
},
"help": {
"title": "Raccourcis Navidrome",
"hotkeys": {
"show_help": "Montrer cette fenêtre d'aide",
"toggle_menu": "Afficher/Cacher le menu latéral",
"toggle_play": "Lecture/Pause",
"prev_song": "Morceau précédent",
"next_song": "Morceau suivant",
"vol_up": "Augmenter le volume",
"vol_down": "Baisser le volume",
"toggle_love": "Ajouter/Enlever le morceau des favoris",
"current_song": "Aller au titre en cours"
}
},
"nowPlaying": {
"title": "En cours de lecture",
"empty": "Aucun titre en cours de lecture",
"minutesAgo": "Il y a %{smart_count} minute |||| Il y a %{smart_count} minutes"
}
}