# Le chat Mistou 2 — رحلة ياسين لتعلّم الفرنسية

تطبيق ويب تفاعلي يحوّل كتاب «Le chat Mistou 2 – 1re partie» (SABIS، الصف الثاني) إلى دروس وألعاب،
مع نقاط ونجوم وشارات ومستويات للطفل، ولوحة متابعة لولي الأمر. يعمل على الجوال واللوح والحاسوب.

## التشغيل

```bash
docker compose up -d --build
```

ثم افتح: http://localhost:8256

- الحسابات الأولى (المسؤول وأول ولي أمر وأول طفل) تُنشأ من `.env` عند أول تشغيل فقط؛ بعدها تُدار من اللوحات.

- قاعدة البيانات: `..\_Data\french_grades.db` (خارج الحاوية، لا تضيع عند إعادة البناء).
- زر 🚪 «تسجيل الخروج» في أعلى شاشة الطفل وفي لوحة ولي الأمر، للتنقل بين الحسابين على الجهاز نفسه.
- التوقيت محلي (`TZ=Asia/Riyadh` في `.env`).

## لوحة ولي الأمر

نظرة عامة، والدروس (مع إعادة ضبط لكل نشاط أو درس أو للمنهج كله)، والسجل، والإعدادات.
في **السجل**: جدول الجلسات (الجلسة = أنشطة متتالية لا يفصل بينها أكثر من 20 دقيقة) مع مدة كل جلسة ووقت الأنشطة فيها،
ثم آخر المحاولات مع مدة كل محاولة. وقت المحاولة الواحدة محسوب بحد أقصى 30 دقيقة حتى لا يُحتسب نشاط تُرك مفتوحاً.


## الأدوار (المسؤول ← أولياء الأمور ← الأطفال)

| الدور | يدخل إلى | يستطيع |
| --- | --- | --- |
| المسؤول | `/admin` | إنشاء أولياء الأمور، وتحديد عدد الأطفال المسموح لكل منهم، وتغيير كلمات المرور، والإيقاف والتفعيل، والحذف، وإضافة أطفال لأي ولي أمر، وفتح لوحة أي طفل |
| ولي الأمر | `/parent` | إضافة أطفاله في حدود العدد المسموح، وتعديلهم، وتغيير كلمات مرورهم، وتصفير تقدمهم كله أو لدرس أو لنشاط، وإيقافهم مؤقتاً، ومتابعة تقدم كل طفل |
| الطفل | `/` | رحلة التعلّم، واختيار صورته الرمزية |

- صفحة دخول واحدة للجميع، والحساب نفسه يحدد الوجهة.
- ولي الأمر لا يرى إلا أطفاله، والخادم يتحقق من ذلك في كل طلب.
- إيقاف ولي الأمر يوقف دخوله ودخول أطفاله فوراً، مع حفظ بياناتهم.
- حساب المسؤول يُنشأ عند أول تشغيل من `ADMIN_USERNAME` و`ADMIN_PASSWORD` في `.env`. بعد ذلك تُغيَّر كلمة المرور من «حسابي».
  لاستعادة كلمة مرور المسؤول: ضع `ADMIN_RESET_PASSWORD=1` مع كلمة مرور جديدة في `ADMIN_PASSWORD`، ثم أعد التشغيل، ثم أرجع القيمة إلى `0`.
- نسخة احتياطية من قاعدة البيانات في أي وقت:

```bash
python tools/backup_db.py
```

## المستويات الدراسية

كل طفل تابع لمستوى دراسي واحد يختاره ولي الأمر أو المسؤول عند إضافة الطفل، ويمكن تغييره لاحقاً من «تعديل».
الطفل يرى دروس مستواه فقط. تقدّمه في كل مستوى يبقى محفوظاً، فإن نُقل إلى مستوى آخر ثم أُعيد وجد تقدمه كما هو.
النقاط والرتب للطفل ككل، لا لكل مستوى. الشارات العامة (أول نشاط، عشرة أنشطة، النقاط…) مشتركة، ولكل مستوى شاراته الخاصة به.

| المستوى | الكتاب | الحالة |
| --- | --- | --- |
| المستوى الأول (8 سنوات) | Le chat Mistou 2 – 1re partie | متاح |
| المستوى الثاني | — | قريباً |
| المستوى الثالث | — | قريباً |
| المستوى الرابع (11 سنة) | Conjugaison 4 · Grammaire 4 · À vos marques, prêts… parlez ! 3 و5 | متاح (مهمة التصريف، مهمة القواعد، مهمة الحوارات) |
| المستوى الخامس | — | قريباً |
| المستوى السادس | — | قريباً |
| المستوى السابع | — | قريباً |

**لإضافة مستوى جديد لاحقاً:** تُكتب وحداته في ملف جديد داخل `curriculum/` (على نمط `unit1.py`)، وتبدأ كل معرّفاته ببادئة المستوى مثل `l2-`
حتى لا تتكرر. ثم يُفعَّل في `curriculum/levels.py` بجعل `available=True` وربط دالة البناء. التطبيق يرفض التشغيل إذا تكرر أي معرّف.

### المستوى الرابع (11 سنة)

رحلة أنضج من المستوى الأول: «مهمات» بدل الدروس، رتب الفئة 10–12 سنة (Débutant… Légende)، ألوان وخط مختلفان، وأنشطة كتابة حقيقية:

