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); }
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 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); }
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()); }