c# - actual - Cómo enrutar una URL de varios idiomas con un MVC
obtener la url actual c# (4)
Necesito la ruta URL en varios idiomas del controlador existente. Déjame explicarte más:
Tengo un controlador con nombre "Producto" y Ver con nombre "Software"; por lo tanto, de forma predeterminada, si el usuario ingresa " http://example.com/en/Product/Software ", obtenga el contenido correcto (que realmente existe en http://example.com/Product/Software ),
Sin embargo, si otro usuario, un usuario francés, escribe " http://example.com/fr/Produits/logiciels ", debe superar el controlador y mostrar el contenido correcto (el mismo http://example.com/Product/Software pero con texto en francés).
Nota: configuro la tabla de rutas con "{language} / {controller} / {action} / {id}"
Cualquier otra URL inválida debe mostrar la página 404.
¿Es posible?
Como se ha sugerido anteriormente, esto se aparta de la convención donde las direcciones URL (y rutas) del sitio web utilizan el inglés.
Sin embargo, es posible, pero para hacerlo, probablemente tenga que buscar generar una ruta por acción para cada idioma extranjero. Entonces, para un sitio web con 20 acciones y tres idiomas (inglés, francés y alemán), necesitará 41 rutas (20 francés, 20 alemán y 1 inglés). No es el sistema más eficiente, lo admito, pero funciona como usted quiere.
//You''ll only need one of these, which is the default.
routes.MapRoute(
"English route",
"en/{controller}/{action}/{id}"
new { controller = "Home", action = "Index", language = "en" },
);
routes.MapRoute(
"FrenchHome",
"fr/Demarrer/Index/{id}",
new { controller = "Home", action = "Index", language = "fr" }
);
routes.MapRoute(
"GermanHome",
"de/Heim/Index/{id}", //''Heim'' is, I believe the correct usage of Home in German.
new { controller = "Home", action = "Index", language = "de" }
);
//Some more routes...
routes.MapRoute(
"FrenchSoftware",
"fr/Produit/Logiciels/{id}",
new { controller = "Product", action = "Software", language = "fr" }
);
routes.MapRoute(
"GermanSoftware",
"de/Produkt/Software/{id}", //In this instance, Software should be the same in German and English.
new { controller = "Product", action = "Software", language = "de" }
);
//And finally, the 404 action.
routes.MapRoute(
"Catchall",
"{language}/{*catchall}",
new { controller = "Home", action = "PageNotFound", language = "en" },
new { language = "^(en|fr|de)$" }
);
//This is for the folks who didn''t put a language in their url.
routes.MapRoute(
"Catchall",
"{*catchall}",
new { controller = "Home", action = "PageNotFound", language = "en" }
);
En tus acciones, por ejemplo Producto / Software ...
public ActionResult Software(string language, int id)
{
//This would go off to the DAL and get the content in whatever language you want.
ProductModel model = ProductService.GetSoftware(language, id);
return View(model);
}
Me encantaría que alguien viniera y dijera que hay una mejor manera de hacerlo, porque estoy de acuerdo en que tener la url en un idioma extranjero no es bueno, y dado que la propia Internet se está moviendo para permitir la entrada de caracteres no romanos. urls, cuanto antes veamos soluciones a esto, mejor.
No solo eso, también sé que a los franceses orgullosos no les gusta ver que las URL de sus sitios web contienen inglés. :)
Debería tener url algo como " http://mysite.com/en/Product/Software " para inglés y " http://mysite.com/fr/Product/Software " para francés, lo que tendría mucho sentido.
Usa la misma vista para ambos.
Feliz codificacion
Recomiendo encarecidamente el siguiente enfoque para implementar el multilenguaje en una aplicación web MVC 5 (y <), porque me parece que es el más versátil entre los que he probado en los últimos años.
Básicamente necesitas implementar tres cosas:
- Una ruta compatible con múltiples idiomas para manejar las URL entrantes (si está utilizando MVC5 o una versión superior, también podría optar por el enrutamiento basado en atributos , pero prefiero usar una regla global para manejar esto).
- Un atributo de localización para manejar este tipo de solicitudes en varios idiomas.
- Un método auxiliar para generar estas URL dentro de su aplicación (métodos de extensión
Html.ActionLink
y / oUrl.Action
).
Vea esta respuesta para más detalles y ejemplos de código.
Para obtener información adicional y más ejemplos sobre este tema, también puede leer, también puede leer esta publicación de blog que escribí sobre este tema.
Sobre la base de la publicación de Dan, estoy usando lo siguiente para traducir mis nombres de controlador y de acción.
Creé una tabla para almacenar los valores, esto podría y probablemente debería mantenerse en los archivos de recursos para mantener todo junto; sin embargo, utilicé una tabla de base de datos, ya que funciona mejor con los procesos de mis empresas.
CREATE TABLE [dbo].[RoutingTranslations](
[RouteId] [int] IDENTITY(1,1) NOT NULL,
[ControllerName] [nvarchar](50) NOT NULL,
[ActionName] [nvarchar](50) NOT NULL,
[ControllerDisplayName] [nvarchar](50) NOT NULL,
[ActionDisplayName] [nvarchar](50) NOT NULL,
[LanguageCode] [varchar](10) NOT NULL)
El archivo RouteConfig.cs se cambió a:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//Build up routing table based from the database.
//This will stop us from having to create shedloads of these statements each time a new language, controller or action is added
using (GeneralEntities db = new GeneralEntities())
{
List<RoutingTranslation> rt = db.RoutingTranslations.ToList();
foreach (var r in rt)
{
routes.MapRoute(
name: r.LanguageCode + r.ControllerDisplayName + r.ActionDisplayName,
url: r.LanguageCode + "/" + r.ControllerDisplayName + "/" + r.ActionDisplayName + "/{id}",
defaults: new { culture = r.LanguageCode, controller = r.ControllerName, action = r.ActionName, id = UrlParameter.Optional },
constraints: new { culture = r.LanguageCode }
);
}
}
//Global catchall
routes.MapRoute(
name: "Default",
url: "{culture}/{controller}/{action}/{id}",
defaults: new {culture = CultureHelper.GetDefaultCulture(), controller = "Default", action = "Index", id = UrlParameter.Optional }
//defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
De forma predeterminada, siempre utilizará el controlador inglés y los nombres de acción, pero le permite proporcionar una anulación al ingresar los valores en la tabla.
(Mi código de internacionalización se basa en gran medida en esta gran publicación de blog. http://afana.me/post/aspnet-mvc-internationalization-part-2.aspx )