# فاز ۸ — پک‌های زبانی جدید: عربی، ترکی، انگلیسیِ گسترده

**نسخه: 1.4.0** · تاریخ: 1404/07/03 (2026-09-25)
ورودی کاربر: «با توجه به اینکه ساختار multilang آماده است بریم سراغ پک‌های جدید (عربی/ترکی/انگلیسی کلمات بیشتر)»

---

## ۱. هدف

اثبات عملی وعده‌ی معماری **Data-Driven Language Packs** (سند ۰۱): افزودن دو زبان جدید
(عربی RTL با حروف متصل‌شونده، ترکی LTR با حروف خاص Ç/Ğ/İ/I/Ö/Ş/Ü) و بیش از دو برابر
کردن واژگان انگلیسی — **بدون تغییر حتی یک خط از موتور بازی**.

## ۲. تحویل‌ها

### ۲.۱ پک عربی — `client/data/packs/ar.json`
| ویژگی | مقدار |
|---|---|
| حروف | **۲۸** حرف ابجد (ا → ي) |
| متصل‌شونده | ۲۲ حرف `joiner:true` با هر ۴ شکل (مجرد/ابتدایی/وسطی/پایانی) با تتویل `ـ` |
| غیرمتصل | alef, dal, thal, reh, zain, waw |
| کلمات | **۳۲** کلمه با حرکت‌گذاری کامل (`بَطَّة`، `تُفَّاح`، `هِلال`، `نَهْر`…) |
| UI | `dir:'rtl'` · `numerals:'ar'` (ارقام عربی‌هندی ٠١٢…، متمایز از فارسی ۰۱۲…) |
| نشان‌ها | ۵ نشان ثابت با پیشوند `ar_` |

### ۲.۲ پک ترکی — `client/data/packs/tr.json`
| ویژگی | مقدار |
|---|---|
| حروف | **۲۹** — الفبای ترکی با Ç Ğ İ I Ö Ş Ü |
| idهای تفکیکی | `tr_g2` (Ğ)، `tr_i2` (I بدون نقطه)، `tr_i` (İ) — چون `id` باید یکتا و ASCII بماند |
| کلمات | **۳۸** (`kedi`, `yoğurt`, `çocuk`, `gözlük`…) |
| UI | `dir:'ltr'` · `numerals:'latn'` |
| نشان‌ها | ۵ نشان با پیشوند `tr_` |

### ۲.۳ انگلیسی گسترده — `client/data/packs/en.json`
از ۲۶ به **۵۵ کلمه**: star, tree, book, milk, bread, frog, duck, bird, horse, house, door,
train, car, bus, banana, grape, cake, shoe, sock, spoon, cup, bed, chair, cow, sheep, mouse,
rabbit, snake, bear (+۲۹).

### ۲.۴ رشته‌های UI — `client/data/i18n/`
- **`ui-ar.json`** و **`ui-tr.json`**: هر دو دقیقاً **۱۹۸ کلید** = ۱۹۳ کلید عمومی + ۵ برچسب نشانِ خودشان.
  تست هم‌ارزی کلید‌به‌کلید با ui-fa پاس شد (بدون کلید کم/اضافه/جاافتاده).
- پارامترهای حیاتی (`{name}`, `{sound}`, `{word}`) در هر دو حفظ شدند.

### ۲.۵ تغییرات کد (حداقلی — فقط زیرساخت زبان)
| فایل | تغییر |
|---|---|
| `client/js/core/availablePacks.js` | +۲ کارت: العربية 🇸🇦 و Türkçe 🇹🇷 |
| `client/js/core/i18n.js` | `AR_DIGITS` — پشتیبانی `numerals:'ar'` (٠١٢٣٤٥٦٧٨٩) جدا از فارسی |

**صفر تغییر** در: موتور بازی‌ها، PackLoader، MasteryTracker، صف سینک، پنل ادمین.
منابع دیگر خودکار بودند:
- پنل ادمین پک‌ها را از `GET /api/v1/packs` می‌خواند → ar/tr خودکار در فیلتر و آپلود صدا ظاهر شدند.
- آیتم‌های آپلود صدا از `/data/packs/{id}.json` خوانده می‌شود → حروف/کلمات ar/tr خودکار.
- Service Worker پک‌ها را runtime (network-first) کش می‌کند → آفلاین بعد از اولین بازدید.
- «بچین و بخوان» کلمه را با **id حروف** می‌سازد نه متن → حرکت‌های عربی (فتحه/کسره/…) بی‌دردسر.

## ۳. خطاخیزهای رفع‌شده

1. **هم‌پوشانی ha (ه) / haa (ح)** — validate ارجاع معلق را می‌گیرد نه حرفِ اشتباهِ معتبر؛
   کلمات با متن حروفشان بازبینی و اصلاح شدند (بطه/هلال/نهر با ha، تفاح با haa).
2. **ارقام عربی ≠ فارسی** — ٤٥٦ (U+0664…) با ۴۵۶ (U+06F4…) کدپوینت متفاوت دارند؛
   جداسازی صریح `AR_DIGITS` در i18n.
3. **id یکتا در ترکی** — حروف `I` و `İ` نقطه‌گذاری متفاوت دارند ولی id باید ASCII بماند؛
   الگوی `{pack}_{letter}{n}` برای هم‌نام‌ها.

## ۴. تست‌ها

| مجموعه | نتیجه |
|---|---|
| واحد (۹ فایل) | **۱۱۹/۱۱۹** ✓ (+۳ جدید: شمارش حروف عربی/ترکی، یکتایی forms، Ğ/İ/I، en ≥۵۰) |
| packs.test.js | ۱۶/۱۶ — PACKS و UIS به ۵ زبان گسترش یافت؛ تست dir: ar=rtl، tr=ltr؛ هم‌ارزی کلید ui-ar/ui-tr |
| E2E اپ | **14/14** ✓ |
| **E2E پک‌ها (جدید: `tests/e2e-packs.mjs`)** | **5/5** ✓ |
| E2E ادمین | **8/8** ✓ |

سناریوی E2E پک‌ها: کارت Türkçe در انتخابگر اولیه → ساخت کودک → نقشه با عنوان
«Alfabe Haritası» و `dir=ltr` → داده‌ی tr (۲۹ حرف، Ğ، yoğurt) → سوییچ به عربی از
تنظیمات → رفرش → «خريطة الحروف» با `dir=rtl` → صفر خطای کنسول.

اسکریپت npm: `npm run test:e2e:packs`.

## ۵. وضعیت نسخه

بامپ **1.3.0 → 1.4.0** در هر چهار نقطه: `sw.js` (نام کش‌ها)، `diagnostics.js`،
`index.html` (`__APP_VERSION` + query stringهای cache-bust)، `admin.html`.

## ۶. معیارهای باز (به فاز‌های بعد موکول)
- Lighthouse در CI (سند ۱۴).
- تست UX با ۵ کودک واقعی (سند ۱۴).
- واژگان عربی/ترکی فعلاً «هسته‌ی آموزشی» است؛ گسترش به ۵۰+ کلمه در هر پک وقتی داده‌ی بازی واقعی جمع شد.
