امروزه سایت ها چند زبانه در اینترنت از اهمیت فراوانی برخوردادر هستند ، علاوه بر اینکه بازدیدکنندگان خود را وسعت داده اید کار موتور های جستجو را نیز برای جستجو راحت تر کرده اید .
در سایت های استاتیک (ایستا) ایجاد یک سایت چند زبانه بسیار مشکل بوده و کل سایتی که طراحی کرده اید را باید کپی کرده و آن را ترجمه نمایید ، علاوه براین برای تغییر هر قسمت زمان زیادی از شما گرفته خواهد شد .
خوشبختانه در Asp.NET امکانات بسیار جالبی برای ایجاد یک سایت چند زبانه در نظر گرفته شده است .
نکات زیر برای یک سایت چند زبانه نیاز است :
- ظاهر سایت برای زبان های راست به چپ (RTL) و چپ به راست (LTR)
- متن های ثابت سایت (مانند کلمات : تایید ، انصراف و....)
- متن های داینامیک سایت که از بانک اطلاعات بازخوانی خواهد شد .
- دکمه تغییر زبان
برای شروع کار یک پروژه به نام MultyLanguage ایجاد نمایید ، یک بانک اطلاعاتی نیز برای ذخیره محتوای سایت ایجاد نمایید .
یک پوشه به نام Theme ایجاد نموده و دو پوشه دیگر به نام های RTL و LTR نیز به این پوشه اضافه کنید ، داخل این پوشه ها تم های سایت شما قرار خواهد گرفت .
بنابراین بنده یک پوشه دیگر به نام Theme1 به هر یک از این پوشه ها اضافه کردم و داخل هر کدام یک فایل Css قرار دادم که چینش سایت را مشخص می نماید .
خوب حال به سراغ بخش دوم یعنی متن های ثابت سایت می روید ، این بخش را توسط GlobalResource ها انجام خواهیم داد .
برای اینکار وارد منوی WebSite و سپس Add Asp.NET Folder و سپس App_GlobalResources را انتخاب نمایید ، با انتخاب این گزینه یک پوشه با این نام به پروژه شما اضافه خواهد شد .
بر روی این پوشه کلیک راست نموده و گزینه Add New Item را انتخاب نمایید ، از لیست آیتم های موجود آیتم Resource File را انتخاب کرده (Resource.resx) و دکمه Add را بفشارید .
حال دوباره این عمل را تکرار کرده و سه فایل Resource دیگر با نام Resource.fa.resx و Resource.en.resx و Resource.ar.resx به ترتیب برای زبان های فارسی ،انگلیسی و عربی اضافه نمایید .
یکی از فایل اضافه شده (مثلا Resource.fa.resx) را باز نمایید این فایل دارای یک جدول با سه ستون Name و Value و Comment می باشد .
به عنوان مثال مقادیر زیر وارد این جدول نمایید :

و برای فایل Resource.en.resx نیز مقادیر زیر :

و به همین ترتیب برای فایل زبان عربی...
خوب حال به سراغ قسمت سوم یعنی بانک اطلاعاتی می رویم ، یک جدول به نام TBLContents به بانک اطلاعاتی خود به صورت زیر اضافه کنید .

و به عنوان مثال رکورد های زیر را اضافه نمایید :

