diff --git a/app/src/main/java/io/legado/app/data/entities/BookSource.kt b/app/src/main/java/io/legado/app/data/entities/BookSource.kt index 2fd84fb93..c4b26ef09 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BookSource.kt @@ -11,6 +11,7 @@ import io.legado.app.help.CacheManager import io.legado.app.help.JsExtensions import io.legado.app.help.http.CookieStore import io.legado.app.utils.* +import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize import splitties.init.appCtx import javax.script.SimpleBindings @@ -45,6 +46,52 @@ data class BookSource( var ruleContent: ContentRule? = null // 正文页规则 ) : Parcelable, JsExtensions { + @delegate:Transient + @delegate:Ignore + @IgnoredOnParcel + val exploreKinds by lazy { + val exploreUrl = exploreUrl?.trim() ?: return@lazy emptyList() + val kinds = arrayListOf() + var ruleStr = exploreUrl + if (ruleStr.isNotBlank()) { + kotlin.runCatching { + if (exploreUrl.startsWith("", false) + || exploreUrl.startsWith("@js", false) + ) { + val aCache = ACache.get(appCtx, "explore") + ruleStr = aCache.getAsString(bookSourceUrl) ?: "" + if (ruleStr.isBlank()) { + val bindings = SimpleBindings() + bindings["baseUrl"] = bookSourceUrl + bindings["java"] = this + bindings["cookie"] = CookieStore + bindings["cache"] = CacheManager + val jsStr = if (exploreUrl.startsWith("@")) { + exploreUrl.substring(3) + } else { + exploreUrl.substring(4, exploreUrl.lastIndexOf("<")) + } + ruleStr = AppConst.SCRIPT_ENGINE.eval(jsStr, bindings).toString().trim() + aCache.put(bookSourceUrl, ruleStr) + } + } + if (ruleStr.isJsonArray()) { + GSON.fromJsonArray(ruleStr)?.let { + kinds.addAll(it) + } + } else { + ruleStr.split("(&&|\n)+".toRegex()).forEach { kindStr -> + val kindCfg = kindStr.split("::") + kinds.add(ExploreKind(kindCfg.first(), kindCfg.getOrNull(1))) + } + } + }.onFailure { + kinds.add(ExploreKind(it.localizedMessage ?: "")) + } + } + return@lazy kinds + } + override fun hashCode(): Int { return bookSourceUrl.hashCode() } @@ -97,50 +144,6 @@ data class BookSource( } } - fun getExploreKinds(): List { - val exploreUrl = exploreUrl ?: return emptyList() - val kinds = arrayListOf() - var ruleStr = exploreUrl - if (ruleStr.isNotBlank()) { - kotlin.runCatching { - if (exploreUrl.startsWith("", false) - || exploreUrl.startsWith("@js", false) - ) { - val aCache = ACache.get(appCtx, "explore") - ruleStr = aCache.getAsString(bookSourceUrl) ?: "" - if (ruleStr.isBlank()) { - val bindings = SimpleBindings() - bindings["baseUrl"] = bookSourceUrl - bindings["java"] = this - bindings["cookie"] = CookieStore - bindings["cache"] = CacheManager - val jsStr = if (exploreUrl.startsWith("@")) { - exploreUrl.substring(3) - } else { - exploreUrl.substring(4, exploreUrl.lastIndexOf("<")) - } - ruleStr = AppConst.SCRIPT_ENGINE.eval(jsStr, bindings).toString().trim() - aCache.put(bookSourceUrl, ruleStr) - } - } - if (ruleStr.isJsonArray()) { - GSON.fromJsonArray(ruleStr)?.let { - kinds.addAll(it) - } - } else { - ruleStr.split("(&&|\n)+".toRegex()).forEach { c -> - val d = c.split("::") - if (d.size > 1) - kinds.add(ExploreKind(d[0], d[1])) - } - } - }.onFailure { - kinds.add(ExploreKind(it.localizedMessage ?: "")) - } - } - return kinds - } - /** * 执行JS */ diff --git a/app/src/main/java/io/legado/app/help/LifecycleHelp.kt b/app/src/main/java/io/legado/app/help/LifecycleHelp.kt index 59cf0564a..0a9e50826 100644 --- a/app/src/main/java/io/legado/app/help/LifecycleHelp.kt +++ b/app/src/main/java/io/legado/app/help/LifecycleHelp.kt @@ -16,7 +16,7 @@ object LifecycleHelp : Application.ActivityLifecycleCallbacks { private val activities: MutableList> = arrayListOf() private val services: MutableList> = arrayListOf() - private var finishedListener: (() -> Unit)? = null + private var appFinishedListener: (() -> Unit)? = null fun activitySize(): Int { return activities.size @@ -52,8 +52,8 @@ object LifecycleHelp : Application.ActivityLifecycleCallbacks { } } - fun setOnFinishedListener(finishedListener: (() -> Unit)) { - this.finishedListener = finishedListener + fun setOnAppFinishedListener(appFinishedListener: (() -> Unit)) { + this.appFinishedListener = appFinishedListener } override fun onActivityPaused(activity: Activity) { @@ -71,7 +71,7 @@ object LifecycleHelp : Application.ActivityLifecycleCallbacks { if (temp.get() != null && temp.get() === activity) { activities.remove(temp) if (services.size == 0 && activities.size == 0) { - onFinished() + onAppFinished() } break } @@ -102,14 +102,14 @@ object LifecycleHelp : Application.ActivityLifecycleCallbacks { if (temp.get() != null && temp.get() === service) { services.remove(temp) if (services.size == 0 && activities.size == 0) { - onFinished() + onAppFinished() } break } } } - private fun onFinished() { - finishedListener?.invoke() + private fun onAppFinished() { + appFinishedListener?.invoke() } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/service/CheckSourceService.kt b/app/src/main/java/io/legado/app/service/CheckSourceService.kt index 448e75414..2db3d516a 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -109,7 +109,7 @@ class CheckSourceService : BaseService() { val webBook = WebBook(source) var books = webBook.searchBookAwait(this, CheckSource.keyword) if (books.isEmpty()) { - val exs = source.getExploreKinds() + val exs = source.exploreKinds if (exs.isEmpty()) { throw Exception("搜索内容为空并且没有发现") } diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt index d780b6dd3..adf920c52 100644 --- a/app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt @@ -58,7 +58,7 @@ class ExploreAdapter(context: Context, private val scope: CoroutineScope, val ca callBack.scrollTo(scrollTo) } Coroutine.async(scope) { - item.getExploreKinds() + item.exploreKinds }.onSuccess { kindList -> upKindList(flexbox, item.bookSourceUrl, kindList) }.onFinally { @@ -155,9 +155,10 @@ class ExploreAdapter(context: Context, private val scope: CoroutineScope, val ca when (it.itemId) { R.id.menu_edit -> callBack.editSource(source.bookSourceUrl) R.id.menu_top -> callBack.toTop(source) - R.id.menu_refresh -> { + R.id.menu_refresh -> Coroutine.async(scope) { ACache.get(context, "explore").remove(source.bookSourceUrl) - notifyItemChanged(position) + }.onSuccess { + callBack.refreshData() } R.id.menu_del -> Coroutine.async(scope) { appDb.bookSourceDao.delete(source) @@ -170,6 +171,7 @@ class ExploreAdapter(context: Context, private val scope: CoroutineScope, val ca } interface CallBack { + fun refreshData() fun scrollTo(pos: Int) fun openExplore(sourceUrl: String, title: String, exploreUrl: String?) fun editSource(sourceUrl: String) diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt index 8e78d53bb..d8988e842 100644 --- a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt @@ -150,6 +150,10 @@ class ExploreFragment : VMBaseFragment(R.layout.fragment_explo } } + override fun refreshData() { + initExploreData(searchView.query?.toString()) + } + override fun scrollTo(pos: Int) { (binding.rvFind.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(pos, 0) } diff --git a/app/src/main/res/values-es-rES/arrays.xml b/app/src/main/res/values-es-rES/arrays.xml new file mode 100644 index 000000000..991dc30c9 --- /dev/null +++ b/app/src/main/res/values-es-rES/arrays.xml @@ -0,0 +1,115 @@ + + + + Texto + Audio + + + + Pestaña + Carpeta + + + + @string/indent_0 + @string/indent_1 + @string/indent_2 + @string/indent_3 + @string/indent_4 + + + + .txt + .json + .xml + + + + @string/jf_convert_o + @string/jf_convert_j + @string/jf_convert_f + + + + Adaptar do sistema + Tema Claro + Tema Oscuro + Tema E-Ink + + + + Autom. + Oscuro + Claro + Adaptado + + + + Predeterminado + 1 min + 2 min + 3 min + Siempre + + + + @string/screen_unspecified + @string/screen_portrait + @string/screen_landscape + @string/screen_sensor + + + + íconePrincipal + ícone1 + ícone2 + ícone3 + ícone4 + ícone5 + ícone6 + + + + Desativado + Tradicional a Simplificado + Simplificado a Tradicional + + + + Fuente predeterminado + Fuente Serif + Fuente Monoespaciado + + + + En blanco + Título + Tiempo + Batería + Páginas + Avance + Páginas y avance + Nombre del libro + Tiempo y Batería + + + + Normal + Oscuro + Claro + + + + Autom. + Chino simplificado + Chino tradicional + Inglés + + + + FuenteLibro + FuenteRSS + SustituirRegla + + + diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml new file mode 100644 index 000000000..18283fdb8 --- /dev/null +++ b/app/src/main/res/values-es-rES/strings.xml @@ -0,0 +1,850 @@ + + + + Legado + Legado·buscador + Legado necesita de acceso de almacenamineto para buscar y leer libros. Por favor, diríjase a los "Ajustes de la aplicación" para conceder el "Permiso de almacenamineto". + + + Inicio + Restaurar + Importar datos de Legado + Crear carpeta + Crea una carpeta de respaldo bajo el nombre de Legado. + Respaldo de caché de libros sin conexión + Exporta localmente lo respalda para su exportación + Respaldar para + Por favor, seleccione una carpeta de respaldo. + Importar desde legado + Importar datos de Github + Reemplazo + Enviar + + Aviso + Cancelar + Confirmar + Ir a Ajustes + No se puede ir a los ajustes. + + Reintentar + Cargando + Advertencia + Editar + Borrar + Borrar todo + Reemplazar + Reemplazo + Configurar reglas de reemplazo + No disponible + Activar + Buscar reemplazo + Estantería + Favoritos + Favorito + en Favoritos + No está en Favoritos + Suscripción + Todo + Lecturas recientes + Última lectura + Novedades + La estantería está vacía. ¡Busque libros o añádalos desde una fuente pública! + Buscar + Descargar + Lista + Grid-3 + Grid-4 + Grid-5 + Grid-6 + Layout + Vista + Biblioteca + Importar libros + Fuente de libros + Gestionar fuentes + Crear/Importar/Editar/Gestionar fuentes de libros + Ajustes + Ajustes de Temas + Configuraciones relacionadas a los temas visuales + Otros ajustes + Algunas configuraciones relacionadas a su funcionamiento + Acerca de + Donaciones + Sair + Todavía se guardó. ¿Desea continuar editando? + Tipos de libros + Versión + Local + Buscar + Origen: %s + Origen: %s + Título + Última vez: %s + ¿Desea añadir %s a su Estantería? + %s archivos(s) de texto en total + Cargando… + Reintentar + Servicio Web + Fuente de edición web y lectura de libros + Editar fuentes de libros en la web + http://%1$s:%2$d + Caché sin conexión + Caché sin conexión + precarga el o los capítulos(s) seleccionado(s) en Almacenamiento en caché + Cambiar origen + + \u3000\u3000 Este es una aplicación de lectura bajo software libre, desarrollado en Kotlin, en que podrás participar. ¡Síguelos en la cuenta oficial de WeChat! + + + Legado (YueDu 3.0) disponible para descargar en:\n https://play.google.com/store/apps/details?id=io.legado.play.release + + Versión %s + Verificación en segundo plano + podrá utilizar con libertad cuando se verifique la fuente del libro + Actualización automática + Actualiza los libros automáticamente al abrir la App + Descarga automática + Baja los últimos capítulos automaticamente al actualizar los libros + Respaldo y restauración + Ajustes de WebDav + Ajustes de WebDave importación de datos anteriores + Respaldar + Restaurar + El respaldo necesita de permisos de almacenamineto + La restauración necesita de permisos de almacenamineto + Aceptar + Cancelar + Confirmar respaldo + Los nuevos archivos de respaldo serán reemplazados con los anteriores.\n Carpeta de respaldo: YueDu + Confirmar restauración + La restauración de los datos de la estantería reemplazará a los datos de la actual. + Respaldo completado + Error de respaldo + Restaurando + Restauración completada + Restauración fallida + Orientación de pantalla + Auto(sensor) + Paisaje + Retrato + Adaptado del sistema + Descargo de responsabilidad + %d capítulos + Interfaz + Brillo + Capítulos + Próximo + Anterior + Ocultar barra de estado + Oculta la barra de navegación del sistema durante lectura + Voz + Hablando + Clic para abrir la lectura + Reproducir + Reproduciendo + Clic para abrir la reproducción + Pausar + Regresar + Actualizar + Iniciar + Detener + Pausar + Continuar + Cronómetro + Voz pausada + Hablando (%d min restantes) + Reproduciendo (%d min restantes) + Ocultar botones virtuales durante lectura + Oculta barra de navegación + Color de barra de navegación + GitHub + Evaluación + E-mail + Error al abrir + Error al compartir + Sin capítulos + Añadir Url + Añadir Url de libro + Segundo plano + Autor + Autor: %s + Voz detelendia + Limpiar caché + Se limpió la caché + Guardar + Editar fuente + Editar fuente de libro + Desactivar fuente de libro + Añadir fuente de libro + Añadir fuente de suscripción + Añadir libros + Buscar + Copiar fuente + Pegar fuente + Descripción de las reglas de fuente + Comprobar actualizaciones + Digitalizar código QR + Digitalizar imágenes locales + Descripción de las reglas + Compartir + Compartir vía + Adaptar del sistema + Añadir + Importar fuentes del libro + Importar localmente + Importar en línea + Reemplazo + Editar regla de reemplazo + Modelo + Reemplazo + Portada + Libro + Botones de volumen para pasar página + Toque la pantalla para pasar página + Animación de hojeada + Animación de hojeada (libro) + Mantener pantalla encendida + Regresar + Menú + Ajuste + Barra de deslizamiento + Limpiar la caché borrará todos los capítulos guardados. ¿Está seguro de limpiarlos? + Compartir fuentes de libros + Nombre de regla + La regla está vacía o es incompatible con los lineamientos de Regex. + Acción de selección + Seleccionar todo + Selecionar todo (%1$d/%2$d) + Dejar de seleccionar todo (%1$d/%2$d) + Modo oscuro + Página de bienvenida + Iniciar descarga + Cancelar descarga + Excluir de descarga + Descargando %1$d/%2$d + Importar libro(s) seleccionado(s) + Número de tareas en simultáneo + Cambiar ícono + Quitar + Iniciar lectura + Cargando… + Error cargando, toque para volver a iniciar + Descripción de libro + Descripción:%s + Descripción: sin introducción + Abrir libro externo + Origen: %s + Importar reglas locales + Importar reglas en línea + Intervalo de actualizaciones + Lista de recientes + Fecha de actualización + Título del libro + Ordenar manualmente + Estrategia de lectura + Tipografía + Quitar selecionados + ¿Desea quitarlos? + Limpiar fuente + Descubrir + Descubrir + Sin contenido. Diríjase al Administrador de fuentes para añadirlo. + Quitar todo + Historial de búsqueda + Limpiar + Mostrar título de libro en texto + Sincronización de fuentes de libros + Sin último capítulo. + Mostrar tiempo y batería + Divisor de pantalla + Oscurecer ícono de barra de estado + Contenido + Copiar + Bajar todo + Este es un texto de prueba, \n\u3000\u3000 sólo para mostrar el resultado + Color de fondo (mantén pulsado para personalizar) + Barra de estado inmersiva + %d capítulo(s) restante(s) + Ninguno seleccionado + Mantén pulsado para introducir el valor de color + Cargando… + Preparando + Preparando algo más + Favoritos + Añadir a Favoritos + Quitar + Tiempo límite de carga + Siga:%s + Copiado con éxito + Organización de estantería + Esto borrará a todos los libros. Por favor, tenga cuidado. + Buscar fuentes de libros + Buscar fuentes de suscripción + Búsqueda (%d fuentes en total) + Capítulos (%d) + Negrito + Fuente + Texto + Página inicial + Derecha + Izquierda + Parte inferior + Parte superior + Espaciado + Espacio superior + Espacio inferior + Espacio derecho + Espacio izquiedo + Verificar fuentes del libro + Verificar fuente seleccionada + %1$s Avance %2$d/%3$d + ¡Por favor, instale y seleccione un TTS en chino! + ¡Error al inicializar TTS! + Conversión a simplificada + Desactivado + Simplificado a tradicional + Tradicional a simplificado + Modo de hojeada + %1$d elementos + Almacenamiento: + Adicionar ao Estante + Añadir a Estantería (%1$d) + %1$d libros añadidos con éxito + Por favor, coloque sus archivos de fuente al almacenamiento raíz y vuelve a seleccionar + Fuente predeterminada + Seleccionar fuentes + Tamaño de texto + Espacio entre líneas + Espacio entre párrafos + Encima + Debajo + Autoexpandir Descubrir + Expande por defecto la primera parte de Descubrir. + Líneas actuales %s + Velocidad de voz + Deslizamiento automático + Impedir deslizamiento automático + Velocidad de deslizamiento automático + Información sobre libro + Editar información del libro + Establecer la estantería como página de inicio + Ir automáticamente a la lista de Recientes + Objeto sustituto. El nombre del libro o la URL de origen están disponibles + Grupos + Carpeta de caché + Selector de archivos del sistema + Nueva versión + Descargar actualizaciones + Botones de volumen para pasar las páginas mientras lee + Ajuste de margen + Activar actualizaciones + Desactivar actualizaciones + Invertir + Buscar libro por nombre o autor + Nombre del libro, autor, URL + Preguntas frecuentes + Mostrar todos los buscados + Mostrar la fuente de búsqueda si Descubrir fue cerrado + Actualizar capítulos + Capítulos de Txt Regex + Codificación de texto + Orden ascendente/descendente + Ordenar + Ordenar automáticamente + Ordenar manualmente + Ordenar por nombre + Ir al principio + Ir al final + Leído: %s + Awaiting update + Preparando un poco más + Listo + Todo + Preparando actualización de libros + Preparando más actualizaciones de libros + Libros concluidos + Libros locales + El color de la barra de estado se vuelve transparente + barra de navegación de inmersión + La barra de navegación se vuelve transparente + Agregar a la estantería + Seguir leyendo + Carpeta de portada + Portada + Diapositiva + Simulación + Desplazado + Ninguno + La fuente de este libro utiliza funciones avanzadas, para desbloquear diríjase a Donaciones y toque el código de búsqueda del sobre rojo de Alipay para recibir ese sobre. + Actualiza el último capítulo después del cambio de fuente en segundo plano + si está habilitado, la actualización comenzará 1 minuto después de que se abra la aplicación + Ocultar automáticamente la barra de herramientas + La barra de herramientas se ocultará automáticamente cuando deslice la Librería + Iniciar sesión + Iniciar sesión% s + Completado + La fuente actual no se ha configurado con una dirección de inicio de sesión + Sin página anterior + Sin página siguiente + + + 源名称(sourceName) + 源URL(sourceUrl) + 源分组(sourceGroup) + 自定义源分组 + 输入自定义源分组名称 + 【%s】 + 分类Url + 登录URL(loginUrl) + 源注释(sourceComment) + 搜索地址(url) + 发现地址规则(url) + 书籍列表规则(bookList) + 书名规则(name) + 详情页url规则(bookUrl) + 作者规则(author) + 分类规则(kind) + 简介规则(intro) + 封面规则(coverUrl) + 最新章节规则(lastChapter) + 字数规则(wordCount) + 书籍URL正则(bookUrlPattern) + 预处理规则(bookInfoInit) + 目录URL规则(tocUrl) + 允许修改书名作者(canReName) + 目录下一页规则(nextTocUrl) + 目录列表规则(chapterList) + 章节名称规则(ChapterName) + 章节URL规则(chapterUrl) + VIP标识(isVip) + 更新时间(ChapterInfo) + 正文规则(content) + 正文下一页URL规则(nextContentUrl) + WebViewJs(webJs) + 资源正则(sourceRegex) + 替换规则(replaceRegex) + 图片样式(imageStyle) + + 图标(sourceIcon) + 列表规则(ruleArticles) + 列表下一页规则(ruleArticles) + 标题规则(ruleTitle) + guid规则(ruleGuid) + 时间规则(rulePubDate) + 类别规则(ruleCategories) + 描述规则(ruleDescription) + 图片url规则(ruleImage) + 内容规则(ruleContent) + 样式(style) + 链接规则(ruleLink) + + + + Sin fuentes + Error al obtener la información del libro + Error al obtener el contenido + Error al obtener la lista de capítulos + Error al acceder al sitio:% s + Error al leer el archivo + Error al cargar la lista de capítulos + Error al obtener los datos + Error al cargar\n%s + Sin conexión + Tiempo de espera de conexión en línea + Error en el procesamiento de datos + + + Encabezado HTTP + Fuente de depuración + Importar desde código QR + Compartir fuentes seleccionadas + Escanear código QR + Toque para mostrar el menú cuando esté seleccionado + Tema + Tipo de tema + Seleccione el tema que prefiera + Únase al grupo QQ + Para establecer la imagen de fondo requiere del permiso de almacenamiento + Ingrese la dirección de origen del libro + Borrar archivo + Archivo borrado + ¿Está seguro de que desea borrar este archivo? + Carpeta + Importación inteligente + Descubrir + Cambiar modo de visualización + La importación de libros locales requiere permiso de almacenamiento + Tema nocturno + E-Ink + Optimización para dispositivos E-ink + Esta aplicación requiere permiso de almacenamiento para respaldar la información del libro + Toque nuevamente para salir de la aplicación + La importación de libros locales requiere permiso de almacenamiento + La conexión en línea no está disponible + + No + Aceptar + ¿Está seguro que desea borrar? + ¿Está seguro de que desea borra %s? + Está seguro de que desea eliminar todos los libros? + ¿También desea eliminar los capítulos de libros descargados? + Escanear el código QR requiere permiso de la cámara + La voz se está ejecutando, no se puede pasar las páginas automáticamente + Codificación de entrada + Capítulos de Txt Regex + Para abrir libros locales, se requiere permiso de almacenamiento + Libro sin nombre + Ingrese la URL de la regla de reemplazo + La lista de búsqueda se obtuvo con éxito%d + el nombre y la URL no pueden estar vacíos + Galería + obtenga sobres rojos de AliPay + Sin dirección de actualización + Abra la página de inicio, volverá automáticamente después de completarse + Después de iniciar sesión correctamente, toque el icono en la esquina superior derecha para probar el acceso a la página de inicio + Capítulo + Para + Usando Regex + Sangría + Ninguno + Sangría con 1 caracter + Sangría con 2 caracteres + Sangría con 3 caracteres + Sangría con 4 caracteres + Seleccione una carpeta + Seleccione un archivo + Sin Descubrir, puede agregarlo a Fuentes de libros + Restaurar valores predeterminados + La carpeta de caché personalizada requiere permiso de almacenamiento + Negro + Sin contenido + Cambiando fuente, espere + Capítulos sin contenido + Espaciado de palabras + + Básico + Buscar + Descubrir + Información + Capítulos + Contenido + + Modo E-Ink + Elimina animaciones y optimiza la experiencia para libros en papel electrónico + Servicio web + Puerto web + Puerto actual %s + Compartir código QR + Compartir cadenas + Compartir Wifi + Conceda el permiso de almacenamiento + Rebobinado rápido + Avance rápido + Anterior + Siguiente + Música + Audio + Activar + Activar js + Cargar URL base + Todas las fuentes + El contenido introducido no puede estar vacío + Limpiar la caché de búsqueda + Editar búsqueda + Cambie el icono de software que se muestra en el escritorio + Ayuda + Mío + Lecturas + %d%% + %d min + Leer por páginas + Auto-Brightness %s + Motor de voz + Imágenes de fondo + Color de fondo + Color del texto + Seleccione una foto + Gestión de grupo + Selección de grupo + Edición de grupo + Mover al grupo + Añadir a grupos + Quitar de grupos + Nuevo reemplazo + Grupo + Grupo: %s + Capítulos: %s + Activar Descubrir + Desactivar Descubrir + Activar selección + Desactivar selección + Exportar seleccionados + Exportar + Cargar capítulos + Cargar detalles del libro + TTS + Contraseña de WebDav + Ingrese su contraseña de WebDav + Ingrese la dirección de su servidor + Dirección del servidor WebDav + Cuenta WebDav + Ingrese su cuenta WebDav + Fuente de suscripción + Editar fuente de suscripción + Filtro + Buscar fuentes de Descubrir + Ubicación actual: + Búsqueda precisa + Iniciando servicio + Vacío + Selección de archivos + Selección de carpetas + ¡Finalizado! + Error en la dirección de Uri + Actualizar portada + Cambiar fuente + Imagen local + Tipo: + Fondo + Importando + Exportando + Defina qué botones pasan de página + Botón de página anterior + Botón de página siguiente + Primero agregue este libro a Estantería + Sin grupo + Oración anterior + Siguiente oración + Otra carpeta + Demasiadas palabras para crear un código QR + Compartir fuentes de suscripción + Compartir fuentes de libros + Cambio automático al modo oscuro + Sigue el modo oscuro del sistema + Atrás + Tono de voz en línea + (%1$d/%2$d) + Mostrar suscripción + Servicio detenido + Iniciando el servicio\nComprobando la barra de notificaciones para más detalles + Carpeta predeterminada + Selector de carpetas del sistema + Selector de carpetas de aplicaciones + Selector de archivos de la aplicación + En Android 10+ no puede leer ni guardar archivos debido a restricciones de permisos + Mantenga pulsado para mostrar Legado·Búsqueda en el menú de operaciones + Buscar en pantalla de operación de texto + Registro + Registro + Conversión a simplificada + El ícono es un ícono vectorial, que no era compatible antes de Android 8.0 + Speech settings + Start page + Long Tap to select text + Header + Content + Footer + Select end + Select start + Shared layout + Browser + Import default rules + Name + Regex + More menu + Minus + Plus + System typeface + Delete source file + Default-1 + Default-2 + Default-3 + Title + Left + Center + Hide + Add to Group + Save image + No default path + Group settings + View Chapters + Navigation bar shadow + Current shadow size(elevation): %s + Default + Main menu + Tap to grant permission + Legado needs Storage permission, please tap the "Grant Permission" button below, or go to "Settings"-"Application Permissions"-to open the required permission. If the permission is still not work, please tap "Select Folder" in the upper right corner to use the system folder picker. + The selected text cannot be spoken in full text speech + Extend to cutout + Updating Chapters + Headset buttons are always available + Headset buttons are available even exit the app. + Contributors + Contact + License + Other + 开源阅读 + Follow WeChat Official Accounts + WeChat + Supporting me will be appreciated + Official Accounts[开源阅读] + Changing source + Tap to join + Middle + Information + Switch Layout + Text font weight switching + Full screen gestures support + + + Primario + Resalte + Color de fondo + Color de la barra de navegación + Día + Día, primario + Día, resalte + Día, color de fondo + Día, color de la barra de navegación + Noche + Noche, primario + Noche, resalte + Noche, color de fondo + Noche, color de la barra de navegación + Cambiar la fuente automáticamente + Texto justificado + Texto alineado en la parte inferior + Velocidad de desplazamiento automático + Ordenar por URL + Respalde en simultáneo vía local y WebDav + Restaure primero desde WebDAV, haga clic en restaurar desde la ubicación del respaldo + Seleccione una carpeta de respaldo heredada + Activado + Desactivado + Iniciando descarga + Este libro ya está en la lista de descargas + Haga clic para abrir + Siga [开源阅读] para obtener ayuda haciendo clic en los anuncios + Código de sugerencia de WeChat + AliPay + Sobre rojo de AliPay, código de búsqueda + 537954522 Haga clic para copiar + Código QR del sobre rojo de AliPay + Código QR de AliPay + Código QR de la Colección QQ + gedoor, Invinciblelee, etc. Para obtener más detalles, vaya a Github + Limpiar la caché de libros y fuentes descargados + Portada predeterminada + Lista de descartados + Ignore parte del contenido durante la restauración + Leer ajustes de interfaz + Nombre del grupo + Sección de notas + Activar regla de reemplazo por defecto + Para libros recién agregados + Seleccione el archivo de restauración + ¡El fondo diurno no puede ser demasiado oscuro! + ¡El fondo inferior diurno no puede ser demasiado oscuro! + ¡El fondo nocturno no puede ser demasiado brillante! + ¡El fondo inferior nocturno no puede ser demasiado brillante! + Debe haber un contraste entre el color de resalte y el de fondo + Debe haber un contraste entre el resalte y el color del texto + Formato incorrecto + Error + Mostrar widget de brillo + Idioma + Importar fuente RSS + Su donación mejora esta aplicación + Cuenta oficial de Wechat [开源阅读软件] + Leer historial + Leer resumen del historial + TTS local + Recuento de subprocesos + Tiempo total de lectura + Deseleccionar todo + Importar + Exportar + Guardar configuración del tema + Guardar configuración del tema del día + Guardar configuración del tema nocturno + Lista de temas + Guardar, importar, compartir tema + Cambiar tema predeterminado + Ordenar por hora de actualización + Contenido de búsqueda + ¡Siga [开源阅读] en WeChat para obtener más feeds RSS! + Actualmente no hay una fuente para Descubrir, siga el número público [开源 阅读] para agregar una fuente de libro a través de Descubrir. + 将焦点放到输入框按下物理按键会自动录入键值,多个按键会自动用英文逗号隔开. + Nombre del tema + Limpiar automáticamente los datos de búsqueda caducados + Historial de búsqueda de más de un día + Volver a segmentar + Formato de nombre: + Haga clic en el icono de carpeta en la esquina superior derecha y seleccione la carpeta + Búsqueda inteligente + Nombre de archivo importado + No hay libros + Conservar el nombre original + El control de la pantalla táctil + Cerrar + Página siguiente + Página anterior + Sin acciones + Título + Mostrar/ocultar + pie de página encabezado + Suscripción de reglsa + 添加大佬们提供的规则导入地址\n添加后点击可导入规则 + Obtener progreso en la nube + El progreso actual excede el progreso de la nube. ¿Quieres sincronizar? + Progreso de lectura sincronizado + Sincronizar el progreso de la lectura al entrar y salir de la pantalla de lectura + No se pudo marcar + URL única + Exportar lista de libros + Importar lista de libros + Descarga anterior + Descargue% s capítulos antes + Está habilitado + Imagen de fondo + Copiar URL del libro + Copiar URL del capítulo + Carpeta de exportación + Codificación de texto exportado + Exportar a WebDav + Contenido inverso + Depurar + Registro de fallos + Uso de ramas chinas personalizadas + Formato de imagen + Sistema TTS + Formato de exportación + Verificar por autor + Esta URL ha sido reemplazada + Frecuencia de actualización de pantalla alta + Utilice la frecuencia de actualización de pantalla más alta + Exportar todo + Listo + Mostrar no leídos + Mostrar siempre la portada predeterminada + Mostrar siempre la cobertura predeterminada, no mostrar la cobertura de la red + Código fuente de búsqueda + Código fuente del libro + Código fuente de los capítulos + Código fuente del contenido + Listar el código fuente + Tamaño de fuente + Borde superior + Borde inferior + Mostrar + Ocultar + Ocultar cuando se muestra la barra de estado + TOC inverso + Mostrar + Formato + Formato de grupo + Exportar nombre de archivo + Restablecer + URL nula + 字典 +