diff --git a/.changeset/great-pots-tickle.md b/.changeset/great-pots-tickle.md
new file mode 100644
index 00000000000..f55cc22976f
--- /dev/null
+++ b/.changeset/great-pots-tickle.md
@@ -0,0 +1,7 @@
+---
+'@clerk/localizations': patch
+'@clerk/shared': patch
+'@clerk/ui': patch
+---
+
+Display a proper message when a password is rejected for matching one of the account's identifiers. Previously this error rendered as the incomplete sentence "Your password must contain ." on sign-up, reset password, and the user profile password form. The new message is available under the `unstable__errors.form_password_matches_identifier` localization key, and any password error the UI does not recognize now falls back to the message returned by the API instead of an empty sentence.
diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts
index 87cf0abf4fe..1a0e9542bce 100644
--- a/packages/localizations/src/ar-SA.ts
+++ b/packages/localizations/src/ar-SA.ts
@@ -1746,6 +1746,7 @@ export const arSA: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: undefined,
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'كلمة المرور ليست قوية',
form_password_or_identifier_incorrect:
'كلمة المرور أو عنوان البريد الإلكتروني غير صحيح. حاول مرة أخرى أو استخدم طريقة أخرى.',
diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts
index ecb1c5a782e..87edd1c7956 100644
--- a/packages/localizations/src/be-BY.ts
+++ b/packages/localizations/src/be-BY.ts
@@ -1757,6 +1757,7 @@ export const beBY: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Невірны пароль.',
form_password_length_too_short: 'Пароль занадта кароткі.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Ваш пароль недастаткова надзейны.',
form_password_or_identifier_incorrect:
'Пароль або адрас электроннай пошты няправільны. Паспрабуйце яшчэ раз або выкарыстоўвайце іншы метад.',
diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts
index c385d696659..d7c80b74640 100644
--- a/packages/localizations/src/bg-BG.ts
+++ b/packages/localizations/src/bg-BG.ts
@@ -1750,6 +1750,7 @@ export const bgBG: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Невалидна парола. Моля, опитайте отново.',
form_password_length_too_short: 'Паролата е твърде кратка. Моля, въведете поне 8 символа.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough:
'Паролата трябва да съдържа поне една главна буква, една цифра и един специален символ.',
form_password_or_identifier_incorrect:
diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts
index a12cc09bac1..cdf78289cad 100644
--- a/packages/localizations/src/bn-IN.ts
+++ b/packages/localizations/src/bn-IN.ts
@@ -1769,6 +1769,7 @@ export const bnIN: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'আপনি যে পাসওয়ার্ড লিখেছেন তা ভুল। দয়া করে আবার চেষ্টা করুন।',
form_password_length_too_short: 'আপনার পাসওয়ার্ড খুব ছোট। এটি কমপক্ষে ৮ অক্ষর দীর্ঘ হতে হবে।',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'আপনার পাসওয়ার্ড যথেষ্ট শক্তিশালী নয়।',
form_password_or_identifier_incorrect:
'পাসওয়ার্ড বা ইমেইল ঠিকানা ভুল। আবার চেষ্টা করুন বা অন্য পদ্ধতি ব্যবহার করুন।',
diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts
index 406c6708534..d761a145fb1 100644
--- a/packages/localizations/src/ca-ES.ts
+++ b/packages/localizations/src/ca-ES.ts
@@ -1760,6 +1760,7 @@ export const caES: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'La contrasenya introduïda és incorrecta.',
form_password_length_too_short: 'La teva contrasenya ha de tenir almenys 8 caràcters.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'La teva contrasenya no és prou forta.',
form_password_or_identifier_incorrect:
"La contrasenya o l'identificador és incorrecte. Torna-ho a intentar o utilitza un altre mètode.",
diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts
index 28fb62154f6..3c3b8dc5443 100644
--- a/packages/localizations/src/cs-CZ.ts
+++ b/packages/localizations/src/cs-CZ.ts
@@ -1762,6 +1762,7 @@ export const csCZ: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Heslo je nesprávné.',
form_password_length_too_short: 'Heslo je příliš krátké.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Vaše heslo není dostatečně silné.',
form_password_or_identifier_incorrect:
'Heslo nebo e-mailová adresa je nesprávná. Zkuste to znovu nebo použijte jinou metodu.',
diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts
index fbb56087c08..92936019d80 100644
--- a/packages/localizations/src/da-DK.ts
+++ b/packages/localizations/src/da-DK.ts
@@ -1747,6 +1747,7 @@ export const daDK: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Adgangskoden er forkert.',
form_password_length_too_short: 'Adgangskoden er for kort.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Adgangskoden er ikke stærk nok.',
form_password_or_identifier_incorrect:
'Adgangskoden eller e-mailadressen er forkert. Prøv igen eller brug en anden metode.',
diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts
index 695f5af5267..07f932898cf 100644
--- a/packages/localizations/src/de-DE.ts
+++ b/packages/localizations/src/de-DE.ts
@@ -1770,6 +1770,7 @@ export const deDE: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Das eingegebene Passwort ist falsch.',
form_password_length_too_short: 'Das Passwort ist zu kurz. Es muss mindestens 8 Zeichen lang sein.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Passwort nicht stark genug.',
form_password_or_identifier_incorrect:
'Passwort oder E-Mail-Adresse ist falsch. Versuchen Sie es erneut oder verwenden Sie eine andere Methode.',
diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts
index 0b1712866c6..02c1d49ec2e 100644
--- a/packages/localizations/src/el-GR.ts
+++ b/packages/localizations/src/el-GR.ts
@@ -1765,6 +1765,7 @@ export const elGR: LocalizationResource = {
form_password_incorrect: 'Ο κωδικός πρόσβασης δεν είναι σωστός.',
form_password_length_too_short:
'Ο κωδικός πρόσβασής σας πρέπει να αποτελείται από τουλάχιστον {{length}} χαρακτήρες.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Ο κωδικός πρόσβασής σας δεν είναι αρκετά ισχυρός.',
form_password_or_identifier_incorrect:
'Ο κωδικός πρόσβασης ή η διεύθυνση email είναι λανθασμένη. Δοκιμάστε ξανά ή χρησιμοποιήστε άλλη μέθοδο.',
diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts
index b5c7c547230..33071fdb142 100644
--- a/packages/localizations/src/en-GB.ts
+++ b/packages/localizations/src/en-GB.ts
@@ -1751,6 +1751,7 @@ export const enGB: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'The password you entered is incorrect. Please try again.',
form_password_length_too_short: 'Your password is too short. It must be at least 8 characters long.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Your password is not strong enough.',
form_password_or_identifier_incorrect: 'Password or email address is incorrect. Try again, or use another method.',
form_password_pwned:
diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts
index c8573e68e7b..aa0385251de 100644
--- a/packages/localizations/src/en-US.ts
+++ b/packages/localizations/src/en-US.ts
@@ -1787,6 +1787,8 @@ export const enUS: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: 'Your password is too short. It must be at least 8 characters long.',
+ form_password_matches_identifier:
+ 'Password cannot match your email address, phone number or username. For account safety, please use a different password.',
form_password_not_strong_enough: 'Your password is not strong enough.',
form_password_or_identifier_incorrect: undefined,
form_password_pwned:
diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts
index e8b906f6ba6..baeb439a0ac 100644
--- a/packages/localizations/src/es-CR.ts
+++ b/packages/localizations/src/es-CR.ts
@@ -1759,6 +1759,7 @@ export const esCR: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Contraseña incorrecta.',
form_password_length_too_short: 'La contraseña es muy corta.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'La contraseña no es suficientemente segura.',
form_password_or_identifier_incorrect:
'La contraseña o la dirección de correo electrónico es incorrecta. Inténtalo de nuevo o usa otro método.',
diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts
index 20840f8ddc6..e4ecf17e7ee 100644
--- a/packages/localizations/src/es-ES.ts
+++ b/packages/localizations/src/es-ES.ts
@@ -1761,6 +1761,7 @@ export const esES: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Contraseña incorrecta.',
form_password_length_too_short: 'La contraseña es demasiado corta.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Tu contraseña no es lo suficientemente fuerte.',
form_password_or_identifier_incorrect:
'La contraseña o la dirección de correo electrónico es incorrecta. Inténtalo de nuevo o usa otro método.',
diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts
index 22d7f3ff9a6..09d0fc1e04e 100644
--- a/packages/localizations/src/es-MX.ts
+++ b/packages/localizations/src/es-MX.ts
@@ -1760,6 +1760,7 @@ export const esMX: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Contraseña incorrecta.',
form_password_length_too_short: 'La contraseña es muy corta.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'La contraseña no es suficientemente segura.',
form_password_or_identifier_incorrect:
'La contraseña o la dirección de correo electrónico es incorrecta. Inténtalo de nuevo o usa otro método.',
diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts
index fb43c476ae2..6a799bdf3c5 100644
--- a/packages/localizations/src/es-UY.ts
+++ b/packages/localizations/src/es-UY.ts
@@ -1759,6 +1759,7 @@ export const esUY: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'La contraseña ingresada es incorrecta. Por favor, intentá de nuevo.',
form_password_length_too_short: 'Tu contraseña es demasiado corta. Debe tener al menos 8 caracteres.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Tu contraseña no es lo suficientemente fuerte.',
form_password_or_identifier_incorrect:
'La contraseña o la dirección de correo electrónico es incorrecta. Intentá de nuevo o usá otro método.',
diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts
index 15e8fc49a0c..86beba5c4c9 100644
--- a/packages/localizations/src/fa-IR.ts
+++ b/packages/localizations/src/fa-IR.ts
@@ -1761,6 +1761,7 @@ export const faIR: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'رمز عبور نادرست است.',
form_password_length_too_short: 'رمز عبور شما خیلی کوتاه است. باید حداقل ۸ کاراکتر داشته باشد.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'رمز عبور شما به اندازه کافی قوی نیست.',
form_password_or_identifier_incorrect:
'رمز عبور یا آدرس ایمیل نادرست است. دوباره تلاش کنید یا از روش دیگری استفاده کنید.',
diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts
index 017d408d24b..b1a1b5094d2 100644
--- a/packages/localizations/src/fi-FI.ts
+++ b/packages/localizations/src/fi-FI.ts
@@ -1771,6 +1771,7 @@ export const fiFI: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: 'Salasanasi on liian lyhyt. Sen on oltava vähintään 8 merkkiä pitkä.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Salasana ei ole riittävän vahva.',
form_password_or_identifier_incorrect:
'Salasana tai sähköpostiosoite on väärä. Yritä uudelleen tai käytä toista menetelmää.',
diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts
index 27691be75a3..583b57611f8 100644
--- a/packages/localizations/src/fr-FR.ts
+++ b/packages/localizations/src/fr-FR.ts
@@ -1769,6 +1769,7 @@ export const frFR: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Mot de passe incorrect',
form_password_length_too_short: 'Votre mot de passe est trop court.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: "Votre mot de passe n'est pas assez fort.",
form_password_or_identifier_incorrect:
"Le mot de passe ou l'adresse e-mail est incorrect. Réessayez ou utilisez une autre méthode.",
diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts
index 9ec0f0ee6a4..ae7a88af420 100644
--- a/packages/localizations/src/he-IL.ts
+++ b/packages/localizations/src/he-IL.ts
@@ -1738,6 +1738,7 @@ export const heIL: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: undefined,
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'הסיסמה שלך אינה מספיק חזקה.',
form_password_or_identifier_incorrect: 'הסיסמה או כתובת האימייל שגויים. נסה שוב או השתמש בשיטה אחרת.',
form_password_pwned: 'הסיסמה הזו נמצאה כחלק מהפרטים שנחשפו בהפרת נתונים ולא ניתן להשתמש בה, נסה סיסמה אחרת במקום.',
diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts
index 895d43dd318..9d04a365a23 100644
--- a/packages/localizations/src/hi-IN.ts
+++ b/packages/localizations/src/hi-IN.ts
@@ -1768,6 +1768,7 @@ export const hiIN: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'आपके द्वारा दर्ज किया गया पासवर्ड गलत है। कृपया पुनः प्रयास करें।',
form_password_length_too_short: 'आपका पासवर्ड बहुत छोटा है। इसमें कम से कम 8 अक्षर होने चाहिए।',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'आपका पासवर्ड पर्याप्त मजबूत नहीं है।',
form_password_or_identifier_incorrect:
'पासवर्ड या ईमेल पता गलत है। कृपया पुनः प्रयास करें या किसी अन्य विधि का उपयोग करें।',
diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts
index cb41987a223..34b0d179df7 100644
--- a/packages/localizations/src/hr-HR.ts
+++ b/packages/localizations/src/hr-HR.ts
@@ -1774,6 +1774,7 @@ export const hrHR: LocalizationResource = {
'Ova lozinka je pronađena kao dio curenja podataka i ne može se koristiti. Molimo resetirajte svoju lozinku.',
form_password_incorrect: 'Netočna lozinka. Pokušajte ponovno.',
form_password_length_too_short: 'Vaša lozinka je prekratka. Mora sadržavati najmanje 8 znakova.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Vaša lozinka nije dovoljno jaka.',
form_password_or_identifier_incorrect:
'Lozinka ili e-mail adresa nisu točne. Pokušajte ponovno ili koristite drugu metodu.',
diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts
index 4b878cacc0a..56540481844 100644
--- a/packages/localizations/src/hu-HU.ts
+++ b/packages/localizations/src/hu-HU.ts
@@ -1774,6 +1774,7 @@ export const huHU: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: 'A jelszavad túl rövid. Legalább 8 karakter hosszúnak kell lennie.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'A jelszó nem elég erős',
form_password_or_identifier_incorrect:
'A jelszó vagy az e-mail cím helytelen. Próbáld újra vagy használj másik módszert.',
diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts
index 43870d7df68..a66d1a4b145 100644
--- a/packages/localizations/src/id-ID.ts
+++ b/packages/localizations/src/id-ID.ts
@@ -1757,6 +1757,7 @@ export const idID: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: undefined,
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Kata sandi Anda tidak cukup kuat.',
form_password_or_identifier_incorrect: 'Kata sandi atau alamat email salah. Coba lagi atau gunakan metode lain.',
form_password_pwned:
diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts
index d67fb9a6344..1fc6b0994ea 100644
--- a/packages/localizations/src/is-IS.ts
+++ b/packages/localizations/src/is-IS.ts
@@ -1773,6 +1773,7 @@ export const isIS: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: 'Lykilorðið þitt er of stutt. Það verður að vera að minnsta kosti 8 stafir.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Lykilorðið þitt er ekki nógu sterkt.',
form_password_or_identifier_incorrect: 'Lykilorðið eða netfangið er rangt. Reyndu aftur eða notaðu aðra aðferð.',
form_password_pwned:
diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts
index ddd1dac4d91..4c20d26e3c1 100644
--- a/packages/localizations/src/it-IT.ts
+++ b/packages/localizations/src/it-IT.ts
@@ -1759,6 +1759,7 @@ export const itIT: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Password errata.',
form_password_length_too_short: 'La password deve avere almeno 8 caratteri.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'La tua password non è abbastanza forte.',
form_password_or_identifier_incorrect: "La password o l'indirizzo email è errato. Riprova o usa un altro metodo.",
form_password_pwned: 'Questa password è stata trovata in una violazione dei dati. Scegli una password diversa.',
diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts
index 4cd2e72fb1f..81068f420aa 100644
--- a/packages/localizations/src/ja-JP.ts
+++ b/packages/localizations/src/ja-JP.ts
@@ -1769,6 +1769,7 @@ export const jaJP: LocalizationResource = {
'このパスワードは侵害された可能性があります。アカウントを保護するため、別のサインイン方法を使用してください。サインイン後にパスワードのリセットが必要になります。',
form_password_incorrect: '入力されたパスワードが正しくありません。もう一度お試しください。',
form_password_length_too_short: 'パスワードが短すぎます。8文字以上である必要があります。',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'パスワードの強度が不十分です。',
form_password_or_identifier_incorrect:
'パスワードまたはメールアドレスが正しくありません。もう一度お試しいただくか、別の方法をご利用ください。',
diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts
index 64c74a3deaa..ba47ffd33de 100644
--- a/packages/localizations/src/kk-KZ.ts
+++ b/packages/localizations/src/kk-KZ.ts
@@ -1740,6 +1740,7 @@ export const kkKZ: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Құпия сөз қате.',
form_password_length_too_short: 'Құпия сөз тым қысқа. Кемінде 8 таңба болуы керек.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Құпия сөз әлсіз.',
form_password_or_identifier_incorrect:
'Құпия сөз немесе электрондық пошта мекенжайы дұрыс емес. Қайталап көріңіз немесе басқа әдісті пайдаланыңыз.',
diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts
index 09b3d6d3f2e..6fc94c87f5f 100644
--- a/packages/localizations/src/ko-KR.ts
+++ b/packages/localizations/src/ko-KR.ts
@@ -1745,6 +1745,7 @@ export const koKR: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: '비밀번호가 너무 짧아요. 최소 8자 이상이어야 해요.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: '비밀번호가 충분히 안전하지 않아요.',
form_password_or_identifier_incorrect:
'비밀번호 또는 이메일 주소가 올바르지 않아요. 다시 시도하거나 다른 방법을 사용해 보세요.',
diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts
index 0679505fd7d..ad8fcf996f1 100644
--- a/packages/localizations/src/mn-MN.ts
+++ b/packages/localizations/src/mn-MN.ts
@@ -1751,6 +1751,7 @@ export const mnMN: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Нууц үг буруу байна.',
form_password_length_too_short: 'Нууц үгийн урт хэт богино байна.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Таны нууц үг хангалттай хүчтэй биш байна.',
form_password_or_identifier_incorrect:
'Нууц үг эсвэл имэйл хаяг буруу байна. Дахин оролдох эсвэл өөр арга ашиглана уу.',
diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts
index 72352cf9fdd..092c1db2245 100644
--- a/packages/localizations/src/ms-MY.ts
+++ b/packages/localizations/src/ms-MY.ts
@@ -1776,6 +1776,7 @@ export const msMY: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Kata laluan yang anda masukkan tidak betul. Sila cuba lagi.',
form_password_length_too_short: 'Kata laluan anda terlalu pendek. Ia mesti sekurang-kurangnya 8 aksara panjang.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Kata laluan anda tidak cukup kuat.',
form_password_or_identifier_incorrect:
'Kata laluan atau alamat e-mel tidak betul. Cuba lagi atau gunakan kaedah lain.',
diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts
index 6e8e999d89e..475ca454fd7 100644
--- a/packages/localizations/src/nb-NO.ts
+++ b/packages/localizations/src/nb-NO.ts
@@ -1772,6 +1772,7 @@ export const nbNO: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: 'Passordet ditt er for kort. Det må være minst 8 tegn langt.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Passordet ditt er ikke sterkt nok.',
form_password_or_identifier_incorrect:
'Passordet eller e-postadressen er feil. Prøv igjen eller bruk en annen metode.',
diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts
index f1010c86951..1f2f19eacea 100644
--- a/packages/localizations/src/nl-BE.ts
+++ b/packages/localizations/src/nl-BE.ts
@@ -1751,6 +1751,7 @@ export const nlBE: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Het wachtwoord is incorrect.',
form_password_length_too_short: 'Het wachtwoord is te kort.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Je wachtwoord is niet sterk genoeg.',
form_password_or_identifier_incorrect:
'Het wachtwoord of het e-mailadres is onjuist. Probeer het opnieuw of gebruik een andere methode.',
diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts
index 8bb9f45ddd5..00c4e01265b 100644
--- a/packages/localizations/src/nl-NL.ts
+++ b/packages/localizations/src/nl-NL.ts
@@ -1751,6 +1751,7 @@ export const nlNL: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Het wachtwoord is incorrect.',
form_password_length_too_short: 'Het wachtwoord is te kort.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Je wachtwoord is niet sterk genoeg.',
form_password_or_identifier_incorrect:
'Het wachtwoord of het e-mailadres is onjuist. Probeer het opnieuw of gebruik een andere methode.',
diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts
index 7550b527541..9a0741b215a 100644
--- a/packages/localizations/src/pl-PL.ts
+++ b/packages/localizations/src/pl-PL.ts
@@ -1755,6 +1755,7 @@ export const plPL: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Wprowadzone hasło jest nieprawidłowe. Spróbuj ponownie.',
form_password_length_too_short: 'Twoje hasło jest zbyt krótkie. Musi mieć co najmniej 8 znaków.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Twoje hasło nie jest wystarczająco silne',
form_password_or_identifier_incorrect:
'Hasło lub adres e-mail jest nieprawidłowy. Spróbuj ponownie lub użyj innej metody.',
diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts
index 970f33f6e3f..9ae09c0eabd 100644
--- a/packages/localizations/src/pt-BR.ts
+++ b/packages/localizations/src/pt-BR.ts
@@ -1765,6 +1765,7 @@ export const ptBR: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Senha incorreta.',
form_password_length_too_short: 'Sua senha é muito curta. Por favor, tente novamente.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Sua senha não é forte o suficiente.',
form_password_or_identifier_incorrect:
'A senha ou o endereço de e-mail está incorreto. Tente novamente ou use outro método.',
diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts
index 67a721abb5f..8e370687ade 100644
--- a/packages/localizations/src/pt-PT.ts
+++ b/packages/localizations/src/pt-PT.ts
@@ -1771,6 +1771,7 @@ export const ptPT: LocalizationResource = {
'Esta palavra-passe foi comprometida numa violação de dados. Escolha outra para continuar.',
form_password_incorrect: 'Palavra-passe incorreta.',
form_password_length_too_short: 'A palavra-passe é muito curta.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'A sua palavra-passe não é forte o suficiente.',
form_password_or_identifier_incorrect:
'A palavra-passe ou o endereço de e-mail está incorreto. Tente novamente ou utilize outro método.',
diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts
index a408fd960a0..f8cccc3e9f8 100644
--- a/packages/localizations/src/ro-RO.ts
+++ b/packages/localizations/src/ro-RO.ts
@@ -1766,6 +1766,7 @@ export const roRO: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: 'Parola este prea scurtă. Trebuie să aibă cel puțin 8 caractere.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Parola ta nu este suficient de puternică.',
form_password_or_identifier_incorrect:
'Parola sau adresa de e-mail este incorectă. Încearcă din nou sau folosește o altă metodă.',
diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts
index 78b56dd203e..32b4035047c 100644
--- a/packages/localizations/src/ru-RU.ts
+++ b/packages/localizations/src/ru-RU.ts
@@ -1764,6 +1764,7 @@ export const ruRU: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: undefined,
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Ваш пароль недостаточно надежный.',
form_password_or_identifier_incorrect:
'Пароль или адрес электронной почты неверен. Попробуйте снова или используйте другой метод.',
diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts
index a3011d7d1ef..dc36b79e866 100644
--- a/packages/localizations/src/sk-SK.ts
+++ b/packages/localizations/src/sk-SK.ts
@@ -1756,6 +1756,7 @@ export const skSK: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Heslo je nesprávne. Skontrolujte a skúste to znova.',
form_password_length_too_short: 'Heslo musí mať aspoň 8 znakov.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Vaše heslo nie je dostatočne silné.',
form_password_or_identifier_incorrect:
'Heslo alebo e-mailová adresa je nesprávna. Skúste to znova alebo použite inú metódu.',
diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts
index 9d70bf85920..157efee229b 100644
--- a/packages/localizations/src/sr-RS.ts
+++ b/packages/localizations/src/sr-RS.ts
@@ -1748,6 +1748,7 @@ export const srRS: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Lozinka je netačna.',
form_password_length_too_short: 'Lozinka je prekratka.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Tvoja lozinka nije dovoljno jaka.',
form_password_or_identifier_incorrect:
'Лозинка или адреса е-поште је нетачна. Покушај поново или користи други метод.',
diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts
index 0a4ccda617c..747357f7ef7 100644
--- a/packages/localizations/src/sv-SE.ts
+++ b/packages/localizations/src/sv-SE.ts
@@ -1753,6 +1753,7 @@ export const svSE: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Lösenordet är felaktigt.',
form_password_length_too_short: 'Lösenordet är för kort.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Ditt lösenord är inte tillräckligt starkt.',
form_password_or_identifier_incorrect:
'Lösenordet eller e-postadressen är felaktig. Försök igen eller använd en annan metod.',
diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts
index 9e6ba45ddfc..58024742b32 100644
--- a/packages/localizations/src/ta-IN.ts
+++ b/packages/localizations/src/ta-IN.ts
@@ -1776,6 +1776,7 @@ export const taIN: LocalizationResource = {
form_password_incorrect: 'நீங்கள் உள்ளிட்ட கடவுச்சொல் தவறானது. மீண்டும் முயற்சிக்கவும்.',
form_password_length_too_short:
'உங்கள் கடவுச்சொல் மிகவும் குறுகியது. இது குறைந்தது 8 எழுத்துகள் நீளமாக இருக்க வேண்டும்.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'உங்கள் கடவுச்சொல் போதுமான வலிமை இல்லை.',
form_password_or_identifier_incorrect:
'கடவுச்சொல் அல்லது மின்னஞ்சல் முகவரி தவறானது. மீண்டும் முயற்சிக்கவும் அல்லது வேறு முறையைப் பயன்படுத்தவும்.',
diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts
index fdfeb14677a..1dcefe67386 100644
--- a/packages/localizations/src/te-IN.ts
+++ b/packages/localizations/src/te-IN.ts
@@ -1773,6 +1773,7 @@ export const teIN: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'మీరు నమోదు చేసిన పాస్వర్డ్ తప్పు. దయచేసి మళ్ళీ ప్రయత్నించండి.',
form_password_length_too_short: 'మీ పాస్వర్డ్ చాలా చిన్నది. ఇది కనీసం 8 అక్షరాల పొడవు ఉండాలి.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'మీ పాస్వర్డ్ సరిపడా బలంగా లేదు.',
form_password_or_identifier_incorrect:
'పాస్వర్డ్ లేదా ఇమెయిల్ చిరునామా తప్పు. దయచేసి మళ్ళీ ప్రయత్నించండి లేదా మరొక పద్ధతిని ఉపయోగించండి.',
diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts
index 63d7880db15..e67007a7c1e 100644
--- a/packages/localizations/src/th-TH.ts
+++ b/packages/localizations/src/th-TH.ts
@@ -1748,6 +1748,7 @@ export const thTH: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: 'รหัสผ่านของคุณสั้นเกินไป ต้องมีความยาวอย่างน้อย 8 ตัวอักษร',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'รหัสผ่านของคุณไม่แข็งแกร่งพอ',
form_password_or_identifier_incorrect: 'รหัสผ่านหรือที่อยู่อีเมลไม่ถูกต้อง ลองอีกครั้งหรือใช้วิธีอื่น',
form_password_pwned:
diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts
index d6635dc546e..b95612c1e19 100644
--- a/packages/localizations/src/tr-TR.ts
+++ b/packages/localizations/src/tr-TR.ts
@@ -1752,6 +1752,7 @@ export const trTR: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: 'Şifre yanlış.',
form_password_length_too_short: 'Şifre çok kısa.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Şifreniz yeterince güçlü değil.',
form_password_or_identifier_incorrect:
'Şifre veya e-posta adresi yanlış. Tekrar deneyin veya başka bir yöntem kullanın.',
diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts
index 20aad290637..3f982bc72b8 100644
--- a/packages/localizations/src/uk-UA.ts
+++ b/packages/localizations/src/uk-UA.ts
@@ -1748,6 +1748,7 @@ export const ukUA: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: undefined,
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Ваш пароль недостатньо надійний.',
form_password_or_identifier_incorrect:
'Пароль або адреса електронної пошти невірні. Спробуйте ще раз або використайте інший метод.',
diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts
index 6d6cab7d74c..d848ef3838f 100644
--- a/packages/localizations/src/vi-VN.ts
+++ b/packages/localizations/src/vi-VN.ts
@@ -1767,6 +1767,7 @@ export const viVN: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: 'Mật khẩu của bạn quá ngắn. Nó phải có ít nhất 8 ký tự.',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: 'Mật khẩu của bạn không đủ mạnh.',
form_password_or_identifier_incorrect:
'Mật khẩu hoặc địa chỉ email không đúng. Vui lòng thử lại hoặc sử dụng phương thức khác.',
diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts
index 7ef502e7a97..dfbf68c8f6b 100644
--- a/packages/localizations/src/zh-CN.ts
+++ b/packages/localizations/src/zh-CN.ts
@@ -1733,6 +1733,7 @@ export const zhCN: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: undefined,
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: '您的密码强度不够。',
form_password_or_identifier_incorrect: '密码或电子邮件地址不正确。请重试或使用其他方法。',
form_password_pwned: '这个密码在数据泄露中被发现,不能使用,请换一个密码试试。',
diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts
index 39803eed0ae..6ca3ead8138 100644
--- a/packages/localizations/src/zh-TW.ts
+++ b/packages/localizations/src/zh-TW.ts
@@ -1737,6 +1737,7 @@ export const zhTW: LocalizationResource = {
form_password_compromised__sign_in: undefined,
form_password_incorrect: undefined,
form_password_length_too_short: '您的密碼太短。長度必須至少為 8 個字元。',
+ form_password_matches_identifier: undefined,
form_password_not_strong_enough: '您的密碼強度不足。',
form_password_or_identifier_incorrect: '密碼或電子郵件地址不正確。請重試或使用其他方法。',
form_password_pwned: '此密碼已在已知的資料外洩事件中出現,請改用其他密碼。',
diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts
index 1944631d919..26b9452fc15 100644
--- a/packages/shared/src/types/localization.ts
+++ b/packages/shared/src/types/localization.ts
@@ -2158,6 +2158,7 @@ type UnstableErrors = WithParamName<{
form_password_pwned: LocalizationValue;
form_password_pwned__sign_in: LocalizationValue;
form_new_password_matches_current: LocalizationValue;
+ form_password_matches_identifier: LocalizationValue;
/** @deprecated Use `form_password_compromised__sign_in` instead */
form_password_untrusted__sign_in: LocalizationValue;
form_password_compromised__sign_in: LocalizationValue;
diff --git a/packages/ui/src/utils/__tests__/passwordUtils.test.tsx b/packages/ui/src/utils/__tests__/passwordUtils.test.tsx
index 4b142e772c5..d1e596d93ac 100644
--- a/packages/ui/src/utils/__tests__/passwordUtils.test.tsx
+++ b/packages/ui/src/utils/__tests__/passwordUtils.test.tsx
@@ -161,6 +161,66 @@ describe('createPasswordError() constructs error that password', () => {
);
});
+ it('matches one of the account identifiers', async () => {
+ const { wrapper: Wrapper } = await createFixtures();
+
+ const wrapperBefore = ({ children }) => (
+
+ {children}
+
+ );
+
+ const { result } = renderHook(() => useLocalizations(), { wrapper: wrapperBefore });
+
+ const res = createPasswordError(
+ [{ code: 'form_password_matches_identifier', message: 'server message' }],
+ createLocalizationConfig(result.current.t),
+ );
+ expect(res).toBe(
+ 'Password cannot match your email address, phone number or username. For account safety, please use a different password.',
+ );
+ });
+
+ it('returns the error itself for a code with no complexity mapping, so translateError handles it', async () => {
+ const { wrapper: Wrapper } = await createFixtures();
+
+ const wrapperBefore = ({ children }) => (
+
+ {children}
+
+ );
+
+ const { result } = renderHook(() => useLocalizations(), { wrapper: wrapperBefore });
+
+ const error = { code: 'form_password_some_future_rule', message: 'Server explains the rule.' };
+ const res = createPasswordError([error], createLocalizationConfig(result.current.t));
+
+ expect(res).toBe(error);
+ // setError() pipes the result through translateError, which falls back to the API message
+ expect(result.current.translateError(res)).toBe('Server explains the rule.');
+ });
+
+ it('ignores unmapped codes that accompany a mapped one', async () => {
+ const { wrapper: Wrapper } = await createFixtures();
+
+ const wrapperBefore = ({ children }) => (
+
+ {children}
+
+ );
+
+ const { result } = renderHook(() => useLocalizations(), { wrapper: wrapperBefore });
+
+ const res = createPasswordError(
+ [
+ { code: 'form_password_no_uppercase', message: '' },
+ { code: 'form_password_some_future_rule', message: 'Server explains the rule.' },
+ ],
+ createLocalizationConfig(result.current.t),
+ );
+ expect(res).toBe('Your password must contain an uppercase letter.');
+ });
+
//
// zxcvbn
//
diff --git a/packages/ui/src/utils/passwordUtils.ts b/packages/ui/src/utils/passwordUtils.ts
index 9860a11d82c..55447f7937d 100644
--- a/packages/ui/src/utils/passwordUtils.ts
+++ b/packages/ui/src/utils/passwordUtils.ts
@@ -30,7 +30,10 @@ type LocalizationConfigProps = {
passwordSettings: Pick;
};
-export const createPasswordError = (errors: ClerkAPIError[], localizationConfig: LocalizationConfigProps) => {
+export const createPasswordError = (
+ errors: ClerkAPIError[],
+ localizationConfig: LocalizationConfigProps,
+): ClerkAPIError | string | undefined => {
if (!localizationConfig) {
return errors[0].longMessage;
}
@@ -40,7 +43,8 @@ export const createPasswordError = (errors: ClerkAPIError[], localizationConfig:
if (
errors?.[0]?.code === 'form_password_size_in_bytes_exceeded' ||
errors?.[0]?.code === 'form_password_pwned' ||
- errors?.[0]?.code === 'form_new_password_matches_current'
+ errors?.[0]?.code === 'form_new_password_matches_current' ||
+ errors?.[0]?.code === 'form_password_matches_identifier'
) {
return `${t(localizationKeys(`unstable__errors.${errors?.[0]?.code}` as any)) || errors?.[0]?.message}`;
}
@@ -58,8 +62,19 @@ export const createPasswordError = (errors: ClerkAPIError[], localizationConfig:
// show min length error first by itself
const minLenErrors = errors.filter(e => e.code === 'form_password_length_too_short');
- const message = (minLenErrors.length ? minLenErrors : errors).map((s: any) => {
- const localizedKey = (mapComplexityErrors(passwordSettings) as any)[s.code];
+ const complexityErrors = mapComplexityErrors(passwordSettings);
+ const knownErrors = (minLenErrors.length ? minLenErrors : errors).filter(e =>
+ Object.hasOwn(complexityErrors, e.code),
+ );
+
+ // returning the error lets translateError localize by code before falling back to the API message;
+ // building the sentence here would render the prefix with an empty list, eg "Your password must contain ."
+ if (!knownErrors.length) {
+ return errors?.[0];
+ }
+
+ const message = knownErrors.map((s: any) => {
+ const localizedKey = (complexityErrors as any)[s.code];
if (Array.isArray(localizedKey)) {
const [lk, attr, val] = localizedKey;