Asp.Net Core Mvc Localization Route İşlemi ile Çoklu Dil Kullanımı

Merhaba arkadaşlar daha önceki yazılarımdan bir tanesinde Asp.Net Core Mvc’ de çoklu dil kullanımını ele almıştık. Yorumlarda sayfa değiştirildiğinde açılan sayfanında seçilen dil ile nasıl açılabileceği hakkında bir soru olunca bu yazıyı ele almak istedim. Yazının sonunda uygulamanın GitHub linkini paylaşıyor olacağım.

Senaryomuz Index ve Privacy sayfalarından oluşan ve footer alanında dil seçimi yapılan ve seçilen dile göre bu 2 sayfada merhaba,hoşgeldin ve sayfa adı bilgilerini ekrana yazan basit bir uygulama şeklinde olacak. Dilerseniz başlayalım.

1.Dil seçimi için gerekli işlemler, layout düzenlemesi ve gerekli dosya, classların oluşturulaması

_Layout’ ta en üste aşağıdaki kodu ekliyoruz. Bu işlem ile kullanıcı seçili dili değiştirdiğinde hangi sayfada olduğu bilgisini alarak o sayfayı yeniden yükleme işlemini yapmamıza yardımcı olan parametrelerimizi oluşturuyoruz. Ayrıca lang değişkeni ile route işleminde kullanılacak olan parametremizi hazır hal getiriyoruz.

@using System.Threading
@{
    string currentController = ViewContext.RouteData.Values["Controller"].ToString();
    string currentAction = ViewContext.RouteData.Values["Action"].ToString();
    string culture = Thread.CurrentThread.CurrentCulture.ToString();
    string lang = ViewContext.RouteData.Values["lang"] == null ? string.Empty : ViewContext.RouteData.Values["lang"].ToString();

}

Bu işlemin ardından link verilmiş olan yerleri aşağıdaki örneğe uyacak şekilde değiştiriyoruz. Dikkat edecek olursanız yukarıda oluşturduğumuz lang değişkenini burada asp-route-lang ile parametre olarak gönderiyoruz.

<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index" asp-route-lang="@lang">Home</a>

_Layout’ ta footer alanına ilgili dil seçimini yaptırabilmek için dropdownlisti hazırlıyoruz.

<footer class="border-top footer text-muted">
    <div class="container">
        <ul>
            <li class="dropdown">
                <a data-toggle="dropdown">
                    @culture.ToUpper()
                </a>
                <ul class="dropdown-menu">
                    <li>
                        <a class="dropdown-item" asp-controller=@currentController asp-action=@currentAction asp-route-lang="tr">Türkçe</a>
                    </li>
                    <li>
                        <a class="dropdown-item" asp-controller=@currentController asp-action=@currentAction asp-route-lang="en">English</a>
                    </li>
                </ul>
            </li>
        </ul>
    </div>
</footer>

Dropdownlistimizi hazırladıktan sonra projenin kök dizininde Resources adında klasör oluşturulur ve bu klasör içerisinde projede kullanılacak olan 2 adet(Türkçe ve İngilizce) resx dosyası oluşturulur. Bu dosyaların adları sırasıyla Resource.resx ve Resource.en.resx.
NOT: Bu noktada varsayılan dil türkçe olacağı için tr uzantısı verilmeden Resource.resx şeklinde adlandırma yapılması tercih edilmiştir.

Localization adında klasör oluşturulur ve bu klasör içerisinde LocalizationMiddleware adında bir class oluşturulur. Bu class içerisinde desteklenen dilleri ve routing işleminde kullanacağımız parametre belirtme işlemini yapıyoruz.

public class LocalizationMiddleware
    {
        public void Configure(IApplicationBuilder app)
        {
            var options = new RequestLocalizationOptions();
            ConfigureOptions(options);

            app.UseRequestLocalization(options);
        }

        public static void ConfigureOptions(RequestLocalizationOptions options)
        {
            var supportedCultures = new List<CultureInfo>
            {                
                new CultureInfo("tr"),
                new CultureInfo("en")
            };

            options.DefaultRequestCulture = new RequestCulture(culture: "tr", uiCulture: "tr");
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;
            options.RequestCultureProviders = new[] {
                new RouteDataRequestCultureProvider()
                {
                    Options = options,
                    RouteDataStringKey = "lang",
                    UIRouteDataStringKey = "lang"
                }
            };
        }
    }


NOT: Dilerseniz bu işlemi önceki yazımızda olduğu gibi Startup.cs içerisinde de yapabilirsiniz. Bu yazıyı daha profesyonel olarak ele almak istediğim için okunabilirliği arttırmak adına bir class içerisinde yapmayı tercih ettim.

3.Startup ve Route yapılandırması yapılır

Startup classında Configure metodunda aşağıdaki yapılandırma işlemi gerçekleştirilir. Burada yukarıda belirtmiş olduğum deteklenen dil ve routing işleminde kullanacağımız parametreyi belirttiğimiz ConfigureOptions metodunun ihtiyaç duyduğu RequestLocalizationOptions örneği türetilir ve ilgili metodlara gönderilir.

var options = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
LocalizationMiddleware.ConfigureOptions(options.Value);
app.UseRequestLocalization(options.Value);

Son olarak Route işlemi için gerekli olan yapılandırmayı da aşağıdaki gibi yapıyoruz.

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "Default-TR",
        pattern: "{controller=Home}/{action=index}/{id?}", new { lang = "tr" });
    endpoints.MapControllerRoute(
        name: "Default-EN",
        pattern: "en/{controller=Home}/{action=index}/{id?}", new { lang = "en" });
});

4.View düzenlemelerini gerçekleştirme

Index ve Privacy viewlerimizi aşağıdaki şekilde değiştiriyoruz.

@using AspNetCoreLocalizationUrlRouting.Resources;
@{
    string currentController = ViewContext.RouteData.Values["Controller"].ToString();
    string currentAction = ViewContext.RouteData.Values["Action"].ToString();
}
<h4>@Resource.Merhaba @Resource.Hosgeldin</h4>
<h5>@Resource.SayfaAdi @currentController @currentAction</h5>

GitHub Linki

https://github.com/MehmetAkifVurucu/AspNetCoreMvcLocalizationRoute

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