تخطَّ إلى المحتوى

الميزات العربية والثقافية

كاظمة عربية بالأصل افتراضيًا. يُغطّي هذا المستند المكوّنات الثلاثة التي تُطبّق ذلك: المُجزِّئ العربي، وطبقة واجهة التدويل (i18n) واتجاه من اليمين لليسار (RTL)، وبروتوكول المجلس الثقافي — كلها موثّقة من المصدر، مع ملاحظات صريحة عن النطاق.


المكوّنالحزمةالدور
المُجزِّئ العربيkazma-memoryتطبيع النص + فهرسة FTS5 للبحث العربي.
طبقة التدويل (i18n) + واجهة RTLkazma-uiترجمة نصوص الواجهة، وضبط dir/lang لكل طلب، وسياسة الخطوط.
بروتوكول المجلسkazma-coreتدفّق المحادثة الثقافي الخليجي (4 مراحل).

هذه طبقات مستقلّة. لا يعتمد المُجزِّئ على نظام التدويل (i18n)، والمجلس وحدة محادثية جوهرية — وليس ميزة في الواجهة.


kazma-memory/kazma_memory/arabic_tokenizer.py (292 سطرًا). مُفصَّل في الذاكرة وRAG ← المُجزِّئ العربي. ملخّص خط معالجة التطبيع (normalize، الأسطر 132-165):

  1. إزالة التشكيل — regex [\u064B-\u065F\u0670].
  2. تطبيع الألف — أ، إ، آا.
  3. التاء المربوطة ← هاء — ةه.
  4. تطبيع الياء — ئ، ؤ، ىي.
  5. إزالة التطويل/الكشيدة — text.replace("ـ", "").
  6. طيّ المسافات البيضاء.

تشمل كلمات الوقف مصطلحات من اللهجة الكويتية (يلا، شلون، عشان، مو، ليه، ماكو، فد). الجذّاع عبارة عن تجريدة بسيطة للبادئات/اللواحق عبر regex (وليس مُؤلِّفًا لل corpus Lemmatizer). صنفان: ArabicTokenizer.tokenize() ← نصّ؛ وArabicTantivyTokenizer.tokenize() ← قائمة.


3. طبقة التدويل (i18n) وواجهة RTL

Section titled “3. طبقة التدويل (i18n) وواجهة RTL”

kazma-ui/kazma_ui/i18n.py (1187 سطرًا) هو نظام تدويل مخصّص وخفيفليس Babel/gettext.

  • لا توجد ملفات ar.json/en.json منفصلة. جميع الترجمات مُضمَّنة داخل قاموس Python واحد TRANSLATIONS (i18n.py:33)، مُفهرَس بسلسلة منقّطة مع قيم {"en": ..., "ar": ...}.
  • لا تُسلَّم سوى en وar افتراضيًا (وثائق الوحدة الأسطر 1-8).
  • يجب أن يمتلك كل مفتاح مُدخَل en؛ ويتراجع ar إلى الإنجليزية إذا كان مفقودًا (i18n.py:1116-1119).

واجهة API:

الدالةالغرض
t(key, lang, **kwargs) (i18n.py:1106)الترجمة مع إقحام str.format.
make_translator(lang) (i18n.py:1128)غلاف (closure) مُلزَم بلغة، لـ Jinja2.
SUPPORTED_LANGUAGES (i18n.py:1138)مُحتسَب ديناميكيًا من القاموس.

ترقيع Jinja2: _patch_jinja2_templates() (i18n.py:1156) يُرقِّع Jinja2Templates.__init__ عبر monkey-patch ليحقن دائمًا مُتغيّرات التدويل الافتراضية العامة (t، lang="en"، dir="ltr") كي لا تُطلِق القوالب UndefinedError. يُستدعى عند تحميل الوحدة (السطر 1186).

التوصيل من جهة الخادم (app.py:222-248): يحقن الباني t، lang، dir، وtranslations_json (القاموس الكامل كـ JSON لاستخدامه من جهة العميل في Alpine.js) داخل مُتغيّرات Jinja2 العامة. ويقرأ language_middleware كوكي kazma-lang ويضبط lang/dir لكل طلب.

