export const frTranslation = {
  sidebar: {
    library: 'Bibliothèque',
    mainstage: 'Scène principale',
    newReleases: 'Nouveautés',
    allAlbums: 'Tous les albums',
    randomAlbums: 'Albums aléatoires',
    randomPicker: 'Créer un mix',
    artists: 'Artistes',
    composers: 'Compositeurs',
    randomMix: 'Mix aléatoire',
    favorites: 'Favoris',
    nowPlaying: 'En cours',
    system: 'Système',
    statistics: 'Statistiques',
    settings: 'Paramètres',
    help: 'Aide',
    expand: 'Développer la barre latérale',
    collapse: 'Réduire la barre latérale',
    downloadingTracks: '{{n}} pistes en cache…',
    syncingTracks: 'Synchro {{done}}/{{total}}…',
    cancelDownload: 'Annuler le téléchargement',
    offlineLibrary: 'Bibliothèque hors ligne',
    genres: 'Genres',
    tracks: 'Titres',
    playlists: 'Playlists',
    mostPlayed: 'Les plus joués',
    losslessAlbums: 'Lossless',
    radio: 'Radio Internet',
    folderBrowser: 'Explorateur de dossiers',
    deviceSync: 'Sync appareil',
    libraryScope: 'Portée de la bibliothèque',
    allLibraries: 'Toutes les bibliothèques',
    expandPlaylists: 'Développer les playlists',
    collapsePlaylists: 'Réduire les playlists',
    more: 'Plus',
    feelingLucky: 'Mix Chance',
  },
  home: {
    hero: 'En vedette',
    starred: 'Favoris personnels',
    recent: 'Ajoutés récemment',
    mostPlayed: 'Les plus écoutés',
    recentlyPlayed: 'Récemment écoutés',
    losslessAlbums: 'Albums lossless',
    discover: 'Découvrir',
    discoverSongs: 'Découvrir des titres',
    loadMore: 'Charger plus',
    discoverMore: 'Découvrir plus',
    discoverArtists: 'Découvrir des artistes',
    discoverArtistsMore: 'Tous les artistes',
    becauseYouLike: 'Parce que tu as écouté…',
    becauseYouLikeFor: 'Parce que tu as écouté {{artist}}',
    similarTo: 'Similaire à {{artist}}',
    becauseYouLikeTracks_one: '{{count}} titre',
    becauseYouLikeTracks_other: '{{count}} titres'
  },
  hero: {
    eyebrow: 'Album en vedette',
    playAlbum: 'Lire l\'album',
    enqueue: 'Mettre en file',
    enqueueTooltip: 'Ajouter l\'album entier à la file d\'attente',
  },
  search: {
    placeholder: 'Rechercher un artiste, album ou morceau…',
    noResults: 'Aucun résultat pour « {{query}} »',
    artists: 'Artistes',
    albums: 'Albums',
    songs: 'Morceaux',
    clearLabel: 'Effacer la recherche',
    addedToQueueToast: '« {{title}} » ajouté à la file',
    title: 'Recherche',
    resultsFor: 'Résultats pour « {{query}} »',
    album: 'Album',
    advanced: 'Recherche avancée',
    advancedSearchTerm: 'Terme de recherche',
    advancedSearchPlaceholder: 'Titre, album, artiste…',
    advancedGenre: 'Genre',
    advancedAllGenres: 'Tous les genres',
    advancedYear: 'Année',
    advancedYearFrom: 'de',
    advancedYearTo: 'à',
    advancedAll: 'Tous',
    advancedSearch: 'Rechercher',
    advancedEmpty: 'Entrez un terme de recherche ou sélectionnez un filtre.',
    advancedNoResults: 'Aucun résultat trouvé.',
    advancedGenreNote: 'Les morceaux sont sélectionnés aléatoirement dans ce genre.',
    recentSearches: 'Recherches récentes',
    browse: 'Parcourir',
    emptyHint: 'Que veux-tu écouter ?',
    genres: 'Genres',
  },
  nowPlaying: {
    tooltip: 'Qui écoute ?',
    title: 'Qui écoute ?',
    loading: 'Chargement…',
    nobody: 'Personne n\'écoute en ce moment.',
    minutesAgo: 'il y a {{n}} min',
    nothingPlaying: 'Rien en cours. Lancez un morceau !',
    aboutArtist: "À propos de l'artiste",
    fromAlbum: 'De cet album',
    viewAlbum: "Voir l'album",
    goToArtist: "Aller à l'artiste",
    readMore: 'Lire la suite',
    showLess: 'Réduire',
    genreInfo: 'Genre',
    trackInfo: 'Infos piste',
    topSongs: 'Le plus joué de cet artiste',
    topSongsCredit: 'Top titres de {{name}}',
    trackPosition: 'Piste {{pos}}',
    playsCount_one: '{{count}} écoute',
    playsCount_other: '{{count}} écoutes',
    releasedYearsAgo_one: 'il y a {{count}} an',
    releasedYearsAgo_other: 'il y a {{count}} ans',
    discography: 'Discographie',
    lastfmStats: 'Statistiques Last.fm',
    thisTrack: 'Ce titre',
    thisArtist: 'Cet artiste',
    listeners: 'auditeurs',
    scrobbles: 'scrobbles',
    yourScrobbles: 'par vous',
    listenersN: '{{n}} auditeurs',
    scrobblesN: '{{n}} scrobbles',
    playsByYouN: 'écouté {{n}}× par vous',
    openTrackOnLastfm: 'Titre sur Last.fm',
    openArtistOnLastfm: 'Artiste sur Last.fm',
    rgTrackTooltip: 'ReplayGain (piste)',
    rgAlbumTooltip: 'ReplayGain (album)',
    rgAutoTooltip: 'ReplayGain (auto)',
    showMoreTracks: 'Afficher {{count}} de plus',
    showLessTracks: 'Réduire',
    hideCard: 'Masquer la carte',
    layoutMenu: 'Disposition',
    visibleCards: 'Cartes visibles',
    hiddenCards: 'Cartes masquées',
    noHiddenCards: 'Aucune carte masquée',
    resetLayout: 'Réinitialiser la disposition',
    emptyColumn: 'Déposez des cartes ici',
  },
  contextMenu: {
    playNow: 'Lire maintenant',
    playNext: 'Lire ensuite',
    addToQueue: 'Ajouter à la file',
    enqueueAlbum: 'Mettre l\'album en file',
    enqueueAlbums_one: 'Mettre {{count}} album en file',
    enqueueAlbums_other: 'Mettre {{count}} albums en file',
    startRadio: 'Démarrer la radio',
    instantMix: 'Mix instantané',
    instantMixFailed: 'Impossible de créer le mix instantané — erreur serveur ou plugin.',
    cliMixNeedsTrack: 'Aucune lecture en cours — lancez d’abord la lecture, puis relancez la commande de mix.',
    lfmLove: 'Aimer sur Last.fm',
    lfmUnlove: 'Ne plus aimer sur Last.fm',
    favorite: 'Favori',
    favoriteArtist: 'Artiste favori',
    favoriteAlbum: 'Album favori',
    unfavorite: 'Retirer des favoris',
    unfavoriteArtist: 'Retirer l\'artiste des favoris',
    unfavoriteAlbum: 'Retirer l\'album des favoris',
    removeFromQueue: 'Retirer de la file',
    removeFromPlaylist: 'Retirer de la playlist',
    openAlbum: 'Ouvrir l\'album',
    goToArtist: 'Aller à l\'artiste',
    download: 'Télécharger (ZIP)',
    addToPlaylist: 'Ajouter à la playlist',
    selectedPlaylists: '{{count}} playlists sélectionnées',
    selectedAlbums: '{{count}} albums sélectionnés',
    selectedArtists: '{{count}} artistes sélectionnés',
    songInfo: 'Infos du morceau',
    shareLink: 'Copier le lien de partage',
    shareCopied: 'Lien de partage copié dans le presse-papiers.',
    shareCopyFailed: 'Impossible de copier dans le presse-papiers.',
  },
  sharePaste: {
    notLoggedIn: 'Connectez-vous et ajoutez le serveur avant de coller un lien de partage.',
    noMatchingServer: 'Aucun serveur enregistré ne correspond à ce lien. Ajoutez un serveur avec cette adresse : {{url}}',
    trackUnavailable: 'Ce morceau est introuvable sur le serveur.',
    albumUnavailable: 'Cet album est introuvable sur le serveur.',
    artistUnavailable: 'Cet artiste est introuvable sur le serveur.',
    composerUnavailable: 'Ce compositeur est introuvable sur le serveur.',
    openedTrack: 'Lecture du morceau partagé.',
    openedAlbum: 'Ouverture de l’album partagé.',
    openedArtist: 'Ouverture de l’artiste partagé.',
    openedComposer: 'Ouverture du compositeur partagé.',
    openedQueue_one: 'Lecture de {{count}} morceau depuis le lien de partage.',
    openedQueue_other: 'Lecture de {{count}} morceaux depuis le lien de partage.',
    openedQueuePartial:
      '{{played}} sur {{total}} morceaux du lien : {{skipped}} introuvable(s) sur ce serveur.',
    queueAllUnavailable: 'Aucun morceau de ce lien n’a été trouvé sur le serveur.',
    genericError: 'Impossible d’ouvrir le lien de partage.',
  },
  albumDetail: {
    back: 'Retour',
    orbitDoubleClickHint: 'Double-clic pour ajouter ce morceau à la file Orbit',
    playAll: 'Tout lire',
    shareAlbum: 'Partager l\'album',
    enqueue: 'Mettre en file',
    enqueueTooltip: 'Ajouter l\'album entier à la file d\'attente',
    artistBio: 'Biographie',
    download: 'Télécharger (ZIP)',
    downloading: 'Chargement…',
    cacheOffline: 'Rendre disponible hors ligne',
    offlineCached: 'Disponible hors ligne',
    offlineDownloading: 'Mise en cache… ({{n}}/{{total}})',
    removeOffline: 'Supprimer le cache hors ligne',
    offlineStorageFull: 'Stockage hors ligne plein (limite : {{mb}} Mo). Supprimez un album de votre bibliothèque hors ligne ou augmentez la limite dans les paramètres.',
    offlineStorageGoToSettings: 'Paramètres',
    offlineStorageGoToLibrary: 'Bibliothèque hors ligne',
    favoriteAdd: 'Ajouter aux favoris',
    favoriteRemove: 'Retirer des favoris',
    favorite: 'Favori',
    noBio: 'Aucune biographie disponible.',
    moreByArtist: 'Plus de {{artist}}',
    tracksCount: '{{n}} pistes',
    goToArtist: 'Aller à {{artist}}',
    moreLabelAlbums: 'Plus d\'albums sur {{label}}',
    trackTitle: 'Titre',
    trackAlbum: 'Album',
    trackArtist: 'Artiste',
    trackGenre: 'Genre',
    trackFormat: 'Format',
    trackFavorite: 'Favori',
    trackRating: 'Note',
    trackDuration: 'Durée',
    trackTotal: 'Total',
    columns: 'Colonnes',
    resetColumns: 'Réinitialiser',
    notFound: 'Album introuvable.',
    bioModal: 'Biographie de l\'artiste',
    bioClose: 'Fermer',
    ratingLabel: 'Note',
    enlargeCover: 'Agrandir',
    filterSongs: 'Filtrer…',
    sortNatural: 'Naturel',
    sortByTitle: 'A–Z (Titre)',
    sortByArtist: 'A–Z (Artiste)',
    sortByAlbum: 'A–Z (Album)',
  },
  entityRating: {
    albumShort: 'Note de l’album',
    artistShort: 'Note de l’artiste',
    albumAriaLabel: 'Note de l’album',
    artistAriaLabel: 'Note de l’artiste',
    selectedArtistsRatingAriaLabel: 'Note sur {{count}} artistes sélectionnés',
    selectedAlbumsRatingAriaLabel: 'Note sur {{count}} albums sélectionnés',
    saveFailed: 'Impossible d’enregistrer la note.',
  },
  artistDetail: {
    back: 'Retour',
    albums: 'Albums',
    album: 'Album',
    playAll: 'Tout lire',
    shareArtist: 'Partager l\'artiste',
    shuffle: 'Aléatoire',
    radio: 'Radio',
    loading: 'Chargement…',
    noRadio: 'Aucun morceau similaire trouvé pour cet artiste.',
    notFound: 'Artiste introuvable.',
    albumsBy: 'Albums de {{name}}',
    topTracks: 'Morceaux populaires',
    noAlbums: 'Aucun album trouvé.',
    trackTitle: 'Titre',
    trackAlbum: 'Album',
    trackDuration: 'Durée',
    favoriteAdd: 'Ajouter aux favoris',
    favoriteRemove: 'Retirer des favoris',
    favorite: 'Favori',
    albumCount_one: '{{count}} album',
    albumCount_other: '{{count}} albums',
    openedInBrowser: 'Ouvert dans le navigateur',
    featuredOn: 'Également sur',
    similarArtists: 'Artistes similaires',
    cacheOffline: 'Enregistrer la discographie hors ligne',
    offlineCached: 'Discographie en cache',
    offlineDownloading: 'En cache… ({{done}}/{{total}} albums)',
    uploadImage: "Téléverser l'image de l'artiste",
    uploadImageError: "Échec du téléversement de l'image",
    releaseTypes: {
      album: 'Album',
      ep: 'EP',
      single: 'Single',
      compilation: 'Compilation',
      live: 'Live',
      soundtrack: 'Bande originale',
      remix: 'Remix',
      other: 'Autre',
    },
  },
  favorites: {
    title: 'Favoris',
    empty: 'Vous n\'avez pas encore de favoris.',
    artists: 'Artistes',
    albums: 'Albums',
    songs: 'Morceaux',
    enqueueAll: 'Tout ajouter à la file',
    playAll: 'Tout lire',
    removeSong: 'Retirer des favoris',
    stations: 'Stations de radio',
    showingFiltered: 'Affichage de {{filtered}} sur {{total}} ({{artist}})',
    showingCount: 'Affichage de {{filtered}} sur {{total}}',
    clearArtistFilter: 'Effacer le filtre artiste',
    noFilterResults: 'Aucun résultat avec les filtres sélectionnés.',
    allArtists: 'Tous les artistes',
    topArtists: 'Artistes favoris principaux',
    topArtistsSongCount_one: '{{count}} morceau',
    topArtistsSongCount_other: '{{count}} morceaux',
  },
  randomLanding: {
    title: 'Créer un mix',
    mixByTracks: 'Mix par pistes',
    mixByTracksDesc: 'Sélection aléatoire de titres depuis toute votre médiathèque',
    mixByAlbums: 'Mix par albums',
    mixByAlbumsDesc: 'Albums aléatoires pour vos prochaines découvertes',
    mixByLucky: 'Mix Chance',
    mixByLuckyDesc: 'Instant Mix intelligent basé sur artistes, albums et notes élevées',
  },
  randomAlbums: {
    title: 'Albums aléatoires',
    refresh: 'Actualiser',
  },
  genres: {
    title: 'Genres',
    genreCount: 'genres',
    albumCount_one: '{{count}} album',
    albumCount_other: '{{count}} albums',
    loading: 'Chargement des genres…',
    empty: 'Aucun genre trouvé.',
    albumsLoading: 'Chargement des albums…',
    albumsEmpty: 'Aucun album trouvé pour ce genre.',
    loadMore: 'Charger plus',
    back: 'Retour',
  },
  randomMix: {
    title: 'Mix aléatoire',
    remix: 'Remixer',
    remixTooltip: 'Charger de nouveaux morceaux aléatoires',
    remixGenre: 'Remixer {{genre}}',
    remixTooltipGenre: 'Charger de nouveaux morceaux {{genre}}',
    playAll: 'Tout lire',
    trackTitle: 'Titre',
    trackArtist: 'Artiste',
    trackAlbum: 'Album',
    trackFavorite: 'Favori',
    trackDuration: 'Durée',
    favoriteAdd: 'Ajouter aux favoris',
    favoriteRemove: 'Retirer des favoris',
    play: 'Lire',
    trackGenre: 'Genre',
    mixSettingsHeader: 'Réglages du mix',
    exclusionsHeader: 'Exclusions',
    filterPanelInexactSizeNote: 'La taille du mix est une cible — les grandes requêtes peuvent renvoyer moins de morceaux uniques si le pool aléatoire du serveur s\'épuise.',
    mixSize: 'Taille de liste',
    excludeAudiobooks: 'Exclure les livres audio et pièces radiophoniques',
    excludeAudiobooksDesc: 'Correspond aux mots-clés dans le genre, le titre, l\'album et l\'artiste — ex. Hörbuch, Audiobook, Spoken Word, …',
    genreBlocked: 'Mot-clé bloqué',
    genreAddedToBlacklist: 'Ajouté à la liste de filtres',
    genreAlreadyBlocked: 'Déjà bloqué',
    artistBlocked: 'Artiste bloqué',
    artistAddedToBlacklist: 'Artiste ajouté à la liste de filtres',
    artistClickHint: 'Cliquer pour bloquer cet artiste',
    blacklistToggle: 'Filtre par mot-clé',
    genreMixTitle: 'Mix par genre',
    genreMixDesc: 'Top 20 genres par nombre de morceaux — cliquer pour un mix aléatoire',
    genreMixAll: 'Tous les morceaux',
    genreMixLoadMore: 'Charger 10 de plus',
    genreMixNoGenres: 'Aucun genre trouvé sur le serveur.',
    shuffleGenres: 'Afficher d\'autres genres',
    filterPanelTitle: 'Filtres',
    filterPanelDesc: 'Cliquez sur un tag de genre ou un nom d\'artiste dans la liste pour l\'exclure des futurs mix.',
    genreClickHint: 'Cliquez sur un tag de genre pour l\'ajouter\ncomme mot-clé de filtre.\nCorrespond au genre, titre, album et artiste.',
  },
  luckyMix: {
    done: 'Mix Chance prêt : {{count}} titres',
    failed: 'Impossible de créer le Mix Chance. Réessayez.',
    unavailable: 'Mix Chance n\'est pas disponible pour ce serveur.',
    cancelTooltip: 'Annuler la création du Mix Chance',
  },
  albums: {
    title: 'Tous les albums',
    sortByName: 'A–Z (Album)',
    sortByArtist: 'A–Z (Artiste)',
    sortNewest: 'Plus récents',
    sortRandom: 'Aléatoire',
    yearFrom: 'De',
    yearTo: 'À',
    yearFilterClear: 'Effacer le filtre année',
    yearFilterLabel: 'Année',
    compilationLabel: 'Compilations',
    compilationOnly: 'Uniquement compilations',
    compilationHide: 'Masquer compilations',
    compilationTooltipAll: 'Tous les albums · clic : uniquement compilations',
    compilationTooltipOnly: 'Uniquement compilations · clic : masquer compilations',
    compilationTooltipHide: 'Compilations masquées · clic : tout afficher',
    select: 'Sélection multiple',
    startSelect: 'Activer la sélection multiple',
    cancelSelect: 'Annuler',
    selectionCount: '{{count}} sélectionnés',
    downloadZips: 'Télécharger les ZIPs',
    addOffline: 'Ajouter hors ligne',
    enqueueSelected_one: 'Mettre en file ({{count}})',
    enqueueSelected_other: 'Mettre en file ({{count}})',
    enqueueQueued_one: '{{count}} album ajouté à la file',
    enqueueQueued_other: '{{count}} albums ajoutés à la file',
    downloadingZip: 'Téléchargement {{current}}/{{total}} : {{name}}',
    downloadZipDone: '{{count}} ZIP(s) téléchargé(s)',
    downloadZipFailed: 'Échec du téléchargement de {{name}}',
    offlineQueuing: 'Mise en file d\'attente de {{count}} album(s) hors ligne…',
    offlineFailed: 'Échec de l\'ajout de {{name}} hors ligne',
  },
  tracks: {
    title: 'Titres',
    subtitle: 'Parcourir. Chercher. Découvrir.',
    heroEyebrow: 'Titre du moment',
    heroReroll: 'En choisir un autre',
    playSong: 'Lire',
    enqueueSong: 'Ajouter à la file',
    railRandom: 'Sélection aléatoire',
    railHighlyRated: 'Mieux notés',
    browseTitle: 'Parcourir tous les titres',
    browseUnsupported: 'Ce serveur ne liste pas toute la bibliothèque d\'un coup. Utilisez la recherche ci-dessus pour trouver des titres précis.',
    searchPlaceholder: 'Chercher un titre par titre, artiste ou album…',
    count_one: '{{count}} titre',
    count_other: '{{count}} titres',
  },
  artists: {
    title: 'Artistes',
    search: 'Rechercher…',
    all: 'Tous',
    gridView: 'Vue en grille',
    listView: 'Vue en liste',
    imagesOn: 'Images d\'artistes activées — peut augmenter la charge réseau et système',
    imagesOff: 'Images d\'artistes désactivées — affichage des initiales uniquement',
    loadMore: 'Charger plus',
    notFound: 'Aucun artiste trouvé.',
    albumCount_one: '{{count}} album',
    albumCount_other: '{{count}} albums',
    selectionCount: '{{count}} sélectionnés',
    select: 'Sélection multiple',
    startSelect: 'Activer la sélection multiple',
    cancelSelect: 'Annuler',
    addToPlaylist: 'Ajouter à la playlist',
  },
  composers: {
    title: 'Compositeurs',
    search: 'Rechercher…',
    notFound: 'Aucun compositeur trouvé.',
    unsupported: 'La navigation par compositeur nécessite Navidrome 0.55 ou plus récent.',
    loadFailed: 'Impossible de charger les compositeurs.',
    retry: 'Réessayer',
    involvedIn_one: 'Présent sur {{count}} album',
    involvedIn_other: 'Présent sur {{count}} albums',
  },
  composerDetail: {
    back: 'Retour',
    notFound: 'Compositeur introuvable.',
    about: 'À propos de ce compositeur',
    works: 'Œuvres',
    noWorks: 'Aucune œuvre trouvée.',
    workCount_one: '{{count}} œuvre',
    workCount_other: '{{count}} œuvres',
    shareComposer: 'Partager le compositeur',
    unknownComposer: 'Compositeur',
  },
  login: {
    subtitle: 'Votre lecteur de bureau Navidrome',
    serverName: 'Nom du serveur (facultatif)',
    serverNamePlaceholder: 'Mon Navidrome',
    serverUrl: 'URL du serveur',
    serverUrlPlaceholder: '192.168.1.100:4533 ou https://music.exemple.com',
    username: 'Nom d\'utilisateur',
    usernamePlaceholder: 'admin',
    password: 'Mot de passe',
    showPassword: 'Afficher le mot de passe',
    hidePassword: 'Masquer le mot de passe',
    connect: 'Se connecter',
    connecting: 'Connexion…',
    connected: 'Connecté !',
    error: 'Connexion échouée — vérifiez vos informations.',
    urlRequired: 'Veuillez saisir une URL de serveur.',
    savedServers: 'Serveurs enregistrés',
    addNew: 'Ou ajouter un nouveau serveur',
    orMagicString: 'Ou chaîne magique',
    magicStringPlaceholder: 'Collez une chaîne de partage (psysonic1-…)',
    magicStringInvalid: 'Chaîne magique invalide ou illisible.',
  },
  connection: {
    connected: 'Connecté',
    connectedTo: 'Connecté à {{server}}',
    disconnected: 'Déconnecté',
    disconnectedFrom: 'Impossible d\'atteindre {{server}} — cliquez pour vérifier les paramètres',
    checking: 'Connexion…',
    extern: 'Externe',
    offlineTitle: 'Pas de connexion au serveur',
    offlineSubtitle: 'Impossible d\'atteindre {{server}}. Vérifiez votre réseau ou le serveur.',
    offlineModeBanner: 'Mode hors ligne — lecture depuis le cache local',
    offlineNoCacheBanner: 'Pas de connexion au serveur — {{server}} inaccessible',
    offlineLibraryTitle: 'Bibliothèque hors ligne',
    offlineLibraryEmpty: 'Aucun album en cache. Connectez-vous, ouvrez un album et cliquez sur "Rendre disponible hors ligne".',
    offlineAlbumCount: '{{n}} album',
    offlineAlbumCount_plural: '{{n}} albums',
    offlineFilterAll: 'Tout',
    offlineFilterAlbums: 'Albums',
    offlineFilterPlaylists: 'Playlists',
    offlineFilterArtists: 'Discographies',
    retry: 'Réessayer',
    serverSettings: 'Paramètres serveur',
    switchServerTitle: 'Changer de serveur',
    switchServerHint: 'Cliquez pour choisir un autre serveur enregistré.',
    manageServers: 'Gérer les serveurs…',
    switchFailed: 'Impossible de changer — serveur injoignable.',
    lastfmConnected: 'Last.fm connecté en tant que @{{user}}',
    lastfmSessionInvalid: 'Session invalide — cliquez pour vous reconnecter',
  },
  common: {
    albums: 'Albums',
    album: 'Album',
    loading: 'Chargement…',
    loadingMore: 'Chargement…',
    loadingPlaylists: 'Chargement des listes…',
    noAlbums: 'Aucun album trouvé.',
    downloading: 'Téléchargement…',
    downloadZip: 'Télécharger (ZIP)',
    back: 'Retour',
    cancel: 'Annuler',
    save: 'Enregistrer',
    delete: 'Supprimer',
    use: 'Utiliser',
    add: 'Ajouter',
    new: 'Nouveau',
    active: 'Actif',
    download: 'Télécharger',
    chooseDownloadFolder: 'Choisir le dossier de téléchargement',
    noFolderSelected: 'Aucun dossier sélectionné',
    rememberDownloadFolder: 'Mémoriser ce dossier',
    filterGenre: 'Filtre genre',
    filterSearchGenres: 'Rechercher des genres…',
    filterNoGenres: 'Aucun genre trouvé',
    filterClear: 'Effacer',
    favorites: 'Favoris',
    favoritesTooltipOff: 'Afficher uniquement les favoris',
    favoritesTooltipOn: 'Tout afficher',
    play: 'Lire',
    bulkSelected: '{{count}} sélectionné(s)',
    clearSelection: 'Effacer la sélection',
    bulkAddToPlaylist: 'Ajouter à la playlist',
    bulkRemoveFromPlaylist: 'Retirer de la playlist',
    bulkClear: 'Désélectionner',
    updaterAvailable: 'Mise à jour disponible',
    updaterVersion: 'v{{version}} est disponible',
    updaterWebsite: 'Site Web',
    updaterModalTitle: 'Nouvelle version disponible',
    updaterChangelog: 'Nouveautés',
    updaterDownloadBtn: 'Télécharger maintenant',
    updaterSkipBtn: 'Ignorer cette version',
    updaterRemindBtn: 'Me rappeler plus tard',
    updaterDone: 'Téléchargement terminé',
    updaterShowFolder: 'Afficher dans le dossier',
    updaterInstallHint: 'Fermez Psysonic et lancez le programme d\'installation manuellement.',
    updaterAurHint: 'Installer la mise à jour via AUR :',
    updaterErrorMsg: 'Échec du téléchargement',
    updaterRetryBtn: 'Réessayer',
    durationHoursMinutes: '{{hours}} h {{minutes}} min',
    durationMinutesOnly: '{{minutes}} min',
    updaterOpenGitHub: 'Ouvrir sur GitHub',
    filters: 'Filtres',
    more: 'plus',
    yearRange: 'Plage d\'années',
    clearAll: 'Tout effacer',
  },
  settings: {
    title: 'Paramètres',
    language: 'Langue',
    languageEn: 'English',
    languageDe: 'Deutsch',
    languageEs: 'Español',
    languageFr: 'Français',
    languageNl: 'Nederlands',
    languageNb: 'Norsk',
    languageRu: 'Русский',
    languageZh: '中文',
    font: 'Police',
    fontHintOpenDyslexic: 'Adapté à la dyslexie · sans prise en charge du chinois',
    theme: 'Thème',
    appearance: 'Apparence',
    servers: 'Serveurs',
    serverName: 'Nom du serveur',
    serverUrl: 'URL du serveur',
    serverUrlPlaceholder: '192.168.1.100:4533 ou https://music.exemple.com',
    serverUsername: 'Nom d\'utilisateur',
    serverPassword: 'Mot de passe',
    addServer: 'Ajouter un serveur',
    addServerTitle: 'Ajouter un nouveau serveur',
    useServer: 'Utiliser',
    deleteServer: 'Supprimer',
    noServers: 'Aucun serveur enregistré.',
    serverActive: 'Actif',
    confirmDeleteServer: 'Supprimer le serveur « {{name}} » ?',
    serverConnecting: 'Connexion…',
    serverConnected: 'Connecté !',
    serverFailed: 'Connexion échouée.',
    testBtn: 'Tester la connexion',
    testingBtn: 'Test en cours…',
    serverCompatible: 'Conçu pour Navidrome. Les autres serveurs compatibles Subsonic (Gonic, Airsonic, …) peuvent fonctionner avec des fonctionnalités réduites, car Psysonic utilise de nombreux endpoints d’API spécifiques à Navidrome.',
    userMgmtTitle: 'Gestion des utilisateurs',
    userMgmtDesc: 'Gérer les utilisateurs sur ce serveur. Nécessite des privilèges administrateur.',
    userMgmtNoAdmin: 'Vous devez être administrateur pour gérer les utilisateurs sur ce serveur.',
    userMgmtLoadError: 'Impossible de charger les utilisateurs.',
    userMgmtLoadFriendly: 'Le serveur n\'a pas répondu — généralement ponctuel.',
    userMgmtRetry: 'Réessayer',
    userMgmtEmpty: 'Aucun utilisateur trouvé.',
    userMgmtYouBadge: 'Vous',
    userMgmtAdminBadge: 'Admin',
    userMgmtAddUser: 'Ajouter un utilisateur',
    userMgmtAddUserTitle: 'Nouvel utilisateur',
    userMgmtEditUserTitle: 'Modifier l’utilisateur',
    userMgmtUsername: 'Nom d’utilisateur',
    userMgmtName: 'Nom affiché',
    userMgmtEmail: 'E-mail',
    userMgmtPassword: 'Mot de passe',
    userMgmtPasswordEditHint: 'Saisir un nouveau mot de passe pour le modifier.',
    userMgmtRoleAdmin: 'Admin',
    userMgmtLibraries: 'Bibliothèques',
    userMgmtLibrariesAdminHint: 'Les utilisateurs admin ont automatiquement accès à toutes les bibliothèques.',
    userMgmtLibrariesEmpty: 'Aucune bibliothèque disponible sur ce serveur.',
    userMgmtLibrariesValidation: 'Sélectionnez au moins une bibliothèque.',
    userMgmtLibrariesUpdateError: 'Utilisateur enregistré, mais l\u2019attribution des bibliothèques a échoué',
    userMgmtNoLibraries: 'Aucune bibliothèque attribuée',
    userMgmtNeverSeen: 'Jamais',
    userMgmtSave: 'Enregistrer',
    userMgmtCancel: 'Annuler',
    userMgmtDelete: 'Supprimer',
    userMgmtEdit: 'Modifier',
    userMgmtConfirmDelete: 'Supprimer l’utilisateur « {{username}} » ? Action irréversible.',
    userMgmtCreateError: 'Impossible de créer l’utilisateur.',
    userMgmtUpdateError: 'Impossible de mettre à jour l’utilisateur.',
    userMgmtDeleteError: 'Impossible de supprimer l’utilisateur.',
    userMgmtCreated: 'Utilisateur créé.',
    userMgmtUpdated: 'Utilisateur mis à jour.',
    userMgmtDeleted: 'Utilisateur supprimé.',
    userMgmtValidationMissing: 'Nom d’utilisateur, nom affiché et mot de passe sont requis.',
    userMgmtValidationMissingIdentity: 'Le nom d’utilisateur et le nom affiché sont requis.',
    userMgmtMagicStringGenerate: 'Générer la chaîne magique',
    userMgmtSaveAndMagicString: 'Enregistrer et obtenir la chaîne magique',
    userMgmtMagicStringPasswordNavHint:
      'Navidrome enregistrera ce mot de passe pour l’utilisateur. S’il diffère de l’actuel, le mot de passe de connexion sur le serveur sera mis à jour.',
    userMgmtMagicStringPlaintextWarning:
      'Partagez la chaîne magique avec prudence : elle contient un mot de passe non chiffré (l’encodage n’est pas du chiffrement). Quiconque possède la chaîne complète peut se connecter en tant que cet utilisateur.',
    userMgmtMagicStringCopied: 'Chaîne magique copiée dans le presse-papiers.',
    userMgmtMagicStringCopyFailed: 'Impossible de copier dans le presse-papiers.',
    userMgmtMagicStringLoginFailed: 'Échec de la vérification du mot de passe — identifiants non confirmés.',
    userMgmtMagicStringModalTitle: 'Générer la chaîne magique',
    userMgmtMagicStringModalDesc: 'Saisissez le mot de passe Subsonic de « {{username}} ». Il est inclus dans la chaîne magique copiée.',
    userMgmtMagicStringModalConfirm: 'Copier la chaîne',
    audiomuseTitle: 'AudioMuse-AI (Navidrome)',
    audiomuseDesc:
      'Activez si ce serveur utilise le <pluginLink>plugin Navidrome AudioMuse-AI</pluginLink>. Active le mix instantané depuis un morceau et affiche les artistes similaires côté serveur au lieu de Last.fm sur les pages artiste.',
    audiomuseIssueHint:
      'Le mix instantané a échoué récemment — vérifiez le plugin Navidrome et l’API AudioMuse. Les artistes similaires utilisent Last.fm si le serveur ne renvoie rien.',
    connected: 'Connecté',
    failed: 'Échec',
    eqTitle: 'Égaliseur',
    eqEnabled: 'Activer l\'égaliseur',
    eqPreset: 'Préréglage',
    eqPresetCustom: 'Personnalisé',
    eqPresetBuiltin: 'Préréglages intégrés',
    eqPresetCustomGroup: 'Mes préréglages',
    eqSavePreset: 'Enregistrer comme préréglage',
    eqPresetName: 'Nom du préréglage…',
    eqDeletePreset: 'Supprimer le préréglage',
    eqResetBands: 'Réinitialiser à plat',
    eqPreGain: 'Pré-amplification',
    eqResetPreGain: 'Réinitialiser la pré-amplification',
    eqAutoEqTitle: 'Recherche AutoEQ',
    eqAutoEqPlaceholder: 'Rechercher un casque / IEM…',
    eqAutoEqSearching: 'Recherche…',
    eqAutoEqNoResults: 'Aucun résultat',
    eqAutoEqError: 'Échec de la recherche',
    eqAutoEqRateLimit: 'Limite GitHub atteinte — réessayez dans une minute',
    eqAutoEqFetchError: 'Impossible de charger le profil EQ',
    lfmTitle: 'Last.fm',
    lfmConnect: 'Connecter avec Last.fm',
    lfmConnecting: 'En attente d\'autorisation…',
    lfmConfirm: 'J\'ai autorisé l\'application',
    lfmConnected: 'Connecté en tant que',
    lfmDisconnect: 'Déconnecter',
    lfmConnectDesc: 'Connectez votre compte Last.fm pour activer le scrobbling et les mises à jour « En cours de lecture » depuis Psysonic — aucune configuration Navidrome requise.',
    lfmOpenBrowser: 'Une fenêtre de navigateur s\'ouvrira. Autorisez Psysonic sur Last.fm, puis cliquez sur le bouton ci-dessous.',
    lfmScrobbles: '{{n}} scrobbles',
    lfmMemberSince: 'Membre depuis {{year}}',
    scrobbleEnabled: 'Scrobbling activé',
    scrobbleDesc: 'Envoyer les morceaux à Last.fm après 50% d\'écoute',
    behavior: 'Comportement de l\'application',
    cacheTitle: 'Taille max. du stockage',
    cacheDesc: 'Pochettes et images d\'artistes. Quand le cache est plein, les entrées les plus anciennes sont supprimées automatiquement. Les albums hors ligne ne sont pas supprimés automatiquement, mais le seront lors d\'un nettoyage manuel.',
    cacheUsedImages: 'Images :',
    cacheUsedOffline: 'Pistes hors ligne :',
    cacheUsedHot: 'Espace disque :',
    hotCacheTrackCount: 'Pistes en cache :',
    cacheMaxLabel: 'Taille max.',
    cacheClearBtn: 'Vider le cache',
    cacheClearWarning: 'Cela supprimera aussi tous les albums hors ligne de la bibliothèque.',
    cacheClearConfirm: 'Tout supprimer',
    cacheClearCancel: 'Annuler',
    offlineDirTitle: 'Bibliothèque hors ligne (intégrée)',
    offlineDirDesc: 'Emplacement de stockage des titres rendus disponibles hors ligne dans Psysonic.',
    offlineDirDefault: 'Par défaut (données d\'application)',
    offlineDirChange: 'Changer le dossier',
    offlineDirClear: 'Réinitialiser',
    offlineDirHint: 'Les nouveaux téléchargements utiliseront cet emplacement. Les téléchargements existants restent à leur emplacement d\'origine.',
    hotCacheTitle: 'Cache de lecture à chaud',
    hotCacheDisclaimer: 'Précharge les titres à venir dans la file et conserve les précédents. Si activé : espace disque et réseau.',
    hotCacheDirDefault: 'Par défaut (données d\'application)',
    hotCacheDirChange: 'Changer le dossier',
    hotCacheDirClear: 'Réinitialiser',
    hotCacheDirHint: 'Changer de dossier réinitialise l’index dans l’app ; les fichiers déjà écrits restent à l’ancien emplacement.',
    hotCacheEnabled: 'Activer le cache de lecture à chaud',
    hotCacheMaxMb: 'Taille maximale du cache',
    hotCacheDebounce: 'Délai après changement de file',
    hotCacheDebounceImmediate: 'Immédiat',
    hotCacheDebounceSeconds: '{{n}} s',
    hotCacheClearBtn: 'Vider le cache à chaud',
    audioOutputDevice: 'Périphérique de sortie audio',
    audioOutputDeviceDesc: 'Choisissez le périphérique audio utilisé par Psysonic. Les changements sont immédiats et relancent la piste en cours.',
    audioOutputDeviceDefault: 'Défaut système',
    audioOutputDeviceRefresh: 'Actualiser la liste',
    audioOutputDeviceOsDefaultNow: 'sortie système actuelle',
    audioOutputDeviceListError: 'Impossible de charger la liste des périphériques audio.',
    audioOutputDeviceNotInCurrentList: 'absent de la liste actuelle',
    audioOutputDeviceMacNotice: 'Sur macOS, la lecture suit actuellement toujours la sortie audio du système pour des raisons techniques. Changez la cible via Réglages Système → Son ou l\'icône haut-parleur de la barre de menus. Contexte : CoreAudio déclenche une demande d\'autorisation du microphone à l\'ouverture d\'un flux non par défaut — nous l\'évitons en utilisant toujours la sortie système par défaut.',
    hiResTitle: 'Lecture haute résolution native',
    hiResEnabled: 'Activer la lecture haute résolution native',
    hiResDesc: "Force une sortie à 44,1 kHz par défaut pour une stabilité maximale. N'activer que si le matériel et le réseau prennent en charge les hautes fréquences d'échantillonnage (88,2 kHz+).",
    showArtistImages: 'Afficher les images d\'artistes',
    showArtistImagesDesc: 'Charge et affiche les images d\'artistes dans la vue d\'ensemble. Désactivé par défaut pour réduire les E/S disque serveur et la charge réseau sur les grandes bibliothèques.',
    showOrbitTrigger: 'Afficher « Orbit » dans l\'en-tête',
    showOrbitTriggerDesc: 'Le bouton d\'en-tête pour démarrer ou rejoindre une session d\'écoute partagée. Masque-le si tu n\'utilises pas Orbit — tu peux le réactiver ici.',
    showTrayIcon: 'Afficher l\'icône dans la barre système',
    showTrayIconDesc: 'Affiche l\'icône Psysonic dans la zone de notification / barre des menus.',
    minimizeToTray: 'Réduire dans la barre système',
    minimizeToTrayDesc: 'Lors de la fermeture, Psysonic continue de fonctionner dans la barre système au lieu de se fermer.',
    preloadMiniPlayer: 'Précharger le mini-lecteur',
    preloadMiniPlayerDesc: 'Construit la fenêtre du mini-lecteur en arrière-plan au démarrage de l\'application afin qu\'elle affiche son contenu instantanément à la première ouverture. Utilise un peu plus de mémoire.',
    linuxWebkitSmoothScroll: 'Molette fluide (Linux)',
    linuxWebkitSmoothScrollDesc: 'Activé : inertie. Désactivé : pas à la ligne, style GTK.',
    discordRichPresence: 'Discord Rich Presence',
    discordRichPresenceDesc: 'Affiche le titre en cours de lecture sur votre profil Discord. Discord doit être ouvert.',
    discordCoverSource: 'Source de pochette',
    discordCoverSourceDesc: 'D\'où récupérer la pochette pour votre profil Discord.',
    discordCoverNone: 'Aucune (icône de l\'app uniquement)',
    discordCoverServer: 'Serveur (via infos album)',
    discordCoverApple: 'Apple Music',
    discordOptions: 'Options Discord avancées',
    discordTemplates: 'Modèles de texte personnalisés',
    discordTemplatesDesc: 'Personnalisez les informations affichées sur votre profil Discord. Variables : {title}, {artist}, {album}',
    discordTemplateDetails: 'Ligne principale (details)',
    discordTemplateState: 'Ligne secondaire (state)',
    discordTemplateLargeText: 'Info-bulle album (largeText)',
    nowPlayingEnabled: 'Afficher dans la fenêtre live',
    nowPlayingEnabledDesc: 'Diffuse le titre en cours de lecture vers la vue des auditeurs en direct du serveur. Désactiver pour ne pas envoyer de données de lecture.',
    enableBandsintown: 'Dates de tournée Bandsintown',
    enableBandsintownDesc: 'Affiche les concerts à venir de l\'artiste actuel dans l\'onglet Info. Les données proviennent de l\'API publique Bandsintown.',
    lyricsServerFirst: 'Préférer les paroles du serveur',
    lyricsServerFirstDesc: 'Consulter d\'abord les paroles fournies par le serveur (tags intégrés, fichiers sidecar) avant LRCLIB. Désactiver pour utiliser LRCLIB en priorité.',
    enableNeteaselyrics: 'Paroles Netease Cloud Music',
    enableNeteaselyricsDesc: 'Utiliser Netease Cloud Music en dernier recours lorsque le serveur et LRCLIB ne retournent rien. Meilleure couverture pour la musique asiatique et internationale.',
    lyricsSourcesTitle: 'Sources de paroles',
    lyricsSourcesDesc: 'Choisissez quelles sources interroger et dans quel ordre. Glissez pour réordonner. Les sources désactivées sont ignorées.',
    lyricsSourceServer: 'Serveur',
    lyricsSourceLrclib: 'LRCLIB',
    lyricsSourceNetease: 'Netease Cloud Music',
    lyricsModeStandard: 'Standard',
    lyricsModeStandardDesc: 'Trois sources avec ordre librement configurable : tags du serveur, LRCLIB, Netease.',
    lyricsModeLyricsplus: 'YouLyPlus (Karaoké)',
    lyricsModeLyricsplusDesc: 'Synchronisation mot à mot depuis Apple Music, Spotify, Musixmatch et QQ (backend communautaire). Retombe silencieusement sur les sources standard si rien n\'est trouvé.',
    lyricsStaticOnly: 'Afficher les paroles en texte statique uniquement',
    lyricsStaticOnlyDesc: 'Affiche les paroles synchronisées sans défilement automatique ni surlignage des mots.',
    downloadsTitle: 'Export ZIP & Archivage',
    downloadsFolderDesc: 'Dossier de destination pour les albums téléchargés en tant que fichier ZIP sur votre ordinateur.',
    downloadsDefault: 'Dossier de téléchargement par défaut',
    pickFolder: 'Sélectionner',
    pickFolderTitle: 'Sélectionner le dossier de téléchargement',
    clearFolder: 'Effacer le dossier',
    logout: 'Se déconnecter',
    aboutTitle: 'À propos de Psysonic',
    aboutDesc: 'Un lecteur de musique de bureau moderne conçu pour Navidrome. Utilise l\'API Subsonic ainsi que des extensions spécifiques à Navidrome. Basé sur Tauri v2 avec un moteur audio Rust natif — léger et rapide, mais riche en fonctionnalités : barre waveform, paroles synchronisées, intégration Last.fm, égaliseur 10 bandes, crossfade, lecture sans blanc, Replay Gain, navigation par genre et une grande bibliothèque de thèmes.',
    aboutLicense: 'Licence',
    aboutLicenseText: 'GNU GPL v3 — libre d\'utilisation, de modification et de distribution sous la même licence.',
    aboutRepo: 'Code source sur GitHub',
    aboutVersion: 'Version',
    aboutBuiltWith: 'Construit avec Tauri · React · TypeScript · Rust/rodio',
    aboutReleaseNotesLabel: 'Notes de version',
    aboutReleaseNotesLink: 'Ouvrir les nouveautés de cette version',
    aboutContributorsLabel: 'Contributeurs',
    showChangelogOnUpdate: "Afficher 'Quoi de neuf' lors des mises à jour",
    showChangelogOnUpdateDesc: "Affiche une bannière discrète du changelog au-dessus de Now Playing après une mise à jour. Un clic ouvre les notes de version, le X la masque.",
    randomMixTitle: 'Liste noire du mix aléatoire',
    luckyMixMenuTitle: 'Afficher Mix Chance dans le menu',
    luckyMixMenuDesc: 'Active Mix Chance dans "Créer un mix" et comme entrée séparée quand la navigation est scindée. Visible uniquement si AudioMuse est actif sur le serveur courant.',
    randomMixBlacklistTitle: 'Mots-clés de filtre personnalisés',
    randomMixBlacklistDesc: 'Les morceaux sont exclus si un mot-clé correspond à leur genre, titre, album ou artiste (actif quand la case ci-dessus est cochée).',
    randomMixBlacklistPlaceholder: 'Ajouter un mot-clé…',
    randomMixBlacklistAdd: 'Ajouter',
    randomMixBlacklistEmpty: 'Aucun mot-clé personnalisé ajouté.',
    randomMixHardcodedTitle: 'Mots-clés intégrés (actifs quand la case est cochée)',
    tabAudio: 'Audio',
    tabStorage: 'Hors ligne & Cache',
    tabAppearance: 'Apparence',
    tabLibrary: 'Bibliothèque',
    tabServers: 'Serveurs',
    tabLyrics: 'Paroles',
    tabPersonalisation: 'Personnalisation',
    tabIntegrations: 'Intégrations',
    inputKeybindingsTitle: 'Raccourcis clavier',
    aboutContributorsCount_one: '{{count}} contribution',
    aboutContributorsCount_other: '{{count}} contributions',
    searchPlaceholder: 'Rechercher dans les paramètres…',
    searchNoResults: 'Aucun réglage ne correspond à votre recherche.',
    aboutMaintainersLabel: 'Mainteneurs',
    integrationsPrivacyTitle: 'Avis de confidentialité',
    integrationsPrivacyBody: 'Toutes les intégrations de cet onglet sont <strong>facultatives</strong> et, une fois activées, envoient des données à des services externes ou à votre serveur Navidrome. Last.fm reçoit votre historique d\'écoute, Discord affiche le morceau en cours dans votre profil, Bandsintown est interrogé par artiste pour récupérer les dates de tournée, et le partage « En cours de lecture » publie votre morceau actuel auprès des autres utilisateurs de votre serveur Navidrome. Si vous ne voulez rien de tout cela, laissez simplement la section correspondante désactivée.',
    homeCustomizerTitle: 'Page d\'accueil',
    queueToolbarTitle: 'Barre d\'outils de file d\'attente',
    queueToolbarReset: 'Réinitialiser',
    queueToolbarSeparator: 'Séparateur',
    sidebarTitle: 'Barre latérale',
    sidebarReset: 'Réinitialiser',
    artistLayoutTitle: 'Sections de la page artiste',
    artistLayoutDesc: 'Glissez pour réorganiser, basculez pour masquer des sections individuelles de la page artiste. Les sections sans données sont ignorées automatiquement.',
    artistLayoutReset: 'Réinitialiser',
    artistLayoutBio: 'Biographie de l\'artiste',
    artistLayoutTopTracks: 'Titres populaires',
    artistLayoutSimilar: 'Artistes similaires',
    artistLayoutAlbums: 'Albums',
    artistLayoutFeatured: 'Apparaît aussi sur',
    sidebarDrag: 'Glisser pour réorganiser',
    sidebarFixed: 'Toujours visible',
    randomNavSplitTitle: 'Diviser la navigation Mix',
    randomNavSplitDesc: 'Afficher "Mix Aléatoire", "Albums Aléatoires" et "Mix Chance" comme entrées séparées dans la barre latérale plutôt que le hub "Créer un Mix".',
    tabInput: 'Entrée',
    tabUsers: 'Utilisateurs',
    shortcutsReset: 'Réinitialiser',
    shortcutListening: 'Appuyez sur une touche…',
    shortcutUnbound: '—',
    shortcutClear: 'Effacer',
    globalShortcutsTitle: 'Raccourcis globaux',
    globalShortcutsNote: 'Fonctionnent à l\'échelle du système, même quand Psysonic est en arrière-plan. Nécessite Ctrl, Alt ou Super comme modificateur.',
    shortcutPlayPause: 'Lecture / Pause',
    shortcutNext: 'Piste suivante',
    shortcutPrev: 'Piste précédente',
    shortcutVolumeUp: 'Volume +',
    shortcutVolumeDown: 'Volume -',
    shortcutSeekForward: 'Avancer de 10s',
    shortcutSeekBackward: 'Reculer de 10s',
    shortcutToggleQueue: 'Afficher/masquer la file',
    shortcutOpenFolderBrowser: 'Ouvrir {{folderBrowser}}',
    shortcutFullscreenPlayer: 'Lecteur plein écran',
    shortcutNativeFullscreen: 'Plein écran natif',
    shortcutOpenMiniPlayer: 'Ouvrir le mini-lecteur',
    shortcutStartSearch: 'Lancer une recherche',
    shortcutStartAdvancedSearch: 'Lancer une recherche avancée',
    shortcutToggleSidebar: 'Afficher / masquer la barre latérale',
    shortcutMuteSound: 'Couper le son',
    shortcutToggleEqualizer: 'Ouvrir / basculer l\'égaliseur',
    shortcutToggleRepeat: 'Basculer la répétition',
    shortcutOpenNowPlaying: 'Ouvrir « En cours »',
    shortcutShowLyrics: 'Afficher les paroles',
    shortcutFavoriteCurrentTrack: 'Ajouter la piste actuelle aux favoris',
    shortcutOpenHelp: 'Aide',
    tabSystem: 'Système',
    loggingTitle: 'Journalisation',
    loggingModeDesc: 'Contrôle le niveau de verbosité des journaux backend dans le terminal.',
    loggingModeOff: 'Désactivé',
    loggingModeNormal: 'Normal',
    loggingModeDebug: 'Débogage',
    loggingExport: 'Exporter les journaux',
    loggingExportSuccess: 'Journaux exportés ({{count}} lignes).',
    loggingExportError: 'Impossible d\'exporter les journaux.',
    ratingsSectionTitle: 'Notes',
    ratingsSkipStarTitle: 'Passer pour 1 étoile',
    ratingsSkipStarDesc:
      "Après plusieurs sauts d’affilée, le morceau passe à 1 étoile. Uniquement s’il n’était pas encore noté.",
    ratingsSkipStarThresholdLabel: 'Sauts',
    ratingsMixFilterTitle: 'Filtrage par note',
    ratingsMixFilterDesc:
      "Filtrer le contenu peu noté dans {{mix}} et {{albums}}. Cliquer de nouveau sur l’étoile choisie désactive le seuil.",
    ratingsMixMinSong: 'Morceaux',
    ratingsMixMinAlbum: 'Albums',
    ratingsMixMinArtist: 'Artistes',
    ratingsMixMinThresholdAria: 'Étoiles minimum : {{label}}',
    backupTitle: 'Sauvegarde & Restauration',
    backupExport: 'Exporter les paramètres',
    backupExportDesc: 'Enregistre tous les paramètres, profils serveur, configuration Last.fm, thème, EQ et raccourcis dans un fichier .psybkp. Les mots de passe sont stockés en clair — conservez le fichier en sécurité.',
    backupImport: 'Importer les paramètres',
    backupImportDesc: 'Restaure les paramètres depuis un fichier .psybkp. L\'application sera rechargée après l\'import.',
    backupImportConfirm: 'Tous les paramètres actuels seront écrasés. Continuer ?',
    backupSuccess: 'Sauvegarde enregistrée',
    backupImportSuccess: 'Paramètres restaurés — rechargement…',
    backupImportError: 'Fichier de sauvegarde invalide ou corrompu.',
    playbackTitle: 'Lecture',
    replayGain: 'Replay Gain',
    replayGainDesc: 'Normaliser le volume des pistes avec les métadonnées ReplayGain',
    replayGainMode: 'Mode',
    replayGainAuto: 'Auto',
    replayGainAutoDesc: 'Utilise le gain d\'album quand les pistes voisines de la file proviennent du même album, sinon le gain de piste.',
    replayGainTrack: 'Piste',
    replayGainAlbum: 'Album',
    replayGainPreGain: 'Pré-Gain (fichiers taggés)',
    replayGainPreGainDesc: 'Boost universel ajouté à chaque calcul ReplayGain. Utile si votre bibliothèque semble globalement trop discrète.',
    replayGainFallback: 'Repli (sans tags / radio)',
    replayGainFallbackDesc: 'Appliqué aux pistes (et flux radio) sans tags ReplayGain, pour que le contenu non taggé ne sorte pas plus fort que le reste.',
    normalization: 'Normalisation',
    normalizationDesc: 'Égalise la sonie perçue entre pistes, albums et radio.',
    normalizationOff: 'Désactivé',
    normalizationReplayGain: 'ReplayGain',
    normalizationLufs: 'LUFS',
    loudnessTargetLufs: 'LUFS cible',
    loudnessTargetLufsDesc: 'Sonie de référence sur laquelle toutes les pistes sont calées. Valeur plus basse = sortie plus forte. Les services de streaming tournent autour de -14 LUFS.',
    loudnessPreAnalysisAttenuation: 'Atténuation avant mesure',
    loudnessPreAnalysisAttenuationDesc:
      'Réduit le volume tant que la loudness du morceau n’est pas enregistrée. En streaming, des estimations grossières suivent, pas une mesure complète. 0 dB = rien ; plus négatif = plus discret. À droite, le dB effectif pour la cible actuelle.',
    loudnessPreAnalysisAttenuationRef: 'Effectif {{eff}} dB avec cible {{tgt}} LUFS.',
    loudnessPreAnalysisAttenuationReset: 'Valeur par défaut',
    loudnessFirstPlayNote:
      'À la première lecture d’un nouveau morceau, le volume peut brièvement varier pendant la mesure. La fois suivante, la mesure mise en cache prend le relais et tout reste stable. Les pistes à venir dans la file sont en général pré-analysées pendant la lecture précédente, ce cas est donc rare en pratique.',
    crossfade: 'Fondu enchaîné',
    crossfadeDesc: 'Fondu entre les pistes',
    crossfadeSecs: '{{n}} s',
    notWithGapless: 'Non disponible quand la lecture sans blanc est active',
    notWithCrossfade: 'Non disponible quand le fondu enchaîné est actif',
    gapless: 'Lecture sans blanc',
    gaplessDesc: 'Préparer la piste suivante pour éliminer les silences entre les morceaux',
    preservePlayNextOrder: "Préserver l'ordre « Lire ensuite »",
    preservePlayNextOrderDesc: 'Les nouveaux éléments « Lire ensuite » s\'ajoutent à la fin de la file existante au lieu de la doubler.',
    trackPreviewsTitle: 'Aperçus de pistes',
    trackPreviewsToggle: 'Activer les aperçus de pistes',
    trackPreviewsDesc: 'Affiche les boutons Lecture et Aperçu dans les listes pour un court extrait au milieu du morceau.',
    trackPreviewStart: 'Position de départ',
    trackPreviewStartDesc: 'À quel point du morceau l\'aperçu commence (% de la durée).',
    trackPreviewDuration: 'Durée',
    trackPreviewDurationDesc: 'Combien de temps chaque aperçu joue avant de s\'arrêter.',
    trackPreviewDurationSecs: '{{n}} s',
    trackPreviewLocationsTitle: 'Où afficher les aperçus',
    trackPreviewLocationsDesc: 'Choisissez dans quelles listes afficher les boutons d\'aperçu.',
    trackPreviewLocation_suggestions: 'Dans les suggestions de playlist',
    trackPreviewLocation_albums: 'Dans les listes d\'albums',
    trackPreviewLocation_playlists: 'Dans les playlists',
    trackPreviewLocation_favorites: 'Dans les favoris',
    trackPreviewLocation_artist: 'Dans les meilleurs morceaux de l\'artiste',
    trackPreviewLocation_randomMix: 'Dans Random Mix',
    preloadMode: 'Précharger la piste suivante',
    preloadModeDesc: 'Quand commencer à mettre en mémoire tampon la piste suivante',
    nextTrackBufferingTitle: 'Mise en mémoire tampon',
    preloadHotCacheMutualExclusive: "Preload et Hot Cache remplissent le même rôle — un seul peut être actif à la fois. Activer l'un désactive automatiquement l'autre.",
    preloadOff: 'Désactivé',
    preloadBalanced: 'Équilibré (30 s avant la fin)',
    preloadEarly: 'Tôt (après 5 s de lecture)',
    preloadCustom: 'Personnalisé',
    preloadCustomSeconds: 'Secondes avant la fin : {{n}}',
    infiniteQueue: 'File infinie',
    infiniteQueueDesc: 'Ajouter automatiquement des morceaux aléatoires quand la file est épuisée',
    experimental: 'Expérimental',
    fsPlayerSection: 'Lecteur plein écran',
    fsShowArtistPortrait: "Afficher la photo de l'artiste",
    fsShowArtistPortraitDesc: "Afficher la photo de l'artiste (ou la pochette) sur le côté droit du lecteur plein écran.",
    fsPortraitDim: "Assombrissement de la photo",
    fsLyricsStyle: "Style des paroles",
    fsLyricsStyleRail: "Rail",
    fsLyricsStyleRailDesc: "Rail glissant classique de 5 lignes.",
    fsLyricsStyleApple: "Défilement",
    fsLyricsStyleAppleDesc: "Liste déroulante plein écran.",
    sidebarLyricsStyle: "Style de défilement des paroles",
    sidebarLyricsStyleClassic: "Classique",
    sidebarLyricsStyleClassicDesc: "La ligne active est centrée.",
    sidebarLyricsStyleApple: "Apple Music-like",
    sidebarLyricsStyleAppleDesc: "La ligne active reste en haut avec une animation fluide.",
    seekbarStyle: 'Style de la barre de lecture',
    seekbarStyleDesc: 'Choisir l\'apparence de la barre de progression',
    seekbarTruewave: 'Forme d\'onde réelle',
    seekbarPseudowave: 'Forme d\'onde pseudo',
    seekbarLinedot: 'Ligne & point',
    seekbarBar: 'Barre',
    seekbarThick: 'Barre épaisse',
    seekbarSegmented: 'Segmentée',
    seekbarNeon: 'Néon',
    seekbarPulsewave: 'Onde pulsée',
    seekbarParticletrail: 'Traînée de particules',
    seekbarLiquidfill: 'Tube liquide',
    seekbarRetrotape: 'Bande rétro',
    themeSchedulerTitle: 'Planificateur de thème',
    themeSchedulerEnable: 'Activer le planificateur de thème',
    themeSchedulerEnableSub: 'Bascule automatiquement entre deux thèmes selon l\'heure',
    themeSchedulerDayTheme: 'Thème de jour',
    themeSchedulerDayStart: 'Début du jour',
    themeSchedulerNightTheme: 'Thème de nuit',
    themeSchedulerNightStart: 'Début de la nuit',
    themeSchedulerActiveHint: 'Le planificateur de thème est actif - les thèmes changent automatiquement.',
    visualOptionsTitle: 'Options Visuelles',
    coverArtBackground: "Fond d'Art de Poche",
    coverArtBackgroundSub: "Afficher la pochette floutée comme fond dans les en-têtes d'albums et de playlists",
    playlistCoverPhoto: 'Photo de Couverture de Playlist',
    playlistCoverPhotoSub: 'Afficher la grille de photos de couverture dans la vue détaillée des playlists',
    showBitrate: 'Afficher le Débit',
    showBitrateSub: 'Afficher le débit audio dans les listes de pistes',
    floatingPlayerBar: 'Barre de Lecteur Flottante',
    floatingPlayerBarSub: 'Garder la barre du lecteur flottante au-dessus du contenu',
    uiScaleTitle: "Mise à l'échelle de l'interface",
    uiScaleLabel: 'Zoom',
  },
  changelog: {
    modalTitle: 'Quoi de neuf',
    dontShowAgain: 'Ne plus afficher',
    close: 'Compris',
  },
  whatsNew: {
    title: 'Quoi de neuf',
    empty: 'Aucune entrée de changelog pour cette version.',
    bannerTitle: 'Changelog',
    bannerCollapsed: 'Nouveau dans v{{version}}',
    dismiss: 'Ignorer',
    close: 'Fermer',
  },
  help: {
    title: 'Aide',
    searchPlaceholder: 'Rechercher dans l\'aide…',
    noResults: 'Aucun sujet correspondant. Essayez un autre terme.',
    s1: 'Démarrage',
    q1: 'Quels serveurs sont compatibles ?',
    a1: 'Psysonic est conçu en priorité pour Navidrome et est entièrement compatible Subsonic — Gonic, Airsonic, LMS et autres serveurs Subsonic-API fonctionnent aussi. Certaines fonctionnalités avancées (notes, listes intelligentes, partage Magic String, gestion des utilisateurs) nécessitent Navidrome.',
    q2: 'Comment ajouter un serveur ?',
    a2: 'Paramètres → Serveurs → Ajouter un serveur. Saisissez l\'URL (ex. http://192.168.1.100:4533), le nom d\'utilisateur et le mot de passe. Psysonic teste la connexion avant d\'enregistrer — rien n\'est sauvegardé en cas d\'échec. Vous pouvez ajouter autant de serveurs que vous voulez et basculer entre eux dans l\'en-tête ; un seul est actif à la fois.',
    q3: 'Visite rapide de l\'interface ?',
    a3: 'Barre latérale (gauche) pour la navigation, Mainstage / pages au centre, barre du lecteur en bas, panneau File d\'attente à droite (icône en haut à droite, à côté de l\'indicateur Now Playing). La barre de recherche en haut couvre toute la bibliothèque ; « Now Playing » montre ce que les autres utilisateurs du même serveur Navidrome écoutent.',
    s2: 'Lecture & File d\'attente',
    q4: 'Comment utiliser la file d\'attente ?',
    a4: 'Ouvrez le panneau File d\'attente depuis l\'en-tête en haut à droite. Glissez les lignes pour réordonner, faites-les glisser à l\'extérieur pour les supprimer, ou utilisez la barre d\'outils pour mélanger, enregistrer la file en liste de lecture ou sauter à une piste. Faites glisser une ligne hors du panneau pour la déposer ailleurs comme transfert.',
    q5: 'Gapless vs Crossfade — quelle différence ?',
    a5: 'Gapless pré-bufferise la piste suivante pour éliminer tout silence (idéal pour les albums live et les mixes DJ). Crossfade fait un fondu entre la piste actuelle et la suivante sur 1 à 10 s (idéal pour les mixes aléatoires). Les deux sont mutuellement exclusifs — activer l\'un désactive l\'autre. Configuration dans Paramètres → Audio.',
    q6: 'Qu\'est-ce que la File infinie ?',
    a6: 'Quand la file se termine et que la répétition est désactivée, Psysonic ajoute discrètement des pistes similaires/aléatoires de votre bibliothèque pour que la lecture ne s\'arrête jamais. Les pistes auto-ajoutées apparaissent sous le séparateur « — Ajouté automatiquement —». Activable/désactivable via l\'icône infini dans l\'en-tête de la file ; restreignable à un genre dans Paramètres → File d\'attente.',
    q7: 'Sélection multiple et plage Maj-clic ?',
    a7: 'Activez « Sélectionner » sur Albums / Nouveautés / Albums aléatoires / Listes de lecture. Cliquez un élément pour le basculer, puis maintenez Maj et cliquez un autre élément — tout ce qui se trouve entre les deux dans l\'ordre visible est sélectionné. Les Maj-clics étendent depuis l\'ancre la plus récemment cliquée. La barre d\'outils en haut propose des actions groupées (file, téléchargement, suppression, etc.).',
    q8: 'Raccourcis clavier et hotkeys globaux ?',
    a8: 'Touches par défaut : Espace = Lecture / Pause, Échap = fermer le mode plein écran / les modales, F1 = aide-mémoire des raccourcis. Paramètres → Entrée permet de réassigner chaque action interne (y compris des accords comme Ctrl+Maj+P) et de définir des raccourcis globaux qui fonctionnent même en arrière-plan. Les touches multimédia (Lecture/Pause, Suivant, Précédent) fonctionnent partout.',
    s3: 'Outils audio',
    q9: 'Modes Replay Gain ?',
    a9: 'Paramètres → Audio → Replay Gain. Le mode Piste normalise chaque morceau au niveau cible. Le mode Album préserve la dynamique relative au sein d\'un album. Le mode Auto choisit Piste ou Album selon que la file vient d\'un album unique. Les pistes sans tags Replay Gain retombent sur un préampli configurable.',
    q10: 'Qu\'est-ce que la normalisation intelligente (LUFS) ?',
    a10: 'Une alternative moderne au Replay Gain dans Paramètres → Audio. Psysonic analyse chaque piste en LUFS / EBU R128 et stocke le résultat, pour un volume cohérent dans toute la bibliothèque — y compris les pistes sans tags Replay Gain. L\'analyse à froid tourne en arrière-plan et utilise 35–40 % du CPU pendant ~1 minute, puis 0. Définissez votre cible (par défaut −10 LUFS) une fois.',
    q11: 'EQ et AutoEQ ?',
    a11: 'Un égaliseur paramétrique 10 bandes dans Paramètres → Audio → Égaliseur, avec bandes manuelles et préréglages. AutoEQ à côté récupère un profil de correction mesuré pour votre modèle de casque depuis la base AutoEQ et l\'applique automatiquement aux bandes — choisissez votre casque, l\'égaliseur s\'aligne sur la bonne courbe.',
    q12: 'Comment changer le périphérique de sortie audio ?',
    a12: 'Paramètres → Audio → Périphérique de sortie. Psysonic liste toutes les sorties disponibles et bascule instantanément lors du choix. Le bouton Actualiser détecte les périphériques branchés après le démarrage. Sur Linux, les noms ALSA comme « sysdefault » sont auto-nettoyés pour la lisibilité.',
    q13: 'Qu\'est-ce que le Hot Cache ?',
    a13: 'Le Hot Cache précharge la piste actuelle plus les suivantes en RAM et sur disque pour que la lecture démarre sans buffering — particulièrement utile sur les serveurs lents/distants. L\'éviction se déclenche quand la limite de taille est atteinte. Configurez la taille et le délai de debounce (pour éviter les pré-fetchs à chaque saut rapide) dans Paramètres → Audio.',
    s4: 'Bibliothèque & Découverte',
    q14: 'Notes et Skip-to-1★ ?',
    a14: 'Psysonic prend en charge les notes 1 à 5 étoiles via OpenSubsonic (Navidrome ≥ 0.53). Notez les pistes dans les listes, dans le menu contextuel ou dans la barre du lecteur sous le nom de l\'artiste ; les albums sur leur page ; les artistes sur la page artiste. Skip-to-1★ (Paramètres → Bibliothèque → Notes) attribue automatiquement 1 étoile après un nombre configurable de sauts consécutifs. Le même panneau permet de définir une note minimale pour les Mixes générés.',
    q15: 'Comment naviguer — Dossiers, Genres, Pistes ?',
    a15: 'Le navigateur de dossiers (barre latérale) parcourt l\'arborescence du serveur en colonnes Miller — clic sur un dossier pour entrer, clic sur une piste ou l\'icône lecture d\'un dossier pour jouer/ajouter. Genres utilise un nuage de tags dimensionné par le nombre de pistes ; clic sur un genre pour l\'ouvrir. Pistes est un hub plat avec liste virtuelle triable par colonnes et recherche en direct.',
    q16: 'Recherche et recherche avancée ?',
    a16: 'La barre de recherche d\'en-tête lance une recherche live en tapant à travers artistes, albums et pistes. Ouvrez la recherche avancée (barre latérale) pour une vue plus riche : filtres par année, genre, note, format, canaux, taux d\'échantillonnage, BPM, ambiance — combinables. Clic droit sur un résultat ouvre le même menu contextuel qu\'ailleurs.',
    q17: 'Les Mixes (Aléatoire / Genre / Super Genre / Lucky) ?',
    a17: 'Le Mix aléatoire crée une liste de pistes aléatoires de votre bibliothèque ; le filtre par mots-clés exclut audiobooks, comédie, etc. par sous-chaînes de genre/titre/album. Super Genre Mix regroupe votre bibliothèque par grands styles (Rock, Metal, Électronique, Jazz, Classique…) et bâtit un mix focalisé. Lucky Mix utilise votre historique d\'écoute, les notes et les pistes similaires AudioMuse-AI pour assembler une liste instantanée d\'un clic.',
    q18: 'Page Statistiques ?',
    a18: 'Statistiques (barre latérale) montre les top artistes, top albums, top pistes, répartition par genre, temps d\'écoute dans le temps, et un périmètre par bibliothèque si vous avez plusieurs dossiers configurés. Plusieurs vues sont exportables en image partageable.',
    q19: 'Comment télécharger un album en ZIP ?',
    a19: 'Page album → « Télécharger (ZIP) ». Le serveur compresse l\'album d\'abord — pour les albums volumineux ou sans perte (FLAC / WAV) la barre de progression n\'apparaît qu\'une fois le zip terminé et le transfert démarré. C\'est normal.',
    s5: 'Paroles',
    q20: 'D\'où viennent les paroles ?',
    a20: 'Trois sources configurables dans Paramètres → Paroles : votre serveur Navidrome (paroles intégrées / OpenSubsonic), LRCLIB (paroles synchronisées communautaires) et NetEase Cloud Music (vaste catalogue asiatique + international). Chaque source est activable/désactivable et priorisable par glisser-déposer.',
    q21: 'Comment voir les paroles pendant la lecture ?',
    a21: 'Cliquez sur l\'icône micro de la barre du lecteur pour ouvrir l\'onglet Paroles dans le panneau de file. Les paroles synchronisées défilent automatiquement et supportent le clic-pour-aller-à ; les paroles en texte brut défilent en bloc statique. Activez le lecteur plein écran via la pochette pour une vue immersive avec fond mesh.',
    s6: 'Partage & Social',
    q22: 'Que sont les Magic Strings ?',
    a22: 'Les Magic Strings sont de courts jetons à copier-coller qui partagent des choses entre utilisateurs Psysonic sans serveur tiers. Les chaînes d\'invitation de serveur permettent à un ami de s\'enregistrer sur votre Navidrome en un collage ; les Magic Strings d\'album / artiste / file ouvrent le même album / artiste / file chez le destinataire. Générez-les depuis le menu Partager, collez-les dans la barre de recherche pour les consommer.',
    q23: 'Qu\'est-ce qu\'Orbit ?',
    a23: 'Orbit, c\'est l\'écoute synchronisée à plusieurs : un hôte joue une piste, tous les invités l\'entendent en sync, et les invités peuvent suggérer des morceaux que l\'hôte peut accepter dans la file. Démarrez une session depuis le bouton Orbit dans l\'en-tête, partagez le lien d\'invitation, les autres rejoignent depuis n\'importe quelle installation Psysonic. L\'hôte contrôle la lecture (saut, recherche, file) — les invités ont une vue temps réel et une boîte à suggestions. Les sessions sont éphémères et se terminent à la fermeture par l\'hôte.',
    q24: 'Qu\'est-ce que la liste déroulante Now Playing ?',
    a24: 'L\'icône de diffusion en haut à droite affiche ce que les autres utilisateurs du serveur Navidrome écoutent en ce moment, rafraîchi toutes les 10 secondes. Votre propre entrée disparaît dès la pause. Par serveur — les utilisateurs sur un autre serveur actif n\'apparaissent pas.',
    s7: 'Personnalisation',
    q25: 'Thèmes et planificateur de thème ?',
    a25: 'Paramètres → Apparence → Thème offre 60+ thèmes en 8 groupes (Psysonic, Lecteurs multimédias, Systèmes d\'exploitation, Jeux, Films, Séries, Réseaux sociaux, Open Source Classics — Catppuccin / Nord / Gruvbox / Nightfox / Dracula). Auto-Switch Theme permet de définir un thème de jour et un thème de nuit avec heures de bascule pour un changement automatique.',
    q26: 'Puis-je personnaliser barre latérale, accueil et page artiste ?',
    a26: 'Oui — Paramètres → Personnalisation. Le customiseur de barre latérale permet de réordonner les éléments par glisser et de masquer ceux que vous n\'utilisez pas. Le customiseur d\'accueil bascule chaque rangée Mainstage (Hero, Récent, Découvrir, Récemment écoutés, Favoris…). Le customiseur de page artiste réordonne les sections (Top morceaux, Albums, Singles, Compilations, Artistes similaires, etc.) et masque celles que vous ignorez.',
    q27: 'Qu\'est-ce que le Mini Player ?',
    a27: 'Une petite fenêtre flottante avec pochette, contrôles de transport et file compacte. Ouvrez-la depuis l\'icône mini-player de la barre du lecteur ou avec son raccourci. La fenêtre mémorise sa position et sa taille entre les sessions. Sous Windows, la mini-webview est précréée au démarrage pour une ouverture instantanée ; Linux / macOS doivent activer l\'option dans Paramètres → Apparence → Précharger le mini-player.',
    q28: 'Qu\'est-ce que la barre de lecture flottante ?',
    a28: 'Un style optionnel de barre du lecteur (Paramètres → Apparence) qui se détache du bord inférieur avec fond thématique, bordure d\'accentuation, pochette arrondie et section volume centrée. Utile sur les écrans hauts ou avec des thèmes compacts.',
    q29: 'Aperçu de piste au survol ?',
    a29: 'Survolez une ligne de piste, cliquez sur le petit bouton Aperçu sur la pochette, ou déclenchez l\'aperçu depuis le menu contextuel — Psysonic diffuse les ~15 premières secondes via le même moteur audio Rust afin que la normalisation de loudness s\'applique. Pratique pour parcourir un album inconnu.',
    q30: 'Minuteur de mise en veille ?',
    a30: 'Cliquez sur l\'icône lune de la barre du lecteur pour ouvrir le minuteur. Choisissez une durée (ou « fin de la piste actuelle ») et Psysonic fait un fondu et met en pause à la fin. Le bouton affiche un anneau circulaire et un compte à rebours pendant que le minuteur tourne.',
    q31: 'Échelle UI, police, style de seekbar ?',
    a31: 'Paramètres → Apparence — Échelle de l\'interface (80–125 % sans toucher à la taille système), Police (10 polices UI dont IBM Plex Mono, Fira Code, Geist, Golos Text…), Style de seekbar (Forme d\'onde analysée / pseudowave déterministe / Ligne & Point / Barre / Barre épaisse / Segmenté / Néon / Onde pulsée / Traînée de particules / Remplissage liquide / Bande rétro).',
    s8: 'Utilisateur avancé',
    q32: 'Contrôles du lecteur en ligne de commande ?',
    a32: 'Le binaire Psysonic sert aussi de télécommande. Exemples : psysonic --player play / pause / next / prev, --player volume 75, --player seek 15, --player shuffle, --player repeat off|all|one, --player rating 1-5. Changer de serveur, périphérique audio, bibliothèque ; déclencher un Instant Mix ; rechercher artistes / albums / pistes. Liste complète : psysonic --player --help. Complétions shell pour bash et zsh via psysonic completions.',
    q33: 'Listes intelligentes (Navidrome) ?',
    a33: 'Les listes intelligentes sont des listes dynamiques côté Navidrome définies par des règles (genre = Rock ET année > 2020, etc.). La page Listes de lecture de Psysonic permet de les créer, modifier et supprimer avec un éditeur de règles visuel — Psysonic utilise l\'API native de Navidrome. Elles se comportent comme des listes normales dans le reste de l\'app et se mettent à jour automatiquement.',
    q34: 'Sauvegarder et restaurer les paramètres ?',
    a34: 'Paramètres → Stockage → Sauvegarder & Restaurer exporte les profils de serveur, thèmes, raccourcis et autres réglages dans un seul fichier JSON. Importez-le sur une autre machine ou après une réinstallation pour tout restaurer d\'un coup. Les mots de passe des serveurs sont inclus — gardez le fichier privé.',
    q35: 'Où voir toutes les licences open source ?',
    a35: 'Paramètres → Système → Licences open source. La liste complète des dépendances (crates Cargo et paquets npm) est livrée avec les textes de licence inclus. Cliquez sur une entrée pour voir le texte complet ; le bloc en surbrillance en haut met en avant les bibliothèques connues (Tauri, React, rodio, symphonia, etc.).',
    s9: 'Hors ligne & Sync',
    q36: 'Mode hors ligne — mettre en cache albums et listes ?',
    a36: 'Ouvrez un album ou une liste et cliquez sur l\'icône de téléchargement dans l\'en-tête — Psysonic met chaque piste en cache localement pour une lecture sans appel réseau. La page Bibliothèque hors ligne (barre latérale) liste tout ce qui est en cache, montre les téléchargements en cours, et permet de supprimer via l\'icône poubelle (qui apparaît une fois le téléchargement terminé).',
    q37: 'Limite de stockage hors ligne ?',
    a37: 'Paramètres → Bibliothèque → Hors ligne permet de définir une taille maximale de cache. Quand la limite est atteinte, le bouton de téléchargement de la page album affiche un avertissement. Libérez de l\'espace en supprimant des albums ou listes depuis la page Bibliothèque hors ligne.',
    q38: 'Device Sync — copier la musique sur USB / SD ?',
    a38: 'Device Sync (barre latérale) copie albums, listes ou artistes entiers vers un disque externe pour l\'écoute hors ligne sur d\'autres appareils. Choisissez un dossier cible, sélectionnez les sources dans les onglets de navigation, cliquez « Transférer vers le périphérique ». Psysonic écrit un manifeste (psysonic-sync.json) pour savoir quels fichiers sont déjà là, même si vous rouvrez Device Sync sur un autre OS avec un autre modèle de nom. Les modèles supportent les jetons {artist} / {album} / {title} / {track_number} / {disc_number} / {year} avec / comme séparateur de dossier.',
    s10: 'Intégrations & Dépannage',
    q39: 'Scrobbling Last.fm ?',
    a39: 'Paramètres → Intégrations → Last.fm. Connectez votre compte une fois et Psysonic scrobble directement vers Last.fm — pas besoin de configurer Navidrome. Un scrobble est envoyé après 50 % d\'écoute. Les pings « now playing » partent au début.',
    q40: 'Discord Rich Presence ?',
    a40: 'Paramètres → Intégrations → Discord affiche la piste en cours sur votre profil Discord. Choisissez entre l\'icône de l\'app, la pochette de votre serveur (via getAlbumInfo2 — serveur publiquement joignable nécessaire) ou les pochettes Apple Music. Personnalisez les chaînes affichées (détails, état, info-bulle) avec des templates de jetons.',
    q41: 'Dates de tournée Bandsintown ?',
    a41: 'Activation dans Paramètres → Intégrations → Now Playing Info. L\'onglet Now Playing sur la page éponyme affiche alors les dates de tournée à venir pour l\'artiste en cours via l\'API widget Bandsintown. Désactivé par défaut — aucune requête tant que vous n\'activez pas.',
    q42: 'Internet Radio — lecture de flux en direct ?',
    a42: 'Internet Radio (barre latérale) lit n\'importe quel flux en direct stocké sur votre serveur Navidrome (ajoutez les stations via l\'admin Navidrome). La lecture passe par le moteur HTML5 du navigateur — la plupart des réglages EQ / Replay Gain / Loudness ne s\'appliquent pas à la radio, mais les métadonnées ICY (titre courant) s\'affichent. Supporte MP3, AAC, OGG Vorbis et la plupart des flux HLS ; le support codec dépend de la plateforme.',
    q43: 'Le test de connexion échoue — que faire ?',
    a43: 'Vérifiez l\'URL avec le port (ex. http://192.168.1.100:4533). Sur le réseau local, http:// fonctionne souvent là où https:// ne marche pas (pas de certificat). Assurez-vous qu\'aucun pare-feu ne bloque le port et que nom d\'utilisateur et mot de passe sont corrects. Avec un reverse-proxy, essayez d\'abord l\'URL directe pour isoler la cause.',
    q44: 'Les pochettes et images d\'artiste se chargent lentement.',
    a44: 'Les images sont récupérées du serveur à la première vue puis mises en cache localement pour 30 jours. Si le stockage du serveur est lent, la première visite d\'une page peut prendre un instant ; les visites suivantes sont instantanées. Le Hot Cache aide aussi pour les pistes mais le cache d\'images est indépendant.',
    q45: 'Problèmes Linux — écran noir ou pas de son ?',
    a45: 'L\'écran noir est généralement un souci de pilote GPU / EGL dans WebKitGTK — lancez avec GDK_BACKEND=x11 WEBKIT_DISABLE_COMPOSITING_MODE=1 WEBKIT_DISABLE_DMABUF_RENDERER=1 (les installeurs AUR / .deb / .rpm le font automatiquement). Pour le son, vérifiez que PipeWire ou PulseAudio tourne. Les coupures audio après mise en veille sont désormais gérées automatiquement par le hook de récupération post-sleep.',
  },
  queue: {
    title: 'File d\'attente',
    savePlaylist: 'Enregistrer la liste',
    updatePlaylist: 'Mettre à jour la liste',
    filterPlaylists: 'Filtrer les listes…',
    playlistName: 'Nom de la liste',
    cancel: 'Annuler',
    save: 'Enregistrer',
    loadPlaylist: 'Charger une liste',
    loading: 'Chargement…',
    noPlaylists: 'Aucune liste trouvée.',
    load: 'Remplacer la file et lire',
    appendToQueue: 'Ajouter à la file',
    delete: 'Supprimer',
    deleteConfirm: 'Supprimer la liste « {{name}} » ?',
    clear: 'Vider',
    shuffle: 'Mélanger la file',
    gapless: 'Sans blanc',
    crossfade: 'Fondu',
    infiniteQueue: 'File infinie',
    autoAdded: '— Ajouté automatiquement —',
    radioAdded: '— Radio —',
    hide: 'Masquer',
    hideNowPlaying: 'Masquer les infos de lecture',
    showNowPlaying: 'Afficher les infos de lecture',
    close: 'Fermer',
    nextTracks: 'Pistes suivantes',
    shareQueue: 'Copier le lien de la file d’attente',
    shareQueueEmpty: 'La file d’attente est vide — rien à partager.',
    emptyQueue: 'La file d\'attente est vide.',
    trackSingular: 'piste',
    trackPlural: 'pistes',
    showRemaining: 'Afficher le temps restant',
    showTotal: 'Afficher la durée totale',
    showEta: 'Afficher l\'heure de fin estimée',
    replayGain: 'ReplayGain',
    rgTrack: 'T {{db}} dB',
    rgAlbum: 'A {{db}} dB',
    rgPeak: 'Pic {{pk}}',
    sourceOffline: 'Lecture depuis la bibliothèque hors ligne',
    sourceHot: 'Lecture depuis le cache',
    sourceStream: 'Lecture depuis le flux réseau',
    clearCachedLoudnessWaveform: 'Clear cached loudness and waveform, then re-analyze this track',
    recalculatingLoudnessWaveform: 'Recalculating loudness and waveform for this track…',
  },
  miniPlayer: {
    showQueue: 'Afficher la file',
    hideQueue: 'Masquer la file',
    pinOnTop: 'Toujours visible',
    pinOff: 'Désépingler',
    openMainWindow: 'Ouvrir la fenêtre principale',
    close: 'Fermer',
    emptyQueue: 'La file est vide',
  },
  statistics: {
    title: 'Statistiques',
    recentlyPlayed: 'Écoutés récemment',
    mostPlayed: 'Albums les plus écoutés',
    highestRated: 'Albums les mieux notés',
    genreDistribution: 'Répartition par genre (Top 20)',
    loadMore: 'Charger plus',
    statArtists: 'Artistes',
    statArtistsTooltip: 'Artistes d\'album uniquement — les artistes apparaissant seulement sur des pistes (featuring, invité, etc.) sans album propre ne sont pas comptés.',
    statAlbums: 'Albums',
    statSongs: 'Morceaux',
    statGenres: 'Genres',
    statPlaytime: 'Durée totale',
    genreInsights: 'Aperçu des genres',
    formatDistribution: 'Distribution des formats',
    formatSample: 'Échantillon de {{n}} pistes',
    computing: 'Calcul en cours…',
    genreSongs: '{{count}} morceaux',
    genreAlbums: '{{count}} albums',
    recentlyAdded: 'Ajoutés récemment',
    decadeDistribution: 'Albums par décennie',
    decadeAlbums_one: '{{count}} album',
    decadeAlbums_other: '{{count}} albums',
    decadeUnknown: 'Inconnu',
    lfmTitle: 'Stats Last.fm',
    lfmTopArtists: 'Artistes favoris',
    lfmTopAlbums: 'Albums favoris',
    lfmTopTracks: 'Morceaux favoris',
    lfmPlays: '{{count}} écoutes',
    lfmPeriodOverall: 'Tout le temps',
    lfmPeriod7day: '7 jours',
    lfmPeriod1month: '1 mois',
    lfmPeriod3month: '3 mois',
    lfmPeriod6month: '6 mois',
    lfmPeriod12month: '12 mois',
    lfmNotConnected: 'Connectez Last.fm dans les Paramètres pour voir vos stats.',
    lfmRecentTracks: 'Scrobbles récents',
    lfmNowPlaying: 'En cours de lecture',
    lfmJustNow: 'à l\'instant',
    lfmMinutesAgo: 'il y a {{n}} min',
    lfmHoursAgo: 'il y a {{n}}h',
    lfmDaysAgo: 'il y a {{n}}j',
    topRatedSongs: 'Morceaux les mieux notés',
    topRatedArtists: 'Artistes les mieux notés',
    noRatedSongs: 'Aucun morceau noté. Notez des morceaux dans la vue album ou playlist.',
    noRatedArtists: 'Aucun artiste noté.',
  },
  player: {
    regionLabel: 'Lecteur de musique',
    openFullscreen: 'Ouvrir le lecteur plein écran',
    fullscreen: 'Lecteur plein écran',
    closeFullscreen: 'Fermer le plein écran',
    closeTooltip: 'Fermer (Échap)',
    noTitle: 'Sans titre',
    stop: 'Arrêter',
    prev: 'Piste précédente',
    play: 'Lecture',
    pause: 'Pause',
    previewActive: 'Aperçu en cours',
    previewLabel: 'Aperçu',
    delayModalTitle: 'Minuteur',
    delayPauseSection: 'Pause après',
    delayStartSection: 'Démarrage après',
    delayPreviewPause: 'Pause à',
    delayPreviewStart: 'Démarrage à',
    delaySchedulePause: 'Programmer la pause',
    delayScheduleStart: 'Programmer le démarrage',
    delayCancelPause: 'Annuler le minuteur de pause',
    delayCancelStart: 'Annuler le minuteur de démarrage',
    delayInactivePause: 'Disponible uniquement pendant la lecture.',
    delayInactiveStart: 'Disponible en pause avec une piste ou une radio chargée.',
    delayCustomMinutes: 'Délai personnalisé (minutes)',
    delayCustomPlaceholder: 'ex. 2,5',
    closeDelayModal: 'Fermer',
    delayIn: 'dans',
    delayFmtSec: '{{n}} s',
    delayFmtMin: '{{n}} min',
    delayFmtHr: '{{n}} h',
    delayCancel: 'Annuler',
    delayApply: 'Appliquer',
    next: 'Piste suivante',
    repeat: 'Répéter',
    repeatOff: 'Désactivé',
    repeatAll: 'Tout',
    repeatOne: 'Un',
    progress: 'Progression',
    volume: 'Volume',
    toggleQueue: 'Afficher/masquer la file',
    collapseQueueResize: 'Réduire la file, redimensionner',
    moreOptions: 'Plus d’options',
    equalizer: 'Égaliseur',
    miniPlayer: 'Mini-lecteur',
    lyrics: 'Paroles',
    fsLyricsToggle: 'Paroles en plein écran',
    lyricsLoading: 'Chargement des paroles…',
    lyricsNotFound: 'Aucune parole trouvée pour ce titre',
    lyricsSourceServer: 'Source : Serveur',
    lyricsSourceLrclib: 'Source : LRCLIB',
    lyricsSourceNetease: 'Source : Netease',
    lyricsSourceLyricsplus: 'Source : YouLyPlus',
    showDuration: 'Afficher la durée',
    showRemainingTime: 'Afficher le temps restant',
  },
  nowPlayingInfo: {
    tab: 'Info',
    empty: 'Lancez une lecture pour voir les infos',
    artist: 'Artiste',
    songInfo: 'Infos du morceau',
    onTour: 'En tournée',
    noTourEvents: 'Aucun concert à venir',
    tourLoading: 'Chargement…',
    poweredByBandsintown: 'Données de tournée via Bandsintown',
    bioReadMore: 'En lire plus',
    bioReadLess: 'Réduire',
    showMoreTours_one: 'Afficher {{count}} de plus',
    showMoreTours_other: 'Afficher {{count}} de plus',
    showLessTours: 'Réduire',
    enableBandsintownPrompt: 'Afficher les prochaines dates de tournée ?',
    enableBandsintownPromptDesc: 'Optionnel. Charge les concerts de l\'artiste via l\'API publique Bandsintown.',
    enableBandsintownPrivacy: 'Lors de l\'activation, le nom de l\'artiste en cours de lecture est envoyé à l\'API Bandsintown pour récupérer les dates de tournée. Aucun compte ni données personnelles ne quittent votre appareil.',
    enableBandsintownAction: 'Activer',
    role: {
      artist: 'Artiste',
      albumArtist: 'Artiste de l\'album',
      composer: 'Compositeur',
    },
  },
  songInfo: {
    title: 'Infos du morceau',
    songTitle: 'Titre',
    artist: 'Artiste',
    album: 'Album',
    albumArtist: 'Artiste de l\'album',
    year: 'Année',
    genre: 'Genre',
    duration: 'Durée',
    track: 'Piste',
    format: 'Format',
    bitrate: 'Débit',
    sampleRate: 'Fréquence d\'échantillonnage',
    bitDepth: 'Profondeur de bits',
    channels: 'Canaux',
    fileSize: 'Taille du fichier',
    path: 'Emplacement',
    replayGainTrack: 'RG Gain de piste',
    replayGainAlbum: 'RG Gain d\'album',
    replayGainPeak: 'RG Crête de piste',
    mono: 'Mono',
    stereo: 'Stéréo',
  },
  playlists: {
    title: 'Playlists',
    newPlaylist: 'Nouvelle playlist',
    unnamed: 'Playlist sans nom',
    createName: 'Nom de la playlist…',
    create: 'Créer',
    cancel: 'Annuler',
    empty: 'Aucune playlist pour l\'instant.',
    emptyPlaylist: 'Cette playlist est vide.',
    addFirstSong: 'Ajouter votre premier titre',
    notFound: 'Playlist introuvable.',
    songs: '{{n}} titres',
    playAll: 'Tout lire',
    shuffle: 'Aléatoire',
    addToQueue: 'Ajouter à la file',
    back: 'Retour aux playlists',
    deletePlaylist: 'Supprimer',
    confirmDelete: 'Cliquer à nouveau pour confirmer',
    removeSong: 'Retirer de la playlist',
    addSongs: 'Ajouter des titres',
    searchPlaceholder: 'Rechercher dans la bibliothèque…',
    noResults: 'Aucun résultat.',
    suggestions: 'Titres suggérés',
    noSuggestions: 'Aucune suggestion disponible.',
    titleBadge: 'Playlist',
    refreshSuggestions: 'Nouvelles suggestions',
    addSong: 'Ajouter à la playlist',
    preview: 'Aperçu (30 s)',
    previewStop: 'Arrêter l\'aperçu',
    playNextSuggestion: 'Lire ensuite',
    suggestionsHint: "Double-cliquez sur une ligne pour l'ajouter à la playlist",
    addSelected: 'Ajouter la sélection',
    cacheOffline: 'Mettre la playlist hors ligne',
    offlineCached: 'Playlist en cache',
    removeOffline: 'Retirer du cache hors ligne',
    offlineDownloading: 'En cache… ({{done}}/{{total}} albums)',
    publicLabel: 'Publique',
    privateLabel: 'Privée',
    editMeta: 'Modifier la playlist',
    editNamePlaceholder: 'Nom de la playlist…',
    editCommentPlaceholder: 'Ajouter une description…',
    editPublic: 'Playlist publique',
    editSave: 'Enregistrer',
    editCancel: 'Annuler',
    changeCover: 'Changer la pochette',
    changeCoverLabel: 'Changer la photo',
    removeCover: 'Supprimer la photo',
    coverUpdated: 'Pochette mise à jour',
    metaSaved: 'Playlist mise à jour',
    downloadZip: 'Télécharger (ZIP)',
    // Toast notifications for multi-select
    addSuccess: '{{count}} morceaux ajoutés à {{playlist}}',
    addPartial: '{{added}} ajoutés, {{skipped}} ignorés (doublons)',
    addAllSkipped: 'Tous ignorés ({{count}} doublons)',
    addedAsDuplicates: '{{count}} morceaux ajoutés à {{playlist}} (en doublons)',
    duplicateConfirmTitle: 'Déjà dans la playlist',
    duplicateConfirmMessage: 'Les {{count}} morceaux sont déjà dans « {{playlist}} ». Les ajouter quand même en doublons ?',
    duplicateConfirmAction: 'Ajouter quand même',
    addError: 'Erreur lors de l\'ajout des morceaux',
    createAndAddSuccess: 'Playlist "{{playlist}}" créée avec {{count}} morceaux',
    createError: 'Erreur lors de la création de la playlist',
    deleteSuccess: '{{count}} playlists supprimées',
    deleteFailed: 'Erreur lors de la suppression de {{name}}',
    deleteSelected: 'Supprimer la sélection',
    deleteSelectedPartial: 'Seulement {{n}} des {{total}} playlists sélectionnées peuvent être supprimées (les autres appartiennent à quelqu\'un d\'autre).',
    mergeSuccess: '{{count}} morceaux fusionnés dans {{playlist}}',
    mergeNoNewSongs: 'Aucun nouveau morceau à ajouter',
    mergeError: 'Erreur lors de la fusion des playlists',
    mergeInto: 'Fusionner dans',
    selectionCount: '{{count}} sélectionnés',
    select: 'Sélectionner',
    startSelect: 'Activer la sélection',
    cancelSelect: 'Annuler',
    loadingAlbums: 'Résolution de {{count}} albums…',
    loadingArtists: 'Résolution de {{count}} artistes…',
    myPlaylists: 'Mes Playlists',
    noOtherPlaylists: 'Aucune autre playlist disponible',
    addToPlaylistSuccess: '{{count}} morceaux ajoutés à {{playlist}}',
    addToPlaylistNoNew: 'Aucun nouveau morceau pour {{playlist}}',
    addToPlaylistError: 'Erreur lors de l\'ajout à la playlist',
    removeSuccess: 'Morceau retiré de la playlist',
    removeError: 'Erreur lors du retrait de la playlist',
    importCSV: 'Importer CSV',
    importCSVTooltip: 'Importer depuis CSV Spotify',
    csvImportReport: 'Rapport d\'Import CSV',
    csvImportTotal: 'Total',
    csvImportAdded: 'Ajoutés',
    csvImportDuplicates: 'Doublons',
    csvImportNotFound: 'Non Trouvés',
    csvImportNetworkErrors: 'Erreurs Réseau',
    csvImportDuplicatesTitle: 'Titres en Doublon (Déjà dans la Playlist):',
    csvImportNotFoundTitle: 'Titres Non Trouvés:',
    csvImportNetworkErrorsTitle: 'Erreurs Réseau (peut réessayer l\'import):',
    csvImportDownloadReport: 'Télécharger le Rapport',
    csvImportClose: 'Fermer',
    csvImportNoValidTracks: 'Aucun titre valide trouvé dans le fichier CSV',
    csvImportFailed: 'Échec de l\'import CSV',
    csvImportToast: '{{added}} ajoutés, {{notFound}} non trouvés, {{duplicates}} doublons',
    csvImportDownloadSuccess: 'Rapport téléchargé avec succès',
    csvImportDownloadError: 'Échec du téléchargement du rapport',
  },
  smartPlaylists: {
    sectionBasic: '1. Base',
    sectionGenres: '2. Genres',
    sectionYearsAndFilters: '3. Années et filtres',
    genreMode: 'Mode des genres',
    genreModeInclude: 'Inclure les genres',
    genreModeExclude: 'Exclure les genres',
    genreSearchPlaceholder: 'Filtrer les genres...',
    availableGenres: 'Disponibles',
    selectedGenres: 'Sélectionnés',
    yearMode: 'Mode des années',
    yearModeInclude: 'Inclure la plage',
    yearModeExclude: 'Exclure la plage',
    name: 'Nom (sans préfixe)',
    limit: 'Limite',
    limitHint: 'Nombre de morceaux à inclure dans la playlist (1-{{max}}, généralement 50).',
    artistContains: 'Artiste contient…',
    albumContains: 'Album contient…',
    titleContains: 'Titre contient…',
    minRating: 'Note minimale',
    minRatingAria: 'Note minimale pour playlist intelligente',
    minRatingHint: '0 désactive le seuil minimum; 1-5 conserve les morceaux avec une note supérieure à la valeur choisie.',
    fromYear: 'Depuis l\'année',
    toYear: 'Jusqu\'à l\'année',
    excludeUnrated: 'Exclure les morceaux non notés',
    compilationOnly: 'Compilations uniquement',
    create: 'Nouvelle Smart Playlist',
    save: 'Enregistrer la Smart Playlist',
    created: '{{name}} créée',
    updated: '{{name}} mise à jour',
    createFailed: 'Impossible de créer la smart playlist.',
    updateFailed: 'Impossible de mettre à jour la smart playlist.',
    navidromeOnly: 'Les smart playlists ne peuvent être créées que sur des serveurs Navidrome.',
    loadFailed: 'Impossible de charger les smart playlists depuis Navidrome.',
    sortRandom: 'Tri : aléatoire',
    sortTitleAsc: 'Tri : titre A-Z',
    sortTitleDesc: 'Tri : titre Z-A',
    sortYearDesc: 'Tri : année décroissante',
    sortYearAsc: 'Tri : année croissante',
    sortPlayCountDesc: 'Tri : nombre d\'écoutes décroissant',
  },
  mostPlayed: {
    title: 'Les plus joués',
    topArtists: 'Artistes populaires',
    topAlbums: 'Albums populaires',
    plays: '{{n}} écoutes',
    sortMost: 'Plus joués en premier',
    sortLeast: 'Moins joués en premier',
    loadMore: 'Charger plus d\'albums',
    noData: 'Aucune donnée d\'écoute. Commencez à écouter !',
    noArtists: 'Tous les artistes filtrés.',
    filterCompilations: 'Masquer les artistes de compilations (Various Artists, Soundtracks, etc.)',
    filterCompilationsShort: 'Masquer les compilations',
  },
  losslessAlbums: {
    empty: 'Aucun album lossless dans cette bibliothèque pour l\'instant.',
    unsupported: 'Ce serveur n\'expose pas les métadonnées nécessaires pour trouver des albums lossless.',
    slowFetchHint: 'Chargement plus lent que les autres pages d\'albums — Psysonic parcourt tout le catalogue par qualité.',
  },
  radio: {
    title: 'Radio Internet',
    empty: 'Aucune station radio configurée.',
    addStation: 'Ajouter une station',
    editStation: 'Modifier',
    deleteStation: 'Supprimer la station',
    confirmDelete: 'Cliquer à nouveau pour confirmer',
    stationName: 'Nom de la station…',
    streamUrl: 'URL du flux…',
    homepageUrl: 'URL de la page d\'accueil (optionnel)',
    save: 'Enregistrer',
    cancel: 'Annuler',
    live: 'LIVE',
    liveStream: 'Radio Internet',
    openHomepage: 'Ouvrir la page d\'accueil',
    changeCoverLabel: 'Changer la pochette',
    removeCover: 'Supprimer la pochette',
    browseDirectory: 'Parcourir l\'annuaire',
    directoryPlaceholder: 'Rechercher des stations…',
    noResults: 'Aucune station trouvée.',
    stationAdded: 'Station ajoutée',
    filterAll: 'Toutes',
    filterFavorites: 'Favoris',
    sortManual: 'Manuel',
    sortAZ: 'A → Z',
    sortZA: 'Z → A',
    sortNewest: 'Plus récentes',
    favorite: 'Ajouter aux favoris',
    unfavorite: 'Retirer des favoris',
    noFavorites: 'Aucune station favorite.',
    listenerCount_one: '{{count}} auditeur',
    listenerCount_other: '{{count}} auditeurs',
    recentlyPlayed: 'Récemment joués',
    upNext: 'À suivre',
  },
  folderBrowser: {
    empty: 'Dossier vide',
    error: 'Échec du chargement',
  },
  deviceSync: {
    title: 'Sync appareil',
    targetFolder: 'Dossier cible',
    noFolderChosen: 'Aucun dossier sélectionné',
    selectDrive: 'Sélectionner un lecteur…',
    refreshDrives: 'Actualiser les lecteurs',
    noDrivesDetected: 'Aucun lecteur amovible détecté',
    browseManual: 'Parcourir manuellement…',
    free: 'libre',
    notMountedVolume: 'La cible n\u0027est pas sur un volume monté. Le lecteur a peut-être été déconnecté.',
    chooseFolder: 'Choisir…',
    filenameTemplate: 'Modèle de nom de fichier',
    targetDevice: 'Appareil cible',
    templateHint: 'Variables : {artist}, {album}, {title}, {track_number}, {disc_number}, {year}',
    cleanupButton: 'Supprimer les fichiers absents',
    cleanupNothingToDelete: 'Rien à supprimer — l\'appareil est déjà synchronisé.',
    confirmCleanup: 'Supprimer {{count}} fichier(s) de l\'appareil qui ne font pas partie de la sélection actuelle. Continuer ?',
    cleanupComplete: '{{count}} fichier(s) supprimé(s) de l\'appareil.',
    selectedSources: 'Sources sélectionnées',
    noSourcesSelected: 'Aucune source sélectionnée. Cliquez sur des éléments dans le navigateur pour les ajouter.',
    clearAll: 'Tout effacer',
    tabPlaylists: 'Listes de lecture',
    tabAlbums: 'Albums',
    tabArtists: 'Artistes',
    searchPlaceholder: 'Rechercher…',
    syncButton: 'Synchroniser vers l\'appareil',
    actionTransfer: 'Transférer vers l\'appareil',
    actionDelete: 'Supprimer de l\'appareil',
    actionApplyAll: 'Appliquer toutes les modifications',
    templatePreview: 'Aperçu',
    templatePresetStandard: 'Standard',
    templatePresetMultiDisc: 'Multi-Disc',
    templatePresetAltFolder: 'Dossier alt.',
    tokenSlashHint: '/ = séparateur de dossier',
    cancel: 'Annuler',
    noTargetDir: 'Veuillez d\'abord choisir un dossier cible.',
    noSources: 'Veuillez sélectionner au moins une source.',
    noTracks: 'Aucune piste trouvée dans les sources sélectionnées.',
    fetchError: 'Échec du chargement des pistes depuis le serveur.',
    syncComplete: 'Synchronisation terminée.',
    dismiss: 'Fermer',
    cancelSync: 'Annuler',
    syncCancelled: 'Synchronisation annulée ({{done}} / {{total}} transférés).',
    colName: 'Nom',
    colType: 'Type',
    colStatus: 'Statut',
    onDevice: 'Gestionnaire d\'appareil',
    addSources: 'Ajouter…',
    syncResult: '{{done}} transféré(s), {{skipped}} déjà à jour ({{total}} au total)',
    deleteFromDevice: 'Marquer pour suppression ({{count}})',
    confirmDelete: 'Supprimer {{count}} élément(s) du périphérique : {{names}} ?',
    deleteComplete: '{{count}} élément(s) supprimé(s) du périphérique.',
    manifestImported: '{{count}} source(s) importée(s) depuis le manifeste du périphérique.',
    statusSynced: 'Synchronisé',
    statusPending: 'En attente',
    statusDeletion: 'Suppression',
    markForDeletion: 'Marquer pour suppression',
    removeSource: 'Supprimer',
    undoDeletion: 'Annuler la suppression',
    syncInBackground: 'Sync démarré en arrière-plan — vous pouvez naviguer ailleurs.',
    syncInProgress: '{{done}} / {{total}} pistes…',
    syncSummary: 'Résumé de la synchronisation',
    calculating: 'Calcul de la charge utile…',
    filesToAdd: 'Fichiers à ajouter :',
    filesToDelete: 'Fichiers à supprimer :',
    netChange: 'Variation nette :',
    availableSpace: 'Espace disque disponible :',
    spaceWarning: 'Attention : L\'appareil cible ne dispose pas d\'assez d\'espace signalé.',
    proceed: 'Procéder à la synchronisation',
    notEnoughSpace: 'Espace disque physique insuffisant détecté !',
    liveSearch: 'Live',
    randomAlbumsLabel: 'Albums aléatoires',
  },
  orbit: {
    triggerLabel: 'Orbit',
    triggerTooltip: 'Démarrer ou rejoindre une session d\'écoute partagée',
    launchCreate: 'Créer une session',
    launchJoin: 'Rejoindre une session',
    launchHelp: 'Comment ça marche ?',
    launchHelpSoon: 'Bientôt disponible',
    joinModalTitle: 'Rejoindre une session Orbit',
    joinModalSub: 'Colle le lien d\'invitation que ton hôte t\'a envoyé.',
    joinModalLinkLabel: 'Lien d\'invitation',
    joinModalLinkPlaceholder: 'psysonic2-…',
    joinModalLinkHelper: 'Fonctionne avec tout lien Orbit valide. Doit pointer vers le serveur auquel tu es actuellement connecté.',
    joinModalPasteTooltip: 'Coller depuis le presse-papiers',
    joinModalSubmit: 'Rejoindre',
    joinModalBusy: 'Connexion…',
    joinErrEmpty: 'Veuillez coller un lien d\'invitation.',
    joinErrInvalid: 'Cela ne ressemble pas à un lien d\'invitation Orbit.',
    closeAria: 'Fermer',
    heroTitlePrefix: 'Écoute ensemble avec',
    heroTitleBrand: 'Orbit',
    heroSub: 'Démarre une session — les autres utilisateurs de {{server}} écouteront en même temps et pourront suggérer des morceaux.',
    fallbackServer: 'ce serveur',
    tipLan: 'Tu es actuellement connecté via une adresse de réseau local. Les invités hors de ton réseau ne peuvent pas rejoindre — bascule vers une adresse publique dans les paramètres avant de démarrer.',
    tipRemote: 'Pour que des invités hors de ton réseau domestique puissent rejoindre, l\'adresse de ton serveur doit être publiquement accessible. Si ton serveur est interne, bascule avant de démarrer.',
    labelName: 'Nom de la session',
    namePlaceholder: 'Velvet Orbit',
    reshuffleTooltip: 'Nouvelle suggestion',
    reshuffleAria: 'Suggérer un nouveau nom',
    helperName: 'Comment la session apparaîtra à tes invités — garde-le ou saisis le tien.',
    labelMax: 'Invités max.',
    helperMax: 'Tu ne comptes pas — ceci limite uniquement les invités entrants.',
    labelLink: 'Lien d\'invitation',
    tooltipCopied: 'Copié',
    tooltipCopy: 'Copier',
    ariaCopyLink: 'Copier le lien d\'invitation',
    helperLink: 'Envoie ce lien à tes invités. Ils peuvent le coller n\'importe où dans Psysonic avec Ctrl+V.',
    labelClearQueue: 'Vider ma file d\'attente d\'abord',
    helperClearQueue: 'Démarre la session avec une file d\'attente vide. Désactivé : les titres déjà en file restent et sont partagés avec les invités.',
    btnCancel: 'Annuler',
    btnStarting: 'Démarrage…',
    btnStart: 'Démarrer Orbit',
    btnCopyAndStart: 'Copier le lien & démarrer',
    errNameRequired: 'Veuillez donner un nom à ta session.',
    errStartFailed: 'Impossible de démarrer.',
    hostLabel: 'Hôte : {{name}}',
    participantsTooltip: 'Participants',
    settingsTooltip: 'Paramètres de session',
    shareTooltip: 'Partager le lien d\'invitation',
    shuffleLabel: 'Prochain mélange dans',
    catchUpLabel: 'rattraper',
    catchUpTooltip: 'Sauter à la position actuelle de l\'hôte',
    hostAway: 'Hôte hors ligne',
    hostOnline: 'Hôte en ligne',
    endTooltip: 'Terminer la session',
    leaveTooltip: 'Quitter la session',
    helpTooltip: 'Fonctionnement d\'Orbit',
    diag: {
      openTooltip: 'Diagnostic — journal d\'événements copiable',
      title: 'Diagnostic Orbit',
      role: 'Rôle',
      hostTrack: 'ID de piste de l\'hôte',
      hostPos: 'Position de l\'hôte',
      guestTrack: 'Mon ID de piste',
      guestPos: 'Ma position',
      drift: 'Décalage',
      stateAge: 'Âge de l\'état',
      eventLog: 'Journal d\'événements ({{count}})',
      copyLabel: 'Copier',
      copyTooltip: 'Copier le journal dans le presse-papiers',
      clearLabel: 'Effacer',
      clearTooltip: 'Vider le tampon',
      empty: 'Aucun événement — ils apparaissent dès qu\'Orbit synchronise.',
      hint: 'Ouvre ceci avant de reproduire le problème, puis clique Copier et colle dans le rapport.',
      copied: '{{count}} lignes copiées',
      copyFailed: 'Impossible de copier dans le presse-papiers',
      cleared: 'Tampon vidé',
    },
    helpTitle: 'Fonctionnement d\'Orbit',
    helpIntro: 'Orbit transforme Psysonic en salle d\'écoute partagée. Un hôte choisit la musique ; les invités écoutent en synchro et peuvent suggérer des morceaux.',
    helpHostOnly: '(hôte)',
    helpSec1Title: 'Qu\'est-ce qu\'Orbit ?',
    helpSec1Body: 'Un mode « écouter ensemble » — l\'hôte dirige la lecture, les invités écoutent. Tout passe par des playlists sur ton propre serveur Navidrome ; aucune infrastructure externe.',
    helpSec2Title: 'Hôte et invités',
    helpSec2Body: 'L\'hôte contrôle la lecture (play / pause / skip / seek) et décide quand la session se termine. Les invités suivent la lecture, peuvent suggérer des morceaux et quitter ou rejoindre à tout moment. Seul l\'hôte peut exclure ou bannir un participant.',
    helpSec2WarnHead: 'Important : comptes séparés.',
    helpSec2WarnBody: 'Chaque participant a besoin de son propre compte Navidrome. Si l\'hôte et l\'invité utilisent le même utilisateur, leurs soumissions entrent en conflit et l\'hôte ne voit jamais les suggestions de l\'invité.',
    helpSec3Title: 'Démarrer et inviter',
    helpSec3Body: 'Clique sur le bouton « Orbit » → Créer une session → le modal affiche un lien d\'invitation prêt à copier et permet optionnellement de vider ta file actuelle. Partage le lien comme tu veux. Pendant qu\'une session est active, le bouton de partage dans la barre en haut copie le lien à tout moment.',
    helpSec4Title: 'Rejoindre',
    helpSec4Body: 'Colle le lien d\'invitation n\'importe où dans Psysonic avec Ctrl+V / Cmd+V — l\'invite apparaît automatiquement. Alternative : « Orbit » → Rejoindre une session → colle dans le champ. Si le lien pointe vers un serveur où tu as un compte, Psysonic bascule automatiquement. Si tu as plusieurs comptes sur ce serveur, un sélecteur demande lequel utiliser.',
    helpSec5Title: 'Suggérer des morceaux',
    helpSec5Body: 'Dans n\'importe quelle liste : double-clic sur une ligne, ou clic droit → « Ajouter à la session Orbit ». Un simple clic affiche un indice au lieu de jeter tout l\'album dans la file partagée — c\'est intentionnel. Les actions groupées explicites comme « Tout lire » ou « Lire l\'album » demandent d\'abord confirmation puis ajoutent (ne remplacent jamais).',
    helpSec6Title: 'La file d\'attente partagée',
    helpSec6Body: 'La file affiche les morceaux à venir de l\'hôte — visible par tous. Les ajouts groupés sont toujours ajoutés à la fin, pour ne pas perdre les suggestions des invités. Le mélange automatique réorganise la file périodiquement (configurable : 1 / 5 / 10 / 15 / 30 min). Si ta lecture dévie, le bouton « Rattraper » dans la barre te ramène à la position en direct de l\'hôte.',
    helpSec7Title: 'Approbations',
    helpSec7Body: 'Par défaut, les suggestions des invités nécessitent une approbation manuelle — elles apparaissent dans une bande « Approbations » en haut du panneau avec des boutons accepter / refuser. L\'approbation automatique peut être activée dans les paramètres.',
    helpSec8Title: 'Participants et paramètres',
    helpSec8Body: 'Ouvre l\'icône des paramètres dans la barre pour la cadence de mélange, l\'approbation automatique et le raccourci « Mélanger maintenant ». Clique sur le nombre de participants pour voir qui est connecté — exclure (peut rejoindre via le lien) ou bannir (exclu pour la session). Les invités voient la liste en lecture seule.',
    helpSec9Title: 'Terminer la session',
    helpSec9Body: 'X de l\'hôte → dialogue de confirmation → la session se ferme pour tout le monde, les playlists serveur sont nettoyées automatiquement. X de l\'invité → l\'invité part, la session continue. Si l\'hôte reste silencieux 5 minutes, l\'invité part automatiquement avec un avis ; les reconnexions courtes dans ce laps sont invisibles.',
    participantsInviteLabel: 'Lien d\'invitation',
    participantsCountLabel: '{{count}} en session',
    participantsHost: 'hôte',
    participantsEmpty: 'Pas encore d\'invités',
    participantsKickTooltip: 'Retirer de la session',
    participantsKickAria: 'Retirer {{user}}',
    participantsRemoveTooltip: 'Retirer de la session',
    participantsRemoveAria: 'Retirer {{user}} de cette session',
    participantsBanTooltip: 'Bannir définitivement',
    participantsBanAria: 'Bannir définitivement {{user}}',
    participantsMuteTooltip: 'Bloquer les suggestions',
    participantsUnmuteTooltip: 'Autoriser les suggestions',
    participantsMuteAria: 'Bloquer les suggestions de {{user}}',
    participantsUnmuteAria: 'Autoriser à nouveau les suggestions de {{user}}',
    confirmRemoveTitle: 'Retirer de la session ?',
    confirmRemoveBody: '{{user}} sera retiré de la session mais peut rejoindre via ton lien d\'invitation.',
    confirmRemoveConfirm: 'Retirer',
    confirmBanTitle: 'Bannir définitivement ?',
    confirmBanBody: '{{user}} sera retiré et empêché de rejoindre cette session. Irréversible pour la durée de la session.',
    confirmBanConfirm: 'Bannir',
    confirmCancel: 'Annuler',
    confirmJoinTitle: 'Rejoindre la session Orbit ?',
    confirmJoinBody: '{{host}} t\'a invité à « {{name}} ». Rejoindre la session ?',
    confirmJoinConfirm: 'Rejoindre',
    confirmLeaveTitle: 'Quitter la session ?',
    confirmLeaveBody: 'Quitter « {{name}} » ? Tu peux rejoindre à tout moment via le lien d\'invitation de {{host}}.',
    confirmLeaveConfirm: 'Quitter',
    confirmEndTitle: 'Terminer la session pour tout le monde ?',
    confirmEndBody: '« {{name}} » se fermera pour tous les participants. Les playlists de session sont nettoyées automatiquement.',
    confirmEndConfirm: 'Terminer la session',
    invalidLinkTitle: 'Le lien d\'invitation n\'est plus valide',
    invalidLinkBody: 'Cette session Orbit n\'existe plus ou est déjà terminée. Demande à l\'hôte un nouveau lien.',
    settingsTitle: 'Paramètres de session',
    settingAutoApprove: 'Approuver automatiquement les suggestions',
    settingAutoApproveHint: 'Les suggestions arrivent instantanément dans ta file. Désactivé : elles restent dans la liste de session pour révision.',
    settingAutoShuffle: 'Mélange automatique',
    settingAutoShuffleHint: 'Mélange Fisher-Yates périodique de la file à venir. Désactivé : l\'ordre ne change que lorsque tu le réorganises.',
    settingShuffleInterval: 'Remélanger toutes les',
    settingShuffleIntervalHint: 'Fréquence de remélange de la file pendant la session.',
    suggestBlockedMuted: 'L\'hôte t\'a coupé le micro pour cette session — suggestions désactivées.',
    settingShuffleIntervalValue_one: '{{count}} min',
    settingShuffleIntervalValue_other: '{{count}} min',
    settingShuffleNow: 'Mélanger maintenant',
    toastSuggested: '{{user}} a suggéré « {{title}} »',
    toastSuggestedMany: '{{count}} nouvelles suggestions dans la file',
    toastShuffled: 'File mélangée',
    toastJoined: 'Session rejointe',
    toastLoginFirst: 'Connecte-toi avant de rejoindre une session',
    toastSwitchServer: 'Bascule d\'abord vers {{url}}, puis colle à nouveau',
    toastNoAccountForServer: 'Tu n\'as pas accès à {{url}}. Demande à l\'hôte une invitation.',
    toastSwitchFailed: 'Impossible de basculer vers {{url}}',
    accountPickerTitle: 'Quel compte ?',
    accountPickerSub: 'Tu as plusieurs comptes pour {{url}}. Choisis celui avec lequel rejoindre la session.',
    toastJoinFail: 'Impossible de rejoindre la session',
    joinErrNotFound: 'Session introuvable',
    joinErrEnded: 'La session est terminée',
    joinErrFull: 'La session est pleine',
    joinErrKicked: 'Tu ne peux pas rejoindre cette session',
    joinErrNoUser: 'Aucun serveur actif',
    joinErrServerError: 'Impossible de rejoindre',
    ctxAddToSession: 'Ajouter à la session Orbit',
    ctxSuggestedToast: 'Suggéré à la session',
    ctxSuggestFailed: 'Impossible de suggérer — pas rejoint',
    ctxAddToSessionHost: 'Ajouter à la session Orbit',
    ctxAddedHostToast: 'Ajouté à la session',
    ctxAddHostFailed: 'Impossible d\'ajouter à la session',
    bulkConfirmTitle: 'Tout ajouter à la file Orbit ?',
    bulkConfirmBody: 'Cela ajouterait {{count}} morceaux en une fois. C\'est beaucoup pour tes invités. Continuer ?',
    bulkConfirmYes: 'Tout ajouter',
    bulkConfirmNo: 'Annuler',
    guestLive: 'Direct',
    guestPlaying: 'En cours de lecture',
    guestPaused: 'En pause',
    guestLoading: 'Chargement…',
    guestSuggestions: 'Suggestions',
    guestUpNext: 'À suivre',
    guestUpNextEmpty: 'Rien en file. Ouvre le menu contextuel d\'un morceau et choisis « Ajouter à la session Orbit ».',
    guestPendingTitle: 'En attente de l\'hôte',
    guestPendingHint: 'Suggéré — apparaîtra dans la file quand l\'hôte l\'acceptera.',
    approvalTitle: 'Approbations en attente',
    approvalFrom: 'Suggéré par {{user}}',
    approvalAccept: 'Accepter',
    approvalDecline: 'Refuser',
    guestUpNextMore: '+ {{count}} autres dans la file de l\'hôte',
    guestSubmitter: 'par {{user}}',
    queueAddedByHost: 'Ajouté par l\'hôte',
    queueAddedByYou: 'Ajouté par toi',
    queueAddedByUser: 'Ajouté par {{user}}',
    guestEmpty: 'Aucune suggestion. Ouvre le menu contextuel d\'un morceau et choisis « Ajouter à la session Orbit ».',
    guestFooter: 'L\'hôte contrôle la lecture — tu ne peux pas modifier la liste.',
    exitKickedTitle: 'Tu as été banni de la session',
    exitRemovedTitle: 'Tu as été retiré de la session',
    exitEndedTitle: 'L\'hôte a terminé la session',
    exitHostTimeoutTitle: 'L\'hôte ne répond plus',
    exitHostTimeoutBody: '{{host}} n\'a pas envoyé de mise à jour depuis un moment, donc « {{name}} » a été fermée de ton côté. Tu peux rejoindre à tout moment avec le lien.',
    exitKickedBody: '{{host}} t\'a banni de « {{name}} ». Tu ne peux pas rejoindre.',
    exitRemovedBody: '{{host}} t\'a retiré de « {{name}} ». Tu peux rejoindre via le lien à tout moment.',
    exitEndedBody: '« {{name}} » est terminée. J\'espère que tu t\'es bien amusé.',
    exitOk: 'OK',
  },
  tray: {
    playPause: 'Lecture / Pause',
    nextTrack: 'Piste suivante',
    previousTrack: 'Piste précédente',
    showHide: 'Afficher / Masquer',
    exitPsysonic: 'Quitter Psysonic',
    nothingPlaying: 'Aucune lecture',
  },
  licenses: {
    title: 'Licences Open Source',
    intro: 'Psysonic est construit sur des logiciels open source. La liste ci-dessous montre chaque dépendance livrée avec l\'application, avec sa version, sa licence et le texte de licence complet.',
    highlights: 'Dépendances principales',
    searchPlaceholder: 'Rechercher par nom, version ou licence…',
    noResults: 'Aucun résultat.',
    loading: 'Chargement des licences…',
    loadError: 'Impossible de charger les données de licence.',
    noLicenseText: 'Aucun texte de licence groupé pour cette dépendance.',
    viewSource: 'Voir la source',
    totalLine: '{{total}} dépendances — {{cargo}} cargo, {{npm}} npm',
    generatedAt: 'Dernière génération {{date}}',
  },
};
