OpenDerja_TN

مشروع غير ربحي · يصونه شخص واحد · يفتح للمساهمات

السجلّ المكتوب للدارجة التونسية الذي يستمرّ في النموّ.

نحو اثني عشر مليون شخص يكتبون الدارجة التونسية كلّ يوم — في الرسائل والتعليقات وفي وسط جُمَل فرنسية — ولا يكاد يوجد لها سجلّ سليم. OpenDerja_TN منصّة يكتب فيها التونسيون دارجتهم الجهوية ويصحّحونها ويؤكّدونها بأنفسهم. وينتج عن ذلك مدوّنة قابلة للاستشهاد، ومعجم، ومترجم مبنيّ مباشرة فوقها. النصّ أوّلاً؛ والصوت بالتصميم في مرحلة لاحقة.

جدّة في الشمال الغربي تستعمل كلمة لا يستعملها غيرها. حين تتوقّف عنها تختفي — لم يكتبها أحد. هذا يحدث باستمرار، ولا أحد يتولّاه.

ما هو

خمسة التزامات

النصّ أوّلاً، والصوت بالتصميم

تشتغل المنصّة على النصّ من اليوم الأوّل. نموذج الموافقة ومخطّط قاعدة البيانات للصوت موجودان منذ أوّل ترحيل — لا يُضافان بعد سنوات حين يتعذّر جمعهما بأثر رجعي.

متوازن جهويًّا عن قصد

التغطية لكلّ جهة رقمٌ يُتابَع ويُنشَر ويُجنَّد له — لا أمل يُرجى. ما هو على الإنترنت يميل نحو تونس العاصمة؛ والاستقطاب الموجَّه هو الموازن.

حيّ، لا مؤرشَف

المدوّنات الأكاديمية تتوقّف يوم صدور الورقة. هذه مبنيّة لتستمرّ في النموّ، وكلّ مساهمة مؤكَّدة تحسّن الأدوات في اليوم نفسه.

متوافق مع CODA

يعتمد أعراف الكتابة الموجودة CODA-TUN وNOTA بدل اختراع معيار آخر.

قابل للاستعمال، لا للتنزيل فقط

المدوّنة معروضة كأداة للناس سببٌ لفتحها — مترجم، معجم، عرض مقارنة — لا مجرّد ملفّ للباحثين سببٌ للاستشهاد به.

لماذا تستعمله

أربعة أسباب لفتح الموقع

المدوّنة هي الأساس؛ وهذه هي ما تأتي من أجله فعلاً.

01

الترجمة من الدارجة وإليها

دارجة ← فصحى / فرنسية / إنجليزية بأيّ خطّ، و — وهذا ما لا يقدّمه غيرنا — فصحى / فرنسية / إنجليزية ← دارجة مع اختيار الجهة. «قُلها بدارجة الجنوب» أمرٌ تعجز عنه الأدوات الموجودة.

02

الاستشهاد به في البحث

مجموعة بيانات مُصدَّرة بإصدارات، برخصة مفتوحة، موسومة بالجهة، بإحصاءات تغطية صادقة، وبمعرّف DOI، وبطبقات ترخيص حسب المصدر. يعيد ما كتبه التونسيون فعلاً، أو لا شيء — ولهذا يُستشهد به.

03

بناء معالجة اللغة التونسية عليه

بيانات مفتوحة للتنزيل أو الاستعلام: أزواج متوازية، جُمَل موسومة بالجهة، معجم بمتغيّرات جهوية وأصول الكلمات. لا مفتاح API، لا كلفة، لا شيء في مسار الطلب قد يتعطّل.

04

دوِّن الكلمة التي نشأت عليها

خانة واحدة: كلمة أو جملة أو فقرة. الجهة أربعة أزرار، الموافقة خانة واحدة، دون حساب. ثلاث ثوانٍ وتدخل السجلّ.

ما الذي يميّزه

كلّ قطعة موجودة في مكان ما. ولا مكان تجتمع فيه كلّها.

