worldhopper/lib/l10n/app_es.arb
Felipe M. 58a562abe8
feat: refactor server software abstraction with Kavita REST API integration
Rename all OPDS-prefixed models to generic names (Server, Feed, Entry,
Link, StreamLink), expand the ServerSoftware interface to cover all
server interactions, and implement a full Kavita REST API client that
replaces the OPDS delegation.

- Rename OPDS* models to generic names across ~60 files
- Add database migrations 13 (opds_id → entry_id) and 14 (unify credentials)
- Create OPDSServerSoftware wrapping existing OPDS services
- Create KavitaApiClient for direct Kavita REST API calls
- Create KavitaFeedMapper to convert Kavita JSON to Feed/Entry models
- Rewrite KavitaServerSoftware to use native API (no OPDS delegation)
- Unify server credentials (remove softwareUsername/softwarePassword)
- Simplify add/edit server UI to single auth section
- Add test connection button to server add/edit screens
- Add progress indicator to PublicationCard using local and server data
- Eliminate softwareType branching in reader screens
- Add EntryProgress and fetchEntryProgress to ServerSoftware interface
- Fix Entry.acquisitionLink crash on empty links
- Add 59 new tests covering models, services, and providers
2026-04-06 17:46:48 +02:00

315 lines
15 KiB
Text

