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:
parent
7070cd6bd2
commit
5479b973fc
1 changed files with 2559 additions and 230 deletions
|
|
@ -72,8 +72,9 @@ void main() {
|
|||
await tester.pumpAndSettle();
|
||||
}
|
||||
|
||||
/// Opens the studyset [id]: `japanese` (Japanese with English meanings)
|
||||
/// or `german`, on an instance with JMdict ([dictionaries]), at
|
||||
/// Opens the studyset [id]: `japanese` (Japanese with English meanings),
|
||||
/// `german`, `greek` or `chinese`, on an instance with JMdict
|
||||
/// ([dictionaries]), at
|
||||
/// [location] (the studyset's screen unless given).
|
||||
Future<void> show(
|
||||
WidgetTester tester, {
|
||||
|
|
@ -107,6 +108,28 @@ void main() {
|
|||
backLanguage: 'en',
|
||||
),
|
||||
),
|
||||
)
|
||||
..receiveRemoteChange(
|
||||
'greek',
|
||||
encodeStudysetPayload(
|
||||
StudysetContent(
|
||||
title: 'Greek',
|
||||
description: RichContent.empty(),
|
||||
frontLanguage: 'el',
|
||||
backLanguage: 'en',
|
||||
),
|
||||
),
|
||||
)
|
||||
..receiveRemoteChange(
|
||||
'chinese',
|
||||
encodeStudysetPayload(
|
||||
StudysetContent(
|
||||
title: 'Chinese',
|
||||
description: RichContent.empty(),
|
||||
frontLanguage: 'zh-Hans',
|
||||
backLanguage: 'en',
|
||||
),
|
||||
),
|
||||
);
|
||||
await pumpApp(
|
||||
tester,
|
||||
|
|
@ -259,6 +282,76 @@ void main() {
|
|||
expect(made.content.entry, (source: 'kanjidic', id: '食'));
|
||||
});
|
||||
|
||||
testWidgets("Greek's letters in a tab of their own, without radicals, "
|
||||
'added whole as character cards', (tester) async {
|
||||
await show(
|
||||
tester,
|
||||
id: 'greek',
|
||||
dictionaries: FakeDictionaryGateway(
|
||||
available: [wiktionaryEl, greekAlphabet],
|
||||
words: [
|
||||
character(
|
||||
'Β β',
|
||||
labels: ['greek'],
|
||||
romaji: 'v',
|
||||
name: 'βήτα (beta)',
|
||||
of: greekAlphabet,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
await addMaterial(tester, 'From the dictionary');
|
||||
|
||||
expect(find.text('Radicals'), findsNothing);
|
||||
await tester.tap(find.text('Alphabet'));
|
||||
await settle(tester);
|
||||
expect(find.text('Letters'), findsOneWidget);
|
||||
await tester.tap(find.text('Greek alphabet').hitTestable());
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('Add 1 character'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
final made = (await cards.cardsOf('greek')).single;
|
||||
expect(made.content.front.plainText.trim(), 'Β β');
|
||||
expect(made.content.meanings, ['v', 'βήτα (beta)']);
|
||||
});
|
||||
|
||||
testWidgets('Chinese characters by HSK level and in common use, beside '
|
||||
'the radicals in their simplified forms', (tester) async {
|
||||
await show(
|
||||
tester,
|
||||
id: 'chinese',
|
||||
dictionaries: FakeDictionaryGateway(
|
||||
available: [ccCedictHans, unihanHans],
|
||||
words: [
|
||||
character(
|
||||
'说',
|
||||
meanings: ['speak'],
|
||||
on: ['shuō'],
|
||||
labels: ['hsk:1', 'common', 'radical:149'],
|
||||
of: unihanHans,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
await addMaterial(tester, 'From the dictionary');
|
||||
|
||||
await tester.tap(find.text('Hanzi'));
|
||||
await settle(tester);
|
||||
expect(find.text('HSK levels'), findsOneWidget);
|
||||
expect(find.text('In common use'), findsOneWidget);
|
||||
expect(find.text('HSK 1'), findsOneWidget);
|
||||
await tester.tap(find.text('Radicals'));
|
||||
await settle(tester);
|
||||
// 言 as simplified Chinese writes it at a character's side.
|
||||
await tester.scrollUntilVisible(
|
||||
find.text('讠'),
|
||||
400,
|
||||
scrollable: find.byType(Scrollable).last,
|
||||
);
|
||||
expect(find.text('讠'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('a character found shows its readings and strokes, and is '
|
||||
'added as a card', (tester) async {
|
||||
await show(tester, dictionaries: withKanji());
|
||||
|
|
|
|||
Loading…
Reference in a new issue