Я пытаюсь локализовать свои 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)