Создавайте многоязычные переведенные маршруты - PullRequest
0 голосов
/ 09 марта 2019

Я хотел бы создать систему маршрутов в 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 для настройки работы маршрутизации. Но я не понимаю, как я могу использовать этот интерфейс для работы с моей существующей конфигурацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...