نظام gettext: الدليل الشامل للتدويل والتعريب

gettextتدويل البرمجياتتعريب البرامجGNU gettextترجمة البرمجياتi18nl10nملفات POملفات MO

نظام gettext للتدويل والتعريب

في عالم الحوسبة، يُعد gettext نظاماً أساسياً للتدويل (Internationalization - i18n) والتوطين أو التعريب (Localization - l10n)، ويُستخدم بشكل شائع لكتابة برامج متعددة اللغات على أنظمة التشغيل الشبيهة بـ Unix. تكمن الميزة الرئيسية لنظام gettext في قدرته على فصل عملية البرمجة عن عملية الترجمة، مما يسمح للمطورين والمترجمين بالعمل بشكل مستقل.

تاريخ نظام gettext

في البداية، لم يوفر معيار POSIX أي وسيلة لتعريب الرسائل. وفي أواخر الثمانينيات، ظهر مقترحان: gettext من Uniforum عام 1988 وcatgets من X/Open عام 1989. قامت شركة Sun Microsystems بتنفيذ الإصدار الأول من gettext في عام 1993.

اتخذ مشروع GNU قراراً بأن نهج "الرسالة كمفتاح" (message-as-key) الذي يتبعه gettext أبسط وأكثر مرونة، حيث أن الأنظمة الأخرى كانت تتطلب من المطور ابتكار أسماء "مفاتيح" لكل سلسلة نصية. وفي عام 1995، أطلق مشروع GNU نسخة GNU gettext، وهي تنفيذ برمجي حر لهذا النظام. ومنذ ذلك الحين، تم نقل gettext إلى العديد من لغات البرمجة، وأصبح يُستخدم حتى في سياقات غير برمجية لترجمة المستندات النصية.

كيفية عمل نظام gettext

البرمجة

الواجهة الأساسية لنظام gettext هي الدالة gettext(const char)، والتي تستقبل سلسلة نصية يراها المستخدم باللغة الأصلية (عادةً الإنجليزية). ولتوفير الوقت وتقليل ازدحام الكود، يتم اختصار هذه الدالة غالباً إلى الرمز _.

تستخدم الدالة السلاسل النصية المقدمة كمفاتيح للبحث عن الترجمات، وتعيد السلسلة الأصلية في حال عدم توفر ترجمة. للتعامل مع الحالات التي يكون فيها للنص نفسه معانٍ مختلفة، يوفر النظام دوالاً مثل cgettext() التي تقبل سلسلة "سياق" إضافية.

يتم تشغيل أداة xgettext على الملفات المصدرية لإنتاج ملف .pot (Portable Object Template)، وهو قالب يحتوي على قائمة بجميع النصوص القابلة للترجمة المستخرجة من الكود.

الترجمة

يقوم المترجم باشتقاق ملف .po (Portable Object) من القالب باستخدام برنامج msginit، ثم يبدأ في ملء الترجمات. يمكن تحرير هذه الملفات يدوياً أو باستخدام أدوات متخصصة مثل Poedit أو محرر Emacs.

بعد الانتهاء، يتم تجميع ملفات .po باستخدام أداة msgfmt لتحويلها إلى ملفات ثنائية بتنسيق .mo (Machine Object)، وهي الملفات التي يتم توزيعها مع الحزمة البرمجية ليتمكن البرنامج من قراءتها بسرعة.

التشغيل

في أنظمة Unix، يقوم المستخدم بتحديد متغير البيئة LC_MESSAGES، وبناءً عليه يقوم البرنامج بعرض النصوص باللغة المختارة إذا كان ملف .mo المقابل متوفراً. وفي توزيعات GNU، يمكن استخدام متغير البيئة LANGUAGE الذي يدعم لغات متعددة كبدائل في حال عدم توفر اللغة الأولى.

التعامل مع صيغ الجمع

توفر الواجهة ngettext() إمكانية التعامل مع عدد الأسماء في السلسلة النصية، وهو أمر حيوي لأن قواعد الجمع تختلف من لغة إلى أخرى. يتم تخزين معلومات صيغة الجمع في ترويسة ملف PO، وعادة ما يتم تحديدها باستخدام عامل تشغيل ثلاثي بأسلوب لغة C. على سبيل المثال، في اللغة السلوفينية، توجد أربع صيغ مختلفة للجمع، ويقوم نظام gettext بمعالجة هذه التعقيدات لضمان دقة الترجمة لغوياً.

أسئلة شائعة

ما هو الفرق بين ملفات PO و MO؟

ملفات PO هي ملفات نصية قابلة للقراءة والتحرير من قبل المترجمين، بينما ملفات MO هي نسخ ثنائية مجمعة من ملفات PO يتم استخدامها من قبل البرنامج أثناء التشغيل لسرعة الوصول إلى النصوص.

ما هي وظيفة أداة xgettext؟

تقوم أداة xgettext بمسح الكود المصدري للبرنامج واستخراج جميع النصوص المحاطة بدالة gettext() لإنشاء ملف قالب (.pot) يحتوي على جميع النصوص التي تحتاج إلى ترجمة.

كيف يتعامل gettext مع صيغ الجمع المختلفة في اللغات؟

يستخدم gettext دالة ngettext() التي تسمح للمترجم بتحديد عدة صيغ للجمع بناءً على العدد، مما يضمن توافق النصوص مع القواعد النحوية لكل لغة.