Asp NET Базовая локализация: requestCulture не устанавливается для аннотаций данных - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь локализовать свои Asp. NET Основные аннотации данных, а также пытаюсь использовать ресурсы в другой сборке. Вот что я делаю:

  public class ForgotPasswordRequest
    {
        /// <summary>
        /// Email address of the user to send password reset instructions to.
        /// Must provide one of Email or <see cref="Username"/>
        /// </summary>
        [EmailAddress(ErrorMessageResourceName = "InvalidEmailAddressFormat", ErrorMessageResourceType = typeof(ValidationResources))]
        [StringLength(Constants.EmailMaxLength)]
        public string? Email { get; set; }

}

ValidationResources указывает на другую сборку. В этой сборке у меня есть файл ресурсов: Resources/ValidationResources.resx установлен на public генерация кода. Обычная строка engli sh прекрасно работает, но когда я пытаюсь использовать другой язык, она не работает. Мои файлы переводов находятся рядом с основным ValidationResources.resx (ValidationResources.fr.resx et c.)

Я попытался отладить сгенерированный код .resx, чтобы увидеть, в чем проблема. В генерируемом файле .cs есть следующий блок кода:

        /// <summary>
        ///   Looks up a localized string similar to Email is not a recognized email format.
        /// </summary>
        public static string InvalidEmailAddressFormat {
            get {
                return ResourceManager.GetString("InvalidEmailAddressFormat", resourceCulture);
            }
        }

Когда я устанавливаю точку останова, resourceCulture всегда равен нулю. Заменив его на CultureInfo.CreateSpecificCulture("fr-FR"), я успешно переведу мои строки. Кажется, что проблема заключается в ASP. NET Core, неправильно устанавливающем культуру. Я добавил все службы локализации и локализация работает нормально везде, (IViewLocalizer и IStringLocalizer). Похоже, что для аннотаций данных неправильно настраивается культура.

Вот моя соответствующая конфигурация запуска.

ConfigureServices:

serviceCollection.AddControllersWithViews()
                .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
                .AddDataAnnotationsLocalization();

            // Add Localization
            serviceCollection.AddLocalization(options => options.ResourcesPath = "Resources");
            serviceCollection.Configure<RequestLocalizationOptions>(options =>
            {
                var supportedCultures = new[]
                {
                    new CultureInfo("en-US"),
                    new CultureInfo("fr-FR"),
                };
                options.DefaultRequestCulture = new RequestCulture(culture: "fr-FR", uiCulture: "fr-FR");
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;
            });

Configure:

 var options = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
            app.UseRequestLocalization(options.Value);

Что я делаю не так? (Я использую ASP. NET Core 3.1)

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