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

تصميم صفحات ASP.NET بدعم للغات متعددة

مغلق
بدأه DotNetExpert في 12 فبراير 2005 · 3 رد · 1,128 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ان دعم لغات متعددة في مواقع الانترنت بدأ بالتحول الى سمة مميزة للمواقع الكبيرة والتي تريد ان تستقطب اكبر شريحة من الزوار.

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

الطريقة هنا تعتمد على استخدام ملفات الموارد Resources وهي ملفات يمكن تضمينها ضمن اي اسمبلي وتحتوي على بيانات كنصوص او صور يحتاجها البرنامج.

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

الخطوة الاولى هي اضافة ملفات الموارد الى المشروع ضمن الفيجوال ستوديو؛ ملف لكل لغة تريد أن تدعمها في موقعك.

(لن اتظرق هنا الى تطبيق هذه الطريقة دون استخدام فيجوال ستوديو)

فمثلا يجب ان يكون اسم الملف الافتراضي الذي يحتوي على النصوص للاستخدام بشكل افتراضي في حالة عدم التعرف على لغة المستخدم filename.resx

كما يجب اضافة ملف الى المشروع لكل لغة اخرى بحيث يكون اسم الملف filename.language.resx

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

العربية والالمانية بالاضافة الى الانكليزية كلغة افتراضبة

أي أنني أحتاج الى اضافة الملفات التالية الى المشروع

String.resx
Strings.de.resx
Strings.ar.resx

لاضافة هذه الملفات فقط اضغط بالزر اليمين على المشروع واختر اضافة ملف جديد ثم اختر نوع الملف موارد(Assembly Resource ) واعطه الاسم المناسب.

بالنسبة الى المشروع المثال فهو سيحتوي على العناصر التالية

رز من أجل تغير اللفة

مربع نص من اجل اظهار رسالة

وازرار راديو لاختيار اللفة

protected System.Web.UI.WebControls.Button btnChangeLanguage;
protected System.Web.UI.WebControls.TextBox tbGreetings;
protected System.Web.UI.WebControls.RadioButtonList rblLanguages;

بالنسبة لازرار الاختيار فقد قمت بشكل يدوي باضافة ثلاثة ازرار واحد لكل لغة على الشكل التالي.

 
<asp:RadioButtonList id="rblLanguages" runat="server">
	<asp:ListItem Value="en">en</asp:ListItem>
	<asp:ListItem Value="de">de</asp:ListItem>
	<asp:ListItem Value="ar">ar</asp:ListItem>
</asp:RadioButtonList>

الآن وبد أن اضفنا هذه العناصر نحن بحاجة الى اضافة الترجمات التي نحتاجها الى كل ملف

موارد حسب اللغة. العناصر التي سنضيفها الى ملفات الموارد هي

tbGreetings
btnChangeLanguage
de
ar

العنصر الاول هو الرسالة الترحيبية العنصر الثاني هو النص الذي سيظهر على رز تغيير اللغة والعناضر الباقين هم اسماء اللغات المدعومة.

الآن وبعد ان اضفنا هذه العناصر الى ملفات الموارد واضفنا الترجمة

ناتي الى الخطوة التلية وهي تحديد لغة المستخدم عن طريق

string sLang = Request.UserLanguages[0];
Thread.CurrentThread.CurrentCulture = 
CultureInfo.CreateSpecificCulture(sLang);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(sLang);

الآن سوف ننتقل الى ملئ الصفحة بالنص المناسب حسب اللغة المستخدمة

أول نحتاج الى ResourceManager من أجل الوصول الى الموارد المخزنة في الاسمبلي

protected ResourceManager gStrings = new 	 ResourceManager("MulitLing.Strings",(typeof(WebForm1)).Assembly);

بعد ذلك سوف نقوم بتغير النص بشكل هرمي (recursive ) لجميع عناصر الصفحة Controls . وذلك حسب نوع العنصر فمثلا من اجل حقول النص سنغير الخاصية Text بينما لل ListItem سوف نغير Value.

من اجل ذلك سنحتاج الى الطريقة التالية

public void SetStringsRecursive(System.Web.UI.ControlCollection cons)
{
	TextBox tb;
	Button btn;
	RadioButtonList rbl;
	foreach  (System.Web.UI.Control con in cons)
	{
  if ((tb = con as TextBox) != null)
  {
 	 string s = gStrings.GetString(tb.ID);
 	 if (s != "" )
    tb.Text = s;
 	 
  }


  else if ( (btn = con as Button) != null)
  {
 	 string s = gStrings.GetString(btn.ID);
 	 if ( s != "")
    btn.Text = s;
  }


  else if( (rbl = con as RadioButtonList) != null)
  {
 	 foreach (ListItem li in rbl.Items)
 	 {
    string s = gStrings.GetString(li.Value);
    if ( s != "")
   	 li.Text = s;
 	 }
  }
  SetStringsRecursive(con.Controls);
	}

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

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

private void Page_Load(object sender, System.EventArgs e)
{
	// Hier Benutzercode zur Seiteninitialisierung einfügen
	if (! IsPostBack)
	{
  string sLang = Request.UserLanguages[0];

  Thread.CurrentThread.CurrentCulture = 
 	 CultureInfo.CreateSpecificCulture(sLang);

  Thread.CurrentThread.CurrentUICulture = new CultureInfo(sLang);	

  SetStringsRecursive(this.Controls);
	}
}

كل ما بقي لدينا الآن فعله هو اضافة معاجل حدث ضفط زر تغيير اللغة.

private void btnChangeLanguage_Click(object sender, System.EventArgs e)
{
	string sLang = (rblLanguages.SelectedIndex != -1)? rblLanguages.SelectedValue :  Request.UserLanguages[0];

	Thread.CurrentThread.CurrentCulture = 
  CultureInfo.CreateSpecificCulture(sLang);

	Thread.CurrentThread.CurrentUICulture = new CultureInfo(sLang);	
 	 SetStringsRecursive(this.Controls);
}

هذه هو كل المطلوب. الآن شغل البرنامج واستمتع بدعم اللغات المتعددة

المشروع كاملا مرفق مع الموضوع

تحياتي

DotNetExpert

MulitLing.rar

وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان

بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي

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

برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي

يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو

http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3

#2

مقال رائع جدا يا DotNetExpert .. ولكن لاحظت شيء غريب :s

// Hier Benutzercode zur Seiteninitialisierung einfügen

لو سألتني إذا بعرف ألماني ما رح أحكيلك ja :D

لكن فتحت عيوني على نقطة مهمة في موضوع ال Threading الي رح أركز عليها قريبا بعد أن تنتهي معي أزمة الوقت!

تحياتي لك دائما

You can fly while you can touch the sky

#3

انا ما دخلني ...... هاد الفيجوال ستودية عندي, هو بيحكي الماني :D :D :D

شكرا لك كثيرا يا محمد.

انني اعتز بشهادتك كثيرا.

عسى أن تكون نتيجة تركيزك مقالة يستفيد منها القسم :D

وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان

بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي

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

برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي

يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو

http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3

#4

مقالة رائعة بحق :)

عند تشغيل البرنامج أعطاني :

Access denied to 'c:\inetpub\wwwroot\MulitLing\web.config'. Failed to start monitoring file changes.

؟؟

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

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