Files
LangBot/web/src/i18n/locales/es-ES.ts
T
TyperBody 262980d612 fix(web): add missing common.next/previous pagination keys
The bot session monitor paging controls use `common.next` and
`common.previous`, but those keys never existed in any locale. They were
only rendered because of the hardcoded `defaultValue: 'Next'`/`'Previous'`.
Removing those fallbacks (previous commit) made i18next render the raw key
name, so the Playwright smoke tests could no longer find the "Next" button.

Add `common.previous` and `common.next` to all 8 locales (reusing each
language's existing `guidedTour.previous`/`next` wording) and re-align the
locale key order with the `en-US` reference.

Verified locally:
- scripts/check-i18n.mjs passes for all locales
- every t('...') key referenced by BotSessionMonitor.tsx now exists in en-US
- tests/e2e/bot-session-tool-timeline.spec.ts: 13/13 passed (including the
  two request-recovery cases that failed in CI)
- prettier / tsc / eslint clean
2026-09-25 18:07:11 +08:00

3248 lines
147 KiB
TypeScript

import pipelineMigration from './pipeline-migration/es-ES';
const esES = {
assistant: {
modelHint: 'Cambia el modelo del asistente para el próximo mensaje',
details: 'Ver datos sin procesar',
found: 'Se encontraron {{count}} elementos',
completed: 'Completado',
failed: 'Fallido',
denied: 'No ejecutado',
partial: 'Resultado parcial',
operationFailed:
'La operación falló. Revisa los detalles y el estado de los recursos antes de reintentar un cambio.',
operationDenied: 'Rechazado. Nada de este lote se ejecutó.',
openResource: 'Abrir recurso',
sendUnconfirmed:
'Entrega sin confirmar. Comprueba tu conexión y vuelve a abrir la conversación.',
draftPlaceholder: 'Escribe tu próximo mensaje mientras esperas…',
operations: {
create_pipeline: 'Crear Pipeline',
configure_pipeline: 'Configurar Pipeline',
create_knowledge_base: 'Crear base de conocimiento',
get_pipeline: 'Consultar Pipeline',
get_knowledge_schema: 'Consultar el esquema del motor de conocimiento',
},
resources: {
models: 'Buscar modelos de chat',
embedding_models: 'Buscar modelos de embeddings',
pipelines: 'Buscar Pipelines',
knowledge_bases: 'Buscar bases de conocimiento',
knowledge_engines: 'Buscar motores de conocimiento',
},
title: 'Asistente del espacio de trabajo',
subtitle: 'Crea y gestiona tus aplicaciones',
newChat: 'Nueva conversación',
close: 'Cerrar',
welcome:
'Dime qué quieres crear. Puedo inspeccionar este espacio de trabajo y proponer cambios en la base de conocimiento y el Pipeline para que los confirmes.',
discover:
'¿Qué modelos, bases de conocimiento y Pipelines hay disponibles?',
build:
'Ayúdame a crear una aplicación de preguntas y respuestas con base de conocimiento.',
toolResult: 'Resultado de la operación',
review: 'Revisa las operaciones exactas antes de ejecutarlas',
confirm: 'Confirmar y ejecutar',
decline: 'Rechazar',
working: 'Procesando…',
modelUnavailable:
'Modelo no disponible. Revisa su configuración y acceso, y luego inicia una nueva conversación.',
error:
'Este turno no se completó. Revisa los resultados de los recursos antes de iniciar una nueva conversación; los cambios no se reintentan automáticamente.',
running:
'Este turno sigue en ejecución o se interrumpió antes de guardar su resultado. Vuelve a abrir el asistente para actualizar; revisa los recursos antes de empezar de nuevo.',
placeholder: 'Describe tu aplicación…',
send: 'Enviar',
},
sidebarGuide: {
steps: {
monitoring: {
title: 'Revisar la actividad',
description:
'Consulta la actividad de los bots, el uso de modelos, los mensajes y el rendimiento del sistema.',
},
bots: {
title: 'Conectar plataformas de chat',
description:
'Conecta LangBot a plataformas de chat y administra las conexiones de tus bots.',
},
pipelines: {
title: 'Configurar procesadores',
description:
'Crea flujos, Agents y configuraciones de procesadores de plugins reutilizables y conéctalos a tus bots.',
},
knowledge: {
title: 'Gestionar bases de conocimiento',
description:
'Organiza documentos y fuentes externas de conocimiento para mejorar las respuestas.',
},
plugins: {
title: 'Gestionar extensiones instaladas',
description:
'Administra plugins, servidores MCP y habilidades instalados y consulta su estado.',
},
'add-extension': {
title: 'Añadir extensiones',
description:
'Instala funciones desde el mercado, GitHub o un paquete local.',
},
models: {
title: 'Configurar modelos',
description:
'Configura proveedores y elige los modelos de lenguaje, embeddings y otros modelos que usa LangBot.',
},
'api-integration': {
title: 'Configurar acceso API',
description:
'Crea claves API y configura el acceso externo a los servicios de LangBot y MCP.',
},
},
},
guidedTour: {
eventDebugDescription:
'Elige un evento compatible, introduce datos de prueba y revisa la salida y los resultados de las herramientas. Las acciones de plataforma se simulan; los modelos y las demás herramientas se ejecutan según su configuración.',
pipeline: {
trigger: {
title: 'Elegir qué mensajes responder',
description:
'Los flujos procesan eventos de mensajes y responden automáticamente con IA. Configura los activadores de grupo, las reglas de chat privado y los filtros.',
},
ai: {
title: 'Configurar las funciones de IA',
description:
'Elige un ejecutor local o de una plataforma externa y configura su modelo, instrucciones, bases de conocimiento y otros parámetros.',
},
output: {
title: 'Ajustar las respuestas',
description:
'Configura reglas de salida, como el tratamiento de textos largos, para decidir cómo se entregan las respuestas.',
},
safety: {
title: 'Configurar controles de seguridad',
description:
'Activa filtros de contenido y límites de frecuencia según sea necesario.',
},
extensions: {
title: 'Elegir extensiones disponibles',
description:
'Selecciona los plugins, servidores MCP y habilidades que puede usar este flujo para ampliar el procesamiento y las herramientas.',
},
basic: {
title: 'Administrar el flujo',
description:
'Copia este flujo para crear otra configuración o elimina un flujo que ya no necesites.',
},
debug: {
title: 'Probar una conversación',
description:
'Envía mensajes de prueba para comprobar los activadores, las respuestas de IA y el procesamiento de salida. Los cambios se guardan antes de la prueba.',
},
monitoring: {
title: 'Revisar el historial',
description:
'Usa la pestaña junto al título para revisar conversaciones, pasos de procesamiento y errores cuando falten respuestas o sean inesperadas.',
},
save: {
title: 'Guardar y conectar un bot',
description:
'Guarda la configuración y asigna los eventos de mensaje recibido a este flujo en la página del bot.',
},
},
pluginProcessor: {
select: {
title: 'Elegir un ejecutor de plugin',
description:
'Elige un ejecutor compatible con el procesamiento de eventos. El autor del plugin declara los eventos admitidos y su lógica.',
},
parameters: {
title: 'Configurar parámetros del plugin',
description:
'Completa los ajustes del plugin. Puedes guardar varias configuraciones del mismo plugin para distintos bots o usos.',
},
debug: {
title: 'Probar el procesamiento de eventos',
},
logs: {
title: 'Revisar resultados',
description:
'Consulta el estado, el evento de entrada, los registros y los resultados de cada ejecución para investigar fallos.',
},
save: {
title: 'Guardar y vincular a un bot',
description:
'Tras guardar, añade esta configuración en la sección de procesadores de plugins del bot. Recibirá automáticamente los eventos declarados, sin rutas individuales.',
},
},
previous: 'Anterior',
label: 'Guía de uso',
progress: 'Paso {{current}} de {{total}}',
next: 'Siguiente',
finish: 'Finalizar guía',
skip: 'Omitir',
bot: {
connection: {
title: 'Elegir un método de conexión',
description:
'Elige un método compatible con este adaptador. Sus parámetros se actualizarán automáticamente.',
},
basic: {
title: 'Asignar un nombre al bot',
description:
'Usa un nombre reconocible para encontrar esta conexión en las rutas y los registros.',
},
adapter: {
title: 'Elegir un adaptador de plataforma',
description:
'Elige el adaptador de este bot. Configurarás la conexión y los parámetros de la plataforma después de crearlo.',
},
parameters: {
title: 'Configurar la plataforma',
description:
'Introduce las credenciales y los parámetros. Consulta la documentación del adaptador para los ajustes del lado de la plataforma.',
action: 'Abrir documentación del adaptador',
},
routing: {
title: 'Dirigir los eventos entrantes',
description: 'Elige qué procesador recibe cada evento de este bot.',
},
save: {
title: 'Guardar la configuración del bot',
description:
'Comprueba la conexión y las rutas de eventos, y guarda los cambios. Después puedes activar el bot.',
},
submit: {
title: 'Crear el bot',
description:
'Crea el bot desactivado y continúa configurando la conexión y los parámetros en su página.',
},
},
processorCreate: {
type: {
title: 'Elegir un tipo de procesador',
description:
'Los pipelines siguen un flujo de mensajes definido; los agentes deciden con modelos y herramientas, y los procesadores de plugins gestionan los eventos declarados.',
},
basic: {
title: 'Nombrar el procesador',
description:
'Asigna un nombre reconocible. El ejecutor y los eventos se configuran después de crear el procesador.',
},
submit: {
title: 'Crear y continuar la configuración',
description:
'Después de crear el procesador, configura el ejecutor, sus parámetros, los eventos y las herramientas que necesite.',
},
},
runner: {
debug: {
title: 'Probar el procesamiento de eventos',
},
select: {
title: 'Elegir o instalar un ejecutor',
description:
'Selecciona un ejecutor instalado o instala uno directamente desde la lista del mercado en este selector.',
action: 'Explorar ejecutores en el mercado',
},
parameters: {
title: 'Configurar los parámetros del ejecutor',
description:
'Introduce el modelo, las credenciales, la URL del servicio y los demás ajustes definidos por el ejecutor seleccionado.',
},
events: {
title: 'Configurar eventos y herramientas',
description:
'Abre Eventos y herramientas para elegir qué eventos recibe este agente y qué herramientas de plataforma o de LangBot puede usar.',
},
},
knowledge: {
basic: {
title: 'Describir la base de conocimiento',
description:
'Asigna un nombre y, si lo deseas, una descripción antes de elegir el motor de almacenamiento y búsqueda.',
},
engine: {
title: 'Revisar el motor de conocimiento',
description:
'Confirma el motor de esta base de conocimiento. Sus parámetros y opciones de búsqueda se configuran debajo.',
action: 'Explorar motores de conocimiento',
},
parameters: {
title: 'Configurar parámetros del motor',
description:
'Completa los ajustes de almacenamiento, modelo, credenciales o servicio externo que solicita el motor.',
},
retrieval: {
title: 'Configurar la búsqueda',
description:
'Define cómo busca el motor y devuelve contenido relevante a los procesadores.',
},
save: {
title: 'Guardar la base de conocimiento',
description:
'Comprueba los parámetros del motor y la búsqueda, y guarda la configuración.',
},
submit: {
title: 'Crear la base de conocimiento',
description:
'Crea la base de conocimiento y añade documentos o conecta fuentes compatibles con el motor elegido.',
},
},
},
pipelineMigration,
sidebar: {
home: 'Inicio',
extensions: 'Extensiones',
installedPlugins: 'Instalados',
pluginMarket: 'Tienda',
mcpServers: 'Servidores MCP',
addExtension: 'Añadir extensión',
pluginPages: 'Páginas de plugins',
pluginPagesTooltip:
'Páginas visuales proporcionadas por los plugins instalados',
quickStart: 'Inicio rápido',
scrollToBottom: 'Desplazar al final',
editionCommunity: 'Comunidad',
editionCloud: 'Cloud',
},
common: {
customValue: 'Personalizado',
loadFailed: 'No se pudo cargar. Inténtalo de nuevo.',
search: 'Buscar',
previous: 'Anterior',
next: 'Siguiente',
login: 'Iniciar sesión',
logout: 'Cerrar sesión',
accountOptions: 'Configuración',
account: 'Cuenta',
integration: 'Integración',
email: 'Correo electrónico',
password: 'Contraseña',
welcome: 'Bienvenido de nuevo a LangBot 👋',
continueToLogin: 'Inicia sesión para continuar',
loginSuccess: 'Inicio de sesión exitoso',
loginFailed:
'Error de inicio de sesión, por favor verifica tu correo y contraseña',
loginLoadError: 'No se puede conectar al servidor',
loginLoadErrorDesc:
'No se puede conectar al backend de LangBot. Asegúrate de que el servicio esté en ejecución e inténtalo de nuevo.',
retry: 'Reintentar',
showSecret: 'Mostrar secreto',
hideSecret: 'Ocultar secreto',
enterEmail: 'Introduce la dirección de correo electrónico',
enterPassword: 'Introduce la contraseña',
invalidEmail:
'Por favor, introduce una dirección de correo electrónico válida',
emptyPassword: 'Por favor, introduce tu contraseña',
language: 'Idioma',
helpDocs: 'Obtener ayuda',
featureRequest: 'Solicitar función',
starOnGitHub: 'Dar estrella en GitHub',
joinDiscord: 'Únete a Discord',
create: 'Crear',
edit: 'Editar',
editBasicInfo: 'Editar información básica',
editBasicInfoDescription: 'Cambia el nombre, la descripción y el icono.',
editBasicInfoDescriptionNoIcon: 'Cambia el nombre y la descripción.',
management: 'Administración',
delete: 'Eliminar',
add: 'Añadir',
select: 'Seleccionar',
clear: 'Limpiar',
skill: 'Habilidad',
cancel: 'Cancelar',
submit: 'Enviar',
error: 'Error',
success: 'Éxito',
save: 'Guardar',
saving: 'Guardando...',
recommend: 'Recomendado',
start: 'Iniciar',
confirm: 'Confirmar',
confirmDelete: 'Confirmar eliminación',
deleteConfirmation: '¿Estás seguro de que deseas eliminar esto?',
selectOption: 'Selecciona una opción',
selectPreset: 'Seleccionar preajuste',
required: 'Obligatorio',
enable: 'Activar',
name: 'Nombre',
description: 'Descripción',
icon: 'Icono',
close: 'Cerrar',
deleteSuccess: 'Eliminado correctamente',
deleteError: 'Error al eliminar: ',
addRound: 'Añadir ronda',
copy: 'Copiar',
download: 'Descargar',
copySuccess: 'Copiado correctamente',
copyFailed: 'Error al copiar',
test: 'Probar',
forgotPassword: '¿Olvidaste tu contraseña?',
agreementNotice: 'Al continuar, aceptas nuestros',
termsOfService: 'Términos de servicio',
privacyPolicy: 'Política de privacidad',
and: 'y',
dataCollectionPolicy: 'Política de recopilación de datos',
dataCollectionPolicyUrl:
'https://langbot.app/docs/en/insight/data-collection-policy',
loading: 'Cargando...',
fieldRequired: 'Este campo es obligatorio',
or: 'o',
loginWithSpace: 'Iniciar sesión con una cuenta de LangBot',
spaceLoginRecommended:
'Recomendado: Usa API de modelos oficiales estables y servicios en la nube',
loginLocal: 'Iniciar sesión con cuenta local',
loginWithPassword: 'Iniciar sesión con contraseña',
loginWithPasskey: 'Iniciar sesión con Passkey',
passkeyLoginSuccess: 'Passkey verificada con éxito, iniciando sesión...',
passkeyLoginFailed: 'Error al iniciar sesión con Passkey',
passkeyNotSupported:
'Passkey no es compatible en este navegador o dispositivo',
verify: 'Verificar',
back: 'Atrás',
totpChallengeTitle: 'Verificación en dos pasos',
totpChallengeDesc:
'Introduce el código de 6 dígitos de tu aplicación de autenticación para continuar',
totpUseRecoveryCode:
'Introduce uno de tus códigos de recuperación de un solo uso para continuar',
enterTotpCode: 'Introduce el código de 6 dígitos',
enterRecoveryCode: 'Introduce el código de recuperación',
useRecoveryCode: 'Usar un código de recuperación',
useTotpCode: 'Usar un código de autenticación',
totpInvalidCode: 'Código no válido o ya usado, inténtalo de nuevo',
totpVerifyFailed: 'La verificación en dos pasos falló, inténtalo de nuevo',
spaceLoginTitle: 'Iniciar sesión con una cuenta de LangBot',
spaceLoginDescription:
'Escanea el código QR o visita el enlace para autorizar',
spaceLoginUserCode: 'Tu código',
spaceLoginExpires: 'El código expira en {{seconds}} segundos',
spaceLoginWaiting: 'Esperando autorización...',
spaceLoginSuccess: 'Autorización exitosa',
spaceLoginFailed: 'Error de inicio de sesión con una cuenta de LangBot',
spaceLoginExpired:
'El código de autorización ha expirado, por favor inténtalo de nuevo',
spaceLoginCancel: 'Cancelar',
spaceLoginVisitLink: 'Visitar enlace',
spaceLoginProcessing: 'Iniciando sesión con una cuenta de LangBot',
spaceLoginProcessingDescription:
'Por favor espera mientras completamos tu inicio de sesión...',
spaceLoginSuccessDescription: 'Redirigiendo a LangBot...',
spaceLoginError: 'Error de inicio de sesión',
spaceLoginNoCode: 'Falta el código de autorización',
backToLogin: 'Volver al inicio de sesión',
backToHome: 'Volver al inicio',
spaceAccountCannotChangePassword:
'Las cuentas de LangBot no pueden cambiar la contraseña aquí',
theme: 'Tema',
changePassword: 'Cambiar contraseña',
currentPassword: 'Contraseña actual',
newPassword: 'Nueva contraseña',
confirmNewPassword: 'Confirmar nueva contraseña',
enterCurrentPassword: 'Introduce la contraseña actual',
enterNewPassword: 'Introduce la nueva contraseña',
enterConfirmPassword: 'Confirma la nueva contraseña',
currentPasswordRequired: 'La contraseña actual es obligatoria',
newPasswordRequired: 'La nueva contraseña es obligatoria',
confirmPasswordRequired: 'La confirmación de contraseña es obligatoria',
passwordsDoNotMatch: 'Las contraseñas no coinciden',
changePasswordSuccess: 'Contraseña cambiada correctamente',
changePasswordFailed:
'Error al cambiar la contraseña, por favor verifica tu contraseña actual',
apiIntegration: 'Integración API',
apiIntegrationDescription:
'Gestiona las claves API y los webhooks para el acceso externo',
apiKeys: 'Claves API',
manageApiIntegration: 'Gestionar integración API',
manageApiKeys: 'Gestionar claves API',
createApiKey: 'Crear clave API',
apiKeyName: 'Nombre de la clave API',
apiKeyDescription: 'Descripción de la clave API',
apiKeyValue: 'Valor de la clave API',
apiKeyCreated: 'Clave API creada correctamente',
apiKeyDeleted: 'Clave API eliminada correctamente',
apiKeyDeleteConfirm: '¿Estás seguro de que deseas eliminar esta clave API?',
apiKeyNameRequired: 'El nombre de la clave API es obligatorio',
copyApiKey: 'Copiar clave API',
apiKeyCopied: 'Clave API copiada al portapapeles',
noApiKeys: 'No hay claves API configuradas',
apiKeyHint:
'Las claves API permiten a sistemas externos acceder a las API del servicio LangBot',
mcpTab: 'MCP',
mcpHint:
'LangBot exposes an MCP (Model Context Protocol) server so AI agents can manage this instance. It uses the same API keys as the Service API.',
mcpEndpoint: 'MCP Endpoint',
mcpAuthTitle: 'Authentication',
mcpAuthDesc:
'Authenticate with any API key from the API Keys tab, sent as a header:',
mcpGlobalKeyNote:
'You can also set a global API key in config.yaml (api.global_api_key) to use without logging in.',
mcpClientConfigTitle: 'Example MCP client config',
webhooks: 'Webhooks',
createWebhook: 'Crear Webhook',
webhookName: 'Nombre del Webhook',
webhookUrl: 'URL del Webhook',
webhookDescription: 'Descripción del Webhook',
webhookEnabled: 'Activado',
webhookCreated: 'Webhook creado correctamente',
webhookDeleted: 'Webhook eliminado correctamente',
webhookDeleteConfirm: '¿Estás seguro de que deseas eliminar este Webhook?',
webhookNameRequired: 'El nombre del Webhook es obligatorio',
webhookUrlRequired: 'La URL del Webhook es obligatoria',
noWebhooks: 'No hay Webhooks configurados',
webhookHint:
'Los Webhooks permiten a LangBot enviar eventos de mensajes personales y grupales a sistemas externos',
actions: 'Acciones',
apiKeyCreatedMessage:
'Por favor copia esta clave API, si el botón no funciona, cópiala manualmente.',
apiKeyStoredSecurely: 'Secret shown only when created',
none: 'Ninguno',
more: 'Más ({{count}})',
less: 'Menos',
noItems: 'Sin elementos',
},
notFound: {
title: 'Página no encontrada',
description: 'La página que buscas no existe.',
back: 'Volver',
home: 'Inicio',
help: 'Obtener ayuda',
},
models: {
codex: {
account: 'Suscripción de ChatGPT',
description:
'Inicia sesión con tu cuenta de ChatGPT. La suscripción es independiente de la facturación de la API de OpenAI; los modelos y límites dependen de tu plan.',
disconnected: 'Sin conexión',
loading: 'Comprobando conexión…',
starting: 'Iniciando sesión…',
pending: 'Esperando autorización',
connected: 'Conectado',
expired: 'El inicio de sesión ha caducado. Solicita un nuevo código.',
error:
'No se pudo iniciar sesión. Comprueba la conexión e inténtalo de nuevo.',
canceling: 'Cancelando inicio de sesión…',
saveAndSignIn: 'Guardar e iniciar sesión',
done: 'Listo',
instructions:
'Introduce este código en la página de OpenAI. Mantén este diálogo abierto hasta completar el inicio de sesión.',
copyCode: 'Copiar código',
copied: 'Copiado',
copyManually: 'Selecciona y copia el código manualmente.',
continueAtOpenAI: 'Continuar en OpenAI',
expiresAt: 'El código caduca a las {{time}}.',
retrying: 'Conexión interrumpida. Reintentando automáticamente…',
cancelSignIn: 'Cancelar inicio de sesión',
tryAgain: 'Reintentar',
signIn: 'Iniciar sesión',
reconnect: 'Reconectar',
disconnect: 'Desconectar',
disconnectConfirm:
'¿Desconectar este proveedor? Sus modelos dejarán de funcionar hasta que vuelvas a iniciar sesión. Esto no cancela tu suscripción de ChatGPT.',
confirmDisconnect: 'Confirmar desconexión',
},
title: 'Modelos',
description:
'Configura y gestiona los modelos que se pueden usar en los Pipelines',
createModel: 'Crear modelo',
editModel: 'Editar modelo',
getModelListError: 'Error al obtener la lista de modelos: ',
modelName: 'Nombre del modelo',
modelProvider: 'Proveedor del modelo',
modelBaseURL: 'URL base',
modelAbilities: 'Capacidades del modelo',
saveSuccess: 'Guardado correctamente',
saveError: 'Error al guardar: ',
createSuccess: 'Creado correctamente',
createError: 'Error al crear: ',
deleteSuccess: 'Eliminado correctamente',
deleteError: 'Error al eliminar: ',
deleteConfirmation: '¿Estás seguro de que deseas eliminar este modelo?',
modelNameRequired: 'El nombre del modelo no puede estar vacío',
modelProviderRequired: 'El proveedor del modelo no puede estar vacío',
requestURLRequired: 'La URL de solicitud no puede estar vacía',
apiKeyRequired: 'La clave API no puede estar vacía',
keyNameRequired: 'El nombre de la clave no puede estar vacío',
mustBeValidNumber: 'Debe ser un número válido',
mustBeTrueOrFalse: 'Debe ser verdadero o falso',
requestURL: 'URL de solicitud',
scanURL: 'URL de escaneo de modelos',
scanURLPlaceholder: 'Déjalo vacío para usar URL de solicitud + /models',
scanURLDescription:
'Ingresa el endpoint real de la lista de modelos cuando el escaneo de modelos no utiliza la misma dirección que la invocación del modelo.',
apiKey: 'Clave API',
abilities: 'Capacidades',
selectModelAbilities: 'Seleccionar capacidades del modelo',
visionAbility: 'Capacidad de visión',
functionCallAbility: 'Llamada a funciones',
reasoningAbility: 'Razonamiento',
reasoningLevel: 'Nivel de razonamiento',
reasoningLevels: {
providerDefault: 'Usar valor predeterminado del proveedor',
disabled: 'Desactivado',
enabled: 'Activado',
minimal: 'Mínimo',
low: 'Bajo',
medium: 'Medio',
high: 'Alto',
xhigh: 'Extra alto',
max: 'Máximo',
},
contextLength: 'Ventana de contexto',
contextLengthPlaceholder: 'Desconocido',
contextLengthInvalid: 'La ventana de contexto debe ser un entero positivo',
extraParameters: 'Parámetros adicionales',
addParameter: 'Añadir parámetro',
keyName: 'Nombre de la clave',
type: 'Tipo',
value: 'Valor',
string: 'Cadena',
number: 'Número',
boolean: 'Booleano',
object: 'Objeto',
objectJsonPlaceholder: '{ "type": "disabled" }',
invalidJsonObject: 'El valor debe ser un objeto JSON válido',
selectModelProvider: 'Seleccionar proveedor del modelo',
modelProviderDescription:
'Por favor, introduce el nombre del modelo proporcionado por el proveedor',
modelManufacturer: 'Fabricante del modelo',
aggregationPlatform: 'Plataforma de agregación',
selfDeployed: 'Autoalojado',
builtin: 'Integrado',
selectModel: 'Seleccionar modelo',
testSuccess: 'Prueba exitosa',
testError:
'Error en la prueba, por favor verifica la configuración del modelo',
llmModels: 'Modelos LLM',
localProvider: 'Local',
localProviderDescription: 'Modelos configurados y gestionados localmente',
spaceProviderDescription:
'Modelos sincronizados desde tu cuenta de LangBot',
spaceDisabledForLocalAccount:
'Inicia sesión con una cuenta de LangBot para usar modelos en la nube',
syncModels: 'Sincronizar',
syncSuccess:
'Sincronización completa: {{created}} creados, {{updated}} actualizados',
syncError: 'Error de sincronización: ',
spaceModelReadOnly: 'Los modelos de Space son de solo lectura',
noSpaceModels:
'No hay modelos de Space. Haz clic en Sincronizar para obtener modelos de Space.',
noLocalModels:
'No hay modelos locales. Haz clic en Crear para añadir un modelo.',
providerCount: '{{count}} proveedores',
addModel: 'Añadir modelo',
manualAdd: 'Manual',
scanAdd: 'Escanear',
scanModels: 'Escanear modelos',
scanModelsHint:
'Lee los modelos disponibles del proveedor actual y luego elige cuáles agregar.',
scannedModels: 'Modelos detectados',
scanDebug: 'Información de depuración',
searchScannedModels: 'Buscar modelos detectados',
noScannedModels:
'Todavía no hay resultados. Pulsa el botón superior para escanear.',
noScannedModelsMatch: 'No hay modelos coincidentes',
addSelectedModels: 'Agregar seleccionados',
addSelectedModelsSuccess: 'Se agregaron {{count}} modelo(s)',
selectAll: 'Seleccionar todo',
alreadyAdded: 'Ya agregado',
addLLMModel: 'Añadir modelo LLM',
addEmbeddingModel: 'Añadir modelo Embedding',
provider: 'Proveedor',
existingProvider: 'Proveedor existente',
newProvider: 'Nuevo proveedor',
selectProvider: 'Seleccionar proveedor',
requester: 'Tipo de proveedor',
selectRequester: 'Seleccionar tipo de proveedor',
searchProviders: 'Buscar proveedores...',
langbotModelsDescription: 'Modelos en la nube impulsados por LangBot Space',
credits: 'Créditos',
loginWithSpace: 'Iniciar sesión con una cuenta de LangBot',
loginToUseModels:
'Inicia sesión con una cuenta de LangBot para usar modelos en la nube',
ownerMustBindSpace:
'The Workspace owner must connect a LangBot Account for LangBot Models.',
usesOwnerSpaceBilling:
"Uses the Workspace owner's LangBot Account billing and credits.",
noModels: 'No hay modelos configurados',
availability: {
available: 'Disponible en la última comprobación',
unavailable: 'No disponible en la última comprobación',
notChecked: 'Sin resultado de comprobación',
lastChecked: 'Comprobado {{time}}',
},
pricing: {
compact: '{{input}} / {{output}}',
inline: 'Entrada {{input}} · salida {{output}}',
title: 'Créditos por 1 M de tokens',
input: 'Entrada: {{credits}} créditos',
output: 'Salida: {{credits}} créditos',
unavailable:
'No se encontró el precio. Es posible que el modelo haya sido retirado.',
},
langbotModels: 'Modelos LangBot',
spaceTrialTooltip:
'¡Créditos de prueba gratuitos disponibles! Inicia sesión con una cuenta de LangBot para acceder a modelos en la nube sin configuración.',
unlockModels: 'Inicia sesión para usar',
editProvider: 'Editar proveedor',
addProvider: 'Añadir proveedor',
addProviderHint: 'Añade proveedores para usar modelos de otras fuentes',
addProviderHintSimple: 'Añade proveedores para usar modelos',
noProviders: 'Aún no hay proveedores',
providerName: 'Nombre del proveedor',
providerNameRequired: 'El nombre del proveedor es obligatorio',
requesterRequired: 'El tipo de proveedor es obligatorio',
providerSaved: 'Proveedor guardado',
providerCreated: 'Proveedor creado',
providerSaveError: 'Error al guardar el proveedor: ',
providerDeleted: 'Proveedor eliminado',
providerDeleteError: 'Error al eliminar el proveedor: ',
deleteProviderCascadeConfirmation:
'¿Eliminar este proveedor y TODOS los modelos que contiene? Esta acción es irreversible y no se puede deshacer.',
deleteProviderConfirmation:
'¿Estás seguro de que deseas eliminar este proveedor?',
loadError: 'Error al cargar datos',
chat: 'Chat',
embedding: 'Embedding',
rerank: 'Reordenar',
rerankUrlTooltip:
'URL completa para el endpoint de reordenación (ej: https://dashscope.aliyuncs.com/compatible-api/v1/reranks)',
rerankPathTooltip:
'Ruta añadida a la URL base (predeterminado: rerank, algunos servicios usan reranks)',
modelsCount: '{{count}} modelo(s)',
expandModels: 'Expandir',
collapseModels: 'Contraer',
fallback: {
primary: 'Modelo principal',
fallbackList: 'Modelos de respaldo',
addFallback: 'Añadir modelo de respaldo',
},
},
bots: {
pluginSubscriptions: {
incompleteEvents:
'Este bot solo admite algunos de los eventos suscritos ({{events}}). El procesador podría no comportarse como se espera en todos los casos.',
description:
'Recibe automáticamente los eventos declarados por el plugin, de forma independiente de las rutas anteriores.',
empty: 'No hay procesadores vinculados.',
add: 'Añadir procesador de plugin',
existing: 'Elegir configuración',
new: 'Nueva configuración',
noExisting: 'No hay configuraciones disponibles. Crea una.',
shared:
'Los bots que usan la misma configuración comparten ajustes y estado de ejecución.',
saveHint: 'Guarda el bot para activar el vínculo.',
createAndBind: 'Crear y vincular',
created: 'Configuración creada. Guarda el bot para activar el vínculo.',
enable: 'Activar {{name}}',
remove: 'Desvincular {{name}}',
configure: 'Configurar',
logs: 'Ver registros',
},
applyFailed: 'Configuración guardada, pero no se pudo aplicar',
internalErrorHint:
'Se produjo un error interno. Consulta los registros del servidor con esta referencia.',
errorReference: 'Referencia del error: {{id}}',
title: 'Bots',
description:
'Crea y gestiona Bots, que son los puntos de entrada para que LangBot se conecte con diversas plataformas',
createBot: 'Crear Bot',
selectFromSidebar: 'Selecciona un Bot de la barra lateral',
editBot: 'Editar Bot',
getBotListError: 'Error al obtener la lista de Bots: ',
botName: 'Nombre del Bot',
botDescription: 'Descripción del Bot',
botNameRequired: 'El nombre del Bot no puede estar vacío',
botDescriptionRequired: 'La descripción del Bot no puede estar vacía',
adapterRequired: 'El adaptador no puede estar vacío',
connectionMode: 'Método de conexión',
connectionModeDescription:
'Elige un método de conexión compatible con este adaptador.',
connectionWebhook: 'Webhook',
connectionWebhookDescription:
'La plataforma envía eventos a una URL generada por LangBot.',
connectionPersistent: 'Conexión persistente',
connectionPersistentDescription:
'LangBot mantiene abierta una conexión saliente de socket o streaming.',
noAdaptersForConnectionMode:
'Ningún adaptador instalado admite este método de conexión.',
defaultDescription: 'Un Bot',
getBotConfigError: 'Error al obtener la configuración del Bot: ',
saveSuccess: 'Guardado correctamente',
saveError: 'Error al guardar: ',
createSuccess: 'Creado correctamente. Configura el enrutamiento de eventos',
createError: 'Error al crear: ',
deleteSuccess: 'Eliminado correctamente',
deleteError: 'Error al eliminar: ',
deleteConfirmation: '¿Estás seguro de que deseas eliminar este Bot?',
platformAdapter: 'Selección de plataforma/adaptador',
selectAdapter: 'Seleccionar adaptador',
legacyAdapters: 'Adaptadores heredados',
legacyAdapterBadge: 'Heredado',
legacyAdaptersHint:
'Estos adaptadores tienen versiones nuevas orientadas a eventos.\nSe mantienen solo para configuraciones existentes y no se recomiendan para Bots nuevos.',
adapterConfig: 'Configuración del adaptador',
viewAdapterDocs: 'Ver documentación',
bindPipeline: 'Vincular Pipeline',
selectPipeline: 'Seleccionar Pipeline',
selectBot: 'Seleccionar Bot',
botLogTitle: 'Registro del Bot',
enableAutoRefresh: 'Activar actualización automática',
session: 'Sesión',
yesterday: 'Ayer',
earlier: 'Anterior',
dateFormat: '{{day}}/{{month}}',
setBotEnableError: 'Error al establecer el estado de activación del Bot',
log: 'Registro',
configuration: 'Configuración',
logs: 'Registros',
basicInfo: 'Información básica',
basicInfoDescription: 'Establece el nombre y la descripción del Bot',
routingConnection: 'Enrutamiento y conexión',
routingConnectionDescription:
'Vincula el Pipeline que procesa los mensajes de este Bot',
eventRouting: 'Enrutamiento de eventos',
eventRoutingDescription:
'Elige qué procesador maneja cada evento recibido por este Bot. Edita la lógica en la configuración del Agent o Pipeline correspondiente. Los Pipelines solo admiten eventos de mensaje.',
eventBindings: 'Rutas de eventos',
addEventBinding: 'Añadir ruta',
addBehavior: 'Añadir comportamiento',
commonScenarios: 'Escenarios habituales',
dragEventRoute: 'Arrastrar ruta {{index}}',
behaviorReplyMessages: 'Responder a mensajes',
behaviorReplyMessagesDescription:
'Envía los mensajes entrantes a un procesador.',
behaviorWelcomeMembers: 'Dar la bienvenida a nuevos miembros',
behaviorWelcomeMembersDescription:
'Ejecuta un procesador cuando alguien se une a un grupo.',
behaviorHandleDepartures: 'Gestionar salidas de miembros',
behaviorHandleDeparturesDescription:
'Ejecuta un procesador cuando alguien sale o es expulsado.',
behaviorReviewFriendRequests: 'Revisar solicitudes de amistad',
behaviorReviewFriendRequestsDescription:
'Envía las nuevas solicitudes de amistad a un procesador.',
behaviorHandleModeration: 'Gestionar eventos de moderación',
behaviorHandleModerationDescription:
'Ejecuta un procesador cuando se restringe a un miembro del grupo.',
behaviorCustom: 'Configurar otro evento',
behaviorCustomDescription:
'Añade una ruta y elige entre los eventos admitidos por este adaptador.',
eventPattern: 'Evento',
eventPatternPlaceholder: 'Seleccionar evento',
targetType: 'Tipo de destino',
target: 'Procesador',
targetAgent: 'Agent',
targetPipeline: 'Flujo',
targetDiscard: 'Descartar',
selectTarget: 'Seleccionar procesador',
searchTarget: 'Buscar procesadores…',
noTargetFound: 'No se encontraron procesadores compatibles',
priority: 'Prioridad',
enabled: 'Activado',
eventBindingDescriptionPlaceholder: 'Descripción de la regla',
noEventBindings: 'No hay rutas de eventos',
unsupportedPipelineEvent: 'Los flujos solo admiten eventos message.*',
disable: 'Desactivar',
enable: 'Activar',
disabledBindings: 'Desactivado',
adapterEventsTitle: 'Eventos admitidos',
adapterEventsDescription: '{{count}} tipos de evento',
adapterEventsMore: '{{count}} más',
advancedEventValues: 'Ver todos',
eventGroup: 'Grupo',
eventGroupNames: {
bot: 'Estado del bot',
feedback: 'Comentarios',
friend: 'Amigos',
group: 'Grupos',
message: 'Mensajes',
platform: 'Plataforma',
},
routeConflictTitle: 'Algunas rutas se superponen',
routeConflictShadowed:
'{{shadowed}} podría no ejecutarse porque {{winner}} procesa primero los mismos eventos.',
routeConflictMore: 'Hay {{count}} conflictos de rutas adicionales.',
routeFallbackCatchAll: '{{route}} es la ruta general.',
routeFallbackIgnored:
'Se ignoran los eventos sin ruta coincidente. Añade una ruta general solo si todos los eventos necesitan un resultado explícito.',
testRoute: 'Comprobar ruta',
adapterEventDebugAction: 'Probar escucha',
adapterEventDebugTitle: 'Depuración de eventos de plataforma',
adapterEventDebugDescription:
'Genera un evento en {{platform}}. Aparecerá aquí cuando lo reciba el adaptador.',
adapterEventObserveOnly:
'Esta ventana solo observa eventos. Los eventos entrantes siguen las rutas actuales.',
adapterEventPreparing: 'Preparando',
adapterEventListening: 'Escuchando',
adapterEventListenerUnavailable: 'Escucha interrumpida',
adapterEventLoadFailed:
'No se pudieron leer los eventos. Comprueba que el bot está en ejecución y vuelve a intentarlo.',
adapterEventReceivedCount: '{{count}} eventos recibidos',
adapterEventClear: 'Limpiar',
adapterEventEmptyTitle: 'Esperando un evento de plataforma',
adapterEventEmptyDescription:
'Envía un mensaje o genera un evento en {{platform}}.',
adapterEventData: 'Ver datos del evento',
adapterEventNeedsSavedBot: 'Guarda el bot antes de escuchar eventos.',
adapterEventCurrentPlatform: 'la plataforma actual',
adapterConfigurationTest: 'Probar la configuración del adaptador',
adapterConfigurationTestDescription:
'Guarda y activa el bot; después genera un evento para comprobar la configuración.',
refreshRouteStatus: 'Actualizar estado',
routeStatusIdle: 'Aún sin ejecuciones',
routeStatusRefreshFailed: 'No se pudo actualizar el estado de la ruta.',
routeStatus: {
matched: 'Coincide',
delivered: 'Entregado',
discarded: 'Descartado',
failed: 'Fallido',
not_matched: 'Sin coincidencia',
},
routeStatusDetail: {
matched: 'Esta ruta coincide con el evento.',
delivered: 'El procesador recibió el evento.',
discarded: 'El evento se descartó intencionadamente.',
failed: 'La ruta no pudo completarse.',
not_matched: 'Ninguna ruta configurada coincide con el evento.',
},
routeFailure: {
binding_disabled: 'Esta ruta está desactivada.',
event_pattern_mismatch: 'El evento no coincide con esta ruta.',
filters_mismatch:
'Los datos de prueba no cumplen las condiciones de la ruta.',
lower_priority: 'Otra ruta coincidente tiene mayor prioridad.',
route_not_found: 'Ninguna ruta coincide con este evento.',
processor_incompatible:
'El procesador seleccionado no admite este evento.',
processor_not_found: 'El procesador seleccionado no está disponible.',
runner_failed: 'El ejecutor del Agent falló al procesar el evento.',
delivery_failed: 'El procesador terminó, pero la entrega falló.',
},
dryRunTitle: 'Comprobar ruta de eventos',
dryRunDescription:
'Elige un evento para ver con qué ruta y procesador coincide.',
dryRunEventType: 'Tipo de evento',
dryRunSampleReady: 'Evento de ejemplo listo',
dryRunSampleDescription:
'LangBot ha preparado datos de ejemplo para {{event}}. Normalmente puedes usarlos sin cambios.',
dryRunEditPayload: 'Datos de prueba',
dryRunHidePayload: 'Ocultar datos',
dryRunPayload: 'Datos de prueba (JSON)',
dryRunPayloadHint:
'Úsalos para probar condiciones de mensajes y conversaciones.',
dryRunPayloadJsonError: 'Introduce un JSON válido.',
dryRunPayloadObjectError: 'Los datos deben ser un objeto JSON.',
dryRunNeedsSavedBot: 'Guarda el bot antes de comprobar las rutas.',
dryRunFailed: 'No se pudo comprobar la ruta. Inténtalo más tarde.',
dryRunAction: 'Ver coincidencia',
dryRunRunning: 'Comprobando…',
dryRunMatched: 'Ruta coincidente',
dryRunNotMatched: 'Ninguna ruta coincide',
dryRunTarget: 'Procesador de destino',
dryRunNoTarget: 'Sin destino',
dryRunMatchedRule: 'Regla coincidente',
dryRunRuleIndex: 'Ruta {{index}}',
dryRunNoRule: 'Ninguna regla coincide',
dryRunDiagnostics: 'Pasos de diagnóstico',
dryRunDiagnosticSelected: 'Se seleccionó {{route}}.',
dryRunDiagnosticMatched: '{{route}} coincide. {{reason}}',
dryRunDiagnosticSkipped: 'Se omitió {{route}}. {{reason}}',
eventCustom: 'Evento personalizado',
eventWildcard: 'Todos los eventos',
eventNamespaceWildcard: '{{namespace}}.*',
eventNames: {
message_received: 'Mensaje recibido',
message_edited: 'Mensaje editado',
message_deleted: 'Mensaje eliminado',
message_reaction: 'Reacción a un mensaje',
feedback_received: 'Comentarios recibidos',
friend_request_received: 'Solicitud de amistad recibida',
friend_added: 'Amigo añadido',
group_member_joined: 'Miembro unido al grupo',
group_member_left: 'Miembro salió del grupo',
group_member_banned: 'Miembro bloqueado',
bot_invited_to_group: 'Bot invitado al grupo',
bot_removed_from_group: 'Bot eliminado del grupo',
bot_muted: 'Bot silenciado',
bot_unmuted: 'Bot ya no silenciado',
platform_specific: 'Evento específico de la plataforma',
},
eventDescriptions: {
all: 'Coincide con todos los eventos recibidos por este adaptador.',
namespace: 'Coincide con todos los eventos de {{group}}.',
namespace_bot:
'Coincide con invitaciones, expulsiones, silencios y otros cambios de estado del bot.',
namespace_feedback:
'Coincide con comentarios recibidos de la plataforma o de usuarios.',
namespace_friend: 'Coincide con solicitudes y cambios de amistad.',
namespace_group:
'Coincide con entradas, salidas, expulsiones y otros eventos de grupo.',
namespace_message:
'Coincide con mensajes recibidos, editados, eliminados y reacciones.',
namespace_platform:
'Coincide con eventos específicos de plataforma proporcionados por un adaptador.',
custom: 'Evento personalizado o aún sin descripción.',
message_received: 'Un usuario o grupo envía un nuevo mensaje al bot.',
message_edited:
'La plataforma informa de un cambio en un mensaje existente.',
message_deleted: 'La plataforma informa de la eliminación de un mensaje.',
message_reaction: 'Un usuario añade o elimina una reacción a un mensaje.',
feedback_received:
'Se reciben comentarios de la plataforma o de un usuario.',
friend_request_received: 'Alguien solicita añadir al bot como amigo.',
friend_added: 'Se ha creado una relación de amistad.',
group_member_joined: 'Un miembro se une a un grupo donde está el bot.',
group_member_left: 'Un miembro abandona un grupo donde está el bot.',
group_member_banned: 'Un miembro del grupo es bloqueado o expulsado.',
bot_invited_to_group: 'El bot es invitado a un grupo.',
bot_removed_from_group: 'El bot es expulsado de un grupo.',
bot_muted: 'El bot es silenciado en un grupo.',
bot_unmuted: 'Se retira el silencio del bot en un grupo.',
platform_specific: 'Evento de plataforma específico del adaptador.',
},
conditions: 'Condiciones',
conditionsDescription:
'Deben cumplirse todas las condiciones. Déjalo vacío para activar siempre.',
conditionsEmpty: 'Sin condiciones: siempre se activa.',
addFilter: 'Añadir condición',
filterChatType: 'Tipo de sesión',
filterChatId: 'ID de sesión',
filterMessageText: 'Texto del mensaje',
filterMessageElement: 'Elemento del mensaje',
operator_eq: 'es igual a',
operator_neq: 'no es igual a',
operator_contains: 'contiene',
operator_not_contains: 'no contiene',
operator_starts_with: 'empieza por',
operator_regex: 'expresión regular',
routingRules: 'Reglas de enrutamiento condicional',
routingRulesDescription:
'Las reglas se evalúan en orden; la primera coincidencia enruta a su pipeline. Si ninguna coincide, se usa el pipeline predeterminado.',
addRoutingRule: 'Agregar regla',
ruleTypeLauncherType: 'Tipo de sesión',
ruleTypeLauncherId: 'ID de sesión',
ruleTypeMessageContent: 'Contenido del mensaje',
operatorEq: 'Igual a',
operatorNeq: 'No igual a',
operatorContains: 'Contiene',
operatorNotContains: 'No contiene',
operatorStartsWith: 'Comienza con',
operatorRegex: 'Regex',
operatorHas: 'Tiene',
operatorNotHas: 'No tiene',
ruleTypeMessageHasElement: 'Elemento del mensaje',
ruleValueElementPlaceholder: 'Seleccionar tipo de elemento',
elementImage: 'Imagen',
elementVoice: 'Voz',
elementFile: 'Archivo',
elementForward: 'Reenvío',
elementFace: 'Emoji',
elementAt: '@Mención',
elementAtAll: '@Todos',
elementQuote: 'Cita',
ruleValuePlaceholder: 'Valor de coincidencia',
ruleValueLauncherIdPlaceholder: 'ID de grupo o usuario',
ruleValueMessagePlaceholder: 'Texto del mensaje',
ruleValuePrefixPlaceholder: 'ej. !draw',
ruleValueRegexpPlaceholder: 'ej. ^/help',
pipelineDiscard: 'Descartar mensaje',
sessionTypePerson: 'Chat privado',
sessionTypeGroup: 'Chat grupal',
adapterConfigDescription:
'Configura el adaptador de plataforma seleccionado',
dangerZone: 'Zona de peligro',
dangerZoneDescription: 'Acciones irreversibles y destructivas',
deleteBotAction: 'Eliminar este Bot',
deleteBotHint:
'Una vez eliminado, toda la configuración asociada se eliminará permanentemente.',
webhookUrl: 'URL de callback Webhook',
webhookUrlCopied: 'URL del Webhook copiada',
webhookUrlHint:
'Haz clic en el campo para seleccionar todo, luego presiona Ctrl+C (Mac: Cmd+C) para copiar, o haz clic en el botón',
webhookUrlHintEither:
'Usa cualquiera de las dos URL anteriores en la configuración de tu plataforma',
webhookSaasHint:
'Webhook requiere un dominio accesible públicamente. LangBot Cloud proporciona un punto de acceso público listo para usar para tu Bot.',
webhookSaasLink: 'Más información sobre LangBot Cloud',
adapterCategory: {
popular: 'Popular',
china: 'China',
global: 'Global',
protocol: 'Protocolo',
},
logLevel: 'Nivel de registro',
allLevels: 'Todos los niveles',
selectLevel: 'Seleccionar nivel',
levelsSelected: 'niveles seleccionados',
viewDetailedLogs: 'Ver registros detallados',
viewDetails: 'Detalles',
collapse: 'Contraer',
imagesAttached: 'imagen(es) adjunta(s)',
noLogs: 'Aún no hay registros',
sessionMonitor: {
title: 'Sesiones',
sessions: 'Sesiones',
noSessions: 'No se encontraron sesiones',
selectSession: 'Selecciona una sesión para ver los mensajes',
noMessages: 'No hay mensajes en esta sesión',
messages: 'mensajes',
messageCount: '{{count}} mensajes',
loading: 'Cargando...',
loadingSessions: 'Cargando sesiones...',
loadingMessages: 'Cargando mensajes...',
user: 'Usuario',
variables: 'Variables',
platform: 'Plataforma',
lastActive: 'Última actividad',
refresh: 'Actualizar',
active: 'Activo',
inactive: 'Inactivo',
discarded: 'Descartado',
userMessage: 'Usuario',
botMessage: 'Asistente',
totalSessions: '{{count}} sesiones',
userSearch: 'ID o nombre de usuario',
startDate: 'Fecha de inicio',
endDate: 'Fecha de fin',
},
admins: {
title: 'Admins',
description:
"Launchers (person/group IDs) that have admin privilege for this bot's commands",
addAdmin: 'Add Admin',
launcherType: 'Type',
launcherId: 'ID',
typePerson: 'Person',
typeGroup: 'Group',
placeholderId: 'User or group ID',
addSuccess: 'Admin added',
addError: 'Failed to add admin: ',
deleteSuccess: 'Admin removed',
deleteError: 'Failed to remove admin: ',
noAdmins: 'No admins configured',
setAdminTitle: 'Set as admin',
adminBadge: 'Admin',
configureAdmins: 'Manage Admins',
removeAdminTitle: 'Remove admin',
},
},
agents: {
monitoring: {
description:
'Consulta el evento, la salida del modelo y las herramientas de cada tarea.',
empty:
'Sin ejecuciones. Activa un evento o ejecuta una prueba de depuración.',
input: 'Entrada inicial',
eventData: 'Datos del evento',
execution: 'Pasos de ejecución',
rawEvents: 'Eventos sin procesar',
inputUnavailable: 'No se registró la entrada de esta ejecución.',
},
eventProcessor: {
configurations: 'Configuraciones de procesadores de plugins',
configTab: 'Configuración',
logsTab: 'Registros',
noSettings: 'Este procesador de plugin no requiere configuración.',
createPageTitle: 'Crear procesador de eventos',
processWithPlugin: 'Procesar con código del plugin',
pluginSettings: 'Ajustes del plugin',
pluginSettingsDescription: 'Parámetros definidos por este plugin.',
selectToDebug: 'Selecciona un plugin arriba para iniciar la depuración.',
debugOutput: 'Salida del procesador',
debugDescription:
'Eventos de entrada, registros del plugin y resultados de acciones de esta prueba.',
debugNotice:
'El plugin procesa un evento de prueba. Las acciones de plataforma usan Mock y no envían mensajes reales; las demás herramientas se ejecutan según su configuración.',
create: 'Crear procesador de plugin',
type: 'Procesador de plugin',
description:
'Procesa eventos con código y lógica definidos por un plugin.',
component: 'Procesador de plugin',
selectComponent: 'Seleccionar un procesador de plugin',
unavailable: 'Componente no disponible',
noComponents: 'No hay plugins instalados que proporcionen procesadores.',
installPlugin: 'Instalar un plugin',
loadError: 'No se pudieron cargar los detalles.',
refresh: 'Actualizar',
runs: 'Ejecuciones',
noRuns: 'Sin ejecuciones. Vincula este procesador a un bot para empezar.',
bindBot: 'Vincular a un bot',
trace: 'Registros y flujo de mensajes',
selectRun: 'Selecciona una ejecución para ver los detalles.',
input: 'Evento recibido',
destination: 'Destino de entrega',
loadMore: 'Cargar más',
activation:
'Instala un plugin, crea una configuración de procesador y vincula un bot.',
status_timeout: 'Tiempo agotado',
status_pending: 'Pendiente',
status_running: 'En ejecución',
status_completed: 'Completado',
status_failed: 'Error',
status_cancelled: 'Cancelado',
status_queued: 'En cola',
trace_run_completed: 'Ejecución completada',
trace_run_failed: 'Ejecución fallida',
trace_tool_call_started: 'Acción iniciada',
trace_tool_call_completed: 'Resultado de la acción',
},
debugData: {
chatId: 'ID del chat',
feedbackType:
'Tipo de valoración (1: positiva, 2: negativa, 3: cancelar)',
title: 'Datos del evento',
form: 'Campos comunes',
json: 'JSON completo',
groupId: 'ID del grupo',
memberId: 'ID del miembro',
memberName: 'Nombre del miembro',
userId: 'ID del usuario',
userName: 'Nombre del usuario',
requesterId: 'ID del solicitante',
requesterName: 'Nombre del solicitante',
messageId: 'ID del mensaje',
duration: 'Duración (segundos)',
message: 'Contenido del mensaje',
newMessage: 'Contenido editado',
verificationMessage: 'Mensaje de verificación',
reaction: 'Reacción',
groupName: 'Nombre del grupo',
feedback: 'Comentarios',
rating: 'Puntuación',
eventName: 'Nombre del evento',
privateChat: 'Vacío para chat privado',
sampleUser: 'Usuario de prueba',
sampleMessage: 'Hola',
sampleFeedback: 'Muy útil',
invalidField: 'Revisa {{field}}',
},
title: 'Procesadores',
description:
'Crea procesadores reutilizables y úsalos en el enrutamiento de eventos del bot',
create: 'Crear procesador',
editAgent: 'Editar Agent',
selectFromSidebar: 'Selecciona un procesador en la barra lateral',
agentType: 'Agent',
agentTypeDescription:
'Usa un runner para procesar mensajes, miembros de grupo, amigos, retroalimentación y otros eventos de plataforma.',
pipelineType: 'Flujo de trabajo',
kindBadgeAgent: 'Agent',
kindBadgePipeline: 'Pipeline',
groupByKind: 'Agrupar por tipo',
groupByKindShort: 'Agrupar',
pipelineTypeDescription:
'Sigue un flujo fijo: recibir un mensaje, consultar a la IA y responder al usuario, con bases de conocimiento y plugins configurables. Solo procesa eventos de mensaje, para tareas con pasos claros y control del proceso.',
allEvents: 'Compatible con todos los eventos',
messageEventsOnly: 'Solo eventos de mensaje',
chooseType: 'Elegir cómo funciona',
chooseTypeDescription:
'Elige primero el tipo de procesador. Podrás configurarlo después de crearlo.',
diagramHint: 'Cómo funciona',
agentDiagramTitle: 'Agent: decidir y actuar',
agentDiagramDescription:
'Un Agent recibe diversos eventos, usa modelos y herramientas para comprender la situación y decide qué hacer.',
pipelineDiagramTitle: 'Flujo: seguir pasos definidos',
pipelineDiagramDescription:
'Un flujo solo procesa eventos de mensajes y ejecuta los pasos en el orden configurado.',
pipelineDiagramFlow: 'Los mensajes siguen una secuencia fija',
diagramEvents: 'Eventos de plataforma',
diagramAgentCanUse: 'Disponible para el Agent',
diagramMessages: 'Mensajes',
diagramMembers: 'Miembros',
diagramFeedback: 'Comentarios',
diagramDecide: 'Comprender y decidir',
diagramModel: 'Usar modelo',
diagramTools: 'Usar herramientas',
diagramActions: 'Actuar',
diagramMessage: 'Mensaje',
diagramPreprocess: 'Preparar',
diagramAI: 'IA',
diagramPostprocess: 'Refinar',
diagramOutput: 'Salida',
basicInfo: 'Información básica',
basicInfoDescription: 'Establece el nombre, icono y descripción',
runnerSettings: 'Runner',
advanced: 'Avanzado',
eventsAndTools: 'Eventos y herramientas',
eventsAndToolsDescription:
'Define los eventos de activación y las herramientas disponibles.',
bindableEvents: 'Rango de eventos vinculables',
bindableEventsDescription:
'Limita qué rutas de eventos del bot pueden seleccionar este Agent. El valor predeterminado sirve para la mayoría de los casos.',
configuredEvents: 'Eventos añadidos',
configuredEventsCount: '{{count}} en total',
addEvent: 'Añadir evento',
removeEvent: 'Eliminar evento',
eventActions: 'Herramientas activadas automáticamente',
eventToolEnabled: 'Activado',
eventToolsEnabledCount: '{{count}} herramientas activadas',
noEventActions: 'No hay acciones disponibles para este evento.',
noEventsConfigured: 'No hay eventos añadidos',
noEventsConfiguredDescription: 'Ningún evento puede activar este Agent.',
noEventsConfiguredBadge: 'Sin eventos',
apiTools: 'Acceso a herramientas',
apiToolsDescription: 'Elige qué herramientas puede llamar este Agent.',
otherTools: 'Otras herramientas',
otherToolsDescription:
'Elige herramientas de plataforma, sandbox, MCP, plugins y habilidades.',
apiToolsSelected: '{{count}} seleccionadas',
apiToolsSecurityHint:
'Activa solo las herramientas que necesita este Agent.',
apiToolsSearch: 'Buscar herramientas…',
eventApiTools: 'Herramientas de eventos',
eventToolUnavailable: 'No disponible',
eventApiToolsDescription:
'Los destinos se fijan a partir del evento actual. El Agent solo proporciona los parámetros de acción.',
platformApiTools: 'Herramientas de plataforma',
platformApiToolsDescription:
'El Agent puede elegir los ID de usuario, grupo o mensaje. Concede solo lo necesario.',
apiToolEvents: 'Eventos',
apiToolParameters: 'Parámetros del Agent',
apiToolSource: 'Origen',
apiToolNoParameters: 'ninguno',
sandboxTools: 'Sandbox',
mcpTools: 'MCP',
pluginTools: 'Plugins',
skillTools: 'Habilidades',
langbotBuiltIn: 'LangBot',
apiToolDetails: 'Detalles',
apiToolHideDetails: 'Ocultar',
apiToolsNoResults: 'Ninguna API o herramienta coincide',
apiToolsCatalogUnavailable:
'El backend de LangBot no devolvió el catálogo de herramientas API. Comprueba que esté actualizado y reiniciado; esto no significa que la plataforma no tenga herramientas.',
hostToolsCatalogUnavailable:
'El catálogo de herramientas no está disponible temporalmente.',
apiToolRisk: {
read: 'Solo lectura',
write: 'Acción',
dangerous: 'Sensible',
},
supportedEvents: 'Rango de eventos',
supportedEventsDescription:
'Elige todos los eventos, un grupo o eventos concretos. Las rutas del bot solo mostrarán este Agent para los eventos compatibles.',
searchEvents: 'Buscar eventos…',
noEventsFound: 'No se encontraron eventos',
nameRequired: 'El nombre no puede estar vacío',
createSuccess: 'Creado correctamente',
createError: 'Error al crear: ',
loadError: 'Error al cargar: ',
saveSuccess: 'Guardado correctamente',
saveError: 'Error al guardar: ',
deleteSuccess: 'Eliminado correctamente',
deleteError: 'Error al eliminar: ',
deleteConfirmation: '¿Estás seguro de que deseas eliminar este Agent?',
dangerZone: 'Zona de peligro',
dangerZoneDescription: 'Acciones irreversibles y destructivas',
deleteAgentAction: 'Eliminar este Agent',
deleteAgentHint:
'Una vez eliminado, los eventos vinculados a él ya no podrán ejecutarse.',
noRunnerMetadata: 'No hay metadatos de Runner disponibles actualmente.',
runnerStatusLoading: 'Comprobando estado del ejecutor',
runnerStatusCheckFailed: 'No se pudo comprobar el estado del ejecutor',
runnerStatusCheckFailedDescription:
'Vuelve a comprobarlo. Si sigue fallando, revisa el backend y el entorno de ejecución de plugins.',
noRunnersAvailable: 'No hay ejecutores disponibles',
noRunnersAvailableDescription:
'Instala y activa una extensión de ejecutor antes de configurar este Agent.',
installedRunners: 'Ejecutores instalados',
marketplaceRunners: 'Plugins de ejecutores en el mercado',
viewMarketplace: 'Ver mercado',
restoringRunnerInstall:
'Restaurando la instalación del plugin y esperando al ejecutor…',
noInstalledRunners: 'Aún no hay extensiones de ejecutor instaladas.',
installingRunner: 'Instalando {{runner}}...',
runnerInstallSuccess:
'{{runner}} está instalado y listo para seleccionarse',
selectedRunnerUnavailable: 'El ejecutor seleccionado no está disponible',
selectedRunnerUnavailableDescription:
'{{runner}} no está registrado actualmente. Elige otro ejecutor o restaura su extensión.',
noRunnerSelected: 'Ningún ejecutor seleccionado',
runnerConfigIncomplete: 'Configuración del ejecutor incompleta',
runnerConfigIncompleteDescription:
'Completa los campos obligatorios: {{fields}}',
runnerReady: 'Ejecutor listo',
runnerReadyDescription:
'{{runner}} está registrado y el entorno de ejecución de plugins está conectado.',
debugTab: 'Depuración de eventos',
debugTitle: 'Depuración de eventos del Agent',
debugDescription:
'Ejecuta el Agent actual con un mensaje o evento de plataforma y revisa el resultado real.',
debugResetSession: 'Restablecer sesión',
debugEventType: 'Tipo de evento',
debugNoEventsTitle: 'No hay eventos para depurar',
debugNoEventsDescription:
'Añade primero un evento en Eventos y herramientas.',
debugMessageReceived: 'Mensaje recibido',
debugGroupMemberJoined: 'Miembro añadido al grupo',
debugGroupMemberLeft: 'Miembro salió del grupo',
debugFriendRequested: 'Solicitud de amistad recibida',
debugFeedbackReceived: 'Comentarios recibidos',
debugCustomEvent: 'Evento personalizado',
debugCustomEventType: 'Nombre del evento personalizado',
debugMessageInput: 'Entrada de conversación',
debugEventSummary: 'Resumen del evento',
debugInputPlaceholder: 'Introduce lo que debe procesar el Agent',
debugEventPayload: 'Datos del evento (JSON)',
debugSupportedEvents: 'El Agent admite',
debugRun: 'Ejecutar prueba',
debugSaveAndRun: 'Guardar y ejecutar',
debugRunning: 'En ejecución',
debugTranscript: 'Registro de depuración',
debugTranscriptDescription:
'Entradas y respuestas del Agent de esta sesión de depuración.',
debugEmptyTitle: 'Comprobar el comportamiento del Agent',
debugEmptyTranscript:
'Elige un evento, introduce datos de prueba y pulsa «Ejecutar prueba». Los resultados permanecen en esta página.',
debugAgentOutput: 'Salida del Agent',
debugReasoning: 'Pensando',
debugTextOutput: 'Salida de texto',
debugPlatformNotice:
'Las herramientas de plataforma usan Mock: el Agent realiza llamadas reales, pero las acciones se simulan sin enviar mensajes reales. Las demás herramientas se ejecutan según su configuración.',
debugToolSimulated: 'Simulación correcta · Mock',
debugStop: 'Detener depuración',
debugMockOptions: 'Escenario Mock (JSON)',
debugInvalidMock: 'El escenario Mock debe ser un objeto JSON válido.',
debugToolMockFailed: 'Fallo simulado · Mock',
debugMockOptionsHelp:
'De forma predeterminada, las llamadas tienen éxito. Asigna errores por nombre de herramienta en errors, datos de consulta en results y API no admitidas en unsupported_apis. Ejemplo: {"errors":{"event_reply":"Fallo de envío simulado"}}',
debugCancelled:
'Depuración detenida. Se conservan los registros anteriores.',
debugNoToolCalls:
'No se registraron llamadas a herramientas. Generar texto no implica haber enviado un mensaje.',
debugToolCount:
'{{count}} llamadas a herramientas registradas. Consulta su estado y resultados debajo.',
debugToolRunning: 'En ejecución',
debugToolCompleted: 'Completado',
debugToolFailed: 'Fallido',
debugToolInterrupted: 'Sin resultado devuelto',
debugToolArguments: 'Argumentos',
debugToolResult: 'Resultado',
debugTestInput: 'Entrada de prueba',
debugNoTextOutput: 'La ejecución terminó sin salida de texto.',
debugEventTypeRequired: 'Introduce un tipo de evento',
debugInputRequired: 'Introduce una entrada de conversación',
debugInvalidPayload: 'Los datos del evento deben ser un objeto JSON válido',
debugUnsupportedEvent: 'Este evento no está entre los que admite el Agent',
debugRunnerConfigInvalidDescription:
'La configuración del ejecutor está incompleta: {{message}}',
debugRunnerExecutionFailedDescription:
'La ejecución falló. Revisa el modelo y la configuración del ejecutor e inténtalo de nuevo.',
debugRunnerTimeoutDescription:
'Se agotó el tiempo de ejecución. Inténtalo más tarde o ajusta el tiempo límite del ejecutor.',
debugApiKeyRequired: 'Falta la clave API',
debugOpenRunnerConfig: 'Abrir configuración del ejecutor',
debugReviewRunnerConfig: 'Revisar configuración del ejecutor',
debugErrorDetails: 'Ver detalles del error',
debugRunFailed: 'Falló la depuración del Agent',
},
plugins: {
title: 'Extensiones',
description:
'Instala y configura plugins para ampliar la funcionalidad, selecciónalos en la configuración del Pipeline',
createPlugin: 'Crear plugin',
editPlugin: 'Editar plugin',
installed: 'Instalados',
marketplace: 'Tienda',
arrange: 'Ordenar plugins',
install: 'Instalar',
installPlugin: 'Instalar plugin',
newPlugin: 'Nuevo Plugin',
onlySupportGithub: 'Actualmente solo se admite la instalación desde GitHub',
enterGithubLink: 'Introduce el enlace de GitHub del plugin',
installing: 'Instalando plugin...',
installSuccess: 'Plugin instalado correctamente',
installFailed: 'Error en la instalación del plugin:',
searchPlugin: 'Buscar plugins',
sortBy: 'Ordenar por',
mostStars: 'Más estrellas',
recentlyAdded: 'Añadidos recientemente',
recentlyUpdated: 'Actualizados recientemente',
noMatchingPlugins: 'No se encontraron plugins coincidentes',
loading: 'Cargando...',
getPluginListError: 'Error al obtener la lista de plugins:',
noPluginInstalled: 'No hay plugins instalados',
noExtensionInstalled: 'No hay extensiones instaladas',
searchInstalled: 'Buscar extensiones instaladas',
noMatchingExtensions: 'Ninguna extensión coincide con "{{query}}"',
loadingExtensions: 'Cargando extensiones...',
groupByType: 'Agrupar por formato',
groupByTypeShort: 'Agrupar',
pluginConfig: 'Configuración del plugin',
pluginSort: 'Orden de plugins',
pluginSortDescription:
'El orden de los plugins afecta el orden de procesamiento dentro del mismo evento, arrastra la tarjeta del plugin para ordenar',
pluginSortSuccess: 'Orden de plugins aplicado correctamente',
pluginSortError: 'Error al ordenar plugins: ',
pluginNoConfig: 'El plugin no tiene elementos de configuración.',
systemDisabled: 'Sistema de plugins desactivado',
systemDisabledDesc:
'El sistema de plugins no está activado, por favor modifica la configuración según la documentación',
connectionError: 'Error de conexión del sistema de plugins',
connectionErrorDesc:
'Verifica la configuración del sistema de plugins o contacta al administrador.',
errorDetails: 'Detalles del error',
loadingStatus: 'Comprobando el estado del sistema de plugins...',
failedToGetStatus: 'Error al obtener el estado del sistema de plugins',
pluginSystemNotReady:
'El sistema de plugins no está listo, no se puede realizar esta operación',
debugInfo: 'Información de depuración',
debugInfoTitle: 'Información de depuración del plugin',
debugUrl: 'URL de depuración',
debugKey: 'Clave de depuración',
debugKeyExpires:
'Rota a las {{time}}; cada Workspace tiene una clave distinta',
noDebugKey: '(No establecida)',
debugKeyDisabled:
'La credencial de depuración no está disponible temporalmente',
boxStatusTitle: 'Box Runtime',
boxStatus: 'Estado',
boxConnected: 'Conectado',
boxUnavailable: 'No disponible',
boxBackend: 'Backend',
boxProfile: 'Perfil',
boxSandboxes: 'Sandboxes',
boxErrors: 'Errores',
boxSessionImage: 'Imagen',
boxSessionBackend: 'Backend',
boxSessionResources: 'Recursos',
boxSessionNetwork: 'Red',
boxStatusLoadFailed: 'Error al cargar el estado de Box',
failedToGetDebugInfo: 'Error al obtener la información de depuración',
copiedToClipboard: 'Copiado al portapapeles',
deleting: 'Eliminando...',
deletePlugin: 'Eliminar plugin',
cancel: 'Cancelar',
saveConfig: 'Guardar configuración',
saving: 'Guardando...',
confirmDeletePlugin:
'¿Estás seguro de que deseas eliminar el plugin ({{author}}/{{name}})?',
deleteDataCheckbox:
'También eliminar la configuración y el almacenamiento persistente del plugin',
confirmDelete: 'Confirmar eliminación',
deleteError: 'Error al eliminar: ',
close: 'Cerrar',
deleteConfirm: 'Confirmación de eliminación',
deleteSuccess: 'Eliminación exitosa',
dangerZone: 'Zona de peligro',
dangerZoneDescription: 'Acciones irreversibles y destructivas',
modifyFailed: 'Error al modificar: ',
componentName: {
Tool: 'Herramienta',
EventListener: 'Listener de eventos',
Command: 'Comando',
KnowledgeEngine: 'Motor de conocimiento',
Parser: 'Analizador',
Page: 'Página',
Runner: 'Ejecutor',
},
uploadLocal: 'Subir local',
debugging: 'Depuración',
uploadLocalPlugin: 'Subir plugin local',
localPreview: {
title: 'Previsualizar paquete de plugin local',
unpacking: 'Descomprimiendo vista previa del paquete...',
unpackComplete: 'Vista previa del paquete lista',
failed: 'No se pudo previsualizar el paquete',
pluginInfo: 'Información del plugin',
packageInfo: 'Información del paquete',
name: 'Nombre',
author: 'Autor',
version: 'Versión',
fileCount: 'Archivos',
dependencies: 'Dependencias',
components: 'Componentes',
ready:
'El paquete del plugin está descomprimido. Confirma para iniciar la instalación.',
},
uploadPluginOnly: 'Solo se admiten paquetes de plugin .lbpkg',
dragToUpload: 'Arrastra el archivo del plugin aquí para subirlo',
unsupportedFileType:
'Tipo de archivo no soportado, solo se admiten archivos .lbpkg y .zip',
uploadingPlugin: 'Subiendo plugin...',
uploadSuccess: 'Subida exitosa',
uploadFailed: 'Error en la subida',
selectFileToUpload: 'Selecciona el archivo del plugin para subir',
askConfirm: '¿Estás seguro de instalar el plugin "{{name}}" ({{version}})?',
askConfirmNoVersion: '¿Estás seguro de instalar el plugin "{{name}}"?',
fromGithub: 'Desde GitHub',
fromLocal: 'Desde local',
fromMarketplace: 'Desde la tienda',
componentsList: 'Componentes: ',
noComponents: 'Sin componentes',
delete: 'Eliminar plugin',
update: 'Actualizar plugin',
new: 'Nuevo',
updateConfirm: 'Confirmación de actualización',
confirmUpdatePlugin:
'¿Estás seguro de que deseas actualizar el plugin ({{author}}/{{name}})?',
confirmUpdate: 'Confirmar actualización',
updating: 'Actualizando...',
updateSuccess: 'Plugin actualizado correctamente',
updateError: 'Error al actualizar: ',
saveConfigSuccessNormal: 'Configuración guardada correctamente',
saveConfigError: 'Error al guardar la configuración: ',
config: 'Configuración',
readme: 'Documentación',
viewSource: 'Ver código fuente',
loadingReadme: 'Cargando documentación...',
noReadme: 'Este plugin no proporciona documentación README',
tabDocs: 'Documentación',
tabLogs: 'Registros',
logsLevelAll: 'Todos los niveles',
logsRefresh: 'Actualizar',
logsAutoRefresh: 'Auto-actualizar',
logsEmpty:
'Aún no hay registros. Los registros que el plugin imprima mediante logger aparecerán aquí.',
fileUpload: {
tooLarge: 'El tamaño del archivo supera el límite de 10MB',
success: 'Archivo subido correctamente',
failed: 'Error al subir el archivo',
uploading: 'Subiendo...',
chooseFile: 'Elegir archivo',
addFile: 'Añadir archivo',
},
installFromGithub: 'Desde GitHub',
enterRepoUrl: 'Introduce la URL del repositorio de GitHub',
repoUrlPlaceholder: 'p. ej., https://github.com/owner/repo',
fetchingReleases: 'Obteniendo versiones...',
selectRelease: 'Seleccionar versión',
noReleasesFound: 'No se encontraron versiones',
fetchReleasesError: 'Error al obtener versiones: ',
selectAsset: 'Seleccionar archivo a instalar',
noAssetsFound: 'No hay archivos .lbpkg disponibles en esta versión',
fetchAssetsError: 'Error al obtener archivos: ',
backToReleases: 'Volver a versiones',
backToRepoUrl: 'Volver a la URL del repositorio',
backToAssets: 'Volver a archivos',
releaseTag: 'Etiqueta: {{tag}}',
releaseName: 'Nombre: {{name}}',
publishedAt: 'Publicado el: {{date}}',
prerelease: 'Pre-lanzamiento',
assetSize: 'Tamaño: {{size}}',
confirmInstall: 'Confirmar instalación',
installFromGithubDesc: 'Instalar plugin desde GitHub Release',
goToMarketplace: 'Ir a la tienda',
installProgress: {
title: 'Instalando {{name}}',
updateTitle: 'Actualizando {{name}}',
titleGeneric: 'Instalación de Plugin',
titlePlugin: 'Instalando plugin {{name}}',
titleMCP: 'Instalando servidor MCP {{name}}',
titleSkill: 'Instalando skill {{name}}',
overallProgress: 'Progreso general',
checkingUpdate: 'Buscando actualizaciones',
downloading: 'Descargando Plugin',
validating: 'Validando paquete',
installingDeps: 'Instalando dependencias',
applyingUpdate: 'Aplicando actualización',
activating: 'Iniciando y actualizando componentes',
initializing: 'Inicializando configuración',
launching: 'Iniciando Plugin',
completed: 'Completado',
failed: 'Fallido',
downloadSize: 'Tamaño del paquete: {{size}}',
depsInfo: '{{count}} dependencias por instalar',
depsProgress:
'{{installed}}/{{total}} instaladas · {{remaining}} restantes',
installComplete: 'Plugin instalado correctamente',
updateComplete: 'Plugin actualizado correctamente',
installCompletePlugin: 'Plugin instalado correctamente',
installCompleteMCP: 'Servidor MCP instalado correctamente',
installCompleteSkill: 'Skill instalada correctamente',
dismiss: 'Descartar',
background: 'Ejecutar en segundo plano',
taskQueue: 'Tareas de instalación',
clearCompleted: 'Limpiar completados',
noTasks: 'No hay tareas de instalación',
},
},
market: {
runnerUsage: 'Uso del ejecutor',
runnerUsageAll: 'Todos',
runnerUsageAgent: 'Agent / Flujo',
runnerUsageEvent: 'Procesador de plugin',
searchPlaceholder: 'Buscar plugins...',
searchPlaceholderCount:
'Buscar {{count}} extensiones, capacidades o casos de uso...',
searchResults: 'Se encontraron {{count}} extensiones',
totalPlugins: 'Total {{count}} extensiones',
noPlugins: 'No hay plugins disponibles',
noResults: 'No se encontraron plugins relevantes',
loadingMore: 'Cargando más...',
loading: 'Cargando...',
allLoaded: 'Todos los plugins mostrados',
allLoadedCount: 'Se muestran las {{count}} extensiones',
install: 'Instalar',
installCard: 'Instalar {{name}}',
installedCard: '{{name}} instalado',
installed: 'Instalado',
updateAvailable: 'Actualización disponible',
installConfirm:
'¿Estás seguro de que deseas instalar el plugin "{{name}}" ({{version}})?',
downloadComplete: 'Descarga del plugin "{{name}}" completada',
installFailed: 'Error en la instalación, por favor inténtalo más tarde',
loadFailed:
'Error al obtener la lista de plugins, por favor inténtalo más tarde',
noDescription: 'No hay descripción disponible',
recommendation: {
pause: 'Pausar rotación automática',
resume: 'Reanudar rotación automática',
},
notFound: 'No se encontró la información del plugin',
sortBy: 'Ordenar por',
sort: {
hottest: 'Más populares',
recentlyAdded: 'Añadidos recientemente',
recentlyUpdated: 'Actualizados recientemente',
mostDownloads: 'Más descargas',
leastDownloads: 'Menos descargas',
},
downloads: 'descargas',
download: 'Descargar',
like: 'Me gusta',
unlike: 'Ya no me gusta',
likeFailed: 'No se pudo actualizar el Me gusta. Inténtalo de nuevo.',
repository: 'Repositorio',
downloadFailed: 'Error en la descarga',
noReadme: 'Este plugin no proporciona documentación README',
description: 'Descripción',
tagLabel: 'Etiquetas',
submissionTitle: 'Tienes un envío de plugin en revisión: {{name}}',
submissionPending: 'Tu envío de plugin está en revisión: {{name}}',
submissionApproved: 'Tu envío de plugin ha sido aprobado: {{name}}',
submissionRejected: 'Tu envío de plugin ha sido rechazado: {{name}}',
clickToRevoke: 'Revocar',
revokeSuccess: 'Revocación exitosa',
revokeFailed: 'Error en la revocación',
submissionDetails: 'Detalles del envío del plugin',
markAsRead: 'Marcar como leído',
markAsReadSuccess: 'Marcado como leído',
markAsReadFailed: 'Error al marcar como leído',
filterByComponent: 'Componente del plugin',
filterByComponentHint:
'Los tipos de capacidad que ofrece un plugin: herramienta (Tool), comando (Command), escucha de eventos (EventListener), etc., usados para ampliar las capacidades de LangBot. Filtra por componente para ver solo los plugins que ofrecen esa capacidad.',
allComponents: 'Todos los componentes',
componentName: {
Tool: 'Herramienta',
EventListener: 'Listener de eventos',
Command: 'Comando',
KnowledgeEngine: 'Motor de conocimiento',
Parser: 'Analizador',
Page: 'Página',
Runner: 'Ejecutor',
},
filterByType: 'Tipo',
allTypes: 'Todos los tipos',
typePlugin: 'Plugin',
typeMCP: 'MCP',
typeSkill: 'Habilidad',
requestPlugin: 'Solicitar plugin',
viewDetails: 'Ver detalles',
deprecated: 'Obsoleto',
deprecatedTooltip:
'Por favor, instala el plugin de motor de conocimiento correspondiente.',
filters: {
allFormats: 'Todos los tipos',
more: 'Más',
advancedTitle: 'Filtros avanzados',
advancedDescription: 'Filtrar por tipo de extensión',
technicalType: 'Tipo técnico',
},
allExtensions: 'Todas las extensiones',
tags: {
filterByTags: 'Filtrar por etiquetas',
selected: 'seleccionadas',
selectTags: 'Seleccionar etiquetas',
clearAll: 'Borrar todo',
noTags: 'No hay etiquetas disponibles',
},
},
mcp: {
title: 'MCP',
createServer: 'Añadir servidor MCP',
addMCPServer: 'Añadir servidor MCP',
editServer: 'Editar servidor MCP',
deleteServer: 'Eliminar servidor MCP',
confirmDeleteServer:
'¿Estás seguro de que deseas eliminar este servidor MCP?',
confirmDeleteTitle: 'Eliminar servidor MCP',
getServerListError: 'Error al obtener la lista de servidores MCP: ',
serverName: 'Nombre del servidor',
serverMode: 'Modo de conexión',
selectMode: 'Seleccionar modo',
stdio: 'Modo Stdio',
sse: 'Modo SSE',
http: 'Modo HTTP',
local: 'Local (Stdio)',
remote: 'Remoto',
localModeDescription:
'Ejecuta un servidor MCP localmente como subproceso dentro del sandbox de Box.',
remoteModeDescription:
'Conéctate a un servidor MCP remoto por URL. El transporte (Streamable HTTP o SSE) se detecta automáticamente.',
remoteUrlPlaceholder: 'https://example.com/mcp',
remoteUrlDescription:
'Pega la URL del servidor MCP. Se admiten tanto endpoints Streamable HTTP como SSE heredados.',
noServerInstalled: 'No hay servidores MCP configurados',
serverNameRequired: 'El nombre del servidor no puede estar vacío',
commandRequired: 'El comando no puede estar vacío',
urlRequired: 'La URL no puede estar vacía',
timeoutMustBePositive: 'El tiempo de espera debe ser un número positivo',
command: 'Comando',
args: 'Argumentos',
env: 'Variables de entorno',
url: 'URL',
headers: 'Encabezados',
timeout: 'Tiempo de espera',
toolCallTimeout: 'Tiempo de espera de herramienta (segundos)',
toolCallTimeoutDescription:
'Espera máxima para una llamada de herramienta. Use 0 para no limitar. El valor predeterminado es 300 segundos.',
addArgument: 'Añadir argumento',
addEnvVar: 'Añadir variable de entorno',
addHeader: 'Añadir encabezado',
keyName: 'Nombre de la clave',
value: 'Valor',
testing: 'Probando...',
connecting: 'Conectando...',
testSuccess: 'Prueba exitosa',
testFailed: 'Error en la prueba: ',
testError: 'Error de prueba',
refreshSuccess: 'Actualización exitosa',
refreshFailed: 'Error en la actualización: ',
connectionSuccess: 'Conexión exitosa',
connectionFailed: 'Error de conexión, por favor verifica la URL',
connectionFailedStatus: 'Conexión fallida',
connectionUnreachable:
'No se puede acceder al servidor MCP. Compruebe que esté iniciado y accesible.',
connectionTimeout:
'El servidor MCP no respondió a tiempo. Compruebe el servicio o aumente el tiempo de espera.',
connectionHttpError:
'El servidor MCP devolvió HTTP {{status}}. Compruebe los requisitos de acceso y los registros del servidor.',
oauthAuthorizationRequired: 'Se requiere autorización OAuth',
oauthAuthorizationRequiredSuggestion:
'Este servidor MCP requiere inicio de sesión con OAuth. Aún no está disponible; agregue manualmente un encabezado Authorization si el servidor lo permite.',
boxDisabledStdioRefused:
'Los servidores MCP en modo stdio requieren el sandbox de Box, desactivado en la configuración (box.enabled = false).',
boxUnavailableStdioRefused:
'Los servidores MCP en modo stdio requieren el sandbox de Box, actualmente no accesible.',
boxStdioRefusedSuggestion:
'Active Box (box.enabled = true) y asegúrese de que el runtime está conectado, o cambie este servidor a modo http/sse.',
boxRequired: 'requiere Box',
disabledByPolicy: 'desactivado por la política',
stdioDisabledByPolicy:
'Stdio MCP está deshabilitado en este despliegue. Use un servidor MCP remoto.',
stdioBlockedByBoxToast:
'No se puede guardar el MCP en modo stdio mientras el sandbox de Box está desactivado o no disponible. Active Box o seleccione modo http/sse.',
toolsFound: 'herramientas',
unknownError: 'Error desconocido',
noToolsFound: 'No se encontraron herramientas',
noResourcesFound: 'No se encontraron recursos',
tabTools: 'Herramientas',
tabResources: 'Recursos',
tabDocs: 'Documentación',
tabLogs: 'Registros',
logsLevelAll: 'Todos los niveles',
logsRefresh: 'Actualizar',
logsAutoRefresh: 'Actualización automática',
logsEmpty:
'Aún no hay registros. Los registros de ejecución del servidor MCP aparecerán aquí.',
noReadme: 'No hay documentación disponible',
parseResultFailed: 'Error al analizar el resultado de la prueba',
noResultReturned: 'La prueba no devolvió resultados',
getTaskFailed: 'Error al obtener el estado de la tarea',
noTaskId: 'No se obtuvo el ID de la tarea',
deleteSuccess: 'Eliminado correctamente',
deleteFailed: 'Error al eliminar: ',
deleteError: 'Error al eliminar: ',
saveSuccess: 'Guardado correctamente',
saveError: 'Error al guardar: ',
createSuccess: 'Creado correctamente',
createFailed: 'Error al crear: ',
createError: 'Error al crear: ',
loadFailed: 'Error al cargar',
modifyFailed: 'Error al modificar: ',
toolCount: 'Herramientas: {{count}}',
parameterCount: 'Parámetros: {{count}}',
noParameters: 'Sin parámetros',
resourceCount: 'Recursos: {{count}}',
resourceBinaryContent: 'Contenido binario (no se puede mostrar)',
resourceBinaryOmitted:
'Contenido binario omitido por la política de seguridad de recursos',
resourceTruncated: 'Contenido truncado por límites de bytes o tokens',
resourceReadFailed: 'Error al leer el contenido del recurso',
statusConnected: 'Conectado',
statusDisconnected: 'Desconectado',
statusError: 'Error de conexión',
statusDisabled: 'Desactivado',
loading: 'Cargando...',
starCount: 'Estrellas: {{count}}',
install: 'Instalar',
installFromGithub: 'Instalar servidor MCP desde GitHub',
add: 'Añadir',
name: 'Nombre',
nameRequired: 'El nombre no puede estar vacío',
sseTimeout: 'Tiempo de espera SSE',
sseTimeoutDescription: 'Tiempo de espera para establecer la conexión SSE',
extraParametersDescription:
'Parámetros adicionales para configurar el comportamiento específico del servidor MCP',
timeoutMustBeNumber: 'El tiempo de espera debe ser un número',
timeoutNonNegative: 'El tiempo de espera no puede ser negativo',
sseTimeoutMustBeNumber: 'El tiempo de espera SSE debe ser un número',
sseTimeoutNonNegative: 'El tiempo de espera SSE no puede ser negativo',
updateSuccess: 'Actualizado correctamente',
updateFailed: 'Error al actualizar: ',
selectFromSidebar: 'Selecciona un servidor MCP de la barra lateral',
dangerZone: 'Zona de peligro',
dangerZoneDescription:
'Acciones irreversibles y destructivas para este servidor MCP.',
deleteMCPAction: 'Eliminar este servidor MCP',
deleteMCPHint:
'Una vez eliminada, la configuración de este servidor MCP no se podrá recuperar.',
},
pipelines: {
title: 'Flujos',
description:
'Los Pipelines definen el flujo de procesamiento de eventos de mensajes, se usan para vincular a los Bots',
createPipeline: 'Crear Pipeline',
selectFromSidebar: 'Selecciona un Pipeline de la barra lateral',
editPipeline: 'Editar Pipeline',
chat: 'Chat',
configuration: 'Configuración',
debugChat: 'Chat de depuración',
getPipelineListError: 'Error al obtener la lista de Pipelines: ',
daysAgo: 'días atrás',
today: 'Hoy',
updateTime: 'Actualizado ',
defaultBadge: 'Predeterminado',
sortBy: 'Ordenar por',
newestCreated: 'Más recientes',
earliestCreated: 'Más antiguos',
recentlyEdited: 'Editados recientemente',
earliestEdited: 'Editados más antiguos',
basicInfo: 'Información básica',
basicInfoDescription:
'Establece el nombre, icono y descripción del Pipeline',
managementDescription: 'Copia o elimina este flujo.',
aiCapabilities: 'IA',
triggerConditions: 'Disparador',
safetyControls: 'Seguridad',
outputProcessing: 'Salida',
nameRequired: 'El nombre no puede estar vacío',
descriptionRequired: 'La descripción no puede estar vacía',
createSuccess:
'Creado correctamente. Por favor, edita los parámetros del Pipeline',
createError: 'Error al crear: ',
saveSuccess: 'Guardado correctamente',
saveError: 'Error al guardar: ',
copySuffix: ' Copia',
deleteConfirmation:
'¿Estás seguro de que deseas eliminar este Pipeline? Los Bots vinculados a este Pipeline dejarán de funcionar.',
defaultPipelineCannotDelete:
'El Pipeline predeterminado no se puede eliminar',
deleteSuccess: 'Eliminado correctamente',
deleteError: 'Error al eliminar: ',
copyConfirmTitle: 'Confirmar copia',
copyConfirmation:
'¿Estás seguro de que deseas copiar este Pipeline? Esto creará un nuevo Pipeline con todas las configuraciones.',
unsavedChanges: 'Tienes cambios sin guardar',
dangerZone: 'Zona de peligro',
dangerZoneDescription: 'Acciones irreversibles y destructivas',
deletePipelineAction: 'Eliminar este Pipeline',
deletePipelineHint:
'Una vez eliminado, los Bots vinculados a este Pipeline dejarán de funcionar.',
copyPipelineAction: 'Copiar este Pipeline',
copyPipelineHint:
'Crear un nuevo Pipeline con todas las configuraciones duplicadas.',
extensions: {
title: 'Extensiones',
loadError: 'Error al cargar plugins',
saveSuccess: 'Guardado correctamente',
saveError: 'Error al guardar',
noPluginsAvailable: 'No hay plugins disponibles',
disabled: 'Desactivado',
noPluginsSelected: 'No hay plugins seleccionados',
addPlugin: 'Añadir plugin',
selectPlugins: 'Seleccionar plugins',
pluginsTitle: 'Plugins',
mcpServersTitle: 'Servidores MCP',
mcpResourcesTitle: 'Recursos MCP',
noMCPServersSelected: 'No hay servidores MCP seleccionados',
noMCPResourcesAvailable: 'No hay recursos MCP disponibles',
addMCPServer: 'Añadir servidor MCP',
selectMCPServers: 'Seleccionar servidores MCP',
enableMCPResourceAgentRead: 'Permitir lectura del modelo',
toolCount: '{{count}} herramientas',
noPluginsInstalled: 'No hay plugins instalados',
noMCPServersConfigured: 'No hay servidores MCP configurados',
selectAll: 'Seleccionar todo',
enableAllPlugins: 'Activar todos los plugins',
enableAllMCPServers: 'Activar todos los servidores MCP',
enableAllSkills: 'Activar todas las skills',
allPluginsEnabled: 'Todos los plugins activados',
allMCPServersEnabled: 'Todos los servidores MCP activados',
allSkillsEnabled: 'Todas las skills están activadas',
skillsTitle: 'Skills',
noSkillsSelected: 'No hay skills seleccionadas',
addSkill: 'Añadir skill',
selectSkills: 'Seleccionar skills',
noSkillsAvailable: 'No hay skills disponibles',
mcpServersScopeTooltip:
'Aquí solo se controla qué servidores MCP se vinculan al Pipeline. Las herramientas y recursos MCP concretos se eligen en AI Feature > Runner.',
enableAllMCPServersTooltip:
'Al activarlo, todos los servidores MCP configurados y habilitados serán candidatos para herramientas y recursos MCP en AI Feature.',
},
runner: {
toolsTitle: 'Herramientas',
toolsDescription:
'Selecciona las herramientas de plugins, MCP e integradas disponibles para este Runner.',
toolsScopeTooltip:
'Las herramientas MCP solo provienen de servidores MCP vinculados en Extensiones. Vincula allí otro servidor para poder seleccionarlo aquí.',
enableAllTools: 'Activar todas las herramientas',
allToolsEnabled: 'Todas las herramientas disponibles están activadas',
noToolsSelected: 'No hay herramientas seleccionadas',
editTools: 'Editar herramientas',
builtinTools: 'Herramientas integradas',
pluginTools: 'Herramientas de plugin',
skillTools: 'Herramientas de skill',
mcpTools: 'Herramientas MCP',
mcpToolsScopeTooltip:
'Aquí solo se muestran herramientas de servidores MCP permitidos actualmente en Extensiones.',
skillToolsScopeTooltip:
'Las herramientas de skill aparecen cuando el servicio de skills de LangBot y el backend de sandbox Box están disponibles. Permiten al agente activar o registrar skills.',
selectTools: 'Seleccionar herramientas',
resourcesTitle: 'Recursos',
resourcesDescription:
'Selecciona los recursos MCP y bases de conocimiento disponibles para este Runner.',
knowledgeBases: 'Bases de conocimiento',
mcpResources: 'Recursos MCP',
mcpResourcesScopeTooltip:
'Aquí solo se muestran recursos expuestos por servidores MCP permitidos actualmente en Extensiones.',
enableMCPResourceRead: 'Permitir que el modelo lea recursos MCP',
mcpResourceReadTooltip:
'Si se desactiva, los recursos MCP seleccionados no se inyectarán en el contexto del modelo.',
noMCPResourcesAvailable: 'No hay recursos MCP disponibles',
selectKnowledgeBases: 'Seleccionar bases de conocimiento',
},
debugDialog: {
title: 'Chat del Pipeline',
selectPipeline: 'Seleccionar Pipeline',
sessionType: 'Tipo de sesión',
privateChat: 'Chat privado',
groupChat: 'Chat grupal',
send: 'Enviar',
saveAndSend: 'Guardar y enviar',
reset: 'Reiniciar conversación',
inputPlaceholder: 'Enviar mensaje {{type}}...',
noMessages: 'Sin mensajes',
userMessage: 'Usuario',
botMessage: 'Bot',
sendFailed: 'Error al enviar',
resetSuccess: 'Conversación reiniciada correctamente',
resetFailed: 'Error al reiniciar',
loadMessagesFailed: 'Error al cargar mensajes',
loadPipelinesFailed: 'Error al cargar Pipelines',
atTips: 'Mencionar al Bot',
streaming: 'Transmisión',
streamOutput: 'Transmisión',
connected: 'Conectado',
disconnected: 'Desconectado',
connectionError: 'Error de conexión WebSocket',
connectionFailed: 'Conexión WebSocket fallida',
notConnected: 'WebSocket no conectado, por favor inténtalo más tarde',
imageUploadFailed: 'Error al subir imagen',
reply: 'Responder',
replyTo: 'Responder a',
showMarkdown: 'Mostrar Markdown',
showRaw: 'Mostrar sin formato',
allMembers: 'Todos los miembros',
file: 'Archivo',
voice: 'Voz',
uploadImage: 'Subir imagen',
uploading: 'Subiendo...',
},
monitoring: {
title: 'Registros de ejecución',
workbench: 'Configurar y depurar',
description:
'Ver registros de ejecución y errores de este Pipeline (últimas 24 horas)',
detailedLogs: 'Registros detallados',
},
},
knowledge: {
title: 'Conocimiento',
createKnowledgeBase: 'Crear base de conocimiento',
selectFromSidebar:
'Selecciona una base de conocimiento de la barra lateral',
editKnowledgeBase: 'Editar base de conocimiento',
selectKnowledgeBase: 'Seleccionar base de conocimiento',
selectKnowledgeBases: 'Seleccionar bases de conocimiento',
addKnowledgeBase: 'Añadir base de conocimiento',
noKnowledgeBaseSelected: 'No hay bases de conocimiento seleccionadas',
empty: 'Vacío',
editDocument: 'Documentos',
description:
'Configurar bases de conocimiento para mejorar las respuestas del LLM',
metadata: 'Metadatos',
documents: 'Documentos',
kbNameRequired: 'El nombre de la base de conocimiento no puede estar vacío',
kbDescriptionRequired:
'La descripción de la base de conocimiento no puede estar vacía',
embeddingModelUUIDRequired: 'El modelo Embedding no puede estar vacío',
daysAgo: 'días atrás',
today: 'Hoy',
kbName: 'Nombre de la base de conocimiento',
kbDescription: 'Descripción de la base de conocimiento',
topK: 'Top K',
topKRequired: 'Top K no puede estar vacío',
topKMax: 'El valor máximo de Top K es 30',
topKdescription:
'Se usa para especificar el número de documentos relevantes a recuperar, con un rango de 1 a 30.',
defaultDescription: 'Una base de conocimiento',
embeddingModelUUID: 'Modelo Embedding',
selectEmbeddingModel: 'Seleccionar modelo Embedding',
embeddingModelDescription:
'Se usa para vectorizar el texto, puedes configurarlo en la página de Modelos',
updateTime: 'Actualizado ',
cannotChangeEmbeddingModel:
'El modelo Embedding no se puede modificar una vez creada la base de conocimiento',
updateKnowledgeBaseSuccess:
'Base de conocimiento actualizada correctamente',
updateKnowledgeBaseFailed: 'Error al actualizar la base de conocimiento: ',
documentsTab: {
name: 'Nombre',
status: 'Estado',
noResults: 'No hay documentos',
dragAndDrop: 'Arrastra y suelta archivos aquí o haz clic para subir',
uploading: 'Subiendo...',
supportedFormats:
'Admite PDF, Word, TXT, Markdown, HTML, ZIP y otros formatos de documentos',
uploadSuccess: '¡Archivo subido correctamente!',
uploadError: 'Error al subir el archivo: ',
uploadingFile: 'Subiendo archivo...',
fileSizeExceeded:
'El tamaño del archivo supera el límite de 10MB. Por favor, divídelo en archivos más pequeños.',
actions: 'Acciones',
delete: 'Eliminar archivo',
fileDeleteSuccess: 'Archivo eliminado correctamente',
fileDeleteFailed: 'Error al eliminar el archivo: ',
processing: 'Procesando',
completed: 'Completado',
failed: 'Fallido',
selectParser: 'Seleccionar analizador',
builtInParser: 'Proporcionado por el motor de conocimiento',
noParserAvailable:
'Ningún analizador admite este tipo de archivo. Por favor, instala un plugin de analizador que pueda manejar este formato.',
installParserHint: 'Buscar plugins de analizador en el Marketplace →',
confirmUpload: 'Subir',
cancelUpload: 'Cancelar',
},
deleteKnowledgeBaseConfirmation:
'¿Estás seguro de que deseas eliminar esta base de conocimiento? Todos los documentos de esta base se eliminarán.',
retrieve: 'Prueba de recuperación',
retrieveTest: 'Prueba de recuperación',
query: 'Consulta',
queryPlaceholder: 'Introduce el texto de consulta...',
distance: 'Distancia',
content: 'Contenido',
fileName: 'Nombre del archivo',
noResults: 'Sin resultados',
retrieveError: 'Error en la recuperación: ',
unknownEngine: 'Motor desconocido',
knowledgeEngine: 'Motor de conocimiento',
knowledgeEngineRequired: 'El motor de conocimiento es obligatorio',
selectKnowledgeEngine: 'Seleccionar motor de conocimiento',
installedEngines: 'Motores de conocimiento instalados',
noInstalledEngines:
'Aún no hay plugins de motores de conocimiento instalados.',
marketplaceEngines: 'Plugins de motores de conocimiento en el mercado',
noMarketplaceEngines:
'No hay plugins de motores de conocimiento disponibles.',
loadingEngineCatalog: 'Cargando plugins del mercado…',
engineCatalogUnavailable:
'El mercado no está disponible temporalmente. Vuelve a abrir el selector para reintentar.',
viewMarketplace: 'Ver mercado',
installingEngine: 'Instalando {{engine}}…',
engineInstallSuccess:
'{{engine}} está instalado y listo para seleccionarse',
engineInstallFailed: 'Falló la instalación del motor. Inténtalo de nuevo.',
engineVersionUnavailable: 'Este plugin no tiene una versión instalable.',
engineInstallTimeout:
'La instalación continúa. Actualiza la página para comprobar el estado.',
engineRegistrationTimeout:
'El plugin está instalado, pero su motor aún no está listo.',
builtInEngine: 'Motor integrado',
cannotChangeKnowledgeEngine:
'El motor de conocimiento no se puede cambiar después de la creación',
basicInfo: 'Información básica',
basicInfoDescription:
'Establece el nombre, icono y descripción de la base de conocimiento',
engineSettings: 'Configuración del motor',
engineSettingsDescription:
'Configuración del motor de conocimiento seleccionado',
engineSettingsReadonly: 'solo lectura en modo de edición',
engineSettingsInvalid:
'La configuración del motor no es válida, verifique los campos obligatorios',
retrievalSettingsInvalid:
'La configuración de recuperación no es válida, verifique los campos obligatorios',
retrievalSettings: 'Configuración de recuperación',
retrievalSettingsDescription:
'Configura cómo se recuperan los documentos de esta base de conocimiento',
dangerZone: 'Zona de peligro',
dangerZoneDescription: 'Acciones irreversibles y destructivas',
deleteKbAction: 'Eliminar esta base de conocimiento',
deleteKbHint:
'Una vez eliminada, todos los documentos y datos de esta base de conocimiento se eliminarán permanentemente.',
noEnginesAvailable: 'No hay motores de base de conocimiento disponibles',
installEngineHint:
'Por favor, instala primero un plugin de "Motor de conocimiento"',
createKnowledgeBaseFailed: 'Error al crear la base de conocimiento: ',
loadKnowledgeBaseFailed: 'Error al cargar la base de conocimiento: ',
deleteKnowledgeBaseFailed: 'Error al eliminar la base de conocimiento: ',
getKnowledgeBaseListError:
'Error al obtener la lista de bases de conocimiento: ',
embeddingModel: 'Modelo Embedding',
embeddingModelRequired:
'El modelo Embedding es obligatorio para este motor',
addExternal: 'Añadir base de conocimiento externa',
createExternalSuccess: 'Base de conocimiento externa creada correctamente',
updateExternalSuccess:
'Base de conocimiento externa actualizada correctamente',
deleteExternalSuccess:
'Base de conocimiento externa eliminada correctamente',
retriever: 'Recuperador',
selectRetriever: 'Seleccionar un recuperador...',
retrieverConfiguration: 'Configuración del recuperador',
retrieverInstallInfo:
'Puedes instalar plugins de recuperador de conocimiento desde',
retrieverMarketLink: 'aquí',
migration: {
title: 'Migración de base de conocimiento',
description:
'La nueva versión ha refactorizado la base de conocimiento en una arquitectura basada en plugins, unificando las bases de conocimiento internas y externas como plugins de "Motor de conocimiento". Se requiere la migración de los datos heredados. Tus datos antiguos se han respaldado automáticamente en la base de datos.',
detected:
'Se encontraron {{total}} base(s) de conocimiento para migrar ({{internal}} internas, {{external}} externas).',
startWithInstall: 'Auto-instalar plugin y migrar',
startDataOnly: 'Migrar solo datos',
dataOnlyHint:
'"Migrar solo datos" es para entornos sin conexión/intranet. Instala el plugin correspondiente manualmente después de la migración.',
dismiss: 'Descartar datos originales',
running: 'Migrando bases de conocimiento, por favor espera...',
success: 'Migración de base de conocimiento completada',
error: 'Error en la migración de base de conocimiento: ',
dismissError: 'Error en la operación',
retry: 'Reintentar',
},
},
register: {
title: 'Inicializar LangBot 👋',
description: 'Es tu primera vez iniciando LangBot',
adminAccountNote:
'La cuenta que uses aquí se establecerá como cuenta de administrador',
register: 'Registrarse',
initWithSpace: 'Inicializar con una cuenta de LangBot',
spaceRecommended:
'Recomendado: Usa API de modelos oficiales estables y servicios en la nube',
spaceInfoTip1:
'Space proporciona servicios de autenticación unificada de cuentas sin subir ninguna de tu información sensible.',
spaceInfoTip2:
'Iniciar sesión con una cuenta de LangBot te da acceso a los modelos de LangBot y otros servicios en la nube, incluyendo créditos gratuitos de llamadas a modelos para ayudarte a comenzar rápidamente.',
spaceInfoTip3:
'Tu método de inicio de sesión no afecta otras funciones. Puedes configurar y usar modelos de otras fuentes en cualquier momento.',
registerLocal: 'Registrar cuenta local',
registerWithPassword: 'Registrarse con correo electrónico y contraseña',
initSuccess: 'Inicialización exitosa, por favor inicia sesión',
initFailed: 'Error en la inicialización: ',
},
resetPassword: {
title: 'Restablecer contraseña 🔐',
description:
'Introduce tu clave de recuperación y nueva contraseña para restablecer la contraseña de tu cuenta',
recoveryKey: 'Clave de recuperación',
recoveryKeyDescription:
'Almacenada en `system.recovery_key` del archivo de configuración `data/config.yaml`',
newPassword: 'Nueva contraseña',
enterRecoveryKey: 'Introduce la clave de recuperación',
enterNewPassword: 'Introduce la nueva contraseña',
recoveryKeyRequired: 'La clave de recuperación no puede estar vacía',
newPasswordRequired: 'La nueva contraseña no puede estar vacía',
resetPassword: 'Restablecer contraseña',
resetting: 'Restableciendo...',
resetSuccess:
'Contraseña restablecida correctamente, por favor inicia sesión',
resetFailed:
'Error al restablecer la contraseña, por favor verifica tu correo y clave de recuperación',
secondFactorFailed:
'La verificación falló, comprueba el código e inténtalo de nuevo',
backToLogin: 'Volver al inicio de sesión',
verifyWith: 'Verificar con',
methodRecoveryKey: 'Clave de recuperación',
methodTotp: 'Autenticador',
methodRecoveryCode: 'Código de recuperación',
totpCode: 'Código del autenticador',
totpCodeDescription:
'Introduce el código de 6 dígitos que muestra tu aplicación de autenticación',
totpCodeRequired: 'El código del autenticador no puede estar vacío',
enterTotpCode: 'Introduce el código de 6 dígitos',
recoveryCode: 'Código de recuperación',
recoveryCodeDescription:
'Introduce uno de los códigos de recuperación de un solo uso que guardaste al activar la verificación en dos pasos',
recoveryCodeRequired: 'El código de recuperación no puede estar vacío',
enterRecoveryCodeValue: 'Introduce el código de recuperación',
},
embedding: {
description: 'Gestionar modelos Embedding para la vectorización de texto',
createModel: 'Crear modelo Embedding',
editModel: 'Editar modelo Embedding',
getModelListError: 'Error al obtener la lista de modelos Embedding: ',
embeddingModels: 'Embedding',
extraParametersDescription:
'Se adjuntarán al cuerpo de la solicitud, como encoding_format, dimensions, etc.',
},
llm: {
description: 'Gestionar modelos LLM para la generación de conversaciones',
llmModels: 'LLM',
extraParametersDescription:
'Se adjuntarán al cuerpo de la solicitud, como max_tokens, temperature, top_p, etc.',
},
version: {
newVersionAvailable: 'Nueva versión disponible',
viewUpdateGuide: 'Ver guía de actualización',
noReleaseNotes: 'No hay notas de la versión disponibles',
},
account: {
settings: 'Configuración de la cuenta',
settingsDescription: 'Gestiona tu contraseña y las cuentas vinculadas',
setPassword: 'Establecer contraseña',
passwordSetSuccess: 'Contraseña establecida correctamente',
passwordStatus: 'Contraseña local',
passwordSet: 'Establecida',
passwordNotSet: 'No establecida',
passwordSetDescription:
'La contraseña está establecida, puedes iniciar sesión con correo y contraseña',
spaceStatus: 'Cuenta de LangBot',
spaceBound: 'Vinculada',
spaceNotBound: 'No vinculada',
spaceBoundDescription:
'Cuenta de LangBot vinculada, API de modelos oficiales y servicios en la nube disponibles',
bindSpace: 'Vincular cuenta de LangBot',
bindSpaceDescription:
'Vincular para usar API de modelos oficiales y servicios en la nube',
bindSpaceButton: 'Vincular',
bindSpaceConfirmTitle: 'Confirmar vinculación',
bindSpaceConfirmDescription:
'Estás a punto de vincular tu instancia local a una cuenta de LangBot',
bindSpaceWarning:
'Después de vincular, tu correo de inicio de sesión se cambiará de {{localEmail}} al correo de la cuenta de LangBot.',
bindSpaceSuccess: 'Cuenta de LangBot vinculada correctamente',
passkeySectionTitle: 'Llaves de acceso (Passkeys)',
passkeySectionDesc:
'Inicia sesión de forma segura sin contraseñas usando biometría o llaves de seguridad',
addPasskey: 'Añadir llave de acceso',
passkeyName: 'Nombre de la llave',
passkeyNamePlaceholder: 'p. ej., MacBook Touch ID, YubiKey',
passkeyCreated: 'Creada el {{date}}',
passkeyLastUsed: 'Último uso: {{date}}',
noPasskeys: 'No hay llaves de acceso registradas',
deletePasskeyConfirm:
'¿Seguro que deseas eliminar esta llave de acceso? Ya no podrás usarla para iniciar sesión.',
passkeyAddedSuccess: 'Llave de acceso añadida con éxito',
passkeyDeleteSuccess: 'Llave de acceso eliminada',
passkeyRenameSuccess: 'Nombre de llave de acceso modificado con éxito',
totpSectionTitle: 'Verificación en dos pasos',
totpSectionDesc:
'Añade una contraseña de un solo uso basada en tiempo como segundo factor de inicio de sesión',
totpEnabledDesc:
'Verificación en dos pasos activada · quedan {{count}} códigos de recuperación',
enableTotp: 'Activar',
manageTotp: 'Gestionar',
totpEnrollTitle: 'Activar la verificación en dos pasos',
totpEnrollDesc:
'Escanea el código QR con tu aplicación de autenticación y confirma el código generado',
totpStartEnroll: 'Generar secreto',
totpGeneratingSecret: 'Generando un nuevo secreto…',
totpManageTitle: 'Verificación en dos pasos',
totpManageDesc:
'Regenera tus códigos de recuperación o desactiva el segundo factor.',
totpRegenerateCodes: 'Regenerar códigos de recuperación',
totpRegenerateDesc:
'Introduce un código actual del autenticador o de recuperación para emitir un conjunto nuevo.',
totpRecoveryCodesRegenerated: 'Nuevos códigos de recuperación generados',
totpStatusDisabled: 'No activada',
totpCodesRemaining: 'Quedan {{count}} códigos de recuperación',
totpManagerSectionDesc:
'Los propietarios y administradores pueden revisar y restablecer el segundo factor de cualquier cuenta.',
revokeTotp: 'Reasignar',
totpAdminResetTitle: 'Reasignar la verificación en dos pasos de {{user}}',
totpAdminResetDesc:
'Pide a la cuenta que escanee el código QR con su autenticador y que introduzca abajo el código de 6 dígitos para finalizar.',
totpAdminResetWarning:
'Al iniciar la reasignación, el autenticador actual de {{user}} deja de funcionar de inmediato.',
totpAdminResetHint:
'Si la cuenta no puede iniciar sesión ahora, puede escanear este código QR en cualquier aplicación de autenticación.',
totpAdminHandOverCodes:
'Entrega estos códigos de recuperación a {{user}}. Solo se muestran una vez.',
revokeTotpConfirm:
'¿Desactivar la verificación en dos pasos de {{user}}? Después podrá iniciar sesión solo con la contraseña.',
revokeTotpSuccess: 'Verificación en dos pasos restablecida',
you: 'tú',
noAccounts: 'No hay cuentas que mostrar',
totpRefreshSecret: 'Regenerar código QR',
totpQrAlt: 'Código QR de verificación en dos pasos',
totpEnterCode: 'Código de verificación',
enterCode: 'Introduce el código',
totpVerifyAndEnable: 'Verificar y activar',
totpOrRecoveryCode: 'Código del autenticador o de recuperación',
totpStatusEnabled: 'Verificación en dos pasos activada',
totpLastUsed: 'Última verificación: {{date}}',
totpNeverUsed: 'Aún no usado',
disableTotp: 'Desactivar la verificación en dos pasos',
disableTotpDesc:
'Introduce un código actual del autenticador o un código de recuperación para desactivar la verificación en dos pasos',
totpEnabledSuccess: 'Verificación en dos pasos activada',
totpDisabledSuccess: 'Verificación en dos pasos desactivada',
totpInvalidCode: 'Código no válido, compruébalo e inténtalo de nuevo',
totpRecoveryCodesTitle: 'Códigos de recuperación',
totpRecoveryCodesDesc:
'Guarda estos códigos de recuperación de un solo uso en un lugar seguro. Solo se muestran una vez.',
totpRecoveryCodesWarning:
'Cada código funciona una sola vez. Si pierdes el autenticador y estos códigos, perderás el acceso al inicio de sesión.',
totpSavedCodes: 'He guardado estos códigos',
regenerateRecoveryCodes: 'Regenerar códigos de recuperación',
bindSpaceFailed: 'Error al vincular la cuenta de LangBot',
bindSpaceInvalidState:
'Solicitud de vinculación no válida. Por favor, inténtalo de nuevo desde la configuración de la cuenta.',
setPasswordHint:
'Establece una contraseña para iniciar sesión con correo y contraseña',
spaceEmailMismatch:
'El correo de la cuenta de LangBot no coincide con el correo de la cuenta local',
space_account_not_registeredTitle: 'Account not registered',
space_account_not_registered:
'No local account is registered for this LangBot Account email. Ask the Workspace owner for an invitation.',
space_account_binding_requiredTitle: 'LangBot Account connection required',
space_account_binding_required:
'This local account must connect a LangBot Account from Account settings before using LangBot Account login.',
},
workspace: {
title: 'Workspace',
description: 'Manage members, roles, and invitation links',
selectTitle: 'Choose a Workspace',
selectDescription: 'Select where you want to continue in LangBot.',
selectionLoadFailed:
'Your Workspaces could not be loaded. Please try again.',
switchWorkspace: 'Switch Workspace',
settings: 'Workspace Settings',
currentPlan: 'Current plan',
planUnavailable: 'Unavailable',
upgradePlan: 'Change or upgrade plan',
ossSingletonDescription:
'This self-hosted instance has one Workspace and can include multiple users.',
cloudManagedDescription:
'This Workspace is hosted by LangBot Cloud. Manage members here; billing opens in Cloud.',
loadFailed: 'Failed to load Workspace information',
members: 'Members',
you: 'You',
inviteMember: 'Invite a member',
inviteDescription:
'Create a one-time link to add another user to this Workspace.',
emailPlaceholder: 'member@example.com',
createInvitation: 'Create invitation',
invitationCreated: 'Invitation created',
delivery: {
sent: 'Invitation sent',
link_only: 'Invitation link created',
failed: 'Invitation link created, but email could not be sent',
},
invitationCreateFailed: 'Failed to create invitation',
oneTimeLinkWarning: 'Copy this link now. It is shown only once.',
copyInvitation: 'Copy invitation link',
invitationCopied: 'Invitation link copied',
pendingInvitations: 'Pending invitations',
expiresAt: 'Expires {{date}}',
revokeInvitation: 'Revoke invitation',
invitationRevoked: 'Invitation revoked',
invitationRevokeFailed: 'Failed to revoke invitation',
acceptInvitation: 'Accept invitation',
invitedToWorkspace: 'You were invited to {{workspace}}',
checkingInvitation: 'Checking this invitation...',
invitationMissing: 'This invitation link is missing required information.',
invitationExpired: 'This invitation has expired.',
invitationAlreadyRevoked: 'This invitation was revoked.',
invitationAlreadyUsed: 'This invitation was already used.',
invitationInvalid: 'This invitation is invalid or no longer available.',
invitationAccepted: 'Invitation accepted',
invitationAcceptFailed: 'Failed to accept invitation',
invitationEmailMismatch:
'This invitation belongs to a different email address.',
existingAccountLoginRequired:
'An account already exists for this email. Sign in to continue.',
acceptAsCurrentAccount: 'Accept with current account',
authenticatedInvitationNotice:
'Sign out first, then sign in with the invited account. Your invitation will be preserved.',
logoutAndReturn: 'Sign out and return to this invitation',
switchAccount: 'Switch account',
registerAndAccept: 'Create account and accept',
alreadyHaveAccount: 'I already have an account',
confirmPassword: 'Confirm password',
passwordMinimum: 'Password must contain at least 8 characters.',
passwordMismatch: 'The passwords do not match.',
backToLogin: 'Back to sign in',
memberUpdated: 'Member role updated',
memberUpdateFailed: 'Failed to update member role',
removeMember: 'Remove member',
removeMemberConfirm: 'Remove this member from the Workspace?',
memberRemoved: 'Member removed',
memberRemoveFailed: 'Failed to remove member',
transferOwnership: 'Transfer ownership',
types: {
personal: 'Personal',
team: 'Team',
},
roles: {
owner: 'Owner',
admin: 'Admin',
developer: 'Developer',
operator: 'Operator',
viewer: 'Viewer',
},
},
monitoring: {
title: 'Panel de control',
description:
'Monitorea las actividades de los Bots, llamadas LLM y rendimiento del sistema',
overview: 'Resumen',
totalMessages: 'Total de mensajes',
llmCallsCount: 'Llamadas LLM',
modelCallsCount: 'Llamadas a modelos',
successRate: 'Tasa de éxito',
activeSessions: 'Sesiones activas',
last24Hours: 'Últimas 24 horas',
filters: {
title: 'Filtros',
bot: 'Bot',
pipeline: 'Pipeline',
allBots: 'Todos los Bots',
selectBot: 'Seleccionar Bot',
allPipelines: 'Todos los Pipelines',
selectPipeline: 'Seleccionar Pipeline',
loading: 'Cargando...',
timeRange: 'Rango de tiempo',
customRange: 'Rango personalizado',
from: 'Desde',
to: 'Hasta',
apply: 'Aplicar',
reset: 'Restablecer filtros',
lastHour: 'Última hora',
last6Hours: 'Últimas 6 horas',
last24Hours: 'Últimas 24 horas',
last7Days: 'Últimos 7 días',
last30Days: 'Últimos 30 días',
},
tabs: {
messages: 'Registros de mensajes',
llmCalls: 'Llamadas LLM',
embeddingCalls: 'Llamadas Embedding',
modelCalls: 'Llamadas a modelos',
tokens: 'Monitoreo de Tokens',
feedback: 'Comentarios de usuarios',
sessions: 'Análisis de sesiones',
errors: 'Registros de errores',
},
messageList: {
timestamp: 'Marca de tiempo',
bot: 'Bot',
pipeline: 'Pipeline',
message: 'Mensaje',
sessionId: 'ID de sesión',
status: 'Estado',
actions: 'Acciones',
viewDetails: 'Ver detalles',
copyId: 'Copiar ID',
noMessages: 'No se encontraron mensajes',
noMessagesDescription:
'Intenta ajustar los filtros o vuelve a comprobarlo más tarde',
loading: 'Cargando mensajes...',
loadMore: 'Cargar más',
autoRefresh: 'Actualización automática',
platform: 'Rol',
user: 'Usuario',
level: 'Nivel',
runner: 'Ejecutor',
viewConversation: 'Ver conversación',
turns: '{{count}} turnos de conversación',
userMessage: 'Usuario',
noUserMessage: 'No se registró entrada del usuario',
assistantMessage: 'Asistente',
assistantMessageCount: 'Asistente +{{count}}',
noAssistantMessage: 'No se registró respuesta del asistente',
messageCount: 'Mensajes',
conversationTrace: 'Flujo de conversación',
noLlmCalls: 'No se registraron llamadas al modelo',
roles: {
user: 'Usuario',
assistant: 'Asistente',
message: 'Mensaje',
},
},
llmCalls: {
title: 'Llamadas LLM',
model: 'Modelo',
tokens: 'Tokens',
duration: 'Duración',
cost: 'Coste',
noData: 'No se encontraron llamadas LLM',
inputTokens: 'Tokens de entrada',
outputTokens: 'Tokens de salida',
totalTokens: 'Tokens totales',
avgDuration: 'Duración promedio',
calls: 'Llamadas',
},
toolCalls: {
title: 'Llamadas de herramientas',
totalCalls: 'Llamadas',
duration: 'Duración de herramientas',
errorCalls: 'Llamadas fallidas',
arguments: 'Argumentos',
result: 'Resultado',
noToolCalls: 'No se registraron llamadas de herramientas',
showDetails: 'Mostrar detalles',
hideDetails: 'Ocultar detalles',
},
tokens: {
totalTokens: 'Tokens totales',
inputTokens: 'Tokens de entrada',
outputTokens: 'Tokens de salida',
avgPerCall: 'Prom. / llamada',
throughput: 'Rendimiento',
tokensPerSec: 'tokens/seg',
errorCalls: 'Llamadas fallidas',
acrossCalls: 'en {{count}} llamadas',
ofTotal: 'de {{count}} en total',
usageOverTime: 'Uso de tokens a lo largo del tiempo',
byModel: 'Por modelo',
model: 'Modelo',
calls: 'Llamadas',
avgLatency: 'Latencia media',
noData: 'No hay uso de tokens en el rango de tiempo seleccionado',
loadError: 'Error al cargar las estadísticas de tokens: {{error}}',
zeroTokenWarning:
'{{count}} llamada(s) exitosa(s) reportaron cero uso de tokens. Esto suele significar que el proveedor upstream no devolvió información de uso; revisa la configuración del proveedor del modelo.',
bucket: {
hour: 'Por hora',
day: 'Por día',
},
},
embeddingCalls: {
title: 'Llamadas Embedding',
model: 'Modelo',
tokens: 'Tokens',
duration: 'Duración',
noData: 'No se encontraron llamadas Embedding',
promptTokens: 'Tokens de prompt',
totalTokens: 'Tokens totales',
inputCount: 'Cantidad de entradas',
knowledgeBase: 'Base de conocimiento',
queryText: 'Consulta',
},
modelCalls: {
title: 'Llamadas a modelos',
llmModel: 'LLM',
embeddingModel: 'Embedding',
embeddingCall: 'Embedding',
retrieveCall: 'Recuperación',
noData: 'No se encontraron llamadas a modelos',
},
sessions: {
sessionId: 'ID de sesión',
messageCount: 'Mensajes',
duration: 'Duración',
lastActivity: 'Última actividad',
noSessions: 'No se encontraron sesiones',
startTime: 'Hora de inicio',
messageStats: 'Estadísticas de mensajes',
totalMessages: 'Total de mensajes',
successMessages: 'Exitosos',
errorMessages: 'Fallidos',
llmStats: 'Estadísticas LLM',
noData: 'Sesión no encontrada',
},
errors: {
title: 'Errores',
errorType: 'Tipo de error',
errorMessage: 'Mensaje de error',
occurredAt: 'Ocurrido el',
noErrors: 'No se encontraron errores',
stackTrace: 'Traza de pila',
},
feedback: {
title: 'Comentarios de usuarios',
totalFeedback: 'Total de comentarios',
totalLikes: 'Me gusta',
totalDislikes: 'No me gusta',
satisfactionRate: 'Tasa de satisfacción',
like: 'Me gusta',
dislike: 'No me gusta',
noFeedback: 'Aún no hay comentarios',
noFeedbackDescription: 'Los comentarios de los usuarios aparecerán aquí',
feedbackList: 'Lista de comentarios',
feedbackContent: 'Contenido del comentario',
contextInfo: 'Información de contexto',
userId: 'ID de usuario',
messageId: 'ID de mensaje',
streamId: 'ID de consulta relacionada',
inaccurateReasons: 'Razones de inexactitud',
platform: 'Plataforma',
exportFeedback: 'Exportar comentarios',
description:
'Tell us what went wrong or what could be better. Instance UUID and login account are included for diagnosis.',
placeholder: 'Describe your suggestion, issue, or reproduction steps...',
attachImage: 'Add image',
screenshot: 'Screenshot',
submit: 'Submit feedback',
privacyHint:
'Do not include secrets, passwords, or private chat content.',
contentRequired: 'Please enter feedback first',
imageOnly: 'Only image attachments are supported',
imageTooLarge: 'Each image must be under 1MB',
tooManyImages: 'You can attach up to 3 images',
screenshotFailed: 'Screenshot failed. Try pasting or uploading an image.',
submitSuccess: 'Feedback submitted. Thanks!',
submitFailed: 'Failed to submit feedback. Please try again later.',
removeImage: 'Remove image',
},
queries: {
title: 'Consultas',
},
messageDetails: {
noData: 'No hay llamadas LLM ni errores para esta consulta',
},
queryVariables: {
title: 'Variables de consulta',
},
loadError: 'No se pudieron cargar los datos de monitoreo',
partialMessages:
'Se muestran {{shown}} de {{total}} mensajes. Las trazas de conversación pueden estar incompletas.',
partialModelCalls: 'Se muestran {{shown}} de {{total}} llamadas al modelo.',
partialToolCalls:
'Se muestran {{shown}} de {{total}} llamadas a herramientas. Las trazas de conversación pueden estar incompletas.',
partialErrors: 'Se muestran {{shown}} de {{total}} errores.',
trafficChart: {
unavailable: 'Agregación de tráfico no disponible',
truncated:
'Rango de tráfico truncado. Selecciona un intervalo más corto.',
title: 'Resumen de tráfico',
messages: 'Mensajes',
llmCalls: 'Llamadas LLM',
noData: 'No hay datos de tráfico disponibles',
},
viewMonitoring: 'Ver monitoreo',
refreshData: 'Actualizar datos',
exportData: 'Exportar datos',
export: {
title: 'Exportar datos',
exporting: 'Exportando...',
messages: 'Mensajes',
llmCalls: 'Llamadas LLM',
embeddingCalls: 'Llamadas Embedding',
errors: 'Registros de errores',
sessions: 'Sesiones',
feedback: 'Comentarios de usuarios',
},
systemStatus: 'Estado del sistema',
pluginRuntime: 'Plugin Runtime',
boxRuntime: 'Box Runtime',
connected: 'Conectado',
disconnected: 'Desconectado',
disabled: 'Desactivado',
statusDetail: 'Estado',
pluginDisabled: 'El sistema de plugins está desactivado',
boxDisabled:
'El sandbox de Box está desactivado en la configuración — herramientas de sandbox, alta/edición de skills y MCP stdio no están disponibles',
boxUnavailable:
'El sandbox de Box no está disponible — herramientas de sandbox, alta/edición de skills y MCP stdio no están disponibles',
boxRequiredHint:
'Esta función requiere el runtime de Box. Actívelo en la configuración (box.enabled = true) y asegúrese de que el runtime está conectado.',
boxBackend: 'Backend',
boxProfile: 'Perfil',
boxSandboxes: 'Sandboxes',
boxSessionCreated: 'Creado',
boxSessionLastUsed: 'Último uso',
},
settingsDialog: {
title: 'Configuración',
nav: {
workspace: 'Workspace',
models: 'Modelos',
api: 'API',
storage: 'Almacenamiento',
account: 'Cuenta',
},
},
storageAnalysis: {
title: 'Análisis de almacenamiento',
description:
'Inspecciona el uso de almacenamiento y los candidatos de limpieza',
openDialog: 'Ver análisis',
dialogTitle: 'Análisis de almacenamiento',
generatedAt: 'Generado el {{time}}',
loading: 'Cargando...',
refresh: 'Actualizar',
totalSize: 'Tamaño total',
binaryStorage: 'Almacenamiento binario de plugins',
uploadCleanup: 'Subidas caducadas',
logCleanup: 'Registros caducados',
sections: 'Secciones de almacenamiento',
monitoringTables: 'Tablas de monitoreo',
runtimeTasks: 'Tareas en ejecución',
cleanupPolicy: 'Política de limpieza',
uploadRetention: 'Retención de subidas',
logRetention: 'Retención de registros',
databaseType: 'Tipo de base de datos',
days: 'días',
missing: 'Falta',
notCreated: 'Aún no creado',
processStorage: 'Almacenamiento por proceso',
processStorageDescription:
'Cada entorno de ejecución mide sus propios directorios. Los detalles ya se incluyen en el total del directorio principal.',
directory: 'Directorio',
size: 'Tamaño',
files: 'Archivos',
runtimeUnavailable:
'Las estadísticas de almacenamiento del entorno de ejecución no están disponibles.',
noManagedDirectories: 'No se informaron directorios administrados.',
scanWarnings: '{{count}} entradas ilegibles',
boxActivity: '{{sessions}} sesiones · {{processes}} procesos administrados',
statusLabels: {
available: 'Disponible',
unavailable: 'No disponible',
disabled: 'Desactivado',
not_applicable: 'No aplicable',
},
sourceLabels: {
local_process: 'Medido por el proceso LangBot',
runtime_rpc:
'Medido por el entorno de ejecución mediante RPC autenticado',
},
scopeLabels: {
runtime_host: 'Host del entorno de ejecución',
sandbox_sessions: 'Sesiones de sandbox',
},
processNames: {
langbot: 'Proceso principal de LangBot',
plugin_runtime: 'Entorno de ejecución de plugins',
box_runtime: 'Entorno de ejecución de Box',
},
processDescriptions: {
langbot:
'Base de datos, registros, archivos subidos, datos vectoriales y archivos temporales.',
plugin_runtime:
'Paquetes de plugins, artefactos verificados, entornos de dependencias y datos privados de instalación.',
box_runtime:
'Espacios de trabajo de sandbox, procesos MCP, directorios de intercambio de adjuntos y habilidades.',
},
expiredUploads: 'Subidas caducadas',
expiredLogs: 'Registros caducados',
noExpiredUploads: 'No hay archivos subidos caducados',
noExpiredLogs: 'No hay registros caducados',
sectionNames: {
database: 'Base de datos',
logs: 'Registros',
storage: 'Archivos subidos',
vector_store: 'Almacén vectorial',
plugins: 'Plugins',
mcp: 'MCP',
temp: 'Archivos temporales',
legacy_plugins: 'Paquetes de plugins antiguos',
artifacts: 'Artefactos de plugins verificados',
dependency_environments: 'Entornos de dependencias',
installations: 'Datos de instalación de plugins',
staging: 'Archivos provisionales de plugins',
rpc_transfer: 'Archivos de transferencia RPC',
workspace: 'Espacio de trabajo de sandbox',
inbox: 'Adjuntos entrantes',
outbox: 'Adjuntos salientes',
skills: 'Habilidades',
session_workspaces: 'Espacios de trabajo de sesiones sandbox',
session_caches: 'Cachés del entorno de sandbox',
session_temp: 'Archivos temporales de sandbox',
managed_process_workspaces:
'Espacios de procesos administrados (incluido MCP)',
},
},
limitation: {
maxBotsReached:
'Se ha alcanzado el número máximo de Bots ({{max}}). Por favor, elimina un Bot existente antes de crear uno nuevo.',
maxPipelinesReached:
'Se ha alcanzado el número máximo de Pipelines ({{max}}). Por favor, elimina un Pipeline existente antes de crear uno nuevo.',
maxExtensionsReached:
'Se ha alcanzado el número máximo de extensiones ({{max}}). Por favor, elimina un servidor MCP o plugin existente antes de añadir uno nuevo.',
quotaLoadingTooltip:
'El uso del espacio de trabajo aún se está cargando. Espera antes de crear un recurso.',
quotaCheckFailed:
'No se pudo verificar la cuota actual del espacio de trabajo. Inténtalo de nuevo.',
createDisabledTooltip:
'Se alcanzó el límite de {{resource}} ({{max}}) de este espacio de trabajo. Elimina uno existente antes de crear otro.',
},
skills: {
title: 'Skills',
description:
'Crea y gestiona skills que se pueden activar durante las conversaciones',
createSkill: 'Crear skill',
createSkillDescription:
'Importa un directorio local o crea una skill rellenando la información',
editSkill: 'Editar skill',
getSkillListError: 'Error al obtener la lista de skills: ',
skillName: 'Nombre de la skill',
displayName: 'Nombre de la skill',
displayNamePlaceholder: 'Nombre visible (admite cualquier idioma)',
skillSlug: 'Nombre del directorio',
skillSlugPlaceholder: 'english-name-only',
skillSlugHelp:
'Se usa como nombre del directorio de la skill. Solo letras, números, guiones y guiones bajos.',
skillDescription: 'Descripción de la skill',
skillInstructions: 'Instrucciones',
saveSuccess: 'Guardado correctamente',
saveError: 'Error al guardar: ',
createSuccess: 'Creado correctamente',
createError: 'Error al crear: ',
deleteSuccess: 'Eliminado correctamente',
deleteError: 'Error al eliminar: ',
deleteConfirmation: '¿Seguro que quieres eliminar esta skill?',
delete: 'Eliminar skill',
skillNameRequired: 'El nombre de la skill no puede estar vacío',
skillDescriptionRequired: 'La descripción de la skill no puede estar vacía',
packageRootRequired: 'La ruta raíz del paquete no puede estar vacía',
scan: 'Escanear',
scanSuccess: 'Directorio escaneado correctamente',
scanError: 'Error al escanear el directorio: ',
noSkills: 'No hay skills configuradas',
preview: 'Vista previa',
previewInstructions: 'Vista previa del contenido de SKILL.md',
instructionsPlaceholder:
'Introduce las instrucciones de la skill en formato Markdown...',
descriptionPlaceholder:
'Breve descripción de lo que hace esta skill (se muestra al LLM)',
packageRoot: 'Directorio del paquete',
packageRootHelp:
'Opcional. Solo se necesita al importar un directorio de skill existente. Déjalo vacío para skills nuevas. El escaneo revisa el directorio actual y subdirectorios hasta 2 niveles.',
importLocalDirectory: 'Importar directorio local de skill',
chooseSkillDirectory: 'Elegir directorio de SKILL.md',
chooseAnotherDirectory: 'Elegir otro directorio',
importingDirectory: 'Generando vista previa...',
clearDirectoryPreview: 'Borrar directorio seleccionado',
noSkillMdInDirectory:
'No se encontró SKILL.md en el directorio seleccionado',
multipleSkillMdInDirectory:
'El directorio seleccionado contiene varios SKILL.md. Elige directamente un único directorio de skill.',
importDirectoryError: 'Error al importar el directorio: ',
advancedSettings: 'Configuración avanzada',
searchSkills: 'Buscar skills...',
selectSkills: 'Seleccionar skills',
addSkill: 'Añadir skill',
builtin: 'Integrada',
importFromGithub: 'Instalar skill desde GitHub',
createManually: 'Crear manualmente',
uploadZip: 'Subir paquete ZIP',
uploadZipOnly: 'Solo se admiten paquetes de skill .zip',
installSuccess: 'Skill instalada correctamente',
installError: 'Error al instalar la skill: ',
enterRepoUrl: 'Introduce la URL del repositorio de GitHub',
repoUrlPlaceholder: 'p. ej., https://github.com/owner/repo',
fetchingReleases: 'Obteniendo releases...',
selectRelease: 'Seleccionar release',
noReleasesFound: 'No se encontraron releases',
fetchReleasesError: 'Error al obtener releases: ',
selectAsset: 'Selecciona el archivo para instalar',
sourceArchive: 'Código fuente (zip)',
noAssetsFound: 'No hay archivos instalables en esta release',
fetchAssetsError: 'Error al obtener archivos: ',
backToReleases: 'Volver a releases',
backToRepoUrl: 'Volver a la URL del repositorio',
backToAssets: 'Volver a archivos',
releaseTag: 'Etiqueta: {{tag}}',
publishedAt: 'Publicado el: {{date}}',
prerelease: 'Pre-release',
assetSize: 'Tamaño: {{size}}',
confirmInstall: 'Confirmar instalación',
installing: 'Instalando skill...',
loading: 'Cargando...',
previewLoadError: 'Error al cargar la vista previa',
selectFromSidebar: 'Selecciona una skill en la barra lateral',
dangerZone: 'Zona peligrosa',
dangerZoneDescription: 'Acciones irreversibles y destructivas',
files: 'Archivos',
noFiles: 'No se encontraron archivos',
loadFilesError: 'Error al cargar archivos: ',
readFileError: 'Error al leer el archivo: ',
saveFile: 'Guardar archivo',
saveFileSuccess: 'Archivo guardado correctamente',
saveFileError: 'Error al guardar el archivo: ',
},
wizard: {
sidebarDescription: 'Crea un Bot con pasos guiados',
loading: 'Cargando asistente...',
loadError: 'Error al cargar los datos del asistente',
skip: 'Omitir',
skipConfirmMessage:
'Puedes volver a acceder al asistente de inicio rápido desde el menú de cuenta más tarde, o crear un Bot manualmente.',
skipConfirmOk: 'Aceptar',
prev: 'Anterior',
next: 'Siguiente',
finish: 'Crear y desplegar',
confirmCreateBot: 'Confirmar, crear Bot',
createSuccess: '¡Pipeline creado y vinculado al Bot correctamente!',
botCreateSuccess: '¡Bot creado correctamente!',
botSaveSuccess: '¡Configuración del Bot guardada y activada!',
createError: 'Error al crear los recursos',
skipSaveError:
'Error al guardar el estado de omisión. Por favor, inténtalo de nuevo.',
completeSaveError:
'Error al guardar el estado de finalización. Por favor, inténtalo de nuevo.',
step: {
platform: 'Plataforma',
botConfig: 'Configuración del Bot',
aiEngine: 'Motor de IA',
done: 'Listo',
},
platform: {
title: 'Selecciona una plataforma',
description:
'Elige la plataforma de mensajería a la que se conectará tu Bot.',
},
botConfig: {
title: 'Configura tu Bot',
description:
'Configura tu Bot y verifica que funcione antes de continuar.',
saveBot: 'Guardar y activar Bot',
resaveBot: 'Volver a guardar configuración',
botSaved:
'Configuración del Bot guardada y activada. Consulta los registros para verificar la conexión.',
waitingForMessage:
'El Bot está activado. Envíale un mensaje desde tu plataforma de mensajería para continuar.',
messageReceived:
'El Bot recibió un mensaje. Puedes continuar al siguiente paso.',
messageReceivedLocalAccountWarning:
'La conexión del Bot está configurada correctamente y recibió un mensaje. Como no has iniciado sesión con una cuenta de LangBot, las llamadas al modelo pueden fallar; continúa al siguiente paso para añadir tu propio modelo.',
pageBotPreviewFailed:
'No se pudo cargar el chat de prueba. Guarda la configuración de nuevo para reintentar.',
pageBotTestPrompt:
'El Bot de página está activado. Haz clic en la burbuja de chat de la esquina inferior derecha y envía un mensaje para verificar el flujo completo de la conversación.',
pageBotTestNotice:
'Solo para pruebas. Inserta el código en una página web externa real.',
webhookTestPrompt:
'La URL de devolución de llamada está lista. Configúrala en la plataforma externa y envía un mensaje real al Bot.',
httpTestPrompt:
'El Bot HTTP está activado. Envía aquí un mensaje entrante real para verificar la conexión.',
httpTestDefaultMessage: 'Hola, este es un mensaje de prueba de conexión.',
sendHttpTest: 'Enviar mensaje de prueba',
httpTestAccepted:
'El mensaje de prueba fue aceptado. Aparecerá en el registro en breve.',
httpTestMissingSecret:
'Introduce un secreto de firma entrante y guarda primero la configuración.',
httpTestFailed: 'No se pudo enviar el mensaje de prueba: {{error}}',
logsTitle: 'Registros del Bot',
logsDescription:
'Monitorea la actividad del Bot para verificar que la conexión con la plataforma funcione.',
},
aiEngine: {
defaultModelUnavailable:
'No hay un modelo predeterminado disponible. Inténtalo de nuevo.',
defaultRunnerUnavailable:
'Local Agent aún no está listo. Inténtalo de nuevo.',
preparingDefault: 'Preparando la IA predeterminada…',
title: 'Configura el motor de IA',
description:
'Elige el motor de IA que impulsará la inteligencia de tu Bot.',
optionalDescription:
'La IA ya está configurada. Puedes usarla o cambiar la conexión.',
externalTitle: 'Conectar un Agent de una plataforma externa',
externalDescription:
'Conecta Dify, n8n, Coze u otro Agent externo mediante un plugin Runner.',
ownModelTitle: 'Usar mi propio modelo',
ownModelDescription:
'Añade un proveedor y luego escanea o introduce manualmente un modelo para completar la configuración.',
ownModelSetupTitle: 'Añade tu propio modelo',
ownModelSetupDescription:
'Añade un proveedor de modelos. Los modelos de chat se detectan automáticamente, o puedes introducir un ID de modelo manualmente.',
addProviderTitle: 'Añadir proveedor',
addProviderDescription:
'Introduce los datos del proveedor y la clave de API usados para conectar y detectar modelos.',
selectModelTitle: 'Elige un modelo',
selectScannedModelTitle: 'Elige un modelo',
selectScannedModelDescription:
'El modelo seleccionado sustituirá al modelo principal del pipeline de este bot.',
scanModelMode: 'Detectar modelos',
manualModelMode: 'Añadir manualmente',
scanningModels: 'Detectando modelos disponibles…',
noScannedModels:
'No se encontraron modelos de chat disponibles. Revisa la configuración del proveedor.',
scanModelsFailed:
'No se pudieron detectar los modelos. Revisa la URL y la clave de API e inténtalo de nuevo.',
manualFallbackFailed:
'La detección automática falló. Introduce un ID de modelo compatible con el proveedor.',
manualFallbackEmpty:
'No se encontraron modelos. Introduce un ID de modelo compatible con el proveedor.',
manualModelId: 'ID del modelo',
manualModelIdPlaceholder: 'Por ejemplo: gpt-4o',
manualModelIdDescription:
'Introduce el parámetro de modelo utilizado en las solicitudes.',
manualModelOptions: 'Capacidades opcionales del modelo',
editProvider: 'Editar proveedor',
rescanModels: 'Volver a detectar modelos',
moreFeaturesTitle: 'Usar la configuración predeterminada',
moreFeaturesDescription:
'Usa Local Agent y el modelo recomendado. Podrás añadir herramientas y bases de conocimiento después.',
runnerDescription:
'Selecciona un Runner para el Agent externo y configura su conexión.',
backToChoices: 'Volver a las opciones',
backToList: 'Volver a la lista',
createExternal: 'Crear y vincular',
finishWithModel: 'Usar el modelo seleccionado y finalizar',
openWorkbench: 'Abrir área de trabajo',
loadingCatalog: 'Cargando extensiones de ejecutores...',
catalogUnavailable: 'El catálogo de ejecutores no está disponible',
catalogUnavailableDescription:
'Los ejecutores instalados siguen disponibles. Reintenta cargar el catálogo o explora las extensiones.',
noMarketplaceRunners: 'Ningún plugin de ejecutor coincide con este uso',
noMarketplaceRunnersDescription:
'Usa un ejecutor instalado o inténtalo más tarde.',
browseRunners: 'Explorar extensiones de ejecutores',
installAndContinue: 'Instalar y continuar',
installing: 'Instalando...',
useInstalled: 'Usar este ejecutor',
installedUnavailable: 'Instalado, ejecutor no disponible',
installSuccess: '{{runner}} instalado y seleccionado',
installFailed: 'No se pudo instalar la extensión de ejecutor',
versionUnavailable: 'El mercado no devolvió ninguna versión instalable.',
installTimeout:
'La instalación del ejecutor agotó el tiempo de espera. Revisa la tarea en Extensiones.',
registrationTimeout:
'La extensión se instaló, pero el ejecutor no se registró. Revisa el entorno de ejecución de plugins y reinténtalo.',
},
config: {
botInfo: 'Información del Bot',
botNamePlaceholder: 'Introduce el nombre del Bot',
botDescPlaceholder: 'Introduce la descripción del Bot (opcional)',
platformConfig: 'Configuración de {{platform}}',
aiConfig: 'Configuración de {{engine}}',
},
done: {
title: '¡Todo listo!',
description:
'Tu Bot ha sido creado y conectado al Pipeline de IA. Ahora puedes gestionarlo desde el panel de trabajo.',
backToWorkbench: 'Volver al panel de trabajo',
},
},
addExtension: {
installTitle: 'Instalar {{type}}',
installConfirm: '¿Instalar {{type}} "{{name}}"?',
installInfoType: 'Tipo',
installInfoId: 'ID',
installInfoVersion: 'Versión',
installSuccess: 'Instalado correctamente',
installStage: {
mcpInstalling: 'Añadiendo y conectando el servidor MCP…',
skillInstalling: 'Instalando la skill…',
installed: 'Listo',
},
manualAdd: 'Añadir manualmente',
uploadExtension: 'Arrastra y suelta o haz clic para subir',
uploadHint: 'Admite archivos .zip (skills) y .lbpkg (plugins)',
orContinueWith: 'o elige una acción abajo',
addMCPServerHint: 'Conectar una extensión de servidor de herramientas MCP',
installFromGithub: 'Instalar desde GitHub',
installFromGithubHint: 'Paquete de plugin o skill (SKILL.md)',
githubUrlHelp: 'Pega una URL de GitHub',
githubUrlTooltip:
'Plugin: pega una URL de repositorio, Release o Tag. Skill: pega la URL de la página SKILL.md dentro del directorio de la skill.',
githubUrlPlaceholder: 'Repositorio de GitHub, Release o enlace SKILL.md',
githubUrlRequired: 'Introduce una URL de GitHub',
previewSkill: 'Previsualizar skill',
noSkillPreviewFound: 'No se encontró ninguna skill importable',
createSkill: 'Crear nueva skill',
createSkillHint: 'Importar desde un directorio local o crear manualmente',
unsupportedFileType:
'Tipo de archivo no admitido. Solo se admiten archivos .zip y .lbpkg',
},
errorPage: {
unexpectedError: 'Algo salió mal',
unexpectedErrorDescription:
'Ocurrió un error inesperado. Por favor, inténtelo de nuevo más tarde.',
notFound: 'Página no encontrada',
notFoundDescription: 'La página que buscas no existe o ha sido movida.',
backendUnavailableStatus: 'Backend no disponible',
goBack: 'Volver',
backToHome: 'Ir al inicio',
backToLogin: 'Volver al inicio de sesión',
retrying: 'Reintentando',
retryFailed:
'Aún no se puede conectar con el backend. Inicia el servicio e inténtalo de nuevo.',
},
feishu: {
createApp: 'Crear aplicación de Feishu con un clic',
scanQRCode:
'Escanea el código QR de abajo con Feishu para autorizar y crear la aplicación automáticamente',
waitingForScan: 'Esperando escaneo',
createSuccess:
'¡Aplicación creada correctamente! Las credenciales se han rellenado automáticamente',
createFailed: 'Error al crear la aplicación',
connecting: 'Conectando con el servicio de Feishu...',
expired: 'El código QR ha caducado. Inténtalo de nuevo',
denied: 'El usuario rechazó la autorización',
connectionLost: 'Se perdió la conexión. Inténtalo de nuevo',
reconnecting: 'Reconectando...',
retry: 'Reintentar',
},
weixin: {
scanLogin: 'Iniciar sesión en WeChat con QR',
scanQRCode:
'Escanea el código QR de abajo con WeChat para autorizar e introducir el token automáticamente',
loginSuccess:
'¡Inicio de sesión correcto! El token se ha rellenado automáticamente',
loginFailed: 'Error al iniciar sesión',
connecting: 'Conectando con el servicio de WeChat...',
waitingForScan: 'Esperando escaneo',
retry: 'Reintentar',
},
dingtalk: {
createApp: 'Crear aplicación de DingTalk con un clic',
scanQRCode:
'Escanea el código QR de abajo con DingTalk para autorizar y crear la aplicación automáticamente',
waitingForScan: 'Esperando escaneo',
createSuccess:
'¡Aplicación creada correctamente! Las credenciales se han rellenado automáticamente',
createFailed: 'Error al crear la aplicación',
connecting: 'Conectando con el servicio de DingTalk...',
retry: 'Reintentar',
robotCodeNote:
'El código del robot no puede obtenerse automáticamente. Ve al panel de desarrolladores de DingTalk > Configuración del robot para copiarlo manualmente. Es necesario para funciones como reconocimiento de imágenes y carga de archivos.',
},
wecombot: {
createBot: 'Crear bot de WeCom con un clic',
scanQRCode:
'Escanea el código QR de abajo con WeCom para autorizar y crear el bot automáticamente',
waitingForScan: 'Esperando escaneo',
createSuccess:
'¡Bot creado correctamente! Las credenciales se han rellenado automáticamente',
createFailed: 'Error al crear el bot',
connecting: 'Conectando con el servicio de WeCom...',
retry: 'Reintentar',
robotNameNote:
'El nombre del robot no puede obtenerse automáticamente. Introdúcelo manualmente.',
},
qqofficial: {
createBinding: 'Vinculación QR con un clic para el bot oficial de QQ',
scanQRCode:
'Escanea el código QR siguiente con QQ móvil y autoriza la vinculación en «QQ Bot Assistant»',
waitingForScan: 'Esperando escaneo',
bindSuccess:
'¡Vinculación correcta! AppID y Secret se han rellenado automáticamente',
bindFailed: 'Error en la vinculación',
connecting: 'Conectando con el servicio de QQ...',
retry: 'Reintentar',
tokenNote:
'El campo Token no es utilizado por el adaptador actual; puedes dejarlo vacío.',
boundBy: 'Vinculado por el usuario QQ {{openid}}',
},
pluginPages: {
selectFromSidebar: 'Selecciona una página de plugin en la barra lateral',
invalidPage: 'Página de plugin no válida',
},
};
export default esES;