الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

درس : كيف نصنع تطبيق متعدِّد اللغة .

بدأه مختار سيد صالح في 2 مايو 2009 · 20 رد · 8,373 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته

كان أحد الإخوة في المنتدى قد طلب منِّي أن أكتب شرحاً لكيفيّة عمل تطبيق متعدِّد اللغة Multilanguage application

و لعلِّي أحاول تلبية رغبته في هذا الدرس المختصر جدَّاً .

كيف نصنع تطبيق متعدِّد اللغة ؟

في البداية و قبل كل شيء يجب أن نتوجَّه بالشكر الكبير لحبيبتنا Microsoft على ما تقدمه لعشَّاقها المبرمجين من تسهيلات مستمرَّة ;

لا أزال أذكر عندما أردتُ عمل تطبيق متعدِّد اللغة لأوَّل مرَّة باستخدام فيجوال بيسك 6 أو C++ , الموضوع كان في غاية الصعوبة

إن قُورِنَ بالطريقة الجديدة التي قدَّمتها Microsoft (حبيبتنا) مع بيئة التطوير Visual Studio و إطار العمل دوت نت.

حيث أصبح يمكن أن نقول لك كمبرمج يريد عمل تطبيق متعدِّد اللغات

1- أنشئ مشروعاً جديداً و أبدأ بعمل نافذة للتطبيق باللغة العربيَّة .

1.gif

2- اختر الخاصيّة Localizable للنافذة و اجعلها مساويةً لـ True

2.gif

3- اضبط الخاصيَّة Language على Arabic و لا تقم بتغيير تصميم النافذة (لأنَّك صممتها بالعربيّة أصلاً :) ) .

4- اضبط الخاصيَّة Language على English و عدِّل على النافذة الموجودة بحيث تصبح ملائمة للغة الإنجليزيّة .

3.gif

5- إلى هنا نكون قد أنهينا كامل العمل تقريباً بدون أن نكتب أي تعليمة برمجيَّة ! (أين أيَّامك يا .ini :) )

6 - لتغيير اللغة :

أ - لا بدَّ من استيراد فضائي الأسماء

System.Threading

c# : System.Globalization

using System.Threading;
using System.Globalization;

VB :

Imports System.Threading
Imports System.Globalization

ب - لتغيير اللغة نكتب الكود التالي :

c# :

Thread.CurrentThread.CurrentUICulture = new CultureInfo("EN-us");

VB :

Thread.CurrentThread.CurrentUICulture = new CultureInfo("EN-us")

ملحوظة : السطر السابق كفيل بتغيير اللغة إلى الإنجليزيّة حيث أن الوسيط بشكل عام هو أوَّل حرفين من اللغة ثمَّ - ثمَّ أوَّل حرفين من الدولة , مثلاً

نستطيع أن نكتب

AR-sy (العربيّة - سوريا)

FR-fr (الفرنسيّة - فرنسا)

و التغييرات لن تظهر على النافذة التي تم استدعاء السطر البرمجي بها , إلَّا إن قمنا بإعادة رسم النافذة .

6 - إلى هنا نكون قد أنتهينا من إنشاء تطبيق متعدد اللغة , دعني أقول مجازاً تطبيق ذو واجهة متعددة اللغة :) , لماذا ؟

ماذا لو كان لدينا في التطبيق أحد الإجرائيَّات التي تقوم بالتالي :

c# :

MessageBox.Show("مختار سيد صالح");

VB :

MessageBox.Show("مختار سيد صالح")

كيف ستتغير لغة مربع الحوار عند تغيير لغة التطبيق ؟ لحل هكذا مشكلة نلجأ لعمل متغيِّر عام (على مستوى التطبيق) ثم نعدِّل قليلاً على الشيفرة السابقة لتصبح كما يلي

c# :

if(myLang=="A")
{
MessageBox.Show("مختار سيد صالح");
}
else
{
MessageBox.Show("Mukhtar Sayed Saleh");
}

VB :

if myLang="A" then
MessageBox.Show("مختار سيد صالح")
else
MessageBox.Show("Mukhtar Sayed Saleh")
end if

شاهدوا المثال في المرفقات :)

