وش اللي تعلمناه من اللغة العربية في عملية إعادة بناء كرانل ؟ 😎

meta
features
engineering
تكلمنا عن أهمية اللغة العربية ودعمها في المنصة والجوانب الهندسية المتعلقة بهذا الموضوع
Author
Published

18 سبتمبر 2026

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

لو تبي تشوف النسخة الإنجليزية من المقالة :

ليش دعمنا العربية؟ وليه طولناها وهي قصيرة؟

فيه طريقة سريعة ومختصرة عشان تدعم أي لغة. تسحب النصوص، تعطيها مترجم، تحط dir=“rtl” في جذر الصفحة، تعكس الهوامش، وتنشر التحديث. النتيجة واجهة تبان عربية للوهلة الأولى، بس لو ركزت فيها شوي بتلقاها مكسرة.

كان هدفنا منصة مكتوبة بالعربية للقارئ العربي، مو منصة إنجليزية لابسة مستعربة ويطلع التعريب كله ماله داعي. هذا الخيار حلو بس بيرفع عليك التكلفة جدا. استثمرنا حوالي 700 ساعة هندسية في دعم العربية وتصميم الواجهة مع بعض، وأغلب الشغل في الجانب العربي راح في تفاصيل ما يوصل لها أي مترجم. مب لأن الترجمة او الذكاء الاصطناعي مب كويسين بس الفكرة ان حنا اساسا عرب ونتكلم عربي حتى باجتماعاتنا. لهذا السبب اعتمدنا على انفسنا بشكل اكبر من اي اداة ثانية

فيه قرارين شالوا الحمل الأكبر. الأول أن تحديد اللغة يصير في السيرفر، عشان كذا أول بايت من HTML يوصل المتصفح وفيه اتجاه النص واللغة الصح. ما فيه شيء يبدأ من اليسار لليمين بعدين يرمش وينقلب فجأة. القرار الثاني أن قاموس الكلمات الإنجليزية يصدر نوع البيانات، والقاموس العربي يطابقه. أي نص ناقص يكسر الـ build مباشرة، وما يقدر يوصل للبرودكشن ويبقى هناك لين نكتشفه بالصدفة.

الدروس اللي تعلمناها من لغتنا

الإنجليزية فيها صيغتين للجمع. العربية فيها ست: الصفر، والمفرد، والمثنى، وجمع القلة، وجمع الكثرة، وجمع التكسير, وجمع المذكر السالم وعد واغلط. كل عدّاد في المنصة يمر على Intl.PluralRules مع تعبئة الفئات الست كلها، وهنا بدينا نتعلم صدق.

المثنى عندنا صيغة نحوية مستقلة، مو مجرد تقريب للجمع. كتابة “2 دقيقة” خاطئة تمامًا، وتصحيحها ما يجي بإضافة حرف في الأخير، بل بكلمة مختلفة: دقيقتين.

الإعراب يتغير حسب الموقع بعد. بعد حرف الجر يجي المثنى مجرورًا: قبل دقيقتين. وإذا جاء مبتدأ يصير مرفوعًا: تطبيقان. نفس العدد ونفس الاسم، لكن بصيغتين مختلفة، والاستبدال البرمجي الساذج مستحيل يعرف أي صيغة يختار إلا إذا كانت الجملة تعلمه بمكانها.

فوق العشرة يتغير الوضع مرة ثانية. الأعداد من إحدى عشر إلى تسعة وتسعين تاخذ تمييز مفرد منصوب، وتصير “11 تطبيقًا”. العدّاد اللي كنا نعامله كحالة برمجية وحدة طلع يتغير شكله كل ما زاد الرقم: يبدأ بالمثنى تطبيقان، ثم جمع القلة من ثلاثة إلى عشرة (3 تطبيقات، جرب تنطقها وتسمع كيف رنتها)، وبعدها يقلب مفرد 11 تطبيقًا.

عشان كذا بطلنا نركب الجمل من أجزاء متناثرة. صرنا نحفظ كل جملة كقالب كامل داخله متغيرات، لأن ترتيب الكلمات في العربية يختلف، ولأن حرف العطف “و” يلتصق بالكلمة اللي بعده بدون مسافة. دمج النصوص البرمجية ما ينجح مع هذي الحالتين أبدًا.

