Makale Özeti

Bu makalemizde Asp.Net Mvc içerisinde Asp.Net Web Forms ile sıkça kullandığımız Resource.resx kavramını MVC içerisinde nasıl kullanacağımıza dair basit bir örnek yapacağız. Benim tarzımı bildiğiniz gibi fazla cümle kurmadan işin temellerine hemen geçiyorum.

Makale

Selamlar,

Ara ara iş nedeniyle yazılara ara vermek zorunda kalıyorum. Fakat mümkün olduğunca takılabileceğiniz yerleri işaretleyip sırayla konular hakkında sizleri bilgilendirmeye çalışıyorum. Bu makalemizde Asp.Net Mvc içerisinde Asp.Net Web Forms ile sıkça kullandığımız Resource.resx kavramını MVC içerisinde nasıl kullanacağımıza dair basit bir örnek yapacağız. Benim tarzımı bildiğiniz gibi fazla cümle kurmadan işin temellerine hemen geçiyorum.

Projemizde 2 dil mevcut, bunlar Türkçe ve İngilizce olacak şekilde tasarlandı. Projemizin içerisinde Add New Item diyerek Resource.resx dosyalarımızı ekliyoruz. Ben aşağıdaki gibi bir yapı kullandım. Bunun özel bir nedeni var. Proje içerisinde karmaşayı engellemek ve neyin nerede olduğunu daha rahat bulmak benim için önemli.

 

 

Gördüğünüz üzere Resources adında bir klasör oluşturdum ve her Views klasörüm ile her view için bir resource ekledim. Örnek olarak HomeStrings.resx benim Home view'ım için gerekli çevirileri barındırmakta. Türkçeler için genel olan resource dosyalarını kullanıyor olacağım. Sitemin varsayılan dili Türkçedir. İngilizce olan kaynaklar ise HomeStrings.en.resx dosyasının içerisinde yer alıyor. Fakat belirtmeden geçmek istemiyorum. İngilizce ve diğer bazı diller kendi içlerinde de ayrılıyorlar. İngilizceyi örnekleyecek olursak en-US, en-GB gibi. Bu şekilde bir ayrım yapmış olsaydım isimlendirmeyi, HomeStrings.en-US.resx şeklinde yapacaktım. 

Resource dosyalarını oluştururken dikkat etmemiz gereken en önemli husus Access Modifier seçeneğinin Public olarak işaretlenmesidir. Aşağıda ki resimde bununla ilişkili örneği bulabilirsiniz.

 

Ek olarak yine Resource.resx dosyamızın Properties (Özellikler) penceresinden Custom Tool Namespace içeriğine kullanımızı kolaylaştıracak bir isim vermeniz. Ben örnek olması açısından Ress adını verdim. Sayfa içerisinde kullanımını makale içerisinde bulacaksınız.

İkinci adımda Global.asax içerinde bulunan Application_AcquireRequestState eventine eklemelerde bulunacağız. Bu event ile mevcut state üzerinde değişiklikleri yapmayı sağlamış oluyoruz.

protected void Application_AcquireRequestState(object sender, EventArgs e)
        {
            if (HttpContext.Current.Session == null) return;
 
            var cultureInfo = (CultureInfo)Session["Culture"];
            if (cultureInfo == null)
            {
                var languageName = "en";
                if (HttpContext.Current.Request.UserLanguages != null && HttpContext.Current.Request.UserLanguages.Length != 0)
                {
                    languageName = HttpContext.Current.Request.UserLanguages[0].Substring(0, 2);
                }
                cultureInfo = new CultureInfo(languageName);
                Session["Culture"] = cultureInfo;
            }


Kodu incelediğinizde göreceğiniz ilk şey Session["Culture"] adında bir nesnemizin olduğudur. Bunu az sonra nerede doldurduğumuzu göreceğiz. O yüzden kodu incelemeyi kesmeyiniz :)  Eğer Culture session boş ise tarayıcının bilgileri alınıp ona göre bir belirleme sağlanıyor. En son blokta ise CurrentCulture için gerekli değerler set ediliyor.

Geldik dili değiştirmeye. Ben sayfamı tasarlarken dilleri göstereceğim bloğu partial view olarak tasarladım. HomeController içerisine aşağıdaki gibi bir method ekledim. Siz farklı bir controller içerisine ekleyebilirsiniz. İlerleyen zamanlarda ekleyeceğim custom controllers ve views yapılarınıda kullanabileceksiniz :)

public ActionResult ChangeCulture(string lang, string returnUrl)
        {
            Session["Culture"] = new CultureInfo(lang);
            return Redirect(returnUrl);
        }

Artık ChangeCulture adında bir Action'a sahibiz. Bu action ile gerekli tetiklemeler ile sayfamızın dilini değiştiriyor olacağız. Nasıl sorusuna yanıtı hemen aşağıda veriyorum.

<section id="languages">
        @Html.ActionLink("Türkçe", "ChangeCulture", "Home", new { lang = "tr", returnUrl = this.Request.RawUrl }, null)
        <span>|</span>@Html.ActionLink("English", "ChangeCulture", "Home", new { lang = "en", returnUrl = this.Request.RawUrl }, null)
    </section>

Html.ActionLink vasıtasıyla gerekli parametreleri gönderip CurrentCulture değişimini sağlıyoruz.

Sayfalar içerisinde Resource dosyalarımıza eklediğimiz anahtarları nasıl kullanacağımıza da bir örnek vermeden geçmek olmaz. Örneğin Ben HomePage adında bir anahtar ekledim. Aşağıda kullanımına ilişkin örneği görebilirsiniz. 

<section id="main-menu">
        <nav>
            <ul>
                <li><a href="@Url.Action("", "Home")" title="@Ress.SharedStrings.HomePage">@Ress.SharedStrings.HomePage</a></li>
                <li class="sep">|</li>
                <li><a href="/" title="">@Ress.SharedStrings.Flats</a></li>
                <li class="sep">|</li>
                <li><a href="/" title="">@Ress.SharedStrings.Gallery</a></li>
                <li class="sep">|</li>
                <li><a href="@Url.Action("", "Contact")" title="">@Ress.SharedStrings.Contact</a></li>
            </ul>
        </nav>
    </section>

Dikkat ederseniz makalenin başında Custom Tool Namespace için verdiğim isimi burada kullanıyorum. @Ress.ResourceAdı.AnahtarAdı şeklinde kullanılıyor. Kullanım sırasında IntelliSense kullanımı mevcuttur. Bu nedenle anahtar kelimeler arasında boğulmuyoruz :)

Ek olarak dikkat etmemiz gereken bir husus daha Resource belirtirken html içerik girdiysek @Html.Raw(Ress.ResourceAdı.AnahtarAdı) şeklinde kullanılması gerekmektedir. Bu hatırlatmayı da yaptıktan sonra bir sonra ki makale de görüşmek üzere diyor ve mutluluklar diliyorum.

www.mehmetkurt.com.tr
Gsm : 0542 558 37 38
Twitter | LinkedIn