Я хотел бы создать систему маршрутов в ASP.NET Core, в которой URL-адреса переводятся так же, как этот вопрос Как создавать многоязычные переведенные маршруты в Laravel
Цель состоит в том, чтобы перевести часть пути URL-адреса, которая следует за кодом языка, и сгенерировать URL-адреса на языке пользователя.
Например:
/fr/produit
станет на английском:
/en/product
У меня есть следующая конфигурация:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<RequestLocalizationOptions>(options =>
{
var translations = services.BuildServiceProvider().GetService<TranslationsDbContext>();
var supportedCultures = translations.Cultures
.ToList()
.Select(x => new CultureInfo(x.Name))
.ToArray();
options.DefaultRequestCulture = new RequestCulture(culture: "fr", uiCulture: "fr");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders = new RequestCultureProvider[]
{
new RouteDataRequestCultureProvider()
{
RouteDataStringKey = "lang",
UIRouteDataStringKey = "lang",
Options = options
},
new CookieRequestCultureProvider(),
new AcceptLanguageHeaderRequestCultureProvider()
};
});
services.Configure<RouteOptions>(options =>
{
options.ConstraintMap.Add("lang", typeof(LanguageRouteConstraint));
});
services.AddDbContextPool<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDbContext<TranslationsDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("TranslationsConnection")));
services.AddIdentity<User, IdentityRole<Guid>>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<IStringLocalizerFactory, EFStringLocalizerFactory>();
services.AddScoped<IStringLocalizer, StringLocalizer>();
services
.AddMvc()
.AddDataAnnotationsLocalization();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ApplicationDbContext dbContext, TranslationsDbContext translationsDbContext,
UserManager<User> userManager, RoleManager<IdentityRole<Guid>> roleManager)
{
app.UseRequestLocalization();
app.UseWhen(
context => !context.Request.Path.StartsWithSegments("/api"),
a => a.UseLocalizedStatusCodePagesWithReExecute("/{0}/error/{1}")
);
app.UseResponseCompression();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "localized",
template: "{lang:lang}/{controller=Home}/{action=Index}/{id?}"
);
routes.MapRoute(
name: "catchAll",
template: "{*catchall}",
defaults: new { controller = "Home", action = "RedirectToDefaultLanguage" }
);
});
}
}
public class LanguageRouteConstraint : IRouteConstraint
{
public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
if (!values.ContainsKey("lang"))
{
return false;
}
var lang = values["lang"].ToString();
return lang == "fr" || lang == "en" || lang == "de";
}
}
Код языка правильно обрабатывается приложением.
Однако после многих исследований я вижу, что могу использовать IApplicationModelConvention
для настройки работы маршрутизации. Но я не понимаю, как я могу использовать этот интерфейс для работы с моей существующей конфигурацией.