/// <summary> /// Returns information about the URL that is associated with the route. /// </summary> /// <param name="requestContext">An object that encapsulates information about the requested route.</param> /// <param name="values">An object that contains the parameters for a route.</param> /// <returns> /// An object that contains information about the URL that is associated with the route. /// </returns> public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { var data = base.GetVirtualPath(requestContext, values); if (data != null && DataSettings.DatabaseIsInstalled() && SeoFriendlyUrlsForLanguagesEnabled) { var helper = new LocalizedUrlHelper(requestContext.HttpContext.Request, true); if (helper.IsLocalizedUrl(out string cultureCode)) { if (requestContext.RouteData.DataTokens.Get("SeoCodeReplacement") is string seoCodeReplacement) { // The LanguageSeoCode filter detected a localized URL, but the locale does not exist or is inactive. // The routing system is therefore about to render the "NotFound" view. Here we ensure that generated links // in NotFound page do not contain the invalid seo code anymore: Either we strip it off or we replace it // with the default language's seo code (according to "LocalizationSettings.DefaultLanguageRedirectBehaviour" setting). cultureCode = seoCodeReplacement; } if (cultureCode.HasValue()) { data.VirtualPath = String.Concat(cultureCode, "/", data.VirtualPath).TrimEnd('/'); } } } return(data); }
/// <summary> /// Returns information about the requested route. /// </summary> /// <param name="httpContext">An object that encapsulates information about the HTTP request.</param> /// <returns> /// An object that contains the values from the route definition. /// </returns> public override RouteData GetRouteData(HttpContextBase httpContext) { if (DataSettings.DatabaseIsInstalled() && SeoFriendlyUrlsForLanguagesEnabled) { var helper = new LocalizedUrlHelper(httpContext.Request); if (helper.IsLocalizedUrl()) { helper.StripSeoCode(); httpContext.RewritePath("~/" + helper.RelativePath, true); } } if (_leftPart == null) { var url = this.Url; int idx = url.IndexOf('{'); _leftPart = "~/" + (idx >= 0 ? url.Substring(0, idx) : url).TrimEnd('/'); } // Perf if (!httpContext.Request.AppRelativeCurrentExecutionFilePath.StartsWith(_leftPart, true, CultureInfo.InvariantCulture)) { return(null); } RouteData data = base.GetRouteData(httpContext); return(data); }
/// <summary> /// Returns information about the requested route. /// </summary> /// <param name="httpContext">An object that encapsulates information about the HTTP request.</param> /// <returns> /// An object that contains the values from the route definition. /// </returns> public override RouteData GetRouteData(HttpContextBase httpContext) { if (DataSettings.DatabaseIsInstalled() && this.SeoFriendlyUrlsForLanguagesEnabled) { var helper = new LocalizedUrlHelper(httpContext.Request); if (helper.IsLocalizedUrl()) { helper.StripSeoCode(); httpContext.RewritePath("~/" + helper.RelativePath, true); } } RouteData data = base.GetRouteData(httpContext); return(data); }
/// <summary> /// Returns information about the URL that is associated with the route. /// </summary> /// <param name="requestContext">An object that encapsulates information about the requested route.</param> /// <param name="values">An object that contains the parameters for a route.</param> /// <returns> /// An object that contains information about the URL that is associated with the route. /// </returns> public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { VirtualPathData data = base.GetVirtualPath(requestContext, values); if (data != null && DataSettings.DatabaseIsInstalled() && this.SeoFriendlyUrlsForLanguagesEnabled) { var helper = new LocalizedUrlHelper(requestContext.HttpContext.Request, true); string cultureCode; if (helper.IsLocalizedUrl(out cultureCode)) { data.VirtualPath = String.Concat(cultureCode, "/", data.VirtualPath); } } return(data); }
protected LanguageSelectorModel PrepareLanguageSelectorModel() { var availableLanguages = _services.Cache.Get(string.Format(ModelCacheEventConsumer.AVAILABLE_LANGUAGES_MODEL_KEY, _services.StoreContext.CurrentStore.Id), () => { var result = _languageService.Value .GetAllLanguages(storeId: _services.StoreContext.CurrentStore.Id) .Select(x => new LanguageModel { Id = x.Id, Name = x.Name, NativeName = GetLanguageNativeName(x.LanguageCulture) ?? x.Name, ISOCode = x.LanguageCulture, SeoCode = x.UniqueSeoCode, FlagImageFileName = x.FlagImageFileName }) .ToList(); return result; }); var workingLanguage = _services.WorkContext.WorkingLanguage; var model = new LanguageSelectorModel() { CurrentLanguageId = workingLanguage.Id, AvailableLanguages = availableLanguages, UseImages = _localizationSettings.UseImagesForLanguageSelection }; string defaultSeoCode = _languageService.Value.GetDefaultLanguageSeoCode(); foreach (var lang in model.AvailableLanguages) { var helper = new LocalizedUrlHelper(HttpContext.Request, true); if (_localizationSettings.SeoFriendlyUrlsForLanguagesEnabled) { if (lang.SeoCode == defaultSeoCode && (int)(_localizationSettings.DefaultLanguageRedirectBehaviour) > 0) { helper.StripSeoCode(); } else { helper.PrependSeoCode(lang.SeoCode, true); } } model.ReturnUrls[lang.SeoCode] = helper.GetAbsolutePath(); } return model; }
public ActionResult SetLanguage(int langid, string returnUrl = "") { var language = _languageService.Value.GetLanguageById(langid); if (language != null && language.Published) { _services.WorkContext.WorkingLanguage = language; } // url referrer if (String.IsNullOrEmpty(returnUrl)) { returnUrl = _services.WebHelper.GetUrlReferrer(); } // home page if (String.IsNullOrEmpty(returnUrl)) { returnUrl = Url.RouteUrl("HomePage"); } if (_localizationSettings.SeoFriendlyUrlsForLanguagesEnabled) { var helper = new LocalizedUrlHelper(HttpContext.Request.ApplicationPath, returnUrl, true); helper.PrependSeoCode(_services.WorkContext.WorkingLanguage.UniqueSeoCode, true); returnUrl = helper.GetAbsolutePath(); } return Redirect(returnUrl); }
public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext == null || filterContext.HttpContext == null) { return; } HttpRequestBase request = filterContext.HttpContext.Request; if (request == null) { return; } //don't apply filter to child methods if (filterContext.IsChildAction) { return; } //only GET requests if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) { return; } // ensure that this route is registered and localizable (LocalizedRoute in RouteProvider.cs) if (filterContext.RouteData == null || filterContext.RouteData.Route == null || !(filterContext.RouteData.Route is LocalizedRoute)) { return; } if (!DataSettings.DatabaseIsInstalled()) { return; } var localizationSettings = LocalizationSettings.Value; if (!localizationSettings.SeoFriendlyUrlsForLanguagesEnabled) { return; } // process current URL var workContext = WorkContext.Value; var languageService = LanguageService.Value; var workingLanguage = workContext.WorkingLanguage; var helper = new LocalizedUrlHelper(filterContext.HttpContext.Request, true); string defaultSeoCode = languageService.GetDefaultLanguageSeoCode(); string seoCode; if (helper.IsLocalizedUrl(out seoCode)) { if (!languageService.IsPublishedLanguage(seoCode)) { var descriptor = filterContext.ActionDescriptor; // language is not defined in system or not assigned to store if (localizationSettings.InvalidLanguageRedirectBehaviour == InvalidLanguageRedirectBehaviour.ReturnHttp404) { filterContext.Result = new ViewResult { ViewName = "NotFound", MasterName = (string)null, ViewData = new ViewDataDictionary <HandleErrorInfo>(new HandleErrorInfo(new HttpException(404, "The resource does not exist."), descriptor.ActionName, descriptor.ControllerDescriptor.ControllerName)), TempData = filterContext.Controller.TempData }; filterContext.RouteData.Values["StripInvalidSeoCode"] = true; filterContext.RequestContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound; filterContext.RequestContext.HttpContext.Response.TrySkipIisCustomErrors = true; } else if (localizationSettings.InvalidLanguageRedirectBehaviour == InvalidLanguageRedirectBehaviour.FallbackToWorkingLanguage) { helper.StripSeoCode(); filterContext.Result = new RedirectResult(helper.GetAbsolutePath(), true); } } else { // redirect default language (if desired) if (seoCode == defaultSeoCode && localizationSettings.DefaultLanguageRedirectBehaviour == DefaultLanguageRedirectBehaviour.StripSeoCode) { helper.StripSeoCode(); filterContext.Result = new RedirectResult(helper.GetAbsolutePath(), true); } } // already localized URL, skip the rest return; } // keep default language prefixless (if desired) if (workingLanguage.UniqueSeoCode == defaultSeoCode && (int)(localizationSettings.DefaultLanguageRedirectBehaviour) > 0) { return; } // add language code to URL helper.PrependSeoCode(workingLanguage.UniqueSeoCode); filterContext.Result = new RedirectResult(helper.GetAbsolutePath()); }
public ActionResult SetLanguage(int langid, string returnUrl = "") { var language = _languageService.Value.GetLanguageById(langid); if (language != null && language.Published) { _services.WorkContext.WorkingLanguage = language; } if (_localizationSettings.SeoFriendlyUrlsForLanguagesEnabled) { var helper = new LocalizedUrlHelper(HttpContext.Request.ApplicationPath, returnUrl, true); helper.PrependSeoCode(_services.WorkContext.WorkingLanguage.UniqueSeoCode, true); returnUrl = helper.GetAbsolutePath(); } return RedirectToReferrer(returnUrl); }
private LocalizedUrlHelper CreateUrlHelperForLanguageSelector(LanguageModel model, int currentLanguageId) { if (currentLanguageId != model.Id) { var routeValues = this.Request.RequestContext.RouteData.Values; var controller = routeValues["controller"].ToString(); object val; if (!routeValues.TryGetValue(controller + "id", out val)) { controller = routeValues["action"].ToString(); routeValues.TryGetValue(controller + "id", out val); } int entityId = 0; if (val != null) { entityId = val.Convert<int>(); } if (entityId > 0) { var activeSlug = _urlRecordService.Value.GetActiveSlug(entityId, controller, model.Id); if (activeSlug.HasValue()) { var helper = new LocalizedUrlHelper(Request.ApplicationPath, activeSlug, false); return helper; } } } return new LocalizedUrlHelper(HttpContext.Request, true); }
public virtual void OnAuthorization(AuthorizationContext filterContext) { var request = filterContext?.HttpContext?.Request; if (request == null) { return; } // Don't apply filter to child methods if (filterContext.IsChildAction) { return; } //only GET requests if (!string.Equals(request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) { return; } // ensure that this route is registered and localizable (LocalizedRoute in RouteProvider.cs) if (!(filterContext.RouteData?.Route is LocalizedRoute)) { return; } if (!DataSettings.DatabaseIsInstalled()) { return; } var localizationSettings = LocalizationSettings.Value; if (!localizationSettings.SeoFriendlyUrlsForLanguagesEnabled) { return; } // Process current URL var workContext = WorkContext.Value; var languageService = LanguageService.Value; var workingLanguage = workContext.WorkingLanguage; var helper = new LocalizedUrlHelper(request, true); var defaultSeoCode = languageService.GetDefaultLanguageSeoCode(); if (helper.IsLocalizedUrl(out var seoCode)) { if (!languageService.IsPublishedLanguage(seoCode)) { // Language is not defined in system or not assigned to store if (localizationSettings.InvalidLanguageRedirectBehaviour == InvalidLanguageRedirectBehaviour.ReturnHttp404) { filterContext.Result = HandleExceptionFilter.Create404Result(filterContext); var seoCodeReplacement = localizationSettings.DefaultLanguageRedirectBehaviour == DefaultLanguageRedirectBehaviour.PrependSeoCodeAndRedirect ? workingLanguage.GetTwoLetterISOLanguageName() : string.Empty; filterContext.RequestContext.RouteData.DataTokens["SeoCodeReplacement"] = seoCodeReplacement; } else if (localizationSettings.InvalidLanguageRedirectBehaviour == InvalidLanguageRedirectBehaviour.FallbackToWorkingLanguage) { helper.StripSeoCode(); filterContext.Result = new RedirectResult(helper.GetAbsolutePath(), !request.IsLocal); } } else { // Redirect default language (if desired) if (seoCode == defaultSeoCode && localizationSettings.DefaultLanguageRedirectBehaviour == DefaultLanguageRedirectBehaviour.StripSeoCode) { helper.StripSeoCode(); filterContext.Result = new RedirectResult(helper.GetAbsolutePath(), !request.IsLocal); } } // Already localized URL, skip the rest return; } // Keep default language prefixless (if desired) if (workingLanguage.UniqueSeoCode == defaultSeoCode && (int)(localizationSettings.DefaultLanguageRedirectBehaviour) > 0) { return; } // Add language code to URL helper.PrependSeoCode(workingLanguage.UniqueSeoCode); filterContext.Result = new RedirectResult(helper.GetAbsolutePath()); }
public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext == null || filterContext.HttpContext == null) return; HttpRequestBase request = filterContext.HttpContext.Request; if (request == null) return; //don't apply filter to child methods if (filterContext.IsChildAction) return; //only GET requests if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) return; // ensure that this route is registered and localizable (LocalizedRoute in RouteProvider.cs) if (filterContext.RouteData == null || filterContext.RouteData.Route == null || !(filterContext.RouteData.Route is LocalizedRoute)) return; if (!DataSettings.DatabaseIsInstalled()) return; var localizationSettings = LocalizationSettings.Value; if (!localizationSettings.SeoFriendlyUrlsForLanguagesEnabled) return; // process current URL var workContext = WorkContext.Value; var workingLanguage = workContext.WorkingLanguage; var helper = new LocalizedUrlHelper(filterContext.HttpContext.Request, true); string defaultSeoCode = workContext.GetDefaultLanguageSeoCode(); string seoCode; if (helper.IsLocalizedUrl(out seoCode)) { if (!workContext.IsPublishedLanguage(seoCode)) { var descriptor = filterContext.ActionDescriptor; // language is not defined in system or not assigned to store if (localizationSettings.InvalidLanguageRedirectBehaviour == InvalidLanguageRedirectBehaviour.ReturnHttp404) { filterContext.Result = new ViewResult { ViewName = "NotFound", MasterName = (string)null, ViewData = new ViewDataDictionary<HandleErrorInfo>(new HandleErrorInfo(new HttpException(404, "The resource does not exist."), descriptor.ActionName, descriptor.ControllerDescriptor.ControllerName)), TempData = filterContext.Controller.TempData }; filterContext.RouteData.Values["StripInvalidSeoCode"] = true; filterContext.RequestContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound; filterContext.RequestContext.HttpContext.Response.TrySkipIisCustomErrors = true; } else if (localizationSettings.InvalidLanguageRedirectBehaviour == InvalidLanguageRedirectBehaviour.FallbackToWorkingLanguage) { helper.StripSeoCode(); filterContext.Result = new RedirectResult(helper.GetAbsolutePath(), true); } } else { // redirect default language (if desired) if (seoCode == defaultSeoCode && localizationSettings.DefaultLanguageRedirectBehaviour == DefaultLanguageRedirectBehaviour.StripSeoCode) { helper.StripSeoCode(); filterContext.Result = new RedirectResult(helper.GetAbsolutePath(), true); } } // already localized URL, skip the rest return; } // keep default language prefixless (if desired) if (workingLanguage.UniqueSeoCode == defaultSeoCode && (int)(localizationSettings.DefaultLanguageRedirectBehaviour) > 0) { return; } // add language code to URL helper.PrependSeoCode(workingLanguage.UniqueSeoCode); filterContext.Result = new RedirectResult(helper.GetAbsolutePath()); }
public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext == null || filterContext.HttpContext == null) return; HttpRequestBase request = filterContext.HttpContext.Request; if (request == null) return; //don't apply filter to child methods if (filterContext.IsChildAction) return; //only GET requests if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) return; // ensure that this route is registered and localizable (LocalizedRoute in RouteProvider.cs) if (filterContext.RouteData == null || filterContext.RouteData.Route == null || !(filterContext.RouteData.Route is LocalizedRoute)) return; if (!DataSettings.DatabaseIsInstalled()) return; var localizationSettings = EngineContext.Current.Resolve<LocalizationSettings>(); if (!localizationSettings.SeoFriendlyUrlsForLanguagesEnabled) return; // process current URL var workContext = EngineContext.Current.Resolve<IWorkContext>(); var workingLanguage = workContext.WorkingLanguage; var helper = new LocalizedUrlHelper(filterContext.HttpContext.Request, true); string defaultSeoCode = workContext.GetDefaultLanguageSeoCode(); string seoCode; if (helper.IsLocalizedUrl(out seoCode)) { if (!workContext.IsPublishedLanguage(seoCode)) { // language is not defined in system or not assigned to store if (localizationSettings.InvalidLanguageRedirectBehaviour == InvalidLanguageRedirectBehaviour.ReturnHttp404) { filterContext.Result = new RedirectResult("~/404"); } else if (localizationSettings.InvalidLanguageRedirectBehaviour == InvalidLanguageRedirectBehaviour.FallbackToWorkingLanguage) { helper.StripSeoCode(); filterContext.Result = new RedirectResult(helper.GetAbsolutePath(), true); } } else { // redirect default language (if desired) if (seoCode == defaultSeoCode && localizationSettings.DefaultLanguageRedirectBehaviour == DefaultLanguageRedirectBehaviour.StripSeoCode) { helper.StripSeoCode(); filterContext.Result = new RedirectResult(helper.GetAbsolutePath(), true); } } // already localized URL, skip the rest return; } // keep default language prefixless (if desired) if (workingLanguage.UniqueSeoCode == defaultSeoCode && (int)(localizationSettings.DefaultLanguageRedirectBehaviour) > 0) { return; } // add language code to URL helper.PrependSeoCode(workingLanguage.UniqueSeoCode); filterContext.Result = new RedirectResult(helper.GetAbsolutePath()); }