Локализация ASP.NET Core 2.2 не работает для моделей и представлений - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь локализовать свое приложение asp.net-core 2.2. Я перепробовал много уроков / блогов и даже пример проекта, который показывает, как это сделать. Я соответствовал своему приложению точно так же, как это, но я никогда не получал «значение» из файла ресурса, который печатается на основе «ключа».

Это startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        #region snippet1
        services.AddLocalization(options => options.ResourcesPath = "Resources");

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

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

            options.DefaultRequestCulture = new RequestCulture("en");
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;
        });

        //services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        #region snippet2
        var supportedCultures = new[]
        {
            new CultureInfo("en-US"),
            new CultureInfo("nl-NL")
        };

        app.UseRequestLocalization(new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture("en"),
            // Formatting numbers, dates, etc.
            SupportedCultures = supportedCultures,
            // UI strings that we have localized.
            SupportedUICultures = supportedCultures
        });

        app.UseStaticFiles();
        // To configure external authentication, 
        // see: http://go.microsoft.com/fwlink/?LinkID=532715
        app.UseAuthentication();
        app.UseMvcWithDefaultRoute();
        #endregion

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

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

HomeController:

public class HomeController : Controller
{
    private readonly IStringLocalizer<HomeController> _localizer;

    public HomeController(IStringLocalizer<HomeController> localizer)
    {
        _localizer = localizer;
    }

    public IActionResult Index()
    {
        return View();
    }

    public IActionResult Test()
    {
        var ttt = new TestViewModel();
        ttt.Name = "bbbb";
        ttt.Type = "ggggg";

        return View(ttt);
    }

    public IActionResult Privacy()
    {
        return View();
    }

    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    public IActionResult Error()
    {
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }
}

Вид:

@using Microsoft.AspNetCore.Mvc.Localization


@inject IViewLocalizer Localizer
@inject IHtmlLocalizer<LocalizationTest.Resources.SharedResource> SharedLocalizer

@model LocalizationTest.ViewModels.TestViewModel


<h1>Test</h1>

<div>@Localizer["Name"]</div>
<div>@Localizer["Type"]</div>

<br />

CurrentCulture: @System.Globalization.CultureInfo.CurrentCulture.ToString()


<form asp-controller="Home" asp-action="Test" method="get" class="form-horizontal" role="form">
    <hr>
    <div asp-validation-summary="All" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="Name" class="col-md-2 control-label"></label>
    </div>
    <div class="form-group">
        <label asp-for="Type" class="col-md-2 control-label"></label>
    </div>

</form>

И это структура папок:

enter image description here

1 Ответ

0 голосов
/ 03 апреля 2019

Вы пропустили имя контроллера.

  1. Поместите файл TestViewModel.cs в папку ViewModels/Home/.
  2. Переименовать ViewModels.TestViewModel.resx -> ViewModels.Home.TestViewModel.resx
...