ان دعم لغات متعددة في مواقع الانترنت بدأ بالتحول الى سمة مميزة للمواقع الكبيرة والتي تريد ان تستقطب اكبر شريحة من الزوار.
في هذا الموضوع سوف نتعرف على الاسلوب المتبع في غالبية برامج برامج الدوت نت من أجل دعم لغات متعددة سواءا أكان ذلك في تطبيقات الانترنت او في تطبيقات ويندوز.
الطريقة هنا تعتمد على استخدام ملفات الموارد 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