Какой поставщик культуры запросов является лучшим вариантом - PullRequest
0 голосов
/ 14 мая 2019

Я работаю над локализацией в .NET Core Web API и застрял при выборе опции поставщика культуры запросов.

Из документации Microsoft предоставляет трех провайдеров культуры по умолчанию, которые настраиваются автоматически.

QueryStringRequestCultureProvider
CookieRequestCultureProvider
AcceptLanguageHeaderRequestCultureProvider

Помимо вышеперечисленных трех, мы также можем создать провайдера нестандартной культуры, но мой вопрос в том, какой вариант является более безопасным и последовательным.

1 Ответ

0 голосов
/ 17 мая 2019

Все зависит от архитектуры вашего приложения, лично я предпочитаю изготовленный на заказ поставщик культуры запроса значения маршрута.

он даст вам чистые URL, например:

http://www.example.com/en-US/

вот как вы его создаете:

Сначала создайте глобальное соглашение модели маршрута для параметра культуры:

public class CultureTemplateRouteModelConvention : IPageRouteModelConvention
    {
        public void Apply(PageRouteModel model)
        {
            var selectorCount = model.Selectors.Count;
            for (var i = 0; i < selectorCount; i++)
            {
                var selector = model.Selectors[i];
                model.Selectors.Add(new SelectorModel
                {
                    AttributeRouteModel = new AttributeRouteModel
                    {
                        Order = -1,
                        Template = AttributeRouteModel.CombineTemplates(
                      "{culture?}",
                      selector.AttributeRouteModel.Template),
                    }
                });
            }
        }
    }

, затем добавьте его впараметры страниц бритвы:

services.AddMvc()
        .AddRazorPagesOptions(o => {
            o.Conventions.Add(new CultureTemplateRouteModelConvention());
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        });

, затем создайте RouteValueRequestCultureProvider:

public class RouteValueRequestCultureProvider : IRequestCultureProvider
    {
        private readonly CultureInfo[] _cultures;

        public RouteValueRequestCultureProvider(CultureInfo[] cultures)
        {
            _cultures = cultures;
        }

        /// <summary>
        /// get {culture} route value from path string, 
        /// </summary>
        /// <param name="httpContext"></param>
        /// <returns>ProviderCultureResult depends on path {culture} route parameter, or default culture</returns>
        public Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
        {
            var defaultCulture = "en";

            var path = httpContext.Request.Path;

            if (string.IsNullOrWhiteSpace(path))
            {
                return Task.FromResult(new ProviderCultureResult(defaultCulture));
            }

            var routeValues = httpContext.Request.Path.Value.Split('/');
            if (routeValues.Count() <= 1)
            {
                return Task.FromResult(new ProviderCultureResult(defaultCulture));
            }

            if (!_cultures.Any(x => x.Name.ToLower() == routeValues[1].ToLower()))
            {
                return Task.FromResult(new ProviderCultureResult(defaultCulture));
            }

            return Task.FromResult(new ProviderCultureResult(routeValues[1]));
        }
    }

Затем добавьте его в список поставщиков культуры:

services.Configure<RequestLocalizationOptions>(ops =>
            {
                ops.DefaultRequestCulture = new RequestCulture("en");
                ops.SupportedCultures = mySupportedCultures;
                ops.SupportedUICultures = mySupportedUICultures;

                // add RouteValueRequestCultureProvider to the beginning of the providers list. 
                ops.RequestCultureProviders.Insert(0, 
                    new RouteValueRequestCultureProvider(cultures));
            });

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