مدونة سامي المحمدي

تقنية حاسوبية تدريبية

  • RSS
  • Delicious
  • Digg
  • Facebook
  • Twitter
  • Linkedin
  • Youtube

لقد تطرقنا في الجزء اﻷول من الموضوع (بناء تطبيق ويب متعدد اللغات بلغة 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>&lt; ?php printf(_("WELCOME"));?&gt;</h1>
 
<hr />
 
<a href="&lt;?php echo($_SERVER['PHP_SELF'].'?lan=ar'); ?&gt;">arabic</a> | <a href="&lt;?php echo($_SERVER['PHP_SELF'].'?lan=en'); ?&gt;">English</a>
 
	    &lt; ?php printf(_("SIMPLE_TEXT"));?&gt;
 
&lt; ?php printf (_("Session: ".$_SESSION['lan'])); ?&gt;

 

لتحميل المثال: phplang2.zip

 

 

خدمات ترجمة المواقع

تقدم بعض المواقع و الشركات نماذج 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>

سوف تظهر كالتالي :

 

Translate this page into:
Spanish TranslationFrench TranslationGerman translationItalian translationPortuguese translationArabic translationJapanese translationKorean translationChinese translationRussian translation

 

 

 

لقد تعلمنا اﻵن ثلاث طرق لدعم تطبيقات الويب بأن تكون متعددة اللغات. قم بتجربة الطرق و اختر ما يناسب مشروعك. و يرجى طرح أي أسئلة أو استسفارات أو المشاكل التي تعيقكم على استخدام احد الطرق و انا في الخدمة :) .

 

 

المصادر

تدوينات مشابهة:

  1. بناء تطبيق ويب متعدد اللغات بلغة PHP – الجزء اﻷول

عدد التعليقات 4 حتى الان.

  1. Ghost Hacker قال:

    جميل جداً, حقيقة استفدت من هذه الجزئية
    مدونة رائعه وتحتوى على العديد من الفوائد .
    اتمنى لك التوفيق

  2. @Ghost Hacker
    حياك الله أخي الكريم, الله يعطيك العافية على كلماتك الطيبة

    وشكرا على مرورك

  3. احمد قال:

    بس اذا ممكن ولا عليك امر تعيد رفع المثال لإنه لا يعمل

    تقريبًا يوم كامل وانا ادور من موقع لموقع واجرب اكواد وما نفعت معي .

    بس لقيت كلاس يعمل المطلوب
    http://pboos.ch/wordpress/2010/07/php-localization-gettext-stylish/

    بس حابب اعرف الطريقة المباشرة، لإنه الكلاس يقرأ ملف ال mo “يدويًا” ويعمله serialize

    انا بشتغل على الويندوز وجربت putenv لتحديد اللغة وما زبطت كمان

  4. أهلا و سهلا بك أخي أحمد

    اسف على الخطأ في الوصلة و لقد تم التعديل :) .

    وشكرا على مرورك


:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!:
Get Adobe Flash playerPlugin by wpburn.com wordpress themes