ختاماً , أعتذر عن التقصير بحق هذا الركن الذي تعلَّمت منه الكثير الكثير و أسأل الله تعالى أن يجعل هذا الدرس و سائر ما أكتب خالصاً لوجهه تعالى و أسألكم الدعاء في ظهر الغيب , و السلام عليكم .

MultilanguageApp.zip

2
#2

شكراً لك اخي الكريم على الشرح الممتع والمفيد جدا وان شاء الله نجد منك دروسا أكثر وعطاءا لا ينتهي

تم تعديل هذه المشاركة بواسطة akramKamal في 2 مايو 2009 في 16:21

قولوا لا اله الا الله تفلحوا

ومن يبتغي غير الاسلام دينا فلن يقبل منه وهو في الاخرة من الخاسرين- صدق الله العظيم

#4

والله شرح ممتاز، بارك الله فيك اخي.

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#5

مثال جيد و لكن يجب الإنتباه على إتجاه أزرار التحكم فى شريط العنوان و أيضا العنوان

حيث أنه يجب تعديله لكى تصبح PURE RTL

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#6
نور (محمد نور) كتب:
مثال جيد و لكن يجب الإنتباه على إتجاه أزرار التحكم فى شريط العنوان و أيضا العنوان

حيث أنه يجب تعديله لكى تصبح PURE RTL

هذا ممكن بسهولة ، عن طريق الخاصية Form.RightToLeftLayout

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#7

ألف الف شكر اخي مختار

--==iceDragon==--
ماجستير نظم دعم القرار الذكية IDSS

#8

ال RTL لا تعمل مع كل الادوات و لا تعمل فى معظم ادوات ال Third Party

غالباً مضطرين للعودة و التعامل مع ال Win 32 API مرة اخرى

تم تعديل هذه المشاركة بواسطة طارق إبراهيم في 12 مايو 2009 في 15:22

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#9

ما شاء الله عليك اخي مختار صالح

فين ايا م زمان زمن الفيجوال بيسك 6

الان تعمل عىل C#

الى الامام دائما

#10
طارق إبراهيم كتب:
ال RTL لا تعمل مع كل الادوات و لا تعمل فى معظم ادوات ال Third Party

غالباً مضطرين للعودة و التعامل مع ال Win 32 API مرة اخرى

حتى win 32 api تسبب في كثير من الاحيان مشاكل داخل الكمبوننت, سبب عدم دعم اللغة العربية في ادوات ال third party هو عدم وجود من يشتري هذه المكونات من شركات البرمجة العربية, لذلك لا يهتمون للأمر..

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#11

شكرا لك اخي على هذا الملف

و لكن هذه الطريقة غير عملية

هذه الطرقة تصلح فقط في البارمج الصغيرة فقط

و لا تصلح في المشاريع المتوسطو الكبيرة بسبب

1- مضاعفة نفس العمل لكل لغة : لاحظ انك تظطر الى تكرير اعادة تشكيل العناصر الموجودة داخل النافذة حسب كل لغة وهذا الامر متعب جدا جدا

2- لو اضطررت الى تعديل او حذف او اضافة اي عنصر جديد ( textbox ,combox,..) سوف تظطر الى ااعادة العمل من جديد لكل لغة على حدى

3- ستواجة الى مشكلة في تعريب كل label على حدى و في كل نافذة

لذلك يفضل بعمل كنترول بأن قوم بعمل هذه الامور ( Right To Left) و يقوم بقرأت اللغة العربية من ملف خارجي لكل عنصر

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

و الله في عون العبد ما دام العبد في عون أخيه

#12
طارق إبراهيم كتب:
ال RTL لا تعمل مع كل الادوات و لا تعمل فى معظم ادوات ال Third Party

غالباً مضطرين للعودة و التعامل مع ال Win 32 API مرة اخرى

بالنسبة للأدوات ، هذه المشكلة كانت موجودة سابقاً في الإصدارات الأولى من الدوت نت. لكن منذ الإصدار .Net 2.0 وكل الأدوات تقريباً تدعم RTL، سواء عن طريق الخاصية RightToLeft او RightToLeftLayout.

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#13
اقتباس
بالنسبة للأدوات ، هذه المشكلة كانت موجودة سابقاً في الإصدارات الأولى من الدوت نت. لكن منذ الإصدار .Net 2.0 وكل الأدوات تقريباً تدعم RTL، سواء عن طريق الخاصية RightToLeft او RightToLeftLayout

