我正在尝试本地化标准标识错误消息。我看过几次关于这个话题的讨论。我确实成功地创建了一个项目并使用了自己的翻译,但在翻译标准标识错误信息方面失败了。我决定创建一个新的项目来关注身份错误。构造函数MultilanguageIdentityErrorDescriber正在被调用并返回期望值。当我进入https://localhost:7067/Identity/Account/Register并将“测试”输入电子邮件字段标准错误“”时,将显示“电子邮件字段不是有效的电子邮件地址.”。当有人能引导我走向正确的方向或给我一些链接时,我很感激。几个小时后,我决定在这里问你们。谢谢!
Program.cs
using Localizer.Data;
using Localizer.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddErrorDescriber<MultilanguageIdentityErrorDescriber>()
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.Run();MultilanguageIdentityErrorDescriber.cs
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Localization;
public class MultilanguageIdentityErrorDescriber : IdentityErrorDescriber
{
private readonly IStringLocalizer<SharedResource> _localizer;
public MultilanguageIdentityErrorDescriber(IStringLocalizer<SharedResource> localizer)
{
_localizer = localizer;
// ckecking identityError.Description which returns expected value
var identityError = new IdentityError();
identityError = this.InvalidEmail("email@email.com");
}
public override IdentityError DuplicateEmail(string email)
{
return new IdentityError()
{
Code = nameof(DuplicateEmail),
Description = string.Format(_localizer["Email {0} is already taken."], email)
};
}
public override IdentityError DuplicateUserName(string userName)
{
return new IdentityError()
{
Code = nameof(DuplicateEmail),
Description = string.Format(_localizer["Email {0} is already taken."], userName)
};
}
public override IdentityError InvalidEmail(string email)
{
return new IdentityError
{
Code = nameof(InvalidEmail),
Description = string.Format(_localizer["Email '{email}' is invalid."], email)
};
}
}发布于 2022-11-25 04:22:29
我在我的项目中也有同样的问题,我也找不到翻译身份错误消息的方法,所以我做了一个看起来不太好看的解决方案,但它解决了我的问题,我用一个检查错误代码和设置自定义消息的方法创建了一个类,所以我不仅可以翻译,而且可以定义我自己的错误消息。我这么做是为了翻译成巴西葡萄牙语,这是代码:
public class TranslateIdentityErrors
{
public string TranslateErrorMessage(string codeError)
{
string message = string.Empty;
switch (codeError)
{
case "DefaultError":
message = "Um erro desconhecido ocorreu.";
break;
case "ConcurrencyFailure":
message = "Falha de concorrência otimista, o objeto foi modificado.";
break;
case "InvalidToken":
message = "Token inválido.";
break;
case "LoginAlreadyAssociated":
message = "Já existe um usuário com este login.";
break;
case "InvalidUserName":
message = $"Este login é inválido, um login deve conter apenas letras ou dígitos.";
break;
case "InvalidEmail":
message = "E-mail inválido.";
break;
case "DuplicateUserName":
message = "Este login já está sendo utilizado.";
break;
case "DuplicateEmail":
message = $"Este email já está sendo utilizado.";
break;
case "InvalidRoleName":
message = "Esta permissão é inválida.";
break;
case "DuplicateRoleName":
message = "Esta permissão já está sendo Utilizada";
break;
case "UserAlreadyInRole":
message = "Usuário já possui esta permissão.";
break;
case "UserNotInRole":
message = "Usuário não tem esta permissão.";
break;
case "UserLockoutNotEnabled":
message = "Lockout não está habilitado para este usuário.";
break;
case "UserAlreadyHasPassword":
message = "Usuário já possui uma senha definida.";
break;
case "PasswordMismatch":
message = "Senha incorreta.";
break;
case "PasswordTooShort":
message = "Senha muito curta.";
break;
case "PasswordRequiresNonAlphanumeric":
message = "Senhas devem conter ao menos um caracter não alfanumérico.";
break;
case "PasswordRequiresDigit":
message = "Senhas devem conter ao menos um digito ('0'-'9').";
break;
case "PasswordRequiresLower":
message = "Senhas devem conter ao menos um caracter em caixa baixa ('a'-'z').";
break;
case "PasswordRequiresUpper":
message = "Senhas devem conter ao menos um caracter em caixa alta ('A'-'Z').";
break;
default:
message = "Um erro desconhecido ocorreu.";
break;
}
return message;
}
}}
要使用此方法,我将转到将错误消息传递给modelstate的地方,并从下面更改代码:
var changePasswordResult = await _userManager.ChangePasswordAsync(user, Input.OldPassword, Input.NewPassword);
if (!changePasswordResult.Succeeded)
{
foreach (var error in changePasswordResult.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
return Page();
}对此:
var changePasswordResult = await _userManager.ChangePasswordAsync(user, Input.OldPassword, Input.NewPassword);
if (!changePasswordResult.Succeeded)
{
TranslateIdentityErrors translateErrors = new();
foreach (var error in changePasswordResult.Errors)
{
ModelState.AddModelError(string.Empty, translateErrors.TranslateErrorMessage(error.Code));
}
return Page();
}https://stackoverflow.com/questions/70997569
复制相似问题