export const esES = { common: { search: "Buscar...", create: "Nuevo", new: "Nuevo", cancel: "Cancelar", delete: "Eliminar", edit: "Editar", theme: "Tema", signOut: "Cerrar sesión", noMatches: "No se encontraron coincidencias", tryDifferentSearch: "Intenta usar un término de búsqueda diferente.", light: "Claro", dark: "Oscuro", system: "Sistema", loading: "Cargando...", note: "Nota", insight: "Análisis", newSource: "Nueva fuente", newNotebook: "Nuevo cuaderno", newPodcast: "Nuevo podcast", language: "Idioma", english: "English", chinese: "简体中文", japanese: "日本語", french: "Français", russian: "Русский", bengali: "বাংলা", spanish: "Español", source: "Fuente", notebook: "Cuaderno", podcast: "Podcast", quickActions: "Acciones rápidas", quickActionsDesc: "Navegación, búsqueda, preguntar, tema", appName: "Open Notebook", add: "Agregar", remove: "Quitar", confirm: "Confirmar", warning: "Advertencia", error: "Error", success: "Éxito", model: "Modelo", back: "Atrás", next: "Siguiente", done: "Listo", processing: "Procesando...", creating: "Creando...", linked: "Vinculado", adding: "Agregando...", addSelected: "Agregar seleccionados", customModel: "Modelo personalizado", failed: "fallido", current: "Actual", save: "Guardar", writeNote: "Escribir nota", batchMode: "Modo por lotes", optional: "Opcional", type: "Tipo", title: "Título", created: "Creado {time}", updated: "Actualizado {time}", actions: "Acciones", noResults: "Sin resultados", references: "Referencias", refreshPage: "Por favor, intenta recargar la página", refresh: "Recargar", aiGenerated: "Generado por IA", human: "Humano", unknown: "Desconocido", notes: "Notas", chat: "Chat", deleteForever: "Eliminar permanentemente", connectionError: "Error de conexión", unableToConnect: "No se puede conectar al servidor API", retryConnection: "Reintentar conexión", diagnosticInfo: "Información de diagnóstico", version: "Versión", built: "Compilación", apiUrl: "URL de la API", frontendUrl: "URL del frontend", checkConsoleLogs: "Revisa la consola del navegador para logs detallados (busca mensajes 🔧 [Config])", yes: "Sí", no: "No", saving: "Guardando...", description: "Descripción", saveToNote: "Guardar en nota", copyToClipboard: "Copiar al portapapeles", close: "Cerrar", insights: "Análisis", progress: "Progreso", deleting: "Eliminando...", created_label: "Creado", updated_label: "Actualizado", download: "Descargar", saveChanges: "Guardar cambios", name: "Nombre", default: "Predeterminado", nameRequired: "El nombre es obligatorio", modelConfiguration: "Configuración del modelo", resetToDefault: "Restablecer valores predeterminados", reasoning: "Razonamiento", searchTerms: "Términos de búsqueda", strategy: "Estrategia", individualAnswers: "Respuestas individuales ({count})", finalAnswer: "Respuesta final", notebookLabel: "Cuaderno: {name}", itemNotFound: "No se pudo encontrar este {type}", accessibility: { transformationViews: "Vistas de transformación", searchKB: "Pregunta o busca en tu base de conocimiento", enterQuestion: "Escribe tu pregunta para consultar la base de conocimiento", enterSearch: "Escribe tu búsqueda", searchKBBtn: "Buscar en la base de conocimiento", podcastViews: "Vistas de podcast", ytVideo: "Video de YouTube", askResponse: "Respuesta de consulta", searchNotebooks: "Buscar cuadernos", }, url: "URL", errorDetails: "Detalles del error", editTransformation: "Editar transformación", retry: "Reintentar", traditionalChinese: "繁體中文", portuguese: "Português", completed: "completado", saveSuccess: "Guardado exitosamente", contextModes: { off: "No incluido en el chat", insights: "Solo análisis", full: "Contenido completo", clickToCycle: "Clic para cambiar", }, clickToEdit: "Clic para editar", }, apiErrors: { notebookNotFound: "Cuaderno no encontrado", sourceNotFound: "Fuente no encontrada", transformationNotFound: "Transformación no encontrada", fileUploadFailed: "Error al subir el archivo", urlRequired: "La URL es obligatoria para el tipo enlace", contentRequired: "El contenido es obligatorio para el tipo texto", invalidSourceType: "Tipo de fuente inválido", processingFailed: "El procesamiento falló", failedToQueue: "Error al poner en cola el procesamiento", invalidSortBy: "El campo de ordenamiento debe ser 'created' o 'updated'", invalidSortOrder: "El orden debe ser 'asc' o 'desc'", accessDenied: "Acceso al archivo denegado", fileNotFoundOnServer: "Archivo no encontrado en el servidor", searchFailed: "La búsqueda falló", askFailed: "La consulta falló", pleaseEnterQuestion: "Por favor, escribe una pregunta", pleaseConfigureModels: "Por favor, configura todos los modelos requeridos", failedToCreateSession: "Error al crear la sesión", failedToUpdateSession: "Error al actualizar la sesión", failedToDeleteSession: "Error al eliminar la sesión", failedToSendMessage: "Error al enviar el mensaje", unauthorized: "Acceso no autorizado, por favor verifica tu contraseña", invalidPassword: "Contraseña inválida", embeddingModelRequired: "Esta función requiere un modelo de embedding. Por favor, configura uno en la sección de Modelos.", strategyModelNotFound: "Modelo de estrategia no encontrado", answerModelNotFound: "Modelo de respuesta no encontrado", finalAnswerModelNotFound: "Modelo de respuesta final no encontrado", noAnswerGenerated: "No se pudo generar una respuesta", genericError: "Ocurrió un error inesperado", }, connectionErrors: { apiTitle: "No se puede conectar al servidor API", apiDesc: "No se pudo alcanzar el servidor API de Open Notebook", dbTitle: "Error de conexión a la base de datos", dbDesc: "El servidor API está funcionando, pero la base de datos no es accesible", troubleshooting: "Esto generalmente significa:", apiUnreachable1: "El servidor API no está ejecutándose", apiUnreachable2: "El servidor API está en una dirección diferente", apiUnreachable3: "Problemas de conectividad de red", dbFailed1: "SurrealDB no está ejecutándose", dbFailed2: "La configuración de conexión a la base de datos es incorrecta", dbFailed3: "Problemas de red entre la API y la base de datos", quickFixes: "Soluciones rápidas:", setApiUrl: "Establece la variable de entorno API_URL:", checkSurreal: "Verifica si SurrealDB está funcionando:", seeDocumentation: "Para instrucciones detalladas de configuración, consulta:", docLink: "Documentación de Open Notebook", showTechnical: "Mostrar detalles técnicos", attemptedUrl: "URL intentada", message: "Mensaje", technicalDetails: "Detalles técnicos", stackTrace: "Traza de error", retryLabel: "Reintentar conexión", retryHint: "Presiona R o haz clic en el botón para reintentar", dockerLabel: "Para Docker", localDevLabel: "Para desarrollo local", }, auth: { loginTitle: "Open Notebook", loginDesc: "Ingresa tu contraseña para acceder a la aplicación", passwordPlaceholder: "Contraseña", signingIn: "Iniciando sesión...", signIn: "Iniciar sesión", connectErrorHint: "No se puede conectar al servidor. Por favor, verifica si la API está funcionando.", }, navigation: { collect: "Recopilar", process: "Procesar", create: "Crear", manage: "Gestionar", sources: "Fuentes", notebooks: "Cuadernos", askAndSearch: "Preguntar y buscar", podcasts: "Podcasts", models: "Modelos", transformations: "Transformaciones", transformation: "Transformación", settings: "Configuración", advanced: "Avanzado", nav: "Navegación", language: "Cambiar idioma", theme: "Tema", ask: "Preguntar", }, notebooks: { title: "Cuadernos", newNotebook: "Nuevo cuaderno", searchPlaceholder: "Buscar cuadernos...", archived: "Archivado", archive: "Archivar", unarchive: "Desarchivar", deleteNotebook: "Eliminar cuaderno", deleteNotebookDesc: "¿Estás seguro de que quieres eliminar \"{name}\"? Esta acción no se puede deshacer.", deleteNotebookLoading: "Cargando vista previa de eliminación...", deleteNotebookNotes: "{count} nota(s) serán eliminadas permanentemente.", deleteNotebookNoNotes: "No hay notas que eliminar.", deleteNotebookExclusiveSources: "{count} fuente(s) existen solo en este cuaderno.", deleteNotebookSharedSources: "{count} fuente(s) son compartidas con otros cuadernos y serán desvinculadas.", deleteNotebookNoSources: "No hay fuentes en este cuaderno.", deleteExclusiveSourcesLabel: "Eliminar fuentes exclusivas", keepExclusiveSourcesLabel: "Desvincular y conservarlas", activeNotebooks: "Cuadernos activos", archivedNotebooks: "Cuadernos archivados", notFound: "Cuaderno no encontrado", notFoundDesc: "El cuaderno solicitado no existe.", updated: "Actualizado", namePlaceholder: "Nombre del cuaderno", addDescription: "Agregar descripción...", noNotesYet: "Aún no hay notas", deleteNote: "Eliminar nota", deleteNoteConfirm: "¿Estás seguro de que quieres eliminar esta nota? Esta acción no se puede deshacer.", noteCreatedSuccess: "Nota creada exitosamente", failedToCreateNote: "Error al crear la nota", noteUpdatedSuccess: "Nota actualizada exitosamente", failedToUpdateNote: "Error al actualizar la nota", noteDeletedSuccess: "Nota eliminada exitosamente", failedToDeleteNote: "Error al eliminar la nota", createNew: "Crear nuevo cuaderno", createNewDesc: "Ingresa un nombre y una descripción opcional para comenzar.", descPlaceholder: "Agrega más información sobre este cuaderno aquí...", createSuccess: "Cuaderno creado exitosamente", updateSuccess: "Cuaderno actualizado exitosamente", deleteSuccess: "Cuaderno eliminado exitosamente", }, sources: { title: "Fuentes", add: "Agregar fuente", addNew: "Agregar nueva fuente", addExisting: "Agregar fuente existente", delete: "Eliminar fuente", statusPreparing: "Preparando", statusQueued: "En cola", statusProcessing: "Procesando", statusCompleted: "Completado", statusFailed: "Fallido", statusPreparingDesc: "Preparando para procesar", statusQueuedDesc: "Esperando ser procesado", statusProcessingDesc: "Siendo procesado", statusCompletedDesc: "Procesado exitosamente", statusFailedDesc: "El procesamiento falló", failedToLoad: "Error al cargar las fuentes", allSourcesDesc: "Ve todas tus fuentes aquí. Puedes agregar nuevas fuentes o gestionar las existentes.", allSources: "Todas las fuentes", insights: "Análisis", yes: "Sí", no: "No", loadingMore: "Cargando más...", noSourcesYet: "Aún no hay fuentes", allSourcesDescShort: "Ve todas tus fuentes aquí.", cannotSaveNoteNoNotebook: "No se puede guardar la nota: ID de cuaderno no disponible", createFirstSource: "Agrega tu primera fuente para comenzar a construir tu base de conocimiento.", deleteSourceConfirm: "¿Estás seguro de que quieres eliminar esta fuente?", deleteConfirm: "¿Estás seguro de que quieres eliminar esto?", deleteConfirmWithTitle: "¿Estás seguro de que quieres eliminar \"{title}\"?", deleteSuccess: "Fuente eliminada exitosamente. Nota: Para eliminar el archivo del almacenamiento, debes habilitar la opción \"eliminar archivo\" en la página de configuración.", failedToDelete: "Error al eliminar la fuente", sourceQueued: "Fuente en cola", sourceQueuedDesc: "Fuente enviada para procesamiento en segundo plano. Puedes monitorear el progreso en la lista de fuentes.", sourceAddedSuccess: "Fuente agregada exitosamente", failedToAddSource: "Error al agregar la fuente", sourceUpdatedSuccess: "Fuente actualizada exitosamente", failedToUpdateSource: "Error al actualizar la fuente", sourceDeletedSuccess: "Fuente eliminada exitosamente", failedToDeleteSource: "Error al eliminar la fuente", fileUploadedSuccess: "Archivo subido exitosamente", failedToUploadFile: "Error al subir el archivo", sourceRequeued: "Reintento de fuente en cola", sourceRequeuedDesc: "La fuente ha sido puesta de nuevo en cola para procesamiento.", failedToRetry: "Error en el reintento", sourcesAddedToNotebook: "{count} fuente(s) agregadas al cuaderno", failedToAddSourcesToNotebook: "Error al agregar fuentes al cuaderno", partialAddSuccess: "{success} fuente(s) agregadas, {failed} fallaron", sourceRemovedFromNotebook: "Fuente eliminada del cuaderno exitosamente", failedToRemoveSourceFromNotebook: "Error al eliminar la fuente del cuaderno", removeConfirm: "¿Estás seguro de que quieres quitar esto del cuaderno?", checking: "Verificando...", untitledSource: "Fuente sin título", maxItems: "máx. {count}", insightsCount: "{count} análisis", details: "Detalles", detailsTitle: "Detalles de la fuente", content: "Contenido", metadata: "Metadatos", type: { link: "Enlace", file: "Archivo", text: "Texto", }, id: "ID de fuente", topics: "Temas", embedded: "Embebido", notEmbedded: "No embebido", embedContent: "Embeber contenido", embedding: "Embebiendo...", alreadyEmbedded: "Ya embebido", downloadFile: "Descargar archivo", fileUnavailable: "Archivo no disponible", preparing: "Preparando...", generateNewInsight: "Generar nuevo análisis", selectTransformation: "Selecciona una transformación...", noInsightsYet: "Aún no hay análisis", createFirstInsight: "Crea tu primer análisis usando una transformación de arriba", viewInsight: "Ver análisis", deleteInsight: "Eliminar análisis", deleteInsightConfirm: "¿Estás seguro de que quieres eliminar este análisis? Esta acción no se puede deshacer.", insightGenerationStarted: "Generación de análisis iniciada. Aparecerá en breve.", editNote: "Editar nota", createNote: "Crear nota", addTitle: "Agregar un título...", untitledNote: "Nota sin título", writeNotePlaceholder: "Escribe el contenido de tu nota aquí...", saveNote: "Guardar nota", createNoteBtn: "Crear nota", createFirstNote: "Crea tu primera nota para capturar ideas y observaciones.", urlLabel: "URL(s) *", fileLabel: "Archivo(s) *", textContentLabel: "Contenido de texto *", enterUrlsPlaceholder: "Ingresa URLs, una por línea\nhttps://ejemplo.com/articulo1\nhttps://ejemplo.com/articulo2", batchUrlHint: "Pega múltiples URLs (una por línea) para importar por lotes", invalidUrlsDetected: "URLs inválidas detectadas:", lineLabel: "Línea {line}", fixInvalidUrls: "Por favor, corrige o elimina las URLs inválidas para continuar", selectMultipleFilesHint: "Selecciona múltiples archivos para importar por lotes. Soportados: Documentos (PDF, DOC, DOCX, PPT, XLS, EPUB, TXT, MD), Multimedia (MP4, MP3, WAV, M4A), Imágenes (JPG, PNG), Archivos comprimidos (ZIP)", selectedFiles: "Archivos seleccionados:", textPlaceholder: "Pega o escribe tu contenido aquí...", htmlDetected: "Contenido HTML detectado. Se convertirá a Markdown después del procesamiento.", titlePlaceholder: "Dale a tu fuente un título descriptivo", batchTitlesAuto: "Los títulos se generarán automáticamente para cada fuente.", batchCommonSettings: "Los mismos cuadernos y transformaciones se aplicarán a todos los elementos.", urlsCount: "{count} URL(s)", filesCount: "{count} archivo(s)", addSource: "Agregar fuente", notEmbeddedAlert: "Contenido no embebido", notEmbeddedDesc: "Este contenido no ha sido embebido para búsqueda vectorial. El embedding permite capacidades de búsqueda avanzada y mejor descubrimiento de contenido.", openOnYoutube: "Abrir en YouTube", urlCopied: "URL copiada al portapapeles", viewSource: "Ver fuente", noInsightSelected: "Ningún análisis seleccionado", sourceInsight: "Análisis de fuente", manageNotebooks: "Gestionar cuadernos", manageNotebooksDesc: "Gestiona qué cuadernos contienen esta fuente", noNotebooksAvailable: "No hay cuadernos disponibles", loadFailed: "Error al cargar los detalles de la fuente", removeFromNotebook: "Quitar del cuaderno", retryProcessing: "Reintentar procesamiento", deleteSource: "Eliminar fuente", retry: "Reintentar", addExistingTitle: "Agregar fuentes existentes", addExistingDesc: "Selecciona fuentes existentes de todos tus cuadernos para agregar al actual.", searchPlaceholder: "Buscar fuentes por nombre o URL...", noNotebooksFound: "No se encontraron cuadernos.", showingFirst100: "Mostrando las primeras 100 fuentes. Usa la búsqueda para encontrar una específica.", selectedCount: "{count} fuentes seleccionadas", added: "Agregado el {date}", addUrl: "Agregar URL", uploadFile: "Subir archivo", enterText: "Ingresar texto", processDescription: "El contenido será procesado y analizado por IA.", processingFiles: "Procesando tus archivos...", titleRequired: "Se requiere un título para el contenido de texto", titleGenerated: "Si se deja vacío, se generará un título a partir del contenido", batchCount: "{count} {type} serán procesados", enableEmbedding: "Habilitar embedding para búsqueda", embeddingDesc: "Permite que esta fuente sea encontrada en búsquedas vectoriales y consultas de IA", embeddingAlways: "Embedding habilitado automáticamente", embeddingAlwaysDesc: "Tu configuración está establecida para siempre embeber contenido para búsqueda vectorial.", embeddingNever: "Embedding deshabilitado", embeddingNeverDesc: "Tu configuración está establecida para omitir el embedding. La búsqueda vectorial no estará disponible para esta fuente.", changeInSettings: "Puedes cambiar esto en Configuración", notFound: "Fuente no encontrada", noContent: "No hay contenido disponible", insightsDesc: "Análisis generados a partir del análisis del modelo", uploadedFile: "Archivo subido", fileUnavailableDesc: "Este archivo no está disponible actualmente por razones del sistema de almacenamiento.", batchSuccess: "{count} fuente(s) creadas exitosamente", batchFailed: "Error al crear las {count} fuentes", batchPartial: "{success} exitosas, {failed} fallidas", submittingSource: "Enviando fuente para procesamiento...", processingBatchSources: "Procesando {count} fuentes. Esto puede tomar unos momentos.", processingSource: "Tu fuente está siendo procesada. Esto puede tomar unos momentos.", maxFilesAllowed: "Máximo {count} archivos permitidos por lote", }, chat: { sessions: "Sesiones", sessionTitlePlaceholder: "Escribe un título aquí...", noSessions: "Aún no hay sesiones de chat", deleteSession: "Eliminar sesión", deleteSessionDesc: "¿Estás seguro de que quieres eliminar esta sesión de chat? Esta acción no se puede deshacer.", sendPlaceholder: "Pregunta cualquier cosa sobre tus fuentes...", sessionsTitle: "Sesiones de chat", chatWith: "Chat con {name}", startConversation: "Inicia una conversación sobre este {type}", askQuestions: "Haz preguntas para entender mejor el contenido", pressToSend: "Presiona {key} para enviar", model: "Modelo", createToStart: "Crea una sesión para comenzar.", chatWithNotebook: "Chat con cuaderno", unableToLoadChat: "No se pudo cargar el chat", noDescription: "Sin descripción", startByCreating: "Comienza creando tu primer cuaderno para organizar tu investigación.", messagesCount: "{count} mensajes", sessionCreated: "Sesión de chat creada", sessionUpdated: "Sesión actualizada", sessionDeleted: "Sesión eliminada", }, searchPage: { askAndSearch: "Preguntar y buscar", chooseAMode: "Elige un modo", askBeta: "Preguntar (beta)", search: "Buscar", askYourKb: "Pregunta a tu base de conocimiento (beta)", askYourKbDesc: "El LLM responderá tu consulta basándose en los documentos de tu base de conocimiento.", question: "Pregunta", enterQuestionPlaceholder: "Escribe tu pregunta...", pressToSubmit: "Presiona Cmd/Ctrl+Enter para enviar", noEmbeddingModel: "No puedes usar esta función porque no tienes un modelo de embedding seleccionado. Por favor, configura uno en la página de Modelos.", usingCustomModels: "Usando modelos personalizados", usingDefaultModels: "Usando modelos predeterminados", advanced: "Avanzado", strategy: "Estrategia", answer: "Respuesta", final: "Final", ask: "Preguntar", processing: "Procesando...", saveToNotebooks: "Guardar en cuadernos", searchDesc: "Busca en tu base de conocimiento palabras clave o conceptos específicos", enterSearchPlaceholder: "Escribe tu búsqueda...", pressToSearch: "Presiona Enter para buscar", searchType: "Tipo de búsqueda", vectorSearchWarning: "La búsqueda vectorial requiere un modelo de embedding. Solo la búsqueda de texto está disponible.", textSearch: "Búsqueda de texto", vectorSearch: "Búsqueda vectorial", searchIn: "Buscar en", searchSources: "Buscar fuentes", searchNotes: "Buscar notas", resultsFound: "{count} resultados encontrados", matches: "Coincidencias ({count})", noResultsFor: "No se encontraron resultados para \"{query}\"", notSet: "No configurado", saveToNotebook: "Guardar en cuaderno", saveSuccess: "Guardado exitosamente en el cuaderno", saveError: "Error al guardar en el cuaderno", selectNotebook: "Seleccionar cuaderno", searchAndAsk: "Buscar y preguntar", searchResultsFor: "Resultados de búsqueda para \"{query}\"", askAbout: "Preguntar sobre \"{query}\"", orSearchKb: "O busca en tu base de conocimiento", saving: "Guardando...", advancedModelTitle: "Selección avanzada de modelos", advancedModelDesc: "Elige modelos específicos para cada etapa del proceso de consulta", strategyModel: "Modelo de estrategia", answerModel: "Modelo de respuesta", finalAnswerModel: "Modelo de respuesta final", selectStrategyPlaceholder: "Seleccionar modelo de estrategia", selectAnswerPlaceholder: "Seleccionar modelo de respuesta", selectFinalPlaceholder: "Seleccionar modelo de respuesta final", saveChanges: "Guardar cambios", processingQuestion: "Procesando tu pregunta...", }, podcasts: { generateEpisode: "Generar episodio de podcast", generateEpisodeDesc: "Selecciona el contenido a incluir y configura los detalles del episodio antes de generar un nuevo episodio de podcast.", content: "Contenido", contentDesc: "Elige cuadernos, fuentes y notas para incluir en este episodio.", itemsSelected: "{count} elementos seleccionados", tokens: "{count} tokens", chars: "{count} caracteres", loadingNotebooks: "Cargando cuadernos...", noNotebooksFoundInPodcasts: "No se encontraron cuadernos. Crea un cuaderno y agrega contenido antes de generar un podcast.", noContentSelected: "No se seleccionó contenido", summary: "Resumen", fullContent: "Contenido completo", untitledSource: "Fuente sin título", untitledNote: "Nota sin título", episodeSettings: "Configuración del episodio", episodeProfile: "Perfil del episodio", episodeProfilePlaceholder: "Selecciona un perfil de episodio", episodeName: "Nombre del episodio", episodeNamePlaceholder: "ej., IA y el futuro del trabajo", additionalInstructions: "Instrucciones adicionales", instructionsPlaceholder: "Cualquier consejo adicional para agregar al briefing del episodio...", generating: "Generando...", generate: "Generar", hostPlaceholder: "Presentador {number}", profileRequired: "Perfil de episodio requerido", profileRequiredDesc: "Selecciona un perfil de episodio antes de generar un podcast.", nameRequired: "Nombre del episodio requerido", nameRequiredDesc: "Proporciona un nombre para el episodio.", addContext: "Agregar contexto", addContextDesc: "Selecciona al menos una fuente o nota para incluir en el episodio.", generationFailed: "La generación del podcast falló", speakerProfile: "Perfil de locutor", usesSpeakerProfile: "Usa perfil de locutor", sources: "Fuentes", notes: "Notas", noSources: "No hay fuentes disponibles en este cuaderno.", noNotes: "No hay notas disponibles en este cuaderno.", selectMode: "Seleccionar modo", buildContextFailed: "Error al construir el contexto. Por favor, revisa tus selecciones.", podcastTaskStarted: "Tarea de podcast iniciada", loadingProfiles: "Cargando perfiles de episodio...", noProfilesFound: "No se encontraron perfiles de episodio. Crea un perfil de episodio antes de generar un podcast.", listTitle: "Podcasts", listDesc: "Lleva un registro de los episodios generados y gestiona perfiles reutilizables.", chooseAView: "Elige una vista", episodesTab: "Episodios", templatesTab: "Perfiles", overviewTitle: "Vista general de episodios", overviewDesc: "Monitorea los trabajos de generación de podcasts y revisa los artefactos finales.", generateBtn: "Generar podcast", total: "Total", processingLabel: "Procesando", completedLabel: "Completados", failedLabel: "Fallidos", pendingLabel: "Pendientes", loadErrorTitle: "Error al cargar episodios", loadErrorDesc: "No pudimos obtener los episodios más recientes. Intenta de nuevo en un momento.", loadingEpisodes: "Cargando episodios…", noEpisodesYet: "Aún no hay episodios de podcast. Genera tu primero desde las interfaces de chat de cuadernos o fuentes.", statusRunningTitle: "Procesando actualmente", statusRunningDesc: "Episodios que están generando activos activamente.", statusPendingTitle: "En cola / Pendientes", statusPendingDesc: "Episodios enviados esperando a comenzar el procesamiento.", statusCompletedTitle: "Episodios completados", statusCompletedDesc: "Listos para revisar, descargar o publicar.", statusFailedTitle: "Episodios fallidos", statusFailedDesc: "Episodios que encontraron problemas durante la generación.", templatesWorkspaceTitle: "Espacio de trabajo de perfiles", templatesWorkspaceDesc: "Construye configuraciones reutilizables de episodios y locutores para producción rápida de podcasts.", howTemplatesPowerTitle: "Cómo los perfiles impulsan la generación de podcasts", howTemplatesPowerDesc: "Los perfiles dividen el flujo de trabajo del podcast en dos bloques reutilizables. Mézclalos y combínalos cuando generes un nuevo episodio.", episodeProfilesSetFormat: "Los perfiles de episodio establecen el formato", episodeProfilesList1: "Definen el número de segmentos y cómo fluye la historia", episodeProfilesList2: "Eligen los modelos de lenguaje usados para briefing, esquema y escritura del guion", episodeProfilesList3: "Almacenan briefings predeterminados para que cada episodio comience con un tono consistente", speakerProfilesBringVoices: "Los perfiles de locutor dan vida a las voces", speakerProfilesList1: "Eligen el proveedor y modelo de texto a voz", speakerProfilesList2: "Capturan personalidad, historia y notas de pronunciación por locutor", speakerProfilesList3: "Reutiliza las mismas voces de presentador o invitado en diferentes formatos de episodio", recommendedWorkflow: "Flujo de trabajo recomendado", workflowStep1: "Crea perfiles de locutor para cada voz que necesites", workflowStep2: "Construye perfiles de episodio que referencien a esos locutores por nombre", workflowStep3: "Genera podcasts seleccionando el perfil de episodio que se ajuste a la historia", workflowHint: "Los perfiles de episodio referencian perfiles de locutor por nombre, así que empezar con los locutores evita asignaciones de voz faltantes después.", failedToLoadTemplates: "Error al cargar los datos de perfiles", failedToLoadTemplatesDesc: "Asegúrate de que la API esté funcionando e intenta de nuevo. Algunas secciones pueden estar incompletas.", loadingTemplates: "Cargando perfiles…", speakerProfilesTitle: "Perfiles de locutor", speakerProfilesDesc: "Configura voces y personalidades para los episodios generados.", createSpeaker: "Crear locutor", noSpeakerProfiles: "Aún no hay perfiles de locutor. Crea uno para hacer disponibles los perfiles de episodio.", noDescription: "No se proporcionó descripción.", usedByCount_one: "Usado por 1 episodio", usedByCount_other: "Usado por {count} episodios", usedByCount: "Usado por {count} episodios", unused: "Sin usar", voiceId: "ID de voz", backstory: "Historia", personality: "Personalidad", edit: "Editar", duplicate: "Duplicar", deleteSpeakerProfileTitle: "¿Eliminar perfil de locutor?", deleteSpeakerProfileDesc: "Eliminar \"{name}\" no se puede deshacer.", deleteSpeakerDisabledHint: "Quita este locutor de los perfiles de episodio antes de eliminarlo.", deleting: "Eliminando…", episodeProfilesTitle: "Perfiles de episodio", episodeProfilesDesc: "Define configuraciones reutilizables de generación para tus programas.", createProfile: "Crear perfil", createSpeakerFirst: "Crea un perfil de locutor antes de agregar un perfil de episodio.", noEpisodeProfiles: "Aún no hay perfiles de episodio. Crea uno para iniciar la generación de podcasts.", speakerCreated: "Locutor creado", speakerCreatedDesc: "El locutor \"{name}\" ha sido agregado exitosamente.", failedToCreateSpeaker: "Error al crear el perfil de locutor", speakerUpdated: "Locutor actualizado", speakerUpdatedDesc: "El locutor \"{name}\" ha sido actualizado exitosamente.", failedToUpdateSpeaker: "Error al actualizar el perfil de locutor", speakerDeleted: "Locutor eliminado", speakerDeletedDesc: "El locutor \"{name}\" ha sido eliminado exitosamente.", failedToDeleteSpeaker: "Error al eliminar el perfil de locutor", speakerDuplicated: "Locutor duplicado", speakerDuplicatedDesc: "El locutor \"{name}\" ha sido duplicado exitosamente.", failedToDuplicateSpeaker: "Error al duplicar el perfil de locutor", generationStarted: "Generación iniciada", generationStartedDesc: "La generación del podcast ha sido puesta en cola.", failedToStartGeneration: "Error al iniciar la generación", tryAgainMoment: "Por favor, intenta de nuevo en un momento.", deleteProfileTitle: "¿Eliminar perfil?", deleteProfileDesc: "Esto eliminará \"{name}\". Los episodios existentes conservan sus datos, pero los nuevos ya no usarán esta configuración.", profileCreated: "Perfil creado", profileCreatedDesc: "El perfil de episodio \"{name}\" ha sido creado exitosamente.", failedToCreateProfile: "Error al crear el perfil", profileUpdated: "Perfil actualizado", profileUpdatedDesc: "El perfil de episodio \"{name}\" ha sido actualizado exitosamente.", failedToUpdateProfile: "Error al actualizar el perfil", profileDeleted: "Perfil eliminado", profileDeletedDesc: "El perfil de episodio \"{name}\" ha sido eliminado exitosamente.", failedToDeleteProfile: "Error al eliminar el perfil", failedToDeleteProfileDesc: "Error al eliminar el perfil de episodio.", profileDuplicated: "Perfil duplicado", profileDuplicatedDesc: "El perfil de episodio \"{name}\" ha sido duplicado exitosamente.", failedToDuplicateProfile: "Error al duplicar el perfil", episodeDeleted: "Episodio eliminado", episodeDeletedDesc: "El episodio ha sido eliminado exitosamente.", failedToDeleteEpisode: "Error al eliminar el episodio", failedToDeleteSpeakerDesc: "Error al eliminar el perfil de locutor.", outlineModel: "Modelo de esquema", transcriptModel: "Modelo de transcripción", segments: "Segmentos", defaultBriefingTitle: "Briefing predeterminado", created: "Creado el {time}", details: "Detalles", summaryTab: "Resumen", outlineTab: "Esquema", transcriptTab: "Transcripción", briefing: "Briefing", noOutline: "No hay esquema disponible.", noTranscript: "No hay transcripción disponible.", deleteEpisodeTitle: "¿Eliminar episodio?", deleteEpisodeDesc: "Esto eliminará \"{name}\" y su archivo de audio permanentemente.", audioUnavailable: "Audio no disponible", segment: "Segmento", speaker: "Locutor", profile: "Perfil", link: "Enlace", file: "Archivo", embedded: "Embebido", notEmbedded: "No embebido", noSpeakerProfilesAvailable: "No hay perfiles de locutor disponibles", editEpisodeProfile: "Editar perfil de episodio", createEpisodeProfile: "Crear perfil de episodio", episodeProfileFormDesc: "Define cómo se deben generar los episodios y qué configuración de locutor usan por defecto.", noSpeakerProfilesDesc: "Crea un perfil de locutor antes de configurar un perfil de episodio.", profileName: "Nombre del perfil", profileNamePlaceholder: "ej., Discusión tecnológica", descriptionPlaceholder: "Breve resumen de cuándo usar este perfil", speakerConfig: "Configuración de locutor", selectSpeakerProfile: "Seleccionar un perfil de locutor", outlineGeneration: "Generación de esquema", transcriptGeneration: "Generación de transcripción", defaultBriefingPlaceholder: "Describe la estructura, tono y objetivos para este formato de episodio", editSpeakerProfile: "Editar perfil de locutor", createSpeakerProfile: "Crear perfil de locutor", speakerProfileFormDesc: "Configura los ajustes de texto a voz y define hasta cuatro locutores.", speakers: "Locutores", speakersDesc: "Configura entre una y cuatro voces para este perfil.", addSpeaker: "Agregar locutor", speakerNumber: "Locutor {number}", backstoryPlaceholder: "Breve biografía o contexto del locutor", personalityPlaceholder: "Describe el estilo y tono", outlineModelRequired: "El modelo de esquema es obligatorio", transcriptModelRequired: "El modelo de transcripción es obligatorio", defaultBriefingRequired: "El briefing predeterminado es obligatorio", segmentsInteger: "Debe ser un número entero", segmentsMin: "Al menos 3 segmentos", segmentsMax: "Máximo 20 segmentos", voiceIdRequired: "El ID de voz es obligatorio", backstoryRequired: "La historia es obligatoria", personalityRequired: "La personalidad es obligatoria", speakerCountMin: "Se requiere al menos un locutor", speakerCountMax: "Puedes configurar hasta 4 locutores", delete: "Eliminar", failedToDelete: "Error al eliminar el podcast", retry: "Reintentar", retrying: "Reintentando…", retryStarted: "Reintento iniciado", retryStartedDesc: "Se ha enviado un nuevo trabajo de generación de podcast.", failedToRetry: "Error al reintentar el episodio", errorDetails: "Detalles del error", language: "Idioma", languagePlaceholder: "Selecciona un idioma (opcional)", podcastLanguage: "Idioma del podcast", selectOutlineModel: "Seleccionar modelo de esquema", selectTranscriptModel: "Seleccionar modelo de transcripción", voiceModel: "Modelo de voz", voiceModelRequired: "El modelo de voz es obligatorio", selectVoiceModel: "Seleccionar modelo de voz", perSpeakerTtsOverride: "Anulación de TTS por locutor (opcional)", useProfileDefault: "Usar predeterminado del perfil", setupRequired: "Configuración requerida", setupRequiredDesc: "Algunos perfiles aún no tienen modelos configurados. Edítalos para seleccionar modelos antes de generar podcasts.", notConfigured: "No configurado", }, settings: { contentProcessing: "Procesamiento de contenido", contentProcessingDesc: "Configura cómo se procesan los documentos y URLs", docEngine: "Motor de procesamiento de documentos", docEnginePlaceholder: "Selecciona motor de procesamiento de documentos", urlEngine: "Motor de procesamiento de URLs", urlEnginePlaceholder: "Selecciona motor de procesamiento de URLs", autoRecommended: "Auto (Recomendado)", simple: "Simple", docling: "Docling", helpMeChoose: "Ayúdame a elegir", docHelp: "· Docling es un poco más lento pero más preciso, especialmente si los documentos contienen tablas e imágenes. · Simple extraerá cualquier contenido del documento sin formatearlo. · Auto (recomendado) intentará procesar con Docling y por defecto usará Simple.", firecrawl: "Firecrawl", jina: "Jina", urlHelp: "· Firecrawl es un servicio de pago (con un nivel gratuito), y muy potente. · Jina es una buena opción también y tiene un nivel gratuito. · Simple usará extracción HTTP básica y perderá contenido en sitios web basados en JavaScript. · Auto (recomendado) intentará usar Firecrawl, luego Jina, y finalmente Simple.", embeddingAndSearch: "Embedding y búsqueda", embeddingAndSearchDesc: "Configura las opciones de búsqueda y embedding", defaultEmbeddingOption: "Opción de embedding predeterminada", embeddingOptionPlaceholder: "Selecciona opción de embedding", ask: "Preguntar", always: "Siempre", never: "Nunca", embeddingHelp: "Embeber el contenido facilitará encontrarlo por ti y por tus agentes de IA. Si estás usando un modelo de embedding local (Ollama, por ejemplo), no deberías preocuparte por el costo y simplemente embeber todo.", fileManagement: "Gestión de archivos", fileManagementDesc: "Configura las opciones de manejo y almacenamiento de archivos", autoDeleteFiles: "Eliminar archivos automáticamente", autoDeletePlaceholder: "Selecciona opción de eliminación automática", filesHelp: "Una vez que tus archivos se suben y procesan, ya no son necesarios. La mayoría de los usuarios deberían permitir que Open Notebook elimine los archivos subidos de la carpeta de carga automáticamente.", loadFailed: "Error al cargar la configuración", }, advanced: { title: "Herramientas avanzadas", desc: "Herramientas avanzadas y utilidades para usuarios expertos", systemInfo: "Información del sistema", rebuildEmbeddings: "Reconstruir embeddings", rebuildEmbeddingsDesc: "Reconstruir el índice de búsqueda vectorial para todas las fuentes", currentVersion: "Versión actual", latestVersion: "Última versión", status: "Estado", updateAvailable: "Versión {version} disponible", updateAvailableDesc: "Una nueva versión de Open Notebook está disponible.", upToDate: "Actualizado", unknown: "Desconocido", viewOnGithub: "Ver en GitHub", updateCheckFailed: "No se pudo verificar actualizaciones. GitHub puede no ser accesible.", rebuild: { mode: "Modo de reconstrucción", existing: "Existentes", all: "Todos", existingDesc: "Re-embeber solo elementos que ya tienen embeddings (más rápido, para cambio de modelo)", allDesc: "Re-embeber elementos existentes + crear embeddings para elementos sin ninguno (más lento, completo)", include: "Incluir en la reconstrucción", selectOneError: "Por favor, selecciona al menos un tipo de elemento para reconstruir", starting: "Iniciando reconstrucción...", startBtn: "🚀 Iniciar reconstrucción", queued: "En cola", running: "Enviando trabajos...", completed: "¡Trabajos enviados!", failed: "Fallido", leavePageHint: "Puedes salir de esta página ya que se ejecutará en segundo plano", startNew: "Iniciar nueva reconstrucción", itemsProcessed: "{processed}/{total} trabajos enviados ({percent}%)", failedItems: "{count} trabajos fallaron al enviarse", time: "Tiempo", whenToRebuild: "¿Cuándo debo reconstruir los embeddings?", whenToRebuildAns: "Debes reconstruir al cambiar modelos, actualizar versiones, corregir corrupción o después de importaciones masivas.", howLong: "¿Cuánto tiempo tarda la reconstrucción?", howLongAns: "El tiempo de procesamiento depende de la cantidad de elementos, velocidad del modelo y límites de la API. Los modelos locales suelen ser muy rápidos.", isSafe: "¿Es seguro reconstruir mientras uso la aplicación?", isSafeAns: "Sí, la reconstrucción es segura. No elimina contenido, solo reemplaza embeddings, y maneja errores de forma controlada.", }, }, transformations: { title: "Transformaciones", desc: "Las transformaciones son prompts que el LLM usará para procesar una fuente y extraer análisis, resúmenes, etc.", workspace: "Elige un espacio de trabajo", playground: "Laboratorio", defaultPrompt: "Prompt de transformación predeterminado", defaultPromptDesc: "Esto se agregará a todos tus prompts de transformación", defaultPromptPlaceholder: "Ingresa tus instrucciones de transformación predeterminadas...", listTitle: "Transformaciones personalizadas", createNew: "Crear nueva", inputLabel: "Texto de entrada", inputPlaceholder: "Ingresa algo de texto para transformar...", outputLabel: "Resultado", runTest: "Ejecutar transformación", running: "Ejecutando...", selectToStart: "Selecciona una transformación para comenzar", name: "Nombre", namePlaceholder: "Identificador único, ej. temas_clave", titlePlaceholder: "Título mostrado, por defecto usa el nombre", promptPlaceholder: "Escribe el prompt que impulsará esta transformación...", descriptionPlaceholder: "Describe qué hace esta transformación.", suggestDefault: "Sugerir por defecto en nuevas fuentes", promptHint: "Los prompts deben escribirse pensando en el contenido de la fuente. Puedes pedirle al modelo que resuma, extraiga análisis o produzca resultados estructurados como tablas.", createSuccess: "Transformación creada exitosamente", updateSuccess: "Transformación actualizada exitosamente", deleteSuccess: "Transformación eliminada exitosamente", noTransformations: "Aún no hay transformaciones", createOne: "Crea una transformación para comenzar", selectModel: "Seleccionar un modelo", deleteConfirm: "¿Estás seguro de que quieres eliminar esta transformación?", model: "Modelo", systemPrompt: "Prompt del sistema", overrideModelDesc: "Anula el modelo predeterminado para esta sesión de chat. Déjalo vacío para usar el predeterminado del sistema.", sessionUseReplacement: "Esta sesión usará {name} en lugar del modelo predeterminado.", systemDefault: "Predeterminado del sistema", }, models: { embedding: "Modelos de embedding", tts: "Texto a voz (TTS)", stt: "Voz a texto (STT)", apiKey: "Clave API", deleteSuccess: "Modelo eliminado exitosamente", saveSuccess: "Modelo guardado exitosamente", noModels: "Sin modelos", discoverModels: "Descubrir modelos", noModelsFound: "No se encontraron modelos de este proveedor", modelType: "Tipo de modelo", modelTypeHint: "Selecciona el tipo para los modelos que quieres agregar. Si necesitas tipos diferentes, agrégalos en lotes separados.", deleteModel: "Eliminar modelo", defaultAssignments: "Asignaciones de modelos predeterminados", defaultAssignmentsDesc: "Configura qué modelos usar para diferentes propósitos en Open Notebook", missingRequiredModels: "Faltan modelos requeridos: {models}. Open Notebook puede no funcionar correctamente sin estos.", selectModelPlaceholder: "Seleccionar un modelo", requiredModelPlaceholder: "⚠️ Requerido - Seleccionar un modelo", chatModelLabel: "Modelo de chat", chatModelDesc: "Usado para conversaciones de chat", transformationModelLabel: "Modelo de transformación", transformationModelDesc: "Usado para resúmenes, análisis y transformaciones", toolsModelLabel: "Modelo de herramientas", toolsModelDesc: "Usado para llamadas a funciones - Se recomienda OpenAI o Anthropic", largeContextModelLabel: "Modelo de contexto largo", largeContextModelDesc: "Usado para procesar documentos grandes - Se recomienda Gemini", embeddingModelLabel: "Modelo de embedding", embeddingModelDesc: "Usado para búsqueda semántica y embeddings vectoriales", ttsModelLabel: "Modelo de texto a voz", ttsModelDesc: "Usado para generación de podcasts", sttModelLabel: "Modelo de voz a texto", sttModelDesc: "Usado para transcripción de audio", embeddingChangeTitle: "Cambio de modelo de embedding", embeddingChangeConfirm: "Estás a punto de cambiar tu modelo de embedding de {from} a {to}.", rebuildRequired: "Importante: Reconstrucción requerida", rebuildReason: "Cambiar tu modelo de embedding requiere reconstruir todos los embeddings existentes para mantener la consistencia. Sin reconstruir, tus búsquedas pueden devolver resultados incorrectos o incompletos.", whatHappensNext: "Qué pasa después:", step1: "Tu modelo de embedding predeterminado será actualizado", step2: "Los embeddings existentes permanecerán sin cambios hasta la reconstrucción", step3: "El nuevo contenido usará el nuevo modelo de embedding", step4: "Deberías reconstruir los embeddings lo antes posible", proceedToRebuildPrompt: "¿Te gustaría ir a la página Avanzado para iniciar la reconstrucción ahora?", changeModelOnly: "Solo cambiar modelo", changeAndRebuild: "Cambiar e ir a reconstruir", autoAssign: "Auto-asignar predeterminados", autoAssigning: "Asignando...", autoAssignSuccess: "{count} modelos predeterminados asignados automáticamente", autoAssignNoModels: "No hay modelos disponibles para asignar. Por favor, sincroniza modelos primero.", autoAssignAlreadySet: "Todos los modelos predeterminados ya están configurados", testModel: "Probar modelo", testModelSuccess: "Prueba de modelo exitosa", testModelFailed: "Prueba de modelo fallida", searchOrAddModel: "Buscar o escribir nombre del modelo...", addCustomModel: "Agregar \"{name}\"", }, apiKeys: { title: "Configura tu IA con tus propias claves API", description: "Almacena claves API de forma segura en la base de datos para habilitar proveedores de IA en Open Notebook.", encryptionRequired: "Clave de encriptación no configurada", encryptionRequiredDescription: "Establece la variable de entorno OPEN_NOTEBOOK_ENCRYPTION_KEY con cualquier cadena secreta para habilitar el almacenamiento de claves API en la base de datos.", configured: "Configurado", notConfigured: "No configurado", migrationAvailable: "Variables de entorno detectadas", migrationDescription: "{count} clave(s) API están configuradas vía variables de entorno y pueden migrarse a la base de datos para una gestión más fácil.", migrateToDatabase: "Migrar a la base de datos", migrating: "Migrando...", migrationSuccess: "{count} clave(s) API migradas exitosamente", migrationErrors: "{count} clave(s) fallaron al migrar", migrationNothingToMigrate: "Todas las claves ya están en la base de datos", learnMore: "Aprende cómo configurar claves API →", testConnection: "Probar conexión", testSuccess: "Conexión exitosa", testFailed: "La prueba de conexión falló", syncModels: "Sincronizar modelos", syncSuccess: "Se descubrieron {discovered} modelos, se agregaron {new} nuevos", syncNoNew: "Se descubrieron {count} modelos, todos ya registrados", syncFailed: "Error al sincronizar modelos", getApiKey: "Obtener clave API", vertexProject: "ID de proyecto GCP", vertexLocation: "Región", vertexCredentials: "Ruta del JSON de cuenta de servicio", addConfig: "Agregar configuración", editConfig: "Editar configuración", deleteConfig: "Eliminar configuración", configName: "Nombre de la configuración", configNameHint: "Un nombre descriptivo para esta configuración (ej., 'Producción', 'Desarrollo')", baseUrl: "URL base", baseUrlOverrideHint: "Solo cambia esto si necesitas anular el endpoint API predeterminado del proveedor.", deleteConfigConfirm: "¿Estás seguro de que quieres eliminar '{name}'? Esto no se puede deshacer.", configSaveSuccess: "Configuración guardada exitosamente", configUpdateSuccess: "Configuración actualizada exitosamente", configDeleteSuccess: "Configuración eliminada exitosamente", apiKeyEditHint: "Deja en blanco para mantener la clave API existente", decryptionError: "Error de desencriptación", decryptionErrorDescription: "La clave API de esta credencial no pudo ser desencriptada. La clave de encriptación puede haber cambiado. Elimina esta credencial y créala de nuevo con la clave correcta.", }, setupBanner: { encryptionRequired: "Clave de encriptación no configurada", encryptionRequiredDescription: "Establece la variable de entorno OPEN_NOTEBOOK_ENCRYPTION_KEY para habilitar el almacenamiento seguro de credenciales.", migrationAvailable: "Migración de claves API disponible", migrationDescription: "{count} proveedor(es) tienen claves API configuradas vía variables de entorno. Mígralas a la base de datos para una gestión más fácil.", goToSettings: "Ir a configuración", viewDocs: "Ver documentación", }, }