Files
vibe-kanban/frontend/src/i18n/locales/es/settings.json
Louis Knight-Webb e8ff40d5a4 Remote host + username opening for VSCode based IDEs (#1134)
* feat: add remote VSCode SSH support for remote server deployments

Add support for opening VSCode via SSH when Vibe Kanban is running on a remote server.
This allows users accessing the web UI through a tunnel to open projects/tasks in their
local VSCode which connects to the remote server via SSH.

Backend changes:
- Add remote_ssh_host and remote_ssh_user fields to EditorConfig (v3)
- Create config v8 with migration from v7
- Modify EditorConfig.open_file() to return URL when remote mode is enabled
- Update API routes to return OpenEditorResponse with optional URL
- Generate vscode:// URL scheme for remote SSH connections

Frontend changes:
- Update API client to handle OpenEditorResponse type
- Modify hooks to open URLs in new tabs when returned
- Add UI fields in settings for remote SSH configuration

When remote_ssh_host is configured, clicking "Open in VSCode" generates a URL like:
vscode://vscode-remote/ssh-remote+user@host/path/to/project

This works for both project-level and task-level editor opening.

* feat: extend remote SSH support to Cursor and Windsurf editors

Extend the remote SSH feature to support Cursor and Windsurf editors,
which are VSCode forks that use the same remote SSH protocol.

Changes:
- Update EditorConfig.open_file() to generate cursor:// and windsurf:// URLs
- Show SSH configuration fields in settings for all three VSCode-based editors
- Use same vscode-remote SSH URL pattern for all three editors

When remote_ssh_host is configured, supported editors generate URLs like:
- vscode://vscode-remote/ssh-remote+user@host/path
- cursor://vscode-remote/ssh-remote+user@host/path
- windsurf://vscode-remote/ssh-remote+user@host/path

* fix: address clippy linting issues

- Fix uninlined format args in v3.rs
- Add allow attributes for re-exported types in v5-v7

* docs: add remote SSH configuration documentation

Add comprehensive documentation for the remote SSH editor feature:

- Expand Editor Integration section in global-settings.mdx
  - Document when to use remote SSH (tunnels, systemctl services, remote deployments)
  - Explain configuration fields (remote_ssh_host, remote_ssh_user)
  - Detail how the feature works with protocol URLs
  - List prerequisites for SSH access and VSCode Remote-SSH extension
  - Support for VSCode, Cursor, and Windsurf editors

- Add Remote Deployment section to README.md
  - Quick guide for setting up remote SSH access
  - Link to detailed documentation
  - Include in feature list

This documentation helps users understand and configure the remote SSH
feature when running Vibe Kanban on remote servers accessed via browser.

* remove package-lock in favour of pnpm lock

* rollback config version increment

* re-impl remote URL

* Update i18n for general settings (vibe-kanban 4a1a3ae1)

frontend/src/pages/settings/GeneralSettings.tsx

Find any strings here that haven't been i18n'd and i18n them

* add line number/col to the end of vscode-remote file paths

* handle response url when opening file in ide from DiffCard

* update remote-ssh guidance in readme

* add image to global settings docs

---------

Co-authored-by: Stephan Fitzpatrick <stephan@knowsuchagency.com>
Co-authored-by: Britannio Jarrett <britanniojarrett@gmail.com>
2025-10-31 12:39:58 +00:00

318 lines
14 KiB
JSON

{
"settings": {
"layout": {
"nav": {
"title": "Configuración",
"general": "General",
"generalDesc": "Tema, notificaciones y preferencias",
"projects": "Proyectos",
"projectsDesc": "Scripts y configuración de proyectos",
"agents": "Agentes",
"agentsDesc": "Configuraciones de agentes",
"mcp": "Servidores MCP",
"mcpDesc": "Servidores de Protocolo de Contexto de Modelo (MCP)"
}
},
"general": {
"loading": "Cargando configuración...",
"loadError": "Error al cargar la configuración.",
"save": {
"button": "Guardar Configuración",
"success": "✓ ¡Configuración guardada!",
"error": "Error al guardar la configuración",
"unsavedChanges": "• Tienes cambios sin guardar",
"discard": "Descartar"
},
"appearance": {
"title": "Apariencia",
"description": "Personaliza cómo se ve la aplicación.",
"theme": {
"label": "Tema",
"placeholder": "Seleccionar tema",
"helper": "Elige tus colores preferidos."
},
"language": {
"label": "Idioma",
"placeholder": "Selecciona tu idioma",
"helper": "Elige tu idioma preferido. El predeterminado del navegador sigue el idioma de tu sistema."
}
},
"taskExecution": {
"title": "Ejecución de Tareas",
"description": "Configura cómo se ejecutan y procesan las tareas.",
"executor": {
"label": "Configuración predeterminada del Agente",
"placeholder": "Seleccionar perfil",
"helper": "Define la configuración predeterminada del agente que se usará al iniciar una tarea."
},
"variant": "PREDETERMINADO",
"defaultLabel": "Predeterminado"
},
"editor": {
"title": "Editor",
"description": "Configura cómo quieres editar tu código.",
"type": {
"label": "Tipo de Editor",
"placeholder": "Seleccionar editor",
"helper": "Elige tu editor de código preferido."
},
"customCommand": {
"label": "Comando de Editor Personalizado",
"placeholder": "ej., code, subl, vim",
"helper": "Ingresa el comando para lanzar tu editor personalizado. Se utilizará para abrir archivos."
},
"remoteSsh": {
"host": {
"label": "Host SSH Remoto (Opcional)",
"placeholder": "ej., nombre de host o dirección IP",
"helper": "Configura esto si Vibe Kanban se ejecuta en un servidor remoto. Cuando se establece, al hacer clic en \"Abrir en Editor\" se generará una URL para abrir tu editor a través de SSH en lugar de ejecutar un comando local."
},
"user": {
"label": "Usuario SSH Remoto (Opcional)",
"placeholder": "ej., nombre de usuario",
"helper": "Nombre de usuario SSH para la conexión remota. Si no se establece, VS Code usará tu configuración SSH o te lo pedirá."
}
}
},
"github": {
"title": "Integración con GitHub",
"connected": "Conectado como {{username}}",
"connectButton": "Conectar Cuenta de GitHub",
"manage": "Gestionar",
"disconnect": "Desconectar",
"helper": "Conecta tu cuenta de GitHub para acceder a repositorios privados y habilitar acciones avanzadas de Git.",
"or": "O",
"pat": {
"label": "Token de Acceso Personal",
"placeholder": "ghp_xxxxxxxxxxxxxxxxxxxx",
"helper": "Token de Acceso Personal de GitHub con permisos 'repo'. Úsalo si los permisos OAuth son insuficientes para repositorios privados y repositorios de organizaciones.",
"createTokenLink": "Crear token aquí"
}
},
"git": {
"title": "Git",
"description": "Configurar preferencias de nombres de ramas git",
"branchPrefix": {
"label": "Prefijo de Rama",
"placeholder": "vk",
"helper": "Prefijo para nombres de ramas generadas automáticamente. Dejar vacío para no usar prefijo.",
"preview": "Vista previa:",
"previewWithPrefix": "{{prefix}}/1a2b-nombre-tarea",
"previewNoPrefix": "1a2b-nombre-tarea",
"errors": {
"slash": "El prefijo no puede contener '/'.",
"startsWithDot": "El prefijo no puede comenzar con '.'.",
"endsWithDot": "El prefijo no puede terminar con '.' o '.lock'.",
"invalidSequence": "Contiene secuencia no válida (.., @{).",
"invalidChars": "Contiene caracteres no válidos.",
"controlChars": "Contiene caracteres de control."
}
}
},
"notifications": {
"title": "Notificaciones",
"description": "Controla cuándo y cómo recibes notificaciones.",
"sound": {
"label": "Notificaciones de Sonido",
"helper": "Reproduce un sonido cuando una tarea termina de ejecutarse.",
"fileLabel": "Sonido",
"filePlaceholder": "Seleccionar sonido",
"fileHelper": "Elige el sonido que se reproducirá al completar las tareas. Haz clic en el botón de volumen para escucharlo."
},
"push": {
"label": "Notificaciones Push",
"helper": "Muestra notificaciones del sistema cuando las tareas terminan de ejecutarse."
}
},
"privacy": {
"title": "Privacidad",
"description": "Ayuda a mejorar Vibe-Kanban compartiendo datos de uso anónimos.",
"telemetry": {
"label": "Habilitar Telemetría",
"helper": "Habilita el seguimiento anónimo para ayudar a mejorar la aplicación. No se recopilan prompts ni información del proyecto."
}
},
"taskTemplates": {
"title": "Etiquetas",
"description": "Crea fragmentos de texto reutilizables que se pueden insertar en descripciones de tareas usando @nombre_etiqueta."
},
"tags": {
"manager": {
"title": "Etiquetas de Tareas",
"addTag": "Agregar Etiqueta",
"noTags": "Aún no hay etiquetas. Crea fragmentos de texto reutilizables para descripciones de tareas comunes. Usa @nombre_etiqueta en cualquier tarea.",
"table": {
"tagName": "Nombre de Etiqueta",
"content": "Contenido",
"actions": "Acciones"
},
"actions": {
"editTag": "Editar etiqueta",
"deleteTag": "Eliminar etiqueta"
},
"deleteConfirm": "¿Estás seguro de que deseas eliminar la etiqueta \"{{tagName}}\"?"
},
"dialog": {
"createTitle": "Crear Etiqueta",
"editTitle": "Editar Etiqueta",
"tagName": {
"label": "Nombre de Etiqueta",
"required": "*",
"hint": "Usa este nombre con @ en descripciones de tareas: @{{tagName}}",
"placeholder": "ej., corrección_error, plan_prueba, docs_api",
"error": "El nombre de la etiqueta no puede contener espacios. Usa guiones bajos en su lugar (ej., mi_etiqueta)"
},
"content": {
"label": "Contenido",
"required": "*",
"hint": "Texto que se insertará cuando uses @{{tagName}} en descripciones de tareas",
"placeholder": "Ingresa el texto que se insertará cuando uses esta etiqueta"
},
"errors": {
"nameRequired": "El nombre de la etiqueta es obligatorio",
"saveFailed": "Error al guardar la etiqueta"
},
"buttons": {
"cancel": "Cancelar",
"create": "Crear",
"update": "Actualizar"
}
}
},
"safety": {
"title": "Avisos legales y de seguridad",
"description": "Reinicia las confirmaciones de seguridad y de introducción.",
"disclaimer": {
"title": "Confirmación de Descargo",
"description": "Restablecer el aviso de seguridad.",
"button": "Restablecer"
},
"onboarding": {
"title": "Introducción",
"description": "Restablece el flujo de Introducción.",
"button": "Restablecer"
}
}
},
"agents": {
"title": "Configuraciones de Agentes de Código",
"description": "Personaliza el comportamiento de los agentes con diferentes configuraciones.",
"loading": "Cargando configuraciones de agentes...",
"save": {
"button": "Guardar Configuraciones de Agentes",
"success": "✓ ¡Configuración guardada con éxito”!"
},
"editor": {
"formLabel": "Editar JSON",
"agentLabel": "Agente",
"agentPlaceholder": "Seleccionar tipo",
"configLabel": "Configuración",
"configPlaceholder": "Seleccionar configuración",
"createNew": "Crear nuevo...",
"deleteTitle": "No se puede eliminar la última configuración",
"deleteButton": "Eliminar {{name}}",
"deleteText": "Eliminar",
"jsonLabel": "Configuración de Agente (JSON)",
"jsonPlaceholder": "Cargando perfiles...",
"jsonLoading": "Cargando...",
"pathLabel": "Ubicación del archivo de configuración:"
},
"errors": {
"deleteFailed": "Error al eliminar la configuración. Por favor, inténtalo de nuevo.",
"saveFailed": "Error al guardar la configuración de los agentes. Por favor, inténtalo de nuevo.",
"saveConfigFailed": "Error al guardar la configuración. Por favor, inténtalo de nuevo."
}
},
"mcp": {
"title": "Configuración de Servidor MCP",
"description": "Configura los servidores del Protocolo de Contexto de Modelos (MCP) para ampliar las capacidades del agente de codificación con herramientas y recursos personalizados.",
"loading": "Cargando configuración MCP...",
"applying": "Aplicando configuración...",
"loadingStates": {
"jsonEditor": "Cargando...",
"configuration": "Cargando configuración actual del servidor MCP..."
},
"labels": {
"agent": "Agente",
"agentPlaceholder": "Seleccionar",
"agentHelper": "Elige para qué agente configurar los servidores MCP.",
"serverConfig": "Configuración de Servidor (JSON)",
"popularServers": "Servidores populares",
"serverHelper": "Haz clic en una tarjeta para insertar ese Servidor MCP en el JSON de arriba.",
"saveLocation": "Los cambios se guardarán en:"
},
"errors": {
"loadFailed": "Error al cargar la configuración.",
"invalidJson": "Formato JSON inválido",
"validationError": "Error de validación",
"saveFailed": "Error al guardar servidores MCP",
"applyFailed": "Error al aplicar la configuración del servidor MCP",
"addServerFailed": "Error al agregar servidor preconfigurado",
"mcpError": "Error de Configuración MCP: {{error}}",
"notSupported": "MCP No Soportado",
"supportMessage": "Para usar servidores MCP, por favor selecciona un agente diferente que soporte MCP (Claude, Amp, Gemini, Codex, o Opencode) arriba."
},
"save": {
"button": "Guardar Configuración MCP",
"success": "¡Configuración Guardada!",
"successMessage": "✓ ¡Configuración MCP guardada exitosamente!",
"loading": "Cargando configuración actual del servidor MCP..."
}
},
"projects": {
"title": "Configuración de Proyectos",
"description": "Configura scripts y ajustes específicos del proyecto.",
"loading": "Cargando proyectos...",
"loadError": "Error al cargar proyectos.",
"selector": {
"label": "Seleccionar Proyecto",
"placeholder": "Elige un proyecto para configurar",
"helper": "Selecciona un proyecto para ver y editar su configuración.",
"noProjects": "No hay proyectos disponibles"
},
"general": {
"title": "Configuración General",
"description": "Configura la información básica del proyecto.",
"name": {
"label": "Nombre del Proyecto",
"placeholder": "Ingresa el nombre del proyecto",
"helper": "Un nombre para mostrar para este proyecto."
},
"repoPath": {
"label": "Ruta del Repositorio Git",
"placeholder": "/ruta/a/tu/repositorio/existente",
"helper": "La ruta absoluta a tu repositorio git en disco."
}
},
"scripts": {
"title": "Scripts y Configuración",
"description": "Configura los scripts de instalación, desarrollo y limpieza para este proyecto.",
"setup": {
"label": "Script de Instalación",
"helper": "Este script se ejecutará después de crear el worktree y antes de que comience el agente de codificación. Úsalo para tareas de configuración como instalar dependencias o preparar el entorno."
},
"dev": {
"label": "Script del Servidor de Desarrollo",
"helper": "Este script se puede ejecutar desde los intentos de tarea para iniciar un servidor de desarrollo. Úsalo para iniciar rápidamente el servidor de desarrollo de tu proyecto para probar cambios."
},
"cleanup": {
"label": "Script de Limpieza",
"helper": "Este script se ejecuta después de la ejecución del agente de codificación solo si se realizaron cambios. Úsalo para tareas de garantía de calidad como ejecutar linters, formateadores, pruebas u otros pasos de validación. Si no se realizan cambios, se omite este script."
},
"copyFiles": {
"label": "Copiar Archivos",
"helper": "Lista separada por comas de archivos para copiar del directorio del proyecto original al worktree. Estos archivos se copiarán después de que se cree el worktree pero antes de que se ejecute el script de configuración. Útil para archivos específicos del entorno como .env, archivos de configuración y ajustes locales. ¡Asegúrate de que estén en gitignore o podrían ser confirmados!"
}
},
"save": {
"button": "Guardar Configuración del Proyecto",
"success": "✓ ¡Configuración del proyecto guardada exitosamente!",
"error": "Error al guardar la configuración del proyecto",
"unsavedChanges": "• Tienes cambios sin guardar",
"discard": "Descartar",
"confirmSwitch": "Tienes cambios sin guardar. ¿Estás seguro de que quieres cambiar de proyecto? Tus cambios se perderán."
}
}
}
}