Локализация на основе URL .NET Core 3.0 - PullRequest
1 голос
/ 28 октября 2019

Я хотел бы получить локализацию просмотра на основе URL, а не культуры браузера.

"/ account / leadregistrationstep / de" Отображает представление без перевода. Чтобы получить перевод, культура браузера должна совпадать с представлением (это работает).

Есть ли способ получить перевод без необходимости, чтобы культура браузера соответствовала файлу ресурса? Я хочу, чтобы в немецком представлении отображался только немецкий язык

enter image description here

Запуск ConfigureServices

            services.Configure<RequestLocalizationOptions>(
            options =>
            {
                var supportedCultures = new List<CultureInfo>
                {
                    new CultureInfo("en"),
                    new CultureInfo("de"),
                    new CultureInfo("nl"),
                    new CultureInfo("fr")
                };

                options.DefaultRequestCulture = new RequestCulture(culture: "nl", uiCulture: "nl");
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;

                options.RequestCultureProviders.Insert(0, new QueryStringRequestCultureProvider());
            });

Настройка

            app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
            endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{language}/{id?}");
        });

1 Ответ

2 голосов
/ 28 октября 2019

Существует три параметра по умолчанию RequestCultureProvider, среди которых: AcceptLanguageHeaderRequestCultureProvider, которые используют заголовки браузера для информации о культуре. Вам нужно переписать список вместо того, чтобы вставлять в него QueryStringRequestCultureProvider, удаляя таким образом AcceptLanguageHeaderRequestCultureProvider.

options =>
    {
        var supportedCultures = new List<CultureInfo>
        {
            new CultureInfo("en"),
            new CultureInfo("de"),
            new CultureInfo("nl"),
            new CultureInfo("fr")
        };

        options.DefaultRequestCulture = new RequestCulture(culture: "nl", uiCulture: "nl");
        options.SupportedCultures = supportedCultures;
        options.SupportedUICultures = supportedCultures;

        options.RequestCultureProviders = new List<IRequestCultureProvider>
        {
            new QueryStringRequestCultureProvider(),
            new CookieRequestCultureProvider()
        };
    }

Для выбора культуры будет использоваться только установленный файл cookie или строка запроса? Culture = fr ...

Однако если вам нужны пользовательские правила, вам необходимо реализоватьсобственный RequestCultureProvider. Это пример:

public class UrlRequestCultureProvider : RequestCultureProvider
{
    public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
    {
        var validCultures = new []{"en", "de", "fr", "nl"};
        if (httpContext == null)
        {
            throw new ArgumentNullException(nameof(httpContext));
        }

        var culture = httpContext.Request.Path.Value
                        .Split("/")
                        .FirstOrDefault( (p) => validCultures.IndexOf(p.ToLower()) >= 0);

        if (culture == null)
        {
            return Task.FromResult((ProviderCultureResult)null);
        }

        return Task.FromResult(new ProviderCultureResult(culture));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...