![](/Images/like.png)
![](/Images/dislike.png)
آموزش کامل طراحی دو زبانگی سایت در Asp.Net
آموزش کامل طراحی دو زبانگی سایت در Asp.Net
در این پست قصد داریم تا به صورت کامل نحوه طراحی دو زبانگی سایت را Asp.Net 2013 توضیح دهیم.
شما با یادگیری این آموزش می توانید به راحتی سایت های چند زبان در Asp.Net ایجاد کنید.
در صورتی که سایت شما توسط سایر کشورها بازدید می شود طراحی دو زبانگی برای سایت خیلی بهتر است.
در این آموزش ما منوهای سایت را به صورت دو زبانه طراحی می کنیم شما با استفاده از این آموزش می توانید هر قسمتی از سایت را که می خواهید به صورت زبانه باشد طراحی کنید.
ابتدا پوشه App_Code از پوشه های Asp.Net به پروژه خود اضافه کنید.
سپس دو کلاس با نام های BasePage و LocalizedPage داخل پوشه App_Code ایجاد کنید.
کلاس BasePage :
using System; using System.Collections.Generic; using System.Linq; using System.Web; // این کلاس از سیستم.وب.یوآی.پیج ارث بری کرده و هیچ کاری دیگری انجام نمی دهد و کلاس های دیگر از این کلاس به ارث برده اند public class BasePage : System.Web.UI.Page { public BasePage() { } }
این کلاس از System.Web.UI.Page ارث بری کرده و هیچ کاری دیگری انجام نمی دهد و کلاس های دیگر از این کلاس به ارث برده اند.
نکته: زمانی که کلاسی از System.Web.UI.Page ارث بری کرده باشد می توانید دستوراتی مانند session , IO و غیره در آن کلاس استفاده کنید.
کلاس LocalizedPage :
using System; using System.Collections.Generic; using System.Linq; using System.Web; public class LocalizedPage : BasePage { public LocalizedPage() { } //اول کار مشخص میکنیم صفحه به چه زبانی دیده بشه protected override void InitializeCulture() { base.InitializeCulture(); // این شرط زمانی اجرا می شود که کاربر لاگین کرده و سپس روی دکمه خروج کلیک کرده باشد if (Application["CultureKeep"] != null) { Session["Culture"] = Application["CultureKeep"]; Application["CultureKeep"] = null; } if (Session["Culture"] == null) { //در اینجا ما زبان پیش فرض سایت را فارسی قرار دادیم //Session["Culture"] = "en-US"; Session["Culture"] = "fa-IR"; } //دو متغییر ذیل را فقط در ایونت جاری میتوانیم تغییر دهیم //این دو متغییر را برابر سشن کالچر قرار میدهیم Culture = Session["Culture"].ToString(); UICulture = Session["Culture"].ToString(); } //با استفاده از زبان سیستم شخص زبان سایت مشخص میشود /*protected override void InitializeCulture() { base.InitializeCulture(); if (Session["Culture"] == null) { //for (int intIndex = 0; intIndex <= Request.UserLanguages.Length - 1; intIndex++) //{ // string strCulture = Request.UserLanguages[intIndex]; //} string strCulture = ""; if (Request.UserLanguages.Length == 0) { // سايت تصميم می گيرد Session["Culture"] = "fa-IR"; //Session["Culture"] = "en-US"; } else { strCulture = Request.UserLanguages[0]; switch (strCulture.Substring(0, 2).ToUpper()) { case "FA": { Session["Culture"] = "fa-IR"; break; } case "EN": { Session["Culture"] = "en-US"; break; } default: { // سايت تصميم می گيرد Session["Culture"] = "fa-IR"; // Session["Culture"] = "en-US"; break; } } } } Culture = Session["Culture"].ToString(); UICulture = Session["Culture"].ToString(); }*/ //در ایونت ذیل که بعد از ایونت بالا اتفاق میفتد تم را نسبت به سشن کالچر تغییر میدهیم protected override void OnPreInit(System.EventArgs e) { base.OnPreInit(e); switch (Session["Culture"].ToString().ToUpper()) { case "FA-IR": case "AR-SA": { Page.Theme = "RTL"; break; } //case "EN-US": //case "FR-FR": default: { Page.Theme = "LTR"; break; } } } }
این کلاس از کلاس BasePage ارث بری کرده
متد InitializeCulture
//اول کار مشخص میکنیم صفحه به چه زبانی دیده بشه protected override void InitializeCulture() { base.InitializeCulture(); // این شرط زمانی اجرا می شود که کاربر لاگین کرده و سپس روی دکمه خروج کلیک کرده باشد if (Application["CultureKeep"] != null) { Session["Culture"] = Application["CultureKeep"]; Application["CultureKeep"] = null; } if (Session["Culture"] == null) { //در اینجا ما زبان پیش فرض سایت را فارسی قرار دادیم //Session["Culture"] = "en-US"; Session["Culture"] = "fa-IR"; } //دو متغییر ذیل را فقط در ایونت جاری میتوانیم تغییر دهیم //این دو متغییر را برابر سشن کالچر قرار میدهیم Culture = Session["Culture"].ToString(); UICulture = Session["Culture"].ToString(); }
در ابتدا بررسی کردیم CultureKeep نال نباشد در صورت نال نبودن مقدار آن را داخل سشن Culture قرار می دهیم و سپس CultureKeep را نال می کنیم.
در این کلاس ابتدا مشخص می کنیم سایت در حالت معمولی به چه زبانی نمایش داده شود ما زبان فارسی را به عنوان زبان پیش فرض سایت در نظر گرفتیم.
همچنین ما می توانیم متد InitializeCulture به صورتی کد نویسی کنیم که زبان سایت توسط زبان سیستم کاربر مشخص شود.
//با استفاده از زبان سیستم شخص زبان سایت مشخص میشود protected override void InitializeCulture() { base.InitializeCulture(); if (Session["Culture"] == null) { //for (int intIndex = 0; intIndex <= Request.UserLanguages.Length - 1; intIndex++) //{ // string strCulture = Request.UserLanguages[intIndex]; //} string strCulture = ""; if (Request.UserLanguages.Length == 0) { // سايت تصميم می گيرد Session["Culture"] = "fa-IR"; //Session["Culture"] = "en-US"; } else { strCulture = Request.UserLanguages[0]; switch (strCulture.Substring(0, 2).ToUpper()) { case "FA": { Session["Culture"] = "fa-IR"; break; } case "EN": { Session["Culture"] = "en-US"; break; } default: { // سايت تصميم می گيرد Session["Culture"] = "fa-IR"; // Session["Culture"] = "en-US"; break; } } } } Culture = Session["Culture"].ToString(); UICulture = Session["Culture"].ToString(); }
متد OnPreInit
متد OnPreInit که بعد از ایونت بالا اتفاق میفتد تم سایت را نسبت به سشن کالچر تغییر میدهیم.
//در ایونت ذیل که بعد از ایونت بالا اتفاق میفتد تم را نسبت به سشن کالچر تغییر میدهیم protected override void OnPreInit(System.EventArgs e) { base.OnPreInit(e); switch (Session["Culture"].ToString().ToUpper()) { case "FA-IR": case "AR-SA": { Page.Theme = "RTL"; break; } //case "EN-US": //case "FR-FR": default: { Page.Theme = "LTR"; break; } } }
حال یکی دیگر پوشه های Asp.Net به نام App_GlobalResources به پروژه خود اضافه کنید.
سپس دو Resource File با نام Menu.fa-IR.resx و Menu.resx داخل آن ایجاد کنید.
Menu.resx در برگیرنده قسمت های انگلیسی سایت می باشد و Menu.fa-IR.resx دربرگیرنده قسمت های فارسی سایت می باشد.
توجه:
نام Menu.fa-IR.resx باید این صورت باشد ابتدا زبان را مشخص کردیم و سپس با یک خط فاصله نام کشور را مشخص می کنیم.
در داخل هر دو فایل Menu.resx و Menu.fa-IR.resx در قسمت Name مقدا آنها باید یکسان باشد اما در Value آنها یکی به زبان انگلیسی نوشته می شود و دیگر به زبان فارسی نوشته می شود.
برای اینکه بتوانیم تم سایت را نیز تغییر دهیم مثلا زمانی که زبان سایت فارسی می باشد راست به چپ و در صورتی که زبان سایت انگلیسی می باشد چپ به راست باشد.
بار دیگر از پوشه های Asp.Net پوشه App_Themes را به پروژه خود اضافه کنید. سپس دو پوشه از پوشه های Asp.Net به نام Theme اضافه کنید و نام های آنها را RTL و LTR تغییر دهید.
سپس کد های css مورد نظر خود را داخل آن ها بنویسید.
سپس ما سه صفحه به نام About.aspx و Contact.aspx و Default.aspx ایجاد کردیم و از MasterPage مشتق شدن و کد خاصی داخل آن ها نوشته نشده و فقط در قسمت کدهای سی شارپ آنها ، آنها را از کلاس LocalizedPage ارث بری کردیم. در صورتی که شما صفحه جدیدی به پروژه خود اضافه کنید کافیست فقط از کلاس LocalizedPage ارث بری کرده باشند.
کدهای صفحه نخست
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class _Default : LocalizedPage { protected void Page_Load(object sender, EventArgs e) { } protected void btnMessage_Click(object sender, EventArgs e) { litMessage.Text = Resources.Messages.Language; } }
حال به صفحه MasterPage می رویم در این قسمت ابتدا منوی سایت طراحی کردیم و سپس در قسمت text جهت نمایش مقدار آن از Menu.resx خوانده ایم.
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <asp:ContentPlaceHolder ID="head" runat="server"> </asp:ContentPlaceHolder> </head> <body> <form id="form1" runat="server"> <div> <asp:HyperLink ID="lnkEnglish" NavigateUrl="~/ChangeCulture.aspx?Culture=en-US" Text="English" runat="server" /><span> | </span><asp:HyperLink ID="lnkFarsi" NavigateUrl="~/ChangeCulture.aspx?Culture=fa-IR" Text="<%$Resources:Menu,Persian %>" runat="server" /> </div> <div> <ul> <li><a href="Default.aspx"> <asp:Literal runat="server" Text="<%$Resources:Menu,Home %>"></asp:Literal></a></li> <li><a href="About.aspx"> <asp:Literal runat="server" Text="<%$Resources:Menu,About %>"></asp:Literal></a></li> <li><a href="Contact.aspx"> <asp:Literal runat="server" Text="<%$Resources:Menu,Contact %>"></asp:Literal></a></li> </ul> </div> <div> <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder> </div> </form> </body> </html>
جهت تغییر زبان سایت از دو asp:HyperLink استفاده کریم سپس در قسمت NavigateUrl آنها برای زبان انگلیسی ~/ChangeCulture.aspx?Culture=en-US و برای زبان فارسی ~/ChangeCulture.aspx?Culture=fa-IR نوشتیم به این صورت که زبان سایت را در سشن Culture قرار دادیم و به صفحه ChangeCulture.aspx هدایت کردیم.
صفحه ChangeCulture.aspx
یک صفحه به نام ChangeCulture.aspx به پروژه خود اضافه کنید
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class ChangeCulture : LocalizedPage { //در این صفحه تغییرات کالچر رو با توجه به انتخاب زبان توسط کاربر انجام میدهیم protected void Page_Load(object sender, EventArgs e) { // با دستور رکواست دات پارام پارامتر پاس شده به صفحه رو بدست میاریم string strCulture = Request.Params["Culture"]; // اگر پارامتری پاس نشده بود ریدایرکت میشه به صفحه دیفالت if (string.IsNullOrEmpty(strCulture)) { Response.Redirect("~/Default.aspx", false); return; } //با دستور ذیل صفحه ارجاع داده شده به این صفحه رو مشخص میکنیم //اگر نال باشه یعنی در آدرس بار آدرس تایپ شده //که در این صورت دوباره ریدایرکت میکنیم به صفحه دیفالت string strReferer = Request.ServerVariables["HTTP_REFERER"]; if (string.IsNullOrEmpty(strReferer)) { //پارامتر دوم رو که فالس میگذاریم یعنی ریدایرکت کن و بعد خط بعد رو اجرا میکنیم //در حالت تورو ترد شما بطور کامل قطع میشه و ران تایم ارور اتفاق میافته //ولی ریترن ترد رو قطع نمیکنه Response.Redirect("~/Default.aspx", false); return; } //پارامتر را بزرگ میکنیم اگر حالتهای موجود در سایت بود //دوباره پارامتر رو دو حرف اول کوچیک و دو حرف آخر بزرگ و سشن را ست میکنیم //بعد یوزر رو به صفحه ای که از همان صفحه اومده ریدایرکت میکنیم switch (strCulture.ToUpper()) { case "FA-IR": case "EN-US": { strCulture = strCulture.Substring(0, 2).ToLower() + "-" + strCulture.Substring(3, 2).ToUpper(); //سشن کالچر را با توجه به زبان انتخاب شده ست میکنیم Session["Culture"] = strCulture; //یوزر رو ریدایرکت میکنیم به صفحه ای که از اونجا آمده Response.Redirect(strReferer, false); return; } //در غیر اینصورت ریدایرکت میکنیم به صفحه دیفالت default: { Response.Redirect("~/Default.aspx", false); return; } } } }
این صفحه از کلاس LocalizedPage ارث بری کرده و سپس در قسمت فرم لود آن با دستور رکواست دات پارام پارامتر پاس داده شده به صفحه رو بدست می آوریم، اگر پارامتری پاس داده نشده بود به صفحه دیفالت ریدایرکت می کنیم. سپس صفحه ارجاع داده شده به این صفحه رو مشخص میکنیم اگر نال باشه یعنی در آدرس بار آدرس تایپ شده که در این صورت دوباره به صفحه دیفالت ریدایرکت میکنیم .
در نهایت اگر همه چیز درست بود زبان سایت را در سشن Culture قرار می دهیم و بعد کاربر رو به صفحه ای که ازآن آمده بود ریدایرکت میکنیم.
جهت کاملتر کردن این آموزش به نکته ها زیر توجه کنید.
ما یک صفحه به نام Logout.aspx داریم. این صفحه زمانی اجرا می شود که کاربر وارد حساب کاربر خود شده و سپس بخواهد روی دکمه خروج کند تا از سایت خارج شود در این صورت تمام Session ها پاک می شوند و در نهایت زبان سایت به زبان پیش فرض تغییر پیدا می کند در صورتی که بخواهیم این مشکل را حل کنیم ابتدا زبان سایت را در یک متغیر Application به نام CultureKeep می ریزیم.
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class Logout : LocalizedPage { protected void Page_Load(object sender, EventArgs e) { // زمانی که این صفحه اجرا می شود تمام سشن ها حذف می شوند // زیان سایت را در متغییر اپلیکیشن قرار می دهیم Application["CultureKeep"] = Session["Culture"]; //تمام سشن های کاربر را پاک و از بین مبریم Session.Clear(); Session.Abandon(); //توسط دستور ذیل کاربر را ساین اوت میکنیم System.Web.Security.FormsAuthentication.SignOut(); // انتقال کاربر به صفحه نخشت Response.Redirect("~/Default.aspx", false); } }
سپس در کلاس LocalizedPage قبل از هر کاری بررسی می کنیم CultureKeep نال نباشد در صورت نال نبودن مقدار آن را در سشن Culture می ریزیم. به این صورت این مشکل نیز حال می شود.
کدهای که دیگر نیاز به توضیح نداشت ولی در سورس نوشته شده تا در صورت مشکل از آنها استفاده کنید.
- نحوه نمایش پیغام ها به زبان فارسی و انگلیسی
- نحوه تغییر عنوان صفحه به زبان فارسی و انگلیسی
- نحوه تغییر value دکمه ها
نظر / سوال