feat(typescript): add i18n for all input required messages in Login V2 (#10288)

# Which Problems Are Solved

- Currently message when required field is empty is hardcoded

For example:
<img width="429" height="381" alt="image"
src="https://github.com/user-attachments/assets/31671d62-e45e-42c2-8ffe-a77982d0fc9d"
/>


# How the Problems Are Solved

- adds i18n for all input required messages

For example:
<img width="434" height="374" alt="image"
src="https://github.com/user-attachments/assets/9f94dd47-6c0a-4232-bef2-8dd1aa2674df"
/>


# Additional Changes

N.A

# Additional Context

N.A

Co-authored-by: Max Peintner <max@caos.ch>
This commit is contained in:
Adam Kida
2025-07-22 14:48:28 +02:00
committed by GitHub
parent a3e1d6a3ff
commit 74e144840a
19 changed files with 404 additions and 91 deletions

View File

@@ -25,14 +25,20 @@
"title": "Willkommen zurück!", "title": "Willkommen zurück!",
"description": "Geben Sie Ihre Anmeldedaten ein.", "description": "Geben Sie Ihre Anmeldedaten ein.",
"register": "Neuen Benutzer registrieren", "register": "Neuen Benutzer registrieren",
"submit": "Weiter" "submit": "Weiter",
"required": {
"loginName": "Dieses Feld ist erforderlich"
}
}, },
"password": { "password": {
"verify": { "verify": {
"title": "Passwort", "title": "Passwort",
"description": "Geben Sie Ihr Passwort ein.", "description": "Geben Sie Ihr Passwort ein.",
"resetPassword": "Passwort zurücksetzen", "resetPassword": "Passwort zurücksetzen",
"submit": "Weiter" "submit": "Weiter",
"required": {
"password": "Dieses Feld ist erforderlich"
}
}, },
"set": { "set": {
"title": "Passwort festlegen", "title": "Passwort festlegen",
@@ -40,12 +46,21 @@
"codeSent": "Ein Code wurde an Ihre E-Mail-Adresse gesendet.", "codeSent": "Ein Code wurde an Ihre E-Mail-Adresse gesendet.",
"noCodeReceived": "Keinen Code erhalten?", "noCodeReceived": "Keinen Code erhalten?",
"resend": "Erneut senden", "resend": "Erneut senden",
"submit": "Weiter" "submit": "Weiter",
"required": {
"code": "Dieses Feld ist erforderlich",
"newPassword": "Bitte geben Sie ein Passwort ein!",
"confirmPassword": "Dieses Feld ist erforderlich"
}
}, },
"change": { "change": {
"title": "Passwort ändern", "title": "Passwort ändern",
"description": "Legen Sie das Passwort für Ihr Konto fest", "description": "Legen Sie das Passwort für Ihr Konto fest",
"submit": "Weiter" "submit": "Weiter",
"required": {
"newPassword": "Bitte geben Sie ein neues Passwort ein!",
"confirmPassword": "Dieses Feld ist erforderlich"
}
} }
}, },
"idp": { "idp": {
@@ -87,7 +102,11 @@
"description": "Geben Sie Ihre LDAP-Anmeldedaten ein.", "description": "Geben Sie Ihre LDAP-Anmeldedaten ein.",
"username": "Benutzername", "username": "Benutzername",
"password": "Passwort", "password": "Passwort",
"submit": "Weiter" "submit": "Weiter",
"required": {
"username": "Dieses Feld ist erforderlich",
"password": "Dieses Feld ist erforderlich"
}
}, },
"mfa": { "mfa": {
"verify": { "verify": {
@@ -109,7 +128,10 @@
"emailDescription": "Geben Sie den Code ein, den Sie per E-Mail erhalten haben.", "emailDescription": "Geben Sie den Code ein, den Sie per E-Mail erhalten haben.",
"noCodeReceived": "Keinen Code erhalten?", "noCodeReceived": "Keinen Code erhalten?",
"resendCode": "Code erneut senden", "resendCode": "Code erneut senden",
"submit": "Weiter" "submit": "Weiter",
"required": {
"code": "Dieses Feld ist erforderlich"
}
}, },
"set": { "set": {
"title": "2-Faktor einrichten", "title": "2-Faktor einrichten",
@@ -117,7 +139,10 @@
"smsDescription": "Geben Sie Ihre Telefonnummer ein, um einen Code per SMS zu erhalten.", "smsDescription": "Geben Sie Ihre Telefonnummer ein, um einen Code per SMS zu erhalten.",
"emailDescription": "Geben Sie Ihre E-Mail-Adresse ein, um einen Code per E-Mail zu erhalten.", "emailDescription": "Geben Sie Ihre E-Mail-Adresse ein, um einen Code per E-Mail zu erhalten.",
"totpRegisterDescription": "Scannen Sie den QR-Code oder navigieren Sie manuell zur URL.", "totpRegisterDescription": "Scannen Sie den QR-Code oder navigieren Sie manuell zur URL.",
"submit": "Weiter" "submit": "Weiter",
"required": {
"code": "Dieses Feld ist erforderlich"
}
} }
}, },
"passkey": { "passkey": {
@@ -174,7 +199,16 @@
"password": { "password": {
"title": "Passwort festlegen", "title": "Passwort festlegen",
"description": "Legen Sie das Passwort für Ihr Konto fest", "description": "Legen Sie das Passwort für Ihr Konto fest",
"submit": "Weiter" "submit": "Weiter",
"required": {
"password": "Bitte geben Sie ein Passwort ein!",
"confirmPassword": "Dieses Feld ist erforderlich"
}
},
"required": {
"firstname": "Dieses Feld ist erforderlich",
"lastname": "Dieses Feld ist erforderlich",
"email": "Dieses Feld ist erforderlich"
} }
}, },
"invite": { "invite": {
@@ -211,7 +245,10 @@
"noCodeReceived": "Keinen Code erhalten?", "noCodeReceived": "Keinen Code erhalten?",
"resendCode": "Code erneut senden", "resendCode": "Code erneut senden",
"codeSent": "Ein Code wurde gerade an Ihre E-Mail-Adresse gesendet.", "codeSent": "Ein Code wurde gerade an Ihre E-Mail-Adresse gesendet.",
"submit": "Weiter" "submit": "Weiter",
"required": {
"code": "Dieses Feld ist erforderlich"
}
} }
}, },
"authenticator": { "authenticator": {
@@ -225,7 +262,10 @@
"usercode": { "usercode": {
"title": "Gerätecode", "title": "Gerätecode",
"description": "Geben Sie den Code ein.", "description": "Geben Sie den Code ein.",
"submit": "Weiter" "submit": "Weiter",
"required": {
"code": "Dieses Feld ist erforderlich"
}
}, },
"request": { "request": {
"title": "{appName} möchte eine Verbindung herstellen:", "title": "{appName} möchte eine Verbindung herstellen:",

View File

@@ -25,14 +25,20 @@
"title": "Welcome back!", "title": "Welcome back!",
"description": "Enter your login data.", "description": "Enter your login data.",
"register": "Register new user", "register": "Register new user",
"submit": "Continue" "submit": "Continue",
"required": {
"loginName": "This field is required"
}
}, },
"password": { "password": {
"verify": { "verify": {
"title": "Password", "title": "Password",
"description": "Enter your password.", "description": "Enter your password.",
"resetPassword": "Reset Password", "resetPassword": "Reset Password",
"submit": "Continue" "submit": "Continue",
"required": {
"password": "This field is required"
}
}, },
"set": { "set": {
"title": "Set Password", "title": "Set Password",
@@ -40,12 +46,21 @@
"codeSent": "A code has been sent to your email address.", "codeSent": "A code has been sent to your email address.",
"noCodeReceived": "Didn't receive a code?", "noCodeReceived": "Didn't receive a code?",
"resend": "Resend code", "resend": "Resend code",
"submit": "Continue" "submit": "Continue",
"required": {
"code": "This field is required",
"newPassword": "You have to provide a password!",
"confirmPassword": "This field is required"
}
}, },
"change": { "change": {
"title": "Change Password", "title": "Change Password",
"description": "Set the password for your account", "description": "Set the password for your account",
"submit": "Continue" "submit": "Continue",
"required": {
"newPassword": "You have to provide a new password!",
"confirmPassword": "This field is required"
}
} }
}, },
"idp": { "idp": {
@@ -87,7 +102,11 @@
"description": "Enter your LDAP credentials.", "description": "Enter your LDAP credentials.",
"username": "Username", "username": "Username",
"password": "Password", "password": "Password",
"submit": "Continue" "submit": "Continue",
"required": {
"username": "This field is required",
"password": "This field is required"
}
}, },
"mfa": { "mfa": {
"verify": { "verify": {
@@ -109,7 +128,10 @@
"emailDescription": "Enter the code you received via email.", "emailDescription": "Enter the code you received via email.",
"noCodeReceived": "Didn't receive a code?", "noCodeReceived": "Didn't receive a code?",
"resendCode": "Resend code", "resendCode": "Resend code",
"submit": "Continue" "submit": "Continue",
"required": {
"code": "This field is required"
}
}, },
"set": { "set": {
"title": "Set up 2-Factor", "title": "Set up 2-Factor",
@@ -117,7 +139,10 @@
"smsDescription": "Enter your phone number to receive a code via SMS.", "smsDescription": "Enter your phone number to receive a code via SMS.",
"emailDescription": "Enter your email address to receive a code via email.", "emailDescription": "Enter your email address to receive a code via email.",
"totpRegisterDescription": "Scan the QR Code or navigate to the URL manually.", "totpRegisterDescription": "Scan the QR Code or navigate to the URL manually.",
"submit": "Continue" "submit": "Continue",
"required": {
"code": "This field is required"
}
} }
}, },
"passkey": { "passkey": {
@@ -174,7 +199,16 @@
"password": { "password": {
"title": "Set Password", "title": "Set Password",
"description": "Set the password for your account", "description": "Set the password for your account",
"submit": "Continue" "submit": "Continue",
"required": {
"password": "You have to provide a password!",
"confirmPassword": "This field is required"
}
},
"required": {
"firstname": "This field is required",
"lastname": "This field is required",
"email": "This field is required"
} }
}, },
"invite": { "invite": {
@@ -211,7 +245,10 @@
"noCodeReceived": "Didn't receive a code?", "noCodeReceived": "Didn't receive a code?",
"resendCode": "Resend code", "resendCode": "Resend code",
"codeSent": "A code has just been sent to your email address.", "codeSent": "A code has just been sent to your email address.",
"submit": "Continue" "submit": "Continue",
"required": {
"code": "This field is required"
}
} }
}, },
"authenticator": { "authenticator": {
@@ -225,7 +262,10 @@
"usercode": { "usercode": {
"title": "Device code", "title": "Device code",
"description": "Enter the code displayed on your app or device.", "description": "Enter the code displayed on your app or device.",
"submit": "Continue" "submit": "Continue",
"required": {
"code": "This field is required"
}
}, },
"request": { "request": {
"title": "{appName} would like to connect", "title": "{appName} would like to connect",

View File

@@ -25,14 +25,20 @@
"title": "¡Bienvenido de nuevo!", "title": "¡Bienvenido de nuevo!",
"description": "Introduce tus datos de acceso.", "description": "Introduce tus datos de acceso.",
"register": "Registrar nuevo usuario", "register": "Registrar nuevo usuario",
"submit": "Continuar" "submit": "Continuar",
"required": {
"loginName": "Este campo es obligatorio"
}
}, },
"password": { "password": {
"verify": { "verify": {
"title": "Contraseña", "title": "Contraseña",
"description": "Introduce tu contraseña.", "description": "Introduce tu contraseña.",
"resetPassword": "Restablecer contraseña", "resetPassword": "Restablecer contraseña",
"submit": "Continuar" "submit": "Continuar",
"required": {
"password": "Este campo es obligatorio"
}
}, },
"set": { "set": {
"title": "Establecer Contraseña", "title": "Establecer Contraseña",
@@ -40,12 +46,21 @@
"codeSent": "Se ha enviado un código a su correo electrónico.", "codeSent": "Se ha enviado un código a su correo electrónico.",
"noCodeReceived": "¿No recibiste un código?", "noCodeReceived": "¿No recibiste un código?",
"resend": "Reenviar código", "resend": "Reenviar código",
"submit": "Continuar" "submit": "Continuar",
"required": {
"code": "Este campo es obligatorio",
"newPassword": "¡Debes proporcionar una contraseña!",
"confirmPassword": "Este campo es obligatorio"
}
}, },
"change": { "change": {
"title": "Cambiar Contraseña", "title": "Cambiar Contraseña",
"description": "Establece la contraseña para tu cuenta", "description": "Establece la contraseña para tu cuenta",
"submit": "Continuar" "submit": "Continuar",
"required": {
"newPassword": "¡Debes proporcionar una nueva contraseña!",
"confirmPassword": "Este campo es obligatorio"
}
} }
}, },
"idp": { "idp": {
@@ -87,7 +102,11 @@
"description": "Introduce tus credenciales LDAP.", "description": "Introduce tus credenciales LDAP.",
"username": "Nombre de usuario", "username": "Nombre de usuario",
"password": "Contraseña", "password": "Contraseña",
"submit": "Continuar" "submit": "Continuar",
"required": {
"username": "Este campo es obligatorio",
"password": "Este campo es obligatorio"
}
}, },
"mfa": { "mfa": {
"verify": { "verify": {
@@ -109,7 +128,10 @@
"emailDescription": "Introduce el código que recibiste por correo electrónico.", "emailDescription": "Introduce el código que recibiste por correo electrónico.",
"noCodeReceived": "¿No recibiste un código?", "noCodeReceived": "¿No recibiste un código?",
"resendCode": "Reenviar código", "resendCode": "Reenviar código",
"submit": "Continuar" "submit": "Continuar",
"required": {
"code": "Este campo es obligatorio"
}
}, },
"set": { "set": {
"title": "Configurar autenticación de 2 factores", "title": "Configurar autenticación de 2 factores",
@@ -117,7 +139,10 @@
"smsDescription": "Introduce tu número de teléfono para recibir un código por SMS.", "smsDescription": "Introduce tu número de teléfono para recibir un código por SMS.",
"emailDescription": "Introduce tu dirección de correo electrónico para recibir un código por correo electrónico.", "emailDescription": "Introduce tu dirección de correo electrónico para recibir un código por correo electrónico.",
"totpRegisterDescription": "Escanea el código QR o navega manualmente a la URL.", "totpRegisterDescription": "Escanea el código QR o navega manualmente a la URL.",
"submit": "Continuar" "submit": "Continuar",
"required": {
"code": "Este campo es obligatorio"
}
} }
}, },
"passkey": { "passkey": {
@@ -174,7 +199,16 @@
"password": { "password": {
"title": "Establecer Contraseña", "title": "Establecer Contraseña",
"description": "Establece la contraseña para tu cuenta", "description": "Establece la contraseña para tu cuenta",
"submit": "Continuar" "submit": "Continuar",
"required": {
"password": "¡Debes proporcionar una contraseña!",
"confirmPassword": "Este campo es obligatorio"
}
},
"required": {
"firstname": "Este campo es obligatorio",
"lastname": "Este campo es obligatorio",
"email": "Este campo es obligatorio"
} }
}, },
"invite": { "invite": {
@@ -211,7 +245,10 @@
"noCodeReceived": "¿No recibiste un código?", "noCodeReceived": "¿No recibiste un código?",
"resendCode": "Reenviar código", "resendCode": "Reenviar código",
"codeSent": "Se ha enviado un código a tu dirección de correo electrónico.", "codeSent": "Se ha enviado un código a tu dirección de correo electrónico.",
"submit": "Continuar" "submit": "Continuar",
"required": {
"code": "Este campo es obligatorio"
}
} }
}, },
"authenticator": { "authenticator": {
@@ -225,7 +262,10 @@
"usercode": { "usercode": {
"title": "Código del dispositivo", "title": "Código del dispositivo",
"description": "Introduce el código.", "description": "Introduce el código.",
"submit": "Continuar" "submit": "Continuar",
"required": {
"code": "Este campo es obligatorio"
}
}, },
"request": { "request": {
"title": "{appName} desea conectarse:", "title": "{appName} desea conectarse:",

View File

@@ -25,14 +25,20 @@
"title": "Bentornato!", "title": "Bentornato!",
"description": "Inserisci i tuoi dati di accesso.", "description": "Inserisci i tuoi dati di accesso.",
"register": "Registrati come nuovo utente", "register": "Registrati come nuovo utente",
"submit": "Continua" "submit": "Continua",
"required": {
"loginName": "Questo campo è obbligatorio"
}
}, },
"password": { "password": {
"verify": { "verify": {
"title": "Password", "title": "Password",
"description": "Inserisci la tua password.", "description": "Inserisci la tua password.",
"resetPassword": "Reimposta Password", "resetPassword": "Reimposta Password",
"submit": "Continua" "submit": "Continua",
"required": {
"password": "Questo campo è obbligatorio"
}
}, },
"set": { "set": {
"title": "Imposta Password", "title": "Imposta Password",
@@ -40,12 +46,21 @@
"codeSent": "Un codice è stato inviato al tuo indirizzo email.", "codeSent": "Un codice è stato inviato al tuo indirizzo email.",
"noCodeReceived": "Non hai ricevuto un codice?", "noCodeReceived": "Non hai ricevuto un codice?",
"resend": "Invia di nuovo", "resend": "Invia di nuovo",
"submit": "Continua" "submit": "Continua",
"required": {
"code": "Questo campo è obbligatorio",
"newPassword": "Devi fornire una password!",
"confirmPassword": "Questo campo è obbligatorio"
}
}, },
"change": { "change": {
"title": "Cambia Password", "title": "Cambia Password",
"description": "Imposta la password per il tuo account", "description": "Imposta la password per il tuo account",
"submit": "Continua" "submit": "Continua",
"required": {
"newPassword": "Devi fornire una nuova password!",
"confirmPassword": "Questo campo è obbligatorio"
}
} }
}, },
"idp": { "idp": {
@@ -87,7 +102,11 @@
"description": "Inserisci le tue credenziali LDAP.", "description": "Inserisci le tue credenziali LDAP.",
"username": "Nome utente", "username": "Nome utente",
"password": "Password", "password": "Password",
"submit": "Continua" "submit": "Continua",
"required": {
"username": "Questo campo è obbligatorio",
"password": "Questo campo è obbligatorio"
}
}, },
"mfa": { "mfa": {
"verify": { "verify": {
@@ -109,7 +128,10 @@
"emailDescription": "Inserisci il codice ricevuto via email.", "emailDescription": "Inserisci il codice ricevuto via email.",
"noCodeReceived": "Non hai ricevuto un codice?", "noCodeReceived": "Non hai ricevuto un codice?",
"resendCode": "Invia di nuovo il codice", "resendCode": "Invia di nuovo il codice",
"submit": "Continua" "submit": "Continua",
"required": {
"code": "Questo campo è obbligatorio"
}
}, },
"set": { "set": {
"title": "Configura l'autenticazione a 2 fattori", "title": "Configura l'autenticazione a 2 fattori",
@@ -117,7 +139,10 @@
"smsDescription": "Inserisci il tuo numero di telefono per ricevere un codice via SMS.", "smsDescription": "Inserisci il tuo numero di telefono per ricevere un codice via SMS.",
"emailDescription": "Inserisci il tuo indirizzo email per ricevere un codice via email.", "emailDescription": "Inserisci il tuo indirizzo email per ricevere un codice via email.",
"totpRegisterDescription": "Scansiona il codice QR o naviga manualmente all'URL.", "totpRegisterDescription": "Scansiona il codice QR o naviga manualmente all'URL.",
"submit": "Continua" "submit": "Continua",
"required": {
"code": "Questo campo è obbligatorio"
}
} }
}, },
"passkey": { "passkey": {
@@ -174,7 +199,16 @@
"password": { "password": {
"title": "Imposta Password", "title": "Imposta Password",
"description": "Imposta la password per il tuo account", "description": "Imposta la password per il tuo account",
"submit": "Continua" "submit": "Continua",
"required": {
"password": "Devi fornire una password!",
"confirmPassword": "Questo campo è obbligatorio"
}
},
"required": {
"firstname": "Questo campo è obbligatorio",
"lastname": "Questo campo è obbligatorio",
"email": "Questo campo è obbligatorio"
} }
}, },
"invite": { "invite": {
@@ -211,7 +245,10 @@
"noCodeReceived": "Non hai ricevuto un codice?", "noCodeReceived": "Non hai ricevuto un codice?",
"resendCode": "Invia di nuovo il codice", "resendCode": "Invia di nuovo il codice",
"codeSent": "Un codice è stato appena inviato al tuo indirizzo email.", "codeSent": "Un codice è stato appena inviato al tuo indirizzo email.",
"submit": "Continua" "submit": "Continua",
"required": {
"code": "Questo campo è obbligatorio"
}
} }
}, },
"authenticator": { "authenticator": {
@@ -225,7 +262,10 @@
"usercode": { "usercode": {
"title": "Codice dispositivo", "title": "Codice dispositivo",
"description": "Inserisci il codice.", "description": "Inserisci il codice.",
"submit": "Continua" "submit": "Continua",
"required": {
"code": "Questo campo è obbligatorio"
}
}, },
"request": { "request": {
"title": "{appName} desidera connettersi:", "title": "{appName} desidera connettersi:",

View File

@@ -25,14 +25,20 @@
"title": "Witamy ponownie!", "title": "Witamy ponownie!",
"description": "Wprowadź dane logowania.", "description": "Wprowadź dane logowania.",
"register": "Zarejestruj nowego użytkownika", "register": "Zarejestruj nowego użytkownika",
"submit": "Kontynuuj" "submit": "Kontynuuj",
"required": {
"loginName": "To pole jest wymagane"
}
}, },
"password": { "password": {
"verify": { "verify": {
"title": "Hasło", "title": "Hasło",
"description": "Wprowadź swoje hasło.", "description": "Wprowadź swoje hasło.",
"resetPassword": "Zresetuj hasło", "resetPassword": "Zresetuj hasło",
"submit": "Kontynuuj" "submit": "Kontynuuj",
"required": {
"password": "To pole jest wymagane"
}
}, },
"set": { "set": {
"title": "Ustaw hasło", "title": "Ustaw hasło",
@@ -40,12 +46,21 @@
"codeSent": "Kod został wysłany na twój adres e-mail.", "codeSent": "Kod został wysłany na twój adres e-mail.",
"noCodeReceived": "Nie otrzymałeś kodu?", "noCodeReceived": "Nie otrzymałeś kodu?",
"resend": "Wyślij kod ponownie", "resend": "Wyślij kod ponownie",
"submit": "Kontynuuj" "submit": "Kontynuuj",
"required": {
"code": "To pole jest wymagane",
"newPassword": "Musisz podać hasło!",
"confirmPassword": "To pole jest wymagane"
}
}, },
"change": { "change": {
"title": "Zmień hasło", "title": "Zmień hasło",
"description": "Ustaw nowe hasło dla swojego konta", "description": "Ustaw nowe hasło dla swojego konta",
"submit": "Kontynuuj" "submit": "Kontynuuj",
"required": {
"newPassword": "Musisz podać nowe hasło!",
"confirmPassword": "To pole jest wymagane"
}
} }
}, },
"idp": { "idp": {
@@ -87,7 +102,11 @@
"description": "Wprowadź swoje dane logowania LDAP.", "description": "Wprowadź swoje dane logowania LDAP.",
"username": "Nazwa użytkownika", "username": "Nazwa użytkownika",
"password": "Hasło", "password": "Hasło",
"submit": "Kontynuuj" "submit": "Kontynuuj",
"required": {
"username": "To pole jest wymagane",
"password": "To pole jest wymagane"
}
}, },
"mfa": { "mfa": {
"verify": { "verify": {
@@ -109,7 +128,10 @@
"emailDescription": "Wprowadź kod otrzymany e-mailem.", "emailDescription": "Wprowadź kod otrzymany e-mailem.",
"noCodeReceived": "Nie otrzymałeś kodu?", "noCodeReceived": "Nie otrzymałeś kodu?",
"resendCode": "Wyślij kod ponownie", "resendCode": "Wyślij kod ponownie",
"submit": "Kontynuuj" "submit": "Kontynuuj",
"required": {
"code": "To pole jest wymagane"
}
}, },
"set": { "set": {
"title": "Skonfiguruj uwierzytelnianie dwuskładnikowe", "title": "Skonfiguruj uwierzytelnianie dwuskładnikowe",
@@ -117,7 +139,10 @@
"smsDescription": "Wprowadź swój numer telefonu, aby otrzymać kod SMS-em.", "smsDescription": "Wprowadź swój numer telefonu, aby otrzymać kod SMS-em.",
"emailDescription": "Wprowadź swój adres e-mail, aby otrzymać kod e-mailem.", "emailDescription": "Wprowadź swój adres e-mail, aby otrzymać kod e-mailem.",
"totpRegisterDescription": "Zeskanuj kod QR lub otwórz adres URL ręcznie.", "totpRegisterDescription": "Zeskanuj kod QR lub otwórz adres URL ręcznie.",
"submit": "Kontynuuj" "submit": "Kontynuuj",
"required": {
"code": "To pole jest wymagane"
}
} }
}, },
"passkey": { "passkey": {
@@ -174,7 +199,16 @@
"password": { "password": {
"title": "Ustaw hasło", "title": "Ustaw hasło",
"description": "Ustaw hasło dla swojego konta", "description": "Ustaw hasło dla swojego konta",
"submit": "Kontynuuj" "submit": "Kontynuuj",
"required": {
"password": "Musisz podać hasło!",
"confirmPassword": "To pole jest wymagane"
}
},
"required": {
"firstname": "To pole jest wymagane",
"lastname": "To pole jest wymagane",
"email": "To pole jest wymagane"
} }
}, },
"invite": { "invite": {
@@ -211,7 +245,10 @@
"noCodeReceived": "Nie otrzymałeś kodu?", "noCodeReceived": "Nie otrzymałeś kodu?",
"resendCode": "Wyślij kod ponownie", "resendCode": "Wyślij kod ponownie",
"codeSent": "Kod został właśnie wysłany na twój adres e-mail.", "codeSent": "Kod został właśnie wysłany na twój adres e-mail.",
"submit": "Kontynuuj" "submit": "Kontynuuj",
"required": {
"code": "To pole jest wymagane"
}
} }
}, },
"authenticator": { "authenticator": {
@@ -225,7 +262,10 @@
"usercode": { "usercode": {
"title": "Kod urządzenia", "title": "Kod urządzenia",
"description": "Wprowadź kod.", "description": "Wprowadź kod.",
"submit": "Kontynuuj" "submit": "Kontynuuj",
"required": {
"code": "To pole jest wymagane"
}
}, },
"request": { "request": {
"title": "{appName} chce się połączyć:", "title": "{appName} chce się połączyć:",

View File

@@ -25,14 +25,20 @@
"title": "С возвращением!", "title": "С возвращением!",
"description": "Введите свои данные для входа.", "description": "Введите свои данные для входа.",
"register": "Зарегистрировать нового пользователя", "register": "Зарегистрировать нового пользователя",
"submit": "Продолжить" "submit": "Продолжить",
"required": {
"loginName": "Это поле обязательно для заполнения"
}
}, },
"password": { "password": {
"verify": { "verify": {
"title": "Пароль", "title": "Пароль",
"description": "Введите ваш пароль.", "description": "Введите ваш пароль.",
"resetPassword": "Сбросить пароль", "resetPassword": "Сбросить пароль",
"submit": "Продолжить" "submit": "Продолжить",
"required": {
"password": "Это поле обязательно для заполнения"
}
}, },
"set": { "set": {
"title": "Установить пароль", "title": "Установить пароль",
@@ -40,12 +46,21 @@
"codeSent": "Код отправлен на ваш адрес электронной почты.", "codeSent": "Код отправлен на ваш адрес электронной почты.",
"noCodeReceived": "Не получили код?", "noCodeReceived": "Не получили код?",
"resend": "Отправить код повторно", "resend": "Отправить код повторно",
"submit": "Продолжить" "submit": "Продолжить",
"required": {
"code": "Это поле обязательно для заполнения",
"newPassword": "Вы должны указать пароль!",
"confirmPassword": "Это поле обязательно для заполнения"
}
}, },
"change": { "change": {
"title": "Изменить пароль", "title": "Изменить пароль",
"description": "Установите пароль для вашего аккаунта", "description": "Установите пароль для вашего аккаунта",
"submit": "Продолжить" "submit": "Продолжить",
"required": {
"newPassword": "Вы должны указать новый пароль!",
"confirmPassword": "Это поле обязательно для заполнения"
}
} }
}, },
"idp": { "idp": {
@@ -87,7 +102,11 @@
"description": "Введите ваши учетные данные LDAP.", "description": "Введите ваши учетные данные LDAP.",
"username": "Имя пользователя", "username": "Имя пользователя",
"password": "Пароль", "password": "Пароль",
"submit": "Продолжить" "submit": "Продолжить",
"required": {
"username": "Это поле обязательно для заполнения",
"password": "Это поле обязательно для заполнения"
}
}, },
"mfa": { "mfa": {
"verify": { "verify": {
@@ -109,7 +128,10 @@
"emailDescription": "Введите код, полученный по email.", "emailDescription": "Введите код, полученный по email.",
"noCodeReceived": "Не получили код?", "noCodeReceived": "Не получили код?",
"resendCode": "Отправить код повторно", "resendCode": "Отправить код повторно",
"submit": "Продолжить" "submit": "Продолжить",
"required": {
"code": "Это поле обязательно для заполнения"
}
}, },
"set": { "set": {
"title": "Настройка двухфакторной аутентификации", "title": "Настройка двухфакторной аутентификации",
@@ -117,7 +139,10 @@
"smsDescription": "Введите номер телефона для получения кода по SMS.", "smsDescription": "Введите номер телефона для получения кода по SMS.",
"emailDescription": "Введите email для получения кода.", "emailDescription": "Введите email для получения кода.",
"totpRegisterDescription": "Отсканируйте QR-код или перейдите по ссылке вручную.", "totpRegisterDescription": "Отсканируйте QR-код или перейдите по ссылке вручную.",
"submit": "Продолжить" "submit": "Продолжить",
"required": {
"code": "Это поле обязательно для заполнения"
}
} }
}, },
"passkey": { "passkey": {
@@ -174,7 +199,16 @@
"password": { "password": {
"title": "Установить пароль", "title": "Установить пароль",
"description": "Установите пароль для вашего аккаунта", "description": "Установите пароль для вашего аккаунта",
"submit": "Продолжить" "submit": "Продолжить",
"required": {
"password": "Вы должны указать пароль!",
"confirmPassword": "Это поле обязательно для заполнения"
}
},
"required": {
"firstname": "Это поле обязательно для заполнения",
"lastname": "Это поле обязательно для заполнения",
"email": "Это поле обязательно для заполнения"
} }
}, },
"invite": { "invite": {
@@ -211,7 +245,10 @@
"noCodeReceived": "Не получили код?", "noCodeReceived": "Не получили код?",
"resendCode": "Отправить код повторно", "resendCode": "Отправить код повторно",
"codeSent": "Код отправлен на ваш email.", "codeSent": "Код отправлен на ваш email.",
"submit": "Продолжить" "submit": "Продолжить",
"required": {
"code": "Это поле обязательно для заполнения"
}
} }
}, },
"authenticator": { "authenticator": {
@@ -225,7 +262,10 @@
"usercode": { "usercode": {
"title": "Код устройства", "title": "Код устройства",
"description": "Введите код.", "description": "Введите код.",
"submit": "Продолжить" "submit": "Продолжить",
"required": {
"code": "Это поле обязательно для заполнения"
}
}, },
"request": { "request": {
"title": "{appName} хочет подключиться:", "title": "{appName} хочет подключиться:",

View File

@@ -25,14 +25,20 @@
"title": "欢迎回来!", "title": "欢迎回来!",
"description": "请输入您的登录信息。", "description": "请输入您的登录信息。",
"register": "注册新用户", "register": "注册新用户",
"submit": "继续" "submit": "继续",
"required": {
"loginName": "此字段为必填项"
}
}, },
"password": { "password": {
"verify": { "verify": {
"title": "密码", "title": "密码",
"description": "请输入您的密码。", "description": "请输入您的密码。",
"resetPassword": "重置密码", "resetPassword": "重置密码",
"submit": "继续" "submit": "继续",
"required": {
"password": "此字段为必填项"
}
}, },
"set": { "set": {
"title": "设置密码", "title": "设置密码",
@@ -40,12 +46,21 @@
"codeSent": "验证码已发送到您的邮箱。", "codeSent": "验证码已发送到您的邮箱。",
"noCodeReceived": "没有收到验证码?", "noCodeReceived": "没有收到验证码?",
"resend": "重发验证码", "resend": "重发验证码",
"submit": "继续" "submit": "继续",
"required": {
"code": "此字段为必填项",
"newPassword": "必须提供密码!",
"confirmPassword": "此字段为必填项"
}
}, },
"change": { "change": {
"title": "更改密码", "title": "更改密码",
"description": "为您的账户设置密码", "description": "为您的账户设置密码",
"submit": "继续" "submit": "继续",
"required": {
"newPassword": "必须提供新密码!",
"confirmPassword": "此字段为必填项"
}
} }
}, },
"idp": { "idp": {
@@ -87,7 +102,11 @@
"description": "请输入您的 LDAP 凭据。", "description": "请输入您的 LDAP 凭据。",
"username": "用户名", "username": "用户名",
"password": "密码", "password": "密码",
"submit": "继续" "submit": "继续",
"required": {
"username": "此字段为必填项",
"password": "此字段为必填项"
}
}, },
"mfa": { "mfa": {
"verify": { "verify": {
@@ -109,7 +128,10 @@
"emailDescription": "输入通过电子邮件收到的验证码。", "emailDescription": "输入通过电子邮件收到的验证码。",
"noCodeReceived": "没有收到验证码?", "noCodeReceived": "没有收到验证码?",
"resendCode": "重发验证码", "resendCode": "重发验证码",
"submit": "继续" "submit": "继续",
"required": {
"code": "此字段为必填项"
}
}, },
"set": { "set": {
"title": "设置双因素认证", "title": "设置双因素认证",
@@ -117,7 +139,10 @@
"smsDescription": "输入您的电话号码以接收短信验证码。", "smsDescription": "输入您的电话号码以接收短信验证码。",
"emailDescription": "输入您的电子邮箱地址以接收电子邮件验证码。", "emailDescription": "输入您的电子邮箱地址以接收电子邮件验证码。",
"totpRegisterDescription": "扫描二维码或手动导航到URL。", "totpRegisterDescription": "扫描二维码或手动导航到URL。",
"submit": "继续" "submit": "继续",
"required": {
"code": "此字段为必填项"
}
} }
}, },
"passkey": { "passkey": {
@@ -174,7 +199,16 @@
"password": { "password": {
"title": "设置密码", "title": "设置密码",
"description": "为您的账户设置密码", "description": "为您的账户设置密码",
"submit": "继续" "submit": "继续",
"required": {
"password": "必须提供密码!",
"confirmPassword": "此字段为必填项"
}
},
"required": {
"firstname": "此字段为必填项",
"lastname": "此字段为必填项",
"email": "此字段为必填项"
} }
}, },
"invite": { "invite": {
@@ -211,7 +245,10 @@
"noCodeReceived": "没有收到验证码?", "noCodeReceived": "没有收到验证码?",
"resendCode": "重发验证码", "resendCode": "重发验证码",
"codeSent": "刚刚发送了一封包含验证码的电子邮件。", "codeSent": "刚刚发送了一封包含验证码的电子邮件。",
"submit": "继续" "submit": "继续",
"required": {
"code": "此字段为必填项"
}
} }
}, },
"authenticator": { "authenticator": {
@@ -225,7 +262,10 @@
"usercode": { "usercode": {
"title": "设备代码", "title": "设备代码",
"description": "输入代码。", "description": "输入代码。",
"submit": "继续" "submit": "继续",
"required": {
"code": "此字段为必填项"
}
}, },
"request": { "request": {
"title": "{appName} 想要连接:", "title": "{appName} 想要连接:",

View File

@@ -15,6 +15,7 @@ import { ChecksSchema } from "@zitadel/proto/zitadel/session/v2/session_service_
import { PasswordComplexitySettings } from "@zitadel/proto/zitadel/settings/v2/password_settings_pb"; import { PasswordComplexitySettings } from "@zitadel/proto/zitadel/settings/v2/password_settings_pb";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { useTranslations } from "next-intl";
import { FieldValues, useForm } from "react-hook-form"; import { FieldValues, useForm } from "react-hook-form";
import { Alert } from "./alert"; import { Alert } from "./alert";
import { BackButton } from "./back-button"; import { BackButton } from "./back-button";
@@ -56,6 +57,8 @@ export function ChangePasswordForm({
}, },
}); });
const t = useTranslations("password");
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [error, setError] = useState<string>(""); const [error, setError] = useState<string>("");
@@ -156,7 +159,7 @@ export function ChangePasswordForm({
autoComplete="new-password" autoComplete="new-password"
required required
{...register("password", { {...register("password", {
required: "You have to provide a new password!", required: t("change.required.newPassword"),
})} })}
label="New Password" label="New Password"
error={errors.password?.message as string} error={errors.password?.message as string}
@@ -169,7 +172,7 @@ export function ChangePasswordForm({
required required
autoComplete="new-password" autoComplete="new-password"
{...register("confirmPassword", { {...register("confirmPassword", {
required: "This field is required", required: t("change.required.confirmPassword"),
})} })}
label="Confirm Password" label="Confirm Password"
error={errors.confirmPassword?.message as string} error={errors.confirmPassword?.message as string}

View File

@@ -4,6 +4,7 @@ import { Alert } from "@/components/alert";
import { getDeviceAuthorizationRequest } from "@/lib/server/oidc"; import { getDeviceAuthorizationRequest } from "@/lib/server/oidc";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { useTranslations } from "next-intl";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { BackButton } from "./back-button"; import { BackButton } from "./back-button";
import { Button, ButtonVariants } from "./button"; import { Button, ButtonVariants } from "./button";
@@ -25,6 +26,8 @@ export function DeviceCodeForm({ userCode }: { userCode?: string }) {
}, },
}); });
const t = useTranslations("device");
const [error, setError] = useState<string>(""); const [error, setError] = useState<string>("");
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
@@ -62,7 +65,7 @@ export function DeviceCodeForm({ userCode }: { userCode?: string }) {
<TextInput <TextInput
type="text" type="text"
autoComplete="one-time-code" autoComplete="one-time-code"
{...register("userCode", { required: "This field is required" })} {...register("userCode", { required: t("usercode.required.code") })}
label="Code" label="Code"
data-testid="code-text-input" data-testid="code-text-input"
/> />

View File

@@ -68,7 +68,7 @@ export function LDAPUsernamePasswordForm({ idpId, link }: Props) {
<TextInput <TextInput
type="text" type="text"
autoComplete="username" autoComplete="username"
{...register("loginName", { required: "This field is required" })} {...register("loginName", { required: t("required.username") })}
label={t("username")} label={t("username")}
data-testid="username-text-input" data-testid="username-text-input"
/> />
@@ -77,7 +77,7 @@ export function LDAPUsernamePasswordForm({ idpId, link }: Props) {
<TextInput <TextInput
type="password" type="password"
autoComplete="password" autoComplete="password"
{...register("password", { required: "This field is required" })} {...register("password", { required: t("required.password") })}
label={t("password")} label={t("password")}
data-testid="password-text-input" data-testid="password-text-input"
/> />

View File

@@ -11,6 +11,7 @@ import { useEffect, useRef, useState } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { Alert, AlertType } from "./alert"; import { Alert, AlertType } from "./alert";
import { BackButton } from "./back-button"; import { BackButton } from "./back-button";
import { useTranslations } from "next-intl";
import { Button, ButtonVariants } from "./button"; import { Button, ButtonVariants } from "./button";
import { TextInput } from "./input"; import { TextInput } from "./input";
import { Spinner } from "./spinner"; import { Spinner } from "./spinner";
@@ -42,6 +43,8 @@ export function LoginOTP({
code, code,
loginSettings, loginSettings,
}: Props) { }: Props) {
const t = useTranslations("otp");
const [error, setError] = useState<string>(""); const [error, setError] = useState<string>("");
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
@@ -249,7 +252,7 @@ export function LoginOTP({
<div className="mt-4"> <div className="mt-4">
<TextInput <TextInput
type="text" type="text"
{...register("code", { required: "This field is required" })} {...register("code", { required: t("verify.required.code") })}
label="Code" label="Code"
autoComplete="one-time-code" autoComplete="one-time-code"
data-testid="code-text-input" data-testid="code-text-input"

View File

@@ -6,6 +6,7 @@ import { ChecksSchema } from "@zitadel/proto/zitadel/session/v2/session_service_
import { LoginSettings } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb"; import { LoginSettings } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { useTranslations } from "next-intl";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { Alert, AlertType } from "./alert"; import { Alert, AlertType } from "./alert";
import { BackButton } from "./back-button"; import { BackButton } from "./back-button";
@@ -34,6 +35,8 @@ export function PasswordForm({
const { register, handleSubmit, formState } = useForm<Inputs>({ const { register, handleSubmit, formState } = useForm<Inputs>({
mode: "onBlur", mode: "onBlur",
}); });
const t = useTranslations("password");
const [info, setInfo] = useState<string>(""); const [info, setInfo] = useState<string>("");
const [error, setError] = useState<string>(""); const [error, setError] = useState<string>("");
@@ -118,7 +121,7 @@ export function PasswordForm({
<TextInput <TextInput
type="password" type="password"
autoComplete="password" autoComplete="password"
{...register("password", { required: "This field is required" })} {...register("password", { required: t("verify.required.password") })}
label="Password" label="Password"
data-testid="password-text-input" data-testid="password-text-input"
/> />

View File

@@ -3,6 +3,7 @@
import { registerUserAndLinkToIDP } from "@/lib/server/register"; import { registerUserAndLinkToIDP } from "@/lib/server/register";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { useTranslations } from "next-intl";
import { FieldValues, useForm } from "react-hook-form"; import { FieldValues, useForm } from "react-hook-form";
import { Alert } from "./alert"; import { Alert } from "./alert";
import { BackButton } from "./back-button"; import { BackButton } from "./back-button";
@@ -54,6 +55,8 @@ export function RegisterFormIDPIncomplete({
}, },
}); });
const t = useTranslations("register");
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [error, setError] = useState<string>(""); const [error, setError] = useState<string>("");
@@ -102,7 +105,7 @@ export function RegisterFormIDPIncomplete({
type="firstname" type="firstname"
autoComplete="firstname" autoComplete="firstname"
required required
{...register("firstname", { required: "This field is required" })} {...register("firstname", { required: t("required.firstname") })}
label="First name" label="First name"
error={errors.firstname?.message as string} error={errors.firstname?.message as string}
data-testid="firstname-text-input" data-testid="firstname-text-input"
@@ -113,7 +116,7 @@ export function RegisterFormIDPIncomplete({
type="lastname" type="lastname"
autoComplete="lastname" autoComplete="lastname"
required required
{...register("lastname", { required: "This field is required" })} {...register("lastname", { required: t("required.lastname") })}
label="Last name" label="Last name"
error={errors.lastname?.message as string} error={errors.lastname?.message as string}
data-testid="lastname-text-input" data-testid="lastname-text-input"
@@ -124,7 +127,7 @@ export function RegisterFormIDPIncomplete({
type="email" type="email"
autoComplete="email" autoComplete="email"
required required
{...register("email", { required: "This field is required" })} {...register("email", { required: t("required.email") })}
label="E-mail" label="E-mail"
error={errors.email?.message as string} error={errors.email?.message as string}
data-testid="email-text-input" data-testid="email-text-input"

View File

@@ -8,6 +8,7 @@ import {
} from "@zitadel/proto/zitadel/settings/v2/login_settings_pb"; } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { useTranslations } from "next-intl";
import { FieldValues, useForm } from "react-hook-form"; import { FieldValues, useForm } from "react-hook-form";
import { Alert, AlertType } from "./alert"; import { Alert, AlertType } from "./alert";
import { import {
@@ -60,6 +61,8 @@ export function RegisterForm({
}, },
}); });
const t = useTranslations("register");
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [selected, setSelected] = useState<AuthenticationMethod>(methods[0]); const [selected, setSelected] = useState<AuthenticationMethod>(methods[0]);
const [error, setError] = useState<string>(""); const [error, setError] = useState<string>("");
@@ -130,7 +133,7 @@ export function RegisterForm({
type="firstname" type="firstname"
autoComplete="firstname" autoComplete="firstname"
required required
{...register("firstname", { required: "This field is required" })} {...register("firstname", { required: t("required.firstname") })}
label="First name" label="First name"
error={errors.firstname?.message as string} error={errors.firstname?.message as string}
data-testid="firstname-text-input" data-testid="firstname-text-input"
@@ -141,7 +144,7 @@ export function RegisterForm({
type="lastname" type="lastname"
autoComplete="lastname" autoComplete="lastname"
required required
{...register("lastname", { required: "This field is required" })} {...register("lastname", { required: t("required.lastname") })}
label="Last name" label="Last name"
error={errors.lastname?.message as string} error={errors.lastname?.message as string}
data-testid="lastname-text-input" data-testid="lastname-text-input"
@@ -152,7 +155,7 @@ export function RegisterForm({
type="email" type="email"
autoComplete="email" autoComplete="email"
required required
{...register("email", { required: "This field is required" })} {...register("email", { required: t("required.email") })}
label="E-mail" label="E-mail"
error={errors.email?.message as string} error={errors.email?.message as string}
data-testid="email-text-input" data-testid="email-text-input"

View File

@@ -16,6 +16,7 @@ import { ChecksSchema } from "@zitadel/proto/zitadel/session/v2/session_service_
import { PasswordComplexitySettings } from "@zitadel/proto/zitadel/settings/v2/password_settings_pb"; import { PasswordComplexitySettings } from "@zitadel/proto/zitadel/settings/v2/password_settings_pb";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { useTranslations } from "next-intl";
import { FieldValues, useForm } from "react-hook-form"; import { FieldValues, useForm } from "react-hook-form";
import { Alert, AlertType } from "./alert"; import { Alert, AlertType } from "./alert";
import { BackButton } from "./back-button"; import { BackButton } from "./back-button";
@@ -59,6 +60,8 @@ export function SetPasswordForm({
}, },
}); });
const t = useTranslations("password");
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [error, setError] = useState<string>(""); const [error, setError] = useState<string>("");
@@ -216,7 +219,7 @@ export function SetPasswordForm({
type="text" type="text"
required required
{...register("code", { {...register("code", {
required: "This field is required", required: t("set.required.code"),
})} })}
label="Code" label="Code"
autoComplete="one-time-code" autoComplete="one-time-code"
@@ -231,7 +234,7 @@ export function SetPasswordForm({
autoComplete="new-password" autoComplete="new-password"
required required
{...register("password", { {...register("password", {
required: "You have to provide a password!", required: t("set.required.newPassword"),
})} })}
label="New Password" label="New Password"
error={errors.password?.message as string} error={errors.password?.message as string}
@@ -244,7 +247,7 @@ export function SetPasswordForm({
required required
autoComplete="new-password" autoComplete="new-password"
{...register("confirmPassword", { {...register("confirmPassword", {
required: "This field is required", required: t("set.required.confirmPassword"),
})} })}
label="Confirm Password" label="Confirm Password"
error={errors.confirmPassword?.message as string} error={errors.confirmPassword?.message as string}

View File

@@ -10,6 +10,7 @@ import { registerUser } from "@/lib/server/register";
import { PasswordComplexitySettings } from "@zitadel/proto/zitadel/settings/v2/password_settings_pb"; import { PasswordComplexitySettings } from "@zitadel/proto/zitadel/settings/v2/password_settings_pb";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { useTranslations } from "next-intl";
import { FieldValues, useForm } from "react-hook-form"; import { FieldValues, useForm } from "react-hook-form";
import { Alert } from "./alert"; import { Alert } from "./alert";
import { BackButton } from "./back-button"; import { BackButton } from "./back-button";
@@ -52,6 +53,8 @@ export function SetRegisterPasswordForm({
}, },
}); });
const t = useTranslations("register");
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [error, setError] = useState<string>(""); const [error, setError] = useState<string>("");
@@ -115,7 +118,7 @@ export function SetRegisterPasswordForm({
autoComplete="new-password" autoComplete="new-password"
required required
{...register("password", { {...register("password", {
required: "You have to provide a password!", required: t("password.required.password"),
})} })}
label="Password" label="Password"
error={errors.password?.message as string} error={errors.password?.message as string}
@@ -128,7 +131,7 @@ export function SetRegisterPasswordForm({
required required
autoComplete="new-password" autoComplete="new-password"
{...register("confirmPassword", { {...register("confirmPassword", {
required: "This field is required", required: t("password.required.confirmPassword"),
})} })}
label="Confirm Password" label="Confirm Password"
error={errors.confirmPassword?.message as string} error={errors.confirmPassword?.message as string}

View File

@@ -7,6 +7,7 @@ import Link from "next/link";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { QRCodeSVG } from "qrcode.react"; import { QRCodeSVG } from "qrcode.react";
import { useState } from "react"; import { useState } from "react";
import { useTranslations } from "next-intl";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { Alert } from "./alert"; import { Alert } from "./alert";
import { Button, ButtonVariants } from "./button"; import { Button, ButtonVariants } from "./button";
@@ -50,6 +51,8 @@ export function TotpRegister({
}, },
}); });
const t = useTranslations("otp");
async function continueWithCode(values: Inputs) { async function continueWithCode(values: Inputs) {
setLoading(true); setLoading(true);
return verifyTOTP(values.code, loginName, organization) return verifyTOTP(values.code, loginName, organization)
@@ -123,7 +126,7 @@ export function TotpRegister({
<div className=""> <div className="">
<TextInput <TextInput
type="text" type="text"
{...register("code", { required: "This field is required" })} {...register("code", { required: t("set.required.code") })}
label="Code" label="Code"
data-testid="code-text-input" data-testid="code-text-input"
/> />

View File

@@ -11,6 +11,7 @@ import { Button, ButtonVariants } from "./button";
import { TextInput } from "./input"; import { TextInput } from "./input";
import { Spinner } from "./spinner"; import { Spinner } from "./spinner";
import { Translated } from "./translated"; import { Translated } from "./translated";
import { useTranslations } from "next-intl";
type Inputs = { type Inputs = {
loginName: string; loginName: string;
@@ -42,6 +43,8 @@ export function UsernameForm({
}, },
}); });
const t = useTranslations("loginname");
const router = useRouter(); const router = useRouter();
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
@@ -101,7 +104,7 @@ export function UsernameForm({
<TextInput <TextInput
type="text" type="text"
autoComplete="username" autoComplete="username"
{...register("loginName", { required: "This field is required" })} {...register("loginName", { required: t("required.loginName") })}
label={inputLabel} label={inputLabel}
data-testid="username-text-input" data-testid="username-text-input"
suffix={suffix} suffix={suffix}

View File

@@ -4,6 +4,7 @@ import { Alert, AlertType } from "@/components/alert";
import { resendVerification, sendVerification } from "@/lib/server/verify"; import { resendVerification, sendVerification } from "@/lib/server/verify";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { useTranslations } from "next-intl";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { BackButton } from "./back-button"; import { BackButton } from "./back-button";
import { Button, ButtonVariants } from "./button"; import { Button, ButtonVariants } from "./button";
@@ -41,6 +42,8 @@ export function VerifyForm({
}, },
}); });
const t = useTranslations("verify");
const [error, setError] = useState<string>(""); const [error, setError] = useState<string>("");
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
@@ -135,7 +138,7 @@ export function VerifyForm({
<TextInput <TextInput
type="text" type="text"
autoComplete="one-time-code" autoComplete="one-time-code"
{...register("code", { required: "This field is required" })} {...register("code", { required: t("verify.required.code") })}
label="Code" label="Code"
data-testid="code-text-input" data-testid="code-text-input"
/> />