ِ Write Custom Classes To Localize Windows Forms Application

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

اللينكــــــــــــــــــــــــــ 

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

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


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

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

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


لكلاسات المستخدمة في المشروع هذا ستكون كالتالي:

01 - Languages Enumeration

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

02 - Language Class

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

03 - ArabicLanguage Class
 
كما هو واضح من اسمه فهو الكلاس الذي سوف يدعم اللغة العربية و به سوف نقوم بتخزين كل ما له علاقة بترجمة واجهة التطبيق الي العربية

04 - EnglishLanguage Class

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

05 - SpanishLanguage Class

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

06 - RussianLanguage Class

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

07 - LanguageContext Class

و هو عبارة عن مصفوفة سوف تستخدم لتخزين جميع الكلاسات الخاصة باللغة

08 - LanguagedChangedEventArgs Class

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

09 - LanguagedChangedEventHandler Class

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

10 - LanguageController Class

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




Codes:

 Friend MustInherit Class Language

    Friend Overridable ReadOnly Property Name
() As String
        Get
            Return MyBase
.GetType().Name.Replace("Language""")
 
       End Get
    End Property

    Friend MustOverride ReadOnly Property FormText 
As String

End 
Class


 Public Enum Languages
    Arabic
    English
    Russian
    Spanish
End Enum


Friend Class ArabicLanguage
    Inherits Language

    Friend Overrides ReadOnly Property FormText 
As String
        Get
            Return 
"فيجوال بيسك لكل العرب"
 
       End Get
    End Property

End 
Class



Friend Class EnglishLanguage
    Inherits Language

    Friend Overrides ReadOnly Property FormText 
As String
        Get
            Return 
"Visual Basic For Arab"
 
       End Get
    End Property

End 
Class 


Friend Class SpanishLanguage
    Inherits Language

    Friend Overrides ReadOnly Property FormText 
As String
        Get
            Return 
"Visual Basic Para Árabe"
 
       End Get
    End Property

End 
Class 



Friend Class RussianLanguage
    Inherits Language

    Friend Overrides ReadOnly Property FormText 
As String
        Get
            Return 
"Visual Basic для арабских"
 
       End Get
    End Property

End 
Class 



Friend Class LanguageContext#Region " Field "

 
   Private _languages As List(Of Language)#End Region

#Region " Constructor "

 
   Public Sub New()
 
       Me._languages = New List(Of Language)
 
   End Sub

    Public Sub 
New(capacity As Integer)
 
       Me._languages = New List(Of Language)(capacity)
 
   End Sub#End Region

#Region " Property "

 
   Protected ReadOnly Property Languages As List(Of Language)
 
       Get

            Return Me
._languages
        End Get
    End Property

    Default Friend Property Item
(Index As Integer) As Language
        Get
            Return CType
(Me.Languages(Index), Language)
 
       End Get
        Set
(value As Language)
 
           Me.Languages(Index) = value
        End Set
    End Property

    Friend Property Capacity
() As Integer
        Get
            Return Me
.Languages.Capacity
        End Get
        Set
(value As Integer)
 
           Me.Languages.Capacity value
        End Set
    End Property

    Friend ReadOnly Property Count
() As Integer
        Get
            Return Me
.Languages.Count
        End Get
    End Property
#End Region

#Region " Method "

 
   Friend Sub Add(item As Language)
 
       Me.Languages.Add(item)
 
   End Sub

    Friend Sub AddRange
(items As Language())
 
       For i As Integer 0 To items.Length 1
            Dim item 
As Language items(i)
 
           Me.Languages.Add(item)
 
       Next
    End Sub

    Friend Sub Remove
(item As Language)
 
       Me.Languages.Remove(item)
 
   End Sub

    Friend Sub Insert
(index As Integeritem As Language)
 
       Me.Languages.Insert(indexitem)
 
   End Sub

    Friend 
Function Contains(item As Language) As Boolean
        Return Me
.Languages.Contains(item)
 
   End Function

 
   Friend Function GetEnumerator() As IEnumerator
        Return Me
.Languages.GetEnumerator()
 
   End Function#End RegionEnd Class ' LanguageContext 


Public Class LanguagedChangedEventArgs
    Inherits EventArgs
    Private _languages 
As Languages
    Public Sub 
New(language As Languages)
 
       Me._languages language
    End Sub

    Public ReadOnly Property Language 
As Languages
        Get
            Return Me
._languages
        End Get
    End Property

End 
Class 

 Friend Delegate Sub LanguagedChangedEventHandler(sender As ObjectAs LanguagedChangedEventArgs)

Public Class LanguageController

    Private _context 
As LanguageContext
    Private _lock 
As Object = New Object

    Friend ReadOnly Property 
List As LanguageContext
        Get
            If 
(Me._context Is NothingThen
                SyncLock Me
._lock
                    If 
(Me._context Is NothingThen
                        Me
.InitializeLanguages()
 
                   End If
 
               End SyncLock
            End 
If
 
           Return Me._context
        End Get
    End Property

    Friend Sub InitializeLanguages
()
 
       Me._context = New LanguageContext

        Dim arabic 
As Language = New ArabicLanguage
        Dim english 
As Language = New EnglishLanguage
        Dim russian 
As Language = New RussianLanguage
        Dim spanish 
As Language = New SpanishLanguage

        _context
.Add(arabic)
 
       _context.Add(english)
 
       _context.Add(russian)
 
       _context.Add(spanish)

 
   End Sub

    Friend 
Function GetLanguage(index As Languages) As Language
        Return CType
(List.Item(index), Language)
 
   End FunctionEnd Class 

 Code Usage:

 Public Class Form1

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       Me.Text = Nothing
       Me.SetApplicationData(CType(Me.Controller.GetLanguage(Me._language), Language))
   End Sub

   Private _language As Languages = Languages.English
   Public Property Languge As Languages
       Get
           Return Me._language
       End Get
       Set(value As Languages)
           If Me._language <> value Then
               Me._language = value
               Me.OnLanguageChanged(New LanguagedChangedEventArgs(Me._language))
           End If
       End Set
   End Property

   Private _controller As LanguageController = New LanguageController
   Friend ReadOnly Property Controller As LanguageController
       Get
           Return _controller
       End Get
   End Property

   Private Sub SetApplicationData(currentLanguage As Language)
       Me.Text = currentLanguage.FormText
   End Sub

   Protected Sub OnLanguageChanged(e As LanguagedChangedEventArgs)
       RaiseEvent LanguageChanged(Me, e)
       Me.SetApplicationData(CType(Me.Controller.GetLanguage(e.Language), Language))
   End Sub

   Friend Event LanguageChanged As LanguagedChangedEventHandler

   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       Me.Languge = Languages.Arabic
   End Sub

   Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
       Me.Languge = Languages.English
   End Sub

   Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
       Me.Languge = Languages.Spanish
   End Sub

   Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
       Me.Languge = Languages.Russian
   End Sub

End Class



 Download :

To Download the full code please visit the below link:

Download Link

    




Comments

Popular posts from this blog

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

VB.NET Translucent Control using GDI+

Add Custom Event to a Class in VB.NET