feat(learn): spelling and grammar checked as people write (ADR 0024)

Where the instance's LanguageTool checks the language, the editors
underline what it finds after a pause, a paragraph at a time, a tap
offering its suggestions (GrammarHost, GrammarCheckController,
GrammarOverlay; nothing written into the document). A card's front is
checked in the studyset's front language, its back and answers in the
back's, everything else in the language recognised.

In a private studyset nothing is sent until the person agrees for it,
asked once in a banner above the editor and kept in their settings
(an agreement under privateAgreements, a refusal in grammarDeclined,
settings schema 14), taken back in the studyset's privacy dialog.
Settings > Writing turns it off on the device.

The field's Check asks LanguageTool first where it checks the
studyset's language, in a sheet offering to ask the assistant why;
elsewhere it asks the assistant as before (amends ADR 0021, D54).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-25 23:51:45 +01:00
commit d2eaef255e
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -666,6 +666,12 @@
"settingsStudy": "Study",
"settingsStudyPomodoroTitle": "Show the Pomodoro timer while studying",
"settingsStudyPomodoroSubtitle": "Show the focus / break countdown inside the study session, so you can see the time left without opening the notification.",
"settingsWriting": "Writing",
"@settingsWriting": {"description": "Settings' card on checking what is written (ADR 0024)."},
"settingsGrammarTitle": "Check grammar while writing",
"settingsGrammarSubtitle": "Underline possible spelling and grammar mistakes in flashcards and notes, with one-tap fixes. Checks run when you pause, in the studyset's languages.",
"settingsGrammarUnavailable": "This instance has no spelling and grammar check set up yet, so nothing is underlined. Left on, checking starts once it has one.",
"@settingsGrammarUnavailable": {"description": "Below the switch where the instance runs no LanguageTool."},
"settingsVersion": "Version {version} (build {build})",
"@settingsVersion": {"placeholders": {"version": {"type": "String"}, "build": {"type": "String"}}},
"syncTitle": "Sync",
@ -2217,6 +2223,11 @@
"@studysetPrivacyAssistants": {"description": "The privacy dialog's list of the assistants agreed to (D17)."},
"studysetPrivacyTakeBack": "Take back",
"@studysetPrivacyTakeBack": {"description": "Takes an agreement back."},
"studysetPrivacyGrammar": "Spelling and grammar",
"@studysetPrivacyGrammar": {"description": "The privacy dialog's answer on checking what is written (ADR 0024)."},
"studysetPrivacyGrammarChecked": "Checked by {instance} as you write",
"@studysetPrivacyGrammarChecked": {"placeholders": {"instance": {"type": "String"}}},
"studysetPrivacyGrammarNotChecked": "Not checked as you write",
"studyMissedExplain": "Missed it? {name} can explain why.",
"@studyMissedExplain": {"description": "After a card was rated Bad (ADR 0021, D53); name is the assistant's.", "placeholders": {"name": {"type": "String"}}},
"assistantExplain": "Explain",
@ -2229,6 +2240,23 @@
"@assistantWhyTyped": {"description": "The question an assistant is asked about a reading typed wrong.", "placeholders": {"typed": {"type": "String"}}},
"assistantCheck": "Check for mistakes",
"@assistantCheck": {"description": "Has an assistant check what was written in the field (D54)."},
"grammarNoSuggestions": "No suggestions",
"@grammarNoSuggestions": {"description": "In place of suggestions for a mistake that has none."},
"grammarNothingFound": "No spelling or grammar mistakes found",
"grammarPrivateAsk": "Check spelling and grammar in this private studyset? While it is checked, what you write here goes to {instance} readable, a paragraph at a time; neither the instance nor its LanguageTool keeps any of it. You're asked once for this studyset and its topics.",
"@grammarPrivateAsk": {"placeholders": {"instance": {"type": "String"}}, "description": "The banner above an editor in a private studyset not asked yet (ADR 0024)."},
"grammarPrivateNotHere": "Not here",
"grammarPrivateCheckHere": "Check here",
"grammarCheckTitle": "Spelling and grammar",
"@grammarCheckTitle": {"description": "The field's Check sheet, what the instance's LanguageTool found."},
"grammarCheckTooOften": "Checked too often for now. Try again in a minute.",
"grammarCheckTooLong": "Too long to check at once.",
"grammarCheckUnknownLanguage": "The instance doesn't check this language.",
"grammarCheckFailed": "The instance's check couldn't be reached. Try again later.",
"grammarCheckAskWhy": "Ask {name} why",
"@grammarCheckAskWhy": {"placeholders": {"name": {"type": "String"}}},
"grammarCheckAskInstead": "Ask {name} to check",
"@grammarCheckAskInstead": {"placeholders": {"name": {"type": "String"}}},
"proposalsTitle": "Flashcards by {name}",
"@proposalsTitle": {"description": "The sheet of cards an assistant proposes (ADR 0021, D55).", "placeholders": {"name": {"type": "String"}}},
"proposalsWriting": "{name} is writing flashcards…",