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

تغيير لغة واجهة الربنامج

مغلق
بدأه nano19 في 30 يناير 2006 · 10 رد · 3,836 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام عليكم

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

شكرا

#2

هذا الموضوع بسيطا جدا خصوصا اذا كنت تستخدم الـ Visual Studio.

كل ما عليك فعله هو قبل اضافة الأدوات للـ Form أن تقوم بعمل الخاصيه Localizable بـ true من نافذة الخصائص. وأيضا تجعل الخاصيه Language بـ Default.

أضف ما تريده من أدوات على الفورم. على سبيل المثال قم باضافة Button واجعل الـ Text بتاعه مثلا " Click here ".

بعد الانتهاء من اضافة الأدوات وتسميتها. قم بتغيير اللغه الموجوده في الخاصيه Language الخاصه بالفورم الى اللغه التي ترغب بها. مثلا اختار Arabic.

بعد تغيير اللغه قم بتغيير ما تريده في الفورم على حسب اللغه التي اخترتها. مثلا في مثالنا هذا قم بتغيير خاصية الـ Text الخاصه بالـ Button الى " اضغط هنا " بدلا من " Click here ".

الآن أنت لديك Resource باللغه العربيه وآخر خاص للغه الافتراضيه Default غير العربيه .. اذا أردت اضافة لغات أخرى فأعد تنفيذ الخطوات.

الآن عندما يفتح المستخدم البرنامج وتظهر له الفورم فستظهر له النسخه الـ Default ( التي كتبنا فيها "Click Here") ولكن نحن نريد هنا اذا كان المستخدم عربيا أن تفتح له الفورم وتكن الأشياء الموجوده بها مكتوبه باللغه العربيه , فكيف نفعل ذلك ؟

أولا يتم معرفة اذا كان المستخدم عربي أم لا من خلال معرفة اعداداته ومعرفة ما اختاره في الـ Regional and Language Options الموجوده في الـ Control Panel :

اكتب الكود قبل Application.Run في مثالنا هذا :

System.Globalization.CultureInfo userCurrentCul = System.Threading.Thread.CurrentThread.CurrentCulture;

من خلال الكود السابق عرفنا لغة المستخدم ومكانه , فلو أنت وضعت نفس اعداداتي فستكون الـ userCurrentCul هى ar-Eg أى اللغه العربيه ومكاني هو مصر.

الآن لم يبقى لنا شئ بعد معرفتنا بثقافة المستخدم الا أن نجعل برنامجنا يعمل بالـ userCurrentCul التي هى تماما اللغه التي اختارها المستخدم من الـ Control Panel :

اكتب الكود هذا بعد الكود السابق :

System.Threading.Thread.CurrentThread.CurrentUICulture = userCurrentCul;

في الكود السابق قمت بتغيير الـ CurrentUICulture الخاصه بالـ Thread الحالي, بالـ Culture التي كان المستخدم قد اختراها من الـ Control Panel.

الآن قبل أن تفتح البرنامج تأكد من أنك اخترت في الـ Control Panel اللغه العربيه الخاصه بأى مكان .. مثلا Arabic Egypt أو Arabic Oman أو Arabic Qatar ... الخ. ثم افتح البرنامج ستجد أن الـ Text الخاص بالـ Button هو " اضغط هنا ".

واذا كانت الثقافه غير عربيه مثل French France أو Εnglish United States أو أى شئ غير عربي. ستجد أن الـ Text الخاص بالـ Button يكون " Click here ".

الآن انتهينا ولكن هناك ملحوظات , فلاحظ أن البرنامج لن يغير الجمل المكتوبه على الفورم الا بتحديد الـ CurrentUICulture بالثقافه التي تريدها.

أيضا يوجد فرق بين الـ CurrentCulture و CurrentUICulture , فالأولى خاصه بالثقافه التي على أساسها يتم تحديد العمله وكيفية اظهار التواريخ والترتيب ربما وهذه الأشياء. أما الثانيه فهى الخاصه بالثقافه التي على أساسها يتم اظهار الجمل والنصوص على الـ User Interface وهى واضحه من اسمها.

أيضا في المثال هذا وضحت ما سألت أنت عنه وهو كيفية جعل هناك لغتين. بجانب هذا فاعلم أنه يمكنك أن تقوم بعمل شكل مختلف لبرنامجك على حسب كل لغه وعلى أيضا على حسب كل مكان ,, فمثلا يمكنك أن تجعل الـ Text الخاص بالـ Button في مثالنا هذا يكون " اضغط هنا " وذلك لجميع العرب. ويكون مثلا للمصريين بالذات " دوس هنا " ويكون للسعوديين مثلا " دش هون " والخ :P ... ويتم ذلك عن طريق طريق اختيار اللغه أولا Arabic من نافذة الخصائص كما فعلنا في المثال السابق وجعل الـ Text الخاص بالفورم " اضغط هنا " وذلك يكون لكل العرب من كل مكان , وبعد ذلك تختار لغه ومكان آخر ( ثقافه ) مثل Arabic Egypt وتجعل الـ Text الخاص بالـ Button مثلا " دوس هنا ياعم " وهكذا. :)

أيضا يمكنك أن تقم أنت بتحديد الـ CurrentUICulture لـ Culture مختلفه عن المختاره الآن من قبل المستخدم في الـ Control Panel ... مثلا لجعلها عربيه تماما وتجنب ما اختاره المستخدم في الـ Control Panel :

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ar");

ولجعلها مثلا عربيه مصريه بغض النظر عن اعدادات المستخدم في الـ Control Panel ::

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ar-EG");

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

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#3

عذراً سأتطفل بسؤال :