ممكن تجرب مع ال PictureBox او ال GridView

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#14
اقتباس
ممكن تجرب مع ال PictureBox او ال GridView

هذه الأدوات جميعها تدعم RTL:

- Button

- CheckBox

- CheckedListBox

- ComboBox

- DataGridView

- DateTimePicker

- GroupBox

- Label

- LinkLabel

- ListBox

- ListView

- MaskedTextBox

- MonthCalendar

- NumericUpDown

- PropertyGrid

- RadioButton

- RichTextBox

- StatusStrip

- TabControl

- TextBox

- ToolStrip

- TrackBar

- TreeView

بالإضافة إلى الفورم.

اما الادوات التي لا تدعم RTL فهي قليلة جداً مثل:

- PictureBox

- ToolBar

وما اريد قوله هنا ان كل الأدوات التي نحتاجها غالباً تدعم RTL لذا لا حاجة لـ Win API إلا فيما ندر.

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#15

السلام عليكــم ورحمـة الله وبركاتــه

أساتذتي و أصدقائي

أشكركم على المرور من هنا و أتمنَّى أن تكونوا قد استفدتم من الدرس , هناك نقطة أحب توضيحها هنا ;

لمعرفتي بأنَّ روَّاد هذا الصرح من مستويات مختلفة و لطمعي بالأجر حاولت أن يكون الدرس مختصراً و واضحاً بقدر المستطاع ليستفيد منه أكبر قدر ممكن لكنني لا أدَّعي الكمال في الطريقة و لا أتأستذ على أحدٍ هنا و طمعي الحقيقي في أن يظهر أحد أساتذتنا الحقيقيين و يقدَّم لنا ملحوظة أو معلومة تدفعنا للأمام .

شكراً لكم

#16

السلام عليكم ورحمة الله وبركاته

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

في هذا الرابــــــــــــــــــــــــــــــــــط

بالتوفيق للجميع

مختار أحمد

موقع الويب : http://www.luxorsystems.com

منتدياتنا :http://www.luxorsystems.com/forum/index.php

للمراسلة

luxorsystems@hotmail.com

للاتصال التليفوني

00201228085123

#17

شكرا جزيلا أخي مخنار سيد ,,

وللعلم يعتبر هذا المثال جيد جدا لأي شخص لم يتعامل مع التطبيقات متعددة اللغات (مثلي) ,,,

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

وشكرا جزيلا مرة أخرى

كـلـمـا زاد عـلـمـك لـلـشـئ الـمـجـهـول ..... كـلـمـا زاد جـهـلـك لـلـشـئ الـمـعـلـوم

و كـلـمـا زاد جـهـلـك لـلـشـئ الـمـعـلـوم ..... كـلـمـا زاد شـغـفـك لـعـلـم الـمـجـهـول

الــلـــــــهـــــم عـــلـــمـــنــــــي بـــمـــا يـــنــفــعــنــي وانــفــعــنــي بــمــــا عـــلـــمــتــنـــي

#18

فى المشاريع التى تعتمد على اكثر من لغه تصبح مسأله النصوص مشكله حيث يكون من الصعب استخدام متغير عام لذا فالأفضل دائما هو استخدام الـ Resource File.

لا يمكن جعل الـ Resource File يحتوى على اكثر من لغه للنص الواحد لذا سنقوم بعمل مشروع DLL لكل لغه على حده ما عدا اللغه الرئيسيه للبرنامج فيتم وضع نصوص هذه اللغه داخل الـ Resource File الخاص بالبرنامج، بعد ذلك عندما تريد التعامل مع لغه كل ما عليك هو تحميل الـ DLL الخاص بها و استخدامها.

ملحوظه : عندما تقوم بتغيير واجهة المستخدم من لغه إلى اخرى داخل الـ Designer يقوم الفيجوال ستديو بعمل لك DLL لكل لغه و ستجد انه يحتوى على مواقع الأداوت و خصائص الأداوت و لكنه هو من يقوم بصنعها بدلا منك.

قد تبدو الفكره للمره الأولى صعبه لذا إليكم هذا المثال.

