Je travaille avec un client qui veut que les URL de notre application web soient en français. Je suis un développeur anglais et nous avons aussi des clients anglais. C'est un problème intéressant mais je ne pense pas que ce soit quelque chose que le framework ASP.NET MVC supporterait.Est-il possible de localiser une URL/un routage dans ASP.NET MVC?
Voici le scénario. La route ...
Exemple spécifique
Anglais URL
www.stackoverflow.com/questions/ask
soutiendrait également
URL Français
www.stackoverflow.com/problème/colle
exemple générique
Anglais URL
http://clientA.product.com/AreaNameEnglish/ControllerNameEnglish/ActionNameEnglish/params
doit également soutenir
URL Français
http://clientB.product.com/AreaNameFrench/ControllerNameFrench/ActionNameFrench/params
Donc dans MVC ma région, contrôleur et actions doivent tous avoir à la fois l'anglais et les traductions françaises.
Évidemment, la maintenabilité serait un énorme problème si je devais aller coder en dur tous mes noms de contrôleurs, de vues et d'actions en français. Est-il possible de localiser la route qui est présentée dans le navigateur sans le faire? En gardant à l'esprit il y a beaucoup de routes différentes dans l'application. Un couple zones avec une poignée de contrôleurs chacun avec de nombreuses actions?
Merci,
Justin
EDIT
Merci à @womp voici ce que je suis venu avec jusqu'à présent ... Même si en fin de compte, je pris l'approche que je posté en réponse .
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;
}
}
Un démarrage décent. Si je localise juste le ControllerName et ActionName dans l'Url il trouvera et rendra la vue appropriée. Cependant, j'ai les problèmes suivants.
Nom de la zone ne peut pas être traduit
zone Décentraliser les moyens de la méthode Controller.View() ne trouve pas vues. Même si j'ai remplacé le nom de la zone dans le contexte de la requête, la méthode ViewEngineCollection.Find() ne semble pas l'attraper. N'importe où dans ma classe de contrôleur qui fait "return View()" ne parvient pas à trouver l'affichage par défaut pour son action. Si je ne localise pas la zone, les autres étapes fonctionnent.
RedirectToAction ou Html.ActionLink
Chaque fois que l'application appelle RedirectToAction ou si j'utilise une aide de Html.ActionLink ou quelque chose de similaire génèrent les urls sont les Anglais. Il semble que je vais devoir ajouter de la logique quelque part dans plusieurs endroits pour convertir un Url anglais en français (ou autre langue).
Belle trouvaille. C'est essentiellement le même concept, sauf encapsulé dans le routage, plutôt que dans la logique d'instanciation du contrôleur. Je suis d'accord, c'est probablement un peu plus élégant, cela semble être un domaine plus approprié pour la solution. – womp
Je sais que c'est un vieux message, mais vous venez de sauver ma peau. Très bonne réponse! –