mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-27 17:06:42 +00:00
feat(device-sync): overhaul Device Sync page
- New two-panel layout with live album search (search3, 300ms debounce) and 10 random albums when search is empty — replaces full paginated load - Pre-sync summary modal: shows files to add/delete, net change, available space; Proceed button disabled when space is insufficient - calculate_sync_payload now filters already-synced tracks (path exists on device) so add_bytes/add_count reflect the true delta - Space check accounts for pending deletions: addBytes > availableBytes + delBytes - Separate deviceSyncJobStore for ephemeral job progress state - Removable drive detection + auto-poll every 5 s via sysinfo - Desired-state diff: de-selecting a synced source stages it for deletion instead of silently removing it - Status badges (Synced / Pending / Deletion) with matching row highlights - Live-Search badge (⚡) and Zufallsalben section label (⇌) in album browser - Status summary row height aligned with search field (52 px) - i18n: all new keys added to all 8 locales (en/de/fr/nl/nb/zh/ru/es) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -17,6 +17,7 @@ export const frTranslation = {
|
||||
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',
|
||||
@@ -1024,8 +1025,15 @@ export const frTranslation = {
|
||||
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é.',
|
||||
@@ -1039,6 +1047,10 @@ export const frTranslation = {
|
||||
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',
|
||||
cancel: 'Annuler',
|
||||
noTargetDir: 'Veuillez d\'abord choisir un dossier cible.',
|
||||
noSources: 'Veuillez sélectionner au moins une source.',
|
||||
@@ -1046,5 +1058,33 @@ export const frTranslation = {
|
||||
fetchError: 'Échec du chargement des pistes depuis le serveur.',
|
||||
syncComplete: 'Synchronisation terminée.',
|
||||
dismiss: 'Fermer',
|
||||
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.',
|
||||
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',
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user