Маршрутизация локализации в ASP.NET Core 3.0 Razor Pages - PullRequest
0 голосов
/ 06 ноября 2019

Я хотел бы использовать маршрутизированную локализацию в своем приложении ASP.NET Core 3.0 Razor Pages.

https://stackoverflow.com/a/52976625/107718, кажется, имеет решение для 2.2, но есть ли лучший способ сделать это в3.0 теперь, когда переделана маршрутизация / конечные точки?

1 Ответ

1 голос
/ 06 ноября 2019

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?}");
});

Обратите внимание на приведенные выше заказы важны.

Демонстрация:

enter image description here


[Изменить]

Извините, я не заметил, что вы попросили страницу бритвы. Для работы с 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?}");
});

...