如何自定义ASP.NET Identity的错误提示字符串为西班牙语?
没问题,要把ASP.NET Identity的所有错误提示换成西班牙语其实很简单,核心是自定义Identity的错误描述器,下面是具体步骤:
1. 创建自定义的西班牙语错误描述器类
ASP.NET Identity默认的错误消息是通过IdentityErrorDescriber类生成的,我们只需要继承这个类,重写每个错误方法并返回对应的西班牙语消息即可。
创建一个新类,比如SpanishIdentityErrorDescriber,代码如下:
using Microsoft.AspNetCore.Identity; public class SpanishIdentityErrorDescriber : IdentityErrorDescriber { // 密码过短的错误提示 public override IdentityError PasswordTooShort(int length) { return new IdentityError { Code = nameof(PasswordTooShort), Description = $"La contraseña debe tener al menos {length} caracteres." }; } // 密码需要包含非字母数字字符的提示 public override IdentityError PasswordRequiresNonAlphanumeric() { return new IdentityError { Code = nameof(PasswordRequiresNonAlphanumeric), Description = "La contraseña debe contener al menos un carácter no alfanumérico." }; } // 密码需要包含数字的提示 public override IdentityError PasswordRequiresDigit() { return new IdentityError { Code = nameof(PasswordRequiresDigit), Description = "La contraseña debe contener al menos un dígito (0-9)." }; } // 密码需要包含小写字母的提示 public override IdentityError PasswordRequiresLower() { return new IdentityError { Code = nameof(PasswordRequiresLower), Description = "La contraseña debe contener al menos una letra minúscula." }; } // 密码需要包含大写字母的提示 public override IdentityError PasswordRequiresUpper() { return new IdentityError { Code = nameof(PasswordRequiresUpper), Description = "La contraseña debe contener al menos una letra mayúscula." }; } // 密码不匹配的提示 public override IdentityError PasswordMismatch() { return new IdentityError { Code = nameof(PasswordMismatch), Description = "Contraseña incorrecta." }; } // 用户已存在的提示 public override IdentityError UserAlreadyExists() { return new IdentityError { Code = nameof(UserAlreadyExists), Description = "Ya existe un usuario con ese nombre de usuario." }; } // 无效用户名的提示 public override IdentityError InvalidUserName(string userName) { return new IdentityError { Code = nameof(InvalidUserName), Description = $"El nombre de usuario '{userName}' no es válido. Solo se permiten letras, dígitos y los caracteres @, ., +, -, _." }; } // 无效邮箱的提示 public override IdentityError InvalidEmail(string email) { return new IdentityError { Code = nameof(InvalidEmail), Description = $"El correo electrónico '{email}' no es válido." }; } // 邮箱已存在的提示 public override IdentityError DuplicateEmail(string email) { return new IdentityError { Code = nameof(DuplicateEmail), Description = $"El correo electrónico '{email}' ya está registrado." }; } // 如果你还需要覆盖其他错误类型(比如锁定、令牌相关),继续重写对应的方法即可 }
2. 注册自定义错误描述器到DI容器
接下来,需要告诉ASP.NET使用我们自定义的错误描述器,而不是默认的。根据你的.NET版本,修改对应的配置文件:
对于.NET 6+(Program.cs)
在添加Identity服务的地方,加上.AddErrorDescriber<SpanishIdentityErrorDescriber>():
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddErrorDescriber<SpanishIdentityErrorDescriber>() // 注册自定义描述器 .AddEntityFrameworkStores<ApplicationDbContext>();
对于.NET 5及更早版本(Startup.cs)
在ConfigureServices方法里的Identity配置中添加同样的代码:
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddErrorDescriber<SpanishIdentityErrorDescriber>() .AddEntityFrameworkStores<ApplicationDbContext>();
3. 验证效果
完成上面两步后,当你使用Identity的方法(比如_userManager.CreateAsync()、_userManager.ChangePasswordAsync()等)时,返回的IdentityResult中的错误消息就会自动变成西班牙语了。比如之前的"Passwords must be at least 6 characters."会变成"La contraseña debe tener al menos 6 caracteres."
如果有遗漏的错误类型,只需要回到SpanishIdentityErrorDescriber类中,重写对应的方法并添加西班牙语描述即可。
内容的提问来源于stack exchange,提问作者henoc salinas

