﻿
{"id":1220,"date":"2013-01-02T21:34:02","date_gmt":"2013-01-02T21:34:02","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=1220"},"modified":"2017-08-07T18:16:19","modified_gmt":"2017-08-07T18:16:19","slug":"mvcde-localizeddisplaynameattribute-attributeu-yazmak","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/mvcde-localizeddisplaynameattribute-attributeu-yazmak\/","title":{"rendered":"MVC&#8217;de LocalizedDisplayNameAttribute Attribute&#8217;u Yazmak"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba sevgili okuyucular\u0131m.Yeni y\u0131la ilk olarak LocalizedDisplayNameAttribute Attribute&#8217;u yazma konusunu ele alarak giri\u015f yapaca\u011f\u0131z :).<br \/>\nNedir bu LocalizedDisplayNameAttribute? diye bir soru y\u00f6neltti\u011finizi duyar gibiyim.<br \/>\nBu sorunun cevab\u0131n\u0131 verebilmek i\u00e7in, MVC temellerine dayal\u0131 bilgilerinizin en az temel a\u015famada olmas\u0131 gerekti\u011fini \u00f6nceden s\u00f6yl\u00fcyorum.As\u0131l mevzu \u015fundan ibarettir.Model katman\u0131nda, veritaban\u0131m\u0131zdan herhangi bir tablonun kolonlar\u0131n\u0131, Linq To SQL mimarisi sayesinde property olarak elde ediyor ve Validation vs. gibi i\u015flemlerine tabi tutmak i\u00e7in bu kolonlar\u0131 Bind ediyorduk.Daha sonra MetadataType Attribute&#8217;u ile bu kontrollerin hangi s\u0131n\u0131fta yap\u0131laca\u011f\u0131n\u0131 belirtiyorduk.<br \/>\n\u0130\u015fte bu, MetadataType ile g\u00f6sterilen s\u0131n\u0131fta manuel olarak yazd\u0131\u011f\u0131m\u0131z bilgilerin \u00e7oklu dil destek yap\u0131s\u0131na uygun olmalar\u0131n\u0131 sa\u011flayabiliriz.An\u0131msarsan\u0131z, Required yap\u0131s\u0131 verilen property de\u011ferinin bo\u015f ge\u00e7ilemeyece\u011fini s\u00f6ylemektedir ve ErrorMessage \u00f6zelli\u011fine verilen uyar\u0131y\u0131, aksi durumda kullan\u0131c\u0131ya g\u00f6stermektedir.Bu ErrorMessage \u00f6zelli\u011fine verdi\u011fimiz de\u011fer manuel oldu\u011fundan dolay\u0131, sitemizin o anki se\u00e7ilen dili ne olursa olsun ayn\u0131 manuel dilde yaz\u0131lacakt\u0131r.Bu ve buna benzer Attribute&#8217;larda \u00e7oklu dil deste\u011fi veren \u00f6zellikler mevcuttur.Bu yaz\u0131mda, bu Attribute&#8217;lar\u0131n (Required ve StringLenght Attribute&#8217;lari) \u00e7oklu dil deste\u011fine uygun hale getirmeyi g\u00f6rece\u011fiz.Ama konumuzun ana i\u00e7eri\u011fi bunlardan dolay\u0131 de\u011fildir.LocalizedDisplayNameAttribute isminde bir Attribute yazaca\u011f\u0131z.Buna sebep olan mevzu ise, DisplayName Attribute&#8217;unun, \u00e7oklu dil deste\u011fine uygun bir yap\u0131 vermemesidir.Evet biraz uzun oldu ama DisplayName \u00f6zelli\u011fi gibi, herhangi bir property ye verdi\u011fimiz Attribute sayesinde, o anki se\u00e7ili dile uygun isimleri g\u00f6sterecek Attribute&#8217;u yazmak bu yaz\u0131n\u0131n ana konusudur.<br \/>\n<!--more--><br \/>\n\u00d6ncelikle bundan \u00f6nceki yaz\u0131lar\u0131mda genellikle kullanm\u0131\u015fl\u0131\u011f\u0131m olan, Required ve StringLenght Attribute&#8217;larinin \u00e7oklu dil deste\u011fine uygun bir bi\u00e7imde olu\u015ftural\u0131m.<\/p>\n<p>Konuya devam etmeden \u00f6nce, <a href=\"http:\/\/www.gencayyildiz.com\/blog\/asp-net-mvc-coklu-dil-fonksiyonlari\" target=\"_blank\">Asp.NET MVC \u00c7oklu Dil Fonksiyonlar\u0131 \u2013 1<\/a> ve <a href=\"http:\/\/www.gencayyildiz.com\/blog\/asp-net-mvc-coklu-dil-fonksiyonlari-2\" target=\"_blank\">Asp.NET MVC \u00c7oklu Dil Fonksiyonlar\u0131 \u2013 2<\/a> ba\u015fl\u0131kl\u0131 yaz\u0131lara g\u00f6z atman\u0131z\u0131 tavsiye ediyorum.<\/p>\n<p>\u00d6rnek olarak, herhangi bir veri modelimizde, \u00f6rnek bir tablonun kolonlar\u0131 \u00fczerinde, Required ve StringLength Attribute&#8217;lar\u0131yla \u00f6zellikleri verelim.Ancak aksi durumda kullan\u0131c\u0131n\u0131n kar\u015f\u0131la\u015faca\u011f\u0131 mesaj\u0131n, o anki dil yap\u0131s\u0131na uygun bir bi\u00e7imde verilmesini sa\u011flayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;DisplayName(\"Kolon 1 :\")]\r\n\/\/Kolon1 propertysi \"Kolon 1 :\" ad\u0131nda g\u00f6z\u00fckecektir.\r\n        &#x5B;Required(ErrorMessageResourceName = \"Kolon1HataRequired\", ErrorMessageResourceType = typeof(Resources.lang))]\r\n\/\/Kolon1 propertysi bo\u015f b\u0131rak\u0131ld\u0131\u011f\u0131 zaman, \"lang\" ismindeki Resource dosyas\u0131nda \"Kolon1HataRequired\" ismindeki Name alan\u0131ndaki Value de\u011feri yaz\u0131lacakt\u0131r.\r\n        &#x5B;StringLength(15, ErrorMessageResourceName = \"Kolon1HataStringLength\", ErrorMessageResourceType = typeof(Resources.lang))]\r\n\/\/Kolon1 properysi en fazla 15 karakter olabilecek, aksi taktirde \"lang\" ismindeki Resource dosyas\u0131nda \"Kolon1HataStringLength\" ismindeki Name alan\u0131nda Value de\u011feri yaz\u0131lacakt\u0131r.\r\n        public int Kolon1{ get; set; }\r\n\r\n        &#x5B;DisplayName(\"Kolon 2\")]\r\n\r\n        &#x5B;Required(ErrorMessageResourceName = \"Kolon2HataRequired\", ErrorMessageResourceType = typeof(Resources.lang))]\r\n\r\n        &#x5B;StringLength(15, ErrorMessageResourceName = \"Kolon2HataStringLength\", ErrorMessageResourceType = typeof(Resources.lang))]\r\n\r\n        public string Kolon2 { get; set; }\r\n<\/pre>\n<p>Yukar\u0131daki kodlar\u0131 incelersek e\u011fer, Required ve StringLength Attribute&#8217;lar\u0131n\u0131n &#8220;ErrorMessageResourceName&#8221; \u00f6zelli\u011fine Resource dosyam\u0131zdaki Name alan\u0131ndaki ad\u0131 verirken, &#8220;ErrorMessageResourceType&#8221; \u00f6zelli\u011fine ise, Value de\u011ferini \u00e7al\u0131\u015ft\u0131racak Resource dosyas\u0131n\u0131 belirtiyoruz.<\/p>\n<p>E\u011fer bu \u015fekilde kullan\u0131rsak, aksi durumlarla kar\u015f\u0131la\u015f\u0131ld\u0131\u011f\u0131 zaman o anki dil yap\u0131s\u0131yla kullan\u0131c\u0131ya bildirim yapabiliriz.<\/p>\n<p>Ancak dikkat ederseniz, DisplayName Attribute&#8217;unda direkt Resource dosyas\u0131na ba\u011flanma gibi bir \u015fans\u0131m\u0131z olmad\u0131\u011f\u0131ndan dolay\u0131 yukar\u0131daki kodlarda manuel olarak isim vermek zorunda kald\u0131m.<\/p>\n<p>Peki ben DisplayName Attribute&#8217;unun de\u011feri T\u00fcrk\u00e7e dil yap\u0131s\u0131nda &#8220;Kolon 1&#8221; olan bir kolonu, \u0130ngilizce dil yap\u0131s\u0131nda &#8220;Column 1&#8221; olarak nas\u0131l de\u011fi\u015ftirebilirim? sorusunun yan\u0131t\u0131, LocalizedDisplayNameAttribute isminde bir Attribute yazmakt\u0131r.Asl\u0131nda bu ismi vermek zorunda de\u011filiz.Standart\u0131 bozmamak i\u00e7in, bir yap\u0131 olarak kullanaca\u011f\u0131m\u0131zdan dolay\u0131 Attribute&#8217;umuzu bu isimde yazaca\u011f\u0131z.<\/p>\n<p>Bu Attribute&#8217;un yaz\u0131m\u0131na ba\u015flamadan \u00f6nce, <a href=\"http:\/\/msdn.microsoft.com\" target=\"_blank\">msdn.microsoft.com<\/a> sitesinde bulunan <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/microsoft.biztalk.adapter.wcf.componentmodel.localizeddisplaynameattribute(v=bts.10).aspx?cs-save-lang=1&amp;cs-lang=csharp#code-snippet-1\" target=\"_blank\">LocalizedDisplayNameAttribute Class<\/a> ve <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/microsoft.biztalk.adapter.wcf.componentmodel.localizeddisplaynameattribute_members(v=bts.10).aspx\" target=\"_blank\">LocalizedDisplayNameAttribute Members<\/a> ba\u015fl\u0131kl\u0131 yaz\u0131lar\u0131 inceleyebilirsiniz.\u015eimdi LocalizedDisplayNameAttribute isimli Attribute&#8217;u muzun nas\u0131l yaz\u0131ld\u0131\u011f\u0131n\u0131 inceleyelim.<\/p>\n<p>\u00d6nceki yaz\u0131lar\u0131mda Attribute yazmay\u0131 irdelemi\u015ftik.An\u0131msarsan\u0131z e\u011fer, MVC&#8217;de Attribute yazmak i\u00e7in, olu\u015fturdu\u011fumuz s\u0131n\u0131f\u0131 &#8220;Attribute&#8221; s\u0131n\u0131f\u0131ndan t\u00fcretmemiz gerekmekteydi.LocalizedDisplayNameAttribute Attribute&#8217;unu yazarken,&#8221;Attribute&#8221; s\u0131n\u0131f\u0131ndan de\u011fil &#8220;DisplayNameAttribute&#8221; s\u0131n\u0131f\u0131ndan t\u00fcretece\u011fim.\u00c7\u00fcnk\u00fc, &#8220;DisplayNameAttribute&#8221; s\u0131n\u0131f\u0131 &#8220;Attribute&#8221; s\u0131n\u0131f\u0131ndan t\u00fcredi\u011fi i\u00e7in, do\u011fal olarak Attribute olarak kullan\u0131labilecek yap\u0131da olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing System;\r\nusing System.ComponentModel;\r\nusing System.Reflection;\r\n\/\/System k\u00fct\u00fcphansi d\u0131\u015f\u0131nda, ComponentModel ve Reflection k\u00fct\u00fcphanelerini projemize ekliyoruz.\r\nnamespace MvcApplication15.Attributes\r\n{\r\n    public class LocalizedDisplayNameAttribute : DisplayNameAttribute\r\n    {\r\n        PropertyInfo KeyDegeri;\r\n        Type LangResource;\r\n        \/\/Hangi dil yap\u0131s\u0131n\u0131n oldu\u011funu s\u00f6yleyen s\u0131n\u0131f tipi\r\n        public string NameDegeri { get; set; }\r\n        \/\/Resource dosyas\u0131nda ki Name de\u011ferimi tutacak de\u011fi\u015fken\r\n        public LocalizedDisplayNameAttribute(string NameDegeri)\r\n            : base(NameDegeri)\r\n        {\r\n            this.NameDegeri = NameDegeri;\r\n        }\r\n        public Type _LangResource\r\n        {\r\n            get { return LangResource; }\r\n            set\r\n            {\r\n                LangResource = value;\r\n                KeyDegeri = LangResource.GetProperty(NameDegeri, BindingFlags.Static | BindingFlags.NonPublic);\r\n            }\r\n        }\r\n        public override string DisplayName\r\n        {\r\n            get\r\n            {\r\n                if (KeyDegeri == null)\r\n                {\r\n                    return base.DisplayName;\r\n                }\r\n                return (string)KeyDegeri.GetValue(KeyDegeri.DeclaringType, null);\r\n            }\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Attribute&#8217;umuzu yukar\u0131daki gibi yaz\u0131yoruz.Kodlar\u0131 izah konusunda derin bir detay oldu\u011fu i\u00e7in bu alan\u0131 atl\u0131yorum.\u015eimdi yazd\u0131\u011f\u0131m\u0131z bu Attribute&#8217;u kullanal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;LocalizedDisplayName(\"KategoriDisplayName\", _LangResource = typeof(Resources.lang))]\r\n        public int Kolon1{ get; set; }\r\n<\/pre>\n<p>Yukar\u0131da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, Kolon1 ad\u0131na sahip propertynin DisplayName Attribute&#8217;una denk olan LocalizedDisplayName Attribute&#8217;unda, Resource dosyas\u0131n\u0131n Name alan\u0131nda bulunan &#8220;KategoriDisplayName&#8221; alan\u0131n\u0131n Value de\u011feri, o an kullan\u0131lan dil yap\u0131s\u0131na g\u00f6re yaz\u0131lacakt\u0131r.<\/p>\n<p>Art\u0131k bu yaz\u0131m\u0131nda sonuna gelmi\u015f bulunmaktay\u0131z.Faydalanman\u0131z dile\u011fiyle.<br \/>\nBir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere..<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar..<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba sevgili okuyucular\u0131m.Yeni y\u0131la ilk olarak LocalizedDisplayNameAttribute Attribute&#8217;u yazma konusunu ele alarak giri\u015f yapaca\u011f\u0131z :). Nedir bu LocalizedDisplayNameAttribute? diye bir soru y\u00f6neltti\u011finizi duyar gibiyim. Bu sorunun cevab\u0131n\u0131 verebilmek i\u00e7in, MVC temellerine dayal\u0131 bilgilerinizin en&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[746,313,324,283],"class_list":["post-1220","post","type-post","status-publish","format-standard","hentry","category-asp-net-mvc","tag-asp-net-mvc","tag-attribute","tag-localizeddisplaynameattribute","tag-mvc"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/1220","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=1220"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/1220\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=1220"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=1220"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=1220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}