| النشاط | الوصف |
| --- | --- |
| `conjugate` | جدول تصريف كامل يُكتب بلوحة الحروف المنبورة |
| `type_answer` | إكمال الفراغ بالكتابة (يقبل عدة إجابات صحيحة) |
| `rewrite` | تحويل جملة (إلى الجمع، النفي، زمن آخر…) |
| `error_hunt` | لمس الكلمة الخاطئة ثم تصحيحها، مع شرح بالعربية |
| `speed_round` | تحدّي سرعة مؤقّت مع سلسلة نقاط ورقم قياسي شخصي |
| `sort` | تصنيف الكلمات في صناديق |

- `curriculum/level4/conj.py`: مهمة التصريف — 29 درساً تغطي الكتاب كاملاً (avoir وêtre، المجموعات الثلاث، aller وvenir، والمراجعات).
- `curriculum/level4/gram.py`: مهمة القواعد — 22 درساً (15 فصلاً + مراجعتان). الإجابات مراجعة على «Corrigés» الكتاب.
- `curriculum/level4/kit.py`: أدوات بناء الأنشطة (جدول، فراغ، تحويل، تحدّي سرعة…).
- أخطاء وُجدت في «Corrigés» الكتب صُحّحت في التطبيق (مثلاً «gèlerions»، «opérait»، «nous enrichirons»).
- `curriculum/level4/dial.py`: مهمة الحوارات — 31 موقفاً من Parlez 3 (المستوى 1) وParlez 5 (المستوى 2) بالتسجيلات الأصلية
  (`static/audio/l4/`)، تُولَّد بياناتها بـ `tools/parlez_extract.py` ثم `tools/build_dialogues.py` (الترجمة العربية وإجابات الأسئلة مراجعة يدوياً).
- شارات المستوى الرابع: لكل مجموعة أفعال، ولكل مهمة، وأول مراجعة، و«البرق» لتحدّي سرعة بلا خطأ.

**الكتب الممسوحة (OCR):** `tools/ocr_level4.py` يرسل صفحات PDF إلى منصة OCR المحلية، ثم `tools/l4_finalize.py` يجمعها في
`<اسم الكتاب>.md` بجوار ملف PDF مع الصور في `assets/`، ويزيل النصوص التي يخترعها النموذج للصفحات الفارغة.
`tools/transcribe_audio.py` يفرّغ تسجيلات كتب Parlez الصوتية (faster-whisper) لربطها بالحوارات.

**الترجمة الإنجليزية عند التمرير:** الجمل المكتوبة يدوياً في `curriculum/en_sentences.py`، وما تبقّى مترجم بنموذج لغوي
(`tools/merge_en.py` ← `curriculum/en_machine.py`). المكتوب يدوياً يتقدّم دائماً على ترجمة النموذج.

## المحتوى

| الوحدة | الدروس |
| --- | --- |
| الوحدة 1: الحروف A–Z | 13 درساً لأزواج الحروف + 5 مراجعات (Bilan) + أغنيتان |
| الوحدة 2: ماري والقط ميستو | القصة، التحيات، ما اسمه/اسمها، طرح الأسئلة، البيت، القواعد، المراجعة + أغنيتان |
| دروس إضافية (موسومة «درس إضافي») | التعليمات، الأبجدية كاملة، الأرقام، الألوان، الحيوانات، العائلة والمدرسة |

310 نشاطاً من 22 نوعاً: بطاقات بالنطق، كتابة الحروف بالإصبع، صيد الحروف، تلوين، اختيار الصور بالصوت، إكمال الحروف،
توصيل، استماع واختيار، تهجئة، لعبة الذاكرة، قراءة وحوار، أصوات (Phonétique)، أسئلة، ترتيب الكلمات، صح/خطأ، تصنيف،
إكمال الكلمة، التحدث بالميكروفون، لعبة السلّم، رسم.

النطق بالصوت الفرنسي المدمج في المتصفح (Chrome / Edge / Safari). التحدّث بالميكروفون يعمل في Chrome وEdge.

## الواجهة: عربية أو فرنسية

زر **FR / ع** أعلى الشاشة يبدّل الواجهة. في الواجهة الفرنسية: مرّر الفأرة فوق أي نص فرنسي (أو اضغط عليه مطوّلاً
على الجوال) لتظهر ترجمته الإنجليزية. الترجمات في `curriculum/en_sentences.py` و`curriculum/en_lexicon.py`.

## صور المفردات (Image Studio)

الصور تُولَّد بـ Image Studio المحلي (http://localhost:8879). حتى توليدها يعرض التطبيق رموزاً تعبيرية بدلاً منها.

```bash
python tools/gen_images.py prepare
```

```bash
python tools/gen_images.py start
```

```bash
python tools/gen_images.py status
```

```bash
python tools/gen_images.py collect
```

`collect` ينسخ الصور إلى `static/vocab/` فتظهر فوراً (المجلد مربوط بالحاوية، لا يلزم إعادة البناء).
105 صورة، نحو دقيقتين للصورة مع تشغيل صورتين معاً.

## الاختبارات

```bash
python tools/smoke_test.py
```

```bash
python tools/check_data.py
```

لحذف محاولات بعينها (بيانات تجريبية مثلاً) دون مسح محاولات الطفل الحقيقية، انسخ `tools/remove_attempts.py` إلى الحاوية وشغّله بأرقام المحاولات.
