Asp.NET MVC Çoklu Dil Fonksiyonları-Dil Seçimi

Herkes Herkes

16 Ocak 2017 Yazılım Dilleri (131) /Asp.Net MVC (109) (563)

Paylaşmak güzeldir. Lütfen sizde paylaşın...


Asp.NET MVC Çoklu Dil Fonksiyonları-Dil Seçimi
 

Öncelikle veri tabanızmızda Ayarlar adında bir tablo olsun : aşağıdaki iki resme bakınız..


Modelde görünümü


Projemize Functions Adında Bir Klasör Oluşturun ve Aşağıdaki Classları ekleyin
 1-Ayarlar.cs

using eticaret.Models;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;

namespace eticaret.Functions
{
    public static class Ayarlar
    {
        public static string Ayar(string ayar)
        {
            string lang = Thread.CurrentThread.CurrentCulture.Name;
            string ayari = null;
            var cache = HttpContext.Current.Cache[lang + "-ayarlar"] as List<ayarlar>;
            if (cache != null)
            {
                ayari = (from c in cache where c.anahtar == ayar select c.tanim).FirstOrDefault();
            }
            else
                ayari = (from c in CacheHelper<ayarlar>.Read(lang + "-ayarlar", c => c.lang == lang) where c.anahtar == ayar select c.tanim).FirstOrDefault();
            if (ayari == null)
                return string.Format(MyLanguage.Lan("ayar_tanimlanmamış"), ayar);
            else
                return ayari;

        }
    }
}

2- CacheHelper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using eticaret.Models;
using System.Web;

    public static class CacheHelper<T> where T :class
    {
        public static void Add<F>(string key, F data, int minutes)
        {
            HttpContext.Current.Cache.Insert(key, data, null, DateTime.Now.AddMinutes(minutes), System.Web.Caching.Cache.NoSlidingExpiration);
        }
        public static List<T> Read(String key, Expression<Func<T, bool>> query)
        {
            var cache = HttpContext.Current.Cache[key] as List<T>;
            if (cache == null)
            {
                eticaretEntitiesModel db = new eticaretEntitiesModel();
                if (query == null)
                    cache = (from c in db.Set<T>() select c).ToList();
                else
                    cache = (from c in db.Set<T>().Where(query) select c).ToList();
                Add(key, cache, 60);
                db.Dispose();
                db = null;
                return cache;
            }
            else
                return cache;

        }
    }


3-Language.cs

using System.Data.Entity.Resources;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;
using System.Web;
using System.Web.Compilation;
using System.Web.Mvc;
using Resources;

namespace eticaret.Functions
{
    public static class MyLanguage
    {
        public static string Language(this HtmlHelper html, string key)
        {
            var fields = (ResourceExpressionFields)new ResourceExpressionBuilder().ParseExpression("lang," + key, typeof(string), new ExpressionBuilderContext("~/App_Globalresources/"));
            return (string)HttpContext.GetGlobalResourceObject(fields.ClassKey, fields.ResourceKey ,CultureInfo.CurrentUICulture);
        }
        public static string Lan(string key)
        {
            var fields = (ResourceExpressionFields)new ResourceExpressionBuilder().ParseExpression("lang," + key, typeof(string), new ExpressionBuilderContext("~/App_Globalresources/"));
            return (string)HttpContext.GetGlobalResourceObject(fields.ClassKey, fields.ResourceKey ,CultureInfo.CurrentUICulture);
        }
        
    }

     public class MyDisplayName: DisplayNameAttribute
        {
         public string name { get; set; }
         public MyDisplayName(string key)
             : base(key)
         {
             name = key;
         }
         public override string DisplayName
         {
             get
             {
                 var property = typeof(lang).GetProperty(name, BindingFlags.Static | BindingFlags.NonPublic);
                 return (string)property.GetValue(property.DeclaringType, null);
             }
         }
        }
}

4-Localization.cs

using System;
using System.Web.Mvc;

namespace eticaret.Functions
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public sealed class MyAuthorizeAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
            OnAuthorizationHelp(filterContext);
        }

        internal void OnAuthorizationHelp(AuthorizationContext filterContext)
        {

            if (filterContext.Result is HttpUnauthorizedResult)
            {
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    filterContext.HttpContext.Response.StatusCode = 401;
                    filterContext.HttpContext.Response.End();
                }
            }
        }
    }
}

5-MyAuthorize.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Globalization;
using System.Web.Mvc;
using System.Threading;
using Resources;