1 - قم بتصميم مشروعك بالكامل بلغه معينه و فى كل مره تحتاج لكتابة نصوص داخل البرنامج قم بإضافتها داخل الـ Resource File و قم بإعطائها اسم معين.

2 - بعد الإنتهاء من البرنامج قم بإنشاء مشروع DLL و قم بإضافة Resource File بداخله ثم انسخ محتويات الـ Strings الموجوده بـ Resource File بالبرنامج ثم الصقها داخل المشروع الـ DLL.

3 - قم بتغير لغة النصوص للغه التى تريدها.

4 - حول المكتبه للصيغه التنفيذيه.

5 - قم بتكرار هذه العمليه مع كل لغه تريد دعمها لبرنامجك.

المثال فى المرفقات و حيث انى مبرمج VB فالمثال بالـ VB.

ملاحظات على المثال:

1 - داخل المثال يتم اظهار رساله حسب اللغه التى تختارها من combobox و لكنى لم اقم بتغيير لا واجهة المستخدم و لا محتوى الكوميو بوكس و لا حتى اسم الـ label الموجود بجانب الكومبو بوكس.

2 - فى المعتاد يوجد فولدر اسمه bin داخل فولدر المشروع و هو يحتوى على فولدر اخر اما debug او release حسب النسخه التى تعمل عليها، و حيث ان هذا البرنامج يحتوى على اكثر من مشروع فلابد من ان يكون فولدر الـ debug و الـ release واحد لكل المشاريع و ذلك حتى استطيع التعامل مع مخرجات كل مشروع بسهوله لذا و داخل خصائص المشروع اختر DebugTab ستجد TextBox ألذى يحتوى على المسار الذى سيتم وضع به النسخه التنفيذيه من البرنامج ايضا يوجد Combox الخاص بنوع العمليه Debug او Release، ستجد انى قمت بتغيير المسار للمشاريع الثلاثه و يتم عمل build تحت فولدر الـ solution مباشره و داخل فولدر بإسم debug او release.

داخل كل من تلك المشاريع قمت بإضافة نص للـ Resource File بإسم WelecomeMessege كل بلغه مختلفه.

البرنامج الرئيسى اسمه MyApp و يحتوى على كومبو بوكس، هذا الكومبو بوكس يوجد بداخله 3 نصوص بنفس الترتيب التالى

العربيه

الإنجليزيه

الفرنسيه

الكود المسئول عن احضار هذه الرساله بأى لغه من الموجودين داخل الكومبو بوكس هو التالى

Imports System.Resources
Imports System.Reflection

