ASP. NET В Core 3 Localization отображаются только ключи - PullRequest
0 голосов
/ 17 января 2020

У меня возникли некоторые проблемы с настройкой локализации текста в ASP. NET Core 3. Вернее, раньше он работал, а после неудачи (без сохранения изменений и случайного удаления некоторых из них) он больше не работал. делает. Я уверен, что мне чего-то не хватает по основам c, но я могу решить это на всю жизнь.

У меня есть следующие блоки кода на месте:

Запуск .cs: ​​

        private static readonly List<CultureInfo> SupportedCultures = new List<CultureInfo>
        {
            new CultureInfo("en"),
            new CultureInfo("fr")
        };

// ...

            services.AddMvc()
                .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix, opts => { opts.ResourcesPath = "Resources"; })
                .AddDataAnnotationsLocalization(options =>
                {
                    options.DataAnnotationLocalizerProvider = (type, factory) =>
                        factory.Create(typeof(Language));
                })
                .SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
                .AddRazorPagesOptions(options =>
                {
                    options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
                    options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
                });

            services.AddLocalization(o =>
            {
                o.ResourcesPath = "Resources";
            });

            services.Configure<RequestLocalizationOptions>(options =>
            {
                options.DefaultRequestCulture = new RequestCulture("en", "en");
                options.SupportedCultures = SupportedCultures;
                options.SupportedUICultures = SupportedCultures;
            });
// ...


            app.UseRequestLocalization(new RequestLocalizationOptions
            {
                DefaultRequestCulture = new RequestCulture("en"),
                SupportedCultures = SupportedCultures,
                SupportedUICultures = SupportedCultures,
                RequestCultureProviders = new List<IRequestCultureProvider>
                {
                    new QueryStringRequestCultureProvider(),
                    new CookieRequestCultureProvider()
                }
            });

Resources \ Language.cs:

    public sealed class Language
    {

        public sealed class Login
        {
            public const string PageTitle          = nameof(Login) + nameof(PageTitle);
            public const string SubmitButton       = nameof(Login) + nameof(SubmitButton);
            public const string Username           = nameof(Login) + nameof(Username);
            // ...
        }
    }

View:

@inject IHtmlLocalizer<Language> Localizer

...

@Localizer[Language.Login.SubmitButton]

У меня также есть следующие файлы resx, содержащие ключи и текст .
Resources \ Language.resx (также пробовал с именем Language.en.resx безрезультатно)
Resources \ Language.fr.resx

Весь текст просто отображается в качестве ключей, независимо от того, происходит ли это из MVC View, страницы Razor, произвольного класса, получающего локализатор из DI, или атрибутов.

Есть какие-нибудь подсказки относительно того, что я делаю неправильно? Спасибо

Ответы [ 2 ]

1 голос
/ 24 января 2020

Итак, в итоге получается, что здесь имеет значение только местоположение файла Language.cs. Наличие его в папке Resources приводило к поломке (даже без использования пространства имен для этой папки), тогда как наличие его в Project root работает без проблем.

Я не совсем уверен, почему это важно - я отредактирую этот ответ, если смогу это выяснить.

РЕДАКТИРОВАТЬ: Спасибо @Grimm за поиск ответа. Это действительно ошибка в net ядре 3.1, как подробно описано в https://github.com/dotnet/aspnetcore/issues/17733

0 голосов
/ 17 января 2020

Это может быть несколько вещей.
Вы можете попробовать переименовать файл .resx в:

Resources \ Language.en-US.resx

Вы можете попробовать использовать что-то вроде @Localizer[Language.Login.SubmitButton].Value.

Вы также можете попытаться создать определенные c .resx файлы для каждого представления:
Соблюдение правил будет выглядеть примерно так:

  • Создайте файл .resx с именем сборки представления. Например: Views.Login.Index.en-US.resx
  • Внедрение ViewLocalizer в ваше представление
    @using Microsoft.AspNetCore.Mvc.Localization
    @inject IViewLocalizer Localizer
  • Затем используйте его со строковыми значениями, например: @Localizer["SubmitButton"].Value
    или даже просто @Localizer["SubmitButton"]

Я бы также изменил код запуска на более простой

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

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

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

Надеюсь, что что-то из этого поможет вам.

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