ليست أوّل مدوّنة تونسية (توجد Tunisiya وTARIC وTSAC وغيرها)، ولا أوّل توحيد لكتابة العربية التونسية (فعل ذلك CODA-TUN)، ولا أوّل منصّة تشاركية للهجة عربية. ما لا تجمعه أيّ منصّة موجودة في مكان واحد: النصّ الآن والصوت بالتصميم لاحقًا؛ تأكيد المجتمع بدل كلمة سلطة واحدة؛ وسم الجهة والحقبة معًا، فتجلس الدارجة القديمة قرب جهات اليوم الأربع؛ مترجمٌ يشتغل، لا ملفّ فقط؛ بيانات مفتوحة؛ مصونة باستمرار كخدمة مفتوحة واحدة.

أربع جهات، مسطّحة — دون جهات فرعية حتى تبرّرها البيانات

الجهة تشمل
الشمال الغربي الكاف، جندوبة، سليانة، القصرين، المرتفعات الغربية
الشمال تونس، بنزرت، نابل، أريانة، منوبة، بن عروس
الساحل سوسة، المنستير، المهدية، صفاقس، الوسط الساحلي
الجنوب قابس، مدنين، تطاوين، توزر، قبلي، دوز، قفصة

ستة محاور مستقلّة — لا تُدمَج أبدًا في قائمة واحدة

المحور القيم ملاحظة
النطاق عموم-تونسي · جهوي هل هو موسوم أصلاً، لا مدى انتشاره
الجهة مجموعة من: شمال غربي · شمال · ساحل · جنوب واحدة أو أكثر. فارغة حين يكون عموم-تونسي — اللهجة متّصلة، فالجهة مجموعة لا قيمة واحدة.
الحقبة معاصر · تاريخي «الدارجة القديمة» هنا، لا في الجهة
الوسط حضري · ريفي · غير معروف يقطع الجهات، لا يتبعها
السجلّ محايد · رسمي · سوقي · قديم السوقي مُرشَّح افتراضيًّا مع مفتاح تفعيل صريح، ولا يُحذف من التصدير أبدًا

«شمال غربي + ريفي + تاريخي» طلبٌ حقيقي يمكن أن تطلبه — وهذا التركيب بالضبط هو المادّة التي لم يجمعها أحد، وهو أهمّ أسباب وجود المشروع.

الحلقة الأساسية

كيف تصبح جملة واحدة جزءًا من المدوّنة

النظام كلّه مبنيّ حول هذه الحلقة — سواء كتب المساهم النصّ أو سحبه جامع بيانات من مصدر عامّ.

  1. 01

    يصل النصّ

    يساهم به أحدهم، أو يسحبه جامع بيانات من مصدر مفتوح قائم على النسخ الكاملة (ويكيبيديا، Common Crawl مُرشَّح على نطاقات ‎.tn‎، Tatoeba، منتديات تونسية وفق شروطها).

  2. 02

    يُنظَّف ويُفحَص

    هل هو دارجة فعلاً؟ قصير جدًّا أو طويل جدًّا؟ هل هو شبه مكرّر لما هو في المدوّنة (MinHash/LSH)؟

  3. 03

    يُخزَّن كعنصر مدوّنة

    إذا بدا جديدًا وصحيحًا. المكرّر يطلق «عندنا هذه — هل تقولها جهتك بشكل مختلف؟» بدل رفض صامت.

  4. 04

    تُنشَأ مهامّ تلقائيًّا

    مراجعته، وسم جهته، تأكيده، ترجمته، ربط كلماته بمداخل المعجم.

  5. 05

    الناس ينجزون المهامّ

    لا شيء يكتبه شخص واحد يصير «صحيحًا» تلقائيًّا. يبقى الوسم أو الترجمة اقتراحًا حتى يتّفق عدّة أشخاص مستقلّين.

  6. 06

    توافق، ثمّ نشر

    توافق كافٍ ← يصير الجواب الموثوق. خلاف ← يقرّر مراجعٌ موجَّه حسب الجهة. لا يُعرَض علنًا إلا الجواب المتّفَق عليه.

المترجم

السبب الذي يفتح الناس الموقع من أجله — ولا يحتاج نموذجًا

البحث عن الكلمة والعبارة يمرّ عبر المعجم: تطابق تامّ، ثمّ تطابق مُطبَّع، ثمّ تشابه ثلاثيّات الحروف للأخطاء المطبعية. الجُمَل تُستَرجَع بتشابه ثلاثيّات الحروف على عناصر المدوّنة المُثبَتة مع ترجماتها البشرية.

الاتّجاهان، مع مراعاة الجهة

إلى الدارجة مع اختيار الجهة هو العرض الذي يجعل الناس يشاركون الرابط.

يتحسّن يوم يساهم أحدهم

كلّ تعليق مقبول يحسّنه فورًا — لا إعادة تدريب، لا لقطة تُرقّى، لا خطر تراجُع. المترجم القائم على الاسترجاع لا يمكنه إلا أن يتحسّن.

يفشل بصدق

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

يُظهر حجمه

عدّادٌ حيّ: هذا المترجم يعرف N كلمة وM جملة عبر أربع جهات، بازدياد عن الشهر الماضي. في اليوم الأوّل يكون الرقم صغيرًا بشكل محرج، ويبقى ظاهرًا رغم ذلك.

إنه بحث في مدوّنة، لا ترجمة آلية. يعيد ما كتبه التونسيون فعلاً، أو لا شيء. منتَجٌ أضعف من نموذج سلس وأصدق منه — وهذا الصدق هو ما يجعل الباحث يستشهد به. أيّ شيء مُولَّد يخصّ مرحلة لاحقة، موسوم دائمًا، ولا يُخلَط أبدًا بالنتائج المُثبَتة.

البنية

أربعة مستويات، مفصولة بحسب اللغة لسبب

هذا الفصل يتيح فهم كلّ قطعة واختبارها وتغييرها وحدها.

المستوى اللغة ما يفعله
control-plane/ TypeScript الخادم (واجهة NestJS)، العامل (مهامّ خلفية)، جامعو البيانات. تقريبًا كلّ المنطق — ويبقى TypeScript دائمًا؛ المشاكل الصعبة هنا هي القواعد لا السرعة الخام.
data-plane/ Rust عملٌ كثيف على المعالج ثبت بالقياس أنه يحتاجه. اليوم: كشف شبه المكرّرات. البقية مجرّد stub حتى يقول التنميط غير ذلك — لا تُعاد كتابة قطعة بـRust إلا بعد إثبات أنها عنق زجاجة.
intelligence-plane/ Python (FastAPI) استدلال وتدريب تعلُّم آلي، مشروطان بالمرحلة. مجرّد stub لفحص الصحّة الآن — لا شيء في مسار الطلب ينتظره، عن قصد.
frontend/ TypeScript (Next.js) القطعة الوحيدة التي يلمسها الزائر. لا تكلّم قاعدة البيانات مباشرةً أبدًا — دائمًا عبر واجهة الخادم، ليكون هناك مكان واحد بالضبط تُطبَّق فيه القواعد.

الصورة الكاملة مع مخطّطات، للمطوّرين وغير المطوّرين: docs/ARCHITECTURE.md. كلّ endpoint بأشكال طلبه واستجابته: docs/API_REFERENCE.md.

أين تقف الأمور فعلاً

اقرأ هذا قبل افتراض أنّ أيّ شيء يعمل

يحتفظ المشروع بسجلّ صادق لما جُرِّب من طرف إلى طرف مقابل ما هو مبنيّ-لكن-غير-متحقَّق مقابل ما لم يُبنَ بعد. باختصار:

الخادم

مبنيّ إلى حدّ كبير · مُختبَر وحدويًّا · لم يُشغَّل بعد من طرف إلى طرف

المصادقة (كلمة سرّ، OAuth، تحقّق بخطوتين، جلسات مساهم مجهول)، محرّك المهامّ، التوافق، أدوات الإدارة، خطّ جمع بيانات، خدمة Rust للتخلّص من التكرار. تغطية اختبارات وحدوية حقيقية. المعلَم التالي هو تشغيله على نشرٍ حيّ — عملٌ حقيقي لا إجراء شكليّ.

الواجهة

هيكل مسارات · هنا تكون المساعدة

كلّ صفحة في المواصفات موجودة كـstub يُبنى ويعيد 200، لا كصفحة تعمل. سبعة مكوّنات تعليق مشتركة لم توجد بعد. docs/API_REFERENCE.md فيه كلّ endpoint جاهزًا.

مستويا البيانات والذكاء

