Локализация в ASP.NET Core 3.0

Я пытаюсь сделать свой проект локализованным, используя файлы .resx.

У меня не работает, у моего коллеги, работающего над проектом, тоже работает.

Немного подробностей о коде: файл Startup.cs

 public void ConfigureServices(IServiceCollection services)
        {
            .
            .
            .
            // Localization

            services.AddLocalization(options => options.ResourcesPath = "Lang/");

            services.AddMvc(option => option.EnableEndpointRouting = false)
                .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
                .AddDataAnnotationsLocalization();



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

                options.DefaultRequestCulture = new RequestCulture(culture: "cs", uiCulture: "cs");
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;
            });
            services.AddTransient<Messages>();
            // Localization end
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }

            // Localization
            var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
            app.UseRequestLocalization(locOptions.Value);
            // Localization end

            .
            .
            .

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }

Мой контроллер:

public class AccountController : BasicController
    {     
        private readonly UserManager<User> userManager;
        private readonly IPasswordHasher<User> passwordHasher;
        private IStringLocalizer<Default> _localizer;


        public AccountController(UserManager<User> userManager, SignInManager<User> signInManager, IPasswordHasher<User> passwordHasher,
            IStringLocalizer<Default> LangDefault, IDataProtectionProvider provider) : base(signInManager,provider)
        {
            this.userManager = userManager;
            this.passwordHasher = passwordHasher;
            _localizer = LangDefault;
        }

Мой вид входа:

@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer

@{
    Layout = "_LayoutLogin";
    ViewData["Title"] = Localizer["TitleLogin"];

Структура моего проекта

для меня он возвращает «TitleLogin», а значение «ResourceNotFound» истинно.

Для моего коллеги он возвращает правильное значение с тем же кодом...

Не могли бы вы помочь мне - что я делаю неправильно?

Большое спасибо.


person Lukas    schedule 17.03.2020    source источник


Ответы (1)


Я не знаю, какой файл resx содержит TitleLogin. Для отображения правильных данных локализации он работает, когда я изменяю services.AddLocalization(options => options.ResourcesPath = "Lang/"); на

services.AddLocalization(options => options.ResourcesPath = "Lang");

Затем добавьте файл resx с именем Views.Account.Login.cs.resx в папку Lang.

Обновление от 19 марта 2020 г.

Оказывается, в asp.net core 3.1 вам нужно поместить Default.cs из папки Resources (ваша папка Lang здесь), см. это проблема с github.

Если класс Default.cs и Default.*.resx в одной папке, пространство имен будет ошибкой в ​​скомпилированной dll xxx.lang.dll.

Итак, решение

1.Удалите оригинальный Default.cs и создайте новый прямо под проектом:

namespace MyApp
{
    public class Default
    {
    }
}

2.Добавить Default.cs.resx в папку Lang

3._ViewImports.cshtml

@using MyApp
@using Microsoft.Extensions.Localization
@inject IStringLocalizer<Default> LangDefault
person Ryan    schedule 18.03.2020
comment
Большое спасибо за совет. Это работает, но я хотел бы иметь только несколько файлов resx (потому что много сообщений для каждого представления являются общими). TitleLogin содержится в Default.cs.resx, поэтому я хотел использовать LangDefault[TitleLogin], но найденное значение равно null... - person Lukas; 18.03.2020
comment
Я просто хочу добавить, что в ViewImports у меня есть @inject IStringLocalizer‹Default› LangDefault... И когда я смотрю в LangDefault -> Non-Publicmembers-›_localizer-›Non-Publicmembers-›_missingManifestCache, там я могу найти мой TitleLogin, но значение равно null... - person Lukas; 18.03.2020
comment
@Lukas Я считаю, что это критическое изменение, и, пожалуйста, проверьте мой отредактированный ответ. - person Ryan; 19.03.2020