【问题标题】:How to localize identity error message in .NET 6.0如何在 .NET 6.0 中本地化标识错误消息
【发布时间】:2022-11-25 12:35:59
【问题描述】:

我正在尝试本地化标准身份错误消息。我看过几个关于这个话题的讨论。我确实设法创建了一个项目并使用了我自己的翻译,但在翻译标准身份错误消息时失败了。我决定创建一个新项目来关注身份错误。构造函数多语言身份错误描述符被调用并返回预期值。当我转到 https://localhost:7067/Identity/Account/Register 并在电子邮件字段标准错误中键入“test”时电子邮件字段不是有效的电子邮件地址。" 显示。当有人可以指导我正确的方向或向我发送一些链接时,我很感激。几个小时后,我决定在这里问问你们。谢谢!

程序.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();

多语言身份错误描述符.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)
        }; 
    }

}

【问题讨论】:

    标签: c#


    【解决方案1】:

    我在我的项目中遇到了同样的问题,我也找不到翻译身份错误消息的方法,所以我做了一个看起来不太漂亮的解决方法,但它解决了我的问题,我制作了一个带有检查方法的类错误代码并设置自定义消息,所以我不仅可以翻译,还可以定义我自己的错误消息。我这样做是为了翻译成巴西葡萄牙语, 这是代码:

    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();
            }
    

    【讨论】:

      猜你喜欢
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 2023-03-07
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多