mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 15:25:46 +00:00
feat(device-sync): manifest, cancel, font picker + sync status fix
- Write psysonic-sync.json to device after sync/deletions; auto-import on folder select when localStorage is empty (cross-platform handoff) - Add cancel button during active sync: AtomicBool flag per job, tasks bail after acquiring semaphore, cancelled state in UI - Fix sync status staying "pending": normalize template path separators to OS separator (Windows: '/' → '\') so compute_sync_paths and list_device_dir_files produce matching strings for Set comparison - Add Geist and JetBrains Mono as variable fonts; font picker collapsible - Fix device mount detection on Windows: removable drive letters (E:\) were incorrectly skipped alongside system roots; strip \?\ prefix from canonicalized paths before mount-point comparison Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1085,6 +1085,7 @@ export const deTranslation = {
|
||||
deleteFromDevice: 'Vom Gerät löschen ({{count}})',
|
||||
confirmDelete: '{{count}} Eintrag/Einträge vom Gerät löschen: {{names}}?',
|
||||
deleteComplete: '{{count}} Eintrag/Einträge vom Gerät entfernt.',
|
||||
manifestImported: '{{count}} Quelle(n) aus Geräte-Manifest importiert.',
|
||||
selectedSources: 'Ausgewählte Quellen',
|
||||
noSourcesSelected: 'Keine Quellen ausgewählt. Klicke auf Einträge im Browser um sie hinzuzufügen.',
|
||||
clearAll: 'Alle entfernen',
|
||||
@@ -1104,6 +1105,8 @@ export const deTranslation = {
|
||||
fetchError: 'Fehler beim Laden der Tracks vom Server.',
|
||||
syncComplete: 'Übertragung abgeschlossen.',
|
||||
dismiss: 'Schließen',
|
||||
cancelSync: 'Abbrechen',
|
||||
syncCancelled: 'Sync abgebrochen ({{done}} / {{total}} übertragen).',
|
||||
colStatus: 'Status',
|
||||
statusSynced: 'Synchronisiert',
|
||||
statusPending: 'Ausstehend',
|
||||
|
||||
@@ -1088,6 +1088,7 @@ export const enTranslation = {
|
||||
deleteFromDevice: 'Mark for deletion ({{count}})',
|
||||
confirmDelete: 'Delete {{count}} item(s) from the device: {{names}}?',
|
||||
deleteComplete: '{{count}} item(s) removed from device.',
|
||||
manifestImported: 'Imported {{count}} source(s) from device manifest.',
|
||||
selectedSources: 'Selected Sources',
|
||||
noSourcesSelected: 'No sources selected. Click items in the browser to add them.',
|
||||
clearAll: 'Clear all',
|
||||
@@ -1107,6 +1108,8 @@ export const enTranslation = {
|
||||
fetchError: 'Failed to fetch tracks from server.',
|
||||
syncComplete: 'Sync complete.',
|
||||
dismiss: 'Dismiss',
|
||||
cancelSync: 'Cancel',
|
||||
syncCancelled: 'Sync cancelled ({{done}} / {{total}} transferred).',
|
||||
statusSynced: 'Synced',
|
||||
statusPending: 'Pending',
|
||||
statusDeletion: 'Deletion',
|
||||
|
||||
@@ -1103,6 +1103,8 @@ export const esTranslation = {
|
||||
fetchError: 'Error al obtener pistas del servidor.',
|
||||
syncComplete: 'Sincronización completada.',
|
||||
dismiss: 'Cerrar',
|
||||
cancelSync: 'Cancelar',
|
||||
syncCancelled: 'Sincronización cancelada ({{done}} / {{total}} transferidos).',
|
||||
colName: 'Nombre',
|
||||
colType: 'Tipo',
|
||||
colStatus: 'Estado',
|
||||
@@ -1112,6 +1114,7 @@ export const esTranslation = {
|
||||
deleteFromDevice: 'Marcar para eliminar ({{count}})',
|
||||
confirmDelete: '¿Eliminar {{count}} elemento(s) del dispositivo: {{names}}?',
|
||||
deleteComplete: '{{count}} elemento(s) eliminado(s) del dispositivo.',
|
||||
manifestImported: '{{count}} fuente(s) importada(s) desde el manifiesto del dispositivo.',
|
||||
statusSynced: 'Sincronizado',
|
||||
statusPending: 'Pendiente',
|
||||
statusDeletion: 'Eliminación',
|
||||
|
||||
@@ -1098,6 +1098,8 @@ export const frTranslation = {
|
||||
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',
|
||||
@@ -1107,6 +1109,7 @@ export const frTranslation = {
|
||||
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',
|
||||
|
||||
@@ -1097,6 +1097,8 @@ export const nbTranslation = {
|
||||
fetchError: 'Kunne ikke hente spor fra serveren.',
|
||||
syncComplete: 'Synkronisering fullført.',
|
||||
dismiss: 'Lukk',
|
||||
cancelSync: 'Avbryt',
|
||||
syncCancelled: 'Synkronisering avbrutt ({{done}} / {{total}} overført).',
|
||||
colName: 'Navn',
|
||||
colType: 'Type',
|
||||
colStatus: 'Status',
|
||||
@@ -1106,6 +1108,7 @@ export const nbTranslation = {
|
||||
deleteFromDevice: 'Merk for sletting ({{count}})',
|
||||
confirmDelete: 'Slette {{count}} element(er) fra enheten: {{names}}?',
|
||||
deleteComplete: '{{count}} element(er) fjernet fra enheten.',
|
||||
manifestImported: '{{count}} kilde(r) importert fra enhetsmanifest.',
|
||||
statusSynced: 'Synkronisert',
|
||||
statusPending: 'Venter',
|
||||
statusDeletion: 'Sletting',
|
||||
|
||||
@@ -1097,6 +1097,8 @@ export const nlTranslation = {
|
||||
fetchError: 'Ophalen van nummers van de server mislukt.',
|
||||
syncComplete: 'Synchronisatie voltooid.',
|
||||
dismiss: 'Sluiten',
|
||||
cancelSync: 'Annuleren',
|
||||
syncCancelled: 'Synchronisatie geannuleerd ({{done}} / {{total}} overgebracht).',
|
||||
colName: 'Naam',
|
||||
colType: 'Type',
|
||||
colStatus: 'Status',
|
||||
@@ -1106,6 +1108,7 @@ export const nlTranslation = {
|
||||
deleteFromDevice: 'Markeren voor verwijdering ({{count}})',
|
||||
confirmDelete: '{{count}} item(s) van het apparaat verwijderen: {{names}}?',
|
||||
deleteComplete: '{{count}} item(s) van het apparaat verwijderd.',
|
||||
manifestImported: '{{count}} bron(nen) geïmporteerd uit apparaatmanifest.',
|
||||
statusSynced: 'Gesynchroniseerd',
|
||||
statusPending: 'In behandeling',
|
||||
statusDeletion: 'Verwijdering',
|
||||
|
||||
@@ -1156,6 +1156,8 @@ export const ruTranslation = {
|
||||
fetchError: 'Ошибка загрузки треков с сервера.',
|
||||
syncComplete: 'Синхронизация завершена.',
|
||||
dismiss: 'Закрыть',
|
||||
cancelSync: 'Отмена',
|
||||
syncCancelled: 'Синхронизация отменена ({{done}} / {{total}} перенесено).',
|
||||
colName: 'Название',
|
||||
colType: 'Тип',
|
||||
colStatus: 'Статус',
|
||||
@@ -1165,6 +1167,7 @@ export const ruTranslation = {
|
||||
deleteFromDevice: 'Пометить для удаления ({{count}})',
|
||||
confirmDelete: 'Удалить {{count}} запись(ей) с устройства: {{names}}?',
|
||||
deleteComplete: '{{count}} запись(ей) удалено с устройства.',
|
||||
manifestImported: 'Импортировано {{count}} источник(ов) из манифеста устройства.',
|
||||
statusSynced: 'Синхронизировано',
|
||||
statusPending: 'Ожидает',
|
||||
statusDeletion: 'Удаление',
|
||||
|
||||
@@ -1091,6 +1091,8 @@ export const zhTranslation = {
|
||||
fetchError: '从服务器加载曲目失败。',
|
||||
syncComplete: '同步完成。',
|
||||
dismiss: '关闭',
|
||||
cancelSync: '取消',
|
||||
syncCancelled: '同步已取消(已传输 {{done}} / {{total}})。',
|
||||
colName: '名称',
|
||||
colType: '类型',
|
||||
colStatus: '状态',
|
||||
@@ -1100,6 +1102,7 @@ export const zhTranslation = {
|
||||
deleteFromDevice: '标记为删除({{count}})',
|
||||
confirmDelete: '从设备删除 {{count}} 个项目:{{names}}?',
|
||||
deleteComplete: '已从设备删除 {{count}} 个项目。',
|
||||
manifestImported: '已从设备清单导入 {{count}} 个来源。',
|
||||
statusSynced: '已同步',
|
||||
statusPending: '待处理',
|
||||
statusDeletion: '删除中',
|
||||
|
||||
Reference in New Issue
Block a user