{
"@@locale": "es",
"appName": "Worldhopper",
"navLibrary": "Biblioteca",
"navServers": "Servidores",
"navSettings": "Ajustes",
"settingsTitle": "Ajustes",
"settingsAppearance": "Apariencia",
"settingsAppearanceSubtitle": "Opciones de visualización",
"settingsLanguage": "Idioma",
"settingsLanguageSubtitle": "Idioma de la aplicación",
"settingsReaders": "Lectores",
"settingsReadersSubtitle": "Opciones de lectura",
"settingsAdvanced": "Avanzado",
"settingsAdvancedSubtitle": "Desarrollo y depuración",
"settingsAbout": "Acerca de",
"settingsAboutSubtitle": "Worldhopper",
"appearanceTitle": "Apariencia",
"appearanceTheme": "Tema",
"themeLight": "Claro",
"themeDark": "Oscuro",
"themeSystem": "Sistema",
"themeSystemSubtitle": "Seguir el tema del dispositivo",
"languageTitle": "Idioma",
"languageSystem": "Predeterminado del sistema",
"languageSystemSubtitle": "Usar el idioma del dispositivo",
"readersTitle": "Lectores",
"readersGeneralSection": "General",
"readersEinkMode": "Modo e-ink",
"readersEinkModeSubtitle": "Desactivar animaciones para pantallas e-ink",
"readersImageReaderSection": "Lector de imágenes",
"readersCachingSection": "Caché",
"readersReadingDirection": "Dirección de lectura",
"readersFilterQuality": "Calidad de filtro",
"readersPrecachePages": "Precarga de páginas",
"readersTwoPageSpread": "Doble página",
"readersTwoPageSpreadSubtitle": "Mostrar dos páginas lado a lado en pantallas anchas",
"readersFirstPageIsCover": "La primera página es portada",
"readersFirstPageIsCoverSubtitle": "Mostrar la primera página sola en doble página",
"readersSyncProgress": "Sincronizar progreso de páginas en caché",
"readersSyncProgressSubtitle": "Vuelve a descargar cada página al pasar para que el servidor registre tu progreso de lectura. Consume datos adicionales.",
"readingDirectionTitle": "Dirección de lectura",
"readingModeLtr": "Izquierda a derecha",
"readingModeLtrDescription": "Orden de lectura occidental estándar",
"readingModeRtl": "Derecha a izquierda",
"readingModeRtlDescription": "Orden de lectura estilo manga",
"readingModeVertical": "Desplazamiento vertical",
"readingModeVerticalDescription": "Desplazamiento continuo estilo webtoon",
"readingDirectionHelp": "Controla la dirección de lectura del lector de imágenes. Izquierda a derecha es el estándar para cómics occidentales, derecha a izquierda para manga, y desplazamiento vertical para webtoons.",
"readingModeShortLtr": "IaD",
"readingModeShortRtl": "DaI",
"readingModeShortVertical": "Vertical",
"filterQualityTitle": "Calidad de filtro",
"filterQualityNone": "Ninguna",
"filterQualityNoneDescription": "Más rápido, puede verse pixelado",
"filterQualityLow": "Baja",
"filterQualityLowDescription": "Interpolación bilineal",
"filterQualityMedium": "Media",
"filterQualityMediumDescription": "Bilineal con mipmaps, buen equilibrio",
"filterQualityHigh": "Alta",
"filterQualityHighDescription": "Interpolación bicúbica, mejor calidad",
"filterQualityHelp": "Controla cómo se escalan las imágenes cuando una página se reduce para ajustarse a la pantalla. Mayor calidad hace que el texto y los detalles finos sean más nítidos, pero usa más recursos de GPU. Se recomienda Media para la mayoría de dispositivos.",
"precachePagesTitle": "Precarga de páginas",
"precachePagesOff": "Desactivada",
"precachePagesOffDescription": "Las páginas se cargan bajo demanda",
"precachePages1": "1 página",
"precachePages1Description": "Precarga mínima",
"precachePages2": "2 páginas",
"precachePages2Description": "Precarga ligera",
"precachePages3": "3 páginas",
"precachePages3Description": "Equilibrada, recomendada",
"precachePages4": "4 páginas",
"precachePages4Description": "Precarga agresiva",
"precachePages5": "5 páginas",
"precachePages5Description": "Precarga máxima, usa más ancho de banda",
"precachePagesHelp": "Controla cuántas páginas siguientes se precargan en segundo plano mientras lees. Valores más altos hacen que pasar página sea más fluido, pero usan más ancho de banda y memoria.\n\nNota: La precarga de páginas puede marcarlas como leídas en el servidor. Tu progreso de lectura local no se verá afectado.",
"advancedTitle": "Avanzado",
"advancedDeveloperMode": "Modo desarrollador",
"advancedDeveloperModeSubtitle": "Activar herramientas de depuración",
"advancedTests": "Pruebas",
"advancedTestsSubtitle": "Previsualizar componentes de interfaz",
"advancedDebuggingInfo": "Información de depuración",
"advancedVersion": "Versión",
"advancedBuildNumber": "Número de compilación",
"advancedPackageName": "Nombre del paquete",
"advancedDatabaseVersion": "Versión de la base de datos",
"advancedPlatform": "Plataforma",
"advancedCopyToClipboard": "Copiar al portapapeles",
"advancedCopyToClipboardSubtitle": "Copiar toda la información de depuración para informes de errores",
"advancedDebugInfoCopied": "Información de depuración copiada al portapapeles",
"advancedFailedToLoadInfo": "Error al cargar la información",
"aboutTitle": "Acerca de",
"aboutVersion": "Versión",
"aboutVersionUnknown": "desconocida",
"aboutSourceCode": "Código fuente",
"aboutReportIssue": "Reportar un problema",
"aboutReportIssueSubtitle": "Abrir un informe en el repositorio",
"devTestsTitle": "Pruebas de desarrollo",
"devTestsSnackBars": "Barras de notificación",
"devTestsSuccess": "Éxito",
"devTestsError": "Error",
"devTestsWarning": "Advertencia",
"devTestsInfo": "Información",
"devTestsSuccessMessage": "Este es un mensaje de éxito",
"devTestsErrorMessage": "Este es un mensaje de error",
"devTestsWarningMessage": "Este es un mensaje de advertencia",
"devTestsInfoMessage": "Este es un mensaje informativo",
"serverListTitle": "Mis servidores",
"serverListEmpty": "Sin servidores",
"serverListEmptySubtitle": "Añade tu primer servidor OPDS para empezar a explorar y leer",
"serverListOffline": "No hay conexión. Conéctate a internet para explorar servidores.",
"serverListErrorLoading": "Error al cargar servidores: {error}",
"serverListRetry": "Reintentar",
"serverListAddServer": "Añadir servidor",
"serverDeleteTitle": "Eliminar servidor",
"serverDeleteConfirmation": "¿Seguro que quieres eliminar \"{name}\"?",
"serverDeleted": "{name} eliminado",
"addServerTitle": "Añadir servidor",
"addServerNameLabel": "Nombre del servidor",
"addServerNameHint": "Mi biblioteca",
"addServerUrlLabel": "URL del servidor",
"addServerUrlHint": "https://ejemplo.com/opds",
"addServerUrlHintKavita": "https://kavita.ejemplo.com",
"addServerServerType": "Tipo de servidor",
"addServerServerTypeSubtitle": "Detectado automáticamente desde la URL. Cambia si es necesario.",
"serverTypeGeneric": "OPDS genérico",
"serverTypeKavita": "Kavita",
"addServerAuth": "Autenticación",
"addServerAuthSubtitle": "Credenciales para acceder al servidor",
"addServerRequiresAuth": "Requiere autenticación",
"addServerRequiresAuthSubtitle": "Activar si el servidor requiere inicio de sesión",
"addServerUsername": "Usuario",
"addServerPassword": "Contraseña",
"addServerValidationNameRequired": "Introduce un nombre de servidor",
"addServerValidationUrlRequired": "Introduce una URL de servidor",
"addServerValidationUrlInvalid": "Introduce una URL válida",
"addServerValidationUrlScheme": "La URL debe empezar con http:// o https://",
"addServerValidationUsernameRequired": "Introduce un nombre de usuario",
"addServerValidationPasswordRequired": "Introduce una contraseña",
"addServerHelp": "Introduce la URL raíz de tu servidor OPDS. Las credenciales se almacenarán de forma segura en tu dispositivo.",
"testConnectionButton": "Probar conexión",
"testConnectionTesting": "Probando...",
"testConnectionSuccess": "¡Conexión exitosa!",
"testConnectionError": "Conexión fallida: {error}",
"addServerButton": "Añadir servidor",
"addServerDuplicate": "Ya existe un servidor con esta URL",
"addServerSuccess": "{name} añadido correctamente",
"addServerError": "Error al añadir servidor: {error}",
"editServerTitle": "Editar servidor",
"editServerNotFound": "Servidor no encontrado",
"editServerInfo": "Información del servidor",
"editServerAdded": "Añadido",
"editServerLastSynced": "Última sincronización",
"editServerSaveButton": "Guardar cambios",
"editServerSuccess": "{name} actualizado correctamente",
"editServerError": "Error al actualizar servidor: {error}",
"editServerErrorLoading": "Error al cargar servidor: {error}",
"readerError": "Error",
"readerNoStreamLink": "Esta publicación no se puede leer (sin enlace de transmisión)",
"readerServerNotFound": "Servidor no encontrado",
"readerErrorLoadingServer": "Error al cargar servidor: {error}",
"readerReadingDirectionWithMode": "Dirección de lectura ({mode})",
"readerPageOf": "Página {current} de {total}",
"readerPagesOf": "Páginas {start}-{end} de {total}",
"epubPreparing": "Preparando...",
"epubLoadingFromCache": "Cargando desde caché...",
"epubDownloading": "Descargando... {percent}%",
"epubProcessing": "Procesando EPUB...",
"epubOpeningReader": "Abriendo lector...",
"epubErrorLoading": "Error al cargar EPUB: {error}",
"epubGoBack": "Volver",
"epubSearch": "Buscar",
"epubSearchHint": "Introduce un término de búsqueda...",
"epubNoResults": "No se encontraron resultados",
"epubSearchResults": "{count} resultados para \"{query}\"",
"epubSearchFailed": "Error en la búsqueda: {error}",
"epubChapters": "Capítulos",
"epubBack": "Atrás",
"epubSettings": "Ajustes",
"epubFontSize": "Tamaño de fuente",
"epubFontSizeReset": "Restablecer",
"libraryTitle": "Biblioteca",
"libraryRecentlyRead": "Leídos recientemente",
"libraryNoServers": "Sin servidores configurados",
"libraryNoServersSubtitle": "Añade un servidor OPDS para empezar a leer libros",
"libraryAddServer": "Añadir servidor",
"libraryNoHistory": "Sin historial de lectura",
"libraryNoHistorySubtitle": "Empieza a leer un libro para verlo aquí",
"libraryBrowseServers": "Explorar servidores",
"libraryErrorLoading": "Error al cargar la biblioteca",
"browserLoading": "Cargando...",
"browserLibrary": "Biblioteca",
"browserNoContent": "Sin contenido disponible",
"browserLibraryEmpty": "Esta biblioteca parece estar vacía",
"browserCollectionEmpty": "Esta colección parece estar vacía",
"browserFailedToLoadLibrary": "Error al cargar la biblioteca",
"browserFailedToLoadFeed": "Error al cargar el feed",
"browserRetry": "Reintentar",
"browserFailedToLoadMore": "Error al cargar más: {error}",
"browserOfflineEpubNotCached": "Este EPUB no está en caché. Es posible que no puedas leerlo sin conexión.",
"browserOfflinePagesWarning": "No hay conexión. Las páginas podrían no cargarse correctamente.",
"publicationPages": "{count} páginas",
"publicationReadingProgress": "Progreso de lectura",
"publicationPageOfTotal": "Página {current} de {total}",
"publicationLastRead": "Última lectura: {time}",
"publicationCannotRead": "Esta publicación no se puede leer en la aplicación",
"publicationContinueFromPage": "Continuar leyendo desde la página {page}",
"publicationStartReading": "Empezar a leer",
"publicationContinueReading": "Continuar leyendo",
"publicationReadAgain": "Leer de nuevo",
"publicationStartFromBeginning": "Empezar desde el principio",
"publicationCollection": "Colección",
"recentlyReadPublicationNotFound": "Publicación no encontrada",
"recentlyReadErrorLoading": "Error al cargar la publicación",
"recentlyReadViewRawData": "Ver datos sin procesar",
"recentlyReadRemove": "Eliminar de leídos recientes",
"recentlyReadRemoveTitle": "Eliminar de leídos recientes",
"recentlyReadRemoveConfirmation": "¿Eliminar \"{title}\" de tu historial de lectura?\n\nEsto no eliminará el libro de tu biblioteca.",
"recentlyReadRemoved": "Eliminado de leídos recientes",
"recentlyReadRemoveFailed": "Error al eliminar: {error}",
"recentlyReadRawData": "Datos sin procesar",
"recentlyReadOfflineEpubNotCached": "Este EPUB no está en caché. Conéctate a internet para descargarlo.",
"recentlyReadOfflinePagesWarning": "No hay conexión. Las páginas podrían no cargarse.",
"recentlyReadUnsupportedFormat": "Formato no compatible",
"serverCardEdit": "Editar",
"serverCardDelete": "Eliminar",
"serverCardAuthenticated": "Autenticado",
"serverCardLastSynced": "Última sincronización: {time}",
"offlineSemanticLabel": "Sin conexión",
"nextInSeriesNext": "Siguiente",
"nextInSeriesFinished": "Terminado",
"nextInSeriesBackToDetails": "Volver a detalles",
"nextInSeriesBackToLibrary": "Volver a la biblioteca",
"routeNotFound": "Página no encontrada: {uri}",
"commonCancel": "Cancelar",
"commonDelete": "Eliminar",
"commonRemove": "Eliminar",
"timeJustNow": "ahora mismo",
"timeMinutesAgo": "hace {minutes} min",
"timeHoursAgo": "hace {hours} h",
"timeDaysAgo": "hace {days} d",
"timeWeeksAgo": "hace {weeks} sem",
"timeMonthsAgo": "hace {months} mes(es)",
"timeYearsAgo": "hace {years} año(s)",
"timeToday": "Hoy",
"timeYesterday": "Ayer",
"timeMinAgo": "hace {minutes} min",
"timeHoursAgoLong": "hace {count} {count, plural, =1{hora} other{horas}}",
"timeDaysAgoLong": "hace {days} días",
"downloadAll": "Descargar todo",
"downloadChapter": "Descargar capítulo",
"downloadCancel": "Cancelar descarga",
"downloadDelete": "Eliminar descarga",
"downloadDeleteSeries": "Eliminar serie descargada",
"downloadDeleteSeriesConfirmation": "¿Eliminar \"{title}\" y todos sus archivos descargados? Esta acción no se puede deshacer.",
"downloadDeleteChapterConfirmation": "¿Eliminar el archivo descargado de \"{title}\"?",
"downloadStarting": "Iniciando descarga...",
"downloadComplete": "Descarga completada",
"downloadFailed": "Error en la descarga",
"downloadCancelled": "Descarga cancelada",
"downloadInProgress": "Descargando...",
"downloadChaptersCount": "{downloaded}/{total} capítulos",
"downloadConfirmTitle": "Descargar serie",
"downloadConfirmMessage": "¿Descargar {count} capítulos para lectura sin conexión?",
"downloadConfirmStart": "Descargar",
"libraryDownloaded": "Descargados",
"libraryNoDownloads": "Sin descargas",
"libraryNoDownloadsSubtitle": "Descarga series desde la pantalla de exploración para leer sin conexión",
"downloadedSeriesDetailTitle": "Serie descargada",
"downloadedSeriesChapters": "{count} capítulos",
"downloadedChapterReady": "Listo para leer",
"downloadedChapterPending": "Pendiente",
"downloadedChapterFailed": "Error",
"downloadRetryAll": "Reintentar todos los fallidos",
"downloadRetryFailed": "Error - toca para reintentar",
"downloadingPages": "Página {downloaded}/{total}",
"downloadFailedCount": "{count} fallidos",
"settingsDownloadedContent": "Contenido descargado",
"settingsDownloadedContentSubtitle": "Gestionar descargas sin conexión",
"settingsClearAllDownloads": "Borrar todas las descargas",
"settingsClearAllDownloadsConfirmation": "¿Eliminar todo el contenido descargado? Esta acción no se puede deshacer.",
"settingsDownloadSize": "Usando {size}",
"settingsDownloadsCleared": "Todas las descargas eliminadas"
}