i18n: add Settings audio, offline library, and updates translations

Complete Spanish translations for:
- Audio settings (backend, ALSA plugin, hardware volume, streaming)
- Offline library section (repair, manage, clear)
- Updates section (check on launch, show changelog)
- Flatpak warning messages
This commit is contained in:
vicrodh committed 2026-02-02 16:29:04 -06:00
1 parent 55d383c431
commit 805fec1529
3 files changed
+126 -44

No files matched your search

+40 -40
View File
@@ -1894,8 +1894,8 @@
<div class="loading-overlay">
<div class="loading-content">
<Loader2 size={48} class="spinner" />
<p>Loading audio devices...</p>
<p class="loading-subtitle">Parsing hardware information</p>
<p>{$t('settings.audio.loadingAudioDevices')}</p>
<p class="loading-subtitle">{$t('settings.audio.parsingHardware')}</p>
</div>
</div>
{/if}
@@ -1953,15 +1953,15 @@
</div>
<div class="setting-row">
<div class="setting-info">
<span class="setting-label">Limit Quality to Device</span>
<span class="setting-desc">When enabled, overrides the quality setting above if your audio device doesn't support the selected sample rate. Prevents resampling to guarantee bit-perfect playback.</span>
<span class="setting-label">{$t('settings.audio.limitQualityToDevice')}</span>
<span class="setting-desc">{$t('settings.audio.limitQualityToDeviceDesc')}</span>
</div>
<Toggle enabled={limitQualityToDevice} onchange={handleLimitQualityToDeviceChange} />
</div>
<div class="setting-row">
<div class="setting-info">
<span class="setting-label">Audio Backend</span>
<span class="setting-desc">Choose audio system: Auto (recommended), PipeWire (modern), ALSA Direct (bit-perfect, exclusive), or PulseAudio (legacy).</span>
<span class="setting-label">{$t('settings.audio.audioBackend')}</span>
<span class="setting-desc">{$t('settings.audio.audioBackendDesc')}</span>
</div>
<Dropdown
value={selectedBackend}
@@ -1975,10 +1975,10 @@
<div class="setting-row">
<div class="setting-info">
<span class="setting-label">{$t('settings.audio.outputDevice')}</span>
<span class="setting-desc">Select your preferred audio output device. Devices shown are from the selected backend.</span>
<span class="setting-desc">{$t('settings.audio.outputDeviceDesc')}</span>
</div>
{#if isLoadingDevices}
<span class="loading-text">Loading devices...</span>
<span class="loading-text">{$t('settings.audio.loadingDevices')}</span>
{:else if selectedBackend === 'ALSA Direct'}
<div class="dropdown-with-help">
<DeviceDropdown
@@ -1992,7 +1992,7 @@
<button
class="help-icon-btn"
onclick={() => showAlsaUtilsHelpModal = true}
title="Help with bit-perfect device detection"
title={$t('settings.audio.helpBitPerfect')}
>
<HelpCircle size={16} />
</button>
@@ -2020,8 +2020,8 @@
{#if showAlsaPluginSelector}
<div class="setting-row">
<div class="setting-info">
<span class="setting-label">ALSA Plugin</span>
<span class="setting-desc">hw: Bit-perfect, exclusive. plughw: Auto-convert. pcm: Most compatible.</span>
<span class="setting-label">{$t('settings.audio.alsaPlugin')}</span>
<span class="setting-desc">{$t('settings.audio.alsaPluginDesc')}</span>
</div>
<Dropdown
value={selectedAlsaPlugin}
@@ -2036,8 +2036,8 @@
{#if showAlsaHardwareVolume}
<div class="setting-row">
<div class="setting-info">
<span class="setting-label">Enable Hardware Volume Control</span>
<span class="setting-desc">Experimental: Controls DAC volume via ALSA mixer. Some DACs don't support this - disable for maximum compatibility. If it fails, playback continues normally.</span>
<span class="setting-label">{$t('settings.audio.hardwareVolume')}</span>
<span class="setting-desc">{$t('settings.audio.hardwareVolumeDesc')}</span>
</div>
<Toggle enabled={alsaHardwareVolume} onchange={handleAlsaHardwareVolumeChange} />
</div>
@@ -2060,24 +2060,24 @@
<div class="flatpak-warning">
<div class="warning-icon">⚠️</div>
<div class="warning-content">
<strong>Flatpak Limitation:</strong> PipeWire cannot guarantee bit-perfect playback in sandboxed environments due to daemon access restrictions.
<strong>{$t('settings.audio.flatpakWarningTitle')}</strong> {$t('settings.audio.flatpakWarningDesc')}
<br />
<strong>Recommended:</strong> Switch to ALSA Direct backend for true bit-perfect audio.
<strong>{$t('settings.audio.flatpakRecommended')}</strong> {$t('settings.audio.flatpakRecommendedDesc')}
</div>
</div>
{/if}
<div class="setting-row">
<div class="setting-info">
<span class="setting-label">Stream Uncached Tracks</span>
<span class="setting-desc">Start playback faster when track is not in cache. Seeking may be limited during initial buffering.</span>
<span class="setting-label">{$t('settings.audio.streamUncached')}</span>
<span class="setting-desc">{$t('settings.audio.streamUncachedDesc')}</span>
</div>
<Toggle enabled={streamFirstTrack} onchange={handleStreamFirstTrackChange} />
</div>
{#if streamFirstTrack}
<div class="setting-row">
<div class="setting-info">
<span class="setting-label">Initial Buffer Size</span>
<span class="setting-desc">Seconds to buffer before starting playback ({streamBufferSeconds}s)</span>
<span class="setting-label">{$t('settings.audio.initialBuffer')}</span>
<span class="setting-desc">{$t('settings.audio.initialBufferDesc', { values: { seconds: streamBufferSeconds } })}</span>
</div>
<input
type="range"
@@ -2092,8 +2092,8 @@
{/if}
<div class="setting-row">
<div class="setting-info">
<span class="setting-label">Streaming Only</span>
<span class="setting-desc">Disables temporary cache. Not recommended without a fast connection. Offline library tracks always play first.</span>
<span class="setting-label">{$t('settings.audio.streamingOnly')}</span>
<span class="setting-desc">{$t('settings.audio.streamingOnlyDesc')}</span>
</div>
<Toggle enabled={streamingOnly} onchange={handleStreamingOnlyChange} />
</div>
@@ -2312,7 +2312,7 @@
<section class="section collapsible-section" bind:this={downloadsSection}>
<button class="section-title-btn" onclick={() => offlineLibraryCollapsed = !offlineLibraryCollapsed}>
<h3 class="section-title">{$t('settings.offlineLibrary.title')}</h3>
<span class="section-summary">Cached tracks for offline playback</span>
<span class="section-summary">{$t('settings.offlineLibrary.sectionSummary')}</span>
{#if offlineLibraryCollapsed}
<ChevronDown size={16} />
{:else}
@@ -2333,37 +2333,37 @@
</div>
<div class="setting-row">
<div class="setting-with-description">
<span class="setting-label">Repair Offline Library</span>
<span class="setting-description">Fix offline markers lost during library scans</span>
<span class="setting-label">{$t('settings.offlineLibrary.repair')}</span>
<span class="setting-description">{$t('settings.offlineLibrary.repairDesc')}</span>
</div>
<button
class="clear-btn"
onclick={handleRepairDownloads}
disabled={isRepairingDownloads || !downloadStats || downloadStats.readyTracks === 0}
>
{isRepairingDownloads ? 'Repairing...' : 'Repair'}
{isRepairingDownloads ? $t('settings.offlineLibrary.repairing') : $t('actions.repair')}
</button>
</div>
<div class="setting-row">
<span class="setting-label">Clear Offline Library</span>
<span class="setting-label">{$t('settings.offlineLibrary.clearCache')}</span>
<button
class="clear-btn"
onclick={handleClearDownloads}
disabled={isClearingDownloads || !downloadStats || downloadStats.readyTracks === 0}
>
{isClearingDownloads ? 'Clearing...' : 'Clear All'}
{isClearingDownloads ? $t('settings.storage.clearing') : $t('settings.offlineLibrary.clearCache')}
</button>
</div>
<div class="setting-row last">
<div class="setting-with-description">
<span class="setting-label">Manage Offline Cache</span>
<span class="setting-description">Open the cache folder in your file manager</span>
<span class="setting-label">{$t('settings.offlineLibrary.manageCache')}</span>
<span class="setting-description">{$t('settings.offlineLibrary.manageCacheDesc')}</span>
</div>
<button
class="clear-btn"
onclick={handleOpenCacheFolder}
>
Open Folder
{$t('settings.offlineLibrary.openFolder')}
</button>
</div>
{/if}
@@ -2547,11 +2547,11 @@
<!-- Updates Section -->
<section class="section" bind:this={updatesSection}>
<h3 class="section-title">Updates</h3>
<h3 class="section-title">{$t('settings.updates.title')}</h3>
<div class="setting-row">
<div class="setting-info">
<span class="setting-label">Check for new releases on launch</span>
<span class="setting-label">{$t('settings.updates.checkOnLaunch')}</span>
</div>
<Toggle
enabled={updatePreferences.checkOnLaunch}
@@ -2561,7 +2561,7 @@
<div class="setting-row">
<div class="setting-info">
<span class="setting-label">Check for updates now</span>
<span class="setting-label">{$t('settings.updates.checkNow')}</span>
</div>
<button
class="connect-btn updates-check-btn"
@@ -2571,16 +2571,16 @@
>
{#if isCheckingUpdates}
<Loader2 size={14} class="spin" />
<span>Checking...</span>
<span>{$t('settings.updates.checking')}</span>
{:else}
<span>Check</span>
<span>{$t('settings.updates.check')}</span>
{/if}
</button>
</div>
<div class="setting-row">
<div class="setting-info">
<span class="setting-label">Show what's new on new version launch</span>
<span class="setting-label">{$t('settings.updates.showWhatsNew')}</span>
</div>
<Toggle
enabled={updatePreferences.showWhatsNewOnLaunch}
@@ -2590,9 +2590,9 @@
<div class="setting-row last">
<div class="setting-info">
<span class="setting-label">Show changelog for current version</span>
<span class="setting-label">{$t('settings.updates.showChangelog')}</span>
{#if updatesCurrentVersion}
<small class="setting-note">Current version: v{updatesCurrentVersion}</small>
<small class="setting-note">{$t('settings.updates.currentVersion', { values: { version: updatesCurrentVersion } })}</small>
{/if}
</div>
<button
@@ -2600,7 +2600,7 @@
onclick={handleShowCurrentChangelog}
type="button"
>
Show
{$t('actions.show')}
</button>
</div>
</section>
@@ -2763,7 +2763,7 @@
onclick={handleClearAllCaches}
disabled={isClearingAllCaches}
>
{isClearingAllCaches ? $t('settings.storage.clearing') : 'Clear All'}
{isClearingAllCaches ? $t('settings.storage.clearing') : $t('actions.clearAll')}
</button>
</div>
{/if}
+43 -2
View File
@@ -344,8 +344,10 @@
"edit": "Edit",
"close": "Close",
"open": "Open",
"show": "Show",
"refresh": "Refresh",
"retry": "Retry",
"repair": "Repair",
"clear": "Clear",
"clearAll": "Clear All",
"confirm": "Confirm",
@@ -373,13 +375,36 @@
"streamingQualityDesc": "Maximum quality for streaming and playback cache",
"qualityChangedCacheCleared": "Quality changed. Playback cache cleared.",
"outputDevice": "Output Device",
"outputDeviceDesc": "Select your preferred audio output device. Devices shown are from the selected backend.",
"audioDevice": "Audio Device",
"exclusiveMode": "Exclusive Mode",
"exclusiveModeDesc": "Lock audio device for exclusive use",
"dacPassthrough": "DAC Passthrough",
"dacPassthroughDesc": "Bypass system mixer for bit-perfect output",
"currentSampleRate": "Current Sample Rate",
"noActivePlayback": "No active playback"
"noActivePlayback": "No active playback",
"loadingDevices": "Loading devices...",
"loadingAudioDevices": "Loading audio devices...",
"parsingHardware": "Parsing hardware information",
"limitQualityToDevice": "Limit Quality to Device",
"limitQualityToDeviceDesc": "When enabled, overrides the quality setting above if your audio device doesn't support the selected sample rate. Prevents resampling to guarantee bit-perfect playback.",
"audioBackend": "Audio Backend",
"audioBackendDesc": "Choose audio system: Auto (recommended), PipeWire (modern), ALSA Direct (bit-perfect, exclusive), or PulseAudio (legacy).",
"alsaPlugin": "ALSA Plugin",
"alsaPluginDesc": "hw: Bit-perfect, exclusive. plughw: Auto-convert. pcm: Most compatible.",
"hardwareVolume": "Enable Hardware Volume Control",
"hardwareVolumeDesc": "Experimental: Controls DAC volume via ALSA mixer. Some DACs don't support this - disable for maximum compatibility. If it fails, playback continues normally.",
"helpBitPerfect": "Help with bit-perfect device detection",
"flatpakWarningTitle": "Flatpak Limitation:",
"flatpakWarningDesc": "PipeWire cannot guarantee bit-perfect playback in sandboxed environments due to daemon access restrictions.",
"flatpakRecommended": "Recommended:",
"flatpakRecommendedDesc": "Switch to ALSA Direct backend for true bit-perfect audio.",
"streamUncached": "Stream Uncached Tracks",
"streamUncachedDesc": "Start playback faster when track is not in cache. Seeking may be limited during initial buffering.",
"initialBuffer": "Initial Buffer Size",
"initialBufferDesc": "Seconds to buffer before starting playback ({seconds}s)",
"streamingOnly": "Streaming Only",
"streamingOnlyDesc": "Disables temporary cache. Not recommended without a fast connection. Offline library tracks always play first."
},
"playback": {
"title": "Playback",
@@ -465,7 +490,23 @@
"disclaimer": "The offline library is a temporary playback cache for offline listening while you have a valid Qobuz subscription. You do not receive a license to keep or redistribute the content. If your subscription becomes invalid, QBZ will remove all cached content after 3 days.",
"cachedTracks": "Offline Tracks",
"clearCache": "Clear All",
"openFolder": "Open Folder"
"openFolder": "Open Folder",
"repair": "Repair Offline Library",
"repairDesc": "Fix offline markers lost during library scans",
"manageCache": "Manage Offline Cache",
"manageCacheDesc": "Open the cache folder in your file manager",
"sectionSummary": "Cached tracks for offline playback",
"repairing": "Repairing..."
},
"updates": {
"title": "Updates",
"checkOnLaunch": "Check for new releases on launch",
"checkNow": "Check for updates now",
"checking": "Checking...",
"check": "Check",
"showWhatsNew": "Show what's new on new version launch",
"showChangelog": "Show changelog for current version",
"currentVersion": "Current version: v{version}"
},
"networkCacheWarning": "The selected folder is on a network drive.",
"networkCacheWarningDetail": "Cached tracks may not be available when the network is disconnected or in offline mode. Are you sure you want to use this location?",
+43 -2
View File
@@ -344,8 +344,10 @@
"edit": "Editar",
"close": "Cerrar",
"open": "Abrir",
"show": "Mostrar",
"refresh": "Actualizar",
"retry": "Reintentar",
"repair": "Reparar",
"clear": "Limpiar",
"clearAll": "Limpiar Todo",
"confirm": "Confirmar",
@@ -373,13 +375,36 @@
"streamingQualityDesc": "Calidad máxima para streaming y caché de reproducción",
"qualityChangedCacheCleared": "Calidad cambiada. Caché de reproducción limpiado.",
"outputDevice": "Dispositivo de Salida",
"outputDeviceDesc": "Selecciona tu dispositivo de audio preferido. Se muestran los dispositivos del backend seleccionado.",
"audioDevice": "Dispositivo de Audio",
"exclusiveMode": "Modo Exclusivo",
"exclusiveModeDesc": "Bloquear dispositivo de audio para uso exclusivo",
"dacPassthrough": "Passthrough DAC",
"dacPassthroughDesc": "Bypass del mixer del sistema para salida bit-perfect",
"currentSampleRate": "Tasa de Muestreo Actual",
"noActivePlayback": "Sin reproducción activa"
"noActivePlayback": "Sin reproducción activa",
"loadingDevices": "Cargando dispositivos...",
"loadingAudioDevices": "Cargando dispositivos de audio...",
"parsingHardware": "Analizando información de hardware",
"limitQualityToDevice": "Limitar Calidad al Dispositivo",
"limitQualityToDeviceDesc": "Cuando está activado, anula la configuración de calidad si tu dispositivo de audio no soporta la tasa de muestreo seleccionada. Previene el remuestreo para garantizar reproducción bit-perfect.",
"audioBackend": "Backend de Audio",
"audioBackendDesc": "Elige el sistema de audio: Auto (recomendado), PipeWire (moderno), ALSA Direct (bit-perfect, exclusivo), o PulseAudio (legacy).",
"alsaPlugin": "Plugin ALSA",
"alsaPluginDesc": "hw: Bit-perfect, exclusivo. plughw: Auto-conversión. pcm: Más compatible.",
"hardwareVolume": "Habilitar Control de Volumen por Hardware",
"hardwareVolumeDesc": "Experimental: Controla el volumen del DAC vía mixer ALSA. Algunos DACs no lo soportan - desactívalo para máxima compatibilidad. Si falla, la reproducción continúa normalmente.",
"helpBitPerfect": "Ayuda con detección de dispositivos bit-perfect",
"flatpakWarningTitle": "Limitación de Flatpak:",
"flatpakWarningDesc": "PipeWire no puede garantizar reproducción bit-perfect en entornos sandbox debido a restricciones de acceso al daemon.",
"flatpakRecommended": "Recomendado:",
"flatpakRecommendedDesc": "Cambiar al backend ALSA Direct para audio bit-perfect verdadero.",
"streamUncached": "Transmitir Pistas Sin Caché",
"streamUncachedDesc": "Inicia la reproducción más rápido cuando la pista no está en caché. La búsqueda puede estar limitada durante el buffering inicial.",
"initialBuffer": "Tamaño del Buffer Inicial",
"initialBufferDesc": "Segundos a almacenar en buffer antes de iniciar reproducción ({seconds}s)",
"streamingOnly": "Solo Streaming",
"streamingOnlyDesc": "Desactiva el caché temporal. No recomendado sin una conexión rápida. Las pistas de la biblioteca offline siempre se reproducen primero."
},
"playback": {
"title": "Reproducción",
@@ -465,7 +490,23 @@
"disclaimer": "La biblioteca offline es un caché temporal de reproducción para escucha sin conexión mientras tengas una suscripción válida de Qobuz. No recibes una licencia para conservar o redistribuir el contenido. Si tu suscripción deja de ser válida, QBZ eliminará todo el contenido en caché después de 3 días.",
"cachedTracks": "Pistas Offline",
"clearCache": "Limpiar Todo",
"openFolder": "Abrir Carpeta"
"openFolder": "Abrir Carpeta",
"repair": "Reparar Biblioteca Offline",
"repairDesc": "Corregir marcadores offline perdidos durante escaneos de biblioteca",
"manageCache": "Administrar Caché Offline",
"manageCacheDesc": "Abrir la carpeta de caché en tu administrador de archivos",
"sectionSummary": "Pistas en caché para reproducción offline",
"repairing": "Reparando..."
},
"updates": {
"title": "Actualizaciones",
"checkOnLaunch": "Buscar nuevas versiones al iniciar",
"checkNow": "Buscar actualizaciones ahora",
"checking": "Verificando...",
"check": "Verificar",
"showWhatsNew": "Mostrar novedades al lanzar nueva versión",
"showChangelog": "Mostrar registro de cambios para la versión actual",
"currentVersion": "Versión actual: v{version}"
},
"networkCacheWarning": "La carpeta seleccionada está en una unidad de red.",
"networkCacheWarningDetail": "Las pistas en caché pueden no estar disponibles cuando la red esté desconectada o en modo offline. ¿Estás seguro de que quieres usar esta ubicación?",