feat(dictionary): characters of Chinese, Korean and Greek, written by hand; pinyin typed

Parity with Japanese's kanji and kana:

- The characters' tab is named by its language (Hanzi, Hangul & Hanja,
  Alphabet), its groups too: HSK levels and the characters in common use
  (Hong Kong's grades for traditional ones); Hangul and the Hanja taught
  in schools; Greek's letters. Radicals for Chinese and Korean in their
  own forms (讠 for 言 in simplified Chinese), none for Greek.
- A character's readings are named as its language names them: On and
  Kun, Pinyin, Eum and Hun (음, 훈); a letter means its sound and name.
- How characters are written comes by language: Chinese from Make Me a
  Hanzi (its medians in KanjiVG's square, Arphic Public License, a data
  file beside the app, never in cards), the Hangul letters drawn by the
  curator; a Korean word is written letter by letter (닭: ㄷ ㅏ ㄺ). Words
  of alphabets (German, Greek) aren't written by hand.
- A Chinese word's pinyin is typed in a session, tone numbers turning
  into marks (ni3 → nǐ); KRDict's levels (초급, 중급, 고급) tag Korean
  words; a Korean word's pronunciation shows in brackets ([가치]).
- Smaller: Look up in the composer keeps a noun's article; the Watch
  filter names its level list; hints and placeholders by language.

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-14 12:35:17 +02:00
commit 5479b973fc
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -3952,6 +3952,102 @@ abstract class AppLocalizations {
/// **'Kanji & kana'**
String get dictionaryTabCharacters;
/// The tab of Chinese characters in a dictionary of Chinese.
///
/// In en, this message translates to:
/// **'Hanzi'**
String get dictionaryTabCharactersChinese;
/// The tab of Korean letters and Hanja in a dictionary of Korean.
///
/// In en, this message translates to:
/// **'Hangul & Hanja'**
String get dictionaryTabCharactersKorean;
/// The tab of Greek's letters in a dictionary of Greek.
///
/// In en, this message translates to:
/// **'Alphabet'**
String get dictionaryTabCharactersGreek;
/// No description provided for @dictionaryCharacterSearchHintChinese.
///
/// In en, this message translates to:
/// **'A character, its pinyin, or a meaning'**
String get dictionaryCharacterSearchHintChinese;
/// No description provided for @dictionaryCharacterSearchHintKorean.
///
/// In en, this message translates to:
/// **'A Hanja or Hangul letter, its sound, or a meaning'**
String get dictionaryCharacterSearchHintKorean;
/// No description provided for @dictionaryCharacterSearchHintGreek.
///
/// In en, this message translates to:
/// **'A letter or its name'**
String get dictionaryCharacterSearchHintGreek;
/// No description provided for @dictionaryGroupHsk.
///
/// In en, this message translates to:
/// **'HSK levels'**
String get dictionaryGroupHsk;
/// No description provided for @dictionaryGroupCommonCharacters.
///
/// In en, this message translates to:
/// **'In common use'**
String get dictionaryGroupCommonCharacters;
/// No description provided for @dictionaryGroupHongKongGrades.
///
/// In en, this message translates to:
/// **'Hong Kong school grades'**
String get dictionaryGroupHongKongGrades;
/// No description provided for @dictionaryGroupHangul.
///
/// In en, this message translates to:
/// **'Hangul'**
String get dictionaryGroupHangul;
/// No description provided for @dictionaryGroupEducationHanja.
///
/// In en, this message translates to:
/// **'Hanja taught in schools'**
String get dictionaryGroupEducationHanja;
/// No description provided for @dictionaryGroupGreek.
///
/// In en, this message translates to:
/// **'Letters'**
String get dictionaryGroupGreek;
/// No description provided for @dictionaryLabelHangul.
///
/// In en, this message translates to:
/// **'Hangul letters'**
String get dictionaryLabelHangul;
/// No description provided for @dictionaryLabelEducationHanja.
///
/// In en, this message translates to:
/// **'1,800 basic Hanja'**
String get dictionaryLabelEducationHanja;
/// No description provided for @dictionaryLabelGreek.
///
/// In en, this message translates to:
/// **'Greek alphabet'**
String get dictionaryLabelGreek;
/// No description provided for @dictionaryLabelCommonCharacters.
///
/// In en, this message translates to:
/// **'3,500 common characters'**
String get dictionaryLabelCommonCharacters;
/// No description provided for @dictionaryLabelHiragana.
///
/// In en, this message translates to:
@ -4123,7 +4219,7 @@ abstract class AppLocalizations {
/// No description provided for @studySettingsCharacters.
///
/// In en, this message translates to:
/// **'Kanji & kana'**
/// **'Characters'**
String get studySettingsCharacters;
/// No description provided for @studySettingsWriteByHand.
@ -4135,7 +4231,7 @@ abstract class AppLocalizations {
/// No description provided for @studySettingsWriteByHandDescription.
///
/// In en, this message translates to:
/// **'Kanji, kana and words are written stroke by stroke and checked as you go, on a schedule of their own. Words written aren\'t quizzed or typed.'**
/// **'Kanji, hanzi, Hanja, kana, Hangul and words written with them are written stroke by stroke and checked as you go, on a schedule of their own (a Korean word letter by letter). Words written aren\'t quizzed or typed.'**
String get studySettingsWriteByHandDescription;
/// No description provided for @writingHint.
@ -4972,6 +5068,96 @@ abstract class AppLocalizations {
/// **'Kun'**
String get characterKun;
/// No description provided for @characterPinyin.
///
/// In en, this message translates to:
/// **'Pinyin'**
String get characterPinyin;
/// No description provided for @characterEum.
///
/// In en, this message translates to:
/// **'Eum'**
String get characterEum;
/// No description provided for @characterHun.
///
/// In en, this message translates to:
/// **'Hun'**
String get characterHun;
/// No description provided for @characterPinyinReadings.
///
/// In en, this message translates to:
/// **'Pinyin'**
String get characterPinyinReadings;
/// No description provided for @characterPinyinReadingsHint.
///
/// In en, this message translates to:
/// **'With tone marks or numbers: shuǐ, shui3'**
String get characterPinyinReadingsHint;
/// No description provided for @characterEumReadings.
///
/// In en, this message translates to:
/// **'Sounds (eum)'**
String get characterEumReadings;
/// No description provided for @characterEumReadingsHint.
///
/// In en, this message translates to:
/// **'Sino-Korean, in Hangul: 수'**
String get characterEumReadingsHint;
/// No description provided for @characterHunReadings.
///
/// In en, this message translates to:
/// **'Native meanings (hun)'**
String get characterHunReadings;
/// No description provided for @characterHunReadingsHint.
///
/// In en, this message translates to:
/// **'Korean words for its meaning, in Hangul: 물'**
String get characterHunReadingsHint;
/// No description provided for @characterPrimaryMeaningHintLetter.
///
/// In en, this message translates to:
/// **'Primary meaning, or a letter\'s sound'**
String get characterPrimaryMeaningHintLetter;
/// No description provided for @composerPlaceholderCharacterChinese.
///
/// In en, this message translates to:
/// **'Add a character'**
String get composerPlaceholderCharacterChinese;
/// No description provided for @composerPlaceholderCharacterKorean.
///
/// In en, this message translates to:
/// **'Add a Hanja or Hangul letter'**
String get composerPlaceholderCharacterKorean;
/// No description provided for @composerPlaceholderCharacterGreek.
///
/// In en, this message translates to:
/// **'Add a letter'**
String get composerPlaceholderCharacterGreek;
/// No description provided for @vocabularyReadingHintPinyin.
///
/// In en, this message translates to:
/// **'Pinyin, with tone marks or numbers'**
String get vocabularyReadingHintPinyin;
/// No description provided for @vocabularyReadingHintPronunciation.
///
/// In en, this message translates to:
/// **'Pronunciation, where it differs from the spelling'**
String get vocabularyReadingHintPronunciation;
/// No description provided for @matchingCategories.
///
/// In en, this message translates to:
@ -5659,7 +5845,7 @@ abstract class AppLocalizations {
/// No description provided for @studySettingsTypeReadingDescription.
///
/// In en, this message translates to:
/// **'Words with kanji ask for their reading, typed in kana; romaji turn into kana as you type.'**
/// **'Words with kanji ask for their reading, typed in kana (romaji turn into kana as you type); Chinese words for their pinyin (tone numbers turn into marks: ni3 becomes nǐ).'**
String get studySettingsTypeReadingDescription;
/// No description provided for @studyTypedHint.
@ -5668,6 +5854,12 @@ abstract class AppLocalizations {
/// **'The reading, in kana or romaji'**
String get studyTypedHint;
/// No description provided for @studyTypedHintPinyin.
///
/// In en, this message translates to:
/// **'The pinyin, with tone numbers or marks'**
String get studyTypedHintPinyin;
/// No description provided for @studyTypedRight.
///
/// In en, this message translates to:
@ -5707,7 +5899,7 @@ abstract class AppLocalizations {
/// No description provided for @studySettingsAspectDescription.
///
/// In en, this message translates to:
/// **'What to recall — the meaning, the kana reading, or the expression itself (shown the meaning). Mixed varies meaning and reading per card; cards that can’t be quizzed stay a normal flip.'**
/// **'What to recall — the meaning, the reading (kana, pinyin), or the expression itself (shown the meaning). Mixed varies meaning and reading per card; cards that can’t be quizzed stay a normal flip.'**
String get studySettingsAspectDescription;
/// No description provided for @studySortOldestFirst.
@ -10785,11 +10977,11 @@ abstract class AppLocalizations {
/// **'All words'**
String get watchFilterAll;
/// No description provided for @watchFilterNoLevel.
/// Words a level list (JLPT, HSK, KRDict) leaves out.
///
/// In en, this message translates to:
/// **'No JLPT level'**
String get watchFilterNoLevel;
/// **'No {levels} level'**
String watchFilterNoLevel(String levels);
/// No description provided for @watchFilterClass.
///