Asp.Net Core Mvc İle Veritabanı Bağlantılı Çoklu Dil Kullanımı

Merhaba arkadaşlar, bu yazımızda çoklu dil kullanımının 2.kısmı olan veritabanı bağlantılı çoklu dil işlemleri nasıl yapılır ona değinmek istiyorum.

İnternette nasıl yapılabileceğine dair bir soru ile karşılaşınca haliyle merak edip biraz araştırdım. Strategy Design Pattern ile böyle bir yöntem uygulamaya karar verdim. En ideali midir? Bilemem. Bu yönde farklı uygulamalarınız veya düşünceniz varsa bu yazı özelinde yorumda paylaşmanızı özellikle rica ediyorum.

Bu anlatımda bir önceki anlatımda yer alan proje üzerinden devam ediyor olacağım. Bu yüzden yeni proje oluşturacak arkadaşlar için projenin GitHub linki ile sizin oluşturduğunuz projede bu anlamda dosya farkı olacaktır.

Not olarak projenin GitHub linki anlatımın sonunda paylaşılacaktır.

1.İhtiyaç duyulan klasör,interface ve classları oluşturma

Models klasörü içerisinde Makale adında bir abstract class oluşturulur. Bu class bizim uygulama genelinde kullanacağımız listeleme metodunda kullanacağımız classtır.

public abstract class Makale
{
    public int Id { get; set; }
    public string Baslik { get; set; }
    public string Aciklama { get; set; }
}

Abstract klasörü adında bir klasör oluşturulur. Bu klasörün içerisinde IMakale adında bir interface oluştururuz.

    public interface IMakale
    {
        List<Makale> MakaleListele();
    }

Concrete klasörünün içerisinde TrMakale ve EnMakale adında 2 tane class oluşturuyoruz. Bu classlarımız Makale Abstract classından miras alıyor ve IMakale classını implemente ediyor olacak.

    public class EnMakale : Makale, IMakale
    {
        public List<Makale> MakaleListele()
        {
            var configuration = new ConfigurationBuilder()
                 .SetBasePath(Directory.GetCurrentDirectory())
                 .AddJsonFile("appsettings.json", false)
                 .Build();
            var connectionString = configuration.GetConnectionString("connectionString");
            List<Makale> makales = new List<Makale>();
            using (var conn = new SqlConnection(connectionString))
            {
                conn.Open();
                var sql = "SELECT * FROM Makale where DilId=2";
                using (var cmd = new SqlCommand(sql, conn))
                {
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            makales.Add(new EnMakale
                            {
                                Baslik = reader["Baslik"].ToString(),
                                Aciklama = reader["Aciklama"].ToString()
                            });
                        }
                    }
                }
                conn.Close();
            }
            return makales;
        }
    }

Yukarıda yapmış olduğumuz işlemin aynısını TrMakale adında class oluşturarak Türkçe dilindeki makaleler için de yapıyoruz.

Makaleyi kısa tutmak adına bu kısmı kopyalamıyorum.

NOT 1: TrMakale classında MakaleListele metodu içerisindeki Sql sorgusunun where şartını 1 olarak değiştiriyoruz.

NOT 2: Metodda gördüğünüz üzere connectionstring kullanabilmek için appsetting.json dosyasına aşağıdaki connection string kodunu yapıştırıyoruz.

  "ConnectionStrings": {
    "connectionString": "Data Source=DESKTOP-8OL044U;Initial Catalog=MultiLanguageBlog;Integrated Security=True"
  },

2.Operation klasör ve classının oluşturulması

Proje kök dizininde Operation adında bir klasör ve klasörün içerisinde MakaleOperation adında bir class oluşturuyoruz.

Amaç: Bu classa constructor vasıtasıyla gönderdiğimiz IMakale türündeki classın metodlarına erişmemizi sağlayacak. Yani tr parametresi geldiğinde tr classındaki sorgunun çalışması burada constructor ile almış olduğumuz IMakale türü ve buradaki MakaleListele metodu sayesinde mümkün oluyor

    public class MakaleOperation
    {
        private IMakale _makale;
        public MakaleOperation(IMakale makale)
        {
            _makale = makale;
        }

        public List<Makale> MakaleListele()
        {
            return _makale.MakaleListele();
        }
    }

3.Controller ve View işlemlerinin yapılması

HomeController’ da aşağıdaki gibi bir IActionResult dönen metod ve buna bağlı view oluşturulur.

    public IActionResult MakaleListesi()
    {
    }

MakaleListesi metodunda MakaleOperation classından bir örnek oluşturur ve query string değerini okuruz. Gelen query string değerine göre oluşturduğumuz örneğin classına constructorda istenen IMakale türündeki classımızı göndeririz.Bu işlem sonucunda dönen listeyi de return view([liste]) ile view tarafına göndeririz.

    public IActionResult MakaleListesi()
    {
        string dil = "";
        MakaleOperation makaleOperation = null;
        List<Makale> makales = new List<Makale>();
        if (HttpContext.Request.Query["culture"].ToString() != null)
        {
            dil = HttpContext.Request.Query["culture"].ToString();
            switch (dil)
            {
                case "tr-TR":
                    makaleOperation = new MakaleOperation(new TrMakale());
                    break;
                case "en-US":
                    makaleOperation = new MakaleOperation(new EnMakale());
                    break;
                default:
                    makaleOperation = new MakaleOperation(new TrMakale());
                    break;
            }
        }
        else
        {
            makaleOperation = new MakaleOperation(new TrMakale());
        }
        makales = makaleOperation.MakaleListele();
        return View(makales);
    }

View içinde aşağıdaki kodları kullanarak kodlama tarafındaki işlerimizi bitirmiş oluyoruz.

@using MultipleLanguageOneFile.Resources

@inject LocService SharedLocalizer
@model IEnumerable<MultipleLanguageDynamicContent.Models.Makale>;
@{
    ViewData["Title"] = "MakaleListesi";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h1>@SharedLocalizer.GetLocalizedHtmlString("makaleListeSayfasi")</h1>
@if (Model != null)
{
    <table>
        <tr>
            <td></td>
            <td></td>
        </tr>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @item.Baslik
                </td>
                <td>
                    @item.Aciklama
                </td>
            </tr>
        }
    </table>
}

Sıra test etme aşamasında. Uygulamayı ilk çalıştırdığınızda varsayılan olarak Türkçe makale listesinin geldiğini göreceksiniz.

Urldeki tr-TR kısmını en-US olarak değiştirince İngilizce makale listesinin geldiğini göreceksiniz.

GitHub Linki

https://github.com/MehmetAkifVurucu/AspNetCoreMvcVeritabaniBaglantiliCokluDilUygulamasi

En son Not olarak Strategy Design Pattern anlatımı olmadığı için anlatımda dil ile ilgili noktalara değindim. Daha sonra Strategy Design Pattern ile ilgili daha detaylı bir yazımız olacak.

Bir sonraki yazıda görüşmek üzere

Related Post

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir