fix(i18n): localize sidebar, settings tabs, and settings section titles

Three connected bugs where the Label/SettingsSection APIs took a `String`,
which routes through the StringProtocol overloads and bypasses localization
entirely. Identified by the user after testing zh-Hans / de / fr — the
sidebar menu items, Settings tab bar, and Settings section headers all
remained English under any App Language override.

- SidebarSection now exposes displayName: LocalizedStringResource; SidebarView
  builds Label via the Text/Image builders so the catalog key is actually
  used.
- SettingsTab gets the same displayName treatment; the .tabItem Label builds
  through the Text/Image builder too.
- SettingsSection.title changes from String → LocalizedStringKey so literal
  call sites (all ~20 of them) now extract into the catalog. Two call sites
  that were passing String variables (PlatformsView, CredentialPoolsView) are
  wrapped via LocalizedStringKey(...) — brand/provider names fall through to
  English as before. AuxiliaryTab's static task list gets a LocalizedStringKey
  column so its section titles extract too.

This change newly extracts 65 previously-invisible section-title keys into
the catalog; translations added for all six locales. Catalog: 575 → 644
source keys, each locale translated for 583 of them (brand names / protocol
names / format-only keys intentionally fall through).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alan Wizemann
2026-04-21 03:32:32 +02:00
parent 1726a613a5
commit f47034d4ad
14 changed files with 3078 additions and 17 deletions
+65
View File
@@ -20,11 +20,14 @@
"%lld tools": "%lld herramientas",
"30 Days": "30 días",
"7 Days": "7 días",
"90 Days": "90 días",
"A QR code will appear below. Scan it with WhatsApp on your phone. The session is saved to ~/.hermes/platforms/whatsapp/ so you won't need to scan again after restarts.": "Aparecerá un código QR abajo. Escanéalo con WhatsApp en tu teléfono. La sesión se guarda en ~/.hermes/platforms/whatsapp/ para no tener que volver a escanearla tras reiniciar.",
"API Key": "Clave de API",
"API keys are never displayed in full. Scarf only shows the last 4 characters for identification. Full key values are stored by hermes in ~/.hermes/auth.json.": "Las claves de API nunca se muestran completas. Scarf solo muestra los últimos 4 caracteres para identificación. Los valores completos los guarda hermes en ~/.hermes/auth.json.",
"Access Control": "Control de acceso",
"Actions": "Acciones",
"Active": "Activo",
"Active Personality": "Personalidad activa",
"Active profile": "Perfil activo",
"Activity": "Actividad",
"Activity Patterns": "Patrones de actividad",
@@ -42,6 +45,7 @@
"Add from Preset": "Añadir desde preajuste",
"Add rotation credentials so hermes can failover between keys when one hits rate limits.": "Añade credenciales de rotación para que hermes pueda cambiar entre claves cuando una alcance el límite de tasa.",
"Add your first command": "Añade tu primer comando",
"Advanced": "Avanzado",
"After approving in your browser, the provider shows a code. Paste it below and submit.": "Tras aprobar en tu navegador, el proveedor muestra un código. Pégalo abajo y envíalo.",
"Agent": "Agent",
"All": "Todos",
@@ -49,25 +53,34 @@
"All Sessions": "Todas las sesiones",
"All Time": "Todo el tiempo",
"All installed hub skills are up to date.": "Todas las habilidades instaladas desde el hub están al día.",
"App Credentials": "Credenciales de la aplicación",
"Approval": "Aprobación",
"Approvals": "Aprobaciones",
"Approve": "Aprobar",
"Archive": "Archivar",
"Args (one per line)": "Argumentos (uno por línea)",
"Arguments": "Argumentos",
"Assistant Message": "Mensaje del asistente",
"Auth": "Auth",
"Authentication": "Autenticación",
"Authentication uses ssh-agent": "La autenticación usa ssh-agent",
"Authorization Code": "Código de autorización",
"Authorization URL": "URL de autorización",
"Aux Models": "Modelos auxiliares",
"Auxiliary tasks use separate, typically cheaper models. Leave Provider as `auto` to inherit the main provider.": "Las tareas auxiliares usan modelos separados, normalmente más baratos. Deja Proveedor en `auto` para heredar el proveedor principal.",
"Back": "Atrás",
"Back to Catalog": "Volver al catálogo",
"Backend": "Backend",
"Backup & Restore": "Copia de seguridad y restauración",
"Backup Now": "Copia de seguridad ahora",
"Becomes the key under mcp_servers: in config.yaml.": "Se convierte en la clave bajo mcp_servers: en config.yaml.",
"Behavior": "Comportamiento",
"Browse": "Examinar",
"Browse Hub": "Examinar el hub",
"Browse the Hub": "Examinar el hub",
"Browse...": "Examinar...",
"Browser": "Navegador",
"Built-in Memory": "Memoria integrada",
"By Day": "Por día",
"By Hour": "Por hora",
"Call timeout": "Tiempo de espera de llamada",
@@ -81,6 +94,7 @@
"Check for Updates": "Buscar actualizaciones",
"Check for Updates…": "Buscar actualizaciones…",
"Checking…": "Comprobando…",
"Checkpoints": "Puntos de control",
"Choose a cron job from the list": "Elige una tarea cron de la lista",
"Choose a profile to inspect.": "Elige un perfil para inspeccionar.",
"Choose a project from the sidebar to view its dashboard.": "Elige un proyecto en la barra lateral para ver su panel.",
@@ -98,16 +112,21 @@
"Close Window": "Cerrar ventana",
"Code: %@": "Código: %@",
"Command": "Comando",
"Command Allowlist": "Lista de comandos permitidos",
"Command looks destructive. Double-check before saving.": "El comando parece destructivo. Revísalo antes de guardar.",
"Component": "Componente",
"Compress": "Comprimir",
"Compress Conversation": "Comprimir conversación",
"Compress conversation (/compress)": "Comprimir conversación (/compress)",
"Compression": "Compresión",
"Config Diagnostics": "Diagnóstico de configuración",
"Configure": "Configurar",
"Connect timeout": "Tiempo de espera de conexión",
"Connected": "Conectado",
"Connected — can't read Hermes state": "Conectado — no se puede leer el estado de Hermes",
"Connection": "Conexión",
"Container Limits": "Límites del contenedor",
"Context & Compression": "Contexto y compresión",
"Continue Last Session": "Continuar última sesión",
"Copied": "Copiado",
"Copy": "Copiar",
@@ -132,21 +151,26 @@
"Cron Jobs": "Tareas cron",
"Current: %@": "Actual: %@",
"Custom…": "Personalizado…",
"Daemon Endpoint": "Endpoint del demonio",
"Daemon running": "Demonio en ejecución",
"Dashboard": "Panel",
"Default": "Predeterminado",
"Default: ~/.hermes": "Predeterminado: ~/.hermes",
"Defaults to ~/.ssh/config or current user": "Por defecto ~/.ssh/config o el usuario actual",
"Defined Personalities": "Personalidades definidas",
"Delegation": "Delegación",
"Delete": "Eliminar",
"Delete %@?": "¿Eliminar %@?",
"Delete Session?": "¿Eliminar sesión?",
"Delete profile '%@'?": "¿Eliminar perfil '%@'?",
"Delete...": "Eliminar...",
"Deliver: %@": "Entregar: %@",
"Details": "Detalles",
"Diagnostic Output": "Salida de diagnóstico",
"Diagnostics": "Diagnósticos",
"Disable": "Desactivar",
"Disabled": "Desactivado",
"Display": "Pantalla",
"Docs": "Docs",
"Done": "Listo",
"Edit": "Editar",
@@ -160,10 +184,13 @@
"Enable 2FA on your email account and generate an app password. Regular account passwords will fail. Always set allowed senders — otherwise anyone knowing the address can message the agent.": "Activa 2FA en tu cuenta de correo y genera una contraseña de aplicación. Las contraseñas normales no funcionarán. Establece siempre remitentes permitidos — de lo contrario, cualquiera que conozca la dirección podrá enviar mensajes al agente.",
"Enable the webhook platform to accept event-driven agent triggers. The HMAC secret is used as a fallback when individual routes don't provide their own.": "Activa la plataforma de webhooks para aceptar disparadores de agente dirigidos por eventos. El secreto HMAC se usa como respaldo cuando las rutas individuales no aportan el suyo.",
"Enabled": "Activado",
"End-to-End Encryption (experimental)": "Cifrado de extremo a extremo (experimental)",
"Entity Filters (config.yaml only)": "Filtros de entidades (solo config.yaml)",
"Env vars, headers, and tool filters can be edited after the server is added.": "Las variables de entorno, cabeceras y filtros de herramientas se pueden editar después de añadir el servidor.",
"Environment Variables": "Variables de entorno",
"Error": "Error",
"Errors": "Errores",
"Event Filters": "Filtros de eventos",
"Exclude": "Excluir",
"Execute": "Ejecutar",
"Expected at %@": "Esperado en %@",
@@ -172,18 +199,23 @@
"Export…": "Exportar…",
"Expose prompts": "Exponer prompts",
"Expose resources": "Exponer recursos",
"External Provider": "Proveedor externo",
"Feedback": "Comentarios",
"Fetch": "Obtener",
"Files": "Archivos",
"Filter logs...": "Filtrar registros...",
"Filter servers...": "Filtrar servidores...",
"Filter skills...": "Filtrar habilidades...",
"Filter to session %@": "Filtrar a la sesión %@",
"Flush Memories": "Vaciar memorias",
"Focus topic (optional)": "Tema de enfoque (opcional)",
"Full copy of active profile (all state)": "Copia completa del perfil activo (todo el estado)",
"Gateway": "Gateway",
"Gateway Running": "Gateway en ejecución",
"Gateway Stopped": "Gateway detenido",
"Gateway restart required": "Se requiere reiniciar el gateway",
"General": "General",
"Global Settings": "Ajustes globales",
"Header": "Cabecera",
"Headers": "Cabeceras",
"Health": "Salud",
@@ -195,7 +227,10 @@
"Hide": "Ocultar",
"Hide Output": "Ocultar salida",
"Hide details": "Ocultar detalles",
"Home Channel": "Canal principal",
"Homeserver": "Homeserver",
"Host key changed": "Clave de host cambiada",
"Human Delay": "Retraso humano",
"ID: %@": "ID: %@",
"If this is the first connection, ensure your key is loaded with `ssh-add` and that the remote accepts it.": "Si es la primera conexión, asegúrate de que tu clave esté cargada con `ssh-add` y de que el remoto la acepte.",
"If you trust the change, remove the stale entry and reconnect:": "Si confías en el cambio, elimina la entrada obsoleta y reconéctate:",
@@ -217,6 +252,7 @@
"Last probe: %@": "Última comprobación: %@",
"Last run: %@": "Última ejecución: %@",
"Last updated: %@": "Última actualización: %@",
"Layout": "Diseño",
"Leave blank to infer from the model ID's prefix (\"openai/...\" → openai).": "Déjalo vacío para deducirlo del prefijo del ID del modelo (\"openai/...\" → openai).",
"Leave blank unless Hermes is installed at a non-default path (systemd services often live at /var/lib/hermes/.hermes; Docker sidecars vary). Test Connection auto-suggests a value when it detects one of the known alternates.": "Déjalo vacío salvo que Hermes esté instalado en una ruta no predeterminada (los servicios systemd suelen estar en /var/lib/hermes/.hermes; los sidecars Docker varían). Probar conexión sugiere un valor automáticamente si detecta una alternativa conocida.",
"Level": "Nivel",
@@ -227,7 +263,9 @@
"Loading session…": "Cargando sesión…",
"Local": "Local",
"Local (stdio)": "Local (stdio)",
"Locale": "Configuración regional",
"Log File": "Archivo de registro",
"Logging": "Registro",
"Logs": "Registros",
"MCP Servers": "Servidores MCP",
"MCP Servers (%lld)": "Servidores MCP (%lld)",
@@ -241,11 +279,14 @@
"Messages will appear here as the conversation progresses.": "Los mensajes aparecerán aquí a medida que avance la conversación.",
"Migrate": "Migrar",
"Missing required config:": "Falta configuración requerida:",
"Modal": "Modal",
"Model": "Modelo",
"Model ID": "ID del modelo",
"Models": "Modelos",
"Monitor": "Monitor",
"Name": "Nombre",
"Name (no leading slash)": "Nombre (sin barra inicial)",
"Network": "Red",
"New Session": "Nueva sesión",
"New Webhook Subscription": "Nueva suscripción de webhook",
"New name for '%@'": "Nuevo nombre para '%@'",
@@ -283,6 +324,7 @@
"None": "Ninguno",
"Notable Sessions": "Sesiones destacadas",
"OAuth login for %@": "Inicio de sesión OAuth para %@",
"OK": "Aceptar",
"Open BotFather": "Abrir BotFather",
"Open Developer Portal": "Abrir Developer Portal",
"Open Local": "Abrir local",
@@ -294,6 +336,7 @@
"Open in Editor": "Abrir en el editor",
"Open in new window": "Abrir en nueva ventana",
"Open session": "Abrir sesión",
"Optional": "Opcional",
"Optional — defaults to hostname": "Opcional — por defecto el nombre de host",
"Optionally focus the summary on a specific topic. Leave blank to compress evenly.": "Opcionalmente, enfoca el resumen en un tema específico. Déjalo vacío para comprimir uniformemente.",
"Other": "Otro",
@@ -304,11 +347,13 @@
"Pair Device": "Emparejar dispositivo",
"Paired Users": "Usuarios emparejados",
"Paste code here…": "Pega el código aquí…",
"Paths": "Rutas",
"Pause": "Pausar",
"Pending Approvals": "Aprobaciones pendientes",
"Per-route subscriptions (events, prompt template, delivery target) are managed in the Webhooks sidebar — not here. This panel only controls whether the webhook platform is listening at all.": "Las suscripciones por ruta (eventos, plantilla de prompt, destino de entrega) se gestionan en la barra lateral de Webhooks — no aquí. Este panel solo controla si la plataforma de webhooks está escuchando.",
"Period": "Período",
"Personalities": "Personalidades",
"Personality": "Personalidad",
"Pick an MCP server to add.": "Elige un servidor MCP para añadir.",
"Pick one from the list, or add a new server from the toolbar.": "Elige uno de la lista o añade un nuevo servidor desde la barra de herramientas.",
"Platforms": "Plataformas",
@@ -327,6 +372,7 @@
"Provider": "Proveedor",
"Push to Talk": "Pulsar para hablar",
"Push to talk (Ctrl+B)": "Pulsar para hablar (Ctrl+B)",
"Push-to-Talk": "Pulsar para hablar",
"Quick Commands": "Comandos rápidos",
"Quick commands are shell shortcuts hermes exposes in chat as `/command_name`. They live under `quick_commands:` in config.yaml.": "Los comandos rápidos son atajos de shell que hermes expone en el chat como `/command_name`. Viven bajo `quick_commands:` en config.yaml.",
"Quit Scarf": "Salir de Scarf",
@@ -338,6 +384,7 @@
"Recent Sessions": "Sesiones recientes",
"Reconnect": "Reconectar",
"Recording…": "Grabando…",
"Redaction": "Censura",
"Refresh": "Actualizar",
"Reload": "Recargar",
"Remote (HTTP)": "Remoto (HTTP)",
@@ -353,6 +400,8 @@
"Rename Profile": "Renombrar perfil",
"Rename Session": "Renombrar sesión",
"Rename...": "Renombrar...",
"Required": "Obligatorio",
"Required Tokens": "Tokens requeridos",
"Requires: %@": "Requiere: %@",
"Reset Cooldowns": "Restablecer enfriamientos",
"Restart": "Reiniciar",
@@ -391,6 +440,7 @@
"Search or browse skills published to registries like skills.sh, GitHub, and the official hub.": "Busca o examina habilidades publicadas en registros como skills.sh, GitHub y el hub oficial.",
"Search registries": "Buscar en registros",
"Search…": "Buscar…",
"Security": "Seguridad",
"Select": "Seleccionar",
"Select Model": "Seleccionar modelo",
"Select a Job": "Seleccionar una tarea",
@@ -402,12 +452,14 @@
"Select an MCP Server": "Seleccionar un servidor MCP",
"Send message (Enter)": "Enviar mensaje (Intro)",
"Series": "Serie",
"Server": "Servidor",
"Server No Longer Exists": "El servidor ya no existe",
"Server name": "Nombre del servidor",
"Servers": "Servidores",
"Service": "Servicio",
"Service definition stale": "Definición de servicio obsoleta",
"Session": "Sesión",
"Session Search": "Búsqueda de sesiones",
"Session title": "Título de sesión",
"Sessions": "Sesiones",
"Settings": "Ajustes",
@@ -424,7 +476,9 @@
"Site": "Sitio",
"Skills": "Habilidades",
"Skills (%lld)": "Habilidades (%lld)",
"Skills Hub": "Hub de habilidades",
"Source": "Origen",
"Speech-to-Text": "Voz a texto",
"Start": "Iniciar",
"Start Daemon": "Iniciar demonio",
"Start Hermes": "Iniciar Hermes",
@@ -449,6 +503,7 @@
"Test Connection": "Probar conexión",
"Test failed": "Prueba fallida",
"Test passed": "Prueba superada",
"Text-to-Speech": "Texto a voz",
"The agent hasn't advertised any slash commands yet. Keep typing to send as a message, or press Esc.": "El agente aún no ha anunciado comandos slash. Sigue escribiendo para enviar como mensaje, o pulsa Esc.",
"The remote's SSH fingerprint no longer matches what your `~/.ssh/known_hosts` file expected. This usually means the remote was reinstalled — or, less commonly, that someone is intercepting the connection.": "La huella SSH del remoto ya no coincide con lo que tu archivo `~/.ssh/known_hosts` esperaba. Normalmente significa que el remoto se reinstaló — o, con menos frecuencia, que alguien intercepta la conexión.",
"The server this window was opened with has been removed from your registry.": "El servidor con el que se abrió esta ventana se ha eliminado de tu registro.",
@@ -465,14 +520,17 @@
"This will permanently delete the session and all its messages.": "Esto eliminará permanentemente la sesión y todos sus mensajes.",
"Timeout: %llds (%@)": "Tiempo de espera: %1$lld s (%2$@)",
"Timeouts": "Tiempos de espera",
"Tirith Sandbox": "Sandbox Tirith",
"To skip the passphrase prompt at every reboot, add `--apple-use-keychain` to cache it in macOS Keychain.": "Para evitar que pida la frase de contraseña en cada reinicio, añade `--apple-use-keychain` para almacenarla en el llavero de macOS.",
"Toggle text-to-speech (/voice tts)": "Alternar texto a voz (/voice tts)",
"Toggle voice mode (/voice)": "Alternar modo de voz (/voice)",
"Token on disk. Clear to re-authenticate next time the gateway connects.": "Token en disco. Bórralo para que se vuelva a autenticar en la próxima conexión del gateway.",
"Tool Approval Required": "Se requiere aprobación de herramienta",
"Tool Filters": "Filtros de herramientas",
"Tool Progress": "Progreso de herramientas",
"Tools": "Herramientas",
"Top Tools": "Herramientas principales",
"Turns & Reasoning": "Turnos y razonamiento",
"Uninstall": "Desinstalar",
"Unknown: %@": "Desconocido: %@",
"Update": "Actualizar",
@@ -489,14 +547,21 @@
"Used as the YAML key. Lowercase, no spaces.": "Se usa como clave YAML. Minúsculas, sin espacios.",
"View": "Ver",
"View All": "Ver todo",
"Vision": "Visión",
"Voice": "Voz",
"Voice Off": "Voz desactivada",
"Voice On": "Voz activada",
"Waiting for authorization URL…": "Esperando URL de autorización…",
"Waiting for first probe": "Esperando primera comprobación",
"Waiting for hermes to prompt for the code…": "Esperando a que hermes pida el código…",
"Web Extract": "Extracción web",
"Webhook (advanced)": "Webhook (avanzado)",
"Webhook (hermes side)": "Webhook (lado hermes)",
"Webhook Security": "Seguridad de webhook",
"Webhook platform not enabled": "Plataforma de webhooks no activada",
"Webhooks": "Webhooks",
"Webhooks let external services trigger agent responses. Each subscription gets its own URL endpoint.": "Los webhooks permiten que servicios externos disparen respuestas del agente. Cada suscripción obtiene su propio endpoint de URL.",
"Website Blocklist": "Lista de bloqueo de sitios",
"WhatsApp uses the Baileys library to emulate a WhatsApp Web session. Pair this Mac as a linked device by running the pairing wizard and scanning the QR code with your phone (Settings → Linked Devices → Link a Device).": "WhatsApp usa la biblioteca Baileys para emular una sesión de WhatsApp Web. Empareja este Mac como dispositivo vinculado ejecutando el asistente y escaneando el código QR con tu teléfono (Ajustes → Dispositivos vinculados → Vincular dispositivo).",
"Working": "Trabajando",
"e.g. anthropic": "p. ej. anthropic",