الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف تبرمج موقع متعدد اللغات في بي اش بي

بدأه joo في 1 أغسطس 2008 · 6 رد · 2,517 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

لقد قمت من فترة ببرمجة موقع يشمل 3 لغات , ونجحت تجربتي تماما في هذا السياق بشكل شبه مثالي من حيث التقنية والأسلوب الذي استخدمته , فرغبت بوضع تجربتي في منتداكم ليستفيد منها الآخرون .

كما نعلم , فإن برمجة موقع بثلاث لغات يتفرع منها شقان :

1: البرمجة بالأسلوب المتخلف – إن جاز التعبير – وذلك يعني بأن أبرمج الصفحات المتعلقة بكل لغة بشكل مستقل , يعني أصبح الموقع هنا يكافئ ثلاث مواقع .

2: الطريقة الصحيحة , وتكمن في استخدام بعض التقنيات التي عبرها ابرمج صفحة واحدة تعمل على اللغات الثلاث , اي كل 3 صفحات يتم اختصارها لصفحة واحدة تؤدي الغرض المطلوب منها في كل لغة من اللغات , مع العرض السليم للمعطيات فيها بما يوافق اللغة التي تم اختبارها .

3: الاستفادة من الدعم الذي تقدمة لغة بي اش بي للمواقع ذات اللغات المتعددة

الطريقة رقم 1 , تتمتع بكل المساؤى التي يمكن ان تتخيلها , مستهلكة للوقت , تستنزف الكثير من الجهد , بالإضافة إلى ان عملية التعديل تصبح مضنية للغاية , لأنك في هذه الحالة ستكون مضطرا ان تعدل الملفات الموافقة للغات الثلاث , وعسى الا تغفل شيئا , كما أن عملية توسعة الموقع ليشمل لغة رابعه سيصبح مكافئا لبرمجة موقع جديد , والتعديل سيصبح كارثيا , وسينتهي بك الوضع إلى الجنون , أو إلى الهرب من الشركة التي تعمل بها 

أم الطريقة رقم 2 , فهي بسيطة وسهلة جداً ولا تتطلب سوى بعض التفكير المنطقي "صفتك كمبرمج " , كما أن التعديل فيها بغاية السهولة والبساطة , وإضافة لغة رابعة أو لغة عاشرة , لا تتطلب أكثر من إضافة ملف متعلق بتلك اللغة بالإضافة إلى بعض التعديلات التي لا غنى عنها .

أما الطريقة الثالثة , فهي رائعة , لكن الخوف يكمن في عدم دعم المخدم الذي تتواجد عليه ملفاتك لتلك التوابع التي تقدمها بي اش بي , وبالتالي , ستكون هنا الطامة الكبرى  إذ أن تعبك وجهدك البرمجي كله لن يعمل عندما تحاول رفع الموقع على المخدم , وبعد شهر من العمل ستجد نفسك في الشارع , بدل المكتب الذي كان يستضيفك, " لا اتوقع من المدير أن يقبل منك أي عذر تقدمه"

بعد المقدمة السابقة سأشرع بشرح الطريقة الثانية :

ملاحظة : مع هذا الايميل هنالك ملف مرفق يحوي على مثال يطبق الموقع الحاوي على 3 لغات , وبإمكانك الاطلاع عليه وتنفيذه بكل بساطة , لتعلم بعد ذلك كم تبسط هذه التقنية الكثير من الجهد , وتجعل برمجة المواقع متعددة اللغات متعة رائعة بالإضافة إلى كونها فن .

- طبعا سيتم الشرح بالاعتماد على الملفات والمثال المرفق في الملف المرفق –

في البداية يوجد لديك ملف يدعى

index.php

وهو يحوي 3 كلمات تمثل 3 روابط كل رابط مرتبط بلغة معنية

رابط لصفحات الموقع بالانكليزية , ورابط للعربية , ورابط للألمانية , وبحسب اللغة التي ستختارها , سيتم توجيهك لصفحة اللغة التي تريد , حيث ستجد المعطيات المعروضة كلها موافقة للغة التي اخترتها , فعليا , في كل من الحالات الثلاث سيتم توجيهك لنفس الصفحة , ولكن الذي سيختلف المعاملات التي يتم تمريرها مع url حيث بحسب قيمة المعامل سيتم تحميل المعطيات المطلوبة والصحيحة والموافقة للخيار الذي اخترته .

بعد المقدمة السابقة لنوضح مالذي نحتاجه من ملفات :

الخطوة الأولى :

يوجد مجلد يدعى static_str

وهو يحوي عدد من الملفات يوافق عدد اللغات المطلوب منك دعمها في موقعك , وفي حالتنا يحوي ثلاث ملفات , ملف لدعم اللغة العربية وملف لدعم اللغة الانكليزية , وملف لدعم اللغة الالمانية.

بنية هذه الملفات ببساطة هي عبارة عن تعريف لثوابت ,

مثلا في الصفحة الهدف نرغب بتعريف عبارة صباح الخير , لذلك نعرف ثابت يدعى

define('GOOD_MORNING','صباح الخير');

وذلك في كل من الملفات الثلاث المتعلقة بكل لغة من اللغات

ar_const.php en_const.php de_const.php

ونضع بدل صباح الخير الموضوعة في الملف الخاص بالترجمة العربية , الترجمة الموافقة للغة المرتبطة بذلك الملف, وهكذا دواليك , أي نقوم بجرد كل العبارات التي نريدها ان تظهر على صفحات موقعنا وتتغير بحسب اللغة المختارة ونعرفها على شكل ثوابت في الملفات الثلاث .

الخطوة الثانية :

نعلم بأنه بالنسبة العربية فإن العرض يتم من اليمين لليسار , أما بالنسبة للغة الانكليزية أو الألمانية فالعرض يتم من اليسار لليمين , وقد نرغب أثناء الاظهار بإعطاء تنسيقات محددة للغة العربية , وتنسيقات أخرى للنصوص المعروضة في اللغات الأخرى , لذلك هنا نجد أنفسنا بحاجة إلى تعريف ملفات تنسيق css

وفي المثال الذي طرحته ركزت على ناحية واحدة – بهدف التبسيط قدر الإمكان وتوصيل الفكرة الرئيسية بأقل قدر ممكن من الرماز – ألا وهي تنسيق العرض ( من اليمين أم من اليسا ر) لذلك في ملف التنسيق الذي يدعى directions.css والموجود في المجلد css سنجد الرماز التالي :

.en_Dir
{
direction:ltr;
}
.ar_Dir
{
direction:rtl;
}

أي تنسيق متعلق بحالة الاظهار باللغة العربية , وآخر متعلق بالاظهار باللغات الاجنبية الاخرى .

الخطوة الثالثة :

نجد الملف الذي يدعى constants.php والموجود ضمن المجلد classes , ويحوي ببساطة بعض الثوابت التي سنستخدمها لتحديد اللغة التي تم اختيارها أثناء الانتقال للصفحة المطلوبة بلغة محددة (سيتوضح معنى هذا الجزء من الشرح في المقاطع القريبة القادمة )

الخطوة الرابعة :

والان سننتقل لشرح محتوى الصفحة الرئيسية في الموقع وهي صفحة index.php وهي التي يتم على اساسها اختيار اللغة وتظهر للمستخدم كما يلي :

English

Arabic

Deutsch

وتمثل كل كلمة من الكلمات الثلاث نظريا رابطا للصفحة المرتبطة باللغة الموافقة التي تم اختيارها , اما اذا القينا نظرة إلى الرماز الداخلي فسنجد ما يلي :

 <p><a href="common/welcom.php?language=<?php echo ENGLISH ?>">English</a></p>
<p><a href="common/welcom.php?language=<?php echo ARABIC ?>">Arabic</a></p>
<p><a href="common/welcom.php?language=<?php echo DEUTSCH ?>">Deutsch</a></p>

من الرماز السابق نلاحظ بأن التوجيه يتم دوما لنفس الصفحة , ولكن الذي يختلف هو المعامل الممرر مع تلك الصفحة

language=<?php echo ENGLISH ?>

حيث نلاحظ هنا استفادنتا من الثوابت التي عرفناها سابقا, ولكن الذي يثير فضولنا هنا ...ماالذي يحدث فعليا في الصفحة التي يتم التوجيه إليها كل مرة ولكن مع معاملات مختلفة ؟

الذي يحدث هو التالي:

إذا اطلعنا على الرماز الموجود في تلك الصفحة سنجد مايلي:

<?php 
 require_once('../classes/constants.php');
?>
<?php 
/* get the parameters that were passed by url */
  if (isset($_GET['language']))
  {//1
	$language = $_GET['language'];
	switch ($language)
	{//2
		case ENGLISH: 
			 require_once('../static_str/en_const.php');
			 $direction ='en_Dir';
		break; 
		case ARABIC:
			 require_once('../static_str/ar_const.php'); 
			 $direction ='ar_Dir';		 
		break; 
		case DEUTSCH: 
			 require_once('../static_str/de_const.php');
			 $direction ='en_Dir';		 
		break;
	}//2
  }//1
?>
<title> <?php echo PAGE_TITLE ?></title>
<link href="../css/directions.css" rel="stylesheet" type="text/css" />
</head>

<body>
<table width="100%" border="1" class="<?php echo  $direction ?>">
  <tr>
	<td><?php echo GOOD_MORNING ?>  </td>
  </tr>
  <tr>
	<td><?php echo MY_NAME ?> </td>
  </tr>
  <tr>
	<td><?php echo  THE_FIRST_LETTER_IN_WORD_IS_ALWAYS_CAPITAL_LETTER ?> </td>
  </tr>
</table>

نلاحظ , وكما هو واضح في الرماز , بأنه يتم في البداية استقبال المعاملات الممرة لهذه الصفحة , واختبار ماهية قيمها , وعلى أساس القيمة – عربي أم انكليزي أم ألماني – يتم تحميل صفحة الثوابت المرتبطة باللغة الموافقة , ويتم أيضا تحميل التنيسقات المرتبطة باللغة المختارة ليتم إدارة العرض عبر تلك التنسيقات الموافقة , فيال السهولة والروعة ومتعة البرمجة ...

وكما هو واضح أصبح بإمكاننا تمديد المفهوم ليشمل المعطيات القادمة من قاعدة المعطيات لعرضها على الصفحة وغير ذلك .

وبهذا نكون قد أتممنا الشرح اللازم لتقينة برمجة موقع متعدد اللغات باستخدام أسلوب الثوابت

وعسى أن أكون قد قدمت عبر هذا الشرح البسيط المقتضب قدر الإمكان الفائدة الرجوة من تجربتي في هذا السياق

مع خالص تمنياتي لكم بالتوفيق والفائدة

والله ولي التوفيق

وأرجو منكم الدعاء

والسلام عليكم ورحمة الله وبركاته

multilang.rar

تم تعديل هذه المشاركة بواسطة joo في 1 أغسطس 2008 في 19:17

#2

جزاك الله خيراً لكن هل جربت طريقة الوورد بريس؟ عبر حفظ النصوص بملفات PO

بخصوص طريقتك ، ماذا لو كان register global موضوع على off، لن تعمل الطريقة!

#3

شوف شو كاتبين جماعة الوورد بريس:

/**

* Provides a simple gettext replacement that works independently from

* the system's gettext abilities.

* It can read MO files and use them for translating strings.

* The files are passed to gettext_reader as a Stream (see streams.php)

*

* This version has the ability to cache all strings and translations to

* speed up the string lookup.

* While the cache is enabled by default, it can be switched off with the

* second parameter in the constructor (e.g. whenusing very large MO files

* that you don't want to keep in memory)

*/

بملف gettext.php داخل مجلد wp-includes

#4
خالد_الحوراني كتب:
جزاك الله خيراً لكن هل جربت طريقة الوورد بريس؟ عبر حفظ النصوص بملفات PO

بخصوص طريقتك ، ماذا لو كان register global موضوع على off، لن تعمل الطريقة!

سلام

شكرا لك اخي خالد

هل تقصد بكلمات بأن الثوابت تندرج تحت إطار ال register global وبالتالي في حال عدم تفعيلها لن تعمل الطريقة السابقة ؟

وفي مثل هذه الحالة فإن كل ال register global لن تعمل وبالتالي فإن أغلب المواقع لن تعمل لأن نسبة مرتفعة تستخدم register global

بما تشمله من المصفوفات التالية

$_POST
$_GET
$_FILE
...

هل ما فهمته منك صحيح؟؟

انا بانتظار أن تنورني بمعلوماتك في هذا السياق

#5

عفواً على التأخير ....

شوف يا سيدي ...

$_GET, $_POST, and $_SERVER هم البديل عن globals ويسمون superglobals

على كل هي المقالة تشرح كل شيء

http://en.wikibooks.org/wiki/PHP_Programmi...egister_Globals

#6

يسلموا هالايدين , رح أقرأها وردلك خبر إن كان في ضرورة او استفسار ما

#7

سلام أخ خالد , يسلموا مرة ثانية على الرابط المرفق حول المتحولات العامة المسجلة

على فكرة قرأت الرابط وعجبني واستفدت منه كتير ونزلته بمدونتي بعد الترجمة - رابط للمدونة

بس على فكرة , أنا مااستخدمت بالكود يلي كتبته المتحولات العامة ا لمسجلة register_globals ,وما اعتمدت نهائيا على كون register_globals مفعلة أو لا , إذا قرأت الكود المرفق بملف خارجي مع المثال التوضيحي رح تلاحظ أني برمجت الموضوع كالتالي:

$language = $_GET[‘language’];

ومن ثم استخدمت المتحول $language ضمن الرماز تبعي

يعني بالفطرة انا برمجته صح , بس هلأ أبدي قلك يسلموا لأنك نورتني لهيك ناحية أمنية في بي أش بي كنت غافل عنها , او بالأحرى أجهلها

سلام

مواضيع مشابهة