PDA

عرض كامل الموضوع : تعريب الاسماء على سيرفرات IRCX



البرق
22-11-2003, 02:31 PM
بسم الله الرحمن الرحيم

في هذا الدرس سنتعرض لتعريب الأوامر المتعلقة بالاسماء
مقدمة
تتعامل سيرفرات IRCX مع الاسماء الغير الانجليزية بترميز
UTF8
ولهذا السبب سنحاول التعرف على الاسماء وتفحصها وبعدها للوصول للنتيجة المرجوة
عندما يتعامل هذا البرتكول IRCX مع أي اسم من أحرف انجليزية فلنتفرض
albarq
سوف نكتبه بالنمط التالي
ولكن لو كان الاسم عربيا
البرق
عند تحويل البرق الى UTF8 سوف يعطينا النتيجة هذه
ط§ظ„ط¨ط±ظ‚
ولكن لكي تسمي نفسك في سيرفرات
ircx
يجب وضع شرطة أول الاسم
'ط§ظ„ط¨ط±ظ‚
وبذلك تكون التسمية سليمة
أما بالنسبة للاسم الأول وهو
albarq
فلا داعي من علامة
'
وحيث يهمنا جدا معرفة متى نحتاج إلى هذه العلامة ومتى لا نحتاج إليها

و سأقوم بتوضيح بعد الحالات التي تظهر بها علامة الشرطة هذه و بعض الحالات التي لا تظهر

[align=left:]albarq -----------> albarq
albarq~ ---------> 'albarq~
wild-Thunder ---c----> wild-Thunder
-wildThunder ---c-----> '-wildThunder
555 ------c---> '555
wild555 ---c---> wild555
555wild ---c--> '555wild
albالبرقarq ----------> 'albط§ظ„ط¨ط±ظ‚arq
قalbarqالبر --------> 'ظ‚albarqط§ظ„ط¨ط±
'البرق -----------> 'البرق[/align:]

الملاحظة التي ينبغي ملاحظتها أنه وُضعت اشارة الشرطة في حالات وعدم وضعها في حالات أخرى
و بعد حصر الحالات التي تأتي بالشرطة
حيث أن الاسم يجب أن
1- يبدأ بالتالي
0 1 2 3 4 5 6 7 8 9 \ -

2- ان يحتوي على فراغ بالداخل وهو الرمز هذا
\b
3- ان يحتوي الاسم على اي حرف او رمز عربي

ان توفر أحد هذه الشروط كفيل لوضع الشرطة في اول الاسم

لذلك وجب تصنيع دالة اختبارية بالميرك لاختبار الأحرف المدخلة حرفاً حرفاً و للتحقق منه
ا
قبل البدأ في شرح الدالة يجب التفريق بين احتياجين من احتياجات التعريب

الاحتياج الاول وهو تعريب الاسماء المدخله وتحويلها الى رموز اليونيكود وتمريرها الى السيرفر مع اختبار وضع الشرطة او عدم وضعه
اما الاحتياج الثاني وهو اختبار الكلمات المررة من السيرفر هل تحتاج الى تعريب ام لا تحتاج الى تعريب

بالنسبة للاحتياج الأول

وهو الاحتياج الخاص عند صنع الأوامر
فمثلا عندما أريد أن اسمي نفسي البرق
فهذا يلزمني الى تحويله الى ترميز UTF8
لن احول ذلك يدويا ولكن سأصنع أمرا يقوم بتسميتي بعد تحويله
سأصنع أمرا بسيطا جدا
لنسمي الأمر الجديد
tasmyah
و لن ننسى من جلب القيمة الخاصة بمكتبة التحويل و لتكن مكتبة عمران والتي ستقوم بتحويل الاسم إلى Unicode
وهي
$dll(omranx.dll,Uni2UTF8,$1-)
حيث أن
$1- هو المدخل الذي سوف يتحول إلى اليونيكود إلى UTF8
سنكتب ذلك بالالياز
[code:1:]tasmyah { nick $dll(omranx.dll,Uni2UTF8,$1-) }[/code:1:]

طبعا الأمر هذا خطأ لأنه يلزمنا من وضع علامة الشرطة ولكننا لم نعمل الدالة التي تقرر متى سنستخدمها ولكن ساقوم بتجربة السطر هذا وسأرى النتيجه أولا
/tasmyah البرق

وسأبدأ بشرحه الان

