السلام عليكم ورحمة الله وبركاته ، أخواني وأساتذتي ومعلمينا ( دون استثناء )
اليوم جئتكم بفكرة جديدة وأعتقد أنه لم يسبقني أحد بهذا الطريق ؛ وهو إضافة اختيار واجهة اللغة إلى تطبيقات وبرامج ومشاريع الآكسيس بطريقة جديدة وتقدروا تقولوا 2024
في البداية سأقوم بشرح المطلوب داخل القاعدة التي سيتم التطبيق عليها ،
أولاً :- جدول واحد فقط يحتوي على حقل واحد فقط أيضاً وسنسميه بـ SettingsTable ، والحقل الذي بداخله هو Language من نوع نصي ( Text ) .
ثانياً :- نموذج Settings وهو طبعاً ليس له مصدر سجلات .
وبداخله كومبوبوكس Combo box سيكون اسمه cboLanguage نوع مصدر بياناته Value List ؛ ومصدر بياناته القيم التالية ( "العربية";"English" ) .
ثالثاً :- بجانب قاعدة البيانات سنقوم بإنشاء مجلد جديد وسيتم تسميته بـ Language .
الآن خطوات العمل :-
الموديول Module :- قم بإنشاء Module جديد وسمه بـ Set_Language ؛ وهو مفتاح العمل والذي من خلاله سنعتمد على جلب الترجمة من الملفات التي سنقوم بإنشائها لاحقاً . وهذا الكود مع الشرح الكامل له بين السطور .
Option Compare Database
Option Explicit
' المتغير العام لتخزين اللغة الحالية
Public CurrentLanguage As String
' تحديث اللغة الحالية
Public Sub UpdateLanguage()
On Error Resume Next
' احصل على اللغة المحددة من جدول الإعدادات
CurrentLanguage = DLookup("Language", "SettingsTable")
' قم بتحديث العلامات في جميع النماذج
UpdateLabelsInAllForms
End Sub
' تحديث العلامات في جميع النماذج
Private Sub UpdateLabelsInAllForms()
Dim frm As AccessObject
' تحديث العلامات في جميع النماذج المحملة
For Each frm In CurrentProject.AllForms
If frm.IsLoaded Then
UpdateLabelsInForm Forms(frm.Name)
End If
Next frm
End Sub
' تحديث العلامات في نموذج محدد
Private Sub UpdateLabelsInForm(frm As Object)
Dim arFile As String, enFile As String
Dim arLabels() As String, enLabels() As String
Dim i As Integer
' احصل على ملف اللغة العربية واللغة الإنجليزية
arFile = GetLanguageFilePath("Arabic.txt")
enFile = GetLanguageFilePath("English.txt")
' اقرأ الملفات واملأ المصفوفات بالنصوص المترجمة
arLabels = Split(ReadFile(arFile), vbCrLf, -1)
enLabels = Split(ReadFile(enFile), vbCrLf, -1)
' قم بتحديث العلامات في النموذج
For i = 0 To UBound(arLabels)
UpdateLabel frm, "Label" & CStr(i + 1), arLabels(i), enLabels(i)
UpdateLabel frm, "Command" & CStr(i + 1), arLabels(i), enLabels(i)
Next i
End Sub
' احصل على مسار قاعدة البيانات الحالية
Private Function GetDatabasePath() As String
Dim dbPath As String
dbPath = CurrentDb.Name
GetDatabasePath = Left(dbPath, InStrRev(dbPath, "\"))
End Function
' احصل على مسار ملف اللغة
Private Function GetLanguageFilePath(fileName As String) As String
GetLanguageFilePath = GetDatabasePath() & "Language\" & fileName
End Function
' اقرأ ملف النص وارجع النص كنص نصي
Private Function ReadFile(filePath As String) As String
Dim fileNumber As Integer
fileNumber = FreeFile
Open filePath For Input As fileNumber
ReadFile = Input$(LOF(fileNumber), fileNumber)
Close fileNumber
End Function
' تحديث علامة محددة في النموذج بناءً على اللغة الحالية
Private Sub UpdateLabel(frm As Object, labelName As String, arabicText As String, englishText As String)
On Error Resume Next
' قم بتحديث العلامة بناءً على اللغة الحالية
frm.Controls(labelName).Caption = IIf(CurrentLanguage = "العربية", arabicText, englishText)
On Error GoTo 0
End Sub
* ملاحظة :- سنعتمد هنا على طريق بسيط جداً وهو المسميات في النماذج ، فمثلاً لو انشأنا زر في نموذج ما وكانت تسميته Caption هي حفظ وكان اسم الزر Command1 ؛ فعند الترجمة سيصبح كل زر في البرنامج باسم Command1 هو بمثابة زر الحفظ وستكون ترجمته Save ؛ لذا سنعتمد طريقة توحيد المسميات في النماذج وهذا سيجعل الأمر سهلاً جداً للصيانة ، وطبعاً لا يمكن أن يكون لعنصرين ( كائنين ) في النموذج لهما نفس الإسم .
رابعاً :- العودة إلى نموذج Settings الذي تم التحدث عنه في النقطة ( ثانياً ) ؛ سنقوم بدايةً باستكمال إنشاء الأكواد الخاصة بتغيير اللغة ، قبل الأحداث للـ Combo Box والنموذج .
سنقوم بإدراج هذه الأكواد الثلاثة البسيطة :-
' تحديث العناصر في النموذج بناءً على اللغة المختارة
Private Sub UpdateLanguageForControls()
On Error Resume Next
Dim ctrl As AccessObject
For Each ctrl In Me.Controls
' يمكنك هنا إضافة العناصر الأخرى التي تريد تحديثها بناءً على اللغة
' مثلا: If TypeOf ctrl Is ComboBox Then
Next ctrl
End Sub
' حفظ اختيار اللغة في جدول SettingsTable
Private Sub SaveLanguageChoice()
CurrentDb.Execute "UPDATE SettingsTable SET Language='" & Me.cboLanguage & "'"
End Sub
' تغيير اللغة وتحديث العناصر ذات الصلة
Private Sub ChangeLanguage(selectedLanguage As String)
CurrentDb.Execute "UPDATE SettingsTable SET Language='" & selectedLanguage & "'"
UpdateLanguageForControls
End Sub
وفي حدث عند الفتح للنموذج سنقوم بإدراج هذا الكود :-
' حدث يتم تنفيذه عند فتح النموذج
Private Sub Form_Open(Cancel As Integer)
UpdateLanguage
End Sub
وفي حدث عند التحديث للكومبوبوكس سندرج الكود التالي :-
' حدث يتم تنفيذه بعد تحديث اختيار اللغة من ComboBox
Private Sub cboLanguage_AfterUpdate()
Dim response As VbMsgBoxResult
Dim Language As String
' احصل على اللغة المحددة من ComboBox
Language = Me.cboLanguage.Value
' قم بتحديد الرسالة بناءً على اللغة المختارة
If Language = "العربية" Then
response = MsgBox("هل ترغب في تغيير اللغة إلى العربية؟", vbQuestion + vbYesNo, "التأكيد")
ElseIf Language = "English" Then
response = MsgBox("Do you want to change the language to English?", vbQuestion + vbYesNo, "Confirmation")
End If
' قم باتخاذ الإجراء المناسب بناءً على رد المستخدم
If response = vbYes Then
SaveLanguageChoice
Application.Quit
Else
SaveLanguageChoice
DoCmd.Close
End If
End Sub
الآن نأتي لأهم نقطة في هذا الموضوع ، ألا وهي . أين ستكون الترجمة ؟
طبعاً قمنا سابقاً بإنشاء المجلد Language بجانب قاعدة البيانات ، الآن سنذهب إليه وسنقوم بإنشاء ملفين نصيين Text الأول Arabic.txt ، والثاني English.txt .
في الأعلى افترضنا انه لدينا في النموذج زر اسمه Command1 والـ Caption له كانت حفظ ، الآن سنقوم بكتابة المسمى بالعربي وهو حفظ في ملف النص Arabic ، وفي الملف الثاني English سنكتب Save وهو أول أمر قمنا به كتجربة ( لاحظ أن Command يتبعها الرقم 1 ) وعليه فأن أي مسمى Command1 في أي نموذج سيكون اسمه حفظ أو Save عند اختيار الإنجليزية .
وفي النهاية سأترك مرفق يحتوي تطبيق لما تحدثنا به سابقاً .
والمتابعة لأي استفسار أو توضيح
Change Language.zip