diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs index 79f9f17b2d..6399b58f0b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs @@ -1,5 +1,8 @@ -using Microsoft.AspNetCore.Localization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.Mvc; +using System; +using Volo.Abp.Settings; namespace Volo.Abp.AspNetCore.Mvc.Localization { @@ -8,12 +11,40 @@ namespace Volo.Abp.AspNetCore.Mvc.Localization public class AbpLanguagesController : AbpController { [HttpGet] - public IActionResult Switch(string culture, string uiCulture = "") //TODO: Implement return URL + public IActionResult Switch(string culture, string uiCulture = "", string returnUrl = "") { - //TODO: Check allowed languages and so on... + if (!GlobalizationHelper.IsValidCultureCode(culture)) + { + throw new AbpException("Unknown language: " + culture + ". It must be a valid culture!"); + } - Response.Cookies.Append(CookieRequestCultureProvider.DefaultCookieName, $"c={culture}|uic={uiCulture ?? culture}"); + string cookieValue = CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture, uiCulture)); + + Response.Cookies.Append(CookieRequestCultureProvider.DefaultCookieName, cookieValue, new CookieOptions + { + Expires = Clock.Now.AddYears(2) + }); + + if (!string.IsNullOrWhiteSpace(returnUrl)) + { + return Redirect(GetRedirectUrl(returnUrl)); + } return Redirect("/"); } + + private string GetRedirectUrl(string returnUrl) + { + if (returnUrl.IsNullOrEmpty()) + { + return "/"; + } + + if (Url.IsLocalUrl(returnUrl)) + { + return returnUrl; + } + + return "/"; + } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/GlobalizationHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/GlobalizationHelper.cs new file mode 100644 index 0000000000..a84faeb8f9 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/GlobalizationHelper.cs @@ -0,0 +1,26 @@ +using System; +using System.Globalization; + +namespace Volo.Abp.AspNetCore.Mvc.Localization +{ + internal static class GlobalizationHelper + { + public static bool IsValidCultureCode(string cultureCode) + { + if (cultureCode.IsNullOrWhiteSpace()) + { + return false; + } + + try + { + CultureInfo.GetCultureInfo(cultureCode); + return true; + } + catch (CultureNotFoundException) + { + return false; + } + } + } +} \ No newline at end of file