ASP.NET Core 3.0 представляет новую функцию маршрутизации в конечной точке, с помощью которой мы можем получить культурные данные из данных маршрута, прежде чем они поступят в MVC. Это позволяет нам без особых усилий локализовать контент в соответствии с текущим маршрутом.
Инструкции
Во-первых, убедитесь, что служба локализации зарегистрирована, и вы настроили поддерживаемую культуру, как показано ниже:
services.AddLocalization(opts => opts.ResourcesPath = "Resources" );
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]{
new CultureInfo("en-US"),
new CultureInfo("de"),
new CultureInfo("it"),
// ... others
};
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
});
А затем добавьте промежуточное программное обеспечение UseRequestLocalization
и настройте маршрут для культуры таким образом, чтобы он мог правильно получать информацию о культуре:
app.UseRouting();
<b>app.UseRequestLocalization();</b>
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
<b>endpoints.MapControllerRoute(name: "culture-route", pattern:"{culture=en-US}/{controller=Home}/{action=Index}/{id?}"); </b>
endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
});
Обратите внимание на приведенные выше заказы важны.
Демонстрация:
[Изменить]
Извините, я не заметил, что вы попросили страницу бритвы. Для работы с Razor Page WebApp создайте пользовательский IPageRouteModelConvention
для сопоставления маршрута:
public class CustomCultureRouteRouteModelConvention : IPageRouteModelConvention
{
public void Apply(PageRouteModel model)
{
List<SelectorModel> selectorModels = new List<SelectorModel>();
foreach (var selector in model.Selectors.ToList())
{
var template = selector.AttributeRouteModel.Template;
selectorModels.Add(new SelectorModel(){
AttributeRouteModel = new AttributeRouteModel
{
Template = "/{culture}" + "/" + template
}
});
}
foreach(var m in selectorModels){
model.Selectors.Add(m);
}
}
}
и добавьте следующие условные обозначения страницы:
services.AddRazorPages().AddRazorPagesOptions(opts =>
{
opts.Conventions.Add(new CustomCultureRouteRouteModelConvention());
});
services.AddLocalization(opts => opts.ResourcesPath = "Resources");
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]{
new CultureInfo("en-US"),
new CultureInfo("de"),
new CultureInfo("it"),
new CultureInfo("zh"),
};
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
});
Промежуточное программное обеспечение:
app.UseRouting();
app.UseRequestLocalization();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
//endpoints.MapControllerRoute(name: "culture-route", pattern:"{culture=en-US}/{controller=Home}/{action=Index}/{id?}");
//endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
});