
Merhabalar, Kurumsal web sitelerinin olmazsa olmazlarından olan multilanguage(Çoklu Dil) desteğinin nasıl yapıldığını bu makalede sizlere anlatmaya çalışacağım. Bu işlemi yaparken site içindeki menüleri ve dinamik olmayan yazılara bu işlemi uygulamak için resource.resx dosyaları ile çalışacağız. Projemize bir adet resource.resx dosyası ekliyoruz. İlk eklediğimiz dosya bizim sitemizin default dili olacaktır. Bu dosya içerisinde değişecek metinleri belirledikten sonra Access modifier özelliğini public yapıp kaydediyoruz. Aynı dosyayı kopyalayıp tekrar yapıştırıyoruz ve ismini ; Language veri modelimizde iki adet dosya var birincisi SiteBaseController.cs içeriği aşağıdaki gibidir. Modelimiz bittikten sonra bir tane SiteBaseController adında bir controller ekliyoruz ve içeriği aşağıdaki gibidir. public class HomeController : SiteBaseController değişikliği ile artık home controllerımızda site basecontrollerdan türetmiş olduk. Home kontroller içine dil seçimi yapmamızı sağlayan ChangeLanguage adında bir action yazıyoruz. İçeriği aşağıdaki gibidir. En son dil seçimi yaptırmak için aşağıdaki kodları kullanıyoruz. Uygulamamızın ekran çıktısı aşağıdaki gibidir.
İngilizce için: resource.en.resx.
Fransızca için: resource.fr.resx.
İspanyolca için: resource.es.resx.
Almanca için: resource.de.resx. olarak kaydediyoruz.
Bütün dillerin listesini ve uzantılarını aşağıdaki linkten görebilirsiniz.
System.Globalization.CultureInfo Language-Country/Region Listesipublic class SiteBaseController : Controller
{
protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{
string lang = null;
HttpCookie langCookie = Request.Cookies["culture"];
if (langCookie != null)
{
lang = langCookie.Value;
}
else
{
var userLanguage = Request.UserLanguages;
var userLang = userLanguage != null ? userLanguage[0] : "";
if (userLang != "")
{
lang = userLang;
}
else
{
lang = SiteLanguage.GetDefaultLanguage();
}
new SiteLanguage().SetLanguage(lang);
return base.BeginExecuteCore(callback, state);
}
return base.BeginExecuteCore(callback, state);
}
}
İkincisi ise Language.cs içeriği aşağıdaki gibidir.namespace WebApplication1.Models.Language
{
public class SiteLanguage
{
public static List<Language> AvailableLanguage => new List<Language>
{
new Language { LangFullName="tr-TR", LangCultureName="tr-TR"},
new Language { LangFullName="en-US" , LangCultureName="en-US"}
new Language { LangFullName="fr-FR" , LangCultureName="fr-FR"}
};
public static bool IsLanguageAvailable(string lang)
{
return AvailableLanguage.Where(x => x.LangFullName.Equals(lang)).FirstOrDefault() != null ? true : false;
}
public static string GetDefaultLanguage()
{
return AvailableLanguage[0].LangCultureName;
}
public void SetLanguage(string lang)
{
try
{
if (!IsLanguageAvailable(lang))
{
lang = GetDefaultLanguage();
}
else
{
var cultureInfo = new CultureInfo(lang);
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
HttpCookie langCookie = new HttpCookie("culture", lang);
langCookie.Expires = DateTime.Now.AddYears(1);
HttpContext.Current.Response.Cookies.Add(langCookie);
}
}
catch (Exception ex)
{
throw ex;
}
}
public class Language
{
public string LangFullName { get; set; }
public string LangCultureName { get; set; }
}
}
}
protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{
if (Request.QueryString["language"] != null)
{
if (Request.QueryString["language"] == "tr")
{
Session["language"] = "tr";
Session["culture"] = "TR";
}
else if (Request.QueryString["language"] == "en")
{
Session["language"] = "en";
Session["culture"] = "US";
}
else if (Request.QueryString["language"]=="fr")
{
Session["language"] = "fr";
Session["culture"] = "FR";
}
}
var language = Session["language"] ?? "tr";
var culture = Session["culture"] ?? "TR";
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo($"{language}-{culture}");
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo($"{language}-{culture}");
return base.BeginExecuteCore(callback, state);
}
public ActionResult ChangeLanguage(string lang)
{
new SiteLanguage().SetLanguage(lang);
string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();
return RedirectToAction("Index", controllerName);
}
<li>@Html.ActionLink("TR", "index", new { Language = "tr" })</li>
<li>@Html.ActionLink("EN", "index", new { Language = "en" })</li>
<li>@Html.ActionLink("FR", "index", new { Language = "fr" })</li>
Yorum