قليلان عن قصد

مستوى Rust يفعل عملاً واحدًا مقيسًا. مستوى Python مجرّد stub لفحص الصحّة. يبقى كلٌّ منهما كذلك حتى يوجد سبب مقيس — لا مؤقّت مراحل.

إن أخذت PR هنا وأنت تنتظر منتَجًا مكتملاً، ستُصاب بخيبة أمل. وإن كنت تنتظر خادمًا حقيقيًّا يعمل بثغرات واضحة في الواجهة لتملأها — فهذا دقيق.

مذكورة، لأنّ خطرًا لم تسمّه ليس خطرًا تديره

ساهم

طرق المساعدة الآن

الواجهة

ابدأ من هنا

أعلى عمل قيمةً اليوم. تحويل stubs المسارات إلى صفحات حقيقية مقابل واجهة موثَّقة، وبناء مكوّنات التعليق المشتركة.

الخادم

إصلاحات جراحية — عِلَل، تغطية اختبارات ناقصة، سدّ ثغرة موثَّقة (انظر db/DATABASE_NOTES.md).

بيانات المدوّنة

ليس بعد — يجب أن يكون تدفّق المساهمة حيًّا ومُراجَعًا أوّلاً. يُفتَح حين تلحق الواجهة.

التوثيق، بلاغات العلل، الأسئلة

مفيدة دائمًا، دون حدّ أدنى من الخبرة.

قاعدة واحدة تسري على المشروع كلّه

لا تعليقات في الشيفرة، في أيّ مكان، دون استثناء. إن كنت تعتقد بصدق أنّ تعليقًا ضروريّ، قل ذلك في وصف الـPR ودع الصائن يقرّر الصياغة. الـPR التي تضيف تعليقات يُطلَب منها إزالتها.

تخطّط لشيء كبير؟ افتح issue أوّلاً — توجيه خطّة أرخص من توجيه PR منجزة. مدد المراجعة تتبع توفّر شخص واحد؛ الردّ البطيء ليس إشارةً إلى أنّ مساهمتك غير مرغوبة.

البداية

Node 18+ وpnpm 9 وDocker

git clone https://github.com/firaslamouchi21/Open_Derja_Tn.git && cd Open_Derja_Tn
pnpm install && cp .env.example .env
# postgres, pgbouncer, redis, stubs pnpm infra:up
# pnpm --filter @open-derja/db run migrate:deploy
# :3000 pnpm --filter @open-derja/backend run start:dev
# :3001 pnpm --filter @open-derja/frontend run dev

استبدل كلّ قيمة change-me في .env — وخاصّةً AUTH_SECRET (openssl rand -base64 32). التكامل المستمرّ معطَّل بانتظار الإطلاق العامّ، فشغّل مجموعات الاختبار محلّيًّا (pnpm test:unit وcargo test) قبل فتح PR.

الترخيص

الشيفرة والبيانات سؤالان مختلفان

الشيفرة

Apache 2.0 — المستودع كلّه. متساهل عن قصد: الانتشار أهمّ من التحكّم.

بيانات المدوّنة (بعد النشر)

بترخيص منفصل، والاختيار لم يُحسَم بعد بين share-alike وغير التجاري. ليس بشأن الإيرادات — لا وجود لها — بل لمنع أحدهم من تسييج ما بناه المساهمون مجّانًا وبيعه لهم من جديد.

خانة الموافقة التي لا يمكن إضافتها لاحقًا

عند الإرسال، خانة صريحة واحدة: يمكن أن تدخل هذه المادّة في مجموعة بيانات مفتوحة الترخيص، بما في ذلك الاستعمال التجاري — وتشمل السجلّ المُعلَّق، لا النصّ الخام فقط. وترافقها بندٌ صوتيّ منفصل منذ اليوم الأوّل، قبل وجود التسجيل بسنوات، لأنه لا يُجمَع بأثر رجعي.

تواصل

تواصل مع فراس بخصوص OpenDerja

تريد المساهمة، أو لديك سؤال عن البنية، أو تعمل على معالجة اللغة التونسية وتودّ المقارنة — يصل هذا مباشرةً إلى بريد فراس وستتلقّى ردًّا تلقائيًّا للتأكيد.