feat(offline): unify local playback, offline library, and favorites sync (#1008)

* feat(local-playback): LP-1 media layout and download_track_local

Add library-index-backed path builder in psysonic-core and a unified
Tauri download command that writes under media/{cache|library}/ with
layout fingerprints; legacy hot/offline commands unchanged for now.

* feat(local-playback): LP-2 localPlaybackStore and media tier Rust helpers

Add unified Zustand index with legacy offline/hot-cache import, media_layout
TS mirror, and Rust commands for tier size/purge/delete/promote.

* feat(local-playback): LP-3 wire prefetch and playback to unified index

Route downloads through download_track_local, delegate hot/offline shims
to localPlaybackStore, and update resolve/promote/prefetch plus key rewrite.

* feat(local-playback): LP-4–LP-6 offline UI, invalidation, and mediaDir

Offline Library loads pinned groups via library index; sync-idle invalidates
stale paths; Settings uses a single mediaDir with cache/library tier sizes.

* feat(local-playback): migrate legacy offline files to media/library layout

Move flat psysonic-offline downloads into nested media/library paths using
library index metadata, with retry on sync-idle when tracks are not yet indexed.

* feat(local-playback): simplify offline disk migration and restore Offline Library UI

Scan psysonic-offline on disk and relocate by library track id; restore pinSource
and cover art for migrated pins; add find_live_by_id for segment/key resolution.

* feat(local-playback): disk-first offline reconcile and fast library tier discovery

Reconcile library-tier index against on-disk files using candidate track IDs
instead of scanning the full catalog. Refresh Offline Library from disk on
open and focus so deleted folders drop out of the UI. Add Rust discover/prune
helpers and wire album/server reconcile through the unified path.

* fix(offline): resolve local playback URLs across server index-key variants

Offline Library play failed when library-tier files were indexed under a
host key while playback looked up only the active profile UUID. Use
findLocalPlaybackEntry for URL resolution, pin queueServerId to the card
server, and build play queues from tracks that still have on-disk bytes.

* fix(offline): playlist cards, playback from Offline Library, and local URL routing

Show playlists with name and quad/custom cover instead of the first track's
album artist. Build play queues with library-batch fallback and offline-only
server switch. Prefer library-tier URLs in playTrack; add playback-unavailable
toast and missing trackToSong import.

* fix(cache): ephemeral disk reconcile, empty-dir prune, and Storage UI

Sweep media/cache after eviction (orphan files, stale index, empty folders).
Settings: split media folder from cover cache; in-browser image cache lives
under Cover art cache with aligned columns; clear only IndexedDB images.

* feat(offline): show library disk usage in Offline Library header

Query media/library tier size on reconcile and display it in a right-aligned
stat block beside the page title and album count.

* fix(cache): defer unindexed hot-cache eviction; drop legacy offline size cap

Reconcile ephemeral cache without deleting files from other app instances;
evict unindexed hot-cache files oldest-first only when over hotCacheMaxMb.
Remove the hidden maxCacheMb gate and offline-full banner on album pages.

* feat(offline): play-all cache card and stable Offline Library grid rows

Add a shuffle-and-play card for all on-disk library pins plus hot-cache
tracks when buffering is enabled. Fix virtual row height for offline cards
and reserve the year line so grid rows no longer overlap.

* feat(offline): queue-cache grid card limited to media/cache

Replace the full-width play-all banner with a playlist-style grid tile.
Shuffle/enqueue only ephemeral hot-cache tracks when buffering is enabled,
not offline library pins.

* chore(licenses): regenerate bundled OSS list for 1.48.0-dev

Set GPL-3.0-or-later on workspace crates and extend cargo-about accepted
licenses so generate-licenses.mjs runs; refresh src/data/licenses.json.

* feat(favorites): auto-sync starred tracks into separate media/favorites tier

Keep manual Offline Library in media/library/ and favorites offline in
favorite-auto/index + media/favorites/ so toggling sync cannot purge
user-pinned bytes; playback resolves library before favorites.

* feat(favorites): compact offline toggle with disk icon and sync semaphore

Move control to the page header (disk + switch, tooltips); show red/yellow/green
LED when enabled instead of the full-width save-offline card.

* fix(favorites): trigger offline sync on star/unstar from anywhere

Hook star/unstar API so favorites offline reconcile runs globally (songs,
albums, artists); optimistic unstar removes local bytes; drop Favorites-page-only sync.

* fix(cache): skip hot-cache prefetch when favorites or library bytes exist

Treat favorite-auto tier like offline library for prefetch, stream promote,
and same-track replay so synced favorites are not duplicated in media/cache.

* fix(favorites): reconcile offline files on merged track union only

Dedupe artist/album/song stars into one target set per track id; drop eager
unstar deletes so overlapping favorites do not remove bytes still needed.

* feat(offline): add Favorites card to Offline Library

Mirror queue-cache card for favorite-auto tier with play, enqueue, and
navigation to Favorites on card click.

* feat(offline): show library+favorites disk total with icon breakdown

Sum media/library and media/favorites in the On disk widget and open an
icon popover on hover with per-tier sizes for screen readers and sighted users.

* feat(favorites): enable offline Favorites tab when auto-save is on

Keep Favorites in the sidebar when disconnected, land on /favorites without
manual pins, and load starred rows from the local library index.

* feat(favorites): cross-server offline browse with per-server covers

When auto-save is on, Favorites merges starred items from every indexed
server and syncs each server independently. Detail links carry ?server=
for offline album/artist pages; cover art resolves disk cache by entity
serverId instead of the active server only.

* feat(playback): mixed-server queue scope and cross-server favorites sync

Per-ref server identity for playback (URL index key in queue refs, profile
UUID for API): trackServerScope, playbackServer helpers, gapless/scrobble/covers
by playing ref. Remove cross-server enqueue block; remap queueItems on URL
remigration.

Favorites: star/unstar and favorite-auto sync target the owning serverId
(not only active); queueSongStar passes server through pending sync.

* fix(offline): suppress Subsonic calls during favorites and local playback

Add reachability guards so offline favorites browse, album detail, queue
sync, scrobble, and Now Playing metadata skip network when the server is
down or the track plays from psysonic-local. Load starred albums/tracks
from the library index only (not the full artist table), refresh favorites
from index first, and pass server scope in favorites navigation.

* fix(queue): export share and playlist save for active server only

Mixed-server queues now filter queue refs by the browsed server profile
before copying a share link or saving/updating a playlist from the toolbar.

* fix(offline): complete album pins and resume interrupted downloads

Prefer full getAlbum track lists when online so partial library index
does not truncate offline pins; refresh songs before pin from album
detail. Resume incomplete persisted pins after reconcile and reconnect,
cancel in-flight work on delete, and chunk library batch fetches past
100 refs.

* fix(offline): pin queue, queued UI, and re-pin after remove

Serialize album and playlist offline pins so parallel enqueue no longer
drops in-flight work. Show an explicit queued state on album and playlist
actions with dequeue on repeat click, sidebar tooltips for long labels,
and clear stale cancel flags so Make available offline works after remove.

* fix(offline): remove Offline Library cards without full page reload

Optimistically drop the deleted card from local grid state, show the
loading spinner only on first visit, and ignore stale disk refreshes so
pin updates no longer flash the whole library view.

* fix(offline): artist discography pin state and queue handling

Detect cached/queued/downloading from persisted album pins instead of
ephemeral bulkProgress, skip already offline or in-flight albums when
enqueueing discography, and show the correct hero button after revisit.

* fix(local-playback): address LP-1 review handoff (B1, M1–M7)

Harden media path sanitization and tier containment, align Rust/TS layout
fingerprints, serialize per-track downloads, and fix favorites re-enable,
multi-server debounce, prev-track promote key, now-playing reachability,
and ephemeral prefetch soft-skip for unindexed tracks.

* fix(offline): cancel in-flight favorites downloads on unstar

Abort Rust streams with the real favorites downloadId when sync is
rescheduled or disabled, and drop completed bytes that no longer belong
in the starred set so unstar does not leave orphan files on disk.

* fix(build): resolve TypeScript errors blocking prod nix build

Align mediaLayout with LibraryTrackDto camelCase, extend analysis-sync
reasons, fix OfflineLibrary grid cover typing, and tighten vitest mocks
so `tsc && vite build` passes under the flake beforeBuildCommand.

* fix(rust): satisfy clippy too_many_arguments for CI

Bundle offline-library analysis and local path/migration helpers into
parameter structs so `cargo clippy -D warnings` passes on the branch.

* fix(settings): show correct hot-cache track count in Buffering section

Count ephemeral localPlayback rows instead of prefix-matching index keys,
which always missed host:port server segments and showed zero tracks.

* fix(media-layout): align truncation threshold on code points (M1)

Rust sanitize_and_truncate_segment now uses char count like TS so long
non-ASCII metadata does not diverge layout fingerprints; add Cyrillic
parity tests and clarify ephemeral cold-miss doc on download_track_local.

* fix(test): use numeric cachedAt in hotCacheStore count test

Align test fixture with LocalPlaybackEntry type so tsc passes in CI.

* docs: add CHANGELOG and credits for offline experience PR #1008

* feat(offline): auto-sync manually cached playlists when track list changes

Re-download new tracks and prune removed ones for playlist pins only, triggered
from updatePlaylist, playlist detail load, smart-playlist polling, and reconnect.

* docs: note cached-playlist sync in CHANGELOG and credits for PR #1008

* fix(offline): exclude smart playlists from manual offline cache and sync

Hide cache-offline for psy-smart-* playlists, block download/sync paths, and
document the distinction in CHANGELOG.

* feat(offline): auto-sync cached albums and artist discographies

Generalize pinned playlist reconcile into pinnedOfflineSync so manually
pinned albums and artist discographies re-download added tracks and prune
removed ones on reopen, reconnect, and catalog changes.

* feat(offline): split pinned sync triggers by pin kind

Album and artist pins reconcile after library index sync and reconnect;
regular playlists reconcile hourly and on in-app playlist edits only.
Remove reconcile-on-open for album, artist, and playlist detail views.

* fix(offline): address PR #1008 review (N1, tests, pin queue)

Scope playlist reconcile to the owning server via getPlaylistForServer.
Add artist discography and mixed-server playlist tests; dedupe pending
sync jobs; skip pinTasks overwrite during active downloads.
This commit is contained in:
cucadmuh
2026-06-06 22:43:03 +03:00
committed by GitHub
parent 40db6b08d2
commit 2d3c723a6e
228 changed files with 11551 additions and 1534 deletions
+2
View File
@@ -13,8 +13,10 @@ export const albumDetail = {
downloading: 'Lade…',
cacheOffline: 'Offline verfügbar machen',
offlineCached: 'Offline verfügbar',
offlineQueued: 'In Warteschlange',
offlineDownloading: 'Wird gecacht… ({{n}}/{{total}})',
removeOffline: 'Offline-Cache löschen',
removeFromOfflineQueue: 'Aus Offline-Warteschlange entfernen',
offlineStorageFull: 'Offline-Speicher voll (Limit: {{mb}} MB). Lösche ein Album aus der Offline-Bibliothek oder erhöhe das Limit in den Einstellungen.',
offlineStorageGoToSettings: 'Einstellungen',
offlineStorageGoToLibrary: 'Offline-Bibliothek',
+1
View File
@@ -33,6 +33,7 @@ export const artistDetail = {
similarArtists: 'Ähnliche Künstler',
cacheOffline: 'Diskografie offline speichern',
offlineCached: 'Diskografie gecacht',
offlineQueued: 'In Warteschlange',
offlineDownloading: 'Wird gecacht… ({{done}}/{{total}} Alben)',
uploadImage: 'Künstlerbild hochladen',
uploadImageError: 'Bild konnte nicht hochgeladen werden',
+10
View File
@@ -10,6 +10,11 @@ export const connection = {
offlineModeBanner: 'Offline-Modus — Wiedergabe aus lokalem Cache',
offlineNoCacheBanner: 'Keine Serververbindung — {{server}} nicht erreichbar',
offlineLibraryTitle: 'Offline-Bibliothek',
offlineLibraryDiskLabel: 'Auf dem Datenträger',
offlineLibraryDiskUsage: 'Auf dem Datenträger: {{size}}',
offlineLibraryDiskUsageLoading: 'Auf dem Datenträger: …',
offlineLibraryDiskTierLibrary: 'Offline-Bibliothek (media/library): {{size}}',
offlineLibraryDiskTierFavorites: 'Favoriten (media/favorites): {{size}}',
offlineLibraryEmpty: 'Noch keine Alben gecacht. Online gehen, Album öffnen und "Offline verfügbar machen" klicken.',
offlineCachedOnServer: 'Auf {{server}}',
offlineAlbumCount: '{{n}} Album',
@@ -18,6 +23,11 @@ export const connection = {
offlineFilterAlbums: 'Alben',
offlineFilterPlaylists: 'Playlists',
offlineFilterArtists: 'Diskografien',
offlineCacheQueueTitle: 'Offline-Cache',
offlineCacheQueueSubtitle: '{{n}} Titel auf dem Datenträger — mischen und abspielen',
offlineCacheQueuePlayAria: 'Alle gecachten Titel mischen und abspielen',
offlineFavoritesQueueTitle: 'Favoriten',
offlineFavoritesQueuePlayAria: 'Alle offline gespeicherten Favoriten mischen und abspielen',
retry: 'Erneut versuchen',
serverSettings: 'Server-Einstellungen',
switchServerTitle: 'Server wechseln',
+5
View File
@@ -16,4 +16,9 @@ export const favorites = {
topArtists: 'Top-Künstler nach Favoriten',
topArtistsSongCount_one: '{{count}} Song',
topArtistsSongCount_other: '{{count}} Songs',
offlineTooltip: 'Favoriten für Offline-Wiedergabe speichern',
offlineJobName: 'Favoriten',
offlineSemaphoreSyncing: 'Synchronisiere Favoriten… {{saved}} von {{total}}',
offlineSemaphoreSynced: 'Alle Favoriten für Offline gespeichert',
offlineSemaphoreError: 'Sync-Fehler — einige Titel konnten nicht gespeichert werden',
};
+10 -3
View File
@@ -145,16 +145,23 @@ export const settings = {
scrobbleDesc: 'Songs nach 50% Laufzeit an Last.fm senden',
behavior: 'App-Verhalten',
cacheTitle: 'Max. Speichergröße',
cacheDesc: 'Cover und Künstlerbilder. Wenn voll, werden die ältesten Einträge automatisch entfernt. Offline-Alben werden nicht automatisch gelöscht, aber beim manuellen Cache leeren entfernt.',
cacheDesc: 'Browser-Cache für Cover und Künstlerbilder (IndexedDB). Wenn voll, werden die ältesten Einträge automatisch entfernt.',
cacheUsedImages: 'Bilder:',
cacheUsedOffline: 'Offline-Tracks:',
cacheUsedHot: 'Belegter Speicher:',
hotCacheTrackCount: 'Titel im Cache:',
cacheMaxLabel: 'Max. Größe',
cacheClearBtn: 'Cache leeren',
cacheClearWarning: 'Alle Offline-Alben werden damit aus der Bibliothek entfernt.',
cacheClearConfirm: 'Alles löschen',
cacheClearWarning: 'Löscht alle gecachten Cover- und Künstlerbilder im Browser-Speicher. Sie werden bei Bedarf neu geladen.',
cacheClearConfirm: 'Bild-Cache leeren',
cacheClearCancel: 'Abbrechen',
mediaDirTitle: 'Medienordner',
mediaDirDesc: 'Stammordner für lokale Wiedergabe. Offline-Bibliothek: library/; Warteschlangen-Puffer: cache/.',
mediaDirDefault: 'Standard (App-Daten)',
mediaDirChange: 'Ordner ändern',
mediaDirClear: 'Auf Standard zurücksetzen',
mediaDirHint: 'Neue Downloads nutzen diesen Ort. Bestehende Dateien bleiben am ursprünglichen Pfad, bis du sie entfernst.',
offlineStorageTitle: 'Offline-Speicher',
offlineDirTitle: 'Offline-Bibliothek (In-App)',
offlineDirDesc: 'Speicherort für Titel, die du innerhalb von Psysonic offline verfügbar machst.',
offlineDirDefault: 'Standard (App-Daten)',
+2
View File
@@ -13,8 +13,10 @@ export const albumDetail = {
downloading: 'Loading…',
cacheOffline: 'Make available offline',
offlineCached: 'Available offline',
offlineQueued: 'In queue',
offlineDownloading: 'Caching… ({{n}}/{{total}})',
removeOffline: 'Remove offline cache',
removeFromOfflineQueue: 'Remove from offline queue',
offlineStorageFull: 'Offline storage full (limit: {{mb}} MB). Free up space by deleting an album from your Offline Library, or increase the limit in Settings.',
offlineStorageGoToLibrary: 'Offline Library',
offlineStorageGoToSettings: 'Settings',
+1
View File
@@ -35,6 +35,7 @@ export const artistDetail = {
similarArtists: 'Similar Artists',
cacheOffline: 'Save discography offline',
offlineCached: 'Discography cached',
offlineQueued: 'In queue',
offlineDownloading: 'Caching… ({{done}}/{{total}} albums)',
uploadImage: 'Upload artist image',
uploadImageError: 'Failed to upload image',
+11
View File
@@ -10,7 +10,13 @@ export const connection = {
offlineModeBanner: 'Offline Mode — playing from local cache',
offlineNoCacheBanner: 'No server connection — cannot reach {{server}}',
offlineLibraryTitle: 'Offline Library',
offlineLibraryDiskLabel: 'On disk',
offlineLibraryDiskUsage: 'On disk: {{size}}',
offlineLibraryDiskUsageLoading: 'On disk: …',
offlineLibraryDiskTierLibrary: 'Offline library (media/library): {{size}}',
offlineLibraryDiskTierFavorites: 'Favorites (media/favorites): {{size}}',
offlineLibraryEmpty: 'No albums cached yet. Go online, open an album and click "Make available offline".',
offlinePlaybackUnavailable: 'Local files for this album are missing or not indexed.',
offlineCachedOnServer: 'On {{server}}',
offlineAlbumCount: '{{n}} album',
offlineAlbumCount_plural: '{{n}} albums',
@@ -18,6 +24,11 @@ export const connection = {
offlineFilterAlbums: 'Albums',
offlineFilterPlaylists: 'Playlists',
offlineFilterArtists: 'Discographies',
offlineCacheQueueTitle: 'Queue cache',
offlineCacheQueueSubtitle: '{{n}} tracks in media/cache — shuffle and play',
offlineCacheQueuePlayAria: 'Shuffle and play all cached tracks',
offlineFavoritesQueueTitle: 'Favorites',
offlineFavoritesQueuePlayAria: 'Shuffle and play all favorites saved offline',
retry: 'Retry',
serverSettings: 'Server Settings',
switchServerTitle: 'Switch server',
+5
View File
@@ -16,4 +16,9 @@ export const favorites = {
topArtists: 'Top Artists by Favorites',
topArtistsSongCount_one: '{{count}} song',
topArtistsSongCount_other: '{{count}} songs',
offlineTooltip: 'Save your favorites for offline listening',
offlineJobName: 'Favorites',
offlineSemaphoreSyncing: 'Syncing favorites… {{saved}} of {{total}}',
offlineSemaphoreSynced: 'All favorites saved for offline listening',
offlineSemaphoreError: 'Sync error — some tracks could not be saved',
};
+13 -3
View File
@@ -145,12 +145,15 @@ export const settings = {
scrobbleDesc: 'Send songs to Last.fm after 50% playtime',
behavior: 'App Behavior',
cacheTitle: 'Max. Storage Size',
cacheDesc: 'Cover art and artist images. When full, the oldest entries are removed automatically. Offline albums are not auto-removed, but will be deleted when clearing the cache manually.',
cacheDesc: 'In-browser cache for cover art and artist images (IndexedDB). Oldest entries are removed automatically when space runs low.',
cacheUsedImages: 'Images:',
cacheUsedOffline: 'Offline tracks:',
cacheUsedHot: 'Size on disk:',
hotCacheTrackCount: 'Tracks in cache:',
cacheMaxLabel: 'Max. size',
imageCacheScopeLabel: 'Scope',
imageCacheSubTitle: 'In-browser previews',
coverDiskCacheSubTitle: 'On-disk cover cache',
coverCacheStrategyTitle: 'Cover art cache',
coverCacheStrategyDesc: 'You can choose a strategy for each server: Lazy — load covers as needed; Aggressive — load as needed plus extra background preloading.',
coverCacheStrategyLabel: 'Strategy',
@@ -172,12 +175,19 @@ export const settings = {
coverCacheStrategyClearError: 'Failed to clear cover cache.',
coverCacheStrategyServerRemoved: 'removed server',
cacheClearBtn: 'Clear Cache',
cacheClearWarning: 'This will also remove all offline albums from the library.',
cacheClearConfirm: 'Clear Everything',
cacheClearWarning: 'Clears all cached cover and artist images from in-browser storage. They will be re-downloaded when needed.',
cacheClearConfirm: 'Clear image cache',
cacheClearCancel: 'Cancel',
waveformCacheCleared: 'Waveform cache cleared ({{count}} rows).',
waveformCacheClearFailed: 'Failed to clear waveform cache.',
storageTabTitle: 'Offline & cache',
mediaDirTitle: 'Media folder',
mediaDirDesc: 'Root folder for local playback. Offline library uses library/; queue prefetch uses cache/.',
mediaDirDefault: 'Default (App Data)',
mediaDirChange: 'Change folder',
mediaDirClear: 'Reset to default',
mediaDirHint: 'New downloads use this location. Existing files stay at their original paths until removed.',
offlineStorageTitle: 'Offline library storage',
offlineDirTitle: 'Offline Library (In-App)',
offlineDirDesc: 'Storage location for tracks you make available offline within Psysonic.',
offlineDirDefault: 'Default (App Data)',
+2
View File
@@ -18,6 +18,8 @@ export const sidebar = {
collapse: 'Collapse Sidebar',
downloadingTracks: 'Caching {{n}} tracks…',
offlinePinActive: 'Caching «{{name}}»…',
offlinePinActiveQueued: 'Caching «{{name}}» · +{{queued}} queued',
syncingTracks: 'Syncing {{done}}/{{total}}…',
cancelDownload: 'Cancel download',
offlineLibrary: 'Offline Library',
+2
View File
@@ -13,8 +13,10 @@ export const albumDetail = {
downloading: 'Cargando…',
cacheOffline: 'Disponible offline',
offlineCached: 'Disponible offline',
offlineQueued: 'En cola',
offlineDownloading: 'Descargando… ({{n}}/{{total}})',
removeOffline: 'Quitar de offline',
removeFromOfflineQueue: 'Quitar de la cola offline',
offlineStorageFull: 'Almacenamiento offline lleno (límite: {{mb}} MB). Libera espacio eliminando un álbum de tu Biblioteca Offline, o aumenta el límite en Configuración.',
offlineStorageGoToLibrary: 'Biblioteca Offline',
offlineStorageGoToSettings: 'Configuración',
+1
View File
@@ -33,6 +33,7 @@ export const artistDetail = {
similarArtists: 'Artistas Similares',
cacheOffline: 'Guardar discografía offline',
offlineCached: 'Discografía guardada',
offlineQueued: 'En cola',
offlineDownloading: 'Descargando… ({{done}}/{{total}} álbumes)',
uploadImage: 'Subir imagen del artista',
uploadImageError: 'Error al subir imagen',
+10
View File
@@ -10,6 +10,11 @@ export const connection = {
offlineModeBanner: 'Modo Offline — reproduciendo desde caché local',
offlineNoCacheBanner: 'Sin conexión al servidor — no se puede acceder a {{server}}',
offlineLibraryTitle: 'Biblioteca Offline',
offlineLibraryDiskLabel: 'En disco',
offlineLibraryDiskUsage: 'En disco: {{size}}',
offlineLibraryDiskUsageLoading: 'En disco: …',
offlineLibraryDiskTierLibrary: 'Biblioteca offline (media/library): {{size}}',
offlineLibraryDiskTierFavorites: 'Favoritos (media/favorites): {{size}}',
offlineLibraryEmpty: 'No hay álbumes en caché aún. Conéctate, abre un álbum y click en "Disponible offline".',
offlineCachedOnServer: 'En {{server}}',
offlineAlbumCount: '{{n}} álbum',
@@ -18,6 +23,11 @@ export const connection = {
offlineFilterAlbums: 'Álbumes',
offlineFilterPlaylists: 'Listas',
offlineFilterArtists: 'Discografías',
offlineCacheQueueTitle: 'Caché offline',
offlineCacheQueueSubtitle: '{{n}} pistas en disco — mezclar y reproducir',
offlineCacheQueuePlayAria: 'Mezclar y reproducir todas las pistas en caché',
offlineFavoritesQueueTitle: 'Favoritos',
offlineFavoritesQueuePlayAria: 'Mezclar y reproducir todos los favoritos offline',
retry: 'Reintentar',
serverSettings: 'Configuración del servidor',
switchServerTitle: 'Cambiar servidor',
+5
View File
@@ -16,4 +16,9 @@ export const favorites = {
topArtists: 'Artistas favoritos principales',
topArtistsSongCount_one: '{{count}} canción',
topArtistsSongCount_other: '{{count}} canciones',
offlineTooltip: 'Guarda tus favoritos para escuchar sin conexión',
offlineJobName: 'Favoritos',
offlineSemaphoreSyncing: 'Sincronizando favoritos… {{saved}} de {{total}}',
offlineSemaphoreSynced: 'Todos los favoritos guardados para offline',
offlineSemaphoreError: 'Error de sincronización — no se pudieron guardar algunas pistas',
};
+10 -3
View File
@@ -144,16 +144,23 @@ export const settings = {
scrobbleDesc: 'Enviar canciones a Last.fm después del 50% de reproducción',
behavior: 'Comportamiento de la App',
cacheTitle: 'Tamaño Máx. de Almacenamiento',
cacheDesc: 'Portadas e imágenes de artistas. Cuando está lleno, las entradas más antiguas se eliminan automáticamente. Los álbumes offline no se eliminan automáticamente, pero se borrarán al limpiar la caché manualmente.',
cacheDesc: 'Caché del navegador para portadas e imágenes de artistas (IndexedDB). Cuando está lleno, las entradas más antiguas se eliminan automáticamente.',
cacheUsedImages: 'Imágenes:',
cacheUsedOffline: 'Pistas offline:',
cacheUsedHot: 'Tamaño en disco:',
hotCacheTrackCount: 'Pistas en caché:',
cacheMaxLabel: 'Tamaño máx.',
cacheClearBtn: 'Limpiar Caché',
cacheClearWarning: 'Esto también eliminará todos los álbumes offline de la biblioteca.',
cacheClearConfirm: 'Limpiar Todo',
cacheClearWarning: 'Borra todas las portadas e imágenes de artistas en caché. Se volverán a descargar cuando hagan falta.',
cacheClearConfirm: 'Limpiar caché de imágenes',
cacheClearCancel: 'Cancelar',
mediaDirTitle: 'Carpeta de medios',
mediaDirDesc: 'Carpeta raíz para reproducción local. Biblioteca offline: library/; búfer de cola: cache/.',
mediaDirDefault: 'Predeterminado (Datos de App)',
mediaDirChange: 'Cambiar carpeta',
mediaDirClear: 'Restablecer predeterminado',
mediaDirHint: 'Las nuevas descargas usarán esta ubicación. Los archivos existentes permanecen en su ruta hasta que los elimines.',
offlineStorageTitle: 'Almacenamiento offline',
offlineDirTitle: 'Biblioteca Offline (En App)',
offlineDirDesc: 'Ubicación de almacenamiento para pistas que haces disponibles offline dentro de Psysonic.',
offlineDirDefault: 'Predeterminado (Datos de App)',
+2
View File
@@ -13,8 +13,10 @@ export const albumDetail = {
downloading: 'Chargement…',
cacheOffline: 'Rendre disponible hors ligne',
offlineCached: 'Disponible hors ligne',
offlineQueued: 'En file d\'attente',
offlineDownloading: 'Mise en cache… ({{n}}/{{total}})',
removeOffline: 'Supprimer le cache hors ligne',
removeFromOfflineQueue: 'Retirer de la file d\'attente 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',
+1
View File
@@ -33,6 +33,7 @@ export const artistDetail = {
similarArtists: 'Artistes similaires',
cacheOffline: 'Enregistrer la discographie hors ligne',
offlineCached: 'Discographie en cache',
offlineQueued: 'En file d\'attente',
offlineDownloading: 'En cache… ({{done}}/{{total}} albums)',
uploadImage: "Téléverser l'image de l'artiste",
uploadImageError: "Échec du téléversement de l'image",
+10
View File
@@ -10,6 +10,11 @@ export const connection = {
offlineModeBanner: 'Mode hors ligne — lecture depuis le cache local',
offlineNoCacheBanner: 'Pas de connexion au serveur — {{server}} inaccessible',
offlineLibraryTitle: 'Bibliothèque hors ligne',
offlineLibraryDiskLabel: 'Sur le disque',
offlineLibraryDiskUsage: 'Sur le disque : {{size}}',
offlineLibraryDiskUsageLoading: 'Sur le disque : …',
offlineLibraryDiskTierLibrary: 'Bibliothèque hors ligne (media/library) : {{size}}',
offlineLibraryDiskTierFavorites: 'Favoris (media/favorites) : {{size}}',
offlineLibraryEmpty: 'Aucun album en cache. Connectez-vous, ouvrez un album et cliquez sur "Rendre disponible hors ligne".',
offlineCachedOnServer: 'Sur {{server}}',
offlineAlbumCount: '{{n}} album',
@@ -18,6 +23,11 @@ export const connection = {
offlineFilterAlbums: 'Albums',
offlineFilterPlaylists: 'Playlists',
offlineFilterArtists: 'Discographies',
offlineCacheQueueTitle: 'Cache hors ligne',
offlineCacheQueueSubtitle: '{{n}} pistes sur le disque — lecture aléatoire',
offlineCacheQueuePlayAria: 'Lecture aléatoire de toutes les pistes en cache',
offlineFavoritesQueueTitle: 'Favoris',
offlineFavoritesQueuePlayAria: 'Lecture aléatoire de tous les favoris hors ligne',
retry: 'Réessayer',
serverSettings: 'Paramètres serveur',
switchServerTitle: 'Changer de serveur',
+5
View File
@@ -16,4 +16,9 @@ export const favorites = {
topArtists: 'Artistes favoris principaux',
topArtistsSongCount_one: '{{count}} morceau',
topArtistsSongCount_other: '{{count}} morceaux',
offlineTooltip: 'Enregistrer vos favoris pour l’écoute hors ligne',
offlineJobName: 'Favoris',
offlineSemaphoreSyncing: 'Synchronisation des favoris… {{saved}} sur {{total}}',
offlineSemaphoreSynced: 'Tous les favoris enregistrés pour l’écoute hors ligne',
offlineSemaphoreError: 'Erreur de synchronisation — certains titres nont pas pu être enregistrés',
};
+10 -3
View File
@@ -144,16 +144,23 @@ export const settings = {
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.',
cacheDesc: 'Cache navigateur pour pochettes et images d\'artistes (IndexedDB). Quand il est plein, les entrées les plus anciennes sont supprimées automatiquement.',
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',
cacheClearWarning: 'Efface toutes les pochettes et images d\'artistes en cache. Elles seront retéléchargées si nécessaire.',
cacheClearConfirm: 'Vider le cache d\'images',
cacheClearCancel: 'Annuler',
mediaDirTitle: 'Dossier média',
mediaDirDesc: 'Dossier racine pour la lecture locale. Bibliothèque hors ligne : library/ ; tampon de file d\'attente : cache/.',
mediaDirDefault: 'Par défaut (données d\'application)',
mediaDirChange: 'Changer le dossier',
mediaDirClear: 'Réinitialiser',
mediaDirHint: 'Les nouveaux téléchargements utiliseront cet emplacement. Les fichiers existants restent à leur chemin d\'origine jusqu\'à suppression.',
offlineStorageTitle: 'Stockage hors ligne',
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)',
+2
View File
@@ -13,8 +13,10 @@ export const albumDetail = {
downloading: 'Laster…',
cacheOffline: 'Gjør tilgjengelig som frakoblet',
offlineCached: 'Tilgjengelig frakoblet',
offlineQueued: 'I kø',
offlineDownloading: 'Bufrer… ({{n}}/{{total}})',
removeOffline: 'Fjern frakoblet hurtigbuffer',
removeFromOfflineQueue: 'Fjern fra offline-kø',
offlineStorageFull: 'Frakoblet lagring er full (lagringsgrense: {{mb}} MB). Frigjør plass, ved å slette et album fra ditt frakoblede bibliotek, eller øk lagringsgrensen i Innstillinger.',
offlineStorageGoToLibrary: 'Frakoblet bibliotek',
offlineStorageGoToSettings: 'Innstillinger',
+1
View File
@@ -33,6 +33,7 @@ export const artistDetail = {
similarArtists: 'Lignende artister',
cacheOffline: 'Lagre diskografi som frakoblet',
offlineCached: 'Diskografi bufret',
offlineQueued: 'I kø',
offlineDownloading: 'Bufrer… ({{done}}/{{total}} album)',
uploadImage: 'Last opp artistbilde',
uploadImageError: 'Kunne ikke laste opp bildet',
+10
View File
@@ -10,6 +10,11 @@ export const connection = {
offlineModeBanner: 'Frakoblet modus - spiller fra lokal hurtigbuffer',
offlineNoCacheBanner: 'Ingen servertilkobling — kan ikke nå {{server}}',
offlineLibraryTitle: 'Frakoblet bibliotek',
offlineLibraryDiskLabel: 'På disk',
offlineLibraryDiskUsage: 'På disk: {{size}}',
offlineLibraryDiskUsageLoading: 'På disk: …',
offlineLibraryDiskTierLibrary: 'Offline-bibliotek (media/library): {{size}}',
offlineLibraryDiskTierFavorites: 'Favoritter (media/favorites): {{size}}',
offlineLibraryEmpty: 'Ingen album bufret ennå. Kobl deg til nettverket, åpne et album og klikk "Gjør tilgjengelig frakoblet".',
offlineCachedOnServer: 'På {{server}}',
offlineAlbumCount: '{{n}} album',
@@ -18,6 +23,11 @@ export const connection = {
offlineFilterAlbums: 'Album',
offlineFilterPlaylists: 'Spillelister',
offlineFilterArtists: 'Diskografier',
offlineCacheQueueTitle: 'Frakoblet hurtigbuffer',
offlineCacheQueueSubtitle: '{{n}} spor på disk — bland og spill',
offlineCacheQueuePlayAria: 'Bland og spill alle hurtigbufrede spor',
offlineFavoritesQueueTitle: 'Favoritter',
offlineFavoritesQueuePlayAria: 'Bland og spill alle offline-favoritter',
retry: 'Prøv igjen',
serverSettings: 'Serverinnstillinger',
switchServerTitle: 'Bytt server',
+5
View File
@@ -16,4 +16,9 @@ export const favorites = {
topArtists: 'Toppartister etter favoritter',
topArtistsSongCount_one: '{{count}} sang',
topArtistsSongCount_other: '{{count}} sanger',
offlineTooltip: 'Lagre favorittene dine for offline lytting',
offlineJobName: 'Favoritter',
offlineSemaphoreSyncing: 'Synkroniserer favoritter… {{saved}} av {{total}}',
offlineSemaphoreSynced: 'Alle favoritter lagret for offline',
offlineSemaphoreError: 'Synkfeil — noen spor kunne ikke lagres',
};
+10 -3
View File
@@ -144,7 +144,7 @@ export const settings = {
scrobbleDesc: 'Send sanger til Last.fm etter 50 % avspilling',
behavior: 'App-oppførsel',
cacheTitle: 'Maks. lagringsstørrelse',
cacheDesc: 'Plateomslag og artistbilder. Når den er full, fjernes de eldste oppføringene automatisk. Frakoblede album fjernes ikke automatisk, men slettes når hurtigbufferen tømmes manuelt.',
cacheDesc: 'Nettlesercache for plateomslag og artistbilder (IndexedDB). Når den er full, fjernes de eldste oppføringene automatisk.',
cacheUsed: 'Brukt: {{images}} bilder · {{offline}} frakoblede spor',
cacheUsedImages: 'Bilder:',
cacheUsedOffline: 'Frakoblede spor:',
@@ -152,9 +152,16 @@ export const settings = {
hotCacheTrackCount: 'Spor i buffer:',
cacheMaxLabel: 'Maks størrelse',
cacheClearBtn: 'Tøm hurtigbuffer',
cacheClearWarning: 'Dette vil også fjerne alle frakoblede album fra biblioteket.',
cacheClearConfirm: 'Tøm alt',
cacheClearWarning: 'Sletter alle bufrede omslag og artistbilder. De lastes ned igjen ved behov.',
cacheClearConfirm: 'Tøm bildecache',
cacheClearCancel: 'Avbryt',
mediaDirTitle: 'Mediemappe',
mediaDirDesc: 'Rotmappe for lokal avspilling. Frakoblet bibliotek: library/; købuffer: cache/.',
mediaDirDefault: 'Standard (App-data)',
mediaDirChange: 'Endre mappe',
mediaDirClear: 'Tilbakestill til standard',
mediaDirHint: 'Nye nedlastinger bruker denne plasseringen. Eksisterende filer blir på sin opprinnelige sti til du fjerner dem.',
offlineStorageTitle: 'Frakoblet lagring',
offlineDirTitle: 'Frakoblet bibliotek (In-App)',
offlineDirDesc: 'Lagringsplassering for spor som du gjør tilgjengelige som frakoblet i Psysonic.',
offlineDirDefault: 'Standard (App-data)',
+2
View File
@@ -13,8 +13,10 @@ export const albumDetail = {
downloading: 'Laden…',
cacheOffline: 'Offline beschikbaar maken',
offlineCached: 'Offline beschikbaar',
offlineQueued: 'In wachtrij',
offlineDownloading: 'Wordt gecached… ({{n}}/{{total}})',
removeOffline: 'Offline cache verwijderen',
removeFromOfflineQueue: 'Uit offline-wachtrij verwijderen',
offlineStorageFull: 'Offline opslag vol (limiet: {{mb}} MB). Verwijder een album uit je offline bibliotheek of verhoog de limiet in de instellingen.',
offlineStorageGoToSettings: 'Instellingen',
offlineStorageGoToLibrary: 'Offline bibliotheek',
+1
View File
@@ -33,6 +33,7 @@ export const artistDetail = {
similarArtists: 'Vergelijkbare artiesten',
cacheOffline: 'Discografie offline opslaan',
offlineCached: 'Discografie gecached',
offlineQueued: 'In wachtrij',
offlineDownloading: 'Cachen… ({{done}}/{{total}} albums)',
uploadImage: 'Artiestafbeelding uploaden',
uploadImageError: 'Uploaden van afbeelding mislukt',
+10
View File
@@ -10,6 +10,11 @@ export const connection = {
offlineModeBanner: 'Offline modus — afspelen vanuit lokale cache',
offlineNoCacheBanner: 'Geen serververbinding — {{server}} niet bereikbaar',
offlineLibraryTitle: 'Offline bibliotheek',
offlineLibraryDiskLabel: 'Op schijf',
offlineLibraryDiskUsage: 'Op schijf: {{size}}',
offlineLibraryDiskUsageLoading: 'Op schijf: …',
offlineLibraryDiskTierLibrary: 'Offline-bibliotheek (media/library): {{size}}',
offlineLibraryDiskTierFavorites: 'Favorieten (media/favorites): {{size}}',
offlineLibraryEmpty: 'Nog geen albums gecached. Ga online, open een album en klik op "Offline beschikbaar maken".',
offlineCachedOnServer: 'Op {{server}}',
offlineAlbumCount: '{{n}} album',
@@ -18,6 +23,11 @@ export const connection = {
offlineFilterAlbums: 'Albums',
offlineFilterPlaylists: 'Afspeellijsten',
offlineFilterArtists: 'Discografieën',
offlineCacheQueueTitle: 'Offline-cache',
offlineCacheQueueSubtitle: '{{n}} nummers op schijf — shuffle en afspelen',
offlineCacheQueuePlayAria: 'Shuffle en speel alle gecachte nummers af',
offlineFavoritesQueueTitle: 'Favorieten',
offlineFavoritesQueuePlayAria: 'Shuffle en speel alle offline favorieten af',
retry: 'Opnieuw proberen',
serverSettings: 'Serverinstellingen',
switchServerTitle: 'Server wisselen',
+5
View File
@@ -16,4 +16,9 @@ export const favorites = {
topArtists: 'Top-artiesten op favorieten',
topArtistsSongCount_one: '{{count}} nummer',
topArtistsSongCount_other: '{{count}} nummers',
offlineTooltip: 'Sla je favorieten op voor offline luisteren',
offlineJobName: 'Favorieten',
offlineSemaphoreSyncing: 'Favorieten synchroniseren… {{saved}} van {{total}}',
offlineSemaphoreSynced: 'Alle favorieten opgeslagen voor offline',
offlineSemaphoreError: 'Syncfout — sommige nummers konden niet worden opgeslagen',
};
+10 -3
View File
@@ -144,16 +144,23 @@ export const settings = {
scrobbleDesc: 'Nummers naar Last.fm sturen na 50% afspeeltijd',
behavior: 'App-gedrag',
cacheTitle: 'Max. opslaggrootte',
cacheDesc: 'Albumhoezen en artiestafbeeldingen. Als de cache vol is, worden de oudste items automatisch verwijderd. Offline albums worden niet automatisch verwijderd, maar wel bij handmatig leegmaken.',
cacheDesc: 'Browsercache voor albumhoezen en artiestafbeeldingen (IndexedDB). Als de cache vol is, worden de oudste items automatisch verwijderd.',
cacheUsedImages: 'Afbeeldingen:',
cacheUsedOffline: 'Offline nummers:',
cacheUsedHot: 'Schijfgebruik:',
hotCacheTrackCount: 'Nummers in cache:',
cacheMaxLabel: 'Max. grootte',
cacheClearBtn: 'Cache wissen',
cacheClearWarning: 'Dit verwijdert ook alle offline albums uit de bibliotheek.',
cacheClearConfirm: 'Alles wissen',
cacheClearWarning: 'Wist alle gecachte hoesjes en artiestafbeeldingen. Ze worden opnieuw gedownload wanneer nodig.',
cacheClearConfirm: 'Beeldcache wissen',
cacheClearCancel: 'Annuleren',
mediaDirTitle: 'Mediamap',
mediaDirDesc: 'Hoofdmap voor lokaal afspelen. Offline-bibliotheek: library/; wachtrijbuffer: cache/.',
mediaDirDefault: 'Standaard (app-gegevens)',
mediaDirChange: 'Map wijzigen',
mediaDirClear: 'Terugzetten naar standaard',
mediaDirHint: 'Nieuwe downloads gebruiken deze locatie. Bestaande bestanden blijven op hun pad tot je ze verwijdert.',
offlineStorageTitle: 'Offline-opslag',
offlineDirTitle: 'Offline-bibliotheek (In-app)',
offlineDirDesc: 'Opslaglocatie voor nummers die je offline beschikbaar maakt in Psysonic.',
offlineDirDefault: 'Standaard (app-gegevens)',
+2
View File
@@ -13,8 +13,10 @@ export const albumDetail = {
downloading: 'Se încarcă…',
cacheOffline: 'Fă disponibil offline',
offlineCached: 'Disponibil offline',
offlineQueued: 'În coadă',
offlineDownloading: 'Se salvează în cache… ({{n}}/{{total}})',
removeOffline: 'Șterge cache-ul offline',
removeFromOfflineQueue: 'Elimină din coada offline',
offlineStorageFull: 'Stocare offline plină (limită: {{mb}} MB). Eliberează spațiu ștergând un album din Librăria Offline, sau mărește limita în Setări.',
offlineStorageGoToLibrary: 'Librăria Offline',
offlineStorageGoToSettings: 'Setări',
+1
View File
@@ -33,6 +33,7 @@ export const artistDetail = {
similarArtists: 'Artiști similari',
cacheOffline: 'Salvează discografia offline',
offlineCached: 'Discografie stocată în cache',
offlineQueued: 'În coadă',
offlineDownloading: 'Se salvează în cache… ({{done}}/{{total}} albume)',
uploadImage: 'Încarcă imaginea artistului',
uploadImageError: 'Nu s-a reușit încărcarea imaginii',
+10
View File
@@ -10,6 +10,11 @@ export const connection = {
offlineModeBanner: 'Modul Offline — se redă din cache-ul local',
offlineNoCacheBanner: 'Nicio conexiune la server — nu s-a putut ajunge la {{server}}',
offlineLibraryTitle: 'Librărie offline',
offlineLibraryDiskLabel: 'Pe disc',
offlineLibraryDiskUsage: 'Pe disc: {{size}}',
offlineLibraryDiskUsageLoading: 'Pe disc: …',
offlineLibraryDiskTierLibrary: 'Bibliotecă offline (media/library): {{size}}',
offlineLibraryDiskTierFavorites: 'Favorite (media/favorites): {{size}}',
offlineLibraryEmpty: 'Niciun album adăugat în cache. Conectează-te, deschide un album și apasă "Fă disponibil offline".',
offlineCachedOnServer: 'Pe {{server}}',
offlineAlbumCount: '{{n}} album',
@@ -18,6 +23,11 @@ export const connection = {
offlineFilterAlbums: 'Albume',
offlineFilterPlaylists: 'Playlisturi',
offlineFilterArtists: 'Discografii',
offlineCacheQueueTitle: 'Cache offline',
offlineCacheQueueSubtitle: '{{n}} piese pe disc — amestecă și redă',
offlineCacheQueuePlayAria: 'Amestecă și redă toate piesele din cache',
offlineFavoritesQueueTitle: 'Favorite',
offlineFavoritesQueuePlayAria: 'Amestecă și redă toate favoritele offline',
retry: 'Reîncearcă',
serverSettings: 'Setările serverului',
switchServerTitle: 'Schimbă serverul',
+5
View File
@@ -16,4 +16,9 @@ export const favorites = {
topArtists: 'Top Artiști din Favorite',
topArtistsSongCount_one: '{{count}} piesă',
topArtistsSongCount_other: '{{count}} piese',
offlineTooltip: 'Salvează favoritele pentru ascultare offline',
offlineJobName: 'Favorite',
offlineSemaphoreSyncing: 'Se sincronizează favoritele… {{saved}} din {{total}}',
offlineSemaphoreSynced: 'Toate favoritele sunt salvate pentru offline',
offlineSemaphoreError: 'Eroare de sincronizare — unele piese nu au putut fi salvate',
};
+10 -3
View File
@@ -144,7 +144,7 @@ export const settings = {
scrobbleDesc: 'Trimite piese la Last.fm după 50% timp de redare',
behavior: 'Comportamentul Aplicației',
cacheTitle: 'Spațiu de stocare maxim',
cacheDesc: 'Artă copertă și imagini artist. Când este plin, cele mai vechi intrări sunt șterse automat. Albumele offline nu sunt șterse automat, dar vor fi șterse când memoria cache este curățată manual.',
cacheDesc: 'Cache în browser pentru coperte și imagini de artiști (IndexedDB). Când este plin, cele mai vechi intrări sunt șterse automat.',
cacheUsedImages: 'Imagini:',
cacheUsedOffline: 'Piese offline:',
cacheUsedHot: 'Mărimea pe disc:',
@@ -152,11 +152,18 @@ export const settings = {
cacheMaxLabel: 'Mărimea maximă',
cacheClearBtn: 'Golește memoria cache',
waveformCacheClearBtn: 'Golește cache-ul formelor de undă',
cacheClearWarning: 'Aceasta va înlătura de asemenea toate albumele offline din librărie.',
cacheClearConfirm: 'Golește totul',
cacheClearWarning: 'Șterge toate copertele și imaginile artiștilor din cache. Vor fi descărcate din nou la nevoie.',
cacheClearConfirm: 'Golește cache-ul de imagini',
cacheClearCancel: 'Anulează',
waveformCacheCleared: 'Cache-ul formelor de undă golit ({{count}} rows).',
waveformCacheClearFailed: 'Golirea cache-ului formelor de undă a eșuat.',
mediaDirTitle: 'Folder media',
mediaDirDesc: 'Folder rădăcină pentru redare locală. Librărie offline: library/; buffer coadă: cache/.',
mediaDirDefault: 'Implicit (App Data)',
mediaDirChange: 'Schimbă folderul',
mediaDirClear: 'Resetează la implicit',
mediaDirHint: 'Descărcările noi folosesc această locație. Fișierele existente rămân la calea originală până le ștergi.',
offlineStorageTitle: 'Stocare offline',
offlineDirTitle: 'Librărie offline (În Aplicație)',
offlineDirDesc: 'Locația stocării pieselor pe care le faci disponibile offline în Psysonic.',
offlineDirDefault: 'Implicit (App Data)',
+2
View File
@@ -13,8 +13,10 @@ export const albumDetail = {
downloading: 'Загрузка…',
cacheOffline: 'Сохранить офлайн',
offlineCached: 'Доступно офлайн',
offlineQueued: 'В очереди',
offlineDownloading: 'Кэширование… ({{n}} из {{total}})',
removeOffline: 'Удалить офлайн-копию',
removeFromOfflineQueue: 'Убрать из очереди',
offlineStorageFull:
'Место для офлайн закончилось (лимит {{mb}} МБ). Освободите место в офлайн-библиотеке или увеличьте лимит в настройках.',
offlineStorageGoToLibrary: 'Офлайн-библиотека',
+1
View File
@@ -37,6 +37,7 @@ export const artistDetail = {
similarArtists: 'Похожие исполнители',
cacheOffline: 'Сохранить дискографию офлайн',
offlineCached: 'Дискография сохранена',
offlineQueued: 'В очереди',
offlineDownloading: 'Кэширование… ({{done}} из {{total}} альбомов)',
uploadImage: 'Загрузить фото исполнителя',
uploadImageError: 'Не удалось загрузить изображение',
+11
View File
@@ -10,8 +10,14 @@ export const connection = {
offlineModeBanner: 'Офлайн — воспроизведение из локального кэша',
offlineNoCacheBanner: 'Нет соединения с сервером — {{server}} недоступен',
offlineLibraryTitle: 'Офлайн-библиотека',
offlineLibraryDiskLabel: 'На диске',
offlineLibraryDiskUsage: 'На диске: {{size}}',
offlineLibraryDiskUsageLoading: 'На диске: …',
offlineLibraryDiskTierLibrary: 'Офлайн-библиотека (media/library): {{size}}',
offlineLibraryDiskTierFavorites: 'Избранное (media/favorites): {{size}}',
offlineLibraryEmpty:
'Пока ничего не сохранено. Подключитесь к сети, откройте альбом и нажмите «Сохранить офлайн».',
offlinePlaybackUnavailable: 'Локальные файлы альбома не найдены или не проиндексированы.',
offlineCachedOnServer: 'С сервера {{server}}',
offlineAlbumCount_one: '{{n}} альбом',
offlineAlbumCount_few: '{{n}} альбома',
@@ -21,6 +27,11 @@ export const connection = {
offlineFilterAlbums: 'Альбомы',
offlineFilterPlaylists: 'Плейлисты',
offlineFilterArtists: 'Дискографии',
offlineCacheQueueTitle: 'Кэш очереди',
offlineCacheQueueSubtitle: '{{n}} треков в media/cache — перемешать и играть',
offlineCacheQueuePlayAria: 'Перемешать и воспроизвести все треки из кэша',
offlineFavoritesQueueTitle: 'Избранное',
offlineFavoritesQueuePlayAria: 'Перемешать и воспроизвести offline-избранное',
retry: 'Повторить',
serverSettings: 'Настройки сервера',
switchServerTitle: 'Сменить сервер',
+5
View File
@@ -18,4 +18,9 @@ export const favorites = {
topArtistsSongCount_few: '{{count}} трека',
topArtistsSongCount_many: '{{count}} треков',
topArtistsSongCount_other: '{{count}} трека',
offlineTooltip: 'Сохранять избранное для прослушивания offline',
offlineJobName: 'Избранное',
offlineSemaphoreSyncing: 'Синхронизация… {{saved}} из {{total}}',
offlineSemaphoreSynced: 'Всё избранное сохранено для offline',
offlineSemaphoreError: 'Ошибка синхронизации — часть треков не сохранилась',
};
+13 -3
View File
@@ -146,12 +146,15 @@ export const settings = {
behavior: 'Поведение',
cacheTitle: 'Макс. размер кэша',
cacheDesc:
'Обложки и фото исполнителей. При переполнении старые записи удаляются. Офлайн-альбомы не трогаются автоматически, но сотрутся при полной очистке кэша.',
'Кэш обложек и фото исполнителей в хранилище приложения (IndexedDB). При нехватке места старые записи удаляются автоматически.',
cacheUsedImages: 'Изображения:',
cacheUsedOffline: 'Офлайн-треки:',
cacheUsedHot: 'На диске:',
hotCacheTrackCount: 'Треков в кэше:',
cacheMaxLabel: 'Лимит',
imageCacheScopeLabel: 'Область',
imageCacheSubTitle: 'Превью в приложении',
coverDiskCacheSubTitle: 'Обложки на диске',
coverCacheStrategyTitle: 'Кэш обложек',
coverCacheStrategyDesc: 'Для каждого сервера можно выбрать стратегию: Ленивый — загружать обложки по мере необходимости; Агрессивный — то же самое плюс дополнительный фоновый прогрев.',
coverCacheStrategyLabel: 'Стратегия',
@@ -173,12 +176,19 @@ export const settings = {
coverCacheStrategyClearError: 'Не удалось очистить кэш обложек.',
coverCacheStrategyServerRemoved: 'удалённый сервер',
cacheClearBtn: 'Очистить кэш',
cacheClearWarning: 'Будут удалены и все офлайн-альбомы.',
cacheClearConfirm: 'Очистить всё',
cacheClearWarning: 'Очистит кэш обложек и фото исполнителей в хранилище приложения. При необходимости скачаются снова.',
cacheClearConfirm: 'Очистить кэш изображений',
cacheClearCancel: 'Отмена',
waveformCacheCleared: 'Кэш waveform очищен ({{count}} строк).',
waveformCacheClearFailed: 'Не удалось очистить кэш waveform.',
storageTabTitle: 'Офлайн и кэш',
mediaDirTitle: 'Папка медиа',
mediaDirDesc: 'Корневая папка локального воспроизведения: офлайн-библиотека — library/, буфер очереди — cache/.',
mediaDirDefault: 'По умолчанию (данные приложения)',
mediaDirChange: 'Сменить папку',
mediaDirClear: 'Сбросить по умолчанию',
mediaDirHint: 'Новые загрузки пойдут в выбранную папку. Старые файлы останутся на прежних путях, пока вы их не удалите.',
offlineStorageTitle: 'Офлайн-хранилище',
offlineDirTitle: 'Офлайн-библиотека (в приложении)',
offlineDirDesc: 'Папка для треков, сохранённых для офлайн-прослушивания.',
offlineDirDefault: 'По умолчанию (данные приложения)',
+2
View File
@@ -17,6 +17,8 @@ export const sidebar = {
expand: 'Развернуть боковую панель',
collapse: 'Свернуть боковую панель',
downloadingTracks: 'Кэширование {{n}} треков…',
offlinePinActive: 'Кэшируется «{{name}}»…',
offlinePinActiveQueued: 'Кэшируется «{{name}}» · ещё {{queued}} в очереди',
syncingTracks: 'Синхронизация {{done}}/{{total}}…',
cancelDownload: 'Отменить загрузку',
offlineLibrary: 'Офлайн-библиотека',
+2
View File
@@ -13,8 +13,10 @@ export const albumDetail = {
downloading: '加载中…',
cacheOffline: '设为离线可用',
offlineCached: '已离线缓存',
offlineQueued: '排队中',
offlineDownloading: '正在缓存… ({{n}}/{{total}})',
removeOffline: '移除离线缓存',
removeFromOfflineQueue: '从离线队列中移除',
offlineStorageFull: '离线存储空间已满(限制:{{mb}} MB)。请从离线音乐库中删除专辑以释放空间,或在设置中增加限制。',
offlineStorageGoToLibrary: '离线音乐库',
offlineStorageGoToSettings: '设置',
+1
View File
@@ -33,6 +33,7 @@ export const artistDetail = {
similarArtists: '相似艺术家',
cacheOffline: '离线保存全部专辑',
offlineCached: '全部专辑已缓存',
offlineQueued: '排队中',
offlineDownloading: '正在缓存… ({{done}}/{{total}} 张专辑)',
uploadImage: '上传艺术家图片',
uploadImageError: '图片上传失败',
+10
View File
@@ -10,10 +10,20 @@ export const connection = {
offlineModeBanner: '离线模式 — 正在从本地缓存播放',
offlineNoCacheBanner: '无服务器连接 — 无法访问 {{server}}',
offlineLibraryTitle: '离线音乐库',
offlineLibraryDiskLabel: '磁盘占用',
offlineLibraryDiskUsage: '磁盘占用:{{size}}',
offlineLibraryDiskUsageLoading: '磁盘占用:…',
offlineLibraryDiskTierLibrary: '离线库 (media/library){{size}}',
offlineLibraryDiskTierFavorites: '收藏 (media/favorites){{size}}',
offlineLibraryEmpty: '尚未缓存任何专辑。请联网,打开专辑并点击"设为离线可用"。',
offlineCachedOnServer: '来自 {{server}}',
offlineAlbumCount_one: '{{n}} 张专辑',
offlineAlbumCount_plural: '{{n}} 张专辑',
offlineCacheQueueTitle: '离线缓存',
offlineCacheQueueSubtitle: '磁盘上 {{n}} 首曲目 — 随机播放',
offlineCacheQueuePlayAria: '随机播放所有已缓存曲目',
offlineFavoritesQueueTitle: '收藏',
offlineFavoritesQueuePlayAria: '随机播放所有离线收藏曲目',
retry: '重试',
serverSettings: '服务器设置',
switchServerTitle: '切换服务器',
+5
View File
@@ -16,4 +16,9 @@ export const favorites = {
topArtists: '按收藏数排行的艺术家',
topArtistsSongCount_one: '{{count}} 首歌曲',
topArtistsSongCount_other: '{{count}} 首歌曲',
offlineTooltip: '保存收藏以便离线播放',
offlineJobName: '收藏',
offlineSemaphoreSyncing: '正在同步收藏… {{saved}} / {{total}}',
offlineSemaphoreSynced: '所有收藏已保存,可离线播放',
offlineSemaphoreError: '同步出错,部分曲目未能保存',
};
+10 -3
View File
@@ -144,16 +144,23 @@ export const settings = {
scrobbleDesc: '播放 50% 后发送歌曲到 Last.fm',
behavior: '应用行为',
cacheTitle: '最大存储大小',
cacheDesc: '封面和艺术家图片。存满时,最旧的条目将自动移除。离线专辑不会自动移除,但手动清除缓存时会被删除。',
cacheDesc: '浏览器内封面和艺术家图片缓存(IndexedDB。存满时,最旧的条目将自动移除。',
cacheUsedImages: '图片:',
cacheUsedOffline: '离线曲目:',
cacheUsedHot: '占用空间:',
hotCacheTrackCount: '缓存曲目数:',
cacheMaxLabel: '最大容量',
cacheClearBtn: '清除缓存',
cacheClearWarning: '这将同时移除音乐库中的所有离线专辑。',
cacheClearConfirm: '全部清除',
cacheClearWarning: '将清除所有已缓存的封面和艺术家图片,需要时会重新下载。',
cacheClearConfirm: '清除图片缓存',
cacheClearCancel: '取消',
mediaDirTitle: '媒体文件夹',
mediaDirDesc: '本地播放根目录。离线音乐库使用 library/;队列预缓冲使用 cache/。',
mediaDirDefault: '默认(应用数据)',
mediaDirChange: '更改文件夹',
mediaDirClear: '重置为默认',
mediaDirHint: '新下载将保存到此位置。现有文件保留在原路径,直到你删除它们。',
offlineStorageTitle: '离线存储',
offlineDirTitle: '离线音乐库(应用内)',
offlineDirDesc: '用于在 Psysonic 中离线可用的曲目存储位置。',
offlineDirDefault: '默认(应用数据)',