All checks were successful
ci/woodpecker/pr/pr Pipeline was successful
- Add guard flag to prevent both onPopInvokedWithResult and dispose() from saving progress (double DB writes + double sync pushes) - Capture ref-dependent values synchronously in _saveProgress before any await to prevent accessing disposed ref after super.dispose() - Guard ref.invalidate() calls with mounted check for dispose safety - Add KoreaderSyncAuthException so 401 errors in getProgress and updateProgress propagate instead of being silently swallowed - Show a warning snackbar (once per session) when auth fails so the user knows sync credentials need updating Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
277 lines
14 KiB
Text
277 lines
14 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",
|
|
"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",
|
|
|
|
"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.",
|
|
|
|
"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",
|
|
"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.",
|
|
"addServerButton": "Añadir servidor",
|
|
"addServerDuplicate": "Ya existe un servidor con esta URL",
|
|
"addServerSuccess": "{name} añadido correctamente",
|
|
"addServerError": "Error al añadir servidor: {error}",
|
|
|
|
"koreaderSyncToggle": "Sincronización KOReader API",
|
|
"koreaderSyncToggleSubtitle": "Sincronizar el progreso de lectura EPUB con un servidor compatible con KOReader",
|
|
"koreaderSyncUrl": "URL del servidor de sincronización",
|
|
"koreaderSyncUrlHint": "https://sync.ejemplo.com",
|
|
"koreaderSyncUsername": "Usuario de sincronización",
|
|
"koreaderSyncPassword": "Contraseña de sincronización",
|
|
"koreaderSyncTestConnection": "Probar conexión",
|
|
"koreaderSyncTestSuccess": "¡Conexión exitosa! Autenticado como {username}.",
|
|
"koreaderSyncTestFailed": "Error de conexión: {error}",
|
|
"koreaderSyncValidationUrlRequired": "La URL del servidor de sincronización es obligatoria cuando la sincronización KOReader está activada",
|
|
"koreaderSyncValidationUrlInvalid": "Introduce una URL válida",
|
|
"koreaderSyncValidationUsernameRequired": "El usuario de sincronización es obligatorio",
|
|
"koreaderSyncValidationPasswordRequired": "La contraseña de sincronización es obligatoria",
|
|
"koreaderSyncAuthFailed": "Sincronización KOReader: error de autenticación. Revisa las credenciales del servidor.",
|
|
"koreaderSyncHelp": "Conéctate a un servidor de sincronización compatible con KOReader para sincronizar las posiciones de lectura EPUB entre dispositivos.",
|
|
"koreaderSyncResumeInfo": "La sincronización KOReader está activada. Tu posición de lectura se restaurará automáticamente desde el servidor de sincronización al abrir este libro.",
|
|
|
|
"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",
|
|
|
|
"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"
|
|
}
|