dsh-arabic
Bidi-safe RTL rendering for mixed Arabic and English text, a full Arabic interface pack (3,307 strings) registered through the DSH locale service, and three thmanyah cuts — Sans for the interface, Serif Text for reading, Serif Display for headings — placed behind whatever font the app itself is set
Install
dsh plugin --profile web add dsh-arabic
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-arabic
العربية · [English](README.en.md)
العربية لتطبيق DeepSeek Harness — عرض RTL سليم تقنياً، وحزمة تعريب كاملة للواجهة، وخطّ ثمانية للواجهة.




DSH لا يدعم RTL ولا يوفّر لغة عربية. خلط النص العربي بأسماء المتغيّرات والمسارات
والأكواد داخل الواجهة يجعل الكلام مبعثراً، وكل القوائم إنجليزية. هذا البلاقن يحل
المشكلتين دون تعديل التطبيق نفسه.
ما الذي يفعله
١) عرض RTL آمن ثنائي الاتجاه (يعمل بأي لغة واجهة)
الاتجاه يُحسم لكل كتلة بهيمنة الكلمات، لا بأول حرف قوي. والتقسيم على
المسافات فقط، فـ@deepseek-ai/dsh تُحسب كلمة واحدة لا ثلاثاً:
المحتوى · الاتجاه · السبب
كيف حالك Hello · RTL · الكلمات العربية غالبَة
Hello كيف حالك · RTL · ما زالت جملة عربية — وdir="auto" يخطئ هنا
Error: فشل الاتصال بالخادم · RTL · الجملة عربية والبادئة ليست كذلك
npm install ثم أعد التشغيل · RTL · ٣ كلمات عربية مقابل ٢ لاتينية
شغّل npx @deepseek-ai/dsh web · RTL · الرمز التقني يلصق npx … web في وحدة واحدة: عربية ١ مقابل لاتينية ١
راجع commit a4c1025b قبل النشر · RTL · البصمة المجرّدة لا تُصوِّت
نسبة النجاح 15/15 · RTL · النسبة محايدة
افتح src/index.ts ثم عدّل الدالة · RTL · المسار لا يُصوِّت
"C:\Users\…\الخطوط\thmanyahseriftext" · بلا تغيير · مسار ويندوز رمز تقني ولو كان أحد مجلداته عربيًا
@deepseek-ai/dsh مهم جدًا · RTL · المُعرِّف الواحد = وحدة واحدة
Hello نص · RTL · التعادل يُحسم RTL
The build failed while parsing سلام in the file · بلا تغيير · نص إنجليزي يقتبس كلمة يبقى LTR
شغّل "git status" · RTL · الاقتباس وحدة واحدة: يُحتسب مرة لا مرتين
pre وcode والكود المضمّن · LTR دائماً · الكود لا يُحكم عليه ولا يُقلب
مربّع الكتابة والبحث · يتبع ما تكتبه · RTL حين تغلب العربية، وإلا auto الأصلي
القواعد الأربع خلف الجدول:
١. الرموز الشبيهة بالكود لا تُصوِّت — الروابط، المسارات (بما فيها شرطة ويندوز
المائلة الخلفية)، @scope/name، البصمات، 15/15، أسماء الملفات المنقوطة؛
فرابط واحد أو بصمة واحدة قد ترجّح على جملة عربية كاملة، والرمز التقني يلصق
الكلمات اللاتينية حوله في وحدة تقنية واحدة. والمسار الذي يحمل مجلدًا عربيًا
يبقى مسارًا: احتسابه نصًّا عربيًا هو ما كان يقلب كتلة مسارات إلى RTL، فيُعاد
ترتيب مقاطعها اللاتينية حول تلك الكلمة.
٢. الكلمات هي الوحدة لا الحروف — فالمصطلح اللاتيني أطول حروفاً وأقل كلمات.
والتعادل يُحسم للعربية، والكتلة التي لا كلمة عربية فيها تُحرَّر.
٣. تثبيت أثناء البثّ (hysteresis) — الكتلة التي صارت RTL تبقى كذلك حتى يصير
النص لاتينياً بوضوح (ضعف عدد الكلمات العربية)، فلا يتذبذب الرد المتدرّج.
٤. الاقتباس وحدة واحدة — "git status" نصٌّ مقتبس (أمر، عنوان، جملة) يُحتسب
مرة واحدة لا مرتين؛ فيُقرأ شغّل "git status" جملةً عربية كما هي، بينما
الكلمتان نفسهما بلا اقتباس تبقى LTR (انظر الحدود أدناه). وعلامة اقتباس غير
مغلقة — ردٌّ يتدفّق والاقتباس لم يُغلق بعد — تمتدّ إلى آخر النص، وهي الوحدة
نفسها التي سينتجها الاقتباس المغلق، فلا تذبذب لحظةَ الإغلاق.
كتل النص وحدها تُقلب — والهيكل لا يُقلب أبداً. حاوية flex أو grid تُعيد
ترتيب أبنائها عند القلب، والصف الذي يملك أزراراً هو شريط أدوات: كلاهما مُستثنى،
فيبقى زر الإرسال في مكانه رغم أن وسم الصلاحية العربي في الصف نفسه. والنص العربي
داخل ذلك الصف يعيش في كتلة نصية خاصة به فيُعالَج عادةً.
وشكلان احتاجا أكثر من قرار كتلة عادية، وكلٌّ منهما مُثبَّت باختبار وبـdata/card-pins.json:
- خلية نصّية جعلها CSS كتلةً. بطاقة السؤال التي يسأل بها المساعد ترسم كل خيار
button بـflex، ووسمها ووصفها span داخله. الـspan المضمّن فعلاً جزء من
التدفّق حوله، أما عنصر flex فهو كتلة نصية قائمة بذاتها: كل خلية تأخذ RTL،
فيُقرأ ادفع fix/rust-flake كما هو بترتيبه لا مقلوباً، ويبقى رقم الصف في مكانه؛
<header>/<footer>بطاقة المحتوى. DSH يضع نص السؤال داخل<header>
(وheader وfooter علامتان للهيكل وتبقيان LTR). وإطار البطاقة يحمل
data-question-key — وهو المُعرِّف الوحيد الذي يقرأه هذا البلاقن من التطبيق —
فعلامة داخل البطاقة جزء من البطاقة، وسؤالها محتوى كأي فقرة.
وscripts/check-card-pins.mjs <app.asar> يفشل مسمّياً الفرق إذا تغيّر هذا
المُعرِّف أو لم يعد صف الخيارات صف flex؛
- وما لا يتحرك: رقم الخيار، وعناصر التحكّم نفسها. الصف الذي يملك زراً لا يُقلب،
وعنصر التحكّم لا يُمنح اتجاهاً خاصاً به — فزر flex يعكس ترتيب أيقونته ووسمه،
والوسم المتوسّط يقفز إلى حافة عند تجاوز المحاذاة. فيبقى الرقم حيث وضعه التصميم،
وتبقى أزرار البطاقة بتخطيطها، ويبدأ النص العربي بجانبها — البطاقة لا تُقلب، بل نصّها.
<sub>مُصيَّرة بـChromium بمحرّك bidi الحقيقي: الترميز والنصوص نفسها في اللوحين، مع خصائص dir التي يكتبها البلاقن في اللوح الأيمن. ورقم الخيار يبقى في اليسار في الحالتين. المصدر: [docs/question-card.html](docs/question-card.html).</sub>
وإذا كان اتجاه كتلة ما مضبوطاً من التطبيق أو منك (dir="ltr" في الترميز)، فلا
نلمسه أبداً — وهذا هو المخرج الاحتياطي لأي كتلة يُخطئ فيها المُقدِّر.
حدود معروفة (مُثبَّتة في الاختبارات لا مخفية)
- الكلمات اللاتينية المجرّدة تُصوِّت.
شغّل git statusيبقى LTR: كلمتان
لاتينيتان عاديتان ترجّحان على كلمة عربية، ولا فاصل تقني يلصقهما. وقد جُرِّب
اعتبار كل تتابع لاتيني وحدة واحدة فرُفض — لأنه يقلب فقرات إنجليزية تقتبس كلمة عربية.
والاقتباس هو العلاج بيد القارئ: شغّل "git status" ينقلب.
- المسار المختلط داخل الجملة العربية يتبع خوارزمية bidi. الكتلة عربية وتبقى
RTL، فتترتّب مقاطع المسار اللاتينية حول مقطعه العربي. وكتابة المسار داخل
علامتَي الكود الخلفيتين هي الصيغة الموثوقة: الورقة تعزل code من اليسار
إلى اليمين، فيُقرأ المسار بترتيبه (مُتحقَّق منه في Chromium).
- طرفية الشريط الجانبي لا تصل الحروف. طرفية D
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::22,最后更新 2026-10-17