Files
Code/python/persian-tutor/scripts/build_vocab.py
local 2e8c2c11d0 Add persian-tutor: Gradio-based GCSE Persian language learning app
Vocabulary study with FSRS spaced repetition, AI tutoring (Ollama/Claude),
essay marking, idioms browser, Anki export, and dashboard. 918 vocabulary
entries across 39 categories. 41 tests passing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 01:57:44 +00:00

1101 lines
43 KiB
Python

#!/usr/bin/env python3
"""Build vocabulary.json from inline data."""
import json
from pathlib import Path
vocab = []
def add(section, category, entries):
for eng, per, fin in entries:
wid = category.lower().replace(" ", "_").replace("/", "_").replace("&", "and")
word = eng.lower().replace(" ", "_").replace("to ", "").replace("'", "")
vocab.append({
"id": f"{wid}_{word}",
"section": section,
"category": category,
"english": eng,
"persian": per,
"finglish": fin,
})
S1 = "High-frequency language"
S2 = "Topic-specific vocabulary"
# ── Common verbs ──
add(S1, "Common verbs", [
("to accept", "قبول کردن", "ghabul kardan"),
("to achieve", "بدست آوردن", "be dast âvardan"),
("to add", "اضافه کردن", "ezâfe kardan"),
("to agree", "موافقت کردن", "movâfeghat kardan"),
("to allow", "اجازه دادن", "ejâze dâdan"),
("to answer", "جواب دادن", "javâb dâdan"),
("to arrive", "رسیدن", "residan"),
("to ask", "پرسیدن", "porsidan"),
("to be", "بودن", "budan"),
("to become", "شدن", "shodan"),
("to begin", "شروع کردن", "shoru' kardan"),
("to believe", "باور کردن", "bâvar kardan"),
("to bring", "آوردن", "âvardan"),
("to build", "ساختن", "sâkhtan"),
("to buy", "خریدن", "kharidan"),
("to call", "زنگ زدن", "zang zadan"),
("to carry", "حمل کردن", "haml kardan"),
("to catch", "گرفتن", "gereftan"),
("to change", "عوض کردن", "avaz kardan"),
("to choose", "انتخاب کردن", "entekhâb kardan"),
("to close", "بستن", "bastan"),
("to come", "آمدن", "âmadan"),
("to continue", "ادامه دادن", "edâme dâdan"),
("to cook", "آشپزی کردن", "âshpazi kardan"),
("to cost", "قیمت داشتن", "gheymat dâshtan"),
("to count", "شمردن", "shemordan"),
("to create", "ایجاد کردن", "ijâd kardan"),
("to cross", "رد شدن", "rad shodan"),
("to cry", "گریه کردن", "gerye kardan"),
("to cut", "بریدن", "boridan"),
("to dance", "رقصیدن", "raghsidan"),
("to decide", "تصمیم گرفتن", "tasmim gereftan"),
("to describe", "توصیف کردن", "tosif kardan"),
("to develop", "توسعه دادن", "tose'e dâdan"),
("to die", "مردن", "mordan"),
("to do", "انجام دادن", "anjâm dâdan"),
("to draw", "نقاشی کردن", "naghâshi kardan"),
("to dream", "خواب دیدن", "khâb didan"),
("to drink", "نوشیدن", "nushidan"),
("to drive", "رانندگی کردن", "rânandegi kardan"),
("to eat", "خوردن", "khordan"),
("to enjoy", "لذت بردن", "lezzat bordan"),
("to enter", "وارد شدن", "vâred shodan"),
("to explain", "توضیح دادن", "tozih dâdan"),
("to fall", "افتادن", "oftâdan"),
("to feel", "احساس کردن", "ehsâs kardan"),
("to find", "پیدا کردن", "peydâ kardan"),
("to finish", "تمام کردن", "tamâm kardan"),
("to fly", "پرواز کردن", "parvâz kardan"),
("to follow", "دنبال کردن", "donbâl kardan"),
("to forget", "فراموش کردن", "farâmush kardan"),
("to get", "گرفتن", "gereftan"),
("to give", "دادن", "dâdan"),
("to go", "رفتن", "raftan"),
("to grow", "رشد کردن", "roshd kardan"),
("to happen", "اتفاق افتادن", "ettefâgh oftâdan"),
("to hate", "متنفر بودن", "motenaffer budan"),
("to have", "داشتن", "dâshtan"),
("to hear", "شنیدن", "shenidan"),
("to help", "کمک کردن", "komak kardan"),
("to hold", "نگه داشتن", "negah dâshtan"),
("to hope", "امیدوار بودن", "omidvâr budan"),
("to hurt", "درد کردن", "dard kardan"),
("to improve", "بهتر کردن", "behtar kardan"),
("to include", "شامل شدن", "shâmel shodan"),
("to invite", "دعوت کردن", "da'vat kardan"),
("to join", "پیوستن", "peyvastan"),
("to keep", "نگه داشتن", "negah dâshtan"),
("to kill", "کشتن", "koshtan"),
("to know", "دانستن", "dânestan"),
("to laugh", "خندیدن", "khandidan"),
("to learn", "یاد گرفتن", "yâd gereftan"),
("to leave", "ترک کردن", "tark kardan"),
("to let", "اجازه دادن", "ejâze dâdan"),
("to like", "دوست داشتن", "dust dâshtan"),
("to listen", "گوش دادن", "gush dâdan"),
("to live", "زندگی کردن", "zendegi kardan"),
("to look", "نگاه کردن", "negâh kardan"),
("to lose", "از دست دادن", "az dast dâdan"),
("to love", "عشق ورزیدن", "eshgh varzidan"),
("to make", "درست کردن", "dorost kardan"),
("to meet", "ملاقات کردن", "molâghât kardan"),
("to miss", "دلتنگ بودن", "deltang budan"),
("to move", "حرکت کردن", "harekat kardan"),
("to need", "نیاز داشتن", "niyâz dâshtan"),
("to open", "باز کردن", "bâz kardan"),
("to pay", "پرداخت کردن", "pardâkht kardan"),
("to play", "بازی کردن", "bâzi kardan"),
("to practise", "تمرین کردن", "tamrin kardan"),
("to prefer", "ترجیح دادن", "tarjih dâdan"),
("to prepare", "آماده کردن", "âmâde kardan"),
("to produce", "تولید کردن", "tolid kardan"),
("to promise", "قول دادن", "ghol dâdan"),
("to protect", "محافظت کردن", "mohâfezat kardan"),
("to pull", "کشیدن", "keshidan"),
("to push", "هل دادن", "hol dâdan"),
("to put", "گذاشتن", "gozâshtan"),
("to rain", "باران آمدن", "bârân âmadan"),
("to read", "خواندن", "khândan"),
("to receive", "دریافت کردن", "daryâft kardan"),
("to remember", "به یاد آوردن", "be yâd âvardan"),
("to repair", "تعمیر کردن", "ta'mir kardan"),
("to repeat", "تکرار کردن", "tekrâr kardan"),
("to rest", "استراحت کردن", "esterâhat kardan"),
("to return", "برگشتن", "bargashtan"),
("to run", "دویدن", "davidan"),
("to save", "نجات دادن", "nejât dâdan"),
("to say", "گفتن", "goftan"),
("to see", "دیدن", "didan"),
("to sell", "فروختن", "foroukhtan"),
("to send", "فرستادن", "ferestâdan"),
("to show", "نشان دادن", "neshân dâdan"),
("to sing", "آواز خواندن", "âvâz khândan"),
("to sit", "نشستن", "neshastan"),
("to sleep", "خوابیدن", "khâbidan"),
("to smell", "بو کردن", "bu kardan"),
("to speak", "صحبت کردن", "sohbat kardan"),
("to spend", "خرج کردن", "kharj kardan"),
("to stand", "ایستادن", "istâdan"),
("to start", "شروع کردن", "shoru' kardan"),
("to stay", "ماندن", "mândan"),
("to stop", "ایستادن", "istâdan"),
("to study", "درس خواندن", "dars khândan"),
("to succeed", "موفق شدن", "movaffagh shodan"),
("to swim", "شنا کردن", "shenâ kardan"),
("to take", "گرفتن", "gereftan"),
("to talk", "حرف زدن", "harf zadan"),
("to teach", "درس دادن", "dars dâdan"),
("to tell", "گفتن", "goftan"),
("to thank", "تشکر کردن", "tashakkor kardan"),
("to think", "فکر کردن", "fekr kardan"),
("to throw", "پرت کردن", "part kardan"),
("to touch", "لمس کردن", "lams kardan"),
("to travel", "سفر کردن", "safar kardan"),
("to try", "سعی کردن", "sa'y kardan"),
("to turn", "چرخیدن", "charkhidan"),
("to understand", "فهمیدن", "fahmidan"),
("to use", "استفاده کردن", "estefâde kardan"),
("to visit", "دیدن کردن", "didan kardan"),
("to wait", "صبر کردن", "sabr kardan"),
("to wake", "بیدار شدن", "bidâr shodan"),
("to walk", "راه رفتن", "râh raftan"),
("to want", "خواستن", "khâstan"),
("to wash", "شستن", "shostan"),
("to watch", "تماشا کردن", "tamâshâ kardan"),
("to wear", "پوشیدن", "pushidan"),
("to win", "برنده شدن", "barande shodan"),
("to work", "کار کردن", "kâr kardan"),
("to worry", "نگران بودن", "negarân budan"),
("to write", "نوشتن", "neveshtan"),
])
# ── Common adjectives ──
add(S1, "Common adjectives", [
("angry", "عصبانی", "asabâni"),
("bad", "بد", "bad"),
("beautiful", "زیبا", "zibâ"),
("big", "بزرگ", "bozorg"),
("boring", "خسته‌کننده", "khaste-konande"),
("brave", "شجاع", "shojâ'"),
("busy", "مشغول", "mashghul"),
("calm", "آرام", "ârâm"),
("cheap", "ارزان", "arzân"),
("clean", "تمیز", "tamiz"),
("clever", "باهوش", "bâhush"),
("close", "نزدیک", "nazdik"),
("cold", "سرد", "sard"),
("comfortable", "راحت", "râhat"),
("correct", "درست", "dorost"),
("dangerous", "خطرناک", "khatarnâk"),
("dark", "تاریک", "târik"),
("dear", "عزیز", "aziz"),
("deep", "عمیق", "amigh"),
("delicious", "خوشمزه", "khoshmaze"),
("difficult", "سخت", "sakht"),
("dirty", "کثیف", "kasif"),
("dry", "خشک", "khoshk"),
("easy", "آسان", "âsân"),
("empty", "خالی", "khâli"),
("excellent", "عالی", "âli"),
("exciting", "هیجان‌انگیز", "hayajân-angiz"),
("expensive", "گران", "gerân"),
("famous", "مشهور", "mashhur"),
("far", "دور", "dur"),
("fast", "سریع", "sari'"),
("fat", "چاق", "châgh"),
("favourite", "مورد علاقه", "mored-e alâghe"),
("foreign", "خارجی", "khâreji"),
("free", "آزاد", "âzâd"),
("friendly", "مهربان", "mehrabân"),
("full", "پر", "por"),
("funny", "خنده‌دار", "khande-dâr"),
("good", "خوب", "khub"),
("great", "عالی", "âli"),
("happy", "خوشحال", "khoshhâl"),
("hard", "سخت", "sakht"),
("healthy", "سالم", "sâlem"),
("heavy", "سنگین", "sangin"),
("high", "بلند", "boland"),
("honest", "صادق", "sâdegh"),
("horrible", "وحشتناک", "vahshatnâk"),
("hot", "داغ", "dâgh"),
("huge", "عظیم", "azim"),
("hungry", "گرسنه", "gorosne"),
("ill", "مریض", "mariz"),
("important", "مهم", "mohem"),
("impossible", "غیرممکن", "gheyr-e momken"),
("interesting", "جالب", "jâleb"),
("kind", "مهربان", "mehrabân"),
("large", "بزرگ", "bozorg"),
("last", "آخرین", "âkharin"),
("late", "دیر", "dir"),
("lazy", "تنبل", "tanbal"),
("light", "سبک", "sabok"),
("long", "بلند", "boland"),
("loud", "بلند", "boland"),
("low", "پایین", "pâyin"),
("lucky", "خوش‌شانس", "khosh-shâns"),
("modern", "مدرن", "modern"),
("narrow", "باریک", "bârik"),
("natural", "طبیعی", "tabi'i"),
("near", "نزدیک", "nazdik"),
("necessary", "لازم", "lâzem"),
("new", "نو", "now"),
("nice", "خوب", "khub"),
("noisy", "پر سر و صدا", "por sar o sedâ"),
("normal", "عادی", "âdi"),
("old", "پیر", "pir"),
("open", "باز", "bâz"),
("painful", "دردناک", "dardnâk"),
("perfect", "عالی", "âli"),
("pleasant", "خوشایند", "khoshâyand"),
("polite", "مودب", "mo'addab"),
("poor", "فقیر", "faghir"),
("popular", "محبوب", "mahbub"),
("possible", "ممکن", "momken"),
("pretty", "قشنگ", "ghashang"),
("private", "خصوصی", "khosusi"),
("proud", "مفتخر", "moftakher"),
("quiet", "ساکت", "sâket"),
("quick", "سریع", "sari'"),
("ready", "آماده", "âmâde"),
("real", "واقعی", "vâghe'i"),
("rich", "پولدار", "puldâr"),
("right", "درست", "dorost"),
("rude", "بی‌ادب", "bi-adab"),
("sad", "غمگین", "ghamgin"),
("safe", "امن", "amn"),
("serious", "جدی", "jeddi"),
("short", "کوتاه", "kutâh"),
("simple", "ساده", "sâde"),
("slow", "آهسته", "âheste"),
("small", "کوچک", "kuchak"),
("smart", "باهوش", "bâhush"),
("soft", "نرم", "narm"),
("special", "خاص", "khâss"),
("strange", "عجیب", "ajib"),
("strict", "سختگیر", "sakhtgir"),
("strong", "قوی", "ghavi"),
("stupid", "احمق", "ahmagh"),
("successful", "موفق", "movaffagh"),
("sure", "مطمئن", "motma'en"),
("surprised", "متعجب", "mota'ajjeb"),
("sweet", "شیرین", "shirin"),
("tall", "بلند قد", "boland-ghad"),
("terrible", "وحشتناک", "vahshatnâk"),
("thin", "لاغر", "lâghar"),
("thirsty", "تشنه", "teshne"),
("tired", "خسته", "khaste"),
("traditional", "سنتی", "sonnati"),
("true", "درست", "dorost"),
("ugly", "زشت", "zesht"),
("unfair", "ناعادلانه", "nâ-âdelâne"),
("unhappy", "ناراحت", "nârâhat"),
("useful", "مفید", "mofid"),
("usual", "معمولی", "ma'muli"),
("warm", "گرم", "garm"),
("weak", "ضعیف", "za'if"),
("well", "خوب", "khub"),
("whole", "کامل", "kâmel"),
("wide", "پهن", "pahn"),
("wild", "وحشی", "vahshi"),
("wonderful", "فوق‌العاده", "fogh-ol-âde"),
("worried", "نگران", "negarân"),
("wrong", "اشتباه", "eshtebâh"),
("young", "جوان", "javân"),
])
# ── Common adverbs ──
add(S1, "Common adverbs", [
("a lot", "زیاد", "ziyâd"),
("again", "دوباره", "dobâre"),
("almost", "تقریبا", "taghribân"),
("already", "قبلا", "ghablan"),
("also", "همچنین", "hamchenin"),
("always", "همیشه", "hamishe"),
("badly", "بد", "bad"),
("carefully", "با دقت", "bâ deghat"),
("certainly", "حتما", "hatman"),
("clearly", "واضح", "vâzeh"),
("completely", "کاملا", "kâmelan"),
("early", "زود", "zud"),
("enough", "کافی", "kâfi"),
("especially", "مخصوصا", "makhsusan"),
("even", "حتی", "hattâ"),
("exactly", "دقیقا", "daghighan"),
("finally", "بالاخره", "belâkhare"),
("fortunately", "خوشبختانه", "khoshbakhtâne"),
("generally", "معمولا", "ma'mulan"),
("hardly", "به سختی", "be sakhti"),
("immediately", "فورا", "fowran"),
("just", "فقط", "faghat"),
("late", "دیر", "dir"),
("loudly", "بلند", "boland"),
("maybe", "شاید", "shâyad"),
("never", "هرگز", "hargez"),
("normally", "معمولا", "ma'mulan"),
("often", "اغلب", "aghlab"),
("only", "فقط", "faghat"),
("perhaps", "شاید", "shâyad"),
("please", "لطفا", "lotfan"),
("quickly", "سریع", "sari'"),
("quite", "نسبتا", "nesbatan"),
("rarely", "به ندرت", "be nodrat"),
("really", "واقعا", "vâghe'an"),
("recently", "اخیرا", "akhiran"),
("regularly", "مرتب", "morattab"),
("slowly", "آهسته", "âheste"),
("sometimes", "گاهی", "gâhi"),
("soon", "زود", "zud"),
("still", "هنوز", "hanuz"),
("suddenly", "ناگهان", "nâgahân"),
("then", "سپس", "sepas"),
("together", "با هم", "bâ ham"),
("too", "هم", "ham"),
("unfortunately", "متاسفانه", "mota'assefâne"),
("usually", "معمولا", "ma'mulan"),
("very", "خیلی", "kheyli"),
("well", "خوب", "khub"),
])
# ── Prepositions ──
add(S1, "Prepositions", [
("about", "درباره", "darbâre"),
("above", "بالای", "bâlâ-ye"),
("across", "آن طرف", "ân taraf"),
("after", "بعد از", "ba'd az"),
("against", "بر علیه", "bar aleyhe"),
("along", "در امتداد", "dar emtedâd"),
("among", "در میان", "dar miyân"),
("around", "اطراف", "atrâf"),
("at", "در", "dar"),
("before", "قبل از", "ghabl az"),
("behind", "پشت", "posht"),
("below", "زیر", "zir"),
("beside", "کنار", "kenâr"),
("between", "بین", "beyn"),
("by", "توسط", "tavasot"),
("down", "پایین", "pâyin"),
("during", "در طول", "dar tul"),
("except", "به جز", "be joz"),
("for", "برای", "barâye"),
("from", "از", "az"),
("in", "در", "dar"),
("inside", "داخل", "dâkhel"),
("into", "به داخل", "be dâkhel"),
("near", "نزدیک", "nazdik"),
("of", "از", "az"),
("on", "روی", "ru-ye"),
("opposite", "روبروی", "ruberu-ye"),
("out", "بیرون", "birun"),
("outside", "بیرون از", "birun az"),
("over", "بالای", "bâlâ-ye"),
("through", "از میان", "az miyân"),
("to", "به", "be"),
("towards", "به سوی", "be su-ye"),
("under", "زیر", "zir"),
("until", "تا", ""),
("up", "بالا", "bâlâ"),
("with", "با", ""),
("without", "بدون", "bedun"),
])
# ── Colours ──
add(S1, "Colours", [
("black", "سیاه", "siyâh"),
("blue", "آبی", "âbi"),
("brown", "قهوه‌ای", "ghahve-i"),
("gold", "طلایی", "talâyi"),
("green", "سبز", "sabz"),
("grey", "خاکستری", "khâkestari"),
("orange", "نارنجی", "nârenji"),
("pink", "صورتی", "surati"),
("purple", "بنفش", "banafsh"),
("red", "قرمز", "ghermez"),
("silver", "نقره‌ای", "noghre-i"),
("white", "سفید", "sefid"),
("yellow", "زرد", "zard"),
])
# ── Numbers ──
add(S1, "Numbers", [
("zero", "صفر", "sefr"),
("one", "یک", "yek"),
("two", "دو", "do"),
("three", "سه", "se"),
("four", "چهار", "chahâr"),
("five", "پنج", "panj"),
("six", "شش", "shesh"),
("seven", "هفت", "haft"),
("eight", "هشت", "hasht"),
("nine", "نه", "noh"),
("ten", "ده", "dah"),
("eleven", "یازده", "yâzdah"),
("twelve", "دوازده", "davâzdah"),
("thirteen", "سیزده", "sizdah"),
("fourteen", "چهارده", "chahârdah"),
("fifteen", "پانزده", "pânzdah"),
("sixteen", "شانزده", "shânzdah"),
("seventeen", "هفده", "hefdah"),
("eighteen", "هجده", "hejdah"),
("nineteen", "نوزده", "nuzdah"),
("twenty", "بیست", "bist"),
("thirty", "سی", "si"),
("forty", "چهل", "chehel"),
("fifty", "پنجاه", "panjâh"),
("sixty", "شصت", "shast"),
("seventy", "هفتاد", "haftâd"),
("eighty", "هشتاد", "hashtâd"),
("ninety", "نود", "navad"),
("hundred", "صد", "sad"),
("thousand", "هزار", "hezâr"),
("million", "میلیون", "milyun"),
("first", "اول", "avval"),
("second", "دوم", "dovvom"),
("third", "سوم", "sevvom"),
("fourth", "چهارم", "chahârom"),
("fifth", "پنجم", "panjom"),
("last", "آخر", "âkhar"),
])
# ── Quantities ──
add(S1, "Quantities and measures", [
("all", "همه", "hame"),
("another", "یکی دیگر", "yeki digar"),
("both", "هر دو", "har do"),
("each", "هر", "har"),
("enough", "کافی", "kâfi"),
("every", "هر", "har"),
("few", "کم", "kam"),
("half", "نصف", "nesf"),
("less", "کمتر", "kamtar"),
("little", "کمی", "kami"),
("many", "زیاد", "ziyâd"),
("more", "بیشتر", "bishtar"),
("most", "بیشترین", "bishtarin"),
("much", "زیاد", "ziyâd"),
("none", "هیچ‌کدام", "hich-kodâm"),
("other", "دیگر", "digar"),
("several", "چندین", "chandin"),
("some", "بعضی", "ba'zi"),
("pair", "جفت", "joft"),
("piece", "تکه", "tekke"),
("part", "بخش", "bakhsh"),
("kilo", "کیلو", "kilu"),
("litre", "لیتر", "litr"),
("metre", "متر", "metr"),
])
# ── Connecting words ──
add(S1, "Connecting words", [
("and", "و", "va"),
("or", "یا", ""),
("but", "اما", "ammâ"),
("because", "چون", "chon"),
("so", "پس", "pas"),
("if", "اگر", "agar"),
("when", "وقتی", "vaghti"),
("while", "در حالی که", "dar hâli ke"),
("although", "اگرچه", "agarche"),
("however", "با این حال", "bâ in hâl"),
("therefore", "بنابراین", "banâbar-in"),
("also", "همچنین", "hamchenin"),
("then", "سپس", "sepas"),
("that", "که", "ke"),
("which", "که", "ke"),
("who", "که", "ke"),
("where", "جایی که", "jâyi ke"),
("before", "قبل از اینکه", "ghabl az inke"),
("after", "بعد از اینکه", "ba'd az inke"),
("until", "تا اینکه", "tâ inke"),
("since", "از وقتی که", "az vaghti ke"),
("as", "همانطور که", "hamântour ke"),
("unless", "مگر اینکه", "magar inke"),
("moreover", "علاوه بر این", "alâve bar in"),
("furthermore", "به علاوه", "be alâve"),
])
# ── Time expressions ──
add(S1, "Time expressions", [
("today", "امروز", "emruz"),
("tomorrow", "فردا", "fardâ"),
("yesterday", "دیروز", "diruz"),
("now", "الان", "al'ân"),
("then", "آن موقع", "ân moghe'"),
("always", "همیشه", "hamishe"),
("never", "هرگز", "hargez"),
("sometimes", "گاهی اوقات", "gâhi oghât"),
("often", "اغلب", "aghlab"),
("already", "قبلا", "ghablan"),
("soon", "به زودی", "be zudi"),
("still", "هنوز", "hanuz"),
("yet", "هنوز", "hanuz"),
("ago", "پیش", "pish"),
("later", "بعدا", "ba'dan"),
("early", "زود", "zud"),
("late", "دیر", "dir"),
("morning", "صبح", "sobh"),
("afternoon", "بعد از ظهر", "ba'd az zohr"),
("evening", "عصر", "asr"),
("night", "شب", "shab"),
("midnight", "نیمه‌شب", "nime-shab"),
("noon", "ظهر", "zohr"),
("during", "در طول", "dar tul"),
("since", "از", "az"),
])
# ── Days, months, seasons ──
add(S1, "Days and months", [
("Saturday", "شنبه", "shanbe"),
("Sunday", "یکشنبه", "yekshanbe"),
("Monday", "دوشنبه", "doshanbe"),
("Tuesday", "سه‌شنبه", "seshanbe"),
("Wednesday", "چهارشنبه", "chahârshanbe"),
("Thursday", "پنجشنبه", "panjshanbe"),
("Friday", "جمعه", "jom'e"),
("Farvardin", "فروردین", "farvardin"),
("Ordibehesht", "اردیبهشت", "ordibehesht"),
("Khordad", "خرداد", "khordâd"),
("Tir", "تیر", "tir"),
("Mordad", "مرداد", "mordâd"),
("Shahrivar", "شهریور", "shahrivar"),
("Mehr", "مهر", "mehr"),
("Aban", "آبان", "âbân"),
("Azar", "آذر", "âzar"),
("Dey", "دی", "dey"),
("Bahman", "بهمن", "bahman"),
("Esfand", "اسفند", "esfand"),
("spring", "بهار", "bahâr"),
("summer", "تابستان", "tâbestân"),
("autumn", "پاییز", "pâyiz"),
("winter", "زمستان", "zemestân"),
])
# ── Question words ──
add(S1, "Question words", [
("who", "کی", "ki"),
("what", "چی", "chi"),
("when", "کی", "key"),
("where", "کجا", "kojâ"),
("why", "چرا", "cherâ"),
("how", "چطور", "chetor"),
("which", "کدام", "kodâm"),
("how much", "چقدر", "cheghadr"),
("how many", "چند تا", "chand tâ"),
("whose", "مال کی", "mâl-e ki"),
("what kind of", "چه نوع", "che now'"),
("how long", "چه مدت", "che moddat"),
])
# ── Useful expressions ──
add(S1, "Useful expressions", [
("hello", "سلام", "salâm"),
("goodbye", "خداحافظ", "khodâhâfez"),
("please", "لطفا", "lotfan"),
("thank you", "ممنون", "mamnun"),
("you're welcome", "خواهش می‌کنم", "khâhesh mikonam"),
("excuse me", "ببخشید", "bebakhshid"),
("sorry", "متاسفم", "mota'assefam"),
("good morning", "صبح بخیر", "sobh bekheyr"),
("good evening", "عصر بخیر", "asr bekheyr"),
("good night", "شب بخیر", "shab bekheyr"),
("how are you", "حالت چطوره", "hâlet chetore"),
("I'm fine", "خوبم", "khubam"),
("yes", "بله", "bale"),
("no", "نه", "na"),
("of course", "البته", "albatte"),
("congratulations", "تبریک", "tabrik"),
("happy birthday", "تولدت مبارک", "tavalodet mobârak"),
("happy new year", "عید نوروز مبارک", "eyd-e nowruz mobârak"),
("welcome", "خوش آمدید", "khosh âmadid"),
("help", "کمک", "komak"),
("I don't understand", "نمی‌فهمم", "nemifahmam"),
("I don't know", "نمی‌دونم", "nemidounam"),
("slowly please", "آهسته لطفا", "âheste lotfan"),
("repeat please", "تکرار کنید لطفا", "tekrâr konid lotfan"),
("what does this mean", "این یعنی چی", "in ya'ni chi"),
("may I", "اجازه هست", "ejâze hast"),
("it doesn't matter", "مهم نیست", "mohem nist"),
("God willing", "ان‌شاءالله", "inshâ'allâh"),
("bless you", "عافیت باشه", "âfiyat bâshe"),
])
# ── Countries ──
add(S1, "Countries", [
("Iran", "ایران", "irân"),
("Afghanistan", "افغانستان", "afghânestân"),
("Tajikistan", "تاجیکستان", "tâjikestân"),
("Turkey", "ترکیه", "torkiye"),
("Iraq", "عراق", "erâgh"),
("England", "انگلستان", "engelestân"),
("France", "فرانسه", "farânse"),
("Germany", "آلمان", "âlmân"),
("Spain", "اسپانیا", "espâniyâ"),
("Italy", "ایتالیا", "itâliyâ"),
("America", "آمریکا", "âmrikâ"),
("Canada", "کانادا", "kânâdâ"),
("Australia", "استرالیا", "ostrâliyâ"),
("China", "چین", "chin"),
("Japan", "ژاپن", "zhâpon"),
("India", "هند", "hend"),
("Russia", "روسیه", "rusiye"),
("Pakistan", "پاکستان", "pâkestân"),
("Saudi Arabia", "عربستان سعودی", "arabestân-e so'udi"),
("Egypt", "مصر", "mesr"),
("United Arab Emirates", "امارات متحده عربی", "emârât-e mottahed-e arabi"),
("Syria", "سوریه", "suriye"),
("Lebanon", "لبنان", "lobnân"),
("Morocco", "مراکش", "marâkesh"),
("Brazil", "برزیل", "berezil"),
])
# ── Nationalities ──
add(S1, "Nationalities", [
("Iranian", "ایرانی", "irâni"),
("Afghan", "افغان", "afghân"),
("English", "انگلیسی", "engelisi"),
("French", "فرانسوی", "farânsavi"),
("German", "آلمانی", "âlmâni"),
("American", "آمریکایی", "âmrikâyi"),
("Turkish", "ترک", "tork"),
("Arab", "عرب", "arab"),
("Indian", "هندی", "hendi"),
("Chinese", "چینی", "chini"),
("Japanese", "ژاپنی", "zhâponi"),
("Russian", "روسی", "rusi"),
("Italian", "ایتالیایی", "itâliyâyi"),
("Spanish", "اسپانیایی", "espâniyâyi"),
("Pakistani", "پاکستانی", "pâkestâni"),
("Australian", "استرالیایی", "ostrâliyâyi"),
("Canadian", "کانادایی", "kânâdâyi"),
("Iraqi", "عراقی", "erâghi"),
("Egyptian", "مصری", "mesri"),
("Brazilian", "برزیلی", "berezili"),
])
# ── Social conventions ──
add(S1, "Social conventions", [
("greeting someone", "سلام و احوالپرسی", "salâm va ahvâlporsi"),
("introducing yourself", "معرفی خود", "mo'arrefi-ye khod"),
("asking about health", "احوالپرسی", "ahvâlporsi"),
("thanking", "تشکر کردن", "tashakkor kardan"),
("apologizing", "عذرخواهی کردن", "ozrkhâhi kardan"),
("congratulating", "تبریک گفتن", "tabrik goftan"),
("expressing condolence", "تسلیت گفتن", "tasliyat goftan"),
("saying goodbye", "خداحافظی کردن", "khodâhâfezi kardan"),
("welcoming guests", "خوشامدگویی", "khosh-âmad-guyi"),
("offering food", "تعارف کردن غذا", "ta'ârof kardan-e ghazâ"),
("accepting an offer", "قبول کردن", "ghabul kardan"),
("declining an offer", "رد کردن", "rad kardan"),
("asking permission", "اجازه خواستن", "ejâze khâstan"),
("making a request", "درخواست کردن", "darkhâst kardan"),
("showing respect", "احترام گذاشتن", "ehterâm gozâshtan"),
])
# ── Theme 1: Identity and culture ──
add(S2, "Family members", [
("father", "پدر", "pedar"),
("mother", "مادر", "mâdar"),
("brother", "برادر", "barâdar"),
("sister", "خواهر", "khâhar"),
("son", "پسر", "pesar"),
("daughter", "دختر", "dokhtar"),
("grandfather", "پدربزرگ", "pedar-bozorg"),
("grandmother", "مادربزرگ", "mâdar-bozorg"),
("uncle", "عمو / دایی", "amu / dâyi"),
("aunt", "عمه / خاله", "amme / khâle"),
("cousin", "پسرعمو / دخترعمو", "pesar-amu / dokhtar-amu"),
("husband", "شوهر", "showhar"),
("wife", "زن / همسر", "zan / hamsar"),
("family", "خانواده", "khânevâde"),
("child", "بچه", "bachche"),
("baby", "نوزاد", "nowzâd"),
])
add(S2, "Physical descriptions", [
("hair", "مو", "mu"),
("eye", "چشم", "cheshm"),
("tall", "بلند قد", "boland-ghad"),
("short (height)", "کوتاه قد", "kutâh-ghad"),
("thin", "لاغر", "lâghar"),
("fat", "چاق", "châgh"),
("handsome", "خوش‌تیپ", "khosh-tip"),
("curly hair", "موی فرفری", "mu-ye ferferi"),
("straight hair", "موی صاف", "mu-ye sâf"),
("beard", "ریش", "rish"),
])
add(S2, "Personality", [
("kind", "مهربان", "mehrabân"),
("shy", "خجالتی", "khejâlati"),
("generous", "سخاوتمند", "sakhâvatmand"),
("patient", "صبور", "sabur"),
("cheerful", "شاد", "shâd"),
("hard-working", "زحمتکش", "zahmatkesh"),
("honest", "صادق", "sâdegh"),
("selfish", "خودخواه", "khod-khâh"),
("reliable", "قابل اعتماد", "ghâbel-e e'temâd"),
("stubborn", "لجباز", "lajbâz"),
])
add(S2, "Daily routine", [
("to wake up", "بیدار شدن", "bidâr shodan"),
("to get dressed", "لباس پوشیدن", "lebâs pushidan"),
("to have breakfast", "صبحانه خوردن", "sobhâne khordan"),
("to go to school", "به مدرسه رفتن", "be madrese raftan"),
("to have lunch", "ناهار خوردن", "nâhâr khordan"),
("to do homework", "تکلیف انجام دادن", "taklif anjâm dâdan"),
("to have dinner", "شام خوردن", "shâm khordan"),
("to brush teeth", "مسواک زدن", "mesvâk zadan"),
("to go to bed", "به رختخواب رفتن", "be rakhtekhâb raftan"),
("to take a shower", "دوش گرفتن", "dush gereftan"),
])
add(S2, "Food and drink", [
("bread", "نان", "nân"),
("rice", "برنج", "berenj"),
("meat", "گوشت", "gusht"),
("chicken", "مرغ", "morgh"),
("fish", "ماهی", "mâhi"),
("fruit", "میوه", "mive"),
("vegetable", "سبزیجات", "sabzijât"),
("water", "آب", "âb"),
("tea", "چای", "châi"),
("milk", "شیر", "shir"),
("cheese", "پنیر", "panir"),
("egg", "تخم‌مرغ", "tokhm-e morgh"),
("sugar", "شکر", "shekar"),
("salt", "نمک", "namak"),
("kebab", "کباب", "kabâb"),
("yogurt", "ماست", "mâst"),
("soup", "سوپ", "sup"),
("salad", "سالاد", "sâlâd"),
("cake", "کیک", "keyk"),
("ice cream", "بستنی", "bastani"),
])
add(S2, "Celebrations", [
("Nowruz", "نوروز", "nowruz"),
("Haft-sin", "هفت‌سین", "haft-sin"),
("Chaharshanbe Suri", "چهارشنبه‌سوری", "chahârshanbe-suri"),
("Yalda night", "شب یلدا", "shab-e yaldâ"),
("Sizdah Bedar", "سیزده‌بدر", "sizdah-bedar"),
("celebration", "جشن", "jashn"),
("gift", "هدیه", "hediye"),
("holiday", "تعطیلات", "ta'tilât"),
("tradition", "سنت", "sonnat"),
("fireworks", "آتش‌بازی", "âtash-bâzi"),
])
# ── Theme 2: Local area and environment ──
add(S2, "House and home", [
("house", "خانه", "khâne"),
("room", "اتاق", "otâgh"),
("kitchen", "آشپزخانه", "âshpaz-khâne"),
("bathroom", "حمام", "hammâm"),
("bedroom", "اتاق خواب", "otâgh-e khâb"),
("living room", "اتاق نشیمن", "otâgh-e neshiman"),
("garden", "باغ", "bâgh"),
("door", "در", "dar"),
("window", "پنجره", "panjere"),
("floor", "طبقه", "tabaghe"),
("wall", "دیوار", "divâr"),
("roof", "سقف", "saghf"),
("stairs", "پله", "pelle"),
("furniture", "مبل", "mobl"),
("table", "میز", "miz"),
("chair", "صندلی", "sandali"),
])
add(S2, "Places in town", [
("school", "مدرسه", "madrese"),
("hospital", "بیمارستان", "bimârestân"),
("mosque", "مسجد", "masjed"),
("park", "پارک", "pârk"),
("library", "کتابخانه", "ketâb-khâne"),
("shop", "مغازه", "maghâze"),
("market", "بازار", "bâzâr"),
("bank", "بانک", "bânk"),
("restaurant", "رستوران", "restorân"),
("pharmacy", "داروخانه", "dâru-khâne"),
("post office", "اداره پست", "edâre-ye post"),
("cinema", "سینما", "sinamâ"),
("museum", "موزه", "muze"),
("street", "خیابان", "khiyâbân"),
("square", "میدان", "meydân"),
])
add(S2, "Shopping", [
("to buy", "خریدن", "kharidan"),
("to sell", "فروختن", "foroukhtan"),
("price", "قیمت", "gheymat"),
("money", "پول", "pul"),
("cash", "نقد", "naghd"),
("receipt", "رسید", "resid"),
("discount", "تخفیف", "takhfif"),
("size", "اندازه", "andâze"),
("colour", "رنگ", "rang"),
("bag", "کیف", "kif"),
("clothes", "لباس", "lebâs"),
("shoes", "کفش", "kafsh"),
])
add(S2, "Weather", [
("weather", "هوا", "havâ"),
("sun", "خورشید", "khorshid"),
("rain", "باران", "bârân"),
("snow", "برف", "barf"),
("wind", "باد", "bâd"),
("cloud", "ابر", "abr"),
("hot", "گرم", "garm"),
("cold", "سرد", "sard"),
("warm", "ملایم", "molâyem"),
("sunny", "آفتابی", "âftâbi"),
("cloudy", "ابری", "abri"),
("rainy", "بارانی", "bârâni"),
("temperature", "دما", "damâ"),
("season", "فصل", "fasl"),
])
add(S2, "Environment", [
("nature", "طبیعت", "tabi'at"),
("tree", "درخت", "derakht"),
("flower", "گل", "gol"),
("river", "رودخانه", "rudkhâne"),
("mountain", "کوه", "kuh"),
("sea", "دریا", "daryâ"),
("forest", "جنگل", "jangal"),
("desert", "بیابان", "biyâbân"),
("animal", "حیوان", "heyvân"),
("bird", "پرنده", "parande"),
("pollution", "آلودگی", "âludegi"),
("recycling", "بازیافت", "bâzyâft"),
("environment", "محیط زیست", "mohit-e zist"),
("earth", "زمین", "zamin"),
])
# ── Theme 3: School and work ──
add(S2, "School subjects", [
("mathematics", "ریاضی", "riyâzi"),
("science", "علوم", "olum"),
("history", "تاریخ", "târikh"),
("geography", "جغرافیا", "joghrâfiyâ"),
("English", "انگلیسی", "engelisi"),
("Persian", "فارسی", "fârsi"),
("art", "هنر", "honar"),
("music", "موسیقی", "musighi"),
("sport", "ورزش", "varzesh"),
("physics", "فیزیک", "fizik"),
("chemistry", "شیمی", "shimi"),
("biology", "زیست‌شناسی", "zist-shenâsi"),
("computer science", "علوم کامپیوتر", "olum-e kâmpyuter"),
("religion", "دین", "din"),
])
add(S2, "School life", [
("student", "دانش‌آموز", "dânesh-âmuz"),
("teacher", "معلم", "mo'allem"),
("classroom", "کلاس", "kelâs"),
("lesson", "درس", "dars"),
("homework", "تکلیف", "taklif"),
("exam", "امتحان", "emtehân"),
("grade", "نمره", "nomre"),
("book", "کتاب", "ketâb"),
("pen", "خودکار", "khodkâr"),
("notebook", "دفتر", "daftar"),
("uniform", "یونیفرم", "yuniform"),
("break time", "زنگ تفریح", "zang-e tafrih"),
("headteacher", "مدیر مدرسه", "modir-e madrese"),
("timetable", "برنامه", "barnâme"),
])
add(S2, "Jobs and careers", [
("doctor", "دکتر", "doktar"),
("engineer", "مهندس", "mohandes"),
("teacher", "معلم", "mo'allem"),
("nurse", "پرستار", "parastâr"),
("lawyer", "وکیل", "vakil"),
("driver", "راننده", "rânande"),
("chef", "آشپز", "âshpaz"),
("police officer", "پلیس", "polis"),
("firefighter", "آتش‌نشان", "âtash-neshân"),
("dentist", "دندانپزشک", "dandân-pezeshk"),
("journalist", "روزنامه‌نگار", "ruznâme-negâr"),
("businessman", "تاجر", "tâjer"),
("artist", "هنرمند", "honarmand"),
("farmer", "کشاورز", "keshâvarz"),
("salary", "حقوق", "hoghogh"),
])
add(S2, "Future plans", [
("university", "دانشگاه", "dâneshgâh"),
("to study", "تحصیل کردن", "tahsil kardan"),
("career", "شغل", "shoghl"),
("to work", "کار کردن", "kâr kardan"),
("dream", "رویا", "royâ"),
("goal", "هدف", "hadaf"),
("success", "موفقیت", "movaffaghiyat"),
("to earn", "درآمد داشتن", "darâmad dâshtan"),
("experience", "تجربه", "tajrobe"),
("opportunity", "فرصت", "forsat"),
])
# ── Theme 4: Travel and tourism ──
add(S2, "Transport", [
("car", "ماشین", "mâshin"),
("bus", "اتوبوس", "otobus"),
("train", "قطار", "ghatâr"),
("plane", "هواپیما", "havâpeymâ"),
("taxi", "تاکسی", "tâksi"),
("bicycle", "دوچرخه", "docharkhe"),
("motorcycle", "موتور", "motor"),
("ship", "کشتی", "keshti"),
("metro", "مترو", "metro"),
("airport", "فرودگاه", "forudgâh"),
("station", "ایستگاه", "istgâh"),
("ticket", "بلیط", "belit"),
("passport", "گذرنامه", "gozarnâme"),
])
add(S2, "Directions", [
("right", "راست", "râst"),
("left", "چپ", "chap"),
("straight", "مستقیم", "mostaghim"),
("north", "شمال", "shomâl"),
("south", "جنوب", "jonub"),
("east", "شرق", "shargh"),
("west", "غرب", "gharb"),
("map", "نقشه", "naghshe"),
("turn", "بپیچید", "bepichid"),
("next to", "کنار", "kenâr"),
("in front of", "جلوی", "jelo-ye"),
("far from", "دور از", "dur az"),
])
add(S2, "Holiday activities", [
("to travel", "سفر کردن", "safar kardan"),
("to visit", "بازدید کردن", "bâzdid kardan"),
("to swim", "شنا کردن", "shenâ kardan"),
("to take photos", "عکس گرفتن", "aks gereftan"),
("to relax", "استراحت کردن", "esterâhat kardan"),
("sightseeing", "گردشگری", "gardeshgari"),
("souvenir", "سوغاتی", "soghâti"),
("beach", "ساحل", "sâhel"),
("tourist", "گردشگر", "gardeshgar"),
("luggage", "چمدان", "chamedân"),
])
add(S2, "Accommodation", [
("hotel", "هتل", "hotel"),
("room", "اتاق", "otâgh"),
("reservation", "رزرو", "rezerv"),
("key", "کلید", "kelid"),
("reception", "پذیرش", "paziresh"),
("single room", "اتاق یک‌نفره", "otâgh-e yek-nafare"),
("double room", "اتاق دونفره", "otâgh-e do-nafare"),
("breakfast included", "صبحانه شامل", "sobhâne shâmel"),
("check in", "ورود", "vorud"),
("check out", "خروج", "khoruj"),
])
add(S2, "At the restaurant", [
("menu", "منو", "menu"),
("waiter", "گارسون", "gârsun"),
("bill", "صورتحساب", "surathesâb"),
("starter", "پیش‌غذا", "pish-ghazâ"),
("main course", "غذای اصلی", "ghazâ-ye asli"),
("dessert", "دسر", "deser"),
("drink", "نوشیدنی", "nushidani"),
("to order", "سفارش دادن", "sefâresh dâdan"),
("delicious", "خوشمزه", "khoshmaze"),
("vegetarian", "گیاهخوار", "giyâh-khâr"),
("the bill please", "صورتحساب لطفا", "surathesâb lotfan"),
("tip", "انعام", "en'âm"),
])
# ── Theme 5: International and global ──
add(S2, "Health", [
("health", "سلامت", "salâmat"),
("illness", "بیماری", "bimâri"),
("headache", "سردرد", "sardard"),
("stomach ache", "دل‌درد", "deldard"),
("fever", "تب", "tab"),
("cold (illness)", "سرماخوردگی", "sarmâ-khordegi"),
("medicine", "دارو", "dâru"),
("hospital", "بیمارستان", "bimârestân"),
("appointment", "وقت ملاقات", "vaght-e molâghât"),
("exercise", "ورزش", "varzesh"),
("healthy", "سالم", "sâlem"),
("pain", "درد", "dard"),
])
add(S2, "Global issues", [
("poverty", "فقر", "faghr"),
("war", "جنگ", "jang"),
("peace", "صلح", "solh"),
("equality", "برابری", "barâbari"),
("education", "آموزش", "âmuzesh"),
("climate change", "تغییرات آب و هوایی", "taghyirât-e âb va havâyi"),
("pollution", "آلودگی", "âludegi"),
("charity", "خیریه", "kheyriye"),
("rights", "حقوق", "hoghogh"),
("government", "دولت", "dolat"),
])
add(S2, "Technology", [
("computer", "کامپیوتر", "kâmpyuter"),
("phone", "تلفن", "telefon"),
("mobile phone", "موبایل", "mobâyl"),
("internet", "اینترنت", "internet"),
("website", "وبسایت", "vebsâyt"),
("email", "ایمیل", "imeyl"),
("screen", "صفحه نمایش", "safhe-ye namâyesh"),
("to download", "دانلود کردن", "dânlod kardan"),
("to search", "جستجو کردن", "jostoju kardan"),
("keyboard", "صفحه کلید", "safhe-ye kelid"),
("password", "رمز عبور", "ramz-e obur"),
("application", "برنامه", "barnâme"),
])
add(S2, "Social media", [
("social media", "شبکه‌های اجتماعی", "shabake-hâ-ye ejtemâ'i"),
("to share", "به اشتراک گذاشتن", "be eshterâk gozâshtan"),
("to follow", "دنبال کردن", "donbâl kardan"),
("to like", "لایک کردن", "lâyk kardan"),
("message", "پیام", "payâm"),
("photo", "عکس", "aks"),
("video", "ویدیو", "vidiyo"),
("online", "آنلاین", "ânlâyn"),
("profile", "پروفایل", "profâyl"),
("to post", "پست کردن", "post kardan"),
])
# ── Deduplicate IDs ──
seen_ids = set()
unique_vocab = []
for entry in vocab:
if entry["id"] in seen_ids:
entry["id"] = entry["id"] + "_2"
if entry["id"] in seen_ids:
entry["id"] = entry["id"] + "_3"
seen_ids.add(entry["id"])
unique_vocab.append(entry)
out = Path(__file__).parent.parent / "data" / "vocabulary.json"
out.parent.mkdir(parents=True, exist_ok=True)
with open(out, "w", encoding="utf-8") as f:
json.dump(unique_vocab, f, ensure_ascii=False, indent=2)
print(f"Generated {len(unique_vocab)} entries → {out}")
cats = {}
for e in unique_vocab:
cats[e["category"]] = cats.get(e["category"], 0) + 1
for c, n in sorted(cats.items()):
print(f" {c}: {n}")