NumericsShaper From English To Arabic in DotNet

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

الهدف
مشاركة الأفكار البرمجية

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

هذا كله من الممكن أن يتم كالتالي

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

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

في جميع الأحوال نحن في حاجة الي مصفوفتان او مصفوفة واحدة أو أكثر حيث يتم استخدام المصفوفات لقراءة البيانات و عقد المقارنات بين النصوص اللغوية ثم و بشكل اتوماتيكي تتم عملية الترجمة من لغة الي أخري

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

أسلوب إدخال البيانات بواسطة المستخدم ربما يؤثر بشكل ما علي عملية الترجمة

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

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

الكود
الخطوات التالية توضح كيفية تحويل الأرقام الإنجليزية الي أرقام عربية

تعريف مصفوفة للأرقام الإنجليزية

Dim EnglishGlyphs As IEnumerable(Of String) = New List(Of StringFrom {"0""1""2""3""4""5""6""7""8""9"}


 تعريف مصفوفة للأرقام العربية

Dim ArabicGlyphs As IEnumerable(Of String) = New List(Of StringFrom {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(textString)
 
       Dim sb As System.Text.StringBuilder CType(NothingSystem.Text.StringBuilder)
 
       Dim result As String CType(NothingString)
 
       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(sThen
                    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(valueString)
 
       If Not (String.IsNullOrEmpty(valueString)) Then
            Return TranslatetoArabic
(valueString)
 
       End If
 
       Return CType(NothingString)
 
   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 StringFrom {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 StringFrom {"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(textString)
 
       Dim sb As System.Text.StringBuilder CType(NothingSystem.Text.StringBuilder)
 
       Dim result As String CType(NothingString)
 
       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(sThen
                    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(valueString)
 
       If Not (String.IsNullOrEmpty(valueString)) Then
            Return TranslatetoArabic
(valueString)
 
       End If
 
       Return CType(NothingString)
 
   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.FontFamily20.0FFontStyle.Bold), Brushes.Red, New Point(1010)) 


  

Comments

Popular posts from this blog

مقدمة الي تشفير الحروف الأبجدية العربية

VB.NET Translucent Control using GDI+

Add Custom Event to a Class in VB.NET