خوب حال کمی کد نویسی می کنیم .
فایل Global.asax را به پروژه اضافه کنید ، فضا نام های زیر را اضافه نمایید :
<%@ Import Namespace="System.Globalization" %>
<%@ Import Namespace="System.Threading" %>
و در رویداد Application_BeginRequest به صورت زیر کد نویسی کنید :
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.Cookies["mylang"] == null)
{
HttpCookie mylang = new HttpCookie("mylang");
mylang.Value = "fa";
mylang.Expires = DateTime.Now.AddYears(1);
Response.Cookies.Add(mylang);
}
Thread.CurrentThread.CurrentUICulture = new CultureInfo(Request.Cookies["mylang"].Value);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.Cookies["mylang"].Value);
}
کد های فوق کوکی mylang را چک می کند ، اگر این کوکی وجود نداشته باشد آنرا ایجاد کرده و مقدار پیشفرض fa را وارد آن می کند ، این بخش زبان پیشفرض سایت شما را تعیین می کند ، شما میتوانید آنرا به en یا ... تغییر دهید .
در خط ها بعد زبان پیشفرض سیستم تعیین می گردد ، این کدها GlobalResource مرتبط را بارگزاری می نماید .
کار ما با فایل Global.asax تمام است .
یک فایل به نام Hello.aspx به پروژه اضافه نمایید ، قبل از هر چیز لینک Css را اضافه نمایید :
<head runat="server">
<link href="Theme/RTL/Theme1/StyleSheet.css" rel="stylesheet" type="text/css" runat="server"
id="MyCss" />
</head>
ذقت نمایید که خاصیت runat را برابر server قرار داده و یک id (مثلا MyCss) برای آن تعیین نمایید .
در متد Page_Load کد زیر را وارد نمایید :
protected void Page_Load(object sender, EventArgs e)
{
MyCss.Href = "Theme/" + GetGlobalResourceObject("resource", "SiteDir") + "/Theme1/StyleSheet.css";
}
متد GetGlobalResourceObject مقدار SiteDir را از GlobalResource جاری دریافت می کند ، بنابراین تم مربوط به RTL یا LTR لود خواهد شد .
البته شما میتوایند مقدار Theme1 را نیز از کوکی یا دیتابیس یا هرجای دیگر بخوانید ، که خارج از بحث این مقاله است .
حال به سراغ صفحه Hello.aspx می رویم ، یک Label برای نمایش پیام خوش آمدگویی به صفحه اضافه کنید ، طبق تصویر زیر وارد خاصیت Expressions شده و خاصیت Text آن را به فایل resource و گزینه Welcome بایند می کنیم :

و به همین ترتیب برای دکمه تایید .
حال میخواهیم با کلیک بر روی دکمه تایید اطلاعات زبان جاری از بانک اطلاعاتی دریافت و داخل صفحه نمایش داده شود :
در رویداد مربوط به کلیک شدن دکمه تایید ، کد های مربوط به دریافت اطلاعات از بانک را به صورت زیر می نویسم :
protected void btnSubmit_Click(object sender, EventArgs e)
{
using (SqlConnection objCon = new SqlConnection(ConfigurationManager.ConnectionStrings["Con"].ConnectionString))
{
using (SqlCommand objCmd = new SqlCommand("select Contents From TBLContents Where Lang=@Lang", objCon))
{
objCmd.Parameters.AddWithValue("@Lang", Request.Cookies["mylang"].Value);
objCon.Open();
object objScaler = objCmd.ExecuteScalar();
if (objScaler != null)
LblContent.Text = objScaler.ToString();
objCon.Close();
}
}
}
در کد فوق اطلاعات از بانک اطلاعاتی با شرط بر روی زبان دریافت و در لیبل نمایش داده می شود .
تنها چیزی که باقی مانده دکمه های تغییر زبان است ، سه عدد LinkButton به صفحه اضافه کنید ، خاصیت CommandArgumant را برابر زبان مورد نظر قرار دهید (fa ، en ، ar) و رویداد Command هر سه را به یک ساب روتین متصل کنید (البته میتوانید به دلخواه خود این قسمت را کد نویسی کنید) :
protected void LnkLang_Command(object sender, CommandEventArgs e)
{
HttpCookie mylang = new HttpCookie("mylang");
mylang.Value = e.CommandArgument.ToString();
mylang.Expires = DateTime.Now.AddYears(1);
Response.Cookies.Add(mylang);
Response.Redirect("~/Hello.aspx");
}
کد فوق یک کوکی با همان نام ایجاد کرده و زبان جدید را جایگزین می نماید .
کار تمام است سایت چند زبانه شما حاضر است.
میتوانید فایل پروژه را از اینجا دانلود نمایید .