1300 lines
57 KiB
TypeScript
1300 lines
57 KiB
TypeScript
export default {
|
||
// Login
|
||
login: {
|
||
title: 'Hermes Web UI',
|
||
description: 'Introduce tu token de acceso para continuar. Encuentralo en los registros de inicio del servidor.',
|
||
placeholder: 'Token de acceso',
|
||
submit: 'Iniciar sesion',
|
||
tokenRequired: 'Por favor, introduce tu token de acceso',
|
||
invalidToken: 'Token invalido',
|
||
connectionFailed: 'No se puede conectar al servidor',
|
||
passwordLogin: 'Contrasena',
|
||
tokenLogin: 'Token',
|
||
usernamePlaceholder: 'Nombre de usuario',
|
||
passwordPlaceholder: 'Contrasena',
|
||
credentialsRequired: 'Por favor, introduzca nombre de usuario y contrasena',
|
||
invalidCredentials: 'Nombre de usuario o contrasena incorrectos',
|
||
tooManyAttempts: 'Demasiados intentos fallidos, por favor intente mas tarde',
|
||
passwordMismatch: 'Las contrasenas no coinciden',
|
||
passwordTooShort: 'La contrasena debe tener al menos 6 caracteres',
|
||
setupSuccess: 'Login con contrasena configurado correctamente',
|
||
passwordChanged: 'Contrasena cambiada correctamente',
|
||
passwordRemoved: 'Login con contrasena eliminado',
|
||
setupPassword: 'Configurar login con contrasena',
|
||
changePassword: 'Cambiar contrasena',
|
||
changeUsername: 'Cambiar nombre de usuario',
|
||
removePasswordLogin: 'Eliminar',
|
||
username: 'Nombre de usuario',
|
||
currentPassword: 'Contrasena actual',
|
||
newPassword: 'Nueva contrasena',
|
||
confirmPassword: 'Confirmar contrasena',
|
||
newUsername: 'Nuevo nombre de usuario',
|
||
usernameChanged: 'Nombre de usuario cambiado correctamente',
|
||
usernameTooShort: 'El nombre de usuario debe tener al menos 2 caracteres',
|
||
setupDescription: 'Configure un nombre de usuario y contrasena para un inicio de sesion rapido. El token de acceso seguira funcionando.',
|
||
removeConfirm: 'Esta seguro de eliminar el login con contrasena? Necesitara usar el token de acceso.',
|
||
passwordLoginNotConfigured: 'Login con contrasena no configurado',
|
||
passwordLoginConfigured: 'Login con contrasena habilitado ({username})',
|
||
},
|
||
|
||
// Common
|
||
common: {
|
||
loading: 'Cargando...',
|
||
cancel: 'Cancelar',
|
||
retry: 'Reintentar',
|
||
delete: 'Eliminar',
|
||
edit: 'Editar',
|
||
save: 'Guardar',
|
||
saved: 'Guardado',
|
||
update: 'Actualizar',
|
||
create: 'Crear',
|
||
saveFailed: 'Error al guardar',
|
||
deleteFailed: 'Error al eliminar',
|
||
ok: 'OK',
|
||
copied: 'Copiado',
|
||
copy: 'Copiar',
|
||
noData: 'Sin datos',
|
||
fetch: 'Obtener',
|
||
add: 'Anadir',
|
||
enable: 'Activar',
|
||
disable: 'Desactivar',
|
||
configured: 'Configurado',
|
||
notConfigured: 'No configurado',
|
||
confirm: 'Confirmar',
|
||
expand: 'Expandir',
|
||
collapse: 'Contraer',
|
||
stop: 'Detener',
|
||
start: 'Iniciar',
|
||
expired: 'Expirado',
|
||
},
|
||
|
||
// Sidebar
|
||
sidebar: {
|
||
chat: 'Chat',
|
||
search: 'Buscar',
|
||
apiRelay: 'API Relay',
|
||
history: 'Historial',
|
||
jobs: 'Tareas programadas',
|
||
models: 'Modelos',
|
||
profiles: 'Perfiles',
|
||
plugins: 'Plugins',
|
||
skills: 'Habilidades',
|
||
memory: 'Memoria',
|
||
logs: 'Registros',
|
||
usage: 'Uso',
|
||
performance: 'Rendimiento',
|
||
skillsUsage: 'Uso de habilidades',
|
||
channels: 'Canales',
|
||
terminal: 'Terminal',
|
||
files: 'Archivos',
|
||
groupChat: 'Chat grupal',
|
||
groupConversation: 'Conversación',
|
||
groupConversationShort: 'Conv.',
|
||
groupAgent: 'Agente',
|
||
groupAgentShort: 'Ag.',
|
||
groupSystem: 'Sistema',
|
||
groupSystemShort: 'Sist',
|
||
groupMonitoring: 'Monitoreo',
|
||
groupMonitoringShort: 'Mon.',
|
||
settings: 'Configuracion',
|
||
connected: 'Conectado',
|
||
disconnected: 'Desconectado',
|
||
updateTip: 'Ejecuta "hermes-web-ui update" en la terminal para actualizar',
|
||
updateVersion: 'Actualizar a v{version}',
|
||
reloadClientVersion: 'Recargar para v{version}',
|
||
updating: 'Actualizando...',
|
||
updateSuccess: 'Actualizacion completada. Actualiza la pagina en breve. Si no se inicia despues de un tiempo, inicialo manualmente.',
|
||
updateFailed: 'Error al actualizar',
|
||
logout: 'Cerrar sesion',
|
||
nodeVersionWarning: 'Se detecto Node.js v{version}. Actualiza a la version 23 o posterior.',
|
||
changelog: 'Registro de cambios',
|
||
noChangelog: 'No hay registro de cambios',
|
||
kanban: 'Kanban',
|
||
groupTools: 'Herramientas',
|
||
groupPlatform: 'Plataforma',
|
||
gateways: 'Puertas de enlace',
|
||
expand: 'Expandir menú',
|
||
collapse: 'Contraer menú',
|
||
},
|
||
|
||
performance: {
|
||
title: 'Rendimiento',
|
||
subtitle: 'Supervisa recursos del sistema, Bridge Broker, Workers y sesiones activas',
|
||
refresh: 'Actualizar',
|
||
autoRefreshOn: 'Actualización automática',
|
||
autoRefreshOff: 'Actualización manual',
|
||
loadFailed: 'No se pudieron cargar las métricas de rendimiento',
|
||
systemCpu: 'CPU del sistema',
|
||
systemMemory: 'Memoria del sistema',
|
||
activeSessions: 'Sesiones activas',
|
||
runningSessions: 'En ejecución {count}',
|
||
workers: 'Workers',
|
||
totalWorkerMemory: 'Memoria total de Worker',
|
||
processes: 'Procesos',
|
||
uptime: 'Tiempo activo',
|
||
running: 'En ejecución',
|
||
stopped: 'Detenido',
|
||
workerMemory: 'Memoria de Worker',
|
||
lastUpdated: 'Actualizado',
|
||
profile: 'Profile',
|
||
memory: 'Memoria',
|
||
sessions: 'Sesiones',
|
||
runningActiveSessions: 'En ejecución / Activas',
|
||
lastUsed: 'Último uso',
|
||
status: 'Estado',
|
||
noWorkers: 'Sin Workers',
|
||
sessionsByProfile: 'Sesiones por Profile',
|
||
noActiveSessions: 'No hay sesiones activas',
|
||
},
|
||
|
||
// Drawer
|
||
drawer: {
|
||
terminal: 'Terminal',
|
||
files: 'Espacio de trabajo',
|
||
},
|
||
|
||
// Chat
|
||
chat: {
|
||
contextRemaining: 'restante',
|
||
contextClickToEdit: 'Haz clic para editar la longitud del contexto',
|
||
contextEditTitle: 'Editar longitud del contexto',
|
||
contextEditDesc: 'Establecer el límite de longitud del contexto para el modelo actual (en tokens)',
|
||
contextEditPlaceholder: 'Ingresa la longitud del contexto',
|
||
contextEditHint: 'Valores comunes: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)',
|
||
contextEditSave: 'Guardar',
|
||
contextEditCancel: 'Cancelar',
|
||
contextEditInvalid: 'Por favor ingresa una longitud de contexto válida',
|
||
contextEditSuccess: 'Longitud del contexto actualizada',
|
||
contextEditFailed: 'Error en la actualización',
|
||
emptyState: 'Inicia una conversacion con Hermes Agent',
|
||
outlineTitle: 'Esquema de la conversación',
|
||
outlineEmpty: 'Sin contenido de conversación',
|
||
outlineUserQuestion: 'Pregunta del usuario',
|
||
inputPlaceholder: 'Escribe un mensaje... (Enter para enviar, Shift+Enter para nueva linea)',
|
||
slashCommandArgs: {
|
||
message: '<mensaje>',
|
||
title: '<titulo>',
|
||
text: '<texto>',
|
||
},
|
||
slashCommands: {
|
||
usage: 'Calcular el uso de la sesión actual',
|
||
status: 'Mostrar estado de sesión y cola',
|
||
abort: 'Detener la ejecución activa de Bridge',
|
||
queue: 'Poner un mensaje en cola tras la ejecución activa',
|
||
clear: 'Limpiar la vista actual',
|
||
clearHistory: 'Eliminar el historial de mensajes guardado de esta sesión',
|
||
title: 'Renombrar esta sesión',
|
||
compress: 'Ejecutar compresión de contexto cuando esté inactiva',
|
||
steer: 'Enviar texto de guía a la ejecución activa de Bridge',
|
||
destroy: 'Liberar el agente Bridge de esta sesión',
|
||
},
|
||
attachFiles: 'Adjuntar archivos',
|
||
showToolCalls: 'Mostrar llamadas de herramientas',
|
||
hideToolCalls: 'Ocultar llamadas de herramientas',
|
||
messageQueue: 'Cola de mensajes',
|
||
removeQueuedMessage: 'Quitar mensaje de la cola',
|
||
stop: 'Detener',
|
||
send: 'Enviar',
|
||
contextUsed: 'Contexto utilizado:',
|
||
sessions: 'Sesiones',
|
||
webUiSessions: 'Sesiones',
|
||
allProfiles: 'Todos los perfiles',
|
||
profileMissingModelsTip: 'El perfil "{profile}" no tiene proveedor ni modelo disponible para esta sesión',
|
||
sessionScopeHint: 'Chat solo muestra sesiones de Web UI/API Server. Las sesiones de CLI, Telegram, Discord, Cron y otros canales son de solo lectura en Historial.',
|
||
openHistory: 'Abrir historial',
|
||
hermesHistory: 'Historial de Hermes',
|
||
historyScopeHint: 'Sesiones del historial de Hermes del perfil actual, de solo lectura y agrupadas por origen.',
|
||
noSessions: 'Sin sesiones',
|
||
newChat: 'Nuevo chat',
|
||
approvalKicker: 'Permiso de terminal',
|
||
approvalTitle: 'Revisar comando antes de ejecutar',
|
||
approvalAllowOnce: 'Permitir una vez',
|
||
approvalAllowSession: 'Permitir sesión',
|
||
approvalAlways: 'Siempre',
|
||
approvalDeny: 'Denegar',
|
||
deleteSession: 'Eliminar esta sesion?',
|
||
toggleBatchMode: 'Selección por lotes',
|
||
selectAll: 'Seleccionar todo',
|
||
confirmBatchDelete: '¿Eliminar {count} sesiones seleccionadas?',
|
||
batchDeleteSuccess: '{count} sesiones eliminadas',
|
||
batchDeletePartial: '{failed} sesiones fallaron al eliminar',
|
||
batchDeleteFailed: 'Error al eliminar por lotes',
|
||
sessionDeleted: 'Sesion eliminada',
|
||
rename: 'Renombrar',
|
||
pin: 'Fijar',
|
||
unpin: 'Desfijar',
|
||
pinned: 'Fijados',
|
||
chatMode: 'Modo de chat',
|
||
liveMode: 'En vivo',
|
||
liveSessions: 'Sesiones en vivo',
|
||
recentBadge: 'Reciente',
|
||
linkedSessions: '{count} vinculadas',
|
||
noVisibleMessages: 'No hay mensajes visibles para humanos.',
|
||
monitorRoleUser: 'Usuario',
|
||
monitorRoleAssistant: 'Asistente',
|
||
copySessionId: 'Copiar ID de sesión',
|
||
export: 'Exportar',
|
||
exportFull: 'Exportación completa (JSON)',
|
||
exportCompressed: 'Exportación comprimida (TXT)',
|
||
exportCompressing: 'Comprimiendo contexto, espere...',
|
||
exportSuccess: 'Sesión exportada',
|
||
exportFailed: 'Error al exportar',
|
||
renamed: 'Renombrada',
|
||
renameFailed: 'Error al renombrar',
|
||
renameSession: 'Renombrar sesion',
|
||
sessionNotFound: 'Sesion no encontrada',
|
||
enterNewTitle: 'Introduce un nuevo titulo',
|
||
other: 'Otro',
|
||
runFailed: 'Error en la ejecucion',
|
||
error: 'Error',
|
||
tool: 'Herramienta',
|
||
arguments: 'Argumentos',
|
||
result: 'Resultado',
|
||
truncated: '... (truncado)',
|
||
executionDuration: 'Tiempo de ejecución', thinkingLabel: 'Pensamiento',
|
||
thinkingInProgress: 'Pensando…',
|
||
thinkingShow: 'Mostrar pensamiento',
|
||
thinkingHide: 'Ocultar pensamiento',
|
||
thinkingDuration: 'Observado {duration}',
|
||
thinkingChars: '{count} caracteres',
|
||
copyBubble: 'Copiar mensaje',
|
||
copiedBubble: 'Mensaje copiado',
|
||
copyFailed: 'Error al copiar',
|
||
playSpeech: 'Reproducir voz',
|
||
pauseSpeech: 'Pausa',
|
||
resumeSpeech: 'Reanudar',
|
||
stopSpeech: 'Detener',
|
||
speechNotSupported: 'Reproducción de voz no soportada en este navegador',
|
||
searchEnterHint: 'Enter para abrir · Esc para cerrar',
|
||
searchHint: 'Cmd/Ctrl+K',
|
||
searchScope: 'Alcance de búsqueda: solo base de datos local de sesiones de Web UI; no incluye sesiones históricas Hermes de solo lectura.',
|
||
searchFailed: 'No se pudieron buscar sesiones',
|
||
searchNoSnippet: 'No hay resumen disponible',
|
||
searchNoResults: 'No hay sesiones que coincidan',
|
||
searchRecent: 'Sesión reciente',
|
||
searchEmpty: 'Sesiones recientes',
|
||
searchPlaceholder: 'Buscar sesiones...',
|
||
searchSubtitle: 'Buscar por título o contenido de mensajes',
|
||
searchTitle: 'Buscar sesiones',
|
||
stopGateway: 'Detener gateway',
|
||
start: 'Iniciar',
|
||
workspaceSetFailed: 'No se pudo definir el workspace',
|
||
workspaceSet: 'Workspace definido',
|
||
workspacePlaceholder: 'Introduce la ruta del proyecto, p. ej. /home/user/project',
|
||
workspace: 'Espacio de trabajo',
|
||
setWorkspaceTitle: 'Definir workspace de sesión',
|
||
setWorkspace: 'Definir workspace',
|
||
modelSetFailed: 'No se pudo definir el modelo',
|
||
modelSet: 'Modelo definido',
|
||
setModelTitle: 'Definir modelo de sesión',
|
||
setModel: 'Definir modelo',
|
||
newCliChat: 'Nuevo CLI',
|
||
cliEmptyState: 'Iniciar chat CLI',
|
||
autoPlaySpeech: 'Reproducir voz automáticamente',
|
||
},
|
||
|
||
// Jobs
|
||
jobs: {
|
||
title: 'Tareas programadas',
|
||
createJob: 'Crear tarea',
|
||
editJob: 'Editar tarea',
|
||
noJobs: 'No hay tareas programadas aun. Crea una para comenzar.',
|
||
name: 'Nombre',
|
||
namePlaceholder: 'Nombre de la tarea',
|
||
schedule: 'Programacion (expresion Cron)',
|
||
schedulePlaceholder: 'ej. 0 9 * * *',
|
||
quickPresets: 'Presets rapidos',
|
||
selectPreset: 'Seleccionar un preset...',
|
||
presetEveryMinute: 'Cada minuto',
|
||
presetEvery5Min: 'Cada 5 minutos',
|
||
presetEveryHour: 'Cada hora',
|
||
presetEveryDay: 'Todos los dias a las 00:00',
|
||
presetEveryDay9: 'Todos los dias a las 09:00',
|
||
presetEveryMonday: 'Cada lunes a las 09:00',
|
||
presetEveryMonth: 'El dia 1 de cada mes a las 09:00',
|
||
prompt: 'Prompt',
|
||
promptPlaceholder: 'El prompt a ejecutar',
|
||
deliverTarget: 'Destino de entrega',
|
||
origin: 'Origen',
|
||
local: 'Local',
|
||
repeatCount: 'Repeticiones (opcional)',
|
||
modelPlaceholder: 'Modelo por defecto',
|
||
repeatPlaceholder: 'Dejar vacio para infinito',
|
||
jobCreated: 'Tarea creada',
|
||
jobUpdated: 'Tarea actualizada',
|
||
nameRequired: 'El nombre es obligatorio',
|
||
scheduleRequired: 'La programacion es obligatoria',
|
||
loadFailed: 'Error al cargar la tarea',
|
||
jobPaused: 'Tarea en pausa',
|
||
jobResumed: 'Tarea reanudada',
|
||
jobTriggered: 'Job ejecutado',
|
||
modelUpdated: 'Modelo actualizado',
|
||
jobDeleted: 'Tarea eliminada',
|
||
status: {
|
||
running: 'En ejecucion',
|
||
paused: 'En pausa',
|
||
disabled: 'Desactivada',
|
||
scheduled: 'Programada',
|
||
},
|
||
info: {
|
||
model: 'Modelo',
|
||
schedule: 'Programacion',
|
||
lastRun: 'Ultima ejecucion',
|
||
nextRun: 'Proxima ejecucion',
|
||
deliver: 'Entrega',
|
||
repeat: 'Repeticion',
|
||
},
|
||
action: {
|
||
pause: 'Pausar',
|
||
pauseJob: 'Pausar tarea',
|
||
resume: 'Reanudar',
|
||
resumeJob: 'Reanudar tarea',
|
||
runNow: 'Ejecutar ahora',
|
||
triggerImmediately: 'Ejecutar inmediatamente',
|
||
},
|
||
runHistory: {
|
||
title: 'Historial',
|
||
runs: 'ejecuciones',
|
||
noRuns: 'No se encontró historial.',
|
||
},
|
||
},
|
||
|
||
// Skills
|
||
skills: {
|
||
title: 'Habilidades',
|
||
searchPlaceholder: 'Buscar habilidades...',
|
||
noMatch: 'Ninguna habilidad coincide con tu busqueda',
|
||
noSkills: 'No se encontraron habilidades',
|
||
backTo: 'Volver a',
|
||
attachedFiles: 'Archivos adjuntos',
|
||
loadFailed: 'Error al cargar la habilidad',
|
||
fileLoadFailed: 'Error al cargar el archivo',
|
||
modified: 'Modificado por el usuario',
|
||
archived: 'Archivado',
|
||
pinned: 'Fijado',
|
||
pin: 'Fijar habilidad',
|
||
unpin: 'Desfijar habilidad',
|
||
pinFailed: 'Error al cambiar estado de fijacion',
|
||
toggleFailed: 'Error al activar/desactivar la habilidad',
|
||
source: {
|
||
builtin: 'Integrado',
|
||
hub: 'Hub',
|
||
local: 'Local',
|
||
},
|
||
},
|
||
|
||
// Plugins
|
||
plugins: {
|
||
title: 'Plugins',
|
||
refresh: 'Actualizar',
|
||
notice: 'Inventario de solo lectura de manifests de plugins Hermes detectables. Los metadatos de descubrimiento se leen sin cargar código de plugins. En v1, la gestión permanece en CLI; los cambios se aplican en nuevas sesiones Hermes.',
|
||
loadFailed: 'No se pudieron cargar los plugins',
|
||
commandCopied: 'Comando copiado',
|
||
searchPlaceholder: 'Buscar key, nombre, descripción, ruta...',
|
||
source: 'Origen',
|
||
kind: 'Tipo',
|
||
statusTitle: 'Estado',
|
||
configStatus: 'config: {status}',
|
||
notAvailable: 'n/a',
|
||
copyCommand: 'Copiar comando',
|
||
managedElsewhere: 'gestionado en otro lugar',
|
||
noMatch: 'Ningún plugin coincide con los filtros actuales',
|
||
enabled: 'activado',
|
||
disabled: 'desactivado',
|
||
summary: {
|
||
total: 'Total',
|
||
active: 'Activado / auto',
|
||
inactive: 'Inactivo',
|
||
disabled: 'Desactivado',
|
||
providerManaged: 'Gestionado por provider',
|
||
},
|
||
status: {
|
||
enabled: 'Activado',
|
||
'auto-active': 'Autoactivo',
|
||
inactive: 'Inactivo',
|
||
disabled: 'Desactivado',
|
||
'provider-managed': 'Gestionado por provider',
|
||
},
|
||
statusLabel: {
|
||
enabled: 'Activado por configuración',
|
||
'auto-active': 'Autoactivo',
|
||
inactive: 'Inactivo',
|
||
disabled: 'Desactivado',
|
||
'provider-managed': 'Gestionado por provider',
|
||
},
|
||
configStatuses: {
|
||
enabled: 'activado',
|
||
disabled: 'desactivado',
|
||
'not-enabled': 'no activado',
|
||
auto: 'auto',
|
||
'provider-managed': 'gestionado por provider',
|
||
},
|
||
table: {
|
||
plugin: 'Plugin',
|
||
status: 'Estado',
|
||
source: 'Origen',
|
||
kind: 'Tipo',
|
||
capabilities: 'Capacidades',
|
||
path: 'Ruta / entrypoint',
|
||
cli: 'CLI',
|
||
},
|
||
capabilities: {
|
||
tools: '{count} herramientas',
|
||
hooks: '{count} hooks',
|
||
env: '{count} env',
|
||
},
|
||
metadata: {
|
||
agentRoot: 'Raíz del agente',
|
||
python: 'Python',
|
||
scanCwd: 'Escanear cwd',
|
||
projectPlugins: 'Plugins del proyecto',
|
||
},
|
||
},
|
||
|
||
// Memory
|
||
memory: {
|
||
title: 'Memoria',
|
||
refresh: 'Actualizar',
|
||
loadFailed: 'Error al cargar la memoria',
|
||
myNotes: 'Mis notas',
|
||
noNotes: 'Sin notas aun.',
|
||
notesPlaceholder: 'Escribe tus notas...',
|
||
userProfile: 'Perfil de usuario',
|
||
noProfile: 'Sin perfil aun.',
|
||
profilePlaceholder: 'Escribe tu perfil...',
|
||
soul: 'Alma',
|
||
noSoul: 'Sin configuracion de alma aun.',
|
||
soulPlaceholder: 'Escribe la configuracion del alma...',
|
||
},
|
||
|
||
// Models
|
||
models: {
|
||
title: 'Modelos',
|
||
addProvider: 'Anadir proveedor',
|
||
providerType: 'Tipo de proveedor',
|
||
preset: 'Preajuste',
|
||
custom: 'Personalizado',
|
||
selectProvider: 'Seleccionar proveedor',
|
||
chooseProvider: 'Elige un proveedor...',
|
||
name: 'Nombre',
|
||
autoGeneratedName: 'Generado automaticamente desde la URL base',
|
||
baseUrl: 'URL base',
|
||
region: 'Región',
|
||
regionIntl: 'Internacional',
|
||
regionCn: 'China continental',
|
||
baseUrlPlaceholder: 'ej. https://api.example.com/v1',
|
||
apiKey: 'Clave API',
|
||
apiKeyPlaceholder: 'sk-...',
|
||
defaultModel: 'Modelo predeterminado',
|
||
selectOrInput: 'Seleccionar o ingresar un modelo...',
|
||
selectModel: 'Seleccionar un modelo...',
|
||
providerAdded: 'Proveedor anadido',
|
||
providerDeleted: 'Proveedor eliminado',
|
||
deleteProvider: 'Eliminar proveedor',
|
||
deleteConfirm: 'Estas seguro de que quieres eliminar "{name}"?',
|
||
codexLoginTitle: 'Inicio de sesión de OpenAI Codex',
|
||
codexWaiting: 'Ingrese este código en la página de autorización para iniciar sesión:',
|
||
codexCopyCode: 'Código copiado',
|
||
codexOpenLink: 'Abrir página de autorización',
|
||
codexApproved: 'Inicio de sesión exitoso',
|
||
codexExpired: 'La autorización ha expirado. Por favor, inténtelo de nuevo.',
|
||
nousLoginTitle: 'Inicio de sesión de Nous Portal',
|
||
nousWaiting: 'Ingrese este código en la página de autorización:',
|
||
nousCopyCode: 'Código copiado',
|
||
nousOpenLink: 'Abrir página de autorización',
|
||
nousApproved: 'Inicio de sesión exitoso',
|
||
nousDenied: 'Autorización denegada',
|
||
nousExpired: 'Autorización expirada',
|
||
copilotLoginTitle: 'Inicio de sesión de GitHub Copilot',
|
||
copilotWaiting: 'Abra GitHub e introduzca el código de dispositivo a continuación para autorizar. La ventana se cerrará automáticamente tras la aprobación.',
|
||
copilotCopyCode: 'Código copiado',
|
||
copilotOpenLink: 'Abrir la página de autorización de GitHub',
|
||
copilotApproved: '¡Inicio de sesión exitoso!',
|
||
copilotDenied: 'Autorización denegada.',
|
||
copilotExpired: 'El enlace de autorización ha caducado. Vuelva a intentarlo.',
|
||
copilotAddDetectedTitle: 'GitHub Copilot detectado',
|
||
copilotAddDetected: 'Se detectó un token OAuth de GitHub Copilot en este equipo. Haz clic en Agregar para habilitar Copilot en Hermes.',
|
||
copilotAddSourceEnv: 'Origen: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)',
|
||
copilotAddSourceGhCli: 'Origen: gh CLI (gh auth token)',
|
||
copilotAddSourceAppsJson: 'Origen: extensión Copilot de VS Code (apps.json)',
|
||
copilotDeleteHintEnv: 'Esto borrará COPILOT_GITHUB_TOKEN en ~/.hermes/.env. Otras herramientas no se verán afectadas.',
|
||
copilotDeleteHintGhCli: 'Copilot se ocultará de Hermes. Tu sesión de gh CLI no se verá afectada — `gh auth status` seguirá mostrando que estás conectado.',
|
||
copilotDeleteHintAppsJson: 'Copilot se ocultará de Hermes. La extensión Copilot de VS Code seguirá conectada.',
|
||
customBadge: 'PERSONALIZADO',
|
||
previewBadge: 'VISTA PREVIA',
|
||
disabledBadge: 'NO DISPONIBLE',
|
||
disabledTooltip: "Este modelo no está disponible para tu cuenta.",
|
||
customModelPlaceholder: 'ID de modelo no listado',
|
||
customModelHint: 'Para modelos compatibles con el proveedor que la API no devuelve; no es un cambio de nombre visible. Enter para cargar.',
|
||
noProviders: 'No se encontraron proveedores. Anade un proveedor personalizado para comenzar.',
|
||
clearVisibleModels: 'Borrar selección',
|
||
currentDefault: 'Predeterminado actual',
|
||
defaultShort: 'Predeterminado',
|
||
builtIn: 'Integrado',
|
||
customType: 'Personalizado',
|
||
provider: 'Proveedor',
|
||
contextLength: 'Longitud del contexto',
|
||
contextLengthPlaceholder: 'ej. 200000 (opcional)',
|
||
local: 'Local ({host})',
|
||
selectProviderRequired: 'Por favor, selecciona un proveedor',
|
||
baseUrlRequired: 'La URL base es obligatoria',
|
||
apiKeyRequired: 'La clave API es obligatoria',
|
||
modelRequired: 'El modelo predeterminado es obligatorio',
|
||
enterBaseUrl: 'Por favor, introduce primero la URL base',
|
||
unexpectedFormat: 'Formato de respuesta inesperado',
|
||
foundModels: '{count} modelos encontrados',
|
||
fetchFailed: 'Error al obtener los modelos',
|
||
xaiWaiting: 'Completa la autorización en la página de xAI abierta. La ventana se cerrará automáticamente al aprobarse.',
|
||
xaiOpenLink: 'Abrir página de autorización de xAI',
|
||
xaiLoginTitle: 'Inicio de sesión OAuth de xAI Grok',
|
||
xaiExpired: 'El enlace de autorización expiró. Inténtalo de nuevo.',
|
||
xaiCopyLink: 'Copiar enlace de autorización',
|
||
xaiApproved: '¡Inicio de sesión correcto!',
|
||
visibilitySelectOne: 'Mantén al menos un modelo visible',
|
||
visibilitySaved: 'Modelos visibles guardados',
|
||
visibilitySaveFailed: 'No se pudieron guardar los modelos visibles',
|
||
visibilityHint: 'Solo afecta al selector de modelos y a la página de modelos de Web UI. No modifica la configuración provider/model de Hermes CLI; las llamadas siguen usando el ID original del modelo.',
|
||
showAllModels: 'Mostrar todos los modelos',
|
||
searchPlaceholder: 'Buscar modelos...',
|
||
removeCustomModel: 'Eliminar este modelo no listado',
|
||
more: 'más',
|
||
models: 'Lista de modelos',
|
||
manageVisibleModelsFor: 'Gestionar modelos visibles de {name}',
|
||
manageVisibleModels: 'Gestionar modelos visibles',
|
||
getApiKey: 'Obtener API Key',
|
||
count: 'modelos',
|
||
aliasUseOriginal: 'Restaurar ID original',
|
||
aliasTitleFor: 'Nombre visible de {model}',
|
||
aliasTitle: 'Nombre visible del modelo',
|
||
aliasSaveFailed: 'No se pudo guardar el nombre visible',
|
||
aliasPlaceholder: 'Dejar vacío para usar el ID original del modelo',
|
||
aliasManageFor: 'Nombres visibles de {provider}',
|
||
aliasManage: 'Nombres visibles',
|
||
aliasHint: 'Solo cambia el nombre visible en Web UI. Hermes sigue recibiendo el ID original del modelo.',
|
||
aliasEdit: 'Renombrar',
|
||
aliasCanonical: 'ID original: {model}',
|
||
},
|
||
|
||
// Profiles
|
||
profiles: {
|
||
title: 'Perfiles',
|
||
create: 'Crear perfil',
|
||
import: 'Importar',
|
||
export: 'Exportar',
|
||
rename: 'Renombrar',
|
||
delete: 'Eliminar',
|
||
switchTo: 'Cambiar a',
|
||
switchConfirm: 'Cambiar al perfil "{name}" reiniciara la pasarela. Continuar?',
|
||
switchSuccess: 'Se ha cambiado al perfil "{name}"',
|
||
switchFailed: 'Error al cambiar de perfil. Es posible que la pasarela necesite un reinicio manual.',
|
||
createSuccess: 'Perfil "{name}" creado',
|
||
createFailed: 'Error al crear el perfil',
|
||
renameSuccess: 'Perfil renombrado',
|
||
renameFailed: 'Error al renombrar el perfil',
|
||
deleteConfirm: 'Estas seguro de que quieres eliminar el perfil "{name}"?',
|
||
deleteSuccess: 'Perfil eliminado',
|
||
deleteFailed: 'Error al eliminar el perfil',
|
||
exportSuccess: 'Perfil exportado',
|
||
exportFailed: 'Error al exportar el perfil',
|
||
importSuccess: 'Perfil importado',
|
||
importFailed: 'Error al importar el perfil',
|
||
importSelectFile: 'Seleccionar archivo de archivo',
|
||
importInvalidFile: 'Por favor, selecciona un archivo valido (.tar.gz, .tgz, .gz, .zip)',
|
||
name: 'Nombre del perfil',
|
||
namePlaceholder: 'Solo letras, numeros y guiones',
|
||
nameValidation: 'El nombre del perfil solo puede contener letras minúsculas, números, guiones bajos y guiones',
|
||
newName: 'Nuevo nombre',
|
||
newNamePlaceholder: 'Introduce un nuevo nombre',
|
||
cloneFromCurrent: 'Clonar desde el perfil actual',
|
||
cloneCleanupNotice: 'Al clonar se omiten automáticamente las credenciales exclusivas de plataforma (Weixin / Telegram / Slack, etc.) para evitar conflictos con el perfil de origen',
|
||
cloneStrippedCredentials: 'Se eliminaron {count} credenciales exclusivas: {list}',
|
||
cloneDisabledPlatforms: 'Se deshabilitaron {count} plataforma(s): {list}',
|
||
cloneStrippedConfigCredentials: 'Se eliminaron {count} credencial(es) integradas de config.yaml: {list}',
|
||
archivePath: 'Ruta del archivo',
|
||
archivePathPlaceholder: 'Ruta del servidor al archivo de archivo',
|
||
importName: 'Nombre del perfil (opcional)',
|
||
importNamePlaceholder: 'Dejar vacio para usar el nombre del archivo',
|
||
active: 'Activo',
|
||
model: 'Modelo',
|
||
gateway: 'Pasarela',
|
||
alias: 'Alias',
|
||
provider: 'Proveedor',
|
||
path: 'Ruta',
|
||
skills: 'Habilidades',
|
||
hasEnv: 'Tiene .env',
|
||
hasSoulMd: 'Tiene soul.md',
|
||
noProfiles: 'No se encontraron perfiles. Crea uno para comenzar.',
|
||
avatar: {
|
||
title: 'Avatar personalizado',
|
||
customize: 'Personalizar avatar',
|
||
upload: 'Subir imagen',
|
||
random: 'Generar aleatorio',
|
||
reset: 'Restaurar predeterminado',
|
||
hint: 'PNG, JPEG o WebP, máximo 1 MB',
|
||
invalidType: 'Elige una imagen PNG, JPEG o WebP',
|
||
tooLarge: 'La imagen del avatar no puede superar 1 MB',
|
||
saveSuccess: 'Avatar guardado',
|
||
saveFailed: 'No se pudo guardar el avatar',
|
||
resetSuccess: 'Avatar predeterminado restaurado',
|
||
resetFailed: 'No se pudo restaurar el avatar predeterminado',
|
||
},
|
||
runtime: {
|
||
activeProfile: 'Actual: {name}',
|
||
bridgeWorker: 'Estado del Bridge',
|
||
gateway: 'Puerta de enlace',
|
||
active: 'Activo',
|
||
activeTag: 'Actual',
|
||
idle: 'Inactivo',
|
||
running: 'En ejecución',
|
||
stopped: 'Detenido',
|
||
restartGateway: 'Reiniciar gateway',
|
||
restartProfile: 'Reiniciar perfil',
|
||
switchProfile: 'Cambiar perfil',
|
||
gatewayRestarted: 'Gateway reiniciado: {name}',
|
||
gatewayRestartFailed: 'No se pudo reiniciar el gateway',
|
||
profileRestarted: 'Perfil reiniciado: {name}',
|
||
profileRestartFailed: 'No se pudo reiniciar el perfil',
|
||
},
|
||
},
|
||
|
||
// Logs
|
||
logs: {
|
||
title: 'Registros',
|
||
all: 'Todos',
|
||
searchPlaceholder: 'Buscar...',
|
||
refresh: 'Actualizar',
|
||
noEntries: 'Sin entradas de registro',
|
||
},
|
||
|
||
// Settings
|
||
settings: {
|
||
title: 'Configuracion',
|
||
saved: 'Guardado',
|
||
saveFailed: 'Error al guardar',
|
||
tabs: {
|
||
display: 'Pantalla',
|
||
account: 'Cuenta',
|
||
agent: 'Agente',
|
||
memory: 'Memoria',
|
||
compression: 'Compresion',
|
||
session: 'Sesion',
|
||
privacy: 'Privacidad',
|
||
apiServer: 'Servidor API',
|
||
models: 'Modelos',
|
||
voice: 'Voz',
|
||
},
|
||
display: {
|
||
streaming: 'Respuestas en streaming',
|
||
streamingHint: 'Mostrar respuestas de la IA en tiempo real',
|
||
compact: 'Modo compacto',
|
||
compactHint: 'Reducir el espaciado entre mensajes',
|
||
showReasoning: 'Mostrar razonamiento',
|
||
showReasoningHint: 'Mostrar el proceso de pensamiento del modelo',
|
||
showCost: 'Mostrar costo',
|
||
showCostHint: 'Mostrar uso de tokens en las respuestas',
|
||
inlineDiffs: 'Diffs en linea',
|
||
inlineDiffsHint: 'Mostrar cambios de codigo en linea',
|
||
bellOnComplete: 'Sonido de finalizacion',
|
||
bellOnCompleteHint: 'Reproducir un sonido cuando la IA termina',
|
||
busyInputMode: 'Modo de entrada ocupada',
|
||
busyInputModeHint: 'Permitir entrada mientras la IA procesa',
|
||
theme: 'Tema',
|
||
themeHint: 'Elige claro, oscuro o seguir la preferencia del sistema',
|
||
themeLight: 'Claro',
|
||
themeDark: 'Oscuro',
|
||
themeSystem: 'Sistema',
|
||
},
|
||
agent: {
|
||
maxTurns: 'Turnos maximos',
|
||
maxTurnsHint: 'Rondas maximas de interaccion por conversacion',
|
||
gatewayTimeout: 'Tiempo de espera de la pasarela',
|
||
gatewayTimeoutHint: 'Tiempo de espera de la peticion en segundos',
|
||
restartDrainTimeout: 'Tiempo de drenado al reiniciar',
|
||
restartDrainTimeoutHint: 'Tiempo de drenado antes de reiniciar en segundos',
|
||
toolEnforcement: 'Aplicacion de herramientas',
|
||
toolEnforcementHint: 'Controlar el modo de ejecucion de llamadas a herramientas',
|
||
auto: 'Automatico',
|
||
always: 'Siempre',
|
||
never: 'Nunca',
|
||
},
|
||
memory: {
|
||
enabled: 'Activar memoria',
|
||
enabledHint: 'Permitir que la IA recuerde el contexto de la conversacion',
|
||
userProfile: 'Perfil de usuario',
|
||
userProfileHint: 'Permitir que la IA recuerde las preferencias del usuario',
|
||
charLimit: 'Limite de caracteres de memoria',
|
||
charLimitHint: 'Maximo de caracteres para MEMORY.md',
|
||
userCharLimit: 'Limite de caracteres del perfil de usuario',
|
||
userCharLimitHint: 'Maximo de caracteres para USER.md',
|
||
},
|
||
compression: {
|
||
enabled: 'Activar compresion',
|
||
enabledHint: 'Comprimir automaticamente el historial largo antes de superar el contexto del modelo',
|
||
threshold: 'Umbral de compresion',
|
||
thresholdHint: 'Iniciar compresion cuando los tokens estimados superen esta proporcion del contexto',
|
||
targetRatio: 'Proporcion objetivo',
|
||
targetRatioHint: 'Tamano objetivo del historial tras comprimir como proporcion del contexto',
|
||
protectLastN: 'Proteger mensajes recientes',
|
||
protectLastNHint: 'Mantener sin comprimir esta cantidad de mensajes recientes',
|
||
protectFirstN: 'Proteger primeros mensajes',
|
||
protectFirstNHint: 'Mantener sin comprimir esta cantidad de mensajes iniciales',
|
||
},
|
||
session: {
|
||
mode: 'Modo de reinicio',
|
||
modeHint: 'Condicion de activacion del reinicio de sesion',
|
||
modeBoth: 'Inactividad + Programado',
|
||
modeIdle: 'Solo inactividad',
|
||
modeDaily: 'Solo programado',
|
||
modeNone: 'Nunca (solo manual)',
|
||
idleMinutes: 'Tiempo de inactividad',
|
||
idleMinutesHint: 'Tiempo de espera antes del reinicio automatico (minutos)',
|
||
atHour: 'Hora de reinicio programado',
|
||
humanOnly: 'Mostrar solo sesiones humanas',
|
||
humanOnlyHint: 'Oculta por defecto el ruido de subagentes y del monitor de sesiones',
|
||
liveMonitorHumanOnly: 'Monitor en vivo: mostrar solo sesiones humanas',
|
||
liveMonitorHumanOnlyHint: 'Oculta por defecto el ruido de subagentes y del monitor de sesiones en el monitor en vivo',
|
||
atHourHint: 'Reiniciar sesion a esta hora todos los dias',
|
||
requireAuth: 'Autorización de sesión',
|
||
requireAuthHint: 'Requiere autorización para operaciones de sesión',
|
||
},
|
||
privacy: {
|
||
redactPii: 'Ocultar informacion personal',
|
||
redactPiiHint: 'Detectar y ocultar automaticamente informacion sensible (contrasenas, claves, etc.)',
|
||
},
|
||
apiServer: {
|
||
enable: 'Activar',
|
||
enableHint: 'Activar servidor API',
|
||
host: 'Host',
|
||
hostHint: 'Direccion de escucha',
|
||
port: 'Puerto',
|
||
portHint: 'Puerto de escucha',
|
||
key: 'Clave',
|
||
keyHint: 'Clave de acceso API',
|
||
cors: 'Origenes CORS',
|
||
corsHint: 'Fuentes cross-origin permitidas',
|
||
},
|
||
voice: {
|
||
ttsProvider: 'Proveedor TTS',
|
||
ttsProviderHint: 'Elija el motor de texto a voz para la reproduccion de mensajes',
|
||
providerWebSpeech: 'WebSpeech API (Navegador)',
|
||
providerOpenai: 'OpenAI TTS',
|
||
providerCustom: 'Endpoint personalizado (compatible con OpenAI)',
|
||
providerEdge: 'Edge TTS (Gratuito, sin clave API)',
|
||
|
||
// WebSpeech
|
||
webspeechVoice: 'Voz',
|
||
webspeechVoiceHint: 'Seleccione una voz de su navegador o sistema operativo',
|
||
webspeechVoicePlaceholder: 'Auto (voz predeterminada)',
|
||
|
||
// OpenAI
|
||
openaiKey: 'Clave API',
|
||
openaiKeyHint: 'Su clave API de OpenAI con acceso TTS',
|
||
openaiUrl: 'URL base de API',
|
||
openaiUrlHint: 'ej. https://api.openai.com/v1/audio/speech',
|
||
openaiModel: 'Modelo',
|
||
openaiModelHint: 'tts-1 (mas rapido) / tts-1-hd (mayor calidad)',
|
||
openaiVoice: 'Voz',
|
||
openaiVoiceHint: 'Voz a utilizar para la sintesis',
|
||
|
||
// Custom endpoint
|
||
customHint: 'Utilice cualquier API TTS compatible con OpenAI — funciona con GPT-SoVITS, CosyVoice, etc.',
|
||
customUrl: 'URL de API',
|
||
customUrlHint: 'URL base de su servicio TTS',
|
||
customUrlPlaceholder: 'Direccion configurada en el adaptador local, ej. http://127.0.0.1:9880',
|
||
customApiKey: 'Clave API (opcional)',
|
||
customApiKeyHint: 'Algunos endpoints personalizados requieren autenticacion',
|
||
customApiKeyPlaceholder: 'Dejar en blanco si no es necesario',
|
||
|
||
// Edge TTS
|
||
edgeHint: 'Impulsado por Microsoft Edge TTS (node-edge-tts).',
|
||
edgeUrl: 'URL del adaptador',
|
||
edgeUrlHint: 'Direccion del adaptador Edge TTS, ej. http://127.0.0.1:9882',
|
||
edgeUrlPlaceholder: 'http://127.0.0.1:9882',
|
||
edgeVoice: 'Voz',
|
||
edgeVoiceHint: 'Seleccione una voz para la sintesis de voz',
|
||
edgeRate: 'Velocidad',
|
||
edgeRateHint: 'Ajustar velocidad del habla (0.5x ~ 2.0x)',
|
||
edgePitch: 'Tono',
|
||
edgePitchHint: 'Ajustar tono del habla (-20 ~ +20 Hz)',
|
||
|
||
// Test
|
||
testTitle: 'Prueba de voz',
|
||
testText: 'Texto de prueba',
|
||
testTextPlaceholder: 'Ingrese texto para probar...',
|
||
testTextDefault: 'Hola, esta es una prueba de voz.',
|
||
testButton: 'Probar',
|
||
testButtonPlaying: 'Reproduciendo...',
|
||
testFailed: 'Prueba fallida: {error}',
|
||
|
||
// MiMo TTS
|
||
providerMimo: 'MiMo TTS',
|
||
mimoHint: 'Xiaomi MiMo TTS — voces predefinidas, diseño de voz y clonación de voz',
|
||
mimoApiKey: 'Clave API',
|
||
mimoApiKeyHint: 'Obtenga su clave en platform.xiaomimimo.com',
|
||
mimoApiKeyPlaceholder: 'Clave API MiMo',
|
||
mimoBaseUrl: 'URL base',
|
||
mimoBaseUrlHint: 'URL del endpoint de la API MiMo',
|
||
mimoModel: 'Modelo',
|
||
mimoModelHint: 'Seleccione el modelo de síntesis de voz',
|
||
mimoModelPreset: 'Voces predefinidas',
|
||
mimoModelVoiceDesign: 'Diseño de voz',
|
||
mimoModelVoiceClone: 'Clonación de voz',
|
||
mimoVoice: 'Voz',
|
||
mimoVoiceHint: 'Seleccione una voz predefinida',
|
||
mimoVoiceDesignPrompt: 'Descripción de voz',
|
||
mimoVoiceDesignPromptHint: 'Describa las características de voz deseadas',
|
||
mimoVoiceDesignPromptPlaceholder: 'Ej: Una voz femenina cálida y joven, algo lenta, con tono magnético',
|
||
mimoCloneAudio: 'Subir audio',
|
||
mimoCloneAudioHint: 'Suba una muestra de audio para clonación (mp3/wav, máx. 10 MB)',
|
||
mimoCloneAudioUpload: 'Elegir archivo',
|
||
mimoCloneAudioClear: 'Borrar',
|
||
mimoStylePrompt: 'Indicador de estilo',
|
||
mimoStylePromptHint: 'Opcional — describa el estilo de habla en lenguaje natural',
|
||
mimoStylePromptPlaceholder: 'Ej: Tono brillante y animado, ritmo rápido',
|
||
},
|
||
lockedIps: {
|
||
title: 'IPs bloqueadas',
|
||
count: '{count} bloqueadas',
|
||
empty: 'Sin IPs bloqueadas',
|
||
unlock: 'Desbloquear',
|
||
unlockAll: 'Desbloquear todo',
|
||
unlockAllConfirm: 'Desbloquear todas las IPs?',
|
||
unlocked: 'IP desbloqueada',
|
||
allUnlocked: '{count} IPs desbloqueadas',
|
||
},
|
||
models: {
|
||
apiKey: 'API Key',
|
||
apiKeyPlaceholder: 'Introduce API Key',
|
||
noProviders: 'No hay proveedores configurados',
|
||
save: 'Guardar',
|
||
saveFailed: 'Error al guardar',
|
||
saved: 'Guardado',
|
||
},
|
||
},
|
||
|
||
// Platform channel settings
|
||
platform: {
|
||
requireMention: "Requerir mencion {'@'}",
|
||
requireMentionGroup: "Requerir mencion {'@'} en grupos para responder",
|
||
requireMentionChannel: "Requerir mencion {'@'} en canales para responder",
|
||
requireMentionRoom: "Requerir mencion {'@'} en salas para responder",
|
||
reactions: 'Reacciones',
|
||
reactionsHint: 'Reaccionar a mensajes con emoji',
|
||
freeResponseChats: 'Chats de respuesta libre',
|
||
freeResponseChatsHint: "IDs de chats que responden sin mencion {'@'} (separados por comas)",
|
||
freeResponseChannels: 'Canales de respuesta libre',
|
||
freeResponseChannelsHint: "IDs de canales que responden sin mencion {'@'} (separados por comas)",
|
||
freeResponseRooms: 'Salas de respuesta libre',
|
||
freeResponseRoomsHint: "IDs de salas que responden sin mencion {'@'} (separados por comas)",
|
||
mentionPatterns: 'Patrones de mencion personalizados',
|
||
mentionPatternsHint: 'Patrones de activacion adicionales',
|
||
autoThread: 'Hilo automatico',
|
||
autoThreadHint: "Crear automaticamente hilos de respuesta despues de mencion {'@'}",
|
||
autoThreadHintRoom: 'Crear automaticamente hilos de respuesta en salas',
|
||
dmMentionThreads: 'Hilos de mencion en MD',
|
||
dmMentionThreadsHint: 'Usar hilos de respuesta para menciones en mensajes directos',
|
||
allowBots: 'Permitir mensajes de bots',
|
||
allowBotsHint: 'Responder a mensajes de otros bots',
|
||
allowedChannels: 'Canales permitidos',
|
||
allowedChannelsHint: 'Lista blanca de IDs de canales (separados por comas)',
|
||
ignoredChannels: 'Canales ignorados',
|
||
ignoredChannelsHint: 'Canales donde el bot nunca responde (separados por comas)',
|
||
noThreadChannels: 'Canales sin hilo',
|
||
noThreadChannelsHint: 'Canales donde el bot responde sin hilos (separados por comas)',
|
||
exclusiveTokenWarning: 'Esta plataforma usa bloqueo exclusivo de token. Cada perfil debe usar un token de identidad distinto para evitar conflictos con otros perfiles.',
|
||
botToken: 'Token del bot',
|
||
botTokenHint: 'Token del bot del portal de desarrolladores',
|
||
accessToken: 'Token de acceso',
|
||
accessTokenHint: 'Token de acceso de Matrix',
|
||
homeserver: 'URL del homeserver',
|
||
homeserverHint: 'URL del homeserver de Matrix',
|
||
appId: 'ID de aplicacion',
|
||
appIdHint: 'ID de aplicacion de Feishu',
|
||
appSecret: 'Secreto de aplicacion',
|
||
appSecretHint: 'Secreto de aplicacion de Feishu',
|
||
clientId: 'ID de cliente',
|
||
clientIdHint: 'ID de cliente de DingTalk',
|
||
clientSecret: 'Secreto de cliente',
|
||
clientSecretHint: 'Secreto de cliente de DingTalk',
|
||
botId: 'ID del bot',
|
||
botIdHint: 'ID del bot de WeCom',
|
||
wecomSecretHint: 'Secreto del bot de WeCom',
|
||
waEnabled: 'Activar WhatsApp',
|
||
waEnabledHint: 'Activar WhatsApp mediante emparejamiento por codigo QR',
|
||
weixinToken: 'Token de Weixin',
|
||
weixinTokenHint: 'Desde el inicio de sesion QR de la CLI de weixin (hermes weixin)',
|
||
accountId: 'ID de cuenta',
|
||
accountIdHint: 'ID de cuenta de Weixin',
|
||
qrLogin: 'Inicio de sesion QR',
|
||
qrRelogin: 'Volver a iniciar sesion',
|
||
qrFetching: 'Obteniendo codigo QR...',
|
||
qrScanHint: 'Escanea con WeChat para iniciar sesion',
|
||
qrScanedHint: 'Escaneado, por favor confirma en el telefono...',
|
||
qqSandboxHint: 'Habilitar entorno sandbox (para pruebas)',
|
||
qqSandbox: 'Modo sandbox',
|
||
qqQrScanHint: 'Escanea el código QR con QQ o abre el enlace en el teléfono para completar la vinculación',
|
||
qqMarkdownHint: 'Habilitar mensajes con formato Markdown (algunos clientes pueden no soportarlo)',
|
||
qqMarkdown: 'Soporte Markdown',
|
||
qqAppSecretHint: 'App Secret del bot de QQ Open Platform',
|
||
qqAppSecret: 'App Secret',
|
||
qqAppIdHint: 'App ID del bot de QQ Open Platform',
|
||
qqAppId: 'App ID',
|
||
allowedUsersHint: 'Lista blanca de IDs de usuario u OpenID, separados por comas',
|
||
allowedUsers: 'Usuarios permitidos',
|
||
allowAllUsersHint: 'Permite mensajes de cualquier usuario; desactívalo para usar la lista blanca',
|
||
allowAllUsers: 'Permitir todos los usuarios',
|
||
},
|
||
|
||
// Language
|
||
language: {
|
||
label: 'Idioma',
|
||
zh: '中文',
|
||
en: 'English',
|
||
es: 'Espanol',
|
||
},
|
||
|
||
// Terminal
|
||
terminal: {
|
||
sessions: 'Sesiones',
|
||
newTab: 'Nueva terminal',
|
||
closeSession: 'Cerrar esta sesion?',
|
||
sessionExited: 'Finalizada',
|
||
processExited: 'Proceso finalizado con codigo {code}',
|
||
noSessions: 'No hay sesiones de terminal',
|
||
connectionFailed: 'No se pudo conectar al terminal',
|
||
connectionError: 'Error de conexión',
|
||
connectionClosed: 'Conexión cerrada',
|
||
},
|
||
|
||
// Usage
|
||
usage: {
|
||
title: 'Estadisticas de uso',
|
||
refresh: 'Actualizar',
|
||
totalTokens: 'Total de tokens',
|
||
inputTokens: 'Entrada',
|
||
outputTokens: 'Salida',
|
||
totalSessions: 'Total de sesiones',
|
||
avgPerDay: '~{n}/dia de promedio',
|
||
estimatedCost: 'Costo est.',
|
||
cacheHitRate: 'Tasa de acierto de cache',
|
||
modelBreakdown: 'Desglose por modelo',
|
||
dailyTrend: 'Uso diario',
|
||
date: 'Fecha',
|
||
tokens: 'Tokens',
|
||
cache: 'Caché',
|
||
cacheRead: 'Lectura de caché',
|
||
cacheWrite: 'Escritura de caché',
|
||
sessions: 'Sesiones',
|
||
cost: 'Costo',
|
||
noData: 'Sin datos de uso',
|
||
},
|
||
|
||
skillsUsage: {
|
||
title: 'Uso de habilidades',
|
||
subtitle: 'Sigue las cargas y ediciones de habilidades en sesiones de Hermes',
|
||
refresh: 'Actualizar',
|
||
periodSelector: 'Periodo de uso de habilidades',
|
||
periodLabel: '{days} d',
|
||
summary: 'Resumen',
|
||
totalActions: 'Acciones',
|
||
loads: 'Cargas',
|
||
edits: 'Ed.',
|
||
distinctSkills: 'Habs.',
|
||
topSkills: 'Top habs.',
|
||
dailyTrend: 'Tendencia diaria',
|
||
periodSummary: 'Últimos {days} días',
|
||
skill: 'Hab.',
|
||
share: '%',
|
||
lastUsed: 'Últ. uso',
|
||
noData: 'No hay datos de uso de habilidades',
|
||
loadFailed: 'No se pudo cargar el uso de habilidades',
|
||
otherSkills: 'Otras habs.',
|
||
},
|
||
|
||
// Registro de cambios
|
||
changelog: {
|
||
new_0_5_22_1: 'La API de lista de sesiones de Hermes lee la base de datos del perfil en vez del almacén local de sesiones de la Web UI',
|
||
new_0_5_23_1: 'Comandos slash de chat solo para Bridge con sugerencias localizadas',
|
||
new_0_5_23_2: 'Historial de comandos persistente para reproducir sesiones sin contaminar contexto, uso ni compresión',
|
||
new_0_5_23_3: 'Variables de entorno del perfil gateway aisladas para evitar filtración de credenciales entre perfiles',
|
||
new_0_5_23_4: 'Reserva del puerto de la Web UI durante la asignación del gateway para evitar conflictos de arranque',
|
||
new_0_5_23_5: 'Corrección del reinicio de autoactualización para no reportar como fallo una salida correcta del helper',
|
||
new_0_5_24_1: 'Chat Bridge alineado con API Server para entrada multimodal, prompt del sistema y contexto de workspace',
|
||
new_0_5_25_1: 'Acciones de restablecer y clonar salas de chat grupal',
|
||
new_0_5_25_2: 'Directorio de estado de la Web UI configurable para diseños de despliegue personalizados',
|
||
new_0_5_25_3: 'MiMo agregado como proveedor TTS en ajustes de voz',
|
||
new_0_5_25_4: 'Listas de modelos de proveedores personalizados cargadas desde backend para evitar errores CORS del navegador',
|
||
new_0_5_25_5: 'Corrección del flujo de aprobación de herramientas en sesiones Bridge',
|
||
new_0_5_25_6: 'Eliminada la pista de plataforma CLI forzada en prompts Bridge para preservar instrucciones personalizadas de medios y archivos',
|
||
new_0_5_25_7: 'Contenido de imagen base64 mostrado correctamente en el historial de mensajes de usuario',
|
||
new_0_5_25_8: 'Pruebas Playwright, cobertura de contrato de streaming de chat, cobertura de modelos de proveedor y línea base de cobertura',
|
||
new_0_5_26_1: 'Soporte para rutas de medios Markdown locales y de Windows en historial y mensajes renderizados',
|
||
new_0_5_26_2: 'Filtrado de historial vacío del assistant y limpieza del estado de compresión obsoleto al iniciar una nueva ejecución',
|
||
new_0_5_26_3: 'Escrituras bloqueadas para actualizaciones de configuración y perfil para reducir corrupción por concurrencia',
|
||
new_0_5_26_4: 'Ajustes de canal QQBot y DingTalk',
|
||
new_0_5_26_5: 'Detección de puerto CLI portable y mejoras de tamaño del cajón de terminal móvil',
|
||
new_0_5_26_6: 'Entornos de perfil Bridge aislados y descubrimiento de plugins Hermes corregido entre entornos Python',
|
||
new_0_5_26_7: 'Estados de gateway detenido explicados con diagnósticos de Web UI y estado de carga de logs estable',
|
||
new_0_5_26_8: 'Corrección de opciones de restablecimiento de sesión, base URL de proveedor personalizado y destinos dinámicos de entrega',
|
||
new_0_5_26_9: 'Interruptor local para mostrar trazas de tool calls en la barra de entrada del chat',
|
||
new_0_5_26_10: 'Instalación del paquete Hermes Agent cuando no hay checkout de código fuente disponible',
|
||
new_0_5_26_11: 'Login OAuth de xAI Grok para usuarios SuperGrok y actualización de presets de modelos Grok',
|
||
new_0_5_26_12: 'Cobertura ampliada de navegador, streaming de chat, proveedor, gateway, configuración, plugins y Bridge',
|
||
new_0_5_27_1: 'Ajustes de modelo por sesión para chats Bridge, con proveedor y modelo independientes guardados por sesión',
|
||
new_0_5_27_2: 'Clic derecho en una sesión Bridge y elegir Definir modelo para cambiar el modelo de esa sesión',
|
||
new_0_5_27_3: 'Las ejecuciones validan el modelo de sesión y vuelven al modelo predeterminado actual si el guardado no está disponible',
|
||
new_0_5_27_4: 'La compresión de contexto sigue por defecto el modelo predeterminado seleccionado en el perfil actual',
|
||
new_0_5_30_1: 'Bridge chat conserva historial estructurado, corrigiendo respuestas intermitentes ausentes y herramientas omitidas por historial de herramientas aplanado',
|
||
new_0_5_30_2: 'El enrutamiento de menciones en chat grupal es más fiable con varios agentes, elimina la propia mención @ antes de entregar y mantiene nombres de usuario tras refrescar',
|
||
new_0_5_30_3: 'Páginas de modelos, desplegables de modelo de chat y selección de modelo de sesión se acotan al perfil activo con marcadores predeterminados precisos',
|
||
new_0_5_30_4: 'Gestión del gateway simplificada: se elimina la página independiente, cada perfil verifica configuración de plataforma antes de iniciar y un runner ligero gestiona arranques y reinicios',
|
||
new_0_5_30_5: 'Arranque del gateway mejorado en Docker, Termux y Windows con manejo de runtime-lock, limpieza de conflictos de puerto, ejecución en segundo plano y soporte de reinicio',
|
||
new_0_5_30_6: 'Compatibilidad Windows reforzada para detección de rutas, descargas de archivos y subprocesos de tareas/actualización sin ventanas de terminal parpadeantes',
|
||
new_0_5_30_7: 'Escritura de configuración y presets de proveedores corregidos: validar claves .env, enrutar FUN-Codex por Responses API y actualizar modelos Z.AI/GLM',
|
||
new_0_5_30_8: 'Detalles del frontend pulidos, incluyendo barra lateral colapsada, etiquetas cortas de grupo, divisor lateral y estilo del esquema de conversación',
|
||
new_0_5_30_9: 'La compresión de contexto sigue ajustes del perfil y endurece snapshots obsoletos reutilizando resúmenes previos con una cola segura',
|
||
new_0_5_31_1: 'Reinicios del Bridge broker reforzados, renderizado final del stream de chat grupal corregido y enrutamiento {\'@\'}all agregado',
|
||
new_0_5_31_2: 'El gestor de archivos puede copiar rutas absolutas y el cajón móvil de sesiones ya no queda detrás del chat',
|
||
new_0_5_31_3: 'Selector de perfiles con avatares, subida de avatar personalizado, modal de estado runtime y acciones de reinicio de gateway/perfil',
|
||
new_0_5_31_4: 'Avatares de perfil en chat individual, grupal y barra lateral colapsada, con metadatos en Web UI y rutas seguras para Windows',
|
||
new_0_5_31_5: 'Mejoras en detección y reinicio de gateway en Docker, Termux y Windows usando gateway_state/gateway.pid para liveness del gateway gestionado',
|
||
new_0_5_31_6: 'Endpoint multimedia de generación de imágenes APIKEY.FUN y skill apikey-image-gen integrado para texto-a-imagen, imagen-a-imagen y edición desde el proveedor fun-codex del perfil activo',
|
||
new_0_5_33_1: 'Los fallos de ejecución y errores Socket en chat individual y grupal quedan como mensajes Agent rojos en la lista de mensajes',
|
||
new_0_5_33_2: 'La búsqueda de sesiones puede limitarse al Profile seleccionado, o buscar en todos los Profiles si no hay uno seleccionado',
|
||
new_0_5_33_3: 'La página Skills muestra documentos de recomendaciones en chino/inglés cuando no hay skill seleccionado, y un segundo clic deselecciona el skill',
|
||
new_0_5_33_4: 'Se eliminan entradas de changelog i18n sin uso para reducir el tamaño del frontend',
|
||
new_0_5_33_5: 'Se corrige el inicio de agent bridge en Windows chino cuando la salida de netstat falla por codificación',
|
||
new_0_5_33_6: 'Lista de modelos Nous Portal actualizada desde el catalog público y recomendaciones Portal',
|
||
new_0_5_33_7: 'Las listas y estados runtime de Profile leen nombres desde directorios y modelos por defecto desde config, evitando errores por ancho de columnas CLI',
|
||
new_0_5_34_1: 'Normaliza resultados de tools multimodales al guardar mensajes de sesión/grupo para evitar imágenes base64 en los replays',
|
||
new_0_5_34_2: 'Persiste modelos Hermes personalizados en configuración gestionada por backend y añade endpoints para agregar/eliminar modelos',
|
||
new_0_5_34_3: 'Mantiene correctos el uso final de contexto Bridge y los estados de tools al completar ejecuciones',
|
||
new_0_5_34_4: 'Mejora filtros de Kanban, visualización de responsables, acciones de tarjetas y detalles de tareas',
|
||
new_0_5_34_5: 'Corrige la contabilidad de compresión con caché de contexto fijo de prompt/tools y totales completos de tokens',
|
||
new_0_5_34_6: 'Cachea contexto fijo por agent de chat grupal y muestra progreso solo cuando la compresión empieza realmente',
|
||
new_0_5_34_7: 'Sincroniza skills integradas de Web UI en todos los Profiles y registra el Profile destino en logs',
|
||
new_0_5_34_8: 'Si Kanban falla en Windows, actualiza Hermes para recibir las últimas correcciones de migración de la base Kanban',
|
||
},
|
||
|
||
// Archivos
|
||
files: {
|
||
title: 'Archivos',
|
||
tree: 'Arbol de directorios',
|
||
list: 'Lista de archivos',
|
||
breadcrumbRoot: 'Inicio',
|
||
newFile: 'Nuevo archivo',
|
||
newFolder: 'Nueva carpeta',
|
||
upload: 'Subir',
|
||
refresh: 'Actualizar',
|
||
open: 'Abrir',
|
||
edit: 'Editar',
|
||
preview: 'Vista previa',
|
||
download: 'Descargar',
|
||
copyPath: 'Copiar ruta',
|
||
rename: 'Renombrar',
|
||
delete: 'Eliminar',
|
||
name: 'Nombre',
|
||
size: 'Tamano',
|
||
modified: 'Modificado',
|
||
actions: 'Acciones',
|
||
emptyDir: 'Directorio vacio',
|
||
loading: 'Cargando...',
|
||
confirmDelete: '?Seguro que quiere eliminar "{name}"?',
|
||
confirmDeleteDir: '?Seguro que quiere eliminar el directorio "{name}" y todo su contenido?',
|
||
deleteFailed: 'Error al eliminar',
|
||
deleted: 'Eliminado',
|
||
renameTo: 'Renombrar a',
|
||
newFileName: 'Nombre del archivo',
|
||
newFolderName: 'Nombre de la carpeta',
|
||
created: 'Creado',
|
||
createFailed: 'Error al crear',
|
||
renamed: 'Renombrado',
|
||
renameFailed: 'Error al renombrar',
|
||
uploadSuccess: '{count} archivo(s) subido(s)',
|
||
uploadFailed: 'Error al subir',
|
||
saveFailed: 'Error al guardar',
|
||
saved: 'Guardado',
|
||
unsavedChanges: 'Tiene cambios sin guardar. ?Descartar?',
|
||
pathCopied: 'Ruta copiada',
|
||
fileTooLarge: 'Archivo demasiado grande (max 10MB)',
|
||
permissionDenied: 'No se puede modificar un archivo protegido',
|
||
notFound: 'Archivo o directorio no encontrado',
|
||
backendError: 'Error en la operacion de archivo',
|
||
dragDropHint: 'Arrastra archivos aqui para subir',
|
||
closeEditor: 'Cerrar editor',
|
||
closePreview: 'Cerrar',
|
||
saveFile: 'Guardar',
|
||
fileTree: 'Árbol de archivos',
|
||
},
|
||
|
||
// Chat grupal
|
||
groupChat: {
|
||
title: 'Chat grupal',
|
||
createRoom: 'Crear sala',
|
||
joinByCode: 'Unirse con codigo',
|
||
roomName: 'Nombre de la sala',
|
||
roomNamePlaceholder: 'Ingrese el nombre de la sala',
|
||
inviteCode: 'Codigo de invitacion',
|
||
autoGenerate: 'Generar automaticamente',
|
||
noRooms: 'Aun no hay salas',
|
||
selectOrCreate: 'Seleccione o cree una sala para comenzar a chatear',
|
||
agents: 'Agentes',
|
||
addAgent: 'Agregar agente',
|
||
selectProfile: 'Seleccione un perfil',
|
||
agentAdded: 'Agente agregado',
|
||
agentAlreadyInRoom: 'El agente ya esta en esta sala',
|
||
agentAddFailedCount: 'No se agregaron {count} agente(s): {details}',
|
||
noAgents: 'No hay agentes en esta sala',
|
||
members: 'Miembros',
|
||
roomCreated: 'Sala creada',
|
||
roomDeleted: 'Sala eliminada',
|
||
roomCloned: 'Sala clonada',
|
||
cloneRoom: 'Clonar sala',
|
||
deleteRoomConfirm: '¿Eliminar esta sala?',
|
||
clearContext: 'Limpiar contexto',
|
||
clearContextConfirm: '¿Limpiar el contexto de esta sala? Se eliminarán mensajes e instantáneas de compresión, pero se conservan agentes y miembros.',
|
||
contextCleared: 'Contexto limpiado',
|
||
you: 'Tú',
|
||
joined: 'Se unio a la sala',
|
||
joinFailed: 'Error al unirse a la sala',
|
||
inputPlaceholder: 'Escriba un mensaje... (Enter para enviar)',
|
||
enterCode: 'Ingrese el codigo de invitacion',
|
||
yourName: 'Tu nombre',
|
||
yourNamePlaceholder: 'Ingresa tu nombre para mostrar',
|
||
yourDescription: 'Descripcion (opcional)',
|
||
yourDescriptionPlaceholder: 'Cuentales a los demas quien eres...',
|
||
agentName: 'Nombre del agente',
|
||
agentNamePlaceholder: 'Nombre personalizado (vacío = nombre del perfil)',
|
||
agentDesc: 'Descripción del agente',
|
||
agentDescPlaceholder: 'Describe lo que hace este agente...',
|
||
agentReplying: 'está respondiendo...',
|
||
agentCompressing: 'está comprimiendo contexto...',
|
||
compressionSettings: 'Configuración de compresión',
|
||
triggerTokens: 'Tokens de activación',
|
||
triggerTokensDesc: 'Umbral de tokens para activar la compresión',
|
||
maxHistoryTokens: 'Tokens máximos de historial',
|
||
maxHistoryTokensDesc: 'Máximo de tokens para el contexto comprimido',
|
||
tailMessageCount: 'Mensajes recientes',
|
||
tailMessageCountDesc: 'Número de mensajes recientes a conservar sin comprimir',
|
||
compressionConfig: 'Config. de compresión',
|
||
compressNow: 'Comprimir ahora',
|
||
compressingInProgress: 'Compresión en progreso',
|
||
compressionSaved: 'Configuración guardada',
|
||
},
|
||
|
||
// Descarga
|
||
download: {
|
||
downloading: 'Descargando...',
|
||
downloadFailed: 'Error en la descarga',
|
||
fileNotFound: 'Archivo no encontrado o eliminado',
|
||
fileTooLarge: 'Archivo demasiado grande (excede el limite)',
|
||
backendError: 'Error al leer el archivo, el entorno remoto puede no estar disponible',
|
||
backendTimeout: 'Tiempo de lectura del archivo agotado',
|
||
unsupportedBackend: 'El backend del terminal actual no admite la descarga de archivos',
|
||
invalidPath: 'Ruta de archivo invalida',
|
||
contentDisplay: 'Contenido',
|
||
download: 'Descargar',
|
||
downloadFile: 'Descargar archivo',
|
||
},
|
||
gateways: {
|
||
title: 'Puertas de enlace',
|
||
running: 'En ejecución',
|
||
stopped: 'Detenido',
|
||
started: 'Iniciado',
|
||
startFailed: 'No se pudo iniciar el gateway',
|
||
stopFailed: 'No se pudo detener el gateway',
|
||
},
|
||
kanban: {
|
||
title: 'Tablero Kanban',
|
||
createTask: 'Nueva tarea',
|
||
noTasks: 'Sin tareas',
|
||
allStatuses: 'Todos los estados',
|
||
allAssignees: 'Todos los responsables',
|
||
columns: {
|
||
triage: 'Clasificación',
|
||
todo: 'Pendiente',
|
||
ready: 'Listo',
|
||
running: 'En curso',
|
||
blocked: 'Bloqueado',
|
||
done: 'Completado',
|
||
archived: 'Archivado',
|
||
},
|
||
card: {
|
||
assigneeTooltip: 'Responsable',
|
||
priority: {
|
||
low: 'Baja',
|
||
medium: 'Media',
|
||
high: 'Alta',
|
||
},
|
||
timeAgo: {
|
||
justNow: 'ahora mismo',
|
||
minutes: 'hace {count} min',
|
||
hours: 'hace {count} h',
|
||
days: 'hace {count} d',
|
||
},
|
||
},
|
||
board: {
|
||
create: 'Nuevo tablero',
|
||
archive: 'Archivar tablero',
|
||
archiveConfirm: '¿Archivar el tablero actual?',
|
||
archived: 'Tablero archivado',
|
||
created: 'Tablero creado',
|
||
slugPlaceholder: 'Identificador del tablero, p. ej. project-a',
|
||
namePlaceholder: 'Nombre visible (opcional)',
|
||
slugRequired: 'El identificador del tablero es obligatorio',
|
||
},
|
||
form: {
|
||
title: 'Título',
|
||
titlePlaceholder: 'Título de la tarea',
|
||
titleRequired: 'El título es obligatorio',
|
||
body: 'Descripción',
|
||
bodyPlaceholder: 'Descripción de la tarea (opcional)',
|
||
assignee: 'Responsable',
|
||
selectAssignee: 'Seleccionar responsable...',
|
||
priority: 'Prioridad',
|
||
selectPriority: 'Seleccionar prioridad...',
|
||
},
|
||
detail: {
|
||
status: 'Estado',
|
||
priority: 'Prioridad',
|
||
assignee: 'Responsable',
|
||
tenant: 'Inquilino',
|
||
createdAt: 'Creada',
|
||
startedAt: 'Iniciada',
|
||
completedAt: 'Completada',
|
||
comments: 'Comentarios',
|
||
events: 'Eventos',
|
||
runs: 'Ejecuciones',
|
||
artifacts: 'Archivos generados',
|
||
result: 'Resultado',
|
||
highlights: 'Información clave',
|
||
sources: 'Fuentes de datos',
|
||
sessions: 'Sesiones relacionadas',
|
||
sessionMessages: 'Mensajes de sesión',
|
||
noSessions: 'No se encontraron sesiones relacionadas.',
|
||
},
|
||
action: {
|
||
title: 'Acciones',
|
||
assign: 'Asignar',
|
||
assignTo: 'Asignar a...',
|
||
block: 'Bloquear',
|
||
blockReason: 'Motivo del bloqueo',
|
||
unblock: 'Desbloquear',
|
||
complete: 'Completar',
|
||
completeSummary: 'Resumen de finalización (opcional)',
|
||
},
|
||
message: {
|
||
loadFailed: 'No se pudo cargar la tarea',
|
||
taskCreated: 'Tarea creada',
|
||
taskAssigned: 'Tarea asignada',
|
||
taskBlocked: 'Tarea bloqueada',
|
||
taskUnblocked: 'Tarea desbloqueada',
|
||
taskCompleted: 'Tarea completada',
|
||
},
|
||
stats: {
|
||
total: 'Total',
|
||
tasks: 'Tareas',
|
||
},
|
||
},
|
||
}
|