جدول المحتويات
تحسين دعم العربية في طرفية لينكس
هناك عددٌ من المشاكل الموجودة حاليًا في الطرفية (Terminal) على سطح مكتب لينكس. منها أبرز مشكلتين هما:
- الحروف تظهر متداخلة بحيث لا يمكن قراءة النص العربي بشكل جيد.
- اتجاه النص يكون من اليسار إلى اليمين (LTR) وليس من اليمين إلى اليسار (RTL)، وهو ما يخرّب عرض النص العربي.
يمكنك رؤية هذه المشاكل في الصورة التالية مثلًا:
لحسن الحظّ يمكنك حل كلتا المشكلتين، ونعمل نحن في فريق تقويم على جعل هذه الحلول دائمة وافتراضية على توزيعات لينكس ولكننا لم نصل إلى هناك بعد. وسنشرح في هذه الصفحة كيف يمكنك حلها من طرفك مؤقتًا إلى أن يكتمل الإصلاح الرسمي.
تغيير الخط الافتراضي للطرفيّة
من إعدادات طرفية جنوم، اختر استعمال خط مُخصص من نافذة الإعدادات كما بالصورة (اضغط على المربع الفارغ لتظهر علامة صحّ):
بعدها ابحث عن خط اسمه Monospace من القائمة، واختر الحجم 11 كما في الصورة واضغط “اختر”:
إذا جرّبت الكتابة الآن في الطرفية فستجد أن المشكلة الأولى قد حلّت بشكل كبير؛ حيث لم تعد الأحرف متداخلة ببعضها البعض وصار بإمكانك قراءة الكلمات والجمل العربية بأريحية. بالطبع هناك بعض المشاكل في الخطّ مثل مشكلة حرف لا (حيث يظهر مثل U) وسنعمل على حلّها من طرفنا لكن الوضع جيد للعيش معه حاليًا.
تفعيل التقاط الاتجاه التلقائي (Auto-detection) للنص في الطرفية
المشكلة الثانية التي تعاني منها الطرفية هي مشكلة الاتجاه. يجب أن تُعرض النصوص العربية من اليمين إلى اليسار (RTL) وليس من اليسار إلى اليمين (LTR)، ولكن هذا لا يحصل افتراضيًا في الطرفية مما يؤدي إلى المشكلة التي رأيتها في الصورة الأولى في هذه الصفحة.
في البداية عليك أن تفهم أن الكثير من برامج الطرفية (Terminal) مثل GNOME Terminal وXfce4-Terminal وغيرها تستعمل مكتبة برمجية اسمها VTE هي المسؤولة عن عرض الطرفية. أي أن هذه البرامج في الواقع هي مجرد نوافذ وقوائم، بينما محتوى الطرفية الحقيقي (الشاشة السوداء التي تكتب فيها الأوامر) هي قادمة من مكتبة VTE. وبالتالي المسؤول عن عرض النصوص داخل الطرفية هو هذه المكتبة وليس برامج الطرفية.
وبالتالي أيضًا فإن إصلاح مشاكل اللغة العربية داخل الطرفية يكون في هذه المكتبة ولا يكون من التطبيق نفسه.
لحسن الحظ وبعد بحثٍ وتنقيب اكتشفنا أن مكتبة VTE تدعم اتجاه RTL منذ 2019م، لكنه غير مفعّل افتراضيًا بسبب عدم وجود الاختبارات الكافية لجودة هذا الدعم بالإضافة لبعض المشاكل الصغيرة، ونعمل على حلها في فريق تقويم لجعل هذا الخيار افتراضيًا لمستخدمي لينكس العرب ولكن الأمر لم يكتمل بعد. ومع ذلك فيمكنك أنت أن تفعّل هذا الخيار على نظامك بحيث تعرض لك النصوص باتجاه RTL.
الالتقاط التلقائي لاتجاه النص (Text direction auto-detection) هي ميزة تسمح بعرض النصوص في الطرفية إما باتجاه RTL أو LTR على حسب النص نفسه؛ إذا كان النص مكتوبًا بالإنجليزية أو أي لغة أخرى تُكتب من اليسار إلى اليمين فسيُعرض كـLTR، وإذا كان النص مكتوبًا بالعربية وبقية اللغات التي تُكتب من اليمين فسيُعرض النص كـRTL. تستعمل هذه الميزة أول حرف من كل سطر من النص لتحديد اللغة وبالتالي تحديد الاتجاه الواجب استخدامه.
اكتب الأمر التالي في الطرفية لتفعيل الميّزة:
printf "\e[?2501h"
وستلاحظ أن الطرفية صارت تدعم عرض النصوص العربية من اليمين إلى اليسار الآن:
يمكنك إضافة الأمر المذكور إلى نهاية ملف .bashrc (ملف مخفي في مجلد المنزل الخاص بك، يُنفّذ عند كل مرة تُفتح الطرفية فيها تلقائيًا)، مما يؤدي إلى تطبيق هذا الأمر تلقائيًا في كل طرفية تفتحها دون الحاجة لتكتب الأمر أنت بنفسك كل مرّة. فقط من سطر الأوامر حرر الملف:
nano ~/.bashrc
وانزل إلى نهاية الملف واكتب الأمر السابق، ثم اخرج عبر الضغط على Ctrl + X، أو إن شئت فيمكنك تحرير الملف بأي طريقة تريدها.
فرض اتجاه RTL في طرفية لينكس
هناك ميزة أخرى في طرفية VTE أكثر تطرفًا وهي إجبار جميع النصوص - بغض النظر عن كونها أجنبية أو عربية - على أن تكون من اليمين إلى اليسار. هذا الخيار ليس جيدًا ليكون هو الخيار الافتراضي لطرفية لينكس لأن معظم الأوامر والنصوص المعروضة في الطرفية تكون باللغات الأجنبية، وبالتالي لن تُعرض بشكل جيد إن أُجبرت على أن تكون باتجاه RTL، لكنه قد يكون خيارًا جيدًا إن كنت تريد تطوير تطبيقات سطر أوامر عربية 100%. حينها يمكنك أنت التحكّم بجميع النصوص ولا يهمّك المستخدمون الأجانب فالبرنامج عربي وموجّه للعرب، وبالتالي يمكنك إجبار عرض النصوص كـRTL في تطبيقك.
لفعل ذلك، أضف السطر التالي إلى نهاية ملف .bashrc الخاص بك:
printf "\e[2 k"
وافتح الطرفية من جديد، وستجد بعدها أن جميع النصوص صارت مجبورة على العرض كـRTL، مما قد يظهر لك بعض العلل المُضحكة في الطرفية:
تابع المثال التالي لرؤية كيفية تطوير تطبيق سطر أوامر عربي 100% باتجاه RTL.
مثال برمجي على تطبيق طرفية عربي على لينكس
إذا كان لديك تطبيق سطر أوامر مكتوب ببايثون (أو أي لغة أخرى) فأنت بحاجة إلى تفعيل هذه الميزات على طرفيّة المستخدم قبل أن تشغّل برنامجك. لكن بالطبع لا تريد أن تنشر هذه التعليمات لكل مستخدم وتطلب منه أن يفعل كذا وكذا لتفعيل هذه الميزات، بل تريد أن تكون افتراضية في برنامجك لأريحيّة المستخدم وسهولة الاستخدام.
الحل لفعل ذلك هو أن تكتب ملف سكربت (Shell Script)، يفعّل هذه الميزة في طرفية خارجية ثم بنفس الوقت يقوم بتشغيل برنامجك في تلك الطرفية التي تفرض اتجاه RTL.
سترى هنا مثالًا لبرنامج سطر أوامر مكتوب بمكتبة curses لبايثون. يقوم هذا البرنامج بتشكيل أي جملة عربية تدخلها عبر مكتبة مِشكَال من تطوير د. طه زروقي.
اعمل ملفًا جديدًا اسمه run.sh وضع هذه المحتويات داخله:
- run.sh
terms=(x-terminal-emulator gnome-terminal konsole xfce4-terminal xterm uxterm) for t in ${terms[*]} do if [ $(command -v $t) ] then detected_term=$t break fi done $detected_term -e "printf '\e[2 k' && python3 main.py"
واعمل ملفًا جديدًا اسمه main.py وضع هذه المحتويات داخله:
- main.py
#!/usr/bin/python3 import curses, time import mishkal.tashkeel # Curses interface. stdscr = curses.initscr() # Tashkeel library. vocalizer = mishkal.tashkeel.TashkeelClass() stdscr.clear() curses.cbreak() curses.echo() stdscr.keypad(True) stdscr.addstr("السلام عليكم، أهلًا بك إلى هذا البرنامج لتشكيل النصوص.") stdscr.addstr("\n\n\n") stdscr.addstr("من تأليف فريق تقويم واعتمادًا على مكتبات خارجية. \n") stdscr.addstr("جميع الحقوق غير محفوظة، 2023م، ولا يوجد حقوق أصلًا :)\n") stdscr.addstr("---------------------------------------\n") stdscr.addstr("أخبرنا، ما هو النص الذي تريد تشكيله؟ اكتبه بالأسفل:\n \n") input_string = stdscr.getstr() stdscr.addstr("\n") stdscr.addstr("النتيجة:\n") stdscr.refresh() x = input_string.decode("utf-8") output_string = vocalizer.tashkeel(x)[1:] stdscr.addstr(output_string) stdscr.addstr("\n\n") stdscr.addstr("سيُغلق البرنامج تلقائيًا بعد خمس ثوان!") stdscr.refresh() time.sleep(5) curses.endwin()
ثبّت هذه المكتبات التي نحتاجها ببايثون عبر الأمر pip أو pip3:
git clone https://github.com/linuxscout/mishkal.git pip3 install -r miskal/requirements.txt
لدينا كل ما نحتاجه الآن.
الفكرة هي أن المستخدم لن يشغّل البرنامج مباشرةً عبر أمر مثل python3 main.py، بل سيشغّل الشل سكربت وسيقوم هذا الشل سكربت بدوره بالتعرّف على برامج الطرفية المثبّتة على النظام، ثم يختار واحدًا منها، ثم يفتحه ويطبّق الأمر المطلوب لتفعيل ميزة فرض اتجاه RTL فيها، ثم يقوم بتشغيل ملف البايثون داخل تلك الطرفية التي صارت تدعم اتجاه RTL.
ميزة هذه الطريقة هي أنك لا تتدخل بإعدادات المستخدم؛ ستبقى طرفية المستخدم على إعداداتها الأساسية حسبما يحدد المستخدم في ملف .bashrc الخاص به (أو على الإعدادات الافتراضية التي هي LTR)، وفي نفس الوقت تضمن أن تطبيقك سيُعرض للمستخدم باتجاه RTL بالكامل، مما يوفر تجربة استخدام جميلة جدًا للغة العربية في الطرفية.
فقط اكتب الأمر التالي لتشغيل السكربت:
bash run.sh
وستجد أن البرنامج يطلب منك إدخال الجملة باللغة العربية ويشكّلها لك فورًا، ثم ستُغلق النافذة تلقائيًا بعد 5 ثوانٍ:
بالطبع يمكنك تغيير البرنامج وتخصيصه حسب حاجتك، ولكن هذا مجرّد مثال ليريك طريقة عمل البرامج العربية من سطر أوامر لينكس.
قد تكون هناك مشاكل بسيطة أثناء محاولة كتابة جملة طويلة في برنامج المثال الذي وفّرناه. لذلك لا تحاول مسح حرف بعد أن تكتبه (عبر زرّ Return مثلًا أو Delete) بل حاول أن تكتب جملة بسيطة فقط واضغط Enter للمتابعة.
يمكنك الآن تطوير تطبيقات سطر أوامر عربية بمكتبة curses أو أي مكتبة برمجية أخرى تريدها، فكل ما تحتاجه أن تكون الطرفية تدعم اتجاه RTL كما شرحنا.