Asp.Net Core Mvc ile Çoklu Dil Kullanımı

Merhaba arkadaşlar, bu yazımızda “Asp.Net MVC Core 2.2 ile çoklu dil desteği olan bir web sayfası nasıl yapılır?” inceliyor olacağız. Başlamadan küçük bir not olarak belirteyim. Bu yazıyı 2 parça halinde yayınlıyor olacağım.İlk yazıda sitenin menü vs gibi bölümlerinin yabancı bir dil ile çalıştırılıyor olması olacak. Bunu Controller, Model ve View için ayrı ayrı resx dil dosyası ve ayrı ayrı view oluşturarak değil tek dosya üzerinden yapıyor olacağız. İkinci bölümde ise açılan dil sayfasına göre makale başlığı ve makale adlarını dinamik bir şekilde veritabanında getiriyor olacağız. İki yazının sonunda da uygulamaların GitHub linklerini paylaşıyor olacağım.

İlk yazı için senaryomuz şu şekilde Index ve Privacy sayfalarımızın olduğu bir web sayfamız olacak. Bu web sayfasında urlden gelen dil bilgisine göre _Layout’ ta ilgili menülerin adlarını ve Layout’ a bağlı sayfalarda içerik kısımlarını basit bir şekilde değiştireceğiz.

1.İlgili klasör ve classları oluşturmak

Projemizin kök dizininde Resources adında bir klasör oluşturuyoruz. Klasörün içerisinde SharedResource ve LocService adında 2 adet class oluşturuyoruz.Ardından LocService classında GetLocalizedHtmlString adında bir metod oluşturuyoruz. Bu metod bizim resx dosyalarından istediğimiz alanları çağırmamıza yardımcı olacak.

    public class SharedResource
    {
    }
public class LocService
    {
        private readonly IStringLocalizer _localizer;

        public LocService(IStringLocalizerFactory factory)
        {
            var type = typeof(SharedResource);
            var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
            _localizer = factory.Create("SharedResource", assemblyName.Name);
        }

        public LocalizedString GetLocalizedHtmlString(string key)
        {
            return _localizer[key];
        }
    }

2.Dil dosyalarını oluşturmak

Resources klasöründe sağ tıklayarak Add-New Item seçeneğini seçiyoruz. Açılan menüde Resources File’ a tıklıyoruz ve dosyamıza SharedResource.tr-TR adını vererek dosyamızı oluşturuyoruz. Aynı işlemi ingilizce dil dosyamız için yapıyoruz ve dosyamıza SharedResource.en-US adını veriyoruz.

Türkçe dil dosyamıza çift tıklayarak Türkçe için ayarlamaları yapmaya devam ediyoruz.

NOT:Açtığımız dil dosyasında Name alanına girdiğimiz ifadeler uygulama içerisinde çağırmak istediğimiz ifadeyi belirtir. Örneğin AdSoyad yazarsak AdSoyad ifadesinin Türkçe dil dosyasındaki karşılığına erişebilmek için uygulamada AdSoyad ifadesini kullanmak zorundayız.

Türkçe Dil dosyamızı aşağıdaki şekilde dolduruyoruz.

NameValue
adadın ne
soyadsoyadın ne
gizlilikSayfasiMesajBurası benim gizlilik politikası sayfam
anasayfaMesajHoşgeldiniz

İngilizce dil dosyamızı aşağıdaki şekilde oluşturuyoruz.

NameValue
adyour name
soyadyour surname
gizlilikSayfasiMesajThis is my privacy policy page
anasayfaMesajWelcome

3.Startup Dosya Yapılandırması

Startup dosyasında ConfigureServices metodunun içerisine aşağıdaki düzenlemeleri ekliyoruz.

İlk satırda yapmış olduğumuz işlem LocService classını kullanabilmek için Dependency Injection yapılandırmasının tamamlanması yani LocService classını kulalanbilmemiz anlamına geliyor.

İkinci satırda dil yapılandırması için ihtiyacımız olan .resx ve classları barındıran klasörümüzün yolunu belirityoruz.

Sonraki satırlarda ise kullanmak istediğimiz dilleri ve onları nasıl çağıracağımızı belitiyoruz.

Önemli nokta olarak options.DefaultRequestCulture satırında url’ ye bir dil uzantısı girilmemesi durumunda varsayılan olarak hangi dil dosyasının kullanılacağını ifade ediyor.

        services.AddSingleton<LocService>();
        services.AddLocalization(options => options.ResourcesPath = "Resources");
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        services.Configure<RequestLocalizationOptions>(
        options =>
        {
            var supportedCultures = new List<CultureInfo>
                {
                        new CultureInfo("en-US"),
                        new CultureInfo("tr-TR")
                };

            options.DefaultRequestCulture = new RequestCulture(culture: "tr-TR", uiCulture: "tr-TR");
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;

            options.RequestCultureProviders.Insert(0, new QueryStringRequestCultureProvider());
        });

Ardından Configure metoduna aşağıdaki kodları ekliyoruz.

        var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
        app.UseRequestLocalization(locOptions.Value);

4.View Yapılandırmalarının Tamamlanması

Index View’ ne aşağıdaki kodları ekliyoruz. Burada ilk 2 satırda yapılan işlem Resources klasörüne ve onun altındaki ihtiyacımız olan class ve metodlara erişmemizi sağlıyor.

ViewData[“Ad”] = @SharedLocalizer.GetLocalizedHtmlString(“ad”) ile dil dosyamızda oluşturduğumuz ad ifadesinin dil karşılığını dosyamızdan çağırıyoruz ve gelen değeri ViewData[“Ad”] ile karşılayarak @ViewData[“Ad”] ile ekrana basıyoruz

@using MultipleLanguageOneFile.Resources
@inject LocService SharedLocalizer
@{
    ViewData["Ad"] = @SharedLocalizer.GetLocalizedHtmlString("ad");
    ViewData["Soyad"] = @SharedLocalizer.GetLocalizedHtmlString("soyad");
}
@ViewData["Ad"]
@ViewData["Soyad"]

Bu işlemin benzerini Privacy View’ i içinde yapıyoruz.

Uygulamayı çalıştırarak ilk ekranımıza ulaşıyoruz.

Url’ ye https://localhost:44301/Home/Index?culture=en-US yazarak aşağıdaki ekrana ulaşıyoruz.

GitHub Linki

https://github.com/MehmetAkifVurucu/AspNetCoreMvcMultipleLanguageOneFile

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