MVC Çoklu Dil Multi Language Nasıl Yapılır ?

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 ;
İ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 Listesi

Language veri modelimizde iki adet dosya var birincisi SiteBaseController.cs içeriği aşağıdaki gibidir.

public 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; }
        }
    }
}

Modelimiz bittikten sonra bir tane SiteBaseController adında bir controller ekliyoruz ve içeriği aşağıdaki gibidir.
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 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.
public ActionResult ChangeLanguage(string lang)
{
new SiteLanguage().SetLanguage(lang);
string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();
return RedirectToAction("Index", controllerName);
}

 

En son dil seçimi yaptırmak için aşağıdaki kodları kullanıyoruz.
<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>

Uygulamamızın ekran çıktısı aşağıdaki gibidir.

 

MultiLanguage Türkçe
MultiLanguage English
MultiLanguage French