Ist es möglich, lokalisierte Zeichenfolgen für die ASP.NET Identity v1-Fehlermeldungen "System" bereitzustellen, z. B. " Name XYZ ist bereits vergeben " oder " Benutzername XYZ ist ungültig und darf nur Buchstaben oder Ziffern enthalten "?
asp.net-identity
wurzellos
quelle
quelle
Für ASP.NET Core: (Microsoft.AspNetCore.Identity 1.0.0)
Erstellen Sie eine Klasse, die IdentityErrorDescriber erbt, und überschreiben Sie die gewünschten Fehlermeldungen.
public class CustomIdentityErrorDescriber : IdentityErrorDescriber { public override IdentityError DefaultError() { return new IdentityError { Code = nameof(DefaultError), Description = $"An unknown failure has occurred." }; } public override IdentityError ConcurrencyFailure() { return new IdentityError { Code = nameof(ConcurrencyFailure), Description = "Optimistic concurrency failure, object has been modified." }; } public override IdentityError PasswordMismatch() { return new IdentityError { Code = nameof(PasswordMismatch), Description = "Incorrect password." }; } public override IdentityError InvalidToken() { return new IdentityError { Code = nameof(InvalidToken), Description = "Invalid token." }; } public override IdentityError LoginAlreadyAssociated() { return new IdentityError { Code = nameof(LoginAlreadyAssociated), Description = "A user with this login already exists." }; } public override IdentityError InvalidUserName(string userName) { return new IdentityError { Code = nameof(InvalidUserName), Description = $"User name '{userName}' is invalid, can only contain letters or digits." }; } public override IdentityError InvalidEmail(string email) { return new IdentityError { Code = nameof(InvalidEmail), Description = $"Email '{email}' is invalid." }; } public override IdentityError DuplicateUserName(string userName) { return new IdentityError { Code = nameof(DuplicateUserName), Description = $"User Name '{userName}' is already taken." }; } public override IdentityError DuplicateEmail(string email) { return new IdentityError { Code = nameof(DuplicateEmail), Description = $"Email '{email}' is already taken." }; } public override IdentityError InvalidRoleName(string role) { return new IdentityError { Code = nameof(InvalidRoleName), Description = $"Role name '{role}' is invalid." }; } public override IdentityError DuplicateRoleName(string role) { return new IdentityError { Code = nameof(DuplicateRoleName), Description = $"Role name '{role}' is already taken." }; } public override IdentityError UserAlreadyHasPassword() { return new IdentityError { Code = nameof(UserAlreadyHasPassword), Description = "User already has a password set." }; } public override IdentityError UserLockoutNotEnabled() { return new IdentityError { Code = nameof(UserLockoutNotEnabled), Description = "Lockout is not enabled for this user." }; } public override IdentityError UserAlreadyInRole(string role) { return new IdentityError { Code = nameof(UserAlreadyInRole), Description = $"User already in role '{role}'." }; } public override IdentityError UserNotInRole(string role) { return new IdentityError { Code = nameof(UserNotInRole), Description = $"User is not in role '{role}'." }; } public override IdentityError PasswordTooShort(int length) { return new IdentityError { Code = nameof(PasswordTooShort), Description = $"Passwords must be at least {length} characters." }; } public override IdentityError PasswordRequiresNonAlphanumeric() { return new IdentityError { Code = nameof(PasswordRequiresNonAlphanumeric), Description = "Passwords must have at least one non alphanumeric character." }; } public override IdentityError PasswordRequiresDigit() { return new IdentityError { Code = nameof(PasswordRequiresDigit), Description = "Passwords must have at least one digit ('0'-'9')." }; } public override IdentityError PasswordRequiresLower() { return new IdentityError { Code = nameof(PasswordRequiresLower), Description = "Passwords must have at least one lowercase ('a'-'z')." }; } public override IdentityError PasswordRequiresUpper() { return new IdentityError { Code = nameof(PasswordRequiresUpper), Description = "Passwords must have at least one uppercase ('A'-'Z')." }; } }
Registrieren Sie in Ihrer Startup-Klasse den benutzerdefinierten ErrorDescriber in ConfigureServices:
services.AddIdentity<ApplicationUser, IdentityRole>() .AddErrorDescriber<CustomIdentityErrorDescriber>(); // Add this line
UPDATE: Nachfolgend finden Sie bereits übersetzte Versionen für Spanisch und Portugiesisch. Überprüfe sie noch einmal!
public class SpanishIdentityErrorDescriber : IdentityErrorDescriber { public override IdentityError DefaultError() { return new IdentityError { Code = nameof(DefaultError), Description = $"Ha ocurrido un error." }; } public override IdentityError ConcurrencyFailure() { return new IdentityError { Code = nameof(ConcurrencyFailure), Description = "Ha ocurrido un error, el objeto ya ha sido modificado (Optimistic concurrency failure)." }; } public override IdentityError PasswordMismatch() { return new IdentityError { Code = nameof(PasswordMismatch), Description = "Password Incorrecta." }; } public override IdentityError InvalidToken() { return new IdentityError { Code = nameof(InvalidToken), Description = "Ha ingresado un código Inválido." }; } public override IdentityError LoginAlreadyAssociated() { return new IdentityError { Code = nameof(LoginAlreadyAssociated), Description = "Un usuario con ese nombre ya existe." }; } public override IdentityError InvalidUserName(string userName) { return new IdentityError { Code = nameof(InvalidUserName), Description = $"El nombre de usuario '{userName}' es inválido. Solo puede contener letras y números." }; } public override IdentityError InvalidEmail(string email) { return new IdentityError { Code = nameof(InvalidEmail), Description = $"La dirección de email '{email}' es incorrecta." }; } public override IdentityError DuplicateUserName(string userName) { return new IdentityError { Code = nameof(DuplicateUserName), Description = $"El usuario '{userName}' ya existe, por favor ingrese un nombre diferente." }; } public override IdentityError DuplicateEmail(string email) { return new IdentityError { Code = nameof(DuplicateEmail), Description = $"La direccion de email '{email}' ya se encuentra registrada. Puede recupar su contraseña para ingresar nuevamente al sistema." }; } public override IdentityError InvalidRoleName(string role) { return new IdentityError { Code = nameof(InvalidRoleName), Description = $"El nombre de rol '{role}' es inválido." }; } public override IdentityError DuplicateRoleName(string role) { return new IdentityError { Code = nameof(DuplicateRoleName), Description = $"El nombre de rol '{role}' ya existe." }; } public override IdentityError UserAlreadyHasPassword() { return new IdentityError { Code = nameof(UserAlreadyHasPassword), Description = "El usuario ya tiene contraseña." }; } public override IdentityError UserLockoutNotEnabled() { return new IdentityError { Code = nameof(UserLockoutNotEnabled), Description = "El bloqueo no esta habilitado para este usuario." }; } public override IdentityError UserAlreadyInRole(string role) { return new IdentityError { Code = nameof(UserAlreadyInRole), Description = $"El usuario ya es parte del rol '{role}'." }; } public override IdentityError UserNotInRole(string role) { return new IdentityError { Code = nameof(UserNotInRole), Description = $"El usuario no es parte del rol '{role}'." }; } public override IdentityError PasswordTooShort(int length) { return new IdentityError { Code = nameof(PasswordTooShort), Description = $"La contraseña deben tener un largo mínimo de {length} caracteres." }; } public override IdentityError PasswordRequiresNonAlphanumeric() { return new IdentityError { Code = nameof(PasswordRequiresNonAlphanumeric), Description = "La contraseña debe contener al menos un caracter alfanumérico." }; } public override IdentityError PasswordRequiresDigit() { return new IdentityError { Code = nameof(PasswordRequiresDigit), Description = "La contraseña debe incluir al menos un dígito ('0'-'9')." }; } public override IdentityError PasswordRequiresLower() { return new IdentityError { Code = nameof(PasswordRequiresLower), Description = "La contraseña debe incluir al menos una letra minúscula ('a'-'z')." }; } public override IdentityError PasswordRequiresUpper() { return new IdentityError { Code = nameof(PasswordRequiresUpper), Description = "La contraseña debe incluir al menos una letra MAYÚSCULA ('A'-'Z')." }; } }
Portugiesisch: (vielen Dank an Furlanrapha )
public class PortugueseIdentityErrorDescriber : IdentityErrorDescriber { public override IdentityError DefaultError() { return new IdentityError { Code = nameof(DefaultError), Description = $"Um erro desconhecido ocorreu." }; } public override IdentityError ConcurrencyFailure() { return new IdentityError { Code = nameof(ConcurrencyFailure), Description = "Falha de concorrência otimista, o objeto foi modificado." }; } public override IdentityError PasswordMismatch() { return new IdentityError { Code = nameof(PasswordMismatch), Description = "Senha incorreta." }; } public override IdentityError InvalidToken() { return new IdentityError { Code = nameof(InvalidToken), Description = "Token inválido." }; } public override IdentityError LoginAlreadyAssociated() { return new IdentityError { Code = nameof(LoginAlreadyAssociated), Description = "Já existe um usuário com este login." }; } public override IdentityError InvalidUserName(string userName) { return new IdentityError { Code = nameof(InvalidUserName), Description = $"Login '{userName}' é inválido, pode conter apenas letras ou dígitos." }; } public override IdentityError InvalidEmail(string email) { return new IdentityError { Code = nameof(InvalidEmail), Description = $"Email '{email}' é inválido." }; } public override IdentityError DuplicateUserName(string userName) { return new IdentityError { Code = nameof(DuplicateUserName), Description = $"Login '{userName}' já está sendo utilizado." }; } public override IdentityError DuplicateEmail(string email) { return new IdentityError { Code = nameof(DuplicateEmail), Description = $"Email '{email}' já está sendo utilizado." }; } public override IdentityError InvalidRoleName(string role) { return new IdentityError { Code = nameof(InvalidRoleName), Description = $"A permissão '{role}' é inválida." }; } public override IdentityError DuplicateRoleName(string role) { return new IdentityError { Code = nameof(DuplicateRoleName), Description = $"A permissão '{role}' já está sendo utilizada." }; } public override IdentityError UserAlreadyHasPassword() { return new IdentityError { Code = nameof(UserAlreadyHasPassword), Description = "Usuário já possui uma senha definida." }; } public override IdentityError UserLockoutNotEnabled() { return new IdentityError { Code = nameof(UserLockoutNotEnabled), Description = "Lockout não está habilitado para este usuário." }; } public override IdentityError UserAlreadyInRole(string role) { return new IdentityError { Code = nameof(UserAlreadyInRole), Description = $"Usuário já possui a permissão '{role}'." }; } public override IdentityError UserNotInRole(string role) { return new IdentityError { Code = nameof(UserNotInRole), Description = $"Usuário não tem a permissão '{role}'." }; } public override IdentityError PasswordTooShort(int length) { return new IdentityError { Code = nameof(PasswordTooShort), Description = $"Senhas devem conter ao menos {length} caracteres." }; } public override IdentityError PasswordRequiresNonAlphanumeric() { return new IdentityError { Code = nameof(PasswordRequiresNonAlphanumeric), Description = "Senhas devem conter ao menos um caracter não alfanumérico." }; } public override IdentityError PasswordRequiresDigit() { return new IdentityError { Code = nameof(PasswordRequiresDigit), Description = "Senhas devem conter ao menos um digito ('0'-'9')." }; } public override IdentityError PasswordRequiresLower() { return new IdentityError { Code = nameof(PasswordRequiresLower), Description = "Senhas devem conter ao menos um caracter em caixa baixa ('a'-'z')." }; } public override IdentityError PasswordRequiresUpper() { return new IdentityError { Code = nameof(PasswordRequiresUpper), Description = "Senhas devem conter ao menos um caracter em caixa alta ('A'-'Z')." }; } }
quelle
CurrentCulture
im IdentityErrorDescriber und gebe entsprechend lokalisierte Fehlermeldungen zurück, aber das ist ein Rezept für unordentlichen Code. Ressourcendateien sollten der richtige Weg sein. Es sieht so aus, als ob die ursprüngliche Implementierung nicht erweiterbar ist (bitte korrigieren Sie mich, wenn ich falsch liege), sondern res-Dateien verwendet. Klonen Sie das ursprüngliche Original ErrorDescr + seiner Ressourcendatei und fügen Sie möglicherweise neue Ressourcen für Ihre Sprachen hinzu?IdentityErrorDescriber
mit einem injizierenIStringLocalizer
. Zur Lokalisierung siehe: docs.microsoft.com/en-us/aspnet/core/fundamentals/localizationAb Version 2 der Identität, die am 20. März 2014 veröffentlicht wurde, können jetzt Fehlermeldungen lokalisiert werden.
Installieren Sie zuerst das identitätslokalisierte Paket.
Dann muss die richtige Kultur festgelegt werden, um lokalisierte Nachrichten zu erhalten. Eine Möglichkeit zum Festlegen der Kultur ist beispielsweise web.config
quelle
Problemumgehung für ASP NET Core (25.11.2016)
Sie können IStringLocalizer in benutzerdefinierten IdentityErrorDescriber einfügen
1) Erstellen Sie einen benutzerdefinierten IdentityErrorDescriber (siehe Antwort von Gerardo Grignoli).
2) Registrieren Sie MultilanguageIdentityErrorDescriber in Startup.cs
3) Fügen Sie SharedResource.language.resx Fehlermeldungen hinzu.
quelle
Ich bin auf dasselbe Problem gestoßen und habe eine schnelle und schmutzige Problemumgehung gefunden. Ich habe
Microsoft.AspNet.Identity.Core
mit DotPeek in die Assembly geschaut (ich gehe davon aus, dass jeder C # -Decompiler dies tut) und zwei Klassen gefunden, die für solche Nachrichten verantwortlich sind:Microsoft.AspNet.Identity.UserValidator<TUser>
(Benutzername)Microsoft.AspNet.Identity.MinimumLengthValidator
(Passwortbezogen)Diese Klassen enthalten keine externen Referenzen (außer den Zeichenfolgenressourcen, die Sie ohnehin ersetzen möchten). Daher sollte die erneute Implementierung in Ihrem eigenen Code recht einfach sein.
Vergessen Sie danach nicht, sie ordnungsgemäß in Ihrem
UserManager
:quelle
Dies ist für liebe Farsi (Perser) Sprecher
quelle
Deutsche Version für Lösung von @GerardoGrignoli
quelle
1AmirJalalis Methode funktioniert perfekt. Während das Festlegen der Kultur in web.config funktioniert, kann sie bei Bedarf auch dynamisch festgelegt werden. Dies kann folgendermaßen erreicht werden:
Im obigen Codebeispiel ist CultureName der Name der einzustellenden Kultur. Eine Liste der Kulturen finden Sie unter "Bemerkungen" hier: http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.80%29.aspx
Hoffe das hilft.
quelle
Ich möchte weder die Logik überschreiben (dh das Rad neu erfinden), noch möchte ich zu ASP NET Core wechseln. Ich möchte lediglich die Fehlermeldungen überschreiben und mehrere Ressourcendateien (pro Sprache) verwenden, um die Benutzererfahrung an die von Ihnen gewählte Sprache anzupassen.
Hier ist meine Lösung:
Ich habe eine Ressourcendatei 'IdentityErrors.resx' mit folgenden Elementen erstellt:
Ich habe eine 'IdentityResultErrorMessages.cs'-Klasse erstellt:
Ich habe die AddErrors-Methode des Controllers wie folgt geändert:
Jetzt kann ich Ressourcendateien für die anderen Sprachinhalte erstellen, die ich auf meiner Website bereitstellen möchte.
quelle
Basierend auf den Antworten hier habe ich meine eigene Implementierung für unsere mehrsprachige Website erstellt, die auf MVC Core 2.2 basiert und bei der die Zeichenfolgen nicht fest codiert werden können.
Ich verwende eine grundlegende Ressourcendatei mit automatisch generiertem Designer, um die Zeichenfolgen abzurufen, und der Code dafür sieht folgendermaßen aus:
Es wird dann in die Identity-Pipeline in Startup.cs integriert
Zuletzt habe ich die Zeichenfolgen in meinen Translations.resx- und Subressourcendateien definiert, wobei die Schlüssel Validation_DefaultError, Validation_PasswordMismatch usw. heißen.
quelle
Dieses Problem hat mich schon seit einiger Zeit beschäftigt, also habe ich versucht, etwas Generisches zu finden, da die Lösung mit der Installation von Identity.Core für eine bestimmte Kultur nur funktioniert, wenn das Paket überhaupt verfügbar ist :)
Hier sind die Schritte, mit denen ich die richtige Lokalisierung erreicht habe:
Microsoft.AspNet.Identity.PasswordValidator
Betrachtet man die Implementierung der Verwendung von dotPeak, die standardmäßig in verwendet wirdApplicationUserManager
,class CustomPasswordValidator : PasswordValidator
ausgedacht und dieValidateAsync
Methode überschrieben , um nichtIdentityResult
mit Fehlermeldungen, sondern mit "Codes" dieser Fehlermeldungen zurückzukehren, denen alle die Zeichenfolge "CustomValidator" vorangestellt ist.AccountController
ich in geändert,AddErrors
was von derRegister
Post aufgerufen wird , um lokalisierte Fehlermeldungen aus meinen eigenen Ressourcendateien basierend auf Fehlercodes bereitzustellen.Hier ist die
CustomPasswordValidator
Dienstprogrammklasse und,PasswordValidatorCodes
die Fehlercodes und Methoden zum Abrufen der lokalisierten Fehlermeldungen basierend auf diesen Codes enthält (AccountStrings ist eine Ressourcendatei):Und hier ist die modifizierte
AccountController.AddErrors
Methode. Wie Sie sehen können, füge ich dem Modell für die Eigenschaft einen Fehler hinzu.Password
Wenn diePassword
Validierung nicht bestanden wird, soll die Fehlermeldung imPassword
Feld und nicht in der Validierungszusammenfassung angezeigt werden . Dies ist der einzige Grund, warum myCustomPasswordValidator
Fehlercodes anstelle von Fehlermeldungen direkt erzeugt:Vergessen Sie nicht, die
IdentityConfig
Datei zu ändern , dh:AKTUALISIEREN:
Erst jetzt ist mir aufgefallen, dass Marselus Chia (siehe andere Antworten) eine ähnliche Lösung gefunden hat, aber für die VB.
quelle
Hier ist Gerardo Grignolis Antwort mit französischer Übersetzung
quelle
Hallo hier, meine Lösung, um Identitätsfehler zu übersetzen:
Beispiel
quelle
Zusätzlich zu @Gerardo Grinolli beantworten Sie diese übersetzten Versionen für Russisch:
quelle
Polnische Version
quelle
Lassen Sie mich mit Ihnen teilen, was ich getan habe, um dies auf Spanisch zu erreichen. Dort können Sie die Nachrichten einfach anpassen!
quelle
Meine Lösung besteht darin, eine neue benutzerdefinierte Kennwortüberprüfungsklasse zu erstellen, die von Microsoft.AspNet.Identity.PasswordValidator geerbt wird. Überschreibt die ValidateAsync, die die Fehlermeldung sendet. Passen Sie die Fehlermeldung hier an und es funktioniert für mich ...
Diese Klassen setzen voraus, dass Sie über einen Validator für globale Ressourcendateinamen verfügen. Das Skript aus dieser Klasse und das Beispiel für die Ressourcendatei finden Sie hier. ASP.NET-Identität - Codeplex-Beispielcode
Hier ist mein Beispielarbeitscode in vb.net
Denken Sie daran, die Einstellung in Ihrer Datei identityConfig.vb zu aktualisieren, um diese Klasse zu verwenden.
quelle
Meine Lösung war etwas schmutzig, aber es funktioniert wie erwartet. Die Idee ist, alle Fehler zuzuweisen, die das IdentityResult-Objektergebnis mit sich bringt, wenn wir einen neuen Benutzer registrieren:
Zu einem neuen, den wir erstellen werden. Zuerst müssen wir eine Liste erstellen, die unsere benutzerdefinierten Fehler enthält:
Dann müssen wir die Fehler im Ergebnis durchlaufen und für jeden einen neuen benutzerdefinierten Fehler hinzufügen, je nachdem, was die Ursache dafür war (doppelter Benutzer, E-Mail usw.):
Danach erstellen wir einfach ein neues IdentityResult-Objekt:
Und übergeben Sie es am Ende unserer Registrierungsaktion an die AddErrors-Methode:
quelle
Wenn Sie auf dasselbe Problem gestoßen sind, können Sie Ihre eigenen Ressourcendateien bereitstellen, um dies zu erreichen. Natürlich erfordert es ein bisschen Reflection Hacking! Zuerst müssen Sie mit voller Sicherheit ausgeführt werden, dh in Ihrer web.config festgelegt:
Weiter in Ihrer App Startcode:
Job erledigt!
quelle
Es ist mir gelungen, eine Lösung zu finden, um eine lokalisierte Version von AspNet.Identity für Kulturen zu erstellen, für die kein gebrauchsfertiges Paket verfügbar ist. Schritte sind:
Resources.aa-BB.resx
dasaa-BB
ist die Kultur , die Sie benötigen , um die Anordnung zu lokalisieren. zB .:Resources.fa-IR.resx
.Resources.resx
dort.bin
Ordner und unter dem VerzeichnisDebug
oder sehenRelease
Sie einen Ordner mit dem Namenaa-BB
(die Kultur, die Sie zuvor eingegeben haben). Kopieren Sie den Ordner in dasbin
Verzeichnis Ihres Projekts.quelle
Hier ist die türkische Übersetzung von IdentityErrorDescriber
quelle
Ukrainische Übersetzung für Andrew Basarab Antwort
Ressourcendateidaten:
quelle