قاموس الترجمة واسع — تمتدّ المفاتيح إلى التنقّل، والترويسة، والدردشة، ولوحة التحكم، والإعدادات (جميع التبويبات الـ 13)، والسرب (العمّال، المهام، الأنماط، التجميع، النتائج، التوجيه، وتوجيه المُخرجات)، والوكلاء، والمهارات، وMCP، ومساحة العمل (بما في ذلك قياسات GitHub عن بُعد). أمثلة: swarm.arabic_dialect (i18n.py:976swarm.dialect_msa (“Modern Standard Arabic” / “العربية الفصحى”، السطر 977).

  • القالب: templates/base.html:2<html lang="{{ lang|default('en') }}" dir="{{ dir|default('ltr') }}">.
  • المُتغيّر العام dir يُضبَط في app.py:235: "rtl" if _startup_lang == "ar" else "ltr"، ويُحدَّث لكل طلب عبر الوسيط (middleware).
  • من جهة العميل: base.html:71 يحقن window.KAZMA_LANG؛ والأسطر 76-77 تُتاح عبر دالة بحث t() من جهة العميل.

3.4 سياسة الخط العربي (Calibri + أساس 16px)

Section titled “3.4 سياسة الخط العربي (Calibri + أساس 16px)”

kazma-ui/kazma_ui/static/css/kazma.css — يطابق الالتزامات الحديثة (7890e97، d689ac8، 981af5c):

/* Font stacks (kazma.css:95-96) */
:root {
--font-sans: 'Calibri', 'Inter', 'Cairo', -apple-system, ...;
--font-arabic: 'Calibri', 'Cairo', 'Inter', -apple-system, ...;
}
/* 16px base for RTL (kazma.css:114-118) */
html { font-size: 14px; }
/* Arabic glyphs need larger rendering for readability.
16px base makes 0.7rem ≈ 11.2px (readable). */
html[dir="rtl"] { font-size: 16px; }
/* Minimum readable font-size floor (kazma.css:119-133) */
html[dir="rtl"] .badge,
html[dir="rtl"] .metric-label,
html[dir="rtl"] .text-muted,
html[dir="rtl"] .text-xs { font-size: 0.82rem !important; }
/* RTL font-family enforcement (kazma.css:163-169) */
[dir="rtl"] body,
[dir="rtl"] input,
[dir="rtl"] textarea,
[dir="rtl"] button,
[dir="rtl"] select { font-family: var(--font-arabic); }

Calibri هو الخط الأساسي لكلٍّ من اللاتينية والعربية؛ وCairo هو الاحتياطي الداعم للعربية.


kazma-core/kazma_core/majlis.py (348 سطرًا). هذا موجود فعلًا — مؤكَّد أثناء التدقيق (كانت بعض الملخّصات السابقة غير متأكدة).

الصنف MajlisProtocol (السطر 91). من نص الوثائق (الأسطر 1-12):

بروتوكول المجلس — بروتوكول محادثة ثقافي للتفاعلات بالعربية الخليجية. المجلس (مجلس) هو فضاء التجمع الخليجي التقليدي حيث تتّبع المحادثة إيقاعات ثقافية محدّدة: التحية أولًا، ثم الكلام الاجتماعي، ثم العمل.

4.2 التدفّق ذو الـ 4 مراحل

Section titled “4.2 التدفّق ذو الـ 4 مراحل”

تعداد ConversationPhase (السطر 38):

flowchart LR
G[GREETING] --> S[SOCIAL]
S --> T[TRANSACTION]
T --> F[FAREWELL]
المرحلةالغرض
GREETINGالتحية أولًا (السلام عليكم، هلا والله، شلونك).
SOCIALالكلام الاجتماعي قبل العمل.
TRANSACTIONالمهمة/الطلب الفعلي.
FAREWELLعبارات الختام والوداع.

4.3 الافتراضات والمُعدِّلات الثقافية

Section titled “4.3 الافتراضات والمُعدِّلات الثقافية”
  • اللهجة الافتراضية: الكويتية (dialect: str = "kw"، السطر 54).
  • أنماط تحية/وداع كويتية مُضمَّنة برمجيًا (الأسطر 105-120): "السلام عليكم"، "هلا والله"، "شلونك"، إلخ.
  • المُعدِّلات الثقافية (الأسطر 150-158، 287-288): رمضان، العيد، اليوم الوطني تُعدِّل طول مرحلة التحية ومستوى الرسمية.
  • وحدات شقيقة: CulturalContext، وConversationPacing/Intent/TransitionDecision، وToneAdapter/FormalityLevel (الاستيرادات الأسطر 21-30).
  • process_input(text, context) (السطر 162) — نقطة الدخول غير المتزامنة، تُعيد MajlisResponse (السطر 73).

4.5 النطاق (ملاحظة صريحة)

Section titled “4.5 النطاق (ملاحظة صريحة)”

يعيش المجلس في kazma-core، وليس في الواجهة أو البوابة. لا يوجد مفتاح تبديل “وضع المجلس” في إعدادات الويب أو مفاتيح التدويل (i18n) — فطبقة التدويل نظام نصوص عام EN/AR. المجلس بروتوكول محادثة جوهري مُعدٌّ ليُوصَل إلى مُوجِّه نظام الوكيل (system prompt) أو إلى مهارة. إذا أوحى التوثيق بأن المجلس وضع واجهة موجَّه للمستخدم، فذلك غير مدعوم من شيفرة الواجهة. توجد اختبارات في tests/test_majlis.py، ومثال في examples/almuhalab_custom_skills/trading_intel/.


5. ترجمة واجهة الطرفية (TUI)

Section titled “5. ترجمة واجهة الطرفية (TUI)”

تمتلك واجهة الطرفية (TUI) نظامها الخاص من RTL/الترجمة (kazma_tui/app.py):

  • update_localization() (السطر 512) يُبدِّل صف CSS باسم rtl-mode (السطر 520) ويُترجِم تسميات التبويبات (الأسطر 528-546).

عدم اتساق طفيف: تُسمّي واجهة الطرفية (TUI) لوحة التحكم بـ “لوحة القيادة” (السطر 539)؛ بينما يستخدم التدويل (i18n) للويب “لوحة التحكم” (i18n.py:77).


دليل اللهجةالموقع
كلمات وقف كويتيةarabic_tokenizer.py:35-102 (يلا، شلون، عشان، مو، ليه، ماكو، فد)
اللهجة الكويتية الافتراضيةmajlis.py:54 (dialect: str = "kw")
أنماط تحية/وداع كويتيةmajlis.py:105-120
تسمية واجهة للعربية الفصحى (MSA)i18n.py:977 (swarm.dialect_msa)
مفتاح إعداد swarm.arabic_dialecti18n.py:976

7. ملاحظات الاستخدام ثنائي اللغة

Section titled “7. ملاحظات الاستخدام ثنائي اللغة”
  • اللغة الافتراضية هي العربية (agent.language: ar، agent.rtl: true). اضبطها على en للأولوية للإنجليزية.
  • كوكي kazma-lang يُبدِّل لغة واجهة الويب لكل متصفّح دون إعادة تشغيل.
  • يُوجِّه system_prompt (kazma.yaml:33-45) النموذج للاستجابة بلغة/لهجة المستخدم.
  • في النشر ثنائي اللغة، فكّر في تقديم أمثلة بالإنجليزية والعربية معًا في المهارات/الأدوات حيثما تهمّ لغة المُخرجات.

  • المجلس موجود في kazma-core/kazma_core/majlis.py (348 سطرًا، مع اختبارات ومثال) — مؤكَّد مقابل عدم اليقين السابق.
  • المجلس ليس ميزة واجهة. لا يوجد مفتاح تبديل في الإعدادات أو مفتاح تدويل (i18n) لـ “وضع المجلس”. إنه بروتوكول محادثة جوهري يُوصَل إلى المُوجِّهات/المهارات.
  • لا توجد ملفات ترجمة منفصلة. جميع نصوص EN/AR تعيش مُضمَّنة داخل i18n.py. يضيف المُساهِمون مفتاحًا بتحرير القاموس.
  • عدم اتساق تسمية لوحة التحكم بين واجهة الطرفية (“لوحة القيادة”) والويب (“لوحة التحكم”) — طفيف، يستحق المواءمة في النهاية.
  • المُجزِّئ ← التدويل (i18n) مستقلّان. لا تفترض أن تغيير التدويل يؤثّر على فهرسة البحث؛ فالطبقتان تخدمّان غرضين مختلفين.