feat(learn): furigana and pinyin over hints, from Tatoeba's transcriptions

The curator puts Tatoeba's readings on a dictionary's examples by their
Tatoeba ID (`withTatoebaReadings`, `curate readings`, and in `update`):
furigana over JMdict's Japanese from its jpn transcriptions, pinyin with
tone marks over Chinese from its cmn ones, each word over as many Han
characters as it has syllables. An example gets `ruby`, `[start, end,
reading]` each, and `rubyUnreviewed` where no one wrote or checked them
(MeCab's furigana, the automatic pinyin). JMdict's conversion goes to 3,
so instances convert again at once.

A word's example hints carry them as ruby marks, the word still in bold.
The hints sheet shows them from the start with a switch above
(Furigana, Pinyin), kept on the device (`DeviceSettings.hintReadings`),
and below a hint whose readings no one reviewed says so.

Whats-New: Example sentences in a word's hints now show furigana or pinyin over them, with a switch to hide them.
Whats-New-De: Beispielsätze in den Hinweisen eines Worts zeigen jetzt Furigana oder Pinyin darüber, mit einem Schalter zum Ausblenden.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-10 20:28:30 +01:00
commit 3257905536
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
5 changed files with 1083 additions and 78 deletions

View file

@ -2172,5 +2172,9 @@
"libraryShelfLastWeek": "Letzte 7 Tage",
"libraryShelfLastMonth": "Letzter Monat",
"libraryShelfOlder": "Älter",
"studysetSideIntroduction": "Einführung"
"studysetSideIntroduction": "Einführung",
"cardHintsFurigana": "Furigana",
"cardHintsPinyin": "Pinyin",
"cardHintsReadings": "Text darüber",
"cardHintsReadingsUnreviewed": "Manche Lesungen wurden automatisch erstellt und nicht geprüft."
}

View file

@ -2670,5 +2670,13 @@
"libraryShelfOlder": "Older",
"@libraryShelfOlder": {"description": "The library's heading over the studysets studied or changed longer ago."},
"studysetSideIntroduction": "Introduction",
"@studysetSideIntroduction": {"description": "The part of the split beside a studyset's material showing its description, as Tomorrow University names it."}
"@studysetSideIntroduction": {"description": "The part of the split beside a studyset's material showing its description, as Tomorrow University names it."},
"cardHintsFurigana": "Furigana",
"@cardHintsFurigana": {"description": "The hints sheet's switch showing the readings over Japanese sentences."},
"cardHintsPinyin": "Pinyin",
"@cardHintsPinyin": {"description": "The hints sheet's switch showing the pinyin over Chinese sentences."},
"cardHintsReadings": "Text above",
"@cardHintsReadings": {"description": "The hints sheet's switch showing the text above its sentences, where it is neither furigana nor pinyin."},
"cardHintsReadingsUnreviewed": "Some readings were made automatically and not reviewed.",
"@cardHintsReadingsUnreviewed": {"description": "Below a hint whose readings (from Tatoeba, made by MeCab or automatic pinyin) no one reviewed."}
}

View file

@ -12817,6 +12817,30 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Introduction'**
String get studysetSideIntroduction;
/// The hints sheet's switch showing the readings over Japanese sentences.
///
/// In en, this message translates to:
/// **'Furigana'**
String get cardHintsFurigana;
/// The hints sheet's switch showing the pinyin over Chinese sentences.
///
/// In en, this message translates to:
/// **'Pinyin'**
String get cardHintsPinyin;
/// The hints sheet's switch showing the text above its sentences, where it is neither furigana nor pinyin.
///
/// In en, this message translates to:
/// **'Text above'**
String get cardHintsReadings;
/// Below a hint whose readings (from Tatoeba, made by MeCab or automatic pinyin) no one reviewed.
///
/// In en, this message translates to:
/// **'Some readings were made automatically and not reviewed.'**
String get cardHintsReadingsUnreviewed;
}
class _AppLocalizationsDelegate

View file

@ -8191,4 +8191,17 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get studysetSideIntroduction => 'Einführung';
@override
String get cardHintsFurigana => 'Furigana';
@override
String get cardHintsPinyin => 'Pinyin';
@override
String get cardHintsReadings => 'Text darüber';
@override
String get cardHintsReadingsUnreviewed =>
'Manche Lesungen wurden automatisch erstellt und nicht geprüft.';
}

View file

@ -8118,6 +8118,19 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get studysetSideIntroduction => 'Introduction';
@override
String get cardHintsFurigana => 'Furigana';
@override
String get cardHintsPinyin => 'Pinyin';
@override
String get cardHintsReadings => 'Text above';
@override
String get cardHintsReadingsUnreviewed =>
'Some readings were made automatically and not reviewed.';
}
/// The translations for English, as used in the United Kingdom (`en_GB`).