Public Class Form1

	Dim LangUI() As String = {"Eng-US.dll", "French.dll"}
	Dim resName() As String = {"EngUS.Resources", "French.Resources"}

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		ComboBox1.SelectedIndex = 0
	End Sub

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		Dim asm As Assembly = Nothing
		Dim resManag As ResourceManager = Nothing

		If ComboBox1.SelectedIndex = 0 Then ' language is arabic
			resManag = My.Resources.ResourceManager
		Else ' language is french or english
			asm = Assembly.LoadFile(Application.StartupPath + "\" + LangUI(ComboBox1.SelectedIndex - 1))
			resManag = New ResourceManager(resName(ComboBox1.SelectedIndex - 1), asm)
		End If

		MessageBox.Show(resManag.GetString("WelcomeMessege"))

		resManag = Nothing
		asm = Nothing

	End Sub
End Class

اولا قمت بعمل المصفوفه LangUI و التى تحتوى على اسماء الملفات الـ dll و التى توجد بداخلها اللغات غير اللغه الرئيسيه للبرنامج.

داخل برنامجك يوجد العديد من الـ Resource File التى لا تعلم عنها شئ بمعنى عندما تقوم بتعديل على فورم معينه فإنها تنشئ لنفسها Resource File بإسمها لتضع به البيانات الخاصه بها ايضا عندما تقوم انت بإضافة بيانات للـ Resource File الموجود بالمشروع فأنت تنشئ Resource File خاص بك.

لكل Resource File من السابقين اسم لا يتكرر، هذا الإسم يأخذ الشكل التالى

RootNamespace.ResourceName.resource

حيث

RootNamespace : هو اسم الـ Namespace الذى يندرج تحته المشروع بأكلمه و يمكنك معرفته من خصائص المشروع.

ResourceName: هو اسم الـ Resource File هذا الإسم يعتمد على منشئه بمعنى اذا قامت Form1 بإنشاء واحد خاص بها فسيكون اسمه Form1 و إذا قامت frmTest بإنشاء واحد لها فسيكون اسمه frmTest، اما إذا قمت انت بوضح بيانات داخل الـ Resources الموجوده بالمشروع فسيكون الـ ResourceName هو Resources

الباقى و هو ".resource" هو مجرد امتداد.

نعود مره اخرى للبرنامج، قمت بعمل مصفوفه اسمها resName و تحتوى على الـ ResourceName الذى قمت بعمله و الموجود بكل مكتبه على حدى.

الأن داخل الـ Button1_Click قمت بكتابة الكود التالى

		Dim asm As Assembly = Nothing
		Dim resManag As ResourceManager = Nothing

		If ComboBox1.SelectedIndex = 0 Then ' language is arabic
			resManag = My.Resources.ResourceManager
		Else ' language is french or english
			asm = Assembly.LoadFile(Application.StartupPath + "\" + LangUI(ComboBox1.SelectedIndex - 1))
			resManag = New ResourceManager(resName(ComboBox1.SelectedIndex - 1), asm)
		End If

		MessageBox.Show(resManag.GetString("WelcomeMessege"))

		resManag = Nothing
		asm = Nothing

فى البدايه قمت بتعريف متغيرين احداهما من نوع Assembly و يمثل الـ DLL التى تحتوى على الـ Resource المراد التعامل معه و الأخر من نوع ResourceManager و هى الفئه المسئوله عن التعامل مع الـ Resources.

بعدها اقوم بمعرفة العنصر الذى تم اختياره داخل الكومبوبوكس فإذا كان 0 فهذا يعنى ان المستخدم اختار اللغه العربيه اى اللغه الإفتراضيه و هذا يعنى انه لا داعى للتعامل مع اى dll و بالتالى فأنا اجعل الـ resManag هو نفسه My.Resources.ResourceManager.

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

Application.StartupPath + "\" + LangUI(ComboBox1.SelectedIndex - 1)

قمت بإنقاض الـ SelectedIndex بواحد لإن المصفوفه اول لغه بها هى الإنجلبيزيه و رقمها 0 اما نفس اللغه داخل الـ Combox فرقمها 1 و بالتالى الكومبوبوكس يزيد عن المصفوفه بواحد لذا قمت بإنقاصها.

بعد ذلك قمت بدمج المسار الحالى للبرنامج مع علامة backslash مع اسم المكتبه التى سيتم العوده بها من المصفوفه.

فى النهايه يتم تمرير هذا المسار لـ Assembly.Load و يتم وضع الناتج داخل المتغير asm.

بعد ذلك قمت بإنشاء نسخه جديده من الفئه ResourceManager و قمت بتمرير لها اسم الـ Resource ألذى اريد تحميله داخلها ايضا قمت بتمرير asm لإنه هو الذى يحتوى على الـ Resource الواجب التعامل معها.

فى النهايه قمت بإستدعاء الداله MessageBox.Show و قمت بتمرير لها

resManag.GetString("WelcomeMessege")

و الذى سيعود بالنص من داخل الـ DLL الذى تم تحميلها داخل asm.

داخل المشاريع الكبيره يتم عمل فئه تكون مسئوله عن تحميل الـ DLLs و احضار الـ Reources منها و كل ما على انا كمبرمج ان استخدم خاصيه readonly التى تعود لى بالنص الذى اريده.

MultiLang.rar

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 23 سبتمبر 2009 في 10:12

مدونتي: C++ Tips and Tricks

#19

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

#20
مختار سيد صالح كتب:

السلام عليكم و رحمة الله و بركاته

كان أحد الإخوة في المنتدى قد طلب منِّي أن أكتب شرحاً لكيفيّة عمل تطبيق متعدِّد اللغة Multilanguage application

و لعلِّي أحاول تلبية رغبته في هذا الدرس المختصر جدَّاً .

كيف نصنع تطبيق متعدِّد اللغة ؟

في البداية و قبل كل شيء يجب أن نتوجَّه بالشكر الكبير لحبيبتنا Microsoft على ما تقدمه لعشَّاقها المبرمجين من تسهيلات مستمرَّة ;

لا أزال أذكر عندما أردتُ عمل تطبيق متعدِّد اللغة لأوَّل مرَّة باستخدام فيجوال بيسك 6 أو C++ , الموضوع كان في غاية الصعوبة

إن قُورِنَ بالطريقة الجديدة التي قدَّمتها Microsoft (حبيبتنا) مع بيئة التطوير Visual Studio و إطار العمل دوت نت.

حيث أصبح يمكن أن نقول لك كمبرمج يريد عمل تطبيق متعدِّد اللغات

1- أنشئ مشروعاً جديداً و أبدأ بعمل نافذة للتطبيق باللغة العربيَّة .

1.gif

2- اختر الخاصيّة Localizable للنافذة و اجعلها مساويةً لـ True

2.gif

3- اضبط الخاصيَّة Language على Arabic و لا تقم بتغيير تصميم النافذة (لأنَّك صممتها بالعربيّة أصلاً :) ) .

4- اضبط الخاصيَّة Language على English و عدِّل على النافذة الموجودة بحيث تصبح ملائمة للغة الإنجليزيّة .

3.gif

5- إلى هنا نكون قد أنهينا كامل العمل تقريباً بدون أن نكتب أي تعليمة برمجيَّة ! (أين أيَّامك يا .ini :) )

