السلام عليكم و رحمة الله و بركاته
كل عام و انتم بخير :)
سوف نتحدث في هذا الموضوع بتعريف ﻹطار عمل (GNU Gettext) و كيفية استخدامه في لغة (PHP) و ذلك لدعم تعدد اللغات في تطبيقات الويب.
ماهو GNU Gettext؟
هو عبارة عن إطار عمل يساعد المبرمجين و المترجمين و المستخدمين من دعم التطبيقات بعدة لغات بطريقة قياسية و ذلك مما يساعد انتشار استخدام التطبيق, و تم استخدام هذا اﻹطار في الكثير من برامج مفتوحة المصدر مثل (WordPress). و طريقة عمله أن يجهز المبرمج التطبيق لدعم الملفات الخاصة بقواميس اللغة في اﻹطار و من ثم يقوم المترجم بتعامل مع ملفات قواميس اللغة دون الاحتكاك في برمجة التطبيق. و ملفات قواميس اللغة في إطار عمل gettext هي:
- ملف .pot اختصاراً (Portable Object Template) : يحتوي على كافة النصوص التي مراد ترجمتها من الكود في التطبيق و ذلك لتجهيز الملف التالي.
- ملف .po اختصاراً (Portable Object) : ملف نصي يحتوي على نص اللغة اﻷصلية في المشروع مع تجهيزه لترجمة للغة المضافة للتطبيق. يتم إنشاءه بعد الملف السابق, و يمكن من خلاله ترجمة التطبيق بواسطة تحريره.
- ملف .mo اختصاراً (Machine Object) : هو ملف ثنائي منتج بعد عملية ترجمة (compiled) ملف po, و هو الملف المستخدم في التطبيق لعرض النصوص بلغة المحددة.
و لعمل ملفات قواميس الترجمة لمشروعك أو ترجمة مشروع موجود, يتم استخدام أحد أدوات رسومية لهذا ىالغرض مثل poedit و gted. و طريقة استخدام برنامج poedit تجدها في (مدونة مبدع).
عند طباعة النصوص في المشروع نجعل النص وسيط لدالة (gettext) و التي بدورها تكون وسيطاً لدالة (printf) كالتالي:
printf(gettext("Welcome World"));حيث يكون النص هنا النص للغة الافتراضية (العربية أو الانجليزية) وسوف يتم طباعته كما هو في حالة عدم اختيار لغة آخرى, و عند اختيار لغة آخرى فسوف يتم استبدال النص الموجود في دالة (gettext) بنص المرادف لجملة في ملف .mo. و يمكن استبدال كلمة (gettext) بأي رمز مثل (_) أو (e_) و ذلك اختصاراً لكتابة اسم الدالة, و يجب تحديد هذا الاختبار عند إنشاء ملفات اللغة بأحد أدوات مثل poedit.
printf(_("Welcome World"));تجهيز المشروع لدعم تعدد اللغات
عند الانتهاء من طباعة كافة النصوص, نقوم بفتح أحد الأدوات الخاصة بترجمة و بأتباع خطوات الأداءة سوف يتم سحب كافة النصوص و تجيزها لترجمتها بصيغة ملفات ,po.
مسار وضع ملفات اللغات ﻷستخدامها في المشروع يكون كالتالي:
languages |_____ar_SA | |________LC_MESSAGES | |_________ msg.po | |_________ msg.mo |_____en_US |________LC_MESSAGES |_________ msg.po |_________ msg.mo
حيث أن نعمل مجلد رئيسي للغات بأي اسم (هنا اخترنا languages) و نشئ مجلدات داخلية باسم اللغات و بداخلها مجلد باسم (LC_MESSAGES) و بداخله ملفات اللغة, حيث أن اسم يستخدم فيما بعد بأسم المجال (domain)
استخدام GNU Gettext في لغة PHP
إطار عمل gettext مدعوم في العديد من اللغات مثل C, Java, Python و أيضاً PHP . و ﻷستخدامه نحتاج لكل من الدوال التالية:
1- دالة (setlocale):
وظيفة هذه الدالة هي تمكننا من تحديد معلومات المحلية (local information) مثل اللغة و الوقت لمنطقة الجفرافية المحددة و التي ىيتم تحديدها بتحديد اسم اللغة مثل (ar-SA) تمثل اللغة العربية – المملكة العربية السعودية و (en-US) اللغة الانجليزية – الولايات المتحدة اﻷمريكية.
setlocale(constant,location)
حيث أن :
- الوسيط (constant): يمثل ما هي المعلومات المراد تحدبدها من المعلومات المحلية (local information), ويتم وضع الثابت (LC_ALL) و لذلك يعني كافة المعلومات.
- الوسيط (location): يثمل الموقع الجفرافي (أو بمعنى هنا تحديد اللغة المستخدمة), مثل (ar-SA), ولدعم uincode نضع القيمة هكذا : ("ar-SA.utf8″).
setlocale(LC_ALL,"ar-SA.UTF-8");
2- دالة (bindtextdomain):
وظيفة هذه الدالة نحدد مسار ملفات اللغة و اسم المجال (أي اسم نحدده, ويجب أن يكون نفس اسم ملفات اللغة).
$domain = 'mydomain'; bindtextdomain($domain, '/usr/share/mydomain/locale');
3- دالة (textdomain):
وظيفة هذه الدالة ان نحدد المجال الافتراضي ( default domain ) المستخدم في المشروع.
textdomain($domain);
مثال على الاستخدام
// setting gettetxt setlocale(LC_ALL, $lang.'.UTF-8'); $domain = "sami"; bindtextdomain($domain, './languages'); textdomain($domain);
بعد تهيئة المشروع ﻷستخدام getext و استدعاء ملفات اللغة, سوف نرى اﻻن طريقة استعماله:
<?php printf(gettext("BLOG"));?> <?php printf(_("WELCOME"));?>و اتمنى لكم التوفيق