قبل ما نكتب أي حرف في ملفات الترجمة، جهزنا دليلًا لأسلوب الكتابة المعتمد عندنا، وأغلبه كان قائمة ممنوعات لمحاربة العرنجية( ايه نعم ترا نكرهها مرة )، واللي مايعرف وش هيالعرنجية..هي التراكيب اللي تحشر قواعد الإنجليزية في كلمات عربية. منعنا استخدام “تم” مع المصدر كبديل للمبني للمجهول، ومنعنا “قم بـ”، واستخدام “الخاص بك” في مكان يكتفي بضمير الملكية. ومنعنا “يرجى” في التعليمات اليومية، وتركيب “بشكل” مع الصفة في مكان الحال. واعتمدنا قاعدة وحدة تمشي على كل شيء: نستخدم المصدر للأزرار والعناوين، وفعل الأمر للنصوص المساعدة ورسائل الخطأ. عمرك استخدمت تطبيق مالي عندنا وقالك “عملية التحويل الخاصة بكم قد تمت بنجاح”؟ بدل لايقولك “تمت عملية التحويل بنجاح”..ايييه هذه هي العرنجية اللي نقصدها.

بعض النصوص اللاتينية خليناها مثل ما هي عن قصد. أسماء العلامات التجارية، وأمثلة الأكواد، وأسماء حالات HTTP، واختصارات لوحة المفاتيح، والفرع main في مستودعات git. هذي مو كلمات نسينا نعربها، هي كذا تُكتب وتُقرأ.

الواجهة الجديدة، والمشاكل اللي لقيناها فيها

تحديث الواجهة نزل مع دعم العربية لأن الشغلتين تطلبت منا نفتح كل شاشة في المنصة. أكثر من 7500 مستخدم تواصلوا معنا وشاركونا الأشياء اللي تضبط واللي ما تضبط في لوحة التحكم. ملاحظاتهم كانت متطابقة لدرجة أنها بطلت تكون قائمة طلبات، وصارت جملة وحدة واضحة: ياخي لوحة التحكم متعبة جدا, عدلوها ولا شوفوا لكم حل.

المشكلة الأساسية أن CranL كبرت بسرعة سبقت تصميم القوائم والتنقل. المشروع الواحد يقدر يضم تطبيقات، وقواعد بيانات مُدارة، وتخزين كائنات، ومناطق CDN، وبيئات معزولة، ونطاقات بريد إلكتروني، ومهام مجدولة، ونطاقات مخصصة. كل واحد منهم نزل بشاشاته الخاصة، وتوزيعه المختلف، ومنطقه الخاص في ترتيب الأزرار المهمة. لو فهمت طريقة عمل واحد منها، ما راح يفيدك هالشيء في فهم الثاني. الشغل اليومي هو أكثر شيء تضرر. عشان تنتقل من تطبيق إلى قاعدة البيانات المربوطة فيه، لازم تطلع من الشاشة اللي بيدك وترجع تدور طريقك من البداية. تفاصيل الاتصال ومتغيرات البيئة والـ log كانت مدفونة في أماكن مختلفة حسب المورد اللي فتحته. وإذا سويت deploy للتطبيق، لازم تروح شاشة ثانية عشان تتأكد إن الـdeploy نجح.

هذي الأشياء ليتها مثلا أخطاء برمجية تقدر تفتح لها تذكرة، هذه بالاول والاخير ضريبة او دين يدفعه المستخدم كل ماحب يسوي شيء عندنا في لوحة التحكم. لهالسبب التحديث ما كان تغيير ألوان فقط. بنينا الهيكل المحيط بالمشروع من الصفر، ووحدنا التكوين الداخلي لكل الموارد. صارت النظرة العامة والإعدادات والـ log وتفاصيل الاتصال في نفس المكان دائمًا مهما كان المورد اللي فتحته، وحطينا الأزرار اللي يكثر استخدامها قدام عينك في المكان اللي تتوقعها فيه.

يوم قعدنا نراجع كل صفحة مرتين، مرة عشان اتجاه النص ومرة عشان التصميم، طحنا على مشاكل مالها علاقة لا بهذا ولا بذاك. مشاكل حقيقية في البرودكشن يعاني منها المستخدم كل يوم.

