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": "Saisissez une combinaison (ex : Ctrl+Shift+Q) ou une touche seule (ex : F5)",
"keybinding.ui.recordAgain": "Ressaisir",
"keybinding.ui.saveFailed": "Le raccourci n'a pas pu être enregistré",
"keybinding.ui.globalEnabled": "Activer les raccourcis globaux"
"keybinding.ui.globalEnabled": "Activer les raccourcis globaux",
"input.tab": "Saisie",
"input.consent.title": "Collecte des données de saisie",
"input.consent.description": "Facultatif. Nous comptons les frappes et les clics et mesurons la distance parcourue par la souris pour afficher vos habitudes de saisie. Les touches pressées ne sont jamais enregistrées.",
"input.consent.collect": "Collecter les statistiques clavier et souris",
"input.consent.running": "Collecte en cours.",
"input.consent.stopped": "La collecte est désactivée. Rien n’est enregistré.",
"input.consent.pause": "Suspendre la collecte",
"input.consent.learnText": "Apprendre le texte que je saisis",
"input.consent.learnTextHint": "Lit le champ de saisie actif pour apprendre votre style. Les champs de mot de passe sont toujours ignorés.",
"input.consent.excludedApps": "Applications exclues",
"input.consent.excludedAppsPlaceholder": "keepassxc.exe, 1password.exe",
"input.consent.excludedAppsHint": "Noms d’exécutables séparés par des virgules. Rien n’est lu ni compté dans ces applications.",
"input.consent.clearAll": "Supprimer les données collectées",
"input.suggestion.title": "Suggestions de phrase suivante",
"input.suggestion.description": "Prédit la phrase que vous allez écrire et l’affiche près du curseur. Acceptez pour l’insérer.",
"input.suggestion.enabled": "Afficher les suggestions pendant la saisie",
"input.suggestion.modelReady": "Modèle local prêt.",
"input.suggestion.modelMissing": "Le modèle local n’est pas démarré — suggestions désactivées.",
"input.suggestion.delay": "Délai (ms)",
"input.suggestion.minPrefix": "Caractères minimum",
"input.suggestion.modelDefault": "Utiliser le modèle par défaut",
"input.suggestion.overlayInteractive": "Autoriser le clic sur la suggestion",
"input.suggestion.overlayVisible": "Suggestion affichée",
"input.suggestion.keyHint": "Accepter, parcourir et fermer sont des raccourcis globaux — modifiez-les dans Réglages > Raccourcis.",
"input.suggestion.requestNow": "Suggérer maintenant",
"input.suggestion.usage": "{{requests}} sur {{budget}} requêtes utilisées aujourd’hui",
"input.suggestion.lastSkip": "Dernier motif d’ignorance : {{reason}}",
"input.insights.title": "{{days}} derniers jours",
"input.insights.keystrokes": "Frappes",
"input.insights.clicks": "Clics",
"input.insights.words": "Mots saisis",
"input.insights.sentences": "Phrases",
"input.insights.mouseDistance": "Trajet de la souris",
"input.insights.perDayMeters": " m/jour",
"input.insights.phrases": "Phrases personnelles",
"input.insights.empty": "Aucune activité collectée pour le moment.",
"input.insights.topApps": "Où vous saisissez le plus",
"input.insights.appRow": "{{keystrokes}} touches · {{clicks}} clics",
"input.insights.privacyNote": "Seuls des compteurs et des distances sont stockés sur cet appareil. Le contenu des touches n’est jamais enregistré.",
"input.phrases.title": "Phrases personnelles",
"input.phrases.description": "Phrases apprises de votre saisie et de votre dictée, utilisées pour imiter votre style.",
"input.phrases.empty": "Rien appris pour l’instant.",
"input.phrases.delete": "Supprimer la phrase",
"input.feedback.excludedSaved": "Exclusions enregistrées.",
"input.feedback.cleared": "Données collectées supprimées.",
"popup.suggestion.hintAccept": "Accepter",
"popup.suggestion.hintNext": "Suivant",
"popup.suggestion.hintDismiss": "Fermer",
"popup.suggestion.loading": "Génération…",
"keybinding.ui.sectionInput": "Suggestions de saisie",
"keybinding.action.suggestionAccept": "Accepter la suggestion",
"keybinding.action.suggestionAccept.desc": "Insère la phrase suggérée dans l’application active.",
"keybinding.action.suggestionNext": "Suggestion suivante",
"keybinding.action.suggestionNext.desc": "Passe au candidat suivant.",
"keybinding.action.suggestionDismiss": "Fermer la suggestion",
"keybinding.action.suggestionDismiss.desc": "Masque la suggestion actuelle.",
"input.suggestion.timeout": "Limite de réponse (ms)",
"input.suggestion.latency": "Dernière réponse : {{ms}} ms",
"input.suggestion.slowWarning": "Plus lent que la frappe — essayez un modèle plus petit.",
"input.diagnostics.title": "Diagnostic en direct",
"input.diagnostics.app": "Application active : {{app}}",
"input.diagnostics.unknownApp": "(inconnue)",
"input.diagnostics.noSnapshot": "Aucun champ lu pour le moment — cliquez dans un champ de texte et tapez.",
"input.diagnostics.readable": "Champ lisible ({{source}}, {{length}} caractères) — les suggestions peuvent fonctionner.",
"input.diagnostics.notReadable": "Cette application n'expose pas son champ de texte : ce qui est saisi n'est pas lisible, donc aucune suggestion.",
"input.diagnostics.password": "Champ de mot de passe — lecture bloquée par conception.",
"input.diagnostics.caretFallback": "Position du curseur inconnue ; fin du document utilisée.",
"input.diagnostics.composing": "Composition IME en cours — la suggestion arrive un peu plus tard.",
"input.suggestion.onScreenLabel": "État de l'overlay",
"input.suggestion.onScreen": "À l’écran",
"input.suggestion.offScreen": "Masqué",
"input.suggestion.generating": "Génération…",
"input.kbView.knowledge": "Base de connaissances",
"input.kbView.insights": "Analyse de saisie",
"input.insights.tabs.overview": "Aperçu",
"input.insights.tabs.keyboard": "Clavier",
"input.insights.tabs.mouse": "Souris",
"input.insights.tabs.apps": "Applications",
"input.insights.tabs.phrases": "Phrases · suggestions",
"input.insights.chars": "Caractères saisis",
"input.insights.wordChars": "Caractères",
"input.insights.backspaces": "Retours arrière",
"input.insights.shortcuts": "Raccourcis",
"input.insights.doubleClicks": "Doubles clics",
"input.insights.scrollTicks": "Défilement",
"input.insights.activeMinutes": "Temps actif",
"input.insights.activeDays": "Jours enregistrés",
"input.insights.streak": "Plus longue série",
"input.insights.peakDay": "Jour le plus actif",
"input.insights.perDayAverage": "Moyenne journalière",
"input.insights.mouseDistanceTotal": "Trajet total de la souris",
"input.insights.hourlyTitle": "Par heure (0-23)",
"input.insights.dailyTitle": "Évolution quotidienne",
"input.insights.wordsDailyTitle": "Mots par jour",
"input.insights.distanceDailyTitle": "Trajet quotidien de la souris",
"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": "Suggestions",
"input.insights.suggestionsTotal": "Générées",
"input.insights.suggestionsAccepted": "Acceptées",
"input.insights.acceptRate": "Taux d'acceptation",
"input.insights.avgLatency": "Réponse moyenne",
"input.insights.suggestionHistory": "Suggestions récentes",
"input.insights.accepted": "acceptée",
"input.insights.notAccepted": "non acceptée",
"input.insights.noSuggestions": "No suggestions recorded yet.",
"input.insights.samplesNote": "{{count}} learned samples.",
"input.insights.collectedAt": "Last capture {{at}}",
"input.insights.rangeLabel": "Période",
"input.insights.rangeDays": "{{days}} jours",
"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": "Les statistiques détaillées se trouvent dans Base de connaissances > Analyse de saisie.",
"input.chart.max": "max {{value}}",
"input.chart.noData": "Pas encore de données.",
"input.unit.perDay": "/jour",
"input.unit.perDayMeters": "m/jour",
"input.unit.meters": "m",
"input.unit.ms": "ms",
"input.unit.percent": "%",
"popup.suggestion.warming": "Préparation du modèle…",
"popup.suggestion.hintGenerating": "Génération…",
"keybinding.action.suggestionPrev": "Suggestion précédente",
"keybinding.action.suggestionPrev.desc": "Passe au candidat précédent.",
"input.insights.tabs.graph": "Graphe",
"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": "Nœuds de phrase",
"input.graph.followsEdges": "Liens de suite",
"input.graph.sharesEdges": "Liens par termes",
"input.graph.topEdges": "Liens les plus forts",
"input.graph.recentNodes": "Nœuds récents",
"input.graph.searchLabel": "Rechercher une phrase",
"input.graph.searchPlaceholder": "e.g. meeting schedule",
"input.graph.searchAction": "Rechercher",
"input.graph.neighbors": "Phrases connectées",
"input.graph.empty": "The graph is empty. Enable \"Learn the text I type\" in Settings > Input and it fills up.",
"input.graph.kindFollows": "suite",
"input.graph.kindShares": "termes partagés",
"popup.suggestion.generating": "Génération… ({{seconds}} s)",
"keybinding.ui.auditClear": "Aucun conflit ni réglage de raccourci invalide.",
"keybinding.ui.auditIssues": "{{count}} problèmes de raccourcis",
"keybinding.ui.auditInvalid": "{{action}} : {{reason}}",
"keybinding.ui.auditConflict": "{{action}} est en conflit avec {{conflicts}}",
"keybinding.ui.auditUnknown": "Problème inconnu",
"input.flow.title": "Créneaux de concentration probables",
"input.flow.empty": "Pas encore assez de données de saisie par heure.",
"input.flow.hour": "{{hour}}:00",
"input.flow.window": "Score {{score}} · {{minutes}} min actives/jour · {{friction}} % de modifications",
"input.friction.title": "Friction d’édition",
"input.friction.value": "{{count}} pour 100 caractères",
"input.friction.band.steady": "Stable",
"input.friction.band.watch": "À surveiller",
"input.friction.band.high": "Élevée",
"input.appQuality.title": "Qualité des suggestions par app",
"input.appQuality.empty": "Pas encore d’historique de suggestions par app.",
"input.appQuality.row": "{{accepted}}/{{total}} acceptées · {{rate}} % · {{latency}} ms",
"input.phrases.metadata": "{{source}} · {{count}}× · {{app}}",
"input.phrases.appUnknown": "Partagé",
"input.privacy.title": "Reçu de données locales",
"input.privacy.localOnly": "Ces données restent sur cet appareil.",
"input.privacy.rawKeys": "Les événements individuels et codes de touches bruts ne sont pas conservés. Les échantillons de texte appris sont indiqués séparément ci-dessous.",
"input.privacy.activityRetention": "Conservation de l’activité",
"input.privacy.suggestionRetention": "Conservation des suggestions",
"input.privacy.learnedRetention": "Conservation du texte appris",
"input.privacy.activityBuckets": "Blocs d’activité",
"input.privacy.typingSamples": "Échantillons de saisie",
"input.privacy.personalPhrases": "Phrases personnelles",
"input.privacy.suggestions": "Enregistrements de suggestions",
"input.privacy.days": "{{days}} jours",
"input.privacy.untilDeleted": "Jusqu’à suppression",
"input.exclusion.recommendation": "{{app}} a eu {{samples}} saisies illisibles répétées ({{reason}}).",
"input.exclusion.reason.repeated-unreadable": "illisible à répétition",
"input.exclusion.reason.repeated-empty": "vide à répétition",
"input.exclusion.addButton": "Ajouter {{app}} aux exclusions",
"input.feedback.recommendationSaved": "{{app}} a été ajouté aux exclusions.",
"popup.suggestion.sourceModel": "Modèle local",
"popup.suggestion.sourceMemory": "Mémoire locale",
"popup.suggestion.continuations": "suites",
"popup.suggestion.related": "liées",
"popup.suggestion.phrases": "phrases",
"popup.suggestion.appPhrases": "phrases de l’app",
"input.privacy.typingSamplesRetention": "Conservation des échantillons de texte saisi",
"input.privacy.unavailable": "Le reçu de données locales est indisponible. Les quantités et durées de conservation ne sont pas affichées.",
"input.feedback.clearFailed": "Les données collectées n’ont pas pu être supprimées.",
"input.feedback.excludedFailed": "Les exclusions n’ont pas pu être enregistrées.",
"input.feedback.recommendationFailed": "Impossible d’ajouter {{app}} aux exclusions."
}