NumericsShaper From English To Arabic in DotNet
ترجمة
نص أو ترجمة كلمة أو رقم من لغة الي أخري أمر هام جدا خاصة حين تحاول أن
تبني برامج تدعم لغات أخري ومن المؤكد أن هذا الأمر يشغل بال فئة من
المبرمجين و
في هذا الموضوع سنناقش بعض الأفكار التي من الممكن أن تكون نواة معقولة
لكتابة برامج لترجمة النصوص او كتابة برامج مثل القاموس الإلكتروني او ما
شابه ذلك
الهدف
مشاركة الأفكار البرمجية
الفكرة
فكرة
الموضوع هنا عبارة عن تخزين البيانات بشكل ما ثم فراءتها ثم عرضها علي
المستخدم من خلال برنامجك وهذا غالبا ما يتم بأكثر من اسلوب طبقا لرؤية و
هدف كل مبرمج
هذا كله من الممكن أن يتم كالتالي
أن نحتفظ بالبيانات الخاصة بكل لغة في ملف ما او في عدة ملفات ثم نقوم
بقراءتها وتحويلها الي مصفوفات وهذا الأسلوب مناسب جدا حين يكون هدفك أن
تسمح لمستخدم البرنامج أن يضيف بيانات أو يقوم بالتعديل في البيانات التي
تم تخزينها مسبقا او ما شابه ذلك
أن يكون برنامجك لا يدعم عمليات الاضافة والتعديل وتقوم أنت بإدخال
البيانات كاملة وهنا قد تحتاج او لا تحتاج الي ملفات لتخزين البيانات لكنك
ستظل في حاجة الي تخزين البيانات بشكل ما داخل البرنامج ثم تقوم بقراءة
البيانات و تحويلها الي مصفوفات
في
جميع الأحوال نحن في حاجة الي مصفوفتان او مصفوفة واحدة أو أكثر حيث يتم
استخدام المصفوفات لقراءة البيانات و عقد المقارنات بين النصوص اللغوية ثم و
بشكل اتوماتيكي تتم عملية الترجمة من لغة الي أخري
حتي
الأن الأمر يبدو بسيطا وسهلا لكن لو فكرنا قليلا سنجد أننا في حاجة الي
داتابيز ضخمة جدا نحتفظ فيهابالبيانات وهذا قد يحتاج الي ايام وشهور وربما
سنوات لإنجازه و حتي إن استطعنا الإنتهاءمن إنجاز الداتا بيز سيظل هناك بعض
القيود التي ربما تؤثر في ترجمة النصوص بكل دقة وهذه القيود من الممكن
تصنيفها كالتالي
أسلوب إدخال البيانات بواسطة المستخدم ربما يؤثر بشكل ما علي عملية الترجمة
النحو ........ وهو يمثل واحدا من أكبر العوائق في ترجمة النصوص من اللغة
العربية الي الإنجليزية او العكس و الدليل علي اهمية هذه الجزئية هو ان
مترجم جوجل لا يترجم بشكل صحيح مائة بالمائة بسبب النحو
نقطة الإنطلاق
البداية هنا ستكون تحويل الأرقام من اللغة الانجليزية الي اللغة العربية
بدون استخدام ملفات مايكروسوفت الموجودة في الدوت نت و في واقع الأمر هذا
ما يمكن ان نطلق عليه اسهل جزء في الفكرة المراد توضيحها لكنني هنا سأخذه
كمثال أولي للتعبير عن الفكرة و ليكون نقطة إنطلاق لبناء شئ أفضل
الكود
الخطوات التالية توضح كيفية تحويل الأرقام الإنجليزية الي أرقام عربية
تعريف مصفوفة للأرقام الإنجليزية
Dim EnglishGlyphs As IEnumerable(Of String) = New List(Of String) From {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
تعريف مصفوفة للأرقام العربيةDim ArabicGlyphs As IEnumerable(Of String) = New List(Of String) From {ChrW(1632), ChrW(1633), ChrW(1634), ChrW(1635), ChrW(1636), ChrW(1637), ChrW(1638), ChrW(1639), ChrW(1640), ChrW(1641)}
كتابة الروتين او الدالة التي ستقوم بتحويل المدخلات من الانجليزية الي العربية
واهم شئ في فكرة الدالة هو الحصول علي الرقم المسلسل الخاص بكل حرف في
مصفوفة اللغة الإنجليزية ثم استخدام نفس الرقم المسلسل لإيجاد ما يقابله في
اللغة العربية
Private Function TranslateToArabic(text As String) As String
Dim sourceValue As String = CType(text, String)
Dim sb As System.Text.StringBuilder = CType(Nothing, System.Text.StringBuilder)
Dim result As String = CType(Nothing, String)
If Not (String.IsNullOrEmpty(sourceValue)) Then
sb = New System.Text.StringBuilder
For j As Integer = 0 To text.Length - 1
Dim s As String = text(j)
If EnglishGlyphs.Contains(s) Then
Dim index As Integer = EnglishGlyphs(s)
Dim arabicString As String = ArabicGlyphs(index)
sb.Append(arabicString)
End If
Next
result = sb.ToString
End If
Return result
End Function
Public Function ToArabic(value As String) As String
Dim valueString As String = CType(value, String)
If Not (String.IsNullOrEmpty(valueString)) Then
Return TranslatetoArabic(valueString)
End If
Return CType(Nothing, String)
End Function
كيفية إستخدام الكود
تعريف متغير يعبر عن الرقم المراد ترجمته الي اللغة العربية ثم بعد ذلك
نقوم بتمرير القيمة الخاصة به الي الدالة التي تقوم بترجمته الي اللغة
العربية
Dim s As String = "20450606060"
Dim result As String = ToArabic(s)
Me.Text = result
' or
Me.TextBox1.Text = ToArabic("20450606060")
لقد قمت بكتابة الكود علي شكل كلاس ليسهل استخدامه او تطويره
Public Class NumericsShaper
Public Sub New()
End Sub
Protected ReadOnly Property ArabicGlyphs As IEnumerable(Of String)
Get
Return New List(Of String) From {ChrW(1632), ChrW(1633), ChrW(1634), ChrW(1635), ChrW(1636), ChrW(1637), ChrW(1638), ChrW(1639), ChrW(1640), ChrW(1641)}
End Get
End Property
Protected ReadOnly Property EnglishGlyphs As IEnumerable(Of String)
Get
Return New List(Of String) From {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
End Get
End Property
Private Function TranslateToArabic(text As String) As String
Dim sourceValue As String = CType(text, String)
Dim sb As System.Text.StringBuilder = CType(Nothing, System.Text.StringBuilder)
Dim result As String = CType(Nothing, String)
If Not (String.IsNullOrEmpty(sourceValue)) Then
sb = New System.Text.StringBuilder
For j As Integer = 0 To text.Length - 1
Dim s As String = text(j)
If EnglishGlyphs.Contains(s) Then
Dim index As Integer = EnglishGlyphs(s)
Dim arabicString As String = ArabicGlyphs(index)
sb.Append(arabicString)
End If
Next
result = sb.ToString
End If
Return result
End Function
Public Function ToArabic(value As String) As String
Dim valueString As String = CType(value, String)
If Not (String.IsNullOrEmpty(valueString)) Then
Return TranslatetoArabic(valueString)
End If
Return CType(Nothing, String)
End FunctionEnd Class
كيف تستخدم الكلاس أعلاه
تقوم بتعريف متغير يعبر عن الكلاس ثم تقوم بتعريف متغير عن الرقم المراد
تحويله من الانجليزية الي العربية ثم نقوم بتمرير هذا المتغير الي الدالة
الموجودة بالكلاس
والكود التالي يوضح هذا ويوضخ ايضا كيف من الممكن ان نرسم الحروف علي الفورم
Dim shaper As New NumericsShaper
Me.Text = shaper.ToArabic("010999999993456")
Me.TextBox1.Text = shaper.ToArabic("20450606060")
' Rendering
Dim arabicShaper As New NumericsShaper
e.Graphics.DrawString(arabicShaper.ToArabic("10003456789"), New Font(Me.Font.FontFamily, 20.0F, FontStyle.Bold), Brushes.Red, New Point(10, 10))
Comments
Post a Comment