namespace eticaret.Functions
{
    public class LocalizationAttribute:ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            string cultur = null;
            var cookie = filterContext.HttpContext.Request.Cookies["culture"];
            if(filterContext.RouteData.Values["lang"]!=null)
            {
                cultur = filterContext.RouteData.Values["lang"].ToString();
                if (cultur.IndexOf("-") != 2)
                    cultur = cookie == null ? Thread.CurrentThread.CurrentCulture.Name : cookie.Value;
            }
            else
                cultur = cookie == null ? Thread.CurrentThread.CurrentCulture.Name : cookie.Value;
            if (cookie == null || cultur != cookie.Value)
            {
                cookie = new HttpCookie("culture");
                cookie.HttpOnly = false;
                cookie.Value = cultur;
                cookie.Expires = DateTime.Now.AddYears(1);
                filterContext.HttpContext.Response.Cookies.Add(cookie);
            }
            lang.Culture = new CultureInfo(cultur);
            filterContext.RouteData.Values["lang"] = cultur;
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultur);
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultur);
            base.OnActionExecuting(filterContext);
        }
    }
}

6-Routeconfig.cs dosyası aşağıdaki gibi olacak

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(name: "DefaultApi", url: "api{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
            routes.MapRoute(name: "Default1", url: "{lang}/{controller}/{action}/{page}/{id}", defaults: new { controller = "Home", action = "Index", page = UrlParameter.Optional, id = UrlParameter.Optional, lang = UrlParameter.Optional });

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

7-View klasörü altındaki web.config içerisinde ilgi bölüme add names;

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="eticaret" />
        <add namespace="eticaret.Functions" />
        <add namespace="eticaret.Models" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>


8-Layut veya istene diğer sayfalarda ayarları çekmek için;

@{
    var thread = System.Threading.Thread.CurrentThread.CurrentCulture;
    string siteisim, sitesahip, sitecopy, sitekisaad, sitetema, googleanalytics, dilsecenek = null, secilidil;
    secilidil = thread.Parent.DisplayName;
    siteisim = Ayarlar.Ayar("site-ismi");
    sitesahip = Ayarlar.Ayar("site-author");
    sitecopy = Ayarlar.Ayar("site-copy");
    sitekisaad = Ayarlar.Ayar("site-adresi");
    //sitetema = Session["temalist"].ToString();
    googleanalytics = Ayarlar.Ayar("google-analytics");
    var dil = Ayarlar.Ayar("dil-secenek").Split(',');
    for (int i = 0; i < dil.Count(); i++)
    {
        var kes = dil[i].Split('_');
        dilsecenek = dilsecenek + "<a href=\"/" + kes[1] + "\"title=\"" + kes[0] + "\"><img style=\"max-height:32px\" src=\"" + kes[2] + "\"></a>";

    }
}

9-Content/resim kalsörü altında ülke bayraklarını ekleyin.
dil seçeneklerini ekranda yazılması için;

   
@Html.Raw(dilsecenek)​

10-Herhangi bir yerde strin ifadeyi dil ile çevirmek için

    
 @Html.Language("language choise"), @MyLanguage.Lan("Ana Sayfa")​

11-Projenize App_Globalresources kalsörü altnda dil dosyalarını tanımlamayıda unutmayın ki ilgili dönüşümü yapabilsin..


12-Kullanılacak controller altına attribute eklemeyi unutmayın

      
[Localization]
    public class HomeController : BaseController
    {

13-Model içerisinde kullanmak için bir örnek:

[Localization]
public class UsersVModel
    {
        public string Id { get; set; }

        public string Email { get; set; }

        public string UserName { get; set; }

        public string PhoneNumber { get; set; }

        [Required(ErrorMessage = "Adı Gereklidir.")]
        //[StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
        [StringLength(50, ErrorMessageResourceName = "kayit_sinir_min", MinimumLength = 2, ErrorMessageResourceType = typeof(lang))]
        [MyDisplayName("Ad")]
        public string Adi { get; set; }

        [Required(ErrorMessage = "SoyaAdı Gereklidir.")]
        [StringLength(50, ErrorMessageResourceName = "kayit_sinir_min", MinimumLength = 2, ErrorMessageResourceType = typeof(lang))]
        [MyDisplayName("Soyad")]
        public string Soyadi { get; set; }

        [MyDisplayName("Uyelik_Tarihi")]
        public System.DateTime UyelikTarihi { get; set; }
        [Display(Name = "Adı ve Soyadı")]
        public string DisplayAdiSoyad
        {
            get
            {
                string dspAdi = string.IsNullOrWhiteSpace(this.Adi) ? "" : this.Adi;
                string dspSoyadi = string.IsNullOrWhiteSpace(this.Soyadi) ? "" : this.Soyadi;
                return string.Format("{0} {1}", dspAdi, dspSoyadi);
            }
        }
    }

;

 

Konuya ilişkin bu makalemizi okumanızı tavsiye ediyorum.

Paylaşmak Güzeldir..

Kolay gelsin..


Paylaşmak güzeldir. Lütfen sizde paylaşın...



Herkesyazar Ara