Request Header Üzerinden Accept-Language Bilgisine Göre Dil Seçimi

Geliştirdiğimiz proje üzerinde webapi kullanmaktayız, bu yüzden konuyu webapi üzerinden sizinle paylaşacağım.

Browser üzerinden yapılan her isteğin bildiğiniz gibi bir header bilgisi vardır.

Örn:

Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:tr
Cache-Control:max-age=0
Connection:keep-alive
Host:xxxx.com
Referer:xxxxx.com/xxxxx
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36

Bu request bilgisi içerisinde bize isteğin gönderilen bilgisayarın varsayılan dilide Accept-Language parametresi içinde gelmektedir.

Bu bilgiyi alarak kendi tarafımızda gelen dile göre serverın culture bilgisini ayarlayarak istenilen datayı gelen isteğe göre formatlayıp, gönderme şansımız bulunuyor.

Yalnız bu bilgiyi alarak bir kaç işlem gerçekleştirmemiz gerekli.

Bunun için bir handler oluşturduk.

Handler örneği:

using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace AdminProject.App_Start
{
	//Classimiz delegatingHandler interface'inden turetilmistir.
    public class LanguageHandler : DelegatingHandler
    {
    	//kullanacaginiz dil formatina gore degistirebilirsiniz. Orn: tr-TR, en-US gibi
        readonly HashSet<string> _languages = new HashSet<string>()
        {
            "tr", "en", "ru", "fr"
        };

        //varsayilan dil tr-TR'de olabilir.
        private readonly string _defaultLanguage = "tr";

        //Ilgili kullanicidan gelen istegin diline gore serverdaki culture bilgisini karsilayip, setleyen metodumuz. Dikkat ederseniz override metoddur.
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var language = GetLanguage(request);

            Thread.CurrentThread.CurrentCulture = new CultureInfo(language);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);

            return base.SendAsync(request, cancellationToken);
        }

        //header uzerinden parametremizi yakalayan metodumuz.
        private string GetLanguage(HttpRequestMessage request)
        {
            var language = _defaultLanguage;
            var header = request.Headers.AcceptLanguage.FirstOrDefault();
            if (header != null)
            {
                var value = header.Value;
                if (_languages.Contains(value))
                    language = value;
            }
            return language;
        }
    }
}

Olusturdugumuz bu handleri webapi uzerinde setlememiz gerekiyor ki gelen isteklerin her biri burada yakalanabilsin.

Projemizde Global.asax uzerinde webapi’nin konfigurasyonlari yapilmistir.

	GlobalConfiguration.Configure(config =>
    {
    	//Attribute ve camelcase ayarlarimizi bir onceki makalede anlatmistim, merak eden arkadaslar diger makaleye bakabilir.
        config.MapHttpAttributeRoutes();

        //handlerimizin setlendigi nokta
        config.MessageHandlers.Add(new LanguageHandler());

        var jsonFormatter = new JsonMediaTypeFormatter();

        var jsonSerializerSettings = jsonFormatter.SerializerSettings;
        jsonSerializerSettings.Formatting = Formatting.Indented;
        jsonSerializerSettings.Converters.Add(new StringEnumConverter());
        jsonSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

        config.Formatters.Clear();
        config.Formatters.Add(jsonFormatter);
    });

Bu noktandan sonra gelen istekler hangi controller uzerindeki hangi action’a dusecekse asagida bulunan kod ornegindeki gibi kullanicidan gelen dil bilgisine gore islemlerini gerceklestirebilir.

	[HttpGet]
    [Route("videos")]
    public IHttpActionResult GetVideos()
    {
    	//kullanicinin dil bilsini aldigimiz yer
        var currentLanguage = Thread.CurrentThread.CurrentUICulture.Name;

        var db = _dbFactory();

        //dbye sorgumuzu gonderirken dili aldigimiz icin direk islem gerceklestirebiliriz.

        return Ok(videos);
    }

Bu yontemin en sık kullanilan bir diger alternatifi ise bildiginiz gibi url uzerinden dil bilgisinin tasinmasidir.

Bol kodlu gunler

3,001 total views, 2 views today

No Comments

Leave a Comment

Ulaşım için: Facebook: /ganigani Twitter: @abdulgani_demir


*

%d blogcu bunu beğendi: