Add four years of English from the gymnasium syllabus.

Each year mixes listening, reading, writing, gap-fill, quizzes, and a year test so the subject is usable through the maturita.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
pepaskopec-blip 2026-10-07 10:42:28 +02:00
commit bb93ec76ec
32 changed files with 6607 additions and 14 deletions

1331
src/english.c Normal file

File diff suppressed because it is too large Load diff

86
src/english_i18n.inc Normal file
View file

@ -0,0 +1,86 @@
{"en_years_sub", "Čtyři ročníky podle osnov gymnázia, od A2 k maturitě.", "Four years of the gymnasium syllabus, from A2 to the exam."},
{"en_year1", "1. ročník", "Year 1"},
{"en_year2", "2. ročník", "Year 2"},
{"en_year3", "3. ročník", "Year 3"},
{"en_year4", "4. ročník", "Year 4"},
{"en_sec_read", "Čtení", "Reading"},
{"en_sec_listen", "Poslech", "Listening"},
{"en_sec_write", "Psaní", "Writing"},
{"en_sec_gap", "Doplňte", "Complete"},
{"en_sec_quiz", "Kvíz", "Quiz"},
{"en_sec_test", "Jazyková část", "Language"},
{"en_play", "Přehrát", "Play"},
{"en_listen_note", "Nejdřív si přečtěte otázky. Nahrávku přehraje hlas zařízení. Bez něj se věty ukážou postupně.", "Read the questions first. The device voice plays the recording. Without one, the sentences appear one by one."},
{"en_listen_first", "Nejdřív poslech přehrajte.", "Play the recording first."},
{"en_listen_fallback", "Hlas není dostupný, věty se ukazují postupně.", "No voice is available, so the sentences appear one by one."},
{"en_write_short", "Text je krátký nebo v něm chybí požadovaná slova.", "The text is short or it misses the required words."},
{"en_model", "Vzor", "Model"},
{"en_write_ph", "Pište anglicky…", "Write in English…"},
{"en_y1_sub", "Osobní život, škola, domov a minulost. Úroveň A2.", "Personal life, school, home and the past. Level A2."},
{"en_y1_u1", "Já a moje rodina", "Me and my family"},
{"en_y1_u1_sub", "Sloveso be, have got a přivlastňovací zájmena. Doplňování a kvíz.", "The verb be, have got and possessives. Gaps and a quiz."},
{"en_y1_u2", "Školní den", "A school day"},
{"en_y1_u2_sub", "Přítomný čas prostý. Čtení a doplňování.", "The present simple. Reading and gaps."},
{"en_y1_u3", "Víkend ve městě", "A weekend in town"},
{"en_y1_u3_sub", "Přítomný čas průběhový pro domluvené plány. Poslech.", "The present continuous for arrangements. Listening."},
{"en_y1_u4", "Můj pokoj", "My room"},
{"en_y1_u4_sub", "There is / there are a předložky místa. Krátký popis a kvíz.", "There is / there are and prepositions. A short description and a quiz."},
{"en_y1_u5", "Na trhu", "At the market"},
{"en_y1_u5_sub", "Počitatelnost, some a any, how much a how many. Čtení a doplňování.", "Countability, some and any, how much and how many. Reading and gaps."},
{"en_y1_u6", "Minulé léto", "Last summer"},
{"en_y1_u6_sub", "Minulý čas prostý, pravidelná i nepravidelná slovesa. Poslech a kvíz.", "The past simple, regular and irregular verbs. Listening and a quiz."},
{"en_y1_u7", "Zpráva kamarádovi", "A message to a friend"},
{"en_y1_u7_sub", "Will a going to. Krátká neformální zpráva a doplňování.", "Will and going to. A short informal message and gaps."},
{"en_y1_u8", "Test 1. ročníku", "Year 1 test"},
{"en_y1_u8_sub", "Čtení, poslech, gramatika a krátké psaní. Úroveň A2.", "Reading, listening, grammar and a short piece of writing. Level A2."},
{"en_y2_sub", "Cestování, zdraví, práce, média a příroda. Úroveň B1.", "Travel, health, work, the media and nature. Level B1."},
{"en_y2_u1", "Na cestách", "On the road"},
{"en_y2_u1_sub", "Stupňování a minulý čas průběhový. Doplňování a kvíz.", "Comparison and the past continuous. Gaps and a quiz."},
{"en_y2_u2", "U lékaře", "At the clinic"},
{"en_y2_u2_sub", "Should, must a have to. Čtení letáku a kvíz.", "Should, must and have to. A leaflet and a quiz."},
{"en_y2_u3", "První brigáda", "A first job"},
{"en_y2_u3_sub", "Předpřítomný čas, for a since. Poslech pohovoru a doplňování.", "The present perfect, for and since. A job interview and gaps."},
{"en_y2_u4", "Recenze filmu", "A film review"},
{"en_y2_u4_sub", "Vztažné věty who, which a that. Krátká recenze a kvíz.", "Relative clauses with who, which and that. A short review and a quiz."},
{"en_y2_u5", "Počasí a výlet", "Weather and a trip"},
{"en_y2_u5_sub", "Too a enough, will a going to v předpovědi. Čtení a doplňování.", "Too and enough, will and going to in a forecast. Reading and gaps."},
{"en_y2_u6", "Festival", "A festival"},
{"en_y2_u6_sub", "Předpřítomný čas proti minulému. Poslech a kvíz.", "Present perfect versus past simple. Listening and a quiz."},
{"en_y2_u7", "Kdyby", "If I could"},
{"en_y2_u7_sub", "První a druhá podmínková věta. Psaní a doplňování.", "First and second conditionals. Writing and gaps."},
{"en_y2_u8", "Test 2. ročníku", "Year 2 test"},
{"en_y2_u8_sub", "Čtení, poslech, gramatika B1 a krátké psaní.", "Reading, listening, B1 grammar and a short piece of writing."},
{"en_y3_sub", "Společnost, prostředí, média a složitější gramatika. Úroveň B1 až B2.", "Society, the environment, the media and harder grammar. Level B1 to B2."},
{"en_y3_u1", "Jak se to vyrábí", "How things are made"},
{"en_y3_u1_sub", "Trpný rod v přítomnosti a minulosti. Doplňování a kvíz.", "The present and past passive. Gaps and a quiz."},
{"en_y3_u2", "Škola, o které se mluví", "A school people talk about"},
{"en_y3_u2_sub", "Nepřímá řeč oznamovací. Čtení a kvíz.", "Reported statements. Reading and a quiz."},
{"en_y3_u3", "Poslední buk", "The last beech"},
{"en_y3_u3_sub", "Podmínky a slovník prostředí. Poslech podcastu a doplňování.", "Conditionals and environment vocabulary. A podcast and gaps."},
{"en_y3_u4", "Pro a proti", "For and against"},
{"en_y3_u4_sub", "Stavba úvahy a spojovací výrazy. Esej a kvíz.", "Essay structure and linking words. An essay and a quiz."},
{"en_y3_u5", "Kdo to musel být", "It must have been"},
{"en_y3_u5_sub", "Modální slovesa dedukce. Čtení záhady a kvíz.", "Modals of deduction. A short mystery and a quiz."},
{"en_y3_u6", "Zprávy dne", "The news desk"},
{"en_y3_u6_sub", "Nepřímé otázky. Poslech rozhovoru a kvíz.", "Reported questions. An interview and a quiz."},
{"en_y3_u7", "Frázová slovesa v příběhu", "Phrasal verbs in a story"},
{"en_y3_u7_sub", "Běžná frázová slovesa. Doplňování a kvíz.", "Common phrasal verbs. Gaps and a quiz."},
{"en_y3_u8", "Test 3. ročníku", "Year 3 test"},
{"en_y3_u8_sub", "Čtení, poslech, gramatika B1+ a krátká úvaha.", "Reading, listening, B1+ grammar and a short argument."},
{"en_y4_sub", "Maturitní dovednosti: mluvení, formální psaní, čtení, poslech a gramatika. Úroveň B2.", "Exam skills: speaking, formal writing, reading, listening and grammar. Level B2."},
{"en_y4_u1", "Maturitní kartička", "The speaking card"},
{"en_y4_u1_sub", "Strategie ústní zkoušky a kolokace osobních témat. Kvíz a doplňování.", "Speaking-exam strategy and personal-topic collocations. A quiz and gaps."},
{"en_y4_u2", "Formální e-mail", "A formal email"},
{"en_y4_u2_sub", "Žádost a stížnost. Psaní a kvíz rejstříku.", "A request and a complaint. Writing and a register quiz."},
{"en_y4_u3", "Noční vlak", "The night train"},
{"en_y4_u3_sub", "Delší čtení ve stylu didaktického testu. Čtyři otázky k článku.", "A longer reading in the style of the written paper. Four questions."},
{"en_y4_u4", "Tábor ve Walesu", "A camp in Wales"},
{"en_y4_u4_sub", "Delší poslech: pohovor. Pět otázek.", "A longer listening: an interview. Five questions."},
{"en_y4_u5", "Názorová esej", "An opinion essay"},
{"en_y4_u5_sub", "Struktura názoru. Esej a kvíz o odstavcích.", "Opinion-essay structure. An essay and a quiz about paragraphs."},
{"en_y4_u6", "Slovní zásoba okruhů", "Topic vocabulary"},
{"en_y4_u6_sub", "Kolokace k maturitním tématům. Doplňování a kvíz.", "Collocations for the exam topics. Gaps and a quiz."},
{"en_y4_u7", "Gramatická ambulance", "Grammar clinic"},
{"en_y4_u7_sub", "Smíšené jevy k didaktickému testu. Kvíz a doplňování.", "Mixed points for the language paper. A quiz and gaps."},
{"en_y4_u8", "Cvičná maturita", "A practice paper"},
{"en_y4_u8_sub", "Čtení, poslech, jazyková kompetence a krátká písemná práce.", "Reading, listening, language in use and a short piece of writing."},

