Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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);
        }
Exemple #10
0
        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());
        }