疑問に思っている人のために、現在選択されている文化のメッセージをローカライズすることが可能であれば、可能です. asp.netコア2.2では、 LocalizedIdentityErrorDescriberクラスを作成できます。ここで、IdentityResourcesはダミークラスの名前です(ここで説明されています:グローバリゼーションとローカリゼーション):
public class LocalizedIdentityErrorDescriber : IdentityErrorDescriber
{
/// <summary>
/// The <see cref="IStringLocalizer{LocalizedIdentityErrorDescriber}"/>
/// used to localize the strings
/// </summary>
private readonly IStringLocalizer<IdentityResources> localizer;
/// <summary>
/// Initializes a new instance of the <see cref="LocalizedIdentityErrorDescriber"/> class.
/// </summary>
/// <param name="localizer">
/// The <see cref="IStringLocalizer{LocalizedIdentityErrorDescriber}"/>
/// that we will use to localize the strings
/// </param>
public LocalizedIdentityErrorDescriber(IStringLocalizer<IdentityResources> localizer)
{
this.localizer = localizer;
}
/// <summary>
/// Returns the default <see cref="IdentityError" />.
/// </summary>
/// <returns>The default <see cref="IdentityError" /></returns>
public override IdentityError DefaultError()
{
return this.GetErrorByCode(nameof(DefaultError));
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating a concurrency failure.
/// </summary>
/// <returns>An <see cref="IdentityError" /> indicating a concurrency failure.</returns>
public override IdentityError ConcurrencyFailure()
{
return this.GetErrorByCode(nameof(ConcurrencyFailure));
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating a password mismatch.
/// </summary>
/// <returns>An <see cref="IdentityError" /> indicating a password mismatch.</returns>
public override IdentityError PasswordMismatch()
{
return this.GetErrorByCode(nameof(PasswordMismatch));
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating an invalid token.
/// </summary>
/// <returns>An <see cref="IdentityError" /> indicating an invalid token.</returns>
public override IdentityError InvalidToken()
{
return this.GetErrorByCode(nameof(InvalidToken));
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating an external login is already associated with an account.
/// </summary>
/// <returns>An <see cref="IdentityError" /> indicating an external login is already associated with an account.</returns>
public override IdentityError LoginAlreadyAssociated()
{
return this.GetErrorByCode(nameof(LoginAlreadyAssociated));
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating the specified user <paramref name="userName" /> is invalid.
/// </summary>
/// <param name="userName">The user name that is invalid.</param>
/// <returns>An <see cref="IdentityError" /> indicating the specified user <paramref name="userName" /> is invalid.</returns>
public override IdentityError InvalidUserName(string userName)
{
return this.FormatErrorByCode(nameof(InvalidUserName), (object)userName);
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating the specified <paramref name="email" /> is invalid.
/// </summary>
/// <param name="email">The email that is invalid.</param>
/// <returns>An <see cref="IdentityError" /> indicating the specified <paramref name="email" /> is invalid.</returns>
public override IdentityError InvalidEmail(string email)
{
return this.FormatErrorByCode(nameof(InvalidEmail), (object)email);
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating the specified <paramref name="userName" /> already exists.
/// </summary>
/// <param name="userName">The user name that already exists.</param>
/// <returns>An <see cref="IdentityError" /> indicating the specified <paramref name="userName" /> already exists.</returns>
public override IdentityError DuplicateUserName(string userName)
{
return this.FormatErrorByCode(nameof(DuplicateUserName), (object)userName);
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating the specified <paramref name="email" /> is already associated with an account.
/// </summary>
/// <param name="email">The email that is already associated with an account.</param>
/// <returns>An <see cref="IdentityError" /> indicating the specified <paramref name="email" /> is already associated with an account.</returns>
public override IdentityError DuplicateEmail(string email)
{
return this.FormatErrorByCode(nameof(DuplicateEmail), (object)email);
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating the specified <paramref name="role" /> name is invalid.
/// </summary>
/// <param name="role">The invalid role.</param>
/// <returns>An <see cref="IdentityError" /> indicating the specific role <paramref name="role" /> name is invalid.</returns>
public override IdentityError InvalidRoleName(string role)
{
return this.FormatErrorByCode(nameof(InvalidRoleName), (object)role);
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating the specified <paramref name="role" /> name already exists.
/// </summary>
/// <param name="role">The duplicate role.</param>
/// <returns>An <see cref="IdentityError" /> indicating the specific role <paramref name="role" /> name already exists.</returns>
public override IdentityError DuplicateRoleName(string role)
{
return this.FormatErrorByCode(nameof(DuplicateRoleName), (object)role);
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating a user already has a password.
/// </summary>
/// <returns>An <see cref="IdentityError" /> indicating a user already has a password.</returns>
public override IdentityError UserAlreadyHasPassword()
{
return this.GetErrorByCode(nameof(UserAlreadyHasPassword));
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating user lockout is not enabled.
/// </summary>
/// <returns>An <see cref="IdentityError" /> indicating user lockout is not enabled..</returns>
public override IdentityError UserLockoutNotEnabled()
{
return this.GetErrorByCode(nameof(UserLockoutNotEnabled));
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating a user is already in the specified <paramref name="role" />.
/// </summary>
/// <param name="role">The duplicate role.</param>
/// <returns>An <see cref="IdentityError" /> indicating a user is already in the specified <paramref name="role" />.</returns>
public override IdentityError UserAlreadyInRole(string role)
{
return this.FormatErrorByCode(nameof(UserAlreadyInRole), (object)role);
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating a user is not in the specified <paramref name="role" />.
/// </summary>
/// <param name="role">The duplicate role.</param>
/// <returns>An <see cref="IdentityError" /> indicating a user is not in the specified <paramref name="role" />.</returns>
public override IdentityError UserNotInRole(string role)
{
return this.FormatErrorByCode(nameof(UserNotInRole), (object)role);
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating a password of the specified <paramref name="length" /> does not meet the minimum length requirements.
/// </summary>
/// <param name="length">The length that is not long enough.</param>
/// <returns>An <see cref="IdentityError" /> indicating a password of the specified <paramref name="length" /> does not meet the minimum length requirements.</returns>
public override IdentityError PasswordTooShort(int length)
{
return this.FormatErrorByCode(nameof(PasswordTooShort), (object)length);
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating a password entered does not contain a non-alphanumeric character, which is required by the password policy.
/// </summary>
/// <returns>An <see cref="IdentityError" /> indicating a password entered does not contain a non-alphanumeric character.</returns>
public override IdentityError PasswordRequiresNonAlphanumeric()
{
return this.GetErrorByCode(nameof(PasswordRequiresNonAlphanumeric));
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating a password entered does not contain a numeric character, which is required by the password policy.
/// </summary>
/// <returns>An <see cref="IdentityError" /> indicating a password entered does not contain a numeric character.</returns>
public override IdentityError PasswordRequiresDigit()
{
return this.GetErrorByCode(nameof(PasswordRequiresDigit));
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating a password entered does not contain a lower case letter, which is required by the password policy.
/// </summary>
/// <returns>An <see cref="IdentityError" /> indicating a password entered does not contain a lower case letter.</returns>
public override IdentityError PasswordRequiresLower()
{
return this.GetErrorByCode(nameof(PasswordRequiresLower));
}
/// <summary>
/// Returns an <see cref="IdentityError" /> indicating a password entered does not contain an upper case letter, which is required by the password policy.
/// </summary>
/// <returns>An <see cref="IdentityError" /> indicating a password entered does not contain an upper case letter.</returns>
public override IdentityError PasswordRequiresUpper()
{
return this.GetErrorByCode(nameof(PasswordRequiresUpper));
}
public override IdentityError PasswordRequiresUniqueChars(int uniqueChars)
{
return this.FormatErrorByCode(nameof(PasswordRequiresUniqueChars), (object)uniqueChars);
}
public override IdentityError RecoveryCodeRedemptionFailed()
{
return this.GetErrorByCode(nameof(RecoveryCodeRedemptionFailed));
}
/// <summary>Returns a localized <see cref="IdentityError"/> for the provided code.</summary>
/// <param name="code">The error's code.</param>
/// <returns>A localized <see cref="IdentityError"/>.</returns>
private IdentityError GetErrorByCode(string code)
{
return new IdentityError()
{
Code = code,
Description = this.localizer.GetString(code)
};
}
/// <summary>Formats a localized <see cref="IdentityError"/> for the provided code.</summary>
/// <param name="code">The error's code.</param>
/// <param name="parameters">The parameters to format the string with.</param>
/// <returns>A localized <see cref="IdentityError"/>.</returns>
private IdentityError FormatErrorByCode(string code, params object[] parameters)
{
return new IdentityError
{
Code = code,
Description = string.Format(this.localizer.GetString(code, parameters))
};
}
}
次に、次のように言語のリソース ファイルを作成します: Resources\(上記のダミー クラスの名前)(.culture).resx。デフォルトの言語カルチャは空白のままにする必要があります。「。」を忘れないでください。デフォルトでない場合はカルチャ名の前。IdentityResources ファイルは次のようになります。

Startup.cs に次の行を追加します。
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<nameofyourdbcontext>()
.AddDefaultTokenProviders()
.AddErrorDescriber<LocalizedIdentityErrorDescriber>(); // this line is important
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo("en"), // english
new CultureInfo("tr"), // turkish
new CultureInfo("ru") // russian
};
options.DefaultRequestCulture = new RequestCulture(culture: "en", uiCulture: "en");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new CookieRequestCultureProvider()); // type of CultureProvider you want.
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var localizationOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
// IT IS IMPORTANT TO CALL UseRequestLocalization BEFORE UseMvc
app.UseRequestLocalization(localizationOptions.Value);
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}"
);
});
}
ここまででほぼ完了ですが、Culture Cookie を設定する必要があります。コード例はGlobalization and localizationにあります。それが誰かを助けることを願っています。