6 - لتغيير اللغة :

أ - لا بدَّ من استيراد فضائي الأسماء

System.Threading

c# : System.Globalization

using System.Threading;
using System.Globalization;

VB :

Imports System.Threading
Imports System.Globalization

ب - لتغيير اللغة نكتب الكود التالي :

c# :

Thread.CurrentThread.CurrentUICulture = new CultureInfo("EN-us");

VB :

Thread.CurrentThread.CurrentUICulture = new CultureInfo("EN-us")

ملحوظة : السطر السابق كفيل بتغيير اللغة إلى الإنجليزيّة حيث أن الوسيط بشكل عام هو أوَّل حرفين من اللغة ثمَّ - ثمَّ أوَّل حرفين من الدولة , مثلاً

نستطيع أن نكتب

AR-sy (العربيّة - سوريا)

FR-fr (الفرنسيّة - فرنسا)

و التغييرات لن تظهر على النافذة التي تم استدعاء السطر البرمجي بها , إلَّا إن قمنا بإعادة رسم النافذة .

6 - إلى هنا نكون قد أنتهينا من إنشاء تطبيق متعدد اللغة , دعني أقول مجازاً تطبيق ذو واجهة متعددة اللغة :) , لماذا ؟

ماذا لو كان لدينا في التطبيق أحد الإجرائيَّات التي تقوم بالتالي :

c# :

MessageBox.Show("مختار سيد صالح");

VB :

MessageBox.Show("مختار سيد صالح")

كيف ستتغير لغة مربع الحوار عند تغيير لغة التطبيق ؟ لحل هكذا مشكلة نلجأ لعمل متغيِّر عام (على مستوى التطبيق) ثم نعدِّل قليلاً على الشيفرة السابقة لتصبح كما يلي

c# :

if(myLang=="A")
{
MessageBox.Show("مختار سيد صالح");
}
else
{
MessageBox.Show("Mukhtar Sayed Saleh");
}

VB :

if myLang="A" then
MessageBox.Show("مختار سيد صالح")
else
MessageBox.Show("Mukhtar Sayed Saleh")
end if

شاهدوا المثال في المرفقات :)

ختاماً , أعتذر عن التقصير بحق هذا الركن الذي تعلَّمت منه الكثير الكثير و أسأل الله تعالى أن يجعل هذا الدرس و سائر ما أكتب خالصاً لوجهه تعالى و أسألكم الدعاء في ظهر الغيب , و السلام عليكم .

السلام عليكم جزاك الله خيرا فعلا معلومة مفيدة

عندى سؤال اتمنى يكون فى جواب عند حضرتك

اريد انا اعمل تطبيق يقوم بالترجمة ادخل له الاسم يقول بترجمته

1
#21

السلام عليكم تحية لصاحب الموضوع ولكل المتفاعلين.

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

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

