Я работаю с клиентом, который хочет, чтобы URL-адреса в нашем веб-приложении были на французском языке. Я английский разработчик, и у нас также есть английские клиенты. Это интересная проблема, но я не думаю, что это то, что ASP.NET MVC Framework поддержит.
Вот сценарий. Маршрут ...
Конкретный ПРИМЕР
Английский URL
www.stackoverflow.com/questions/ask
также будет поддерживать
Французский URL
www.stackoverflow.com/problème/poser
Общий пример
Английский URL
http://clientA.product.com/AreaNameEnglish/ControllerNameEnglish/ActionNameEnglish/params
также необходимо поддерживать
Французский URL
http://clientB.product.com/AreaNameFrench/ControllerNameFrench/ActionNameFrench/params
Таким образом, в MVC мой Регион, Контроллер и Действия должны иметь переводы на английский и французский языки.
Очевидно, что ремонтопригодность была бы ОГРОМНОЙ проблемой, если бы я перешел и жестко запрограммировал все свои имена контроллеров, представлений и действий на французский. Есть ли способ локализовать маршрут, представленный в браузере, без этого? Помните, что в приложении много разных маршрутов. Пара областей, каждая из которых имеет несколько контроллеров, каждая из которых имеет множество действий?
Спасибо,
Justin
EDIT
Благодаря @womp, вот что я придумала до сих пор ... Хотя, в конце концов, я воспользовался подходом, который я опубликовал в качестве ответа.
public class LocalizedControllerFactory : DefaultControllerFactory
{
public override IController CreateController(RequestContext requestContext, string controllerName)
{
if (string.IsNullOrEmpty(controllerName))
throw new ArgumentNullException("controllerName");
if (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "fr")
{
controllerName = this.ReplaceControllerName(requestContext, controllerName);
this.ReplaceActionName(requestContext);
this.ReplaceAreaName(requestContext);
}
return base.CreateController(requestContext, controllerName);
}
private string ReplaceControllerName(RequestContext requestContext, string controllerName)
{
// would use the language above to pick the propery controllerMapper. For now just have french
Dictionary<string, string> controllerMapper = new Dictionary<string, string>()
{
{"frenchControllerA", "englishControllerA"},
{"frenchControllerB", "englishControllerB"}
};
return this.ReplaceRouteValue(requestContext, "controller", controllerMapper);
}
private void ReplaceAreaName(RequestContext requestContext)
{
// would use the language above to pick the propery areaMapper. For now just have french
Dictionary<string, string> areaMapper = new Dictionary<string, string>()
{
{"frenchAreaX", "englishAreaX"},
{"frenchAreaY", "englishAreaY"}
};
this.ReplaceRouteValue(requestContext, "area", areaMapper);
}
private void ReplaceActionName(RequestContext requestContext)
{
// would use the language above to pick the propery actionMapper. For now just have french
Dictionary<string, string> actionMapper = new Dictionary<string, string>()
{
{"frenchAction1", "englishAction1"},
{"frenchAction2", "englishAction2"}
};
this.ReplaceRouteValue(requestContext, "action", actionMapper);
}
private string ReplaceRouteValue(RequestContext requestContext, string paramName, Dictionary<string, string> translationLookup)
{
if (requestContext.RouteData.Values[paramName] == null)
{
return null;
}
string srcRouteValue = requestContext.RouteData.Values[paramName] as string;
if (srcRouteValue != null && translationLookup.ContainsKey(srcRouteValue))
{
requestContext.RouteData.Values[paramName] = translationLookup[srcRouteValue];
}
return requestContext.RouteData.Values[paramName] as string;
}
}
Достойное начало. Если я локализую только ControllerName и ActionName в URL, он найдет и отобразит правильный View. Однако у меня есть следующие проблемы.
Название области не может быть переведено
Локализация Area означает, что метод Controller.View () не может найти Views.
Несмотря на то, что я заменил имя области в контексте запроса, метод ViewEngineCollection.Find (), похоже, не подхватил его. В любом месте моего класса Controller, который "return View ()" не может найти представление по умолчанию для своего действия. Если я не локализую Район, другие шаги сработают.
RedirectToAction или Html.ActionLink
Каждый раз, когда приложение вызывает RedirectToAction или если я использую помощник Html.ActionLink или что-то похожее на URL-адреса, генерируемые на английском языке. Похоже, мне придется добавить логику где-то, возможно, в нескольких местах, чтобы преобразовать английский URL во французский (или другой язык).