إن كانت الإعدادات في ControlPanel /Advanced للغة الواجهه في "Non-Unicode Program Language " ليست اللغة العربية والنظام بالانجليزية مثلاً , طبعاً اللغة العربية مضافة .. هل ستظهر الواجهه العربية بالشكل السليم بالطريقة المذكورة ؟

تم تعديل هذه المشاركة بواسطة cipher في 31 يناير 2006 في 06:53

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#4

نعم يا أخ cipher ستظهر بطريقه طبيعيه , فيمكن أن تكون اللغه أو الثقافه للبرامج الـ Non-Unicode على النظام = أى ثقافه أو أى لغه ولن تؤثر.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#5

شكراً

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

لكن ... لو الزبون ما عنده framework البرنامج كيف سيشتغل ؟؟ :s

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#6

مشكور على الشرح ..

ولكن عندي سؤال : هذه الطريقة تنفع عندما يتم كتابة الكود قبل ال Applicztion.Run()

ولكن ماذا اذا أردنا تغيير اللغة بعد ال Run !!

:unsure:

#7

العفو يا cipher , أنا توقعت أن سبب سؤالك ( الذي وجدته غريبا في الوهله الأولى ! ) هو أنك كنت تواجه مشاكل في نفس هذا الموضوع عند استخدام لغات أخرى.

وبالطبع برامج الدوت نت لا تعمل الا بوجود الدوت نت فراموورك :)

بالنسبه لسؤالك يا baha_ashour فالذي يحدث عندما تختار لغات أخرى , تقوم الفيجوال ستوديو بدلا عنك بعمل Resources لكل اللغات المستخدمه. وفي الـ InitializeComponent تقوم هى أيضا بدلا عنك باستدعاء قيم الخواص الخاصه بكل Control على الـ Form من ملف الـ Resource المناسب الخاص بالثقافه الموجوده في الـ CurrentUICulture.

مثلا بدون استخدام الـ Localization , حين نقوم بعمل Button جديد مثلا ونسند له بعض الخواص , فالفيجوال ستوديو تكتب أشياء كذلك بطريقه صريحه Hard-Coded في الدالهInitializeComponent ::

this.yourButton.Name = "yourButtonName";
this.yourButton.Text = "yourButtonText";
الخ ...

ولكن عند استخدام الـ Localization الأمر يختلف فلن تكتبهم الفيجوال ستوديو بطريقه صريحه ولكن تستدعي قيمهم من الـ Resource المناسب , مثلا :

this.yourButton.Text = resources.GetString("yourButton.Text");
... الخ ...

أى أن العمليه كلها تحدث في الـ InitializeComponent ( التي يتم استدعائها في الـ Constructor ) ولذلك أنا في المثال أكتب الكود الذي يحدد الـ CurrentUICulture قبل Application.Run ( التي تقوم بعمل أوبجكت جديد من الفورم أى تقوم بتشغيل InitializeComponent ) حتى يتم عمل كل شئ من اسناد القيم للـ Controls من ملفات الـ Resources قبل ظهور الفورم. أى حتى يعرف البرنامج ماهى الثقافه قبل البدء بعمل Initialize.

ولذلك اذا أردت أن تقوم بتغيير اللغه والفورم مفتوحه , فيمكنك ذلك بكتابة الأكواد الخاصه بوضع القيم للـ Controls الموجوده على الفورم كما تفعل الفيجوال ستوديو في InitializeComponent !

أى اذا كان لديك مثلا Button لتغيير اللغه الى اللغه العربيه , يمكنك عمل ذلك :

System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(yourFormObject));
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ar");
this.yourButtton.Text = resources.GetString("yourButtton.Text");
// والخ لباقي الـ Controls والخواص ...

ولكن الكود السابق أصلا تم كتابته مسبقا من قبل الفيجوال ستوديو داخل InitializeComponent , فلا داعي لتكراره ثانية .. فيمكنك أن تحدد الـ CurrentUICulture وتقم باستدعاء الداله InitializeComponent نفسها ! ولكن باستدعائها سيتم اضافة الـ Controls مرة أخرى ويصبح عندك من كل Control اثنتان واحده بالـ Culture القديمه وواحده بالجديده :) ولتفادي ذلك يمكنك أن تستدعي this.Controls.Clear قبل استدعاء InitializeComponent.

عموما لا أحد يفعل شئ مما ذكرته الا قليلا , فمعظم البرامج يختار فيها المستخدم اللغه من خلال نافذه مستقله وهذا أثناء مثلا عمل Configuration للبرنامج في مرحلة الاعداد مثلا أو التنصيب. أو من خلال نافذه أخرى في البرنامج وبعد ذلك يتم اغلاق واستدعاء النافذه المطلوبه مع اسناد اللغه التي اختارها المستخدم لخاصيه مثلا معينه جديده في الفورم أنت قم باضافتها لها أو تمريرها للـConstructor الخاص بالفورم اذا قمت بعمل مثلا Overload له أو الخ. فيوجد أيضا أكثر من طريقه.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#8

مشكور والله يعطيك ألف عافية ...

الفكرة وصلت :)

#9

بارك الله فيكم اخواني ..

:)

#10

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

بجد موضوع جميل ومفيد جدا

جزى الله عنا الأخ معتز شمس وباقي الأخوة الكرام

Name : Ahmed H. Alawady

Web Site : Alawady.info

Email : alawady_ahmed@hotmail.com

Tel : +2 012 345 6808

#11

شكرا أخ معتز

انا عملت الطريقت تعت حضرتك والحمد لله زبطت بس لما اعمل Setup للمشروع ما زبطت

منتظر ردك وشكراً لكم جميعا

هذا الموضوع مغلق.

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