stackoverflow.com/questions/46990941/...

довал инструкциям на этой странице, чтобы настроить локализацию:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization

Однако для меня это просто не работает. Вот что я сделал:

Startup.cs:

public class Startup
{
    public IConfigurationRoot Configuration { get; }

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", true, true);

        builder.AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddLocalization(o => o.ResourcesPath = "Resources");
        services.AddMvc(o =>
        {
            o.Filters.Add(typeof(GlobalExceptionFilter));
        }
        ).AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix).AddDataAnnotationsLocalization();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        var supportedCultures = new[]
        {
            new CultureInfo("es-MX"),
            new CultureInfo("en-US")
        };

        app.UseRequestLocalization(new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture("es-MX"),
            SupportedCultures = supportedCultures,
            SupportedUICultures = supportedCultures
        });

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
        }

        app.UseStaticFiles();
        app.UseAuthentication();

        app.UseMvcWithDefaultRoute();
        //app.UseMvc(routes =>
        //{
        //    routes.MapRoute(
        //        "default", "{controller=Home}/{action=Index}/{id?}");
        //});

        app.UseRewriter(new RewriteOptions().AddRedirectToHttps());
    }
}

Мой Layout.cshtml содержит следующее:

@await Html.PartialAsync("_SelectLanguagePartial")

и мой _SelectLanguagePartial.cshtml содержит:

@using Microsoft.AspNetCore.Builder
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options

@inject IViewLocalizer Localizer
@inject IOptions<RequestLocalizationOptions> LocOptions

@{
    var requestCulture = Context.Features.Get<IRequestCultureFeature>();
    var cultureItems = LocOptions.Value.SupportedUICultures
        .Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
        .ToList();
    var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}";
}

<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
    <form id="selectLanguage" asp-controller="Home" asp-action="SetLanguage" asp-route-returnUrl="@returnUrl" 
          method="post" role="form">
        <label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label> <select name="culture"
            onchange="this.form.submit();"
            asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems">
        </select>
    </form>
</div>

В дополнение к этому я создал 2 файла ресурсов,ErrorMessages.ex-MX.resx а такжеErrorMessages.resx.

В моем HomeController я добавил эту строкуViewBag.Test = ErrorMessages.Test; и в представлении индекса я добавил<p>@ViewBag.Test</p>

Когда я смотрю на страницу, я вижу раскрывающийся список с языками, и там указан только английский. Текст, который я отображаю на странице,ErrorMessages.resx.

Я пропускаю шаг? Как получилось, что испанский нигде не забирают? Как вы увидите ниже, я даже пытался установить испанский язык в качестве основной культуры, но без разницы.

РЕДАКТИРОВАТЬ:

Я попытался удалить eglish из списка, и результат, который я получил, был все еще там, и на этот раз в нем был испанский. Тем не менее, текст по-прежнему на английском языке.

Затем я попытался добавить английский обратно в качестве второго списка в элементе и установить английский в качестве основного языка, и в раскрывающемся списке отображался только 1 язык, а испанский исчез.

Ответы на вопрос(1)

Решение Вопроса

public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalization(options => options.ResourcesPath = "Resources");

    services.AddMvc()
        .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
        .AddDataAnnotationsLocalization();

    services.Configure<RequestLocalizationOptions>(options =>
    {
        var supportedCultures = new[] { new CultureInfo("en"), new CultureInfo("es") };

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

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
    app.UseRequestLocalization(locOptions.Value);

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();
    app.UseMvcWithDefaultRoute();
}

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

Итак, учитывая

Views/Shared/Layout.cshtml

Только создать

Resources/Views/Shared/Layout.es-MX.resx

Также обратите внимание, что этим вы ограничиваете испанский и мексиканский языки, так что вы должны иметьes отступление или добавить обаes а такжеes-MX.

 Bojan28 окт. 2017 г., 16:44
Ваш ответ исправил проблему с выпадающим списком. Тем не менее, мое тестовое сообщение отображается на английском языке, несмотря ни на что. Я не думаю, что полностью понимаю, как работают ресурсы. Я задал еще один вопрос в SO, как вы ответили на мой первый.stackoverflow.com/questions/46990941/...
 Bojan28 окт. 2017 г., 01:50
Это разница?app.UseRequestLocalization(locOptions.Value);
 Camilo Terevinto28 окт. 2017 г., 02:21
Нет я настраиваю наConfigureServices и используя наConfigure.
 Bojan28 окт. 2017 г., 02:36
Ах, я вижу, спасибо. Я попробую утром и дам вам знать.

Ваш ответ на вопрос