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

@ -3508,6 +3508,30 @@ abstract class AppLocalizations {
/// **'Show the focus / break countdown inside the study session, so you can see the time left without opening the notification.'**
String get settingsStudyPomodoroSubtitle;
/// Settings' card on checking what is written (ADR 0024).
///
/// In en, this message translates to:
/// **'Writing'**
String get settingsWriting;
/// No description provided for @settingsGrammarTitle.
///
/// In en, this message translates to:
/// **'Check grammar while writing'**
String get settingsGrammarTitle;
/// No description provided for @settingsGrammarSubtitle.
///
/// In en, this message translates to:
/// **'Underline possible spelling and grammar mistakes in flashcards and notes, with one-tap fixes. Checks run when you pause, in the studyset\'s languages.'**
String get settingsGrammarSubtitle;
/// Below the switch where the instance runs no LanguageTool.
///
/// In en, this message translates to:
/// **'This instance has no spelling and grammar check set up yet, so nothing is underlined. Left on, checking starts once it has one.'**
String get settingsGrammarUnavailable;
/// No description provided for @settingsVersion.
///
/// In en, this message translates to:
@ -11102,6 +11126,24 @@ abstract class AppLocalizations {
/// **'Take back'**
String get studysetPrivacyTakeBack;
/// The privacy dialog's answer on checking what is written (ADR 0024).
///
/// In en, this message translates to:
/// **'Spelling and grammar'**
String get studysetPrivacyGrammar;
/// No description provided for @studysetPrivacyGrammarChecked.
///
/// In en, this message translates to:
/// **'Checked by {instance} as you write'**
String studysetPrivacyGrammarChecked(String instance);
/// No description provided for @studysetPrivacyGrammarNotChecked.
///
/// In en, this message translates to:
/// **'Not checked as you write'**
String get studysetPrivacyGrammarNotChecked;
/// After a card was rated Bad (ADR 0021, D53); name is the assistant's.
///
/// In en, this message translates to:
@ -11138,6 +11180,78 @@ abstract class AppLocalizations {
/// **'Check for mistakes'**
String get assistantCheck;
/// In place of suggestions for a mistake that has none.
///
/// In en, this message translates to:
/// **'No suggestions'**
String get grammarNoSuggestions;
/// No description provided for @grammarNothingFound.
///
/// In en, this message translates to:
/// **'No spelling or grammar mistakes found'**
String get grammarNothingFound;
/// The banner above an editor in a private studyset not asked yet (ADR 0024).
///
/// In en, this message translates to:
/// **'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.'**
String grammarPrivateAsk(String instance);
/// No description provided for @grammarPrivateNotHere.
///
/// In en, this message translates to:
/// **'Not here'**
String get grammarPrivateNotHere;
/// No description provided for @grammarPrivateCheckHere.
///
/// In en, this message translates to:
/// **'Check here'**
String get grammarPrivateCheckHere;
/// The field's Check sheet, what the instance's LanguageTool found.
///
/// In en, this message translates to:
/// **'Spelling and grammar'**
String get grammarCheckTitle;
/// No description provided for @grammarCheckTooOften.
///
/// In en, this message translates to:
/// **'Checked too often for now. Try again in a minute.'**
String get grammarCheckTooOften;
/// No description provided for @grammarCheckTooLong.
///
/// In en, this message translates to:
/// **'Too long to check at once.'**
String get grammarCheckTooLong;
/// No description provided for @grammarCheckUnknownLanguage.
///
/// In en, this message translates to:
/// **'The instance doesn\'t check this language.'**
String get grammarCheckUnknownLanguage;
/// No description provided for @grammarCheckFailed.
///
/// In en, this message translates to:
/// **'The instance\'s check couldn\'t be reached. Try again later.'**
String get grammarCheckFailed;
/// No description provided for @grammarCheckAskWhy.
///
/// In en, this message translates to:
/// **'Ask {name} why'**
String grammarCheckAskWhy(String name);
/// No description provided for @grammarCheckAskInstead.
///
/// In en, this message translates to:
/// **'Ask {name} to check'**
String grammarCheckAskInstead(String name);
/// The sheet of cards an assistant proposes (ADR 0021, D55).
///
/// In en, this message translates to: