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

استخدام GNU Gettext في لغة PHP

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

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

كل عام و انتم بخير :)

سوف نتحدث في هذا الموضوع بتعريف ﻹطار عمل (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"));?>

و اتمنى لكم التوفيق

4
#2

بارك الله بك

ولكن أليست الطريقه طويله معقده ومتعبه بنفس الوقت ؟

ربما الجميل فيها أنها قياسيه ولكن أليست المصفوفه ربما تكون أوضح وأسرع في التعامل ؟

$lang[ar]['some text']='نص معين ';
$lang[en]['some text']='Some Text';
1

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#3

الله يبارك فيك أخي bastr3 :).

الله يعطيك العافية على مداخلتك الطيبة.

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

// en.php
define('WELCOME_MSG') = "Welcome"; // By using constant

$Text['Welcome'] = "Welcome"; // By using array

// ar.php
define('WELCOME_MSG') = "مرحبا"; // By using constant

$Text['Welcome'] = "مرحبا"; // By using array

ولكن هذه الطريقة يعيبها عدم كونها قياسية (كل مبرمج يمكن يعمل قاموس مصطلحات تطبيقه بطريقة التي يراها مناسبه) و هذا مما يقيد المستخدمين العادين من ترجمة التطبيق للغات آخرى, و ذلك بسبب من الممكن أن يخطئ المستخدم العادي الغير ملم بلغة PHP ببعض اﻷخطاء اللغوية في لغة PHP عند الترجمة (مثل نسيان ; :) وذلك بمسحها عن طريق الخطأ ومن ثم لا يعرف الخطأ أين).

أما من جهة استخدام طريقة GNU Gettext, الطريقة قياسية و تضمن لمستخدم العادي عدم المماس بكود التطبيق بحيث يتعامل مع ملفات آخرى و هي ملفات GNU gettext التي تم ذكرها بالموضوع, و أيضا من جهة المبرمج, فهو فالبداية يكتب النصوص بلغته اﻷصلية في التطبيق و ذلك بإسنادها لدالة (gettext) و عند الانتهاء يمكن عمل ملفات (po و mo) و ذلك لن يكون صعبا له بسبب ﻷن عملية البحث عن النصوص في التطبيق تكون آلية و يتم تجيز ملف po من خلال أمر واحد فقط :) باستخدام مثل اﻷداءة xgettext من خلال

من وجهة نظري اذا كان المبرمج يرغب بأن ينتشر تطبيقه بدعم تعدد لغات بشرية و يريد تسهيل عملية الترجمة لمستخدمين اﻵخرين و ذلك من باب انتشار التطبيق بأن يستخدم طريقة غطار عمل GNU Gettext.

و أتمنى لك التوفيق

تم تعديل هذه المشاركة بواسطة SamCode في 21 أغسطس 2010 في 12:24

#4

أظن أنه يمكن أيضا استعمال ملفات ini لتخزين النصوص بلغات مختلفة، ثم تحميل ملف اللغة المناسبة. ملفات ini هي مجرد key=value لذلك لا تتطلب إلمام ب php

مثلا

ar.ini

welcome="أهلا وسهلا"
message1="كيف الحال؟"
bye="مع السلامة"

en.ini

welcome="Welcome"
message1="How are you?"
bye="Good bye"

test.php

<?php
	header("Content-Type: text/html; charset=utf-8");
	$lang='ar';
	if ($lang == 'ar') {
		$labels = parse_ini_file("ar.ini");
	} else {
		$labels = parse_ini_file("en.ini");
	}
	echo $labels['welcome'].'<br/>';
	echo $labels['message1'].'<br/>';
	echo $labels['bye'].'<br/>';
?>
#5

حياك الله أخي herch :)

الله يعيطك العافية على إضافتك الرائعة :).

اتفق معك بأن باستخدام ملفات (ini) اسهل في عملية الترجمة من عمل ملفات القواميس بلغة PHP.

ولكن هذا يتطلب من المبرمج وضع مختصر الجملة (الذي هو key في ملف ini) أثناء التطبيق ومن ثم كتابة كل جملة (Value) مقابل كل مختصر او المفتاح (Key).

, عند استخدام إطار عمل GNU Gettext فأن المبرمج يقوم بكتابة الجملة مرة واحدة للغة الافتراضية للتطبيق, ومن ثم تكون عملية تجميع كافة النصوص في المشروع عملية آلية و تجيهزها في ملف pot. و الذي بدوره يستخرج منه المترجم ملف po لترجمة الملف.

و أتمنى لك التوفيق

#6

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

في الجافا تتجه معظم الأنظار و الإهتمامات تجاه الطريقة التي تحدث عنه الأخ عصام (herch)

#7

السلام عليكم اخي وشكرا لك علي هذا الشرح

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

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