Files
Psychotoxical-psysonic/src/locales/es/settings.ts
T
Frank Stellmacher bca45d5a80 feat(servers): scan actions + edit existing server profiles (#780)
* feat(server-scan): plumbing for triggering library scans

Adds `startScan` / `getScanStatus` against the Subsonic API
(`fullScan=true` is Navidrome's extension), a small per-server scan
store, and a global polling hook (2 s cadence) that emits a toast when
each scan finishes. Scans can run on any configured server, including
inactive ones, by reusing `apiForServer`.

UI surfaces follow in the next commit.

* feat(server-scan): expose Quick / Full Scan in switcher + settings cards

Adds a `ServerScanActions` component with two variants (compact for the
server-switcher dropdown, card for the Settings server cards) backed by
the scan store from the previous commit. Full Scan requires a second
click within 3 s to confirm, matching the playlist-delete pattern.
Status slot shows a spinner with running track count while scanning, a
green check when finished, and a red icon on error.

The switcher row is converted from a single button to a flex container
so per-server scan controls don't hijack the server-switch click.
i18n added across all 9 locales.

* fix(server-scan): reorder switcher row to check / name / scan actions

Moves the check / spinner slot from the right edge to the left so the
spinner pop-in on server switch doesn't sit next to the scan icons.
Removes the layout shift that briefly hovered the Quick scan button
when the row re-rendered.

* feat(servers): edit existing server profiles in Settings → Servers

* Pencil-button on each server card opens an inline edit form that
  replaces the card (prefilled name / URL / username / password).
* `AddServerForm` reused with an `editingServer` prop — title flips to
  "Edit Server", submit label to "Save", magic-string field hidden (the
  edit scope is manual fields; magic-string remains an add-time invite
  shortcut).
* Edit saves unconditionally — ping runs post-save as a status indicator
  (analog to the existing Test button) instead of gating the save. Lets
  users update a profile when the server is currently unreachable.
* Translations across all 9 locales (`editServer`, `editServerTitle`).

* fix(servers): submit Add/Edit Server form on Enter

Wrapped the form body in a real <form>, made the submit button
type="submit", marked Cancel as type="button" so Enter no longer
cancels. Add-Mode now also responds to Enter — same flow, consistent
across both modes.

* fix(servers): collapse card action buttons to icon-only on narrow screens

* Quick-Scan / Full-Scan / Test buttons in each server card hide their
  text label below 1100px viewport via the .server-card-btn-label class
  and a single media query in connection-indicator.css.
* Labels remain accessible via data-tooltip and aria-label so screen
  readers + hover both keep working in the collapsed state.
* No content reflow above the breakpoint — pure additive CSS.

* fix(servers): include Use button in icon-only narrow-screen collapse

The Use ("Verwenden") button on inactive server cards lacked the
.server-card-btn-label wrapper, so its text stayed visible at narrow
viewports and pushed Edit/Delete off-screen. Added a Power icon and
wrapped the label so it collapses alongside the other action buttons.

* docs(changelog,credits): #780 server scan + edit
2026-05-18 16:32:40 +02:00

479 lines
30 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export const settings = {
title: 'Configuración',
language: 'Idioma',
languageEn: 'English',
languageDe: 'Deutsch',
languageEs: 'Español',
languageFr: 'Français',
languageNl: 'Nederlands',
languageNb: 'Norsk',
languageRu: 'Русский',
languageZh: '中文',
languageRo: 'Română',
font: 'Fuente',
fontHintOpenDyslexic: 'Compatible con dislexia · sin soporte para chino',
theme: 'Tema',
appearance: 'Apariencia',
servers: 'Servidores',
serverName: 'Nombre del Servidor',
serverUrl: 'URL del Servidor',
serverUrlPlaceholder: '192.168.1.100:4533 o https://music.example.com',
serverUsername: 'Usuario',
serverPassword: 'Contraseña',
addServer: 'Agregar Servidor',
addServerTitle: 'Agregar Nuevo Servidor',
editServer: 'Editar',
editServerTitle: 'Editar Servidor',
useServer: 'Usar',
deleteServer: 'Eliminar',
noServers: 'No hay servidores guardados.',
serverActive: 'Activo',
confirmDeleteServer: '¿Eliminar servidor "{{name}}"?',
serverConnecting: 'Conectando…',
serverConnected: '¡Conectado!',
serverFailed: 'Conexión fallida.',
testBtn: 'Probar Conexión',
testingBtn: 'Probando…',
serverCompatible: 'Diseñado para Navidrome. Otros servidores compatibles con Subsonic (Gonic, Airsonic, …) pueden funcionar con funcionalidad reducida, ya que Psysonic utiliza muchos endpoints específicos de la API de Navidrome.',
userMgmtTitle: 'Gestión de usuarios',
userMgmtDesc: 'Administra los usuarios de este servidor. Requiere privilegios de administrador.',
userMgmtNoAdmin: 'Necesitas privilegios de administrador para gestionar usuarios en este servidor.',
userMgmtLoadError: 'No se pudieron cargar los usuarios.',
userMgmtLoadFriendly: 'El servidor no respondió — suele ser algo puntual.',
userMgmtRetry: 'Reintentar',
userMgmtEmpty: 'No se encontraron usuarios.',
userMgmtYouBadge: 'Tú',
userMgmtAdminBadge: 'Admin',
userMgmtAddUser: 'Añadir usuario',
userMgmtAddUserTitle: 'Nuevo usuario',
userMgmtEditUserTitle: 'Editar usuario',
userMgmtUsername: 'Nombre de usuario',
userMgmtName: 'Nombre visible',
userMgmtEmail: 'Correo electrónico',
userMgmtPassword: 'Contraseña',
userMgmtPasswordEditHint: 'Introduce una nueva contraseña para actualizarla.',
userMgmtRoleAdmin: 'Admin',
userMgmtLibraries: 'Bibliotecas',
userMgmtLibrariesAdminHint: 'Los usuarios admin tienen acceso automáticamente a todas las bibliotecas.',
userMgmtLibrariesEmpty: 'No hay bibliotecas disponibles en este servidor.',
userMgmtLibrariesValidation: 'Selecciona al menos una biblioteca.',
userMgmtLibrariesUpdateError: 'Usuario guardado, pero la asignación de bibliotecas falló',
userMgmtNoLibraries: 'Sin bibliotecas asignadas',
userMgmtNeverSeen: 'Nunca',
userMgmtSave: 'Guardar',
userMgmtCancel: 'Cancelar',
userMgmtDelete: 'Eliminar',
userMgmtEdit: 'Editar',
userMgmtConfirmDelete: '¿Eliminar el usuario «{{username}}»? Esta acción no se puede deshacer.',
userMgmtCreateError: 'No se pudo crear el usuario.',
userMgmtUpdateError: 'No se pudo actualizar el usuario.',
userMgmtDeleteError: 'No se pudo eliminar el usuario.',
userMgmtCreated: 'Usuario creado.',
userMgmtUpdated: 'Usuario actualizado.',
userMgmtDeleted: 'Usuario eliminado.',
userMgmtValidationMissing: 'Se requieren nombre de usuario, nombre visible y contraseña.',
userMgmtValidationMissingIdentity: 'Se requieren nombre de usuario y nombre visible.',
userMgmtMagicStringGenerate: 'Generar cadena mágica',
userMgmtSaveAndMagicString: 'Guardar y obtener cadena mágica',
userMgmtMagicStringPasswordNavHint:
'Navidrome guardará esta contraseña para el usuario. Si difiere de la actual, se actualizará la contraseña de acceso en el servidor.',
userMgmtMagicStringPlaintextWarning:
'Comparte la cadena mágica con cuidado: contiene la contraseña sin cifrar (la codificación no es cifrado). Quien tenga la cadena completa puede iniciar sesión como este usuario.',
userMgmtMagicStringCopied: 'Cadena mágica copiada al portapapeles.',
userMgmtMagicStringCopyFailed: 'No se pudo copiar al portapapeles.',
userMgmtMagicStringLoginFailed: 'Falló la comprobación de la contraseña; no se pudieron verificar las credenciales.',
userMgmtMagicStringModalTitle: 'Generar cadena mágica',
userMgmtMagicStringModalDesc: 'Introduce la contraseña Subsonic de «{{username}}». Se incluirá en la cadena mágica copiada.',
userMgmtMagicStringModalConfirm: 'Copiar cadena',
audiomuseTitle: 'AudioMuse-AI (Navidrome)',
audiomuseDesc:
'Activa si este servidor tiene el plugin <pluginLink>AudioMuse-AI Navidrome</pluginLink> configurado. Habilita Mezcla Instantánea desde pistas y usa artistas similares del servidor en lugar de Last.fm en páginas de artistas.',
audiomuseIssueHint:
'La Mezcla Instantánea falló recientemente — verifica el plugin de Navidrome y la API de AudioMuse. Artistas similares usan Last.fm como respaldo cuando el servidor no devuelve ninguno.',
connected: 'Conectado',
failed: 'Fallido',
eqTitle: 'Ecualizador',
eqEnabled: 'Habilitar Ecualizador',
eqPreset: 'Preajuste',
eqPresetCustom: 'Personalizado',
eqPresetBuiltin: 'Preajustes Integrados',
eqPresetCustomGroup: 'Mis Preajustes',
eqSavePreset: 'Guardar como Preajuste',
eqPresetName: 'Nombre del preajuste…',
eqDeletePreset: 'Eliminar preajuste',
eqResetBands: 'Restablecer a Plano',
eqPreGain: 'Pre-ganancia',
eqResetPreGain: 'Restablecer pre-ganancia',
eqAutoEqTitle: 'Búsqueda AutoEQ de Auriculares',
eqAutoEqPlaceholder: 'Buscar modelo de auricular / IEM…',
eqAutoEqSearching: 'Buscando…',
eqAutoEqNoResults: 'No se encontraron resultados',
eqAutoEqError: 'Error de búsqueda',
eqAutoEqRateLimit: 'Límite de GitHub alcanzado — intenta de nuevo en un minuto',
eqAutoEqFetchError: 'Error al obtener perfil EQ',
lfmTitle: 'Last.fm',
lfmConnect: 'Conectar con Last.fm',
lfmConnecting: 'Esperando autorización…',
lfmConfirm: 'He autorizado la aplicación',
lfmConnected: 'Conectado como',
lfmDisconnect: 'Desconectar',
lfmConnectDesc: 'Conecta tu cuenta de Last.fm para habilitar scrobbling y actualizaciones de "Reproduciendo Ahora" directamente desde Psysonic — no requiere configuración de Navidrome.',
lfmOpenBrowser: 'Se abrirá una ventana del navegador. Autoriza Psysonic en Last.fm, luego click en el botón de abajo.',
lfmScrobbles: '{{n}} scrobbles',
lfmMemberSince: 'Miembro desde {{year}}',
scrobbleEnabled: 'Scrobbling habilitado',
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.',
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',
cacheClearCancel: 'Cancelar',
offlineDirTitle: 'Biblioteca Offline (En App)',
offlineDirDesc: 'Ubicación de almacenamiento para pistas que haces disponibles offline dentro de Psysonic.',
offlineDirDefault: 'Predeterminado (Datos de App)',
offlineDirChange: 'Cambiar Directorio',
offlineDirClear: 'Restablecer a Predeterminado',
offlineDirHint: 'Las nuevas descargas usarán esta ubicación. Las descargas existentes permanecen en su ruta original.',
hotCacheTitle: 'Caché de reproducción activa',
hotCacheDisclaimer: 'Precarga las siguientes pistas en cola y mantiene las anteriores. Cuando está activado, usa espacio en disco y red.',
hotCacheDirDefault: 'Predeterminado (Datos de App)',
hotCacheDirChange: 'Cambiar carpeta',
hotCacheDirClear: 'Restablecer a predeterminado',
hotCacheDirHint: 'Cambiar la carpeta restablece el índice en-app; los archivos ya en disco permanecen donde están hasta que los elimines.',
hotCacheEnabled: 'Habilitar caché de reproducción activa',
hotCacheMaxMb: 'Tamaño máximo de caché',
hotCacheDebounce: 'Espera de cambio de cola',
hotCacheDebounceImmediate: 'Inmediato',
hotCacheDebounceSeconds: '{{n}} s',
hotCacheClearBtn: 'Limpiar caché activa',
audioOutputDevice: 'Dispositivo de salida de audio',
audioOutputDeviceDesc: 'Selecciona el dispositivo de audio que usa Psysonic. Los cambios surten efecto de inmediato y reinician la pista actual.',
audioOutputDeviceDefault: 'Predeterminado del sistema',
audioOutputDeviceRefresh: 'Actualizar lista de dispositivos',
audioOutputDeviceOsDefaultNow: 'salida actual del sistema',
audioOutputDeviceListError: 'No se pudo cargar la lista de dispositivos de audio.',
audioOutputDeviceNotInCurrentList: 'no está en la lista actual',
audioOutputDeviceMacNotice: 'En macOS, la reproducción actualmente sigue siempre al dispositivo de salida del sistema por razones técnicas. Cambia el destino mediante Ajustes del Sistema → Sonido o el icono del altavoz en la barra de menús. Motivo: CoreAudio activa una solicitud de permiso de micrófono al abrir un stream no-predeterminado — lo evitamos usando siempre la salida por defecto del sistema.',
hiResTitle: 'Reproducción Nativa Hi-Res',
hiResEnabled: 'Habilitar reproducción nativa hi-res',
hiResDesc: "Fuerza 44.1 kHz de salida por defecto para máxima estabilidad. Habilita solo si tu hardware y red soportan confiablemente altas tasas de muestreo (88.2 kHz+).",
showArtistImages: 'Mostrar Imágenes de Artistas',
showArtistImagesDesc: 'Carga y muestra imágenes de artistas en el resumen de Artistas. Desactivado por defecto para reducir I/O de disco del servidor y carga de red en bibliotecas grandes.',
showOrbitTrigger: 'Mostrar "Orbit" en la cabecera',
showOrbitTriggerDesc: 'El botón en la cabecera para iniciar o unirse a una sesión de escucha compartida. Ocúltalo si no usas Orbit — puedes volver a activarlo aquí.',
showTrayIcon: 'Mostrar Icono en Bandeja',
showTrayIconDesc: 'Muestra el icono de Psysonic en el área de notificación / barra de menú.',
minimizeToTray: 'Minimizar a Bandeja',
minimizeToTrayDesc: 'Al cerrar la ventana, mantener Psysonic ejecutándose en la bandeja del sistema en lugar de salir.',
clockFormat: 'Formato de hora',
clockFormatDesc: 'Formato del reloj utilizado por la ETA de la cola y la vista previa del temporizador de suspensión.',
clockFormatAuto: 'Automático (idioma del sistema)',
clockFormatTwentyFour: '24 horas',
clockFormatTwelve: '12 horas (AM/PM)',
preloadMiniPlayer: 'Precargar mini reproductor',
preloadMiniPlayerDesc: 'Crea la ventana del mini reproductor en segundo plano al iniciar la aplicación para que muestre contenido al instante la primera vez que se abre. Consume un poco más de memoria.',
discordRichPresence: 'Discord Rich Presence',
discordRichPresenceDesc: 'Muestra la pista actual en tu perfil de Discord. Requiere que Discord esté ejecutándose.',
useCustomTitlebar: 'Barra de título personalizada',
useCustomTitlebarDesc: 'Reemplaza la barra de título del sistema con una integrada que coincide con el tema de la app. Desactiva para usar la barra nativa de GNOME/GTK.',
linuxWebkitSmoothScroll: 'Rueda suave (Linux)',
linuxWebkitSmoothScrollDesc: 'Activado: inercia. Desactivado: pasos por línea (estilo GTK).',
discordCoverSource: 'Fuente de portada',
discordCoverSourceDesc: 'De dónde obtener la portada del álbum para tu perfil de Discord.',
discordCoverNone: 'Ninguna (solo icono de la app)',
discordCoverServer: 'Servidor (vía info del álbum)',
discordCoverApple: 'Apple Music',
discordOptions: 'Opciones avanzadas de Discord',
discordTemplates: 'Plantillas de texto personalizadas',
discordTemplatesDesc: 'Personaliza qué información se muestra en tu perfil de Discord. Variables: {title}, {artist}, {album}',
discordTemplateDetails: 'Línea principal (details)',
discordTemplateState: 'Línea secundaria (state)',
discordTemplateLargeText: 'Tooltip del álbum (largeText)',
nowPlayingEnabled: 'Mostrar en Reproduciendo Ahora',
nowPlayingEnabledDesc: 'Transmite tu pista actual a la vista de oyentes en vivo del servidor. Desactiva para dejar de enviar datos de reproducción.',
enableBandsintown: 'Fechas de gira de Bandsintown',
enableBandsintownDesc: 'Muestra próximos conciertos del artista actual en la pestaña Info. Los datos se obtienen de la API pública de Bandsintown.',
lyricsServerFirst: 'Preferir letras del servidor',
lyricsServerFirstDesc: 'Verifica primero letras provistas por el servidor (etiquetas embebidas, archivos sidecar) antes de consultar LRCLIB. Desactiva para usar LRCLIB primero.',
enableNeteaselyrics: 'Letras de Netease Cloud Music',
enableNeteaselyricsDesc: 'Usa Netease Cloud Music como fuente de letras de último recurso cuando el servidor y LRCLIB no devuelvan nada. Mejor cobertura para música asiática e internacional.',
lyricsSourcesTitle: 'Fuentes de Letras',
lyricsSourcesDesc: 'Elige qué fuentes consultar para letras y en qué orden. Arrastra para reordenar. Las fuentes desactivadas se omiten completamente.',
lyricsSourceServer: 'Servidor',
lyricsSourceLrclib: 'LRCLIB',
lyricsSourceNetease: 'Netease Cloud Music',
lyricsModeStandard: 'Estándar',
lyricsModeStandardDesc: 'Tres fuentes con orden configurable: etiquetas del servidor, LRCLIB, Netease.',
lyricsModeLyricsplus: 'YouLyPlus (Karaoke)',
lyricsModeLyricsplusDesc: 'Sincronización palabra por palabra desde Apple Music, Spotify, Musixmatch y QQ (backend comunitario). Recurre silenciosamente a las fuentes estándar cuando no se encuentra nada.',
lyricsStaticOnly: 'Mostrar letras como texto estático',
lyricsStaticOnlyDesc: 'Muestra las letras sincronizadas sin desplazamiento automático ni resaltado por palabra.',
downloadsTitle: 'Exportación ZIP y Archivado',
downloadsFolderDesc: 'Carpeta de destino para álbumes que descargas como ZIP a tu computadora.',
downloadsDefault: 'Carpeta de Descargas Predeterminada',
pickFolder: 'Seleccionar',
pickFolderTitle: 'Seleccionar Carpeta de Descarga',
clearFolder: 'Limpiar carpeta de descarga',
logout: 'Cerrar Sesión',
aboutTitle: 'Acerca de Psysonic',
aboutDesc: 'Un reproductor de música de escritorio moderno creado para Navidrome. Utiliza la API de Subsonic más extensiones específicas de Navidrome. Construido en Tauri v2 con motor de audio nativo en Rust — ligero y rápido, pero lleno de características: barra de progreso tipo onda, letras sincronizadas, integración Last.fm, ecualizador de 10 bandas, crossfade, reproducción gapless, Replay Gain, navegación por géneros, y una gran biblioteca de temas.',
aboutLicense: 'Licencia',
aboutLicenseText: 'GNU GPL v3 — libre para usar, modificar y distribuir bajo la misma licencia.',
aboutRepo: 'Código Fuente en GitHub',
aboutVersion: 'Versión',
aboutBuiltWith: 'Construido con Tauri · React · TypeScript · Rust/rodio',
aboutReleaseNotesLabel: 'Notas de la versión',
aboutReleaseNotesLink: 'Abrir las novedades de esta versión',
aboutContributorsLabel: 'Contribuidores',
showChangelogOnUpdate: "Mostrar 'Novedades' al actualizar",
showChangelogOnUpdateDesc: 'Muestra un discreto banner de changelog encima de Now Playing tras una actualización. Clic abre las notas de la versión; X lo oculta.',
libraryGridMaxColumnsTitle: 'Rejillas de tarjetas en la biblioteca',
libraryGridMaxColumnsPerfHint: 'Más columnas caben más mosaicos por fila y pueden aumentar el trabajo de diseño y pintado; se nota más en bibliotecas muy grandes o equipos lentos.',
libraryGridMaxColumnsRangeLabel: 'Máximo de columnas ({{min}}{{max}})',
libraryGridMaxColumnsDesc: 'Se aplica a vistas de álbum, artista, lista de reproducción, radio, sin conexión y otras con tarjetas. Menos columnas = mosaicos más grandes y suele aligerar la CPU.',
randomMixTitle: 'Lista negra de Mezcla Aleatoria',
luckyMixMenuTitle: 'Mostrar Mezcla Suerte en el menú',
luckyMixMenuDesc: 'Activa Mezcla Suerte en "Crear Mezcla" y como elemento de menú separado cuando la navegación dividida está activa. Solo visible cuando AudioMuse está activo en el servidor actual.',
randomMixBlacklistTitle: 'Palabras Clave de Filtro Personalizadas',
randomMixBlacklistDesc: 'Las canciones se excluyen cuando cualquier palabra clave coincide con su género, título, álbum o artista (activo cuando el checkbox de arriba está activado).',
randomMixBlacklistPlaceholder: 'Agregar palabra clave…',
randomMixBlacklistAdd: 'Agregar',
randomMixBlacklistEmpty: 'Aún no hay palabras clave personalizadas.',
randomMixHardcodedTitle: 'Palabras clave integradas (activas cuando el checkbox está activado)',
tabAudio: 'Audio',
tabStorage: 'Sin conexión y caché',
tabAppearance: 'Apariencia',
tabLibrary: 'Biblioteca',
tabServers: 'Servidores',
tabLyrics: 'Letras',
tabPersonalisation: 'Personalización',
tabIntegrations: 'Integraciones',
inputKeybindingsTitle: 'Atajos de teclado',
aboutContributorsCount_one: '{{count}} contribución',
aboutContributorsCount_other: '{{count}} contribuciones',
searchPlaceholder: 'Buscar en ajustes…',
searchNoResults: 'Ningún ajuste coincide con tu búsqueda.',
aboutMaintainersLabel: 'Mantenedores',
integrationsPrivacyTitle: 'Aviso de privacidad',
integrationsPrivacyBody: 'Todas las integraciones de esta pestaña son <strong>opt-in</strong> y, una vez activadas, envían datos a servicios externos o a tu servidor Navidrome. Last.fm recibe tu historial de escucha, Discord muestra la pista actual en tu perfil, Bandsintown se consulta por artista para obtener fechas de gira, y la compartición «En reproducción» publica tu pista actual para otros usuarios de tu servidor Navidrome. Si no quieres nada de esto, simplemente deja desactivada la sección correspondiente.',
homeCustomizerTitle: 'Página de Inicio',
queueToolbarTitle: 'Barra de herramientas de cola',
queueToolbarReset: 'Restablecer a predeterminado',
queueToolbarSeparator: 'Separador',
sidebarTitle: 'Barra Lateral',
sidebarReset: 'Restablecer a predeterminado',
artistLayoutTitle: 'Secciones de la página del artista',
artistLayoutDesc: 'Arrastra para reordenar, alterna para ocultar secciones individuales de la página del artista. Las secciones sin datos se omiten automáticamente.',
artistLayoutReset: 'Restablecer a predeterminado',
artistLayoutBio: 'Biografía del artista',
artistLayoutTopTracks: 'Mejores pistas',
artistLayoutSimilar: 'Artistas similares',
artistLayoutAlbums: 'Álbumes',
artistLayoutFeatured: 'También presente en',
playlistLayoutTitle: 'Diseño de la página de playlists',
playlistLayoutDesc: 'Mostrar u ocultar elementos individuales en la página de playlists.',
playlistLayoutReset: 'Restablecer a predeterminado',
playerBarTitle: 'Barra de reproducción',
playerBarReset: 'Restablecer a predeterminado',
playerBarStarRating: 'Calificación con estrellas',
playerBarFavorite: 'Favorito (corazón)',
playerBarLastfmLove: 'Last.fm love',
playerBarEqualizer: 'Ecualizador',
playerBarMiniPlayer: 'Mini reproductor',
advancedMode: 'Avanzado',
advancedModeTooltip: 'Mostrar opciones avanzadas en todas las pestañas de ajustes. Aportes de la comunidad que no reflejan necesariamente la filosofía de diseño de los mantenedores de Psysonic.',
advancedBadge: 'Avanzado',
sidebarDrag: 'Arrastra para reordenar',
sidebarFixed: 'Siempre visible',
randomNavSplitTitle: 'Dividir navegación Mix',
randomNavSplitDesc: 'Mostrar "Mezcla Aleatoria", "Álbumes Aleatorios" y "Mezcla Suerte" como entradas separadas en la barra lateral en lugar del hub "Crear Mezcla".',
tabInput: 'Entrada',
tabUsers: 'Usuarios',
tabSystem: 'Sistema',
loggingTitle: 'Registro',
loggingModeDesc: 'Controla la verbosidad de los logs del backend en la terminal.',
loggingModeOff: 'Apagado',
loggingModeNormal: 'Normal',
loggingModeDebug: 'Depuración',
loggingExport: 'Exportar logs',
loggingExportSuccess: 'Logs exportados ({{count}} líneas).',
loggingExportError: 'No se pudieron exportar los logs.',
ratingsSectionTitle: 'Calificaciones',
ratingsSkipStarTitle: 'Saltar para 1 estrella',
ratingsSkipStarDesc:
'Después de varios saltos seguidos, asigna 1 estrella a la pista. Solo para pistas aún no calificadas.',
ratingsSkipStarThresholdLabel: 'Saltos',
ratingsMixFilterTitle: 'Filtrar por calificación',
ratingsMixFilterDesc:
'Filtra elementos de baja calificación en {{mix}} y {{albums}}. Click en la estrella seleccionada nuevamente para desactivar el umbral.',
ratingsMixMinSong: 'Canciones',
ratingsMixMinAlbum: 'Álbumes',
ratingsMixMinArtist: 'Artistas',
ratingsMixMinThresholdAria: 'Estrellas mínimas: {{label}}',
backupTitle: 'Respaldo y Restauración',
backupExport: 'Exportar configuración',
backupExportDesc: 'Guarda toda la configuración, perfiles de servidor, configuración Last.fm, tema, EQ y atajos de teclado a un archivo .psybkp. Las contraseñas se almacenan en texto plano — mantén el archivo seguro.',
backupImport: 'Importar configuración',
backupImportDesc: 'Restaura configuración desde un archivo .psybkp. La app se recargará después de importar.',
backupImportConfirm: 'Esto sobrescribirá toda la configuración actual. ¿Continuar?',
backupSuccess: 'Respaldo guardado',
backupImportSuccess: 'Configuración restaurada — recargando…',
backupImportError: 'Archivo de respaldo inválido o corrupto.',
shortcutsReset: 'Restablecer a predeterminados',
shortcutListening: 'Presiona una tecla…',
shortcutUnbound: '—',
globalShortcutsTitle: 'Atajos Globales',
globalShortcutsNote: 'Funcionan en todo el sistema incluso cuando Psysonic está en segundo plano. Requieren Ctrl, Alt o Super como modificador.',
shortcutClear: 'Limpiar',
shortcutPlayPause: 'Reproducir / Pausa',
shortcutNext: 'Siguiente pista',
shortcutPrev: 'Pista anterior',
shortcutVolumeUp: 'Subir volumen',
shortcutVolumeDown: 'Bajar volumen',
shortcutSeekForward: 'Avanzar 10s',
shortcutSeekBackward: 'Retroceder 10s',
shortcutToggleQueue: 'Alternar cola',
shortcutOpenFolderBrowser: 'Abrir {{folderBrowser}}',
shortcutFullscreenPlayer: 'Reproductor pantalla completa',
shortcutNativeFullscreen: 'Pantalla completa nativa',
shortcutOpenMiniPlayer: 'Abrir mini reproductor',
shortcutStartSearch: 'Iniciar una búsqueda',
shortcutStartAdvancedSearch: 'Iniciar una búsqueda avanzada',
shortcutToggleSidebar: 'Alternar barra lateral',
shortcutMuteSound: 'Silenciar',
shortcutToggleEqualizer: 'Abrir / alternar ecualizador',
shortcutToggleRepeat: 'Alternar repetición',
shortcutOpenNowPlaying: 'Abrir "Reproduciendo ahora"',
shortcutShowLyrics: 'Mostrar letra',
shortcutFavoriteCurrentTrack: 'Añadir pista actual a favoritos',
shortcutOpenHelp: 'Ayuda',
playbackTitle: 'Reproducción',
replayGain: 'Replay Gain',
replayGainDesc: 'Normalizar volumen de pistas usando metadatos ReplayGain',
replayGainMode: 'Modo',
replayGainAuto: 'Auto',
replayGainAutoDesc: 'Usa la ganancia del álbum cuando las pistas adyacentes en la cola son del mismo álbum, si no la ganancia de pista.',
replayGainTrack: 'Pista',
replayGainAlbum: 'Álbum',
replayGainPreGain: 'Pre-Ganancia (archivos etiquetados)',
replayGainPreGainDesc: 'Aumento universal añadido a cada cálculo de ReplayGain. Útil si tu biblioteca te parece globalmente demasiado baja.',
replayGainFallback: 'Respaldo (sin etiquetar / radio)',
replayGainFallbackDesc: 'Se aplica a pistas (y emisoras de radio) sin etiquetas ReplayGain, para que el contenido sin etiquetar no salte más fuerte que el resto.',
normalization: 'Normalización',
normalizationDesc: 'Iguala el volumen percibido entre pistas, álbumes y radio.',
normalizationOff: 'Apagado',
normalizationReplayGain: 'ReplayGain',
normalizationLufs: 'LUFS',
loudnessTargetLufs: 'LUFS objetivo',
loudnessTargetLufsDesc: 'Volumen de referencia al que se ajustan todas las pistas. Valor más bajo = salida más fuerte. Los servicios de streaming suelen rondar los -14 LUFS.',
loudnessPreAnalysisAttenuation: 'Atenuación antes de medir',
loudnessPreAnalysisAttenuationDesc:
'Atenúa hasta que la loudness del tema esté guardada. En streaming luego solo hay estimaciones aproximadas. 0 dB = ninguna; más negativo = más bajo. A la derecha se muestra el dB efectivo para el destino actual.',
loudnessPreAnalysisAttenuationRef: 'Efectivo {{eff}} dB con destino {{tgt}} LUFS.',
loudnessPreAnalysisAttenuationReset: 'Predeterminado',
loudnessFirstPlayNote:
'En la primera reproducción de un tema nuevo el volumen puede oscilar brevemente mientras se mide. La siguiente vez se usa la medición guardada y todo permanece estable. Las pistas próximas en la cola suelen analizarse durante la canción anterior, por lo que en la práctica esto rara vez ocurre.',
crossfade: 'Crossfade',
crossfadeDesc: 'Transición entre pistas',
crossfadeSecs: '{{n}} s',
notWithGapless: 'No disponible mientras Gapless está activo',
notWithCrossfade: 'No disponible mientras Crossfade está activo',
gapless: 'Reproducción Gapless',
gaplessDesc: 'Precarga siguiente pista para eliminar silencios entre canciones',
preservePlayNextOrder: 'Mantener el orden de "Reproducir Siguiente"',
preservePlayNextOrderDesc: 'Los elementos añadidos a "Reproducir Siguiente" se encolan detrás de los anteriores en vez de saltar al principio.',
trackPreviewsTitle: 'Previsualizaciones de pistas',
trackPreviewsToggle: 'Activar previsualizaciones',
trackPreviewsDesc: 'Mostrar botones de Reproducir y Previsualización en las listas de pistas para una muestra rápida a mitad de canción.',
trackPreviewStart: 'Posición inicial',
trackPreviewStartDesc: 'Cuánto avanza la pista antes de iniciar la previsualización (% de la duración).',
trackPreviewDuration: 'Duración',
trackPreviewDurationDesc: 'Cuánto dura cada previsualización antes de detenerse.',
trackPreviewDurationSecs: '{{n}} s',
trackPreviewLocationsTitle: 'Dónde aparecen las previsualizaciones',
trackPreviewLocationsDesc: 'Elige en qué listas se muestran los botones de previsualización.',
trackPreviewLocation_suggestions: 'En sugerencias de listas',
trackPreviewLocation_albums: 'En listas de pistas de álbum',
trackPreviewLocation_playlists: 'En listas de reproducción',
trackPreviewLocation_favorites: 'En favoritos',
trackPreviewLocation_artist: 'En las mejores pistas del artista',
trackPreviewLocation_randomMix: 'En Random Mix',
preloadMode: 'Precargar Siguiente Pista',
preloadModeDesc: 'Cuándo comenzar a cargar la siguiente pista en cola',
nextTrackBufferingTitle: 'Buffer',
preloadHotCacheMutualExclusive: 'Precarga y Caché Activa sirven para lo mismo — solo uno puede estar activo a la vez. Habilitar uno desactivará automáticamente el otro.',
preloadOff: 'Apagado',
preloadBalanced: 'Balanceado (30 s antes del final)',
preloadEarly: 'Temprano (después de 5 s de reproducción)',
preloadCustom: 'Personalizado',
preloadCustomSeconds: 'Segundos antes del final: {{n}}',
infiniteQueue: 'Cola Infinita',
infiniteQueueDesc: 'Agregar automáticamente pistas aleatorias cuando la cola termina',
experimental: 'Experimental',
fsPlayerSection: 'Reproductor Pantalla Completa',
fsShowArtistPortrait: 'Mostrar foto del artista',
fsShowArtistPortraitDesc: 'Muestra la foto del artista (o portada del álbum) en el lado derecho del reproductor pantalla completa.',
fsPortraitDim: 'Oscurecimiento de foto',
fsLyricsStyle: 'Estilo de letra',
fsLyricsStyleRail: 'Carril',
fsLyricsStyleRailDesc: 'Carril deslizante clásico de 5 líneas.',
fsLyricsStyleApple: 'Desplazamiento',
fsLyricsStyleAppleDesc: 'Lista desplazable a pantalla completa.',
sidebarLyricsStyle: 'Estilo de desplazamiento de letra',
sidebarLyricsStyleClassic: 'Clásico',
sidebarLyricsStyleClassicDesc: 'La línea activa se centra.',
sidebarLyricsStyleApple: 'Apple Music-like',
sidebarLyricsStyleAppleDesc: 'La línea activa se ancla arriba con animación suave.',
seekbarStyle: 'Estilo de Barra de Progreso',
seekbarStyleDesc: 'Elige la apariencia de la barra de progreso del reproductor',
seekbarTruewave: 'Forma de Onda Real',
seekbarPseudowave: 'Forma de Onda Pseudo',
seekbarLinedot: 'Línea y Punto',
seekbarBar: 'Barra',
seekbarThick: 'Barra Gruesa',
seekbarSegmented: 'Segmentada',
seekbarNeon: 'Brillo Neón',
seekbarPulsewave: 'Onda Pulsante',
seekbarParticletrail: 'Estela de Partículas',
seekbarLiquidfill: 'Llenado Líquido',
seekbarRetrotape: 'Cinta Retro',
themeSchedulerTitle: 'Cambio Automático de Tema',
themeSchedulerEnable: 'Habilitar Programador de Temas',
themeSchedulerEnableSub: 'Cambia automáticamente entre dos temas según la hora del día',
themeSchedulerDayTheme: 'Tema de Día',
themeSchedulerDayStart: 'Comienza de Día A las',
themeSchedulerNightTheme: 'Tema de Noche',
themeSchedulerNightStart: 'Comienza de Noche A las',
themeSchedulerActiveHint: 'El Programador de Temas está activo — los cambios de tema se manejan automáticamente.',
visualOptionsTitle: 'Opciones Visuales',
coverArtBackground: 'Fondo de Portada',
coverArtBackgroundSub: 'Mostrar portada desenfocada como fondo en encabezados de álbumes y listas de reproducción',
playlistCoverPhoto: 'Foto de Portada de Playlist',
playlistCoverPhotoSub: 'Mostrar cuadrícula de fotos de portada en la vista detallada de playlists',
showBitrate: 'Mostrar Bitrate',
showBitrateSub: 'Mostrar bitrate de audio en las listas de pistas',
floatingPlayerBar: 'Barra del Reproductor Flotante',
floatingPlayerBarSub: 'Mantener la barra del reproductor flotando sobre el contenido',
uiScaleTitle: 'Escala de Interfaz',
uiScaleLabel: 'Zoom',
scan: {
quick: 'Escaneo rápido',
full: 'Escaneo completo',
quickTip: 'Escaneo rápido — indexar archivos nuevos/modificados',
fullTip: 'Escaneo completo — reindexar todo',
confirmFull: 'Haz clic de nuevo para confirmar',
confirmFullShort: 'Confirmar escaneo completo',
scanning: 'Escaneando…',
done: 'Escaneo finalizado',
error: 'Error en el escaneo',
toast: '{{name}}: escaneo finalizado — {{count}} pistas indexadas',
},
};