Merahabar;
MVC ile çok dil desteiği yapmanın bir kaç yolu var ancak ben URL Routing ile yapmak istiyorum. Bunun için baya bi araştırdım bir şeyler buldum ancak sorunumu çözemedim. Yaptıklarım;
public class CultureConstraint : IRouteConstraint { private string[] _values; public CultureConstraint(params string[] values) { this._values = values; } public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { string value = values[parameterName].ToString(); return _values.Contains(value); } } public enum Culture { tr = 1, en = 2 }
public class MultiCultureMvcRouteHandler : MvcRouteHandler { protected override IHttpHandler GetHttpHandler(RequestContext requestContext) { var culture = requestContext.RouteData.Values["culture"].ToString(); var ci = new CultureInfo(culture); Thread.CurrentThread.CurrentUICulture = ci; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name); return base.GetHttpHandler(requestContext); } }
Sitenin Layout'un da bulanan kodlar.
@Html.ActionLink("eng", "ChangeCulture", "AnaSayfa", new { lang = (int)Test.Models.Culture.en, returnUrl = this.Request.RawUrl }, new { @class = "culture-link" }) @Html.ActionLink("tr", "ChangeCulture", "AnaSayfa", new { lang = (int)Test.Models.Culture.tr, returnUrl = this.Request.RawUrl }, new { @class = "culture-link" })
public class Layout { [Display(ResourceType = typeof(lang), Name = "Menu_AnaSayfa")] public string AnaSayfa { get; set; } }
<a class="active " href="#">@Html.LabelFor(c=>c.AnaSayfa)</a>
RouteConfig
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "AnaSayfa", action = "Index", id = UrlParameter.Optional }
);foreach (Route r in routes) { if (!(r.RouteHandler is SingleCultureMvcRouteHandler)) { r.RouteHandler = new MultiCultureMvcRouteHandler(); r.Url = "{culture}/" + r.Url; if (r.Defaults == null) { r.Defaults = new RouteValueDictionary(); } r.Defaults.Add("culture", Culture.tr.ToString()); if (r.Constraints == null) { r.Constraints = new RouteValueDictionary(); } r.Constraints.Add("culture", new CultureConstraint(Culture.en.ToString(),Culture.tr.ToString())); } }
lang.resx
public static string Menu_AnaSayfa { get { return ResourceManager.GetString("Menu_AnaSayfa", resourceCulture); } }Projeyi derlediğimde RessourceCulture parametresi boş geliyor sorunu çözemedim Url routing yöntemi ile anlatan bir kaynak varsa paylaşırsanız memnun olurum.