İçeriğe geç

ASP.NET Core Localization

Bir web uygulaması geliştiriyorsanız bunu farklı dil seçenekleri ile sunmak isteyebilirsiniz. Bu noktada devreye localization kavramı girer. Siz kendiniz bir localization yapısı kurgulayacağınız gibi hali hazırdaki .Net Core localization yapısından da faydalanabilirsiniz.

Tıpkı ASP.NET’in eski sürümlerinde olduğu gibi, ASP.NET Core tarafında da localization resource desteği vardır. ASP.NET Core içinde çeşitli resource(*.resx) dosyaları(query string, cookies, headers) oluşturabilirsiniz.

Şimdi basit bir örnek ile .Net Core için localization kavramını incelemeye çalışalım.

Öncelikle Nuget ortamındaki Microsoft.AspNetCore.Localization paketine ihtiyacımız olacak. Bu paketi indirme işleminden sonra Startup dosyası içinde Dependency Injection ayarlaması yapmamız gerekiyor. Aşağıdaki kodda görebileceğimiz üzere resource path tanımı yapıyoruz. Bununla birlikte projenin root kısmına Resources klasörü oluşturmayı unutmalaylım.

public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalization(o =>
    {
        // Çevirilerin yer alacağı klasörü belirtiyoruz.
        o.ResourcesPath = "Resources";
    });
    services.AddMvc();
}

Şimdi middleware tanımlaması yapmalıyız. Böylelikle projemizde hangi dil seçeneklerine destek vereceğimizi tanımlayacağız. Aşağıdaki gibi İngilizce ve Türkçe olmak üzere 2 dil seçeneği desteği sunalım ve varsayılan dil seçeneği olarak İngilizce belirleyelim.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseStaticFiles();

    IList<CultureInfo> supportedCultures = new List<CultureInfo>
    {
        new CultureInfo("en-US"),
        new CultureInfo("tr-TR"),
    };
    app.UseRequestLocalization(new RequestLocalizationOptions
    {
        DefaultRequestCulture = new RequestCulture("en-US"),
        SupportedCultures = supportedCultures,
        SupportedUICultures = supportedCultures
    });

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

Servis ve Middleware tanımlamalarının ardından şimdi destekleyeceğimiz dil dosyasını oluşturmalıyız. Oluşturmuş olduğumuz Resources klasörü içine Controllers.HomeController.tr-TR.resx isminde resource dosyası ekleyelim ve içine örnek olarak kullanacağımız Hello tanımlaması yapalım.

Localization

Şimdi HomeController içinde belirli düzenlemeleri yapacağız. Dil dosyasındaki ilgili key değerine ulaşmak için IStringLocalizer ve bunu loglamak için ILogger nesnelerinin generic hallerinden faydalanacağız.

private readonly IStringLocalizer<HomeController> _localizer;
private readonly ILogger<HomeController> _logger;

public HomeController(IStringLocalizer<HomeController> localizer,
    ILogger<HomeController> logger)
{
    _localizer = localizer;
    _logger = logger;
}

public IActionResult Index()
{
    _logger.LogInformation(_localizer["Hello"]);
    return View();
}

Uygulamayı ayaklandırdığımızda URL adresinin sonuna ?culture=tr-TR ekleyerek test edersek sonuç aşağıdaki gibi olacaktır.

LocalizationOutput

Localization middleware 3 tip culture yapsı sağlar. Bunlar şu şekildedir:

  • Query string
  • Cookie
  • Accept-Language header

Query string
Culture cağrımı yapılırken belirli kullanımları vardır. Örneğin URL adresine aşağıdaki gibi eklemeler yapabilirsiniz.

Query string

?culture=tr-TR&ui-culture=tr-TR
?culture=tr-TR
?ui-culture=tr-TR

Cookies(Çerezler)
Cookie değerleri aşağıdaki gibi 3 farklı şekilde tanımlanabilir:

Cookies(Çerezler)

c=tr-TR|uic=tr-TR
c=tr-TR
uic=tr-TR

Cookie için startup tarafındaki tanımlamalar çok farklı değildir fakat ilaveten cookie ismini değiştirmeniz mümkündür.

var localizationOptions = new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture("en-US"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
};
// Linq ile cookie sağlayıcısını bulma
var cookieProvider = localizationOptions.RequestCultureProviders
    .OfType<CookieRequestCultureProvider>()
    .First();
// Yeni bir cookie ismi belirleme
cookieProvider.CookieName = "UserCulture";

app.UseRequestLocalization(localizationOptions);

Accept-Language header
Bu sağlayıcı bir tarayıcı(browser) aracılığı ile request header içinde Accept-Language değerini kontrol eder. Çok tercih edilen bir yöntem değildir diye tahmin ediyorum. Kullanımı aşağıdaki şekilde gibidir:

Accept-Language:en-US,en;q=0.8,fi;q=0.6

Geldik bir yazının daha sonuna. Herkese mutlu kodlamalar dilerim. 🙂

Tarih:ASP .NET Core

2 Yorum

  1. o kadar aspnetcore localization araştırması yaptım %90 ı aspnetcore diyor, 1.1 desteği vermiş, karıştırmış… en temiz en net bu . Tebrikler Nazım bey.

  2. alirizaadiyahsi alirizaadiyahsi

    Temiz anlatım.

Bir cevap yazın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.