1- لجوءك لإستخدام قاعدة if لتميز بين لغتين

2- كيف لو مشروعي أريد أن أجعله عالمياً وأريد ألا أقيد عدد الترجمات به لإثنين فقط؟؟؟؟

الحل من خلال بحثي أيضاً ومشاهداتي لبعض البرامج البسيطة السلسة مع اقتراحات من عندي

عمل ملف يحوي الترجمات يقوم برنامجي بتحميله عند التشغيل يحوي كل المعلومات عن اللغة مثل إتجاه اللغة Direction وكذا رمز اللغة EN-us واسم الملف هو اسم اللغة ليساعدك في localization الخاص بالعملات والأرقام ولغة الإدخال بالبرنامج

يحتوي الملف على كلمات مفتاحية ثابتة في كل الملفات ومقابلها الترجمة

يمكنك استخدام serialization xml or binary كما يمكنك استخدام نص وثيقة xml

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

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Application.MainForm.Menu.OpenMenu txt="Open"/>
  <Application.Exceptions.FileNotFound txt="Sorry the file can't be found"/>
</Root>

طريقتي المفضلة

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Application>
    <MainForm>
      <Menu>
        <Open value="إفتح"/>
        <Print value="طباعة"/>
        <Exit value="خروج"/>
        .
        .
        .
      </Menu>
      <Buttons>
        <Btn1  value="إجراء 1"/>
        <Btn2 value="إجراء 2"/>
        .
        .
        .
      </Buttons>
    </MainForm>
    <AccountingForm>
      .
      .
      .
    </AccountingForm>
    <Settings>
      <UserManagementForm>
        <Roles value="الصلاحيات">
          <SuperAdmin value="المدير العام"/>
          <AccountingAdmin value="مدير الحسابات"/>
          <Accountant value="محاسب"/>
          <SalesAdmin value="مدير المبيعات"/>
          <SalesMan value="بائع"/>
        </Roles>
        .
        .
        .
      </UserManagementForm>
    </Settings>
    <Exceptions>
      <FileNotFound value="الملف غير موجود"/>
      <NoPermission valu="ليس لديك صلاحية للوصول لهذا الجزء من البرنامج"/>
    </Exceptions>
    <GeneralCommands>
      .
      .
      .
      .
    </GeneralCommands>
  </Application>
</Root>

السيناريو للعمل

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

حينما نريد الوصول مثلاً للصلاحية SuperAdmin نكتب التالي

string superAdmin =Program.Translator["Application.Settings.UserManagementForm.Roles.SuperAdmin"];

طبعاً ستستخدم المعلومات المخزنة عن اتجاه اللغة يمين لليسار أو العكس وتغير اتجاه أدواتك

هذا سيأتيك بالنص باللغة المختارة

ويمكنك كتابة دالة extension للفورم اسمها بسيط وليكن _ تصل هي أوتوماتيكياً للكلاس السابق وترجع النص وبالتالي نصوص الأزرار ونصوص الأدوات يمكن أن تكون كذلك

Btn1.Text=_("Application.MainForm.Buttons.Btn1");

عليك كتابة الكلاس الذي يؤدي الترجمة انها مهمة الباحث

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

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

يمكنك كتابة آداة تتبع كل النصوص في السورس كود تبعك وتنتج لك بنية ملف الترجمة للتسهيل وتتيح لك استبدال النص بين علامتي التنصيص ب _() حيث أن لغة المشروع الأساسي واحدة انجليزية وأحصل منه على نسخة وأعدل فيها لتوائم الترجمة وتوزع النسخة المنتجة

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

هذا التعليق لن يفيد من يريد أن يقص ويلصق إنما هو فكرة تفيد من يفكر

لم أكتب ولا مشروع حتى الآن بالإعتماد على هذه التقنية مع أنها جاهزة إلا أنها تحت التجربة والتطوير.

تم تعديل هذه المشاركة بواسطة أبو هاشم المصري في 28 أغسطس 2012 في 01:47

1
Electrical communications and electronics engineer

C++ Developer

 


stackoverflow profile : http://stackoverflow.com/users/249120/ahmed-safan


 


Just Keep Moving On , never stop until you are dead


مواضيع مشابهة