release: ship v1.5.0 with on-device writing suggestions
Some checks failed
deploy-site / deploy (push) Failing after 33s
portable-unsigned / portable-windows (push) Failing after 4m7s
release / release-windows (push) Failing after 3m16s

Adds next-sentence suggestions while typing, weekly input insights and a
personal phrase memory to the desktop app, and fixes custom instructions so
they process the text instead of inserting the instruction's own wording.
Local model requests are now bounded and individually cancellable.

Bumps the product version to 1.5.0 (Android/iOS build 1050000), refreshes the
landing and web download links, and records the new INPUT feature rows and the
open verification gaps in the infrastructure map.
This commit is contained in:
Yun Chan 2026-09-23 16:04:27 +09:00
parent 99f06c253c
commit 5c11ee2fde
104 changed files with 14410 additions and 174 deletions

View file

@ -325,5 +325,192 @@
"keybinding.ui.recordHint": "Introduce una combinación (ej: Ctrl+Shift+Q) o una tecla sola (ej: F5)",
"keybinding.ui.recordAgain": "Volver a introducir",
"keybinding.ui.saveFailed": "No se ha podido guardar el atajo",
"keybinding.ui.globalEnabled": "Usar atajos globales"
"keybinding.ui.globalEnabled": "Usar atajos globales",
"input.tab": "Entrada",
"input.consent.title": "Recopilación de datos de entrada",
"input.consent.description": "Opcional. Contamos pulsaciones y clics y medimos el recorrido del ratón para mostrar tus patrones de escritura. Nunca se guarda qué teclas pulsas.",
"input.consent.collect": "Recopilar estadísticas de teclado y ratón",
"input.consent.running": "Recopilando ahora.",
"input.consent.stopped": "La recopilación está desactivada. No se registra nada.",
"input.consent.pause": "Pausar la recopilación",
"input.consent.learnText": "Aprender el texto que escribo",
"input.consent.learnTextHint": "Lee el campo de texto enfocado para aprender tu forma de escribir. Los campos de contraseña siempre se omiten.",
"input.consent.excludedApps": "Aplicaciones excluidas",
"input.consent.excludedAppsPlaceholder": "keepassxc.exe, 1password.exe",
"input.consent.excludedAppsHint": "Nombres de ejecutables separados por comas. En estas aplicaciones no se lee ni se cuenta nada.",
"input.consent.clearAll": "Eliminar los datos recopilados",
"input.suggestion.title": "Sugerencias de siguiente frase",
"input.suggestion.description": "Predice la frase que vas a escribir y la muestra junto al cursor. Acéptala para insertarla.",
"input.suggestion.enabled": "Mostrar sugerencias al escribir",
"input.suggestion.modelReady": "Modelo local listo.",
"input.suggestion.modelMissing": "El modelo local no está en ejecución: las sugerencias están desactivadas.",
"input.suggestion.delay": "Retardo (ms)",
"input.suggestion.minPrefix": "Caracteres mínimos",
"input.suggestion.modelDefault": "Usar el modelo predeterminado",
"input.suggestion.overlayInteractive": "Permitir clic en el cuadro de sugerencia",
"input.suggestion.overlayVisible": "La sugerencia está en pantalla",
"input.suggestion.keyHint": "Aceptar, alternar y descartar son atajos globales: cámbialos en Ajustes > Atajos.",
"input.suggestion.requestNow": "Sugerir ahora",
"input.suggestion.usage": "{{requests}} de {{budget}} solicitudes usadas hoy",
"input.suggestion.lastSkip": "Último descarte: {{reason}}",
"input.insights.title": "Últimos {{days}} días",
"input.insights.keystrokes": "Pulsaciones",
"input.insights.clicks": "Clics",
"input.insights.words": "Palabras escritas",
"input.insights.sentences": "Frases",
"input.insights.mouseDistance": "Recorrido del ratón",
"input.insights.perDayMeters": " m/día",
"input.insights.phrases": "Frases personales",
"input.insights.empty": "Aún no hay actividad recopilada.",
"input.insights.topApps": "Donde más escribes",
"input.insights.appRow": "{{keystrokes}} teclas · {{clicks}} clics",
"input.insights.privacyNote": "En este dispositivo solo se guardan contadores y distancias. El contenido de las teclas nunca se guarda.",
"input.phrases.title": "Frases personales",
"input.phrases.description": "Frases aprendidas de tu escritura y dictado, usadas para imitar tu estilo.",
"input.phrases.empty": "Aún no se ha aprendido nada.",
"input.phrases.delete": "Eliminar frase",
"input.feedback.excludedSaved": "Exclusiones guardadas.",
"input.feedback.cleared": "Datos recopilados eliminados.",
"popup.suggestion.hintAccept": "Aceptar",
"popup.suggestion.hintNext": "Siguiente",
"popup.suggestion.hintDismiss": "Descartar",
"popup.suggestion.loading": "Generando…",
"keybinding.ui.sectionInput": "Sugerencias de entrada",
"keybinding.action.suggestionAccept": "Aceptar sugerencia",
"keybinding.action.suggestionAccept.desc": "Inserta la frase sugerida en la aplicación enfocada.",
"keybinding.action.suggestionNext": "Siguiente sugerencia",
"keybinding.action.suggestionNext.desc": "Pasa al siguiente candidato.",
"keybinding.action.suggestionDismiss": "Descartar sugerencia",
"keybinding.action.suggestionDismiss.desc": "Oculta la sugerencia actual.",
"input.suggestion.timeout": "Límite de respuesta (ms)",
"input.suggestion.latency": "Última respuesta: {{ms}} ms",
"input.suggestion.slowWarning": "Más lento que escribir — prueba un modelo más pequeño.",
"input.diagnostics.title": "Diagnóstico en vivo",
"input.diagnostics.app": "Aplicación enfocada: {{app}}",
"input.diagnostics.unknownApp": "(desconocida)",
"input.diagnostics.noSnapshot": "Aún no se ha leído ningún campo: haz clic en un campo de texto y escribe.",
"input.diagnostics.readable": "Campo legible ({{source}}, {{length}} caracteres) — las sugerencias pueden funcionar.",
"input.diagnostics.notReadable": "Esta aplicación no expone su campo de texto: lo escrito no se puede leer y no se sugiere nada.",
"input.diagnostics.password": "Campo de contraseña: la lectura está bloqueada por diseño.",
"input.diagnostics.caretFallback": "Sin posición del cursor; se usa el final del documento.",
"input.diagnostics.composing": "Composición IME en curso: la sugerencia aparece un poco más tarde.",
"input.suggestion.onScreenLabel": "Estado del overlay",
"input.suggestion.onScreen": "En pantalla",
"input.suggestion.offScreen": "Oculto",
"input.suggestion.generating": "Generando…",
"input.kbView.knowledge": "Base de conocimiento",
"input.kbView.insights": "Análisis de entrada",
"input.insights.tabs.overview": "Resumen",
"input.insights.tabs.keyboard": "Teclado",
"input.insights.tabs.mouse": "Ratón",
"input.insights.tabs.apps": "Aplicaciones",
"input.insights.tabs.phrases": "Frases · sugerencias",
"input.insights.chars": "Caracteres escritos",
"input.insights.wordChars": "Caracteres",
"input.insights.backspaces": "Borrados",
"input.insights.shortcuts": "Atajos",
"input.insights.doubleClicks": "Doble clic",
"input.insights.scrollTicks": "Desplazamiento",
"input.insights.activeMinutes": "Tiempo activo",
"input.insights.activeDays": "Días registrados",
"input.insights.streak": "Racha más larga",
"input.insights.peakDay": "Día con más actividad",
"input.insights.perDayAverage": "Promedio diario",
"input.insights.mouseDistanceTotal": "Recorrido total del ratón",
"input.insights.hourlyTitle": "Por hora (0-23)",
"input.insights.dailyTitle": "Tendencia diaria",
"input.insights.wordsDailyTitle": "Palabras por día",
"input.insights.distanceDailyTitle": "Recorrido diario del ratón",
"input.insights.topHoursHint": "Busiest hours: {{hours}}",
"input.insights.mouseNote": "Mouse travel is the sum of per-axis absolute deltas (Manhattan), the same measure ActivityWatch uses.",
"input.insights.appsHint": "Top apps by typing volume. The bar is that app’s share of all keystrokes.",
"input.insights.suggestions": "Sugerencias",
"input.insights.suggestionsTotal": "Generadas",
"input.insights.suggestionsAccepted": "Aceptadas",
"input.insights.acceptRate": "Tasa de aceptación",
"input.insights.avgLatency": "Respuesta media",
"input.insights.suggestionHistory": "Sugerencias recientes",
"input.insights.accepted": "aceptada",
"input.insights.notAccepted": "no aceptada",
"input.insights.noSuggestions": "No suggestions recorded yet.",
"input.insights.samplesNote": "{{count}} learned samples.",
"input.insights.collectedAt": "Last capture {{at}}",
"input.insights.rangeLabel": "Rango",
"input.insights.rangeDays": "{{days}} días",
"input.insights.headerSummary": "Last {{days}} days · {{keys}} keystrokes · {{apps}} apps",
"input.insights.disabledHint": "Input collection is off. Turn it on in Settings > Input and statistics will collect here.",
"input.insights.statsMovedHint": "Las estadísticas detalladas están en Base de conocimiento > Análisis de entrada.",
"input.chart.max": "máx. {{value}}",
"input.chart.noData": "Aún no hay datos.",
"input.unit.perDay": "/día",
"input.unit.perDayMeters": "m/día",
"input.unit.meters": "m",
"input.unit.ms": "ms",
"input.unit.percent": "%",
"popup.suggestion.warming": "Preparando el modelo…",
"popup.suggestion.hintGenerating": "Generando…",
"keybinding.action.suggestionPrev": "Sugerencia anterior",
"keybinding.action.suggestionPrev.desc": "Pasa al candidato anterior.",
"input.insights.tabs.graph": "Grafo",
"input.graph.description": "Your sentences are stored as nodes and their relations as edges (what follows what, which share terms) so suggestions can pull personal context. Local only.",
"input.graph.nodes": "Nodos de frase",
"input.graph.followsEdges": "Enlaces de continuación",
"input.graph.sharesEdges": "Enlaces por términos",
"input.graph.topEdges": "Enlaces más fuertes",
"input.graph.recentNodes": "Nodos recientes",
"input.graph.searchLabel": "Buscar una frase",
"input.graph.searchPlaceholder": "e.g. meeting schedule",
"input.graph.searchAction": "Buscar",
"input.graph.neighbors": "Frases conectadas",
"input.graph.empty": "The graph is empty. Enable \"Learn the text I type\" in Settings > Input and it fills up.",
"input.graph.kindFollows": "continúa",
"input.graph.kindShares": "comparte términos",
"popup.suggestion.generating": "Generando… ({{seconds}} s)",
"keybinding.ui.auditClear": "No hay conflictos ni ajustes de atajos no válidos.",
"keybinding.ui.auditIssues": "{{count}} problemas de atajos",
"keybinding.ui.auditInvalid": "{{action}}: {{reason}}",
"keybinding.ui.auditConflict": "{{action}} entra en conflicto con {{conflicts}}",
"keybinding.ui.auditUnknown": "Problema desconocido",
"input.flow.title": "Horas de mayor concentración",
"input.flow.empty": "Aún no hay suficientes datos horarios de escritura.",
"input.flow.hour": "{{hour}}:00",
"input.flow.window": "Puntuación {{score}} · {{minutes}} min activos/día · {{friction}} % de ediciones",
"input.friction.title": "Fricción de edición",
"input.friction.value": "{{count}} por 100 caracteres",
"input.friction.band.steady": "Estable",
"input.friction.band.watch": "Vigilar",
"input.friction.band.high": "Alta",
"input.appQuality.title": "Calidad de sugerencias por app",
"input.appQuality.empty": "Aún no hay historial de sugerencias por app.",
"input.appQuality.row": "{{accepted}}/{{total}} aceptadas · {{rate}} % · {{latency}} ms",
"input.phrases.metadata": "{{source}} · {{count}}× · {{app}}",
"input.phrases.appUnknown": "Compartido",
"input.privacy.title": "Recibo de datos locales",
"input.privacy.localOnly": "Estos datos permanecen en este dispositivo.",
"input.privacy.rawKeys": "No se conservan eventos individuales ni códigos de teclas. Las muestras de texto aprendido se muestran por separado abajo.",
"input.privacy.activityRetention": "Retención de actividad",
"input.privacy.suggestionRetention": "Retención de sugerencias",
"input.privacy.learnedRetention": "Retención de texto aprendido",
"input.privacy.activityBuckets": "Bloques de actividad",
"input.privacy.typingSamples": "Muestras de escritura",
"input.privacy.personalPhrases": "Frases personales",
"input.privacy.suggestions": "Registros de sugerencias",
"input.privacy.days": "{{days}} días",
"input.privacy.untilDeleted": "Hasta eliminarse",
"input.exclusion.recommendation": "{{app}} tuvo {{samples}} entradas repetidamente ilegibles ({{reason}}).",
"input.exclusion.reason.repeated-unreadable": "repetidamente ilegible",
"input.exclusion.reason.repeated-empty": "repetidamente vacía",
"input.exclusion.addButton": "Añadir {{app}} a exclusiones",
"input.feedback.recommendationSaved": "{{app}} se añadió a exclusiones.",
"popup.suggestion.sourceModel": "Modelo local",
"popup.suggestion.sourceMemory": "Memoria local",
"popup.suggestion.continuations": "continuaciones",
"popup.suggestion.related": "relacionadas",
"popup.suggestion.phrases": "frases",
"popup.suggestion.appPhrases": "frases de la app",
"input.privacy.typingSamplesRetention": "Retención de muestras de texto escrito",
"input.privacy.unavailable": "El recibo de datos locales no está disponible ahora. No se muestran cantidades ni retención.",
"input.feedback.clearFailed": "No se pudieron eliminar los datos recopilados.",
"input.feedback.excludedFailed": "No se pudieron guardar las exclusiones.",
"input.feedback.recommendationFailed": "No se pudo añadir {{app}} a las exclusiones."
}