الشعار كان يختفي في اللايت مود. وحالة التطبيق كانت تظهر قديمة في كل الصفحات ما عدا صفحة وحدة، وحتى في الـ API العام اللي يعتمدون عليه العملاء في برمجياتهم، والنتيجة أن أي شخص يبرمج سكربت يربط معنا كان يقرأ بيانات غير دقيقة. زر النشر كان يعلّق ويقول إن الـ deploy شغال مع أنه خلص، ولازم تحدث الصفحة عشان يتعدل. وفوق هذا كله، شاشة تسجيل الدخول اللي يمر عليها كل مستخدم ما كان فيها خصائص autocomplete، ولا تقرأ الأخطاء لبرامج قراءة الشاشة، وغيره الكثير.

هذي ما كانت أخطاء خاصة بالاتجاه من اليمين لليسار. هذي أخطاء موجودة في النسخة الإنجليزية ونصدرها للناس من زمان، وما انتبهنا لها إلا يوم خلّينا تركيزنا على كل الشاشات بدل الشاشة اللي نشتغل عليها وبس.

يوم سرى الليل وحنا ماسرينا

في البداية سوينا أداة تبحث في الكود عن النصوص المحصورة بين علامات تنصيص عشان تتأكد من التغطية، وقالت لنا الأداة إننا خلصنا. طلع كلامها غلط وبشكل يفشّل: أي نص مكتوب مباشرة داخل أكواد الواجهة بدون علامات تنصيص كان مخفي عنها تمامًا. أعدنا كتابة الأداة عشان تقرأ كل ملف باستخدام محلل TypeScript نفسه بدل البحث النصي البسيط. ولقينا 462 نص إنجليزي يظهر للمستخدم في 78 ملف، من ضمنها فقرات كاملة في شاشات التسجيل والفوترة.

خوارزمية bidi سوت فينا مقلب مشابه. الشرطة المائلة بين رقمين مالها اتجاه خاص فيها، فتاخذ اتجاه الفقرة، وتنقلب الأرقام اللي حولها. تخيل مساحة التخزين المكتوبة “2 GB / 10 GB” تنعرض للمستخدم “10 GB / 2 GB”. ما يطلع لك خطأ، ولا ينكتب شي في الـ log. الشاشة سليمة من الناحية التقنية البحتة، وهي تقول للمستخدم عكس الصحيح تمامًا. في نفس الفترة لقينا زر إظهار كلمة المرور جالس فوق كلمة المرور نفسها اللي المفروض يظهرها. هذه لو تفكر فيها..تعتبر اخطاء تعطيك انطباع ان الموقع فايب كودد او مسويه بأي اداة ذكاء اصطناعي رخيصة بس الفكرة اننا بذلنا جهد اساسا ويطلع بهذه النتيجة؟ لهذا السبب لازم تدقق بنفسك على كل صغيرة وكبيرة وبشكل مدقق اكثر من قبل.

حظنا أننا اكتشفنا هذي الكوارث الثلاث وقت التطوير، وعشان كذا نقدر نسولف عنها اليوم بهدوء. ما فيه مستخدم شافها. لكنها أثبتت لنا أهم درس تعلمناه هالسنة: الأخطاء الكبيرة في هذا الشغل ما تطلع لك وتصيح. تمر من الـ build وتنجح في الاختبارات المؤتمتة، وتبدو ممتازة لأي شخص ما يقرأ اللغة.

لو حاب تسوي زينا وش ننصحك ؟

حدد اللغة في السيرفر، واستخدم نظام الأنواع (type system) لإجبار المطورين على إكمال الترجمات؛ لأن هالقرارين تقضي على فئات كاملة من الأخطاء من جذورها. احفظ الجمل كقوالب مو كأجزاء متناثرة. اكتب دليل الأسلوب قبل قواميس الترجمة مو بعدها، عشان ما تتورط في توحيد نبرة النصوص في النهاية. لا تثق في أدوات البحث النصي؛ حلل الكود المصدري نفسه. وخصص وقت حقيقي لشخص يتقن اللغة يبي يقرأ كل شاشة بعينه، وتذكر ان دامك قدرت تقرأ المقالة بالعربي وفهمتها بشكل كامل فمبروك! انت تعرف تتكلم عربي كويس جدا فتقدر تستغل هالشيء وتطور تجربة مستخدم باللغة العربية مستحيل اي اداة برمجية تعطيك اياها.

try cranl

Ship your app in seconds, not weekends.

Flat pricing, MENA-first infra, GitHub deploys, CDN, DDoS, and SSL — all included.