لقد تطرقنا في الجزء اﻷول من الموضوع (بناء تطبيق ويب متعدد اللغات بلغة PHP) الهدف من جعل المشروع متعدد اللغات و و النقاط التي يجب مراعتها عند العمل على مشاريع من هذا النوع, و الطريقة الولى لعمل تطبيق ويب متعدد اللغات بلغة 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 languages |_____ar_SA | |________LC_MESSAGES | |_________ msg.po | |_________ msg.mo |_____en_US |________LC_MESSAGES |_________ msg.po |_________ msg.mo
حيث أن نعمل مجلد رئيسي للغات بأي اسم (هنا اخترنا languages) و نشئ مجلدات داخلية باسم اللغات و بداخلها مجلد باسم (LC_MESSAGES) و بداخله ملفات اللغة, حيث أن اسم يستخدم فيما بعد بأسم المجال (domain)
استخدام GNU Gettext في لغة PHP
إطار عمل getext مدعوم في العديد من اللغات مثل 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);
مثال على الاستخدام
سوف نقوم بتحويل المثال السابق في الطريقة اﻷولى إلى getext:
session_start(); /* you can make config for defualt language in config file or on Database in your project.*/ $defualt_language = "ar"; //check for language in URL parameter or in session if(isSet($_GET['lan'])){ $lang = $_GET['lan']; $_SESSION['lan'] = $lang; }elseif(isSet($_SESSION['lan'])){ $lang = $_SESSION['lan']; }else{ // Get the defualt language $lang = $defualt_language; } if($lang == "en"){ $lang = "en_US"; } else{ $lang = "ar_SA"; } // setting gettetxt setlocale(LC_ALL, $lang.'.UTF-8'); $domain = "sami"; bindtextdomain($domain, './languages'); textdomain($domain);
بعد تهيئة المشروع ﻷستخدام getext و استدعاء ملفات اللغة, سوف نرى اﻻن طريقة استعماله:
< ?php include "gettext.php"; ?> < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> " dir='< ?php printf(_("DIR"));?>'> <h1>< ?php printf(_("WELCOME"));?></h1> <hr /> <a href="<?php echo($_SERVER['PHP_SELF'].'?lan=ar'); ?>">arabic</a> | <a href="<?php echo($_SERVER['PHP_SELF'].'?lan=en'); ?>">English</a> < ?php printf(_("SIMPLE_TEXT"));?> < ?php printf (_("Session: ".$_SESSION['lan'])); ?>
خدمات ترجمة المواقع
تقدم بعض المواقع و الشركات نماذج HTML تضعها في موقعك و ذلك لترجمة موقعك وفقاً للغة المحددة من قبل المستخدم, حيث ان عملية الترجمة تكون على عاتق الشركة المقدمة لخدمة مثل (Google) و (kwintessential). و جودة الترجمة تكون معتمدة على جودة ترجمة مقدم الخدمة. وجهة نظري هي أن لا تستخدم هذه الطريقة اﻵ كحل سريع (و مؤقت) لترجمة مشروعك بأكثر من لغة.
ملاحظة: خدمة ترجم المواقع محجوبة في المملكة العربية السعودية, ولكن يفضل وضعها في تطبيق وذلك من اجل الزوار خارج المملكة الغير الناطقين بلغة العربية.
مثال على استخدام خدمة جوجل :
<select style="height: 18px; font-size: 10px;" name="translate"> <option>Translate This Page</option> <option value="ar">Arabic</option> <option value="zh-CN">Chinese Simplified</option> <option value="zh-TW">Chinese Traditional</option> <option value="nl">Dutch</option> <option value="fr">French</option> <option value="de">German</option> <option value="el">Greek</option> <option value="it">Italian</option> <option value="ja">Japanese</option> <option value="ko">Korean</option> <option value="pt">Portuguese</option> <option value="ru">Russian</option> <option value="es">Spanish</option> </select>
سوف تظهر كالتالي :
ومثال آخر باستخدام website translator gadget المنتجة من قبل جوجل (عند استعماله سيظهر لك شريط ترجمة جوجل في أعلى الصفحة ﻷختيار اللغة):
<script type="text/javascript"><!--mce:0--></script><script src="http://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"><!--mce:1--></script>
سوف تظهر كالتالي :
![]()
مثال على استخدام من (kwintessential) :
<div style="position: relative; width: 220px; height: 72px; background: none repeat scroll 0% 0% #ffffff; border: 1px solid #666666; padding: 0px;"> <div style="font-family: Arial,Helvetica,sans-serif; font-size: 7pt; position: relative; width: 50px; height: 67px; background: none repeat scroll 0% 0% #ededec; border-right: 1px solid #666666; border-width: 1px; vertical-align: middle; padding-top: 5px; float: left;"> <div><a title="Translation" href="http://www.kwintessential.co.uk">Translation</a><img longdesc="http://www.kwintessential.co.uk" src="http://www.kwintessential.co.uk/translation/free/website-translation-tool/flags/cultural-vertical.gif" border="0" alt="Translation" width="50" height="42" align="middle" /></div> </div> <div style="color: #000000; font-family: Arial,Helvetica,sans-serif; font-size: 9pt; position: relative; width: 155px; height: 62px; background: none repeat scroll 0% 0% #ffffff; border: medium none; padding: 5px; float: left;">Translate this page into: <a title="Spanish Translation" href="http://www.kwintessential.co.uk/translation/free/website-translation-tool/website-translate.php?lang=es" target="_blank"><img src="http://www.kwintessential.co.uk/translation/free/website-translation-tool/flags/spanish.gif" border="0" alt="Spanish Translation" hspace="1" vspace="4" width="29" height="19" /></a><a title="French Translation" href="http://www.kwintessential.co.uk/translation/free/website-translation-tool/website-translate.php?lang=fr" target="_blank"><img src="http://www.kwintessential.co.uk/translation/free/website-translation-tool/flags/french.gif" border="0" alt="French Translation" hspace="1" vspace="4" width="28" height="19" /></a><a title="German Translation" href="http://www.kwintessential.co.uk/translation/free/website-translation-tool/website-translate.php?lang=de" target="_blank"><img src="http://www.kwintessential.co.uk/translation/free/website-translation-tool/flags/german.gif" border="0" alt="German translation" hspace="1" vspace="4" width="29" height="18" /></a><a title="Italian Translation" href="http://www.kwintessential.co.uk/translation/free/website-translation-tool/website-translate.php?lang=it" target="_blank"><img src="http://www.kwintessential.co.uk/translation/free/website-translation-tool/flags/italian.gif" border="0" alt="Italian translation" hspace="1" vspace="4" width="29" height="19" /></a><a title="Portuguese Translation" href="http://www.kwintessential.co.uk/translation/free/website-translation-tool/website-translate.php?lang=pt" target="_blank"><img src="http://www.kwintessential.co.uk/translation/free/website-translation-tool/flags/portuguese.gif" border="0" alt="Portuguese translation" hspace="1" vspace="4" width="29" height="19" /></a><a title="Arabic Translation" href="http://www.kwintessential.co.uk/translation/free/website-translation-tool/website-translate.php?lang=ar" target="_blank"><img src="http://www.kwintessential.co.uk/translation/free/website-translation-tool/flags/arabic.gif" border="0" alt="Arabic translation" hspace="1" vspace="2" width="28" height="19" /></a><a title="Japanese Translation" href="http://www.kwintessential.co.uk/translation/free/website-translation-tool/website-translate.php?lang=ja" target="_blank"><img src="http://www.kwintessential.co.uk/translation/free/website-translation-tool/flags/japanese.gif" border="0" alt="Japanese translation" hspace="1" vspace="2" width="29" height="19" /></a><a title="Korean Translation" href="http://www.kwintessential.co.uk/translation/free/website-translation-tool/website-translate.php?lang=ko" target="_blank"><img src="http://www.kwintessential.co.uk/translation/free/website-translation-tool/flags/korean.gif" border="0" alt="Korean translation" hspace="1" vspace="2" width="29" height="19" /></a><a title="Chinese Translation" href="http://www.kwintessential.co.uk/translation/free/website-translation-tool/website-translate.php?lang=zh-CN" target="_blank"><img src="http://www.kwintessential.co.uk/translation/free/website-translation-tool/flags/chinese.gif" border="0" alt="Chinese translation" hspace="1" vspace="2" width="28" height="19" /></a><a title="Russian Translation" href="http://www.kwintessential.co.uk/translation/free/website-translation-tool/website-translate.php?lang=ru" target="_blank"><img src="http://www.kwintessential.co.uk/translation/free/website-translation-tool/flags/russian.gif" border="0" alt="Russian translation" hspace="1" vspace="2" width="29" height="19" /></a></div> </div>
سوف تظهر كالتالي :
لقد تعلمنا اﻵن ثلاث طرق لدعم تطبيقات الويب بأن تكون متعددة اللغات. قم بتجربة الطرق و اختر ما يناسب مشروعك. و يرجى طرح أي أسئلة أو استسفارات أو المشاكل التي تعيقكم على استخدام احد الطرق و انا في الخدمة
.
المصادر
تدوينات مشابهة:







جميل جداً, حقيقة استفدت من هذه الجزئية
مدونة رائعه وتحتوى على العديد من الفوائد .
اتمنى لك التوفيق
@Ghost Hacker
حياك الله أخي الكريم, الله يعطيك العافية على كلماتك الطيبة
وشكرا على مرورك
بس اذا ممكن ولا عليك امر تعيد رفع المثال لإنه لا يعمل
تقريبًا يوم كامل وانا ادور من موقع لموقع واجرب اكواد وما نفعت معي .
بس لقيت كلاس يعمل المطلوب
http://pboos.ch/wordpress/2010/07/php-localization-gettext-stylish/
بس حابب اعرف الطريقة المباشرة، لإنه الكلاس يقرأ ملف ال mo “يدويًا” ويعمله serialize
انا بشتغل على الويندوز وجربت putenv لتحديد اللغة وما زبطت كمان
أهلا و سهلا بك أخي أحمد
اسف على الخطأ في الوصلة و لقد تم التعديل
.
وشكرا على مرورك