From 74e144840a182430e32219f8cabc519d611d74bf Mon Sep 17 00:00:00 2001 From: Adam Kida <122802098+jmblab-adam@users.noreply.github.com> Date: Tue, 22 Jul 2025 14:48:28 +0200 Subject: [PATCH] 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: image # How the Problems Are Solved - adds i18n for all input required messages For example: image # Additional Changes N.A # Additional Context N.A Co-authored-by: Max Peintner --- login/apps/login/locales/de.json | 60 +++++++++++++++---- login/apps/login/locales/en.json | 60 +++++++++++++++---- login/apps/login/locales/es.json | 60 +++++++++++++++---- login/apps/login/locales/it.json | 60 +++++++++++++++---- login/apps/login/locales/pl.json | 60 +++++++++++++++---- login/apps/login/locales/ru.json | 60 +++++++++++++++---- login/apps/login/locales/zh.json | 60 +++++++++++++++---- .../src/components/change-password-form.tsx | 7 ++- .../login/src/components/device-code-form.tsx | 5 +- .../ldap-username-password-form.tsx | 4 +- login/apps/login/src/components/login-otp.tsx | 5 +- .../login/src/components/password-form.tsx | 5 +- .../register-form-idp-incomplete.tsx | 9 ++- .../login/src/components/register-form.tsx | 9 ++- .../src/components/set-password-form.tsx | 9 ++- .../components/set-register-password-form.tsx | 7 ++- .../login/src/components/totp-register.tsx | 5 +- .../login/src/components/username-form.tsx | 5 +- .../apps/login/src/components/verify-form.tsx | 5 +- 19 files changed, 404 insertions(+), 91 deletions(-) diff --git a/login/apps/login/locales/de.json b/login/apps/login/locales/de.json index 7d3173bb94..7b2a507fe4 100644 --- a/login/apps/login/locales/de.json +++ b/login/apps/login/locales/de.json @@ -25,14 +25,20 @@ "title": "Willkommen zurück!", "description": "Geben Sie Ihre Anmeldedaten ein.", "register": "Neuen Benutzer registrieren", - "submit": "Weiter" + "submit": "Weiter", + "required": { + "loginName": "Dieses Feld ist erforderlich" + } }, "password": { "verify": { "title": "Passwort", "description": "Geben Sie Ihr Passwort ein.", "resetPassword": "Passwort zurücksetzen", - "submit": "Weiter" + "submit": "Weiter", + "required": { + "password": "Dieses Feld ist erforderlich" + } }, "set": { "title": "Passwort festlegen", @@ -40,12 +46,21 @@ "codeSent": "Ein Code wurde an Ihre E-Mail-Adresse gesendet.", "noCodeReceived": "Keinen Code erhalten?", "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": { "title": "Passwort ändern", "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": { @@ -87,7 +102,11 @@ "description": "Geben Sie Ihre LDAP-Anmeldedaten ein.", "username": "Benutzername", "password": "Passwort", - "submit": "Weiter" + "submit": "Weiter", + "required": { + "username": "Dieses Feld ist erforderlich", + "password": "Dieses Feld ist erforderlich" + } }, "mfa": { "verify": { @@ -109,7 +128,10 @@ "emailDescription": "Geben Sie den Code ein, den Sie per E-Mail erhalten haben.", "noCodeReceived": "Keinen Code erhalten?", "resendCode": "Code erneut senden", - "submit": "Weiter" + "submit": "Weiter", + "required": { + "code": "Dieses Feld ist erforderlich" + } }, "set": { "title": "2-Faktor einrichten", @@ -117,7 +139,10 @@ "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.", "totpRegisterDescription": "Scannen Sie den QR-Code oder navigieren Sie manuell zur URL.", - "submit": "Weiter" + "submit": "Weiter", + "required": { + "code": "Dieses Feld ist erforderlich" + } } }, "passkey": { @@ -174,7 +199,16 @@ "password": { "title": "Passwort festlegen", "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": { @@ -211,7 +245,10 @@ "noCodeReceived": "Keinen Code erhalten?", "resendCode": "Code erneut senden", "codeSent": "Ein Code wurde gerade an Ihre E-Mail-Adresse gesendet.", - "submit": "Weiter" + "submit": "Weiter", + "required": { + "code": "Dieses Feld ist erforderlich" + } } }, "authenticator": { @@ -225,7 +262,10 @@ "usercode": { "title": "Gerätecode", "description": "Geben Sie den Code ein.", - "submit": "Weiter" + "submit": "Weiter", + "required": { + "code": "Dieses Feld ist erforderlich" + } }, "request": { "title": "{appName} möchte eine Verbindung herstellen:", diff --git a/login/apps/login/locales/en.json b/login/apps/login/locales/en.json index eeecdd023f..e1b7e4e82c 100644 --- a/login/apps/login/locales/en.json +++ b/login/apps/login/locales/en.json @@ -25,14 +25,20 @@ "title": "Welcome back!", "description": "Enter your login data.", "register": "Register new user", - "submit": "Continue" + "submit": "Continue", + "required": { + "loginName": "This field is required" + } }, "password": { "verify": { "title": "Password", "description": "Enter your password.", "resetPassword": "Reset Password", - "submit": "Continue" + "submit": "Continue", + "required": { + "password": "This field is required" + } }, "set": { "title": "Set Password", @@ -40,12 +46,21 @@ "codeSent": "A code has been sent to your email address.", "noCodeReceived": "Didn't receive a 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": { "title": "Change Password", "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": { @@ -87,7 +102,11 @@ "description": "Enter your LDAP credentials.", "username": "Username", "password": "Password", - "submit": "Continue" + "submit": "Continue", + "required": { + "username": "This field is required", + "password": "This field is required" + } }, "mfa": { "verify": { @@ -109,7 +128,10 @@ "emailDescription": "Enter the code you received via email.", "noCodeReceived": "Didn't receive a code?", "resendCode": "Resend code", - "submit": "Continue" + "submit": "Continue", + "required": { + "code": "This field is required" + } }, "set": { "title": "Set up 2-Factor", @@ -117,7 +139,10 @@ "smsDescription": "Enter your phone number to receive a code via SMS.", "emailDescription": "Enter your email address to receive a code via email.", "totpRegisterDescription": "Scan the QR Code or navigate to the URL manually.", - "submit": "Continue" + "submit": "Continue", + "required": { + "code": "This field is required" + } } }, "passkey": { @@ -174,7 +199,16 @@ "password": { "title": "Set Password", "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": { @@ -211,7 +245,10 @@ "noCodeReceived": "Didn't receive a code?", "resendCode": "Resend code", "codeSent": "A code has just been sent to your email address.", - "submit": "Continue" + "submit": "Continue", + "required": { + "code": "This field is required" + } } }, "authenticator": { @@ -225,7 +262,10 @@ "usercode": { "title": "Device code", "description": "Enter the code displayed on your app or device.", - "submit": "Continue" + "submit": "Continue", + "required": { + "code": "This field is required" + } }, "request": { "title": "{appName} would like to connect", diff --git a/login/apps/login/locales/es.json b/login/apps/login/locales/es.json index 558dbd03b5..b1c63583a7 100644 --- a/login/apps/login/locales/es.json +++ b/login/apps/login/locales/es.json @@ -25,14 +25,20 @@ "title": "¡Bienvenido de nuevo!", "description": "Introduce tus datos de acceso.", "register": "Registrar nuevo usuario", - "submit": "Continuar" + "submit": "Continuar", + "required": { + "loginName": "Este campo es obligatorio" + } }, "password": { "verify": { "title": "Contraseña", "description": "Introduce tu contraseña.", "resetPassword": "Restablecer contraseña", - "submit": "Continuar" + "submit": "Continuar", + "required": { + "password": "Este campo es obligatorio" + } }, "set": { "title": "Establecer Contraseña", @@ -40,12 +46,21 @@ "codeSent": "Se ha enviado un código a su correo electrónico.", "noCodeReceived": "¿No recibiste un 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": { "title": "Cambiar Contraseña", "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": { @@ -87,7 +102,11 @@ "description": "Introduce tus credenciales LDAP.", "username": "Nombre de usuario", "password": "Contraseña", - "submit": "Continuar" + "submit": "Continuar", + "required": { + "username": "Este campo es obligatorio", + "password": "Este campo es obligatorio" + } }, "mfa": { "verify": { @@ -109,7 +128,10 @@ "emailDescription": "Introduce el código que recibiste por correo electrónico.", "noCodeReceived": "¿No recibiste un código?", "resendCode": "Reenviar código", - "submit": "Continuar" + "submit": "Continuar", + "required": { + "code": "Este campo es obligatorio" + } }, "set": { "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.", "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.", - "submit": "Continuar" + "submit": "Continuar", + "required": { + "code": "Este campo es obligatorio" + } } }, "passkey": { @@ -174,7 +199,16 @@ "password": { "title": "Establecer Contraseña", "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": { @@ -211,7 +245,10 @@ "noCodeReceived": "¿No recibiste un código?", "resendCode": "Reenviar código", "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": { @@ -225,7 +262,10 @@ "usercode": { "title": "Código del dispositivo", "description": "Introduce el código.", - "submit": "Continuar" + "submit": "Continuar", + "required": { + "code": "Este campo es obligatorio" + } }, "request": { "title": "{appName} desea conectarse:", diff --git a/login/apps/login/locales/it.json b/login/apps/login/locales/it.json index cc5a0b8c4f..a71b48ed04 100644 --- a/login/apps/login/locales/it.json +++ b/login/apps/login/locales/it.json @@ -25,14 +25,20 @@ "title": "Bentornato!", "description": "Inserisci i tuoi dati di accesso.", "register": "Registrati come nuovo utente", - "submit": "Continua" + "submit": "Continua", + "required": { + "loginName": "Questo campo è obbligatorio" + } }, "password": { "verify": { "title": "Password", "description": "Inserisci la tua password.", "resetPassword": "Reimposta Password", - "submit": "Continua" + "submit": "Continua", + "required": { + "password": "Questo campo è obbligatorio" + } }, "set": { "title": "Imposta Password", @@ -40,12 +46,21 @@ "codeSent": "Un codice è stato inviato al tuo indirizzo email.", "noCodeReceived": "Non hai ricevuto un codice?", "resend": "Invia di nuovo", - "submit": "Continua" + "submit": "Continua", + "required": { + "code": "Questo campo è obbligatorio", + "newPassword": "Devi fornire una password!", + "confirmPassword": "Questo campo è obbligatorio" + } }, "change": { "title": "Cambia Password", "description": "Imposta la password per il tuo account", - "submit": "Continua" + "submit": "Continua", + "required": { + "newPassword": "Devi fornire una nuova password!", + "confirmPassword": "Questo campo è obbligatorio" + } } }, "idp": { @@ -87,7 +102,11 @@ "description": "Inserisci le tue credenziali LDAP.", "username": "Nome utente", "password": "Password", - "submit": "Continua" + "submit": "Continua", + "required": { + "username": "Questo campo è obbligatorio", + "password": "Questo campo è obbligatorio" + } }, "mfa": { "verify": { @@ -109,7 +128,10 @@ "emailDescription": "Inserisci il codice ricevuto via email.", "noCodeReceived": "Non hai ricevuto un codice?", "resendCode": "Invia di nuovo il codice", - "submit": "Continua" + "submit": "Continua", + "required": { + "code": "Questo campo è obbligatorio" + } }, "set": { "title": "Configura l'autenticazione a 2 fattori", @@ -117,7 +139,10 @@ "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.", "totpRegisterDescription": "Scansiona il codice QR o naviga manualmente all'URL.", - "submit": "Continua" + "submit": "Continua", + "required": { + "code": "Questo campo è obbligatorio" + } } }, "passkey": { @@ -174,7 +199,16 @@ "password": { "title": "Imposta Password", "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": { @@ -211,7 +245,10 @@ "noCodeReceived": "Non hai ricevuto un codice?", "resendCode": "Invia di nuovo il codice", "codeSent": "Un codice è stato appena inviato al tuo indirizzo email.", - "submit": "Continua" + "submit": "Continua", + "required": { + "code": "Questo campo è obbligatorio" + } } }, "authenticator": { @@ -225,7 +262,10 @@ "usercode": { "title": "Codice dispositivo", "description": "Inserisci il codice.", - "submit": "Continua" + "submit": "Continua", + "required": { + "code": "Questo campo è obbligatorio" + } }, "request": { "title": "{appName} desidera connettersi:", diff --git a/login/apps/login/locales/pl.json b/login/apps/login/locales/pl.json index cd418d5c8c..3e8562a220 100644 --- a/login/apps/login/locales/pl.json +++ b/login/apps/login/locales/pl.json @@ -25,14 +25,20 @@ "title": "Witamy ponownie!", "description": "Wprowadź dane logowania.", "register": "Zarejestruj nowego użytkownika", - "submit": "Kontynuuj" + "submit": "Kontynuuj", + "required": { + "loginName": "To pole jest wymagane" + } }, "password": { "verify": { "title": "Hasło", "description": "Wprowadź swoje hasło.", "resetPassword": "Zresetuj hasło", - "submit": "Kontynuuj" + "submit": "Kontynuuj", + "required": { + "password": "To pole jest wymagane" + } }, "set": { "title": "Ustaw hasło", @@ -40,12 +46,21 @@ "codeSent": "Kod został wysłany na twój adres e-mail.", "noCodeReceived": "Nie otrzymałeś kodu?", "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": { "title": "Zmień hasło", "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": { @@ -87,7 +102,11 @@ "description": "Wprowadź swoje dane logowania LDAP.", "username": "Nazwa użytkownika", "password": "Hasło", - "submit": "Kontynuuj" + "submit": "Kontynuuj", + "required": { + "username": "To pole jest wymagane", + "password": "To pole jest wymagane" + } }, "mfa": { "verify": { @@ -109,7 +128,10 @@ "emailDescription": "Wprowadź kod otrzymany e-mailem.", "noCodeReceived": "Nie otrzymałeś kodu?", "resendCode": "Wyślij kod ponownie", - "submit": "Kontynuuj" + "submit": "Kontynuuj", + "required": { + "code": "To pole jest wymagane" + } }, "set": { "title": "Skonfiguruj uwierzytelnianie dwuskładnikowe", @@ -117,7 +139,10 @@ "smsDescription": "Wprowadź swój numer telefonu, aby otrzymać kod SMS-em.", "emailDescription": "Wprowadź swój adres e-mail, aby otrzymać kod e-mailem.", "totpRegisterDescription": "Zeskanuj kod QR lub otwórz adres URL ręcznie.", - "submit": "Kontynuuj" + "submit": "Kontynuuj", + "required": { + "code": "To pole jest wymagane" + } } }, "passkey": { @@ -174,7 +199,16 @@ "password": { "title": "Ustaw hasło", "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": { @@ -211,7 +245,10 @@ "noCodeReceived": "Nie otrzymałeś kodu?", "resendCode": "Wyślij kod ponownie", "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": { @@ -225,7 +262,10 @@ "usercode": { "title": "Kod urządzenia", "description": "Wprowadź kod.", - "submit": "Kontynuuj" + "submit": "Kontynuuj", + "required": { + "code": "To pole jest wymagane" + } }, "request": { "title": "{appName} chce się połączyć:", diff --git a/login/apps/login/locales/ru.json b/login/apps/login/locales/ru.json index e5f735db94..6ba2917e16 100644 --- a/login/apps/login/locales/ru.json +++ b/login/apps/login/locales/ru.json @@ -25,14 +25,20 @@ "title": "С возвращением!", "description": "Введите свои данные для входа.", "register": "Зарегистрировать нового пользователя", - "submit": "Продолжить" + "submit": "Продолжить", + "required": { + "loginName": "Это поле обязательно для заполнения" + } }, "password": { "verify": { "title": "Пароль", "description": "Введите ваш пароль.", "resetPassword": "Сбросить пароль", - "submit": "Продолжить" + "submit": "Продолжить", + "required": { + "password": "Это поле обязательно для заполнения" + } }, "set": { "title": "Установить пароль", @@ -40,12 +46,21 @@ "codeSent": "Код отправлен на ваш адрес электронной почты.", "noCodeReceived": "Не получили код?", "resend": "Отправить код повторно", - "submit": "Продолжить" + "submit": "Продолжить", + "required": { + "code": "Это поле обязательно для заполнения", + "newPassword": "Вы должны указать пароль!", + "confirmPassword": "Это поле обязательно для заполнения" + } }, "change": { "title": "Изменить пароль", "description": "Установите пароль для вашего аккаунта", - "submit": "Продолжить" + "submit": "Продолжить", + "required": { + "newPassword": "Вы должны указать новый пароль!", + "confirmPassword": "Это поле обязательно для заполнения" + } } }, "idp": { @@ -87,7 +102,11 @@ "description": "Введите ваши учетные данные LDAP.", "username": "Имя пользователя", "password": "Пароль", - "submit": "Продолжить" + "submit": "Продолжить", + "required": { + "username": "Это поле обязательно для заполнения", + "password": "Это поле обязательно для заполнения" + } }, "mfa": { "verify": { @@ -109,7 +128,10 @@ "emailDescription": "Введите код, полученный по email.", "noCodeReceived": "Не получили код?", "resendCode": "Отправить код повторно", - "submit": "Продолжить" + "submit": "Продолжить", + "required": { + "code": "Это поле обязательно для заполнения" + } }, "set": { "title": "Настройка двухфакторной аутентификации", @@ -117,7 +139,10 @@ "smsDescription": "Введите номер телефона для получения кода по SMS.", "emailDescription": "Введите email для получения кода.", "totpRegisterDescription": "Отсканируйте QR-код или перейдите по ссылке вручную.", - "submit": "Продолжить" + "submit": "Продолжить", + "required": { + "code": "Это поле обязательно для заполнения" + } } }, "passkey": { @@ -174,7 +199,16 @@ "password": { "title": "Установить пароль", "description": "Установите пароль для вашего аккаунта", - "submit": "Продолжить" + "submit": "Продолжить", + "required": { + "password": "Вы должны указать пароль!", + "confirmPassword": "Это поле обязательно для заполнения" + } + }, + "required": { + "firstname": "Это поле обязательно для заполнения", + "lastname": "Это поле обязательно для заполнения", + "email": "Это поле обязательно для заполнения" } }, "invite": { @@ -211,7 +245,10 @@ "noCodeReceived": "Не получили код?", "resendCode": "Отправить код повторно", "codeSent": "Код отправлен на ваш email.", - "submit": "Продолжить" + "submit": "Продолжить", + "required": { + "code": "Это поле обязательно для заполнения" + } } }, "authenticator": { @@ -225,7 +262,10 @@ "usercode": { "title": "Код устройства", "description": "Введите код.", - "submit": "Продолжить" + "submit": "Продолжить", + "required": { + "code": "Это поле обязательно для заполнения" + } }, "request": { "title": "{appName} хочет подключиться:", diff --git a/login/apps/login/locales/zh.json b/login/apps/login/locales/zh.json index 73af30ab97..fe5f2d1867 100644 --- a/login/apps/login/locales/zh.json +++ b/login/apps/login/locales/zh.json @@ -25,14 +25,20 @@ "title": "欢迎回来!", "description": "请输入您的登录信息。", "register": "注册新用户", - "submit": "继续" + "submit": "继续", + "required": { + "loginName": "此字段为必填项" + } }, "password": { "verify": { "title": "密码", "description": "请输入您的密码。", "resetPassword": "重置密码", - "submit": "继续" + "submit": "继续", + "required": { + "password": "此字段为必填项" + } }, "set": { "title": "设置密码", @@ -40,12 +46,21 @@ "codeSent": "验证码已发送到您的邮箱。", "noCodeReceived": "没有收到验证码?", "resend": "重发验证码", - "submit": "继续" + "submit": "继续", + "required": { + "code": "此字段为必填项", + "newPassword": "必须提供密码!", + "confirmPassword": "此字段为必填项" + } }, "change": { "title": "更改密码", "description": "为您的账户设置密码", - "submit": "继续" + "submit": "继续", + "required": { + "newPassword": "必须提供新密码!", + "confirmPassword": "此字段为必填项" + } } }, "idp": { @@ -87,7 +102,11 @@ "description": "请输入您的 LDAP 凭据。", "username": "用户名", "password": "密码", - "submit": "继续" + "submit": "继续", + "required": { + "username": "此字段为必填项", + "password": "此字段为必填项" + } }, "mfa": { "verify": { @@ -109,7 +128,10 @@ "emailDescription": "输入通过电子邮件收到的验证码。", "noCodeReceived": "没有收到验证码?", "resendCode": "重发验证码", - "submit": "继续" + "submit": "继续", + "required": { + "code": "此字段为必填项" + } }, "set": { "title": "设置双因素认证", @@ -117,7 +139,10 @@ "smsDescription": "输入您的电话号码以接收短信验证码。", "emailDescription": "输入您的电子邮箱地址以接收电子邮件验证码。", "totpRegisterDescription": "扫描二维码或手动导航到URL。", - "submit": "继续" + "submit": "继续", + "required": { + "code": "此字段为必填项" + } } }, "passkey": { @@ -174,7 +199,16 @@ "password": { "title": "设置密码", "description": "为您的账户设置密码", - "submit": "继续" + "submit": "继续", + "required": { + "password": "必须提供密码!", + "confirmPassword": "此字段为必填项" + } + }, + "required": { + "firstname": "此字段为必填项", + "lastname": "此字段为必填项", + "email": "此字段为必填项" } }, "invite": { @@ -211,7 +245,10 @@ "noCodeReceived": "没有收到验证码?", "resendCode": "重发验证码", "codeSent": "刚刚发送了一封包含验证码的电子邮件。", - "submit": "继续" + "submit": "继续", + "required": { + "code": "此字段为必填项" + } } }, "authenticator": { @@ -225,7 +262,10 @@ "usercode": { "title": "设备代码", "description": "输入代码。", - "submit": "继续" + "submit": "继续", + "required": { + "code": "此字段为必填项" + } }, "request": { "title": "{appName} 想要连接:", diff --git a/login/apps/login/src/components/change-password-form.tsx b/login/apps/login/src/components/change-password-form.tsx index 1c93e4ae23..6124812e27 100644 --- a/login/apps/login/src/components/change-password-form.tsx +++ b/login/apps/login/src/components/change-password-form.tsx @@ -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 { useRouter } from "next/navigation"; import { useState } from "react"; +import { useTranslations } from "next-intl"; import { FieldValues, useForm } from "react-hook-form"; import { Alert } from "./alert"; import { BackButton } from "./back-button"; @@ -56,6 +57,8 @@ export function ChangePasswordForm({ }, }); + const t = useTranslations("password"); + const [loading, setLoading] = useState(false); const [error, setError] = useState(""); @@ -156,7 +159,7 @@ export function ChangePasswordForm({ autoComplete="new-password" required {...register("password", { - required: "You have to provide a new password!", + required: t("change.required.newPassword"), })} label="New Password" error={errors.password?.message as string} @@ -169,7 +172,7 @@ export function ChangePasswordForm({ required autoComplete="new-password" {...register("confirmPassword", { - required: "This field is required", + required: t("change.required.confirmPassword"), })} label="Confirm Password" error={errors.confirmPassword?.message as string} diff --git a/login/apps/login/src/components/device-code-form.tsx b/login/apps/login/src/components/device-code-form.tsx index 7dd63b0f5c..9c5a28ca4f 100644 --- a/login/apps/login/src/components/device-code-form.tsx +++ b/login/apps/login/src/components/device-code-form.tsx @@ -4,6 +4,7 @@ import { Alert } from "@/components/alert"; import { getDeviceAuthorizationRequest } from "@/lib/server/oidc"; import { useRouter } from "next/navigation"; import { useState } from "react"; +import { useTranslations } from "next-intl"; import { useForm } from "react-hook-form"; import { BackButton } from "./back-button"; import { Button, ButtonVariants } from "./button"; @@ -25,6 +26,8 @@ export function DeviceCodeForm({ userCode }: { userCode?: string }) { }, }); + const t = useTranslations("device"); + const [error, setError] = useState(""); const [loading, setLoading] = useState(false); @@ -62,7 +65,7 @@ export function DeviceCodeForm({ userCode }: { userCode?: string }) { diff --git a/login/apps/login/src/components/ldap-username-password-form.tsx b/login/apps/login/src/components/ldap-username-password-form.tsx index 5fd36efa32..cc9071875f 100644 --- a/login/apps/login/src/components/ldap-username-password-form.tsx +++ b/login/apps/login/src/components/ldap-username-password-form.tsx @@ -68,7 +68,7 @@ export function LDAPUsernamePasswordForm({ idpId, link }: Props) { @@ -77,7 +77,7 @@ export function LDAPUsernamePasswordForm({ idpId, link }: Props) { diff --git a/login/apps/login/src/components/login-otp.tsx b/login/apps/login/src/components/login-otp.tsx index f2b7e903d7..ffaa5320b0 100644 --- a/login/apps/login/src/components/login-otp.tsx +++ b/login/apps/login/src/components/login-otp.tsx @@ -11,6 +11,7 @@ import { useEffect, useRef, useState } from "react"; import { useForm } from "react-hook-form"; import { Alert, AlertType } from "./alert"; import { BackButton } from "./back-button"; +import { useTranslations } from "next-intl"; import { Button, ButtonVariants } from "./button"; import { TextInput } from "./input"; import { Spinner } from "./spinner"; @@ -42,6 +43,8 @@ export function LoginOTP({ code, loginSettings, }: Props) { + const t = useTranslations("otp"); + const [error, setError] = useState(""); const [loading, setLoading] = useState(false); @@ -249,7 +252,7 @@ export function LoginOTP({
({ mode: "onBlur", }); + + const t = useTranslations("password"); const [info, setInfo] = useState(""); const [error, setError] = useState(""); @@ -118,7 +121,7 @@ export function PasswordForm({ diff --git a/login/apps/login/src/components/register-form-idp-incomplete.tsx b/login/apps/login/src/components/register-form-idp-incomplete.tsx index 1e9f2e99f2..10e766be76 100644 --- a/login/apps/login/src/components/register-form-idp-incomplete.tsx +++ b/login/apps/login/src/components/register-form-idp-incomplete.tsx @@ -3,6 +3,7 @@ import { registerUserAndLinkToIDP } from "@/lib/server/register"; import { useRouter } from "next/navigation"; import { useState } from "react"; +import { useTranslations } from "next-intl"; import { FieldValues, useForm } from "react-hook-form"; import { Alert } from "./alert"; import { BackButton } from "./back-button"; @@ -54,6 +55,8 @@ export function RegisterFormIDPIncomplete({ }, }); + const t = useTranslations("register"); + const [loading, setLoading] = useState(false); const [error, setError] = useState(""); @@ -102,7 +105,7 @@ export function RegisterFormIDPIncomplete({ type="firstname" autoComplete="firstname" required - {...register("firstname", { required: "This field is required" })} + {...register("firstname", { required: t("required.firstname") })} label="First name" error={errors.firstname?.message as string} data-testid="firstname-text-input" @@ -113,7 +116,7 @@ export function RegisterFormIDPIncomplete({ type="lastname" autoComplete="lastname" required - {...register("lastname", { required: "This field is required" })} + {...register("lastname", { required: t("required.lastname") })} label="Last name" error={errors.lastname?.message as string} data-testid="lastname-text-input" @@ -124,7 +127,7 @@ export function RegisterFormIDPIncomplete({ type="email" autoComplete="email" required - {...register("email", { required: "This field is required" })} + {...register("email", { required: t("required.email") })} label="E-mail" error={errors.email?.message as string} data-testid="email-text-input" diff --git a/login/apps/login/src/components/register-form.tsx b/login/apps/login/src/components/register-form.tsx index 554a0f08c2..7b4254b0b3 100644 --- a/login/apps/login/src/components/register-form.tsx +++ b/login/apps/login/src/components/register-form.tsx @@ -8,6 +8,7 @@ import { } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb"; import { useRouter } from "next/navigation"; import { useState } from "react"; +import { useTranslations } from "next-intl"; import { FieldValues, useForm } from "react-hook-form"; import { Alert, AlertType } from "./alert"; import { @@ -60,6 +61,8 @@ export function RegisterForm({ }, }); + const t = useTranslations("register"); + const [loading, setLoading] = useState(false); const [selected, setSelected] = useState(methods[0]); const [error, setError] = useState(""); @@ -130,7 +133,7 @@ export function RegisterForm({ type="firstname" autoComplete="firstname" required - {...register("firstname", { required: "This field is required" })} + {...register("firstname", { required: t("required.firstname") })} label="First name" error={errors.firstname?.message as string} data-testid="firstname-text-input" @@ -141,7 +144,7 @@ export function RegisterForm({ type="lastname" autoComplete="lastname" required - {...register("lastname", { required: "This field is required" })} + {...register("lastname", { required: t("required.lastname") })} label="Last name" error={errors.lastname?.message as string} data-testid="lastname-text-input" @@ -152,7 +155,7 @@ export function RegisterForm({ type="email" autoComplete="email" required - {...register("email", { required: "This field is required" })} + {...register("email", { required: t("required.email") })} label="E-mail" error={errors.email?.message as string} data-testid="email-text-input" diff --git a/login/apps/login/src/components/set-password-form.tsx b/login/apps/login/src/components/set-password-form.tsx index d4b68e1b93..83e8849124 100644 --- a/login/apps/login/src/components/set-password-form.tsx +++ b/login/apps/login/src/components/set-password-form.tsx @@ -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 { useRouter } from "next/navigation"; import { useState } from "react"; +import { useTranslations } from "next-intl"; import { FieldValues, useForm } from "react-hook-form"; import { Alert, AlertType } from "./alert"; import { BackButton } from "./back-button"; @@ -59,6 +60,8 @@ export function SetPasswordForm({ }, }); + const t = useTranslations("password"); + const [loading, setLoading] = useState(false); const [error, setError] = useState(""); @@ -216,7 +219,7 @@ export function SetPasswordForm({ type="text" required {...register("code", { - required: "This field is required", + required: t("set.required.code"), })} label="Code" autoComplete="one-time-code" @@ -231,7 +234,7 @@ export function SetPasswordForm({ autoComplete="new-password" required {...register("password", { - required: "You have to provide a password!", + required: t("set.required.newPassword"), })} label="New Password" error={errors.password?.message as string} @@ -244,7 +247,7 @@ export function SetPasswordForm({ required autoComplete="new-password" {...register("confirmPassword", { - required: "This field is required", + required: t("set.required.confirmPassword"), })} label="Confirm Password" error={errors.confirmPassword?.message as string} diff --git a/login/apps/login/src/components/set-register-password-form.tsx b/login/apps/login/src/components/set-register-password-form.tsx index 7ffa18de26..dc61c67311 100644 --- a/login/apps/login/src/components/set-register-password-form.tsx +++ b/login/apps/login/src/components/set-register-password-form.tsx @@ -10,6 +10,7 @@ import { registerUser } from "@/lib/server/register"; import { PasswordComplexitySettings } from "@zitadel/proto/zitadel/settings/v2/password_settings_pb"; import { useRouter } from "next/navigation"; import { useState } from "react"; +import { useTranslations } from "next-intl"; import { FieldValues, useForm } from "react-hook-form"; import { Alert } from "./alert"; import { BackButton } from "./back-button"; @@ -52,6 +53,8 @@ export function SetRegisterPasswordForm({ }, }); + const t = useTranslations("register"); + const [loading, setLoading] = useState(false); const [error, setError] = useState(""); @@ -115,7 +118,7 @@ export function SetRegisterPasswordForm({ autoComplete="new-password" required {...register("password", { - required: "You have to provide a password!", + required: t("password.required.password"), })} label="Password" error={errors.password?.message as string} @@ -128,7 +131,7 @@ export function SetRegisterPasswordForm({ required autoComplete="new-password" {...register("confirmPassword", { - required: "This field is required", + required: t("password.required.confirmPassword"), })} label="Confirm Password" error={errors.confirmPassword?.message as string} diff --git a/login/apps/login/src/components/totp-register.tsx b/login/apps/login/src/components/totp-register.tsx index f15c0d034c..ff70be7170 100644 --- a/login/apps/login/src/components/totp-register.tsx +++ b/login/apps/login/src/components/totp-register.tsx @@ -7,6 +7,7 @@ import Link from "next/link"; import { useRouter } from "next/navigation"; import { QRCodeSVG } from "qrcode.react"; import { useState } from "react"; +import { useTranslations } from "next-intl"; import { useForm } from "react-hook-form"; import { Alert } from "./alert"; import { Button, ButtonVariants } from "./button"; @@ -50,6 +51,8 @@ export function TotpRegister({ }, }); + const t = useTranslations("otp"); + async function continueWithCode(values: Inputs) { setLoading(true); return verifyTOTP(values.code, loginName, organization) @@ -123,7 +126,7 @@ export function TotpRegister({
diff --git a/login/apps/login/src/components/username-form.tsx b/login/apps/login/src/components/username-form.tsx index dbb82a35c9..38eeffff98 100644 --- a/login/apps/login/src/components/username-form.tsx +++ b/login/apps/login/src/components/username-form.tsx @@ -11,6 +11,7 @@ import { Button, ButtonVariants } from "./button"; import { TextInput } from "./input"; import { Spinner } from "./spinner"; import { Translated } from "./translated"; +import { useTranslations } from "next-intl"; type Inputs = { loginName: string; @@ -42,6 +43,8 @@ export function UsernameForm({ }, }); + const t = useTranslations("loginname"); + const router = useRouter(); const [loading, setLoading] = useState(false); @@ -101,7 +104,7 @@ export function UsernameForm({ (""); const [loading, setLoading] = useState(false); @@ -135,7 +138,7 @@ export function VerifyForm({