1907
src/english_lessons.inc Normal file

File diff suppressed because it is too large Load diff

View file

@ -20,6 +20,7 @@
#define HW_SUBJ 2 /* index of "Technické vybavení" */
#define CZ_SUBJ 3 /* index of "Český jazyk a literatura" */
#define ON_SUBJ 4 /* index of "Občanská nauka" */
#define EN_SUBJ 5 /* index of "English" */
#define MATH_SUBJ 6 /* index of "Matematika" */
#define PHY_SUBJ 7 /* index of "Fyzika" */
#define SCI_SUBJ 8 /* index of "Základy Přírodopisných věd" */
@ -56,6 +57,7 @@ extern char *app_progress_on;
extern char *app_progress_on2;
extern char *app_progress_on3;
extern char *app_progress_on4;
extern char *app_progress_en;
extern char *app_progress_mluvnice;
extern char *app_progress_cetba;
extern char *app_progress_lit;
@ -84,6 +86,7 @@ extern char *app_progress_mat4;
#define PROGRESS_ON2 app_progress_on2
#define PROGRESS_ON3 app_progress_on3
#define PROGRESS_ON4 app_progress_on4
#define PROGRESS_EN app_progress_en
#define NODE_SIZE 88.0
#define PATH_SPAC 240.0
#define ROAD_MX 150.0 /* horizontal canvas margin */
@ -903,6 +906,11 @@ void on_lessons_apply_lang(void);
GtkWidget *build_onyears_page(void);
GtkWidget *build_onmap_page(void);
void add_on_pages(GtkStack *stack);
void en_load_progress(void);
void progress_for_en(ProgressSum *out);
void en_rail_theme_reset(void);
GtkWidget *build_enyears_page(void);
void add_en_pages(GtkStack *stack);
void on2_load_progress(void);
void on2_save_progress(void);
void mark_on2_done(int lesson_id);
@ -1117,6 +1125,8 @@ void draw_physics_icon(GtkDrawingArea *area, cairo_t *cr,
int width, int height, gpointer data);
void draw_czech_flag(GtkDrawingArea *area, cairo_t *cr,
int width, int height, gpointer data);
void draw_uk_flag(GtkDrawingArea *area, cairo_t *cr,
int width, int height, gpointer data);
void draw_book_icon(GtkDrawingArea *area, cairo_t *cr,
int width, int height, gpointer data);
void draw_book_badge_icon(GtkDrawingArea *area, cairo_t *cr,

View file

@ -271,7 +271,7 @@ const TrEntry tr_ui[] = {
{"Český jazyk a literatura", "Český jazyk a literatura",
"Czech Language and Literature"},
{"Občanská nauka", "Občanská nauka", "Civics"},
{"English", "English", "English"},
{"English", "Angličtina", "English"},
{"Deutsch", "Deutsch", "Deutsch"},
{"Matematika", "Matematika", "Mathematics"},
{"Fyzika", "Fyzika", "Physics"},
@ -1619,6 +1619,7 @@ const TrEntry tr_ui[] = {
{"lit_fuks_plot_title", "Sestavte děj", "Order the plot"},
{"lit_fuks_plot_sub", "Přetáhněte části příběhu do správného pořadí.",
"Drag the story parts into the correct order."},
#include "english_i18n.inc"
#include "math_i18n.inc"
{NULL, NULL, NULL}
};
@ -2601,6 +2602,7 @@ void on_lessons_apply_lang(void);
void on2_lessons_apply_lang(void);
void on3_lessons_apply_lang(void);
void on4_lessons_apply_lang(void);
void en_lessons_apply_lang(void);
void lit_lessons_apply_lang(void);
void sci_lessons_apply_lang(void);
void fyz_lessons_apply_lang(void);
@ -2623,6 +2625,7 @@ void apply_language(void) {
on2_lessons_apply_lang();
on3_lessons_apply_lang();
on4_lessons_apply_lang();
en_lessons_apply_lang();
lit_lessons_apply_lang();
sci_lessons_apply_lang();
fyz_lessons_apply_lang();

View file

@ -416,6 +416,8 @@ static gboolean run_smoke_test(gpointer data) {
"on2unit1", "on2ex1", "on2unit16", "on2ex16",
"on3unit1", "on3ex1", "on3unit16", "on3ex16",
"on4unit1", "on4ex1", "on4unit16", "on4ex16",
"enyears", "en1map", "en4map",
"en1unit1", "en1ex1", "en4unit8", "en4ex8",
"unit1", "unit2", "unit3",
"u1e1", "u1e13", "u2e1", "u2e19", "u3e1", "u3e15",
"u1vocab", "u2vocab", "u3vocab",
@ -534,6 +536,8 @@ void activate(GtkApplication *app, gpointer user_data) {
gtk_stack_add_named(main_stack, build_on3map_page(), "on3map");
add_on3_pages(main_stack);
gtk_stack_add_named(main_stack, build_on4map_page(), "on4map");
gtk_stack_add_named(main_stack, build_enyears_page(), "enyears");
add_en_pages(main_stack);
add_on4_pages(main_stack);
gtk_stack_add_named(main_stack, build_matyears_page(), "matyears");
gtk_stack_add_named(main_stack, build_mat0map_page(), "mat0map");

View file

@ -58,6 +58,7 @@ void load_progress(void) {
on2_load_progress();
on3_load_progress();
on4_load_progress();
en_load_progress();
lit_load_progress();
sci_load_progress();
fyz_load_progress();

View file

@ -23,7 +23,8 @@ static GPtrArray *search_items;
static gboolean subject_open(int i) {
return i == 0 || i == NET_SUBJ || i == HW_SUBJ || i == CZ_SUBJ
|| i == ON_SUBJ || i == MATH_SUBJ || i == PHY_SUBJ || i == SCI_SUBJ;
|| i == ON_SUBJ || i == EN_SUBJ || i == MATH_SUBJ || i == PHY_SUBJ
|| i == SCI_SUBJ;
}
static const char *subject_page(int i) {
@ -37,6 +38,8 @@ static const char *subject_page(int i) {
return "czechmap";
if (i == ON_SUBJ)
return "onyears";
if (i == EN_SUBJ)
return "enyears";
if (i == MATH_SUBJ)
return "matyears";
if (i == PHY_SUBJ)
@ -241,6 +244,21 @@ static void catalog_rebuild(void) {
catalog_add(tr(key), tr("search_exercise"), page, FALSE, 3, "kviz quiz");
}
catalog_add_key("en_year1", "search_lesson", "en1map", FALSE, 1, "anglictina english");
catalog_add_key("en_year2", "search_lesson", "en2map", FALSE, 1, "anglictina english");
catalog_add_key("en_year3", "search_lesson", "en3map", FALSE, 1, "anglictina english");
catalog_add_key("en_year4", "search_lesson", "en4map", FALSE, 1, "anglictina english");
for (int y = 1; y <= 4; y++) {
for (i = 1; i <= 8; i++) {
g_snprintf(key, sizeof(key), "en_y%d_u%d", y, i);
g_snprintf(page, sizeof(page), "en%dunit%d", y, i);
catalog_add_key(key, "search_lesson", page, FALSE, 2, "anglictina english");
g_snprintf(page, sizeof(page), "en%dex%d", y, i);
catalog_add(tr(key), tr("search_exercise"), page, FALSE, 3,
"poslech cteni psani kviz");
}
}
catalog_add_key("Český jazyk a literatura", "search_subject",
"czechmap", FALSE, 0, "cestina czech");
catalog_add_key("Literatura", "search_lesson", "lityears", FALSE, 1,

View file

@ -71,6 +71,8 @@ void refresh_stats_ui(void) {
progress_for_hw(&all);
else if (s == ON_SUBJ)
progress_for_on(&all);
else if (s == EN_SUBJ)
progress_for_en(&all);
else if (s == CZ_SUBJ) {
progress_for_mluvnice(&all);
progress_for_lit(&all);
@ -110,7 +112,8 @@ void refresh_stats_ui(void) {
GtkWidget *bar = stats_ui.subj[s].bar;
ProgressSum sp = {0};
gboolean has_content = (s == NET_SUBJ) || (s == HW_SUBJ)
|| (s == ON_SUBJ) || (s == CZ_SUBJ)
|| (s == ON_SUBJ) || (s == EN_SUBJ)
|| (s == CZ_SUBJ)
|| (s == SCI_SUBJ) || (s == PHY_SUBJ)
|| (s == MATH_SUBJ)
|| sub_unit_count[s] > 0;
@ -123,6 +126,8 @@ void refresh_stats_ui(void) {
progress_for_hw(&sp);
else if (s == ON_SUBJ)
progress_for_on(&sp);
else if (s == EN_SUBJ)
progress_for_en(&sp);
else if (s == CZ_SUBJ) {
progress_for_mluvnice(&sp);
progress_for_lit(&sp);

View file

@ -5,9 +5,8 @@
/* ------------------------------------------------------------------ */
/* Index 0 (Deutsch), NET_SUBJ (networks), HW_SUBJ (hardware), CZ_SUBJ
* (Czech), ON_SUBJ (civics), MATH_SUBJ (mathematics), PHY_SUBJ
* (physics) and SCI_SUBJ
* (natural sciences) are unlocked. */
* (Czech), ON_SUBJ (civics), EN_SUBJ (English), MATH_SUBJ (mathematics),
* PHY_SUBJ (physics) and SCI_SUBJ (natural sciences) are unlocked. */
const char *sub_keys[NUM_SUBJECTS] = {
"Deutsch",
"Správa počítačových sítí",
@ -156,7 +155,8 @@ void draw_czech_flag(GtkDrawingArea *area, cairo_t *cr,
static gboolean subject_is_open(int i) {
return i == 0 || i == NET_SUBJ || i == HW_SUBJ || i == CZ_SUBJ
|| i == ON_SUBJ || i == MATH_SUBJ || i == PHY_SUBJ || i == SCI_SUBJ;
|| i == ON_SUBJ || i == EN_SUBJ || i == MATH_SUBJ || i == PHY_SUBJ
|| i == SCI_SUBJ;
}
static GtkWidget *subject_icon(int i) {
@ -179,6 +179,9 @@ static GtkWidget *subject_icon(int i) {
else if (i == ON_SUBJ)
gtk_drawing_area_set_draw_func(GTK_DRAWING_AREA(area),
draw_civics_icon, NULL, NULL);
else if (i == EN_SUBJ)
gtk_drawing_area_set_draw_func(GTK_DRAWING_AREA(area),
draw_uk_flag, NULL, NULL);
else if (i == MATH_SUBJ)
gtk_drawing_area_set_draw_func(GTK_DRAWING_AREA(area),
draw_math_icon, NULL, NULL);
@ -204,6 +207,8 @@ static const char *subject_target(int i) {
return "czechmap";
if (i == ON_SUBJ)
return "onyears";
if (i == EN_SUBJ)
return "enyears";
if (i == MATH_SUBJ)
return "matyears";
if (i == PHY_SUBJ)

View file

@ -430,6 +430,7 @@ void apply_theme(void) {
on2_rail_theme_reset();
on3_rail_theme_reset();
on4_rail_theme_reset();
en_rail_theme_reset();
czech_rail_theme_reset();
lit_rail_theme_reset();
sci_rail_theme_reset();

View file

@ -24,6 +24,7 @@ char *app_progress_on;
char *app_progress_on2;
char *app_progress_on3;
char *app_progress_on4;
char *app_progress_en;
char *app_progress_mluvnice;
char *app_progress_cetba;
char *app_progress_lit;
@ -181,6 +182,7 @@ static void set_progress_paths(const char *write_root) {
g_free(app_progress_on2);
g_free(app_progress_on3);
g_free(app_progress_on4);
g_free(app_progress_en);
g_free(app_progress_mluvnice);
g_free(app_progress_cetba);
g_free(app_progress_lit);
@ -210,6 +212,7 @@ static void set_progress_paths(const char *write_root) {
app_progress_on2 = g_build_filename(app_progress_dir, "on2.conf", NULL);
app_progress_on3 = g_build_filename(app_progress_dir, "on3.conf", NULL);
app_progress_on4 = g_build_filename(app_progress_dir, "on4.conf", NULL);
app_progress_en = g_build_filename(app_progress_dir, "english.conf", NULL);
app_progress_mluvnice = g_build_filename(app_progress_dir, "mluvnice.conf", NULL);
app_progress_cetba = g_build_filename(app_progress_dir, "cetba.conf", NULL);
app_progress_lit = g_build_filename(app_progress_dir, "lit.conf", NULL);