[code:1:]AlbarqXNameTest { return $iif($1- != $null,$iif(($remove($1-,`,|,^,*,-,\,_,],[,$chr(125),$chr(123)) != $null && $ifmatch !isalnum) || $left($1,1) == - || $left($1,1) == \ || $left($1,1) isnum || \b isin $1 ,Unicode,English)) }[/code:1:]

هذه الدالة قمت بكتابتها لكي اصنف الاسماء التي تحتاج الى الشرطة ومن ثم التحويل والاسماء التي لا تحتاج الى الشرطة

هذه الدالة تقوم بالاختبار فقط ليس لها عمل اخر سوا اعطاء النتائج
unicode : يعني تعامل معه معاملة اليونيكود
english : تعامل معه تعامل عادي دون اي اضافات او تحويل

طبعا هذان القيتمان محدده مني

لكي اشرح الدالة ساحولها إلى نمط اخر غير النعم لا
[code:1:]
AlbarqXNameTest {
if ($1- != $null) {
if ($remove($1-,`,|,^,*,-,\,_,],[,$chr(125),$chr(123)) != $null && $ifmatch !isalnum) || ($left($1,1) == -) || ($left($1,1) == \) || ($left($1,1) isnum) || (\b isin $1) return Unicode

return English
}
}[/code:1:]


وعند تجريب عدة اسماء عليها ستكون النتائج التالية

albarq --------> English
albarq~ -------> Unicode
wild-Thunder --------> English
-wildThunder -------> Unicode
555 ---------> Unicode
wild555 ------> English
555wild ------> Unicode
albالبرقarq --------> Unicode
قalbarqالبر --------> Unicode


وهذه نتيجة مرضية للغاية
وهو دليل نجاح الدالة الاختبارية الموجوده
شرح الدالة

[code:1:]AlbarqXNameTest {
if ($1- != $null) {
if ($remove($1-,`,|,^,*,-,\,_,],[,$chr(125),$chr(123)) != $null && $ifmatch !isalnum) || ($left($1,1) == -) || ($left($1,1) == \) || ($left($1,1) isnum) || (\b isin $1) return Unicode

return English
}
}[/code:1:]

السطر الاول ويعني في حالة أن القيمة الاولى ليس ذو قيمة خالية تصرف بالاتي
السطر الثاني
---------------
$remove($1,a)
هنا سيقوم المتغير هذا باعطاءنا لقيمة اي اسم ولكن بحذف حرف
a
منه
$remove($1,a,b)
هنا سيقوم بحذف حرفان الاي وبي
وهكذا
------------------------------------
$ifmatch : تعني نفس القيمة الاولى المذكوره في المعادلة السابقة


if ($left(%#Helper,1) != ^) && ($ifmatch != $null) return aaaaaa
return bbbbbbb

شرحها أنه لو كان أول رمز او حرف من الغرفه هذه هلبر لا يساوي العلامة هذه
^
وأن نفس المدخل
الذي هو
$left(%#Helper,1)
لا يساوي
فراغاً
صياغة أخرى لنفس الجملة للتوضيح
if ($left(%#Helper,1) != ^) && ($left(%#Helper,1) != $null) return aaaaaa
return bbbbbbb
-------------------------------------




طلبنا منه بالقيام بحذف الاحرف التي لا تسبب اي مشكلة مع الاسماء ان تواجدت بداخلها حيث لا نحتاج اضافة الشرطة لها
وهذه الرموز هي كالتالي
` | ^ * - \ _ ] [ } {
بعد أن يقوم الاسكريبت بجعل القيمة او الاسم المدخل والمختبر خاليا من الرموز التالية سيرى
هل بعد الحذف اصبح الاسم خاليا
وهذا يدل عن الاسم يحتوي فقط على احدى الرموز هذه وانه حين شطبه اصبح خاليا
اذا لما يصبح الاسم خاليا
&&
و لم يكن الاسم بعد التصفية عباره عن أحرف انجليزية وأرقام

--------------------------------
isalnum يطلب ان يكون المدخل ارقاما او احرفا فقط
!isalnum هنا يطلب الا يكون يكون ارقام او احرفا فقط
----------------------------------
بعدها سوف نقوم باختبار أول حرف لو كا ن
-
او كان
\
وبعدها سنختبر اذا كان يحتوي على فراغ او لا
\b
-----------------------------------------------
isin النص الثاني يحتوي بداخله على النص الأول
!isin النص الثاني لا يحتوي بداخله على النص الاول
---------------------

اذا تحقق احد هذه الشروط
فان النتيجة ستكون
unicode
اما اذا لم تتحقق جميعها
فهذا يعني انا النتيجة ستكون
english


------------------------------- تطبيق عملي ----------------------------------------
a`lbarq~ سوف ندخل الاختبار

في اول مرحلة مرحلة حذف الرموز التي لا تسبب حرجا
سيصبح الاسم هكذا
albarq~

اجتزنا اول نقطة ان النتيجة لم تكن خالية
وعند اختبار هل الكلمة جميعها ليست احرفا او ارقاما
سيجد النجاح
لاحتواء الاسم على علامة
~
لذا سوف يعطينا النتيجة
unicode
------------------------------
wild-Thunder
سوف ندخل الاسم هذا للاختبار
في اول مرحلة التي هي التصفية
سيكون الاسم بالشكل هذا
wildThunder
الاسم لم يصبح خاليا وفشل في كون الاسم ليس احرفا انجليزيا ولا ارقام ولم يبدأ باي رقم او بعلامة
-
او علامة
\
ولم تتوسطه العلامة
\b
خرج من الاختبار بنتيجة
English
-----------------------------------------
-wildThunder
في أول مرحلة من الاختبار سوف يصفى من الرموز
wildThunder
نجح في ان المدخل الاول ليس خاليا
فشل في في كون الاسم ليس احرفا انجليزيا ولا ارقام
ولكن تحقق النجاح في كون المدخل يحتوي على اشارة الشرطة في اوله
(عند المرحلتين الاولتين الاسم مصفى من الرموز ولكن عند باقي المراحل سيوضع الاسم كما هو من غير تصفية)

لذا سيخرج بنتيجة
Unicode
----------------------------------------
`
سوف يدخل الاسم الاختبار
سوف يصفى
سوف تحذف الاشارة هذه
سيصبح خاليا
$null
لن يختبر بالقسم الاول من الاختبار سينظر فيه في القسم الثاني وهو الا يبدأ بالرموز المذكورة

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

ستكون النتيجة
English
-----------------------------------------------------------
\
سوف يدخل الاسم الاختبار
سوف يصفى
سوف تحذف الاشارة هذه

$null
لن يختبر بالقسم الاول من الاختبار سينظر فيه في القسم الثاني وهو الا يبدأ بالرموز المذكورة

بعد الاختبار فشل في الشق الاول من القسم الثاني اذ لم يكن اول حرف من الكلمة

-
ولكنه نجح في الشق الثاني من القسم الثاني في كون أول حرف يساوي الرمز
\
ستكون النتيجة
Unicode
-----------------------------------------------------------
عربي

سوف يدخل الاسم هذا الاختبار
سوف يصفى من الرموز وغيرها
النتيجة
عربي
بعدها في المرحلة الثانية
نجح الاسم في كونه ليس احرفا انجليزيا او ارقاما
لذا سوف تكون النتيجة
Unicode

----------------------------
وبهذه الطريقة المتواضعه وصلنا لدالة مهمه جدا اختبارية

حيث اجتزنا مرحلة الاختبار وبقي لنا مرحلة التطبيق
-------------
[code:1:]AlbarqXN { return $iif($1- != $null,$iif($AlbarqXNameTest($1) == Unicode,$iif($left($1,1) == $chr(35) || $left($1,1) == $chr(38),$1,$iif($left($1,1) == %,$dll(omranx.dll,Uni2UTF8,$1-),' $+ $remove($replace($dll(omranx.dll,Uni2UTF8,$1-),\,\\,$chr(44),\c,.,\b,$chr(32),\b),"))),$1-)) }[/code:1:]

شرح هذه الدالة
سوف اقوم بتغيير نمطها الى اسلوب اخر غير اسلوب النعم لا

[code:1:]AlbarqXN {
if ($1- != $null) {
if ($AlbarqXNameTest($1-) == Unicode) {
if ($left($1,1) == $chr(35)) || ($left($1,1) == $chr(38)) return $1
if ($left($1,1) == %) return $dll(omranx.dll,Uni2UTF8,$1-)
return ' $+ $replace($dll(omranx.dll,Uni2UTF8,$1-),\,\\,$chr(44),\c,.,\b,$chr(32),\b),")
}
return $1-
}
}[/code:1:]

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

albarq --------> albarq
albarq~ --------> 'albarq~
wild-Thunder -------> wild-Thunder
-wildThunder --------> 'wild-Thunder
555 ---------> '555
wild555 ------> wild555
555wild -----> '555wild
albالبرقarq -------> 'albط§ظ„ط¨ط±ظ‚arq
قalbarqالبر -------> 'ظ‚albarqط§ظ„ط¨ط±

دليل تام على نجاح الدالة

شرح الدالة


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

لذا سيعطينا الاسم كما هو (السطر ال8)

السطر الرابع والخامس والسادس

كلها تطبيق في حالة لو كان الاسم يونيكود

حيث في في السطر الرابع من الدالة واول حالة من حالات كون الاسم يونيكود اخذت بالحسبان لو كان المدخل عباره عن مربع او علامة الاند او العلامة المئوية المخصصة للغرف وستعطينا نفس نتيجة دالة الغرف

بينما السطر السادس سيقوم باضافة الشرطة ( ' ) وبعدها سيقوم استبدال بعض الرموز لكي تظهر كما تظهر بالمايكروسفت شات
مع حذف علامات التنصيص ان وجدت
ويجري هذا بعد تحويل النص الى اليونيكود عن طريقة المكتبة
هناك اضافة صغيرة :)
من المعلوم انك لا تستطيع استخدام اكثر من فراغ بالتسمية حيث لا يسمح برنامج الميرك بذلك
لذلك استعضت عن الفراغات بالنقاط
حيث كل نقطة تعني فراغا

---------------------------------------------------------------
$replace($1,n,o)
سيقوم المتغير هذا بتحويل اي حرف
n --to----> o
$replace($1,n,o)
--------------------
$chr(44) -----------> ,
$chr(32) --------> فراغ
-----------------------------------------




الان وبعد النتائج التي حصلنا عليها نستطيع وضع ألاوامر الخاصة التي سنستفيد منها

[code:1:]nickx { nick $albarqXN($1) }[/code:1:]

------------------OR----------------------------
ما رايك بازالة الاكس وجعل الاوامر متوافقة مع الاوامر الاصلية
[code:1:]nick { nick $albarqXN($1) }
whois { whois $albarqXN($1) } [/code:1:]

------------------OR----------------------------
[code:1:]الاسم { nick $albarqXN($1) } [/code:1:]----------------------------------------------------------------------------------


هناك بعض الاوامر والتي تستخدم للغرف وفي نفس الوقت لها استخدام للاسماء
مثل
who msg mode
حل الاشكالية هذه بسيط جدا
قمنا بعمل استبيان للمدخل
حيث ان احتوى في اوله على مربع او علامة االاند او علامة مئوية يعامل على انه غرفة
والا فهو اسم لا محالة

[code:1:]who {
if ($1 != $null) {
if ($left($1,1) == $chr(35)) || ($left($1,1) == %) || ($left($1,1) == $chr(38)) who $AlbarqXR($1)
else who $albarqXN($1) } } [/code:1:]

في الحالة الاولى اذا كان اول حرف عباره عن العلامة المئوية او عن مربع او عن علامة الاند سيعامل معاملة الغرف وإلا سيعامل معاملة الاسماء

---------------------------------
else تعني والا الحالة المغايرة وهي تأتي في جمل لو حيث تكون القراءه لو كانت الجملة تحتوي على كذا قم بكذا والا قم بغير كذا
-------------
نعيد صياغة الامر باسلوب النعم لا ان احببنا
[code:1:]
who { $iif($1 != $null,who $iif(($left($1,1) == $chr(35)) || ($left($1,1) == %) || ($left($1,1) == $chr(38)),$AlbarqXR($1),$AlbarqXN($1))) }[/code:1:]


------------------------------
تنويه ان هذا الشرح المفصل لتعريب الأسماء وتوابعها، هي طريقة قديمة استخدمتها للتعريب و هي الطريقة التي ظهرت في اسكريبت هلبر، و الغرض من كتابة هذا الشرح المفصل :
1- افهام بعض مبرمجين الميرك عن الية الاسماء على سيرفرات IRCX
2- شرح عملية التعريب
3- شرح طريقة للتفكير و للمحاولة والاختبار
4- لمن اراد الغاء الطريقة هذه و ازالتها من اسكريبته ، فعليه ان يعرف سبب وجودها.




انتهى

السلطان
26-11-2003, 03:29 AM
البرق,

ألف شكر لك اخوي البرق على هذه المعلومات..

ولاتحرمنا من خبرتك وابداعاتك..

تقبل تحياتي

Dns
28-09-2004, 07:59 AM
شرحت موضوع معقد جدا بطريقة سهله جدا

الله يعطيك الف عافيه

أبدعت اخي البرق وسوف احتفظ بهذا الدرس المثالي

ونطمح الى شرح تعريب القنوات واظهار الغرف العربية التي تبدأ بعلامة المئوية

وكيفية اظهارها في القائمة باللغة العربية :)

شكرا مرة اخرى