ASP.NET MVC 5 - Перенаправление на ту же страницу с культурой
У меня есть локализация на моем проекте. Я хочу, чтобы каждый раз, когда пользователь изменял культуру, он перенаправлял его на ту же страницу, на которой он находился. Но теперь с новой культурой.
Например, если пользователь находится на странице регистрации, вот ссылка, которая появляется:
http://localhost:49445/pt/Account/Register
с pt
быть культурой.
Я начал осматриваться и придумал этот метод изменения культуры:
public ActionResult ChangeCulture(string lang)
{
var langCookie = new HttpCookie("lang", lang) { HttpOnly = true };
Response.AppendCookie(langCookie);
string url = this.Request.UrlReferrer.AbsoluteUri;
return Redirect(url);
}
Но очевидно, что это не сработает, потому что это просто перенаправит меня снова
http://localhost:49445/pt/Account/Register
вместо
http://localhost:49445/en/Account/Register
Я искал вокруг, ничего не находя. Может ли кто-нибудь указать мне правильное направление? Или дать хороший ответ?
2 ответа
Чтобы изменить только 1 параметр, такой как культура, используйте следующий помощник:
public static string ActionWithNewCulture(this UrlHelper urlHelper, string culture)
{
var newRouteData = new RouteValueDictionary(urlHelper.RequestContext.RouteData.Values);
newRouteData["culture"] = culture;
return urlHelper.RouteUrl(newRouteData);
}
Текущая культура должна быть частью ваших маршрутов:
Global.asax
const string defaultCulture = "sk";
routes.MapRoute(
"DefaultLocalized",
"{culture}/{controller}/{action}",
new { controller = "Home", action = "Index", culture = defaultCulture },
new { culture = "sk|cz" }
);
установить текущую культуру для каждого запроса:
protected void Application_BeginRequest()
{
SetCurrentCulture();
}
private void SetCurrentCulture()
{
var queryItems = Request.RawUrl.Split(new char [] {'/', '?'}, StringSplitOptions.RemoveEmptyEntries);
var currentCulture = new CultureInfo("sk-SK");
HashSet<string> suportedLanguages = new HashSet<string>() { "sk", "cz" };
var currentLang = string.Empty;
if (queryItems.Length > 0)
currentLang = queryItems[0].ToLowerInvariant();
if (suportedLanguages.Contains(currentLang))
{
if (currentLang == "cz")
{
currentCulture = new CultureInfo("cs-CZ");
}
}
Thread.CurrentThread.CurrentCulture = currentCulture;
Thread.CurrentThread.CurrentUICulture = currentCulture;
}
ссылка для переключения культур:
<a href="@Url.ActionWithCurrentQuery(new { culture = "sk" })" title="Slovensky" class="m-xs right">
<img src="@Url.Content("~/Content/Images/slovak-flag.GIF")" alt="Slovensky" title="Slovensky" />
</a>
действие с текущим запросом генерирует HTML на основе текущего URL, но с другой культурой:
/ en / Home / Action? param = 1 становится /de/Home/Action?param=1
public static string ActionWithCurrentQuery(this UrlHelper urlHelper, string actionName, string controllerName, object routeValues)
{
var request = urlHelper.RequestContext.HttpContext.Request;
var url = urlHelper.Action(actionName, controllerName, routeValues, "http");
var uriBuilder = new UriBuilder(url);
var query = HttpUtility.ParseQueryString(string.Empty);
foreach (string key in request.QueryString.Keys)
{
query[key] = request[key];
}
var routeQuery = HttpUtility.ParseQueryString(uriBuilder.Query);
foreach (string key in routeQuery)
{
query[key] = routeQuery[key];
}
uriBuilder.Query = query.ToString();
return uriBuilder.ToString();
}