refactor(auth): merge the duplicate login form and localize the auth screens
Gitea Actions Runner Test / test-job (push) Successful in 1s
CI / check (push) Successful in 1m8s
CI / tests-integration (push) Successful in 1m53s
CI / tests-unit (push) Successful in 1m59s
CI / tests-ui (push) Successful in 2m42s
CI / preflight (push) Skipped
CI / deploy (push) Successful in 4m33s
Gitea Actions Runner Test / test-job (push) Successful in 1s
CI / check (push) Successful in 1m8s
CI / tests-integration (push) Successful in 1m53s
CI / tests-unit (push) Successful in 1m59s
CI / tests-ui (push) Successful in 2m42s
CI / preflight (push) Skipped
CI / deploy (push) Successful in 4m33s
`home-login-form.tsx` and `login-form.tsx` were two ~240-line near-identical components. Delete the former and give `LoginForm` a `variant` prop: - `variant="page"` sr-only labels plus the register/forgot footer (/login) - `variant="compact"` visible labels, no footer (homepage sidebar) Field ids now come from `useId()`, so the two usages can never collide, and the hardcoded "Show"/"Hide"/"Loading" strings are translated. Localization of the login and register screens: - `home-login-form.tsx` was entirely hardcoded English. - `passwordStrength()` returned hardcoded "Weak"/"Fair"/"Good"/"Strong". - `register.ts` returned only English strings. It now returns a locale-independent `code` next to the message, and the form renders `t(code)` with the English string as a fallback. - Backfilled the new keys across all 25 locales, plus the login/register strings that were still English in most of them. `ar`, `fi` and `ja` had their entire login/register namespace in English and are now filled in. Locale parity stays at 0 missing keys, as `i18n:check` requires. Copy that did not match the enforced rules: the UI advertised "min 8 chars" (EN) / "min 6 tekens" (NL) while registration requires 12 characters plus an uppercase, a lowercase, a digit and a special character. Corrected in every locale. `password-reset.ts` enforced only 6 characters and is raised to 12 to match registration. Accessibility: `login-form.tsx` had no `<label>`, no `id` and no `required` on any field. All three are now present, and error banners are announced with `role="alert"`. Adds `src/i18n/auth-messages.test.ts`, which asserts every `RegisterErrorCode` resolves to a non-empty message in all 25 locales; verified it fails when a key is removed. The existing register tests now also assert the error `code`.
This commit is contained in:
1 parent
3d828a61ab
commit
6bffc53779
33 files changed
+1756
-842
No files matched your search
+50
-19
@@ -834,14 +834,18 @@
|
||||
"createOne": "Создать",
|
||||
"forgotPassword": "Забыли пароль?",
|
||||
"errorInvalidCredentials": "Неверное имя пользователя или пароль",
|
||||
"errorInvalid2fa": "Недействительный код 2FA",
|
||||
"errorInvalid2fa": "Неверный код 2FA",
|
||||
"welcomeBack": "С возвращением",
|
||||
"welcomeBackSub": "Войди, чтобы продолжить в {hotelName}",
|
||||
"errorUnverified": "Please verify your email before signing in.",
|
||||
"errorCaptcha": "Captcha verification failed. Please try again.",
|
||||
"whoIsOnline": "Who's online",
|
||||
"newestCitizens": "Newest citizens",
|
||||
"usersOnline": "{count} online"
|
||||
"errorUnverified": "Подтвердите адрес электронной почты перед входом.",
|
||||
"errorCaptcha": "Проверка captcha не пройдена. Попробуйте ещё раз.",
|
||||
"whoIsOnline": "Кто в сети",
|
||||
"newestCitizens": "Новые жители",
|
||||
"usersOnline": "{count} в сети",
|
||||
"username": "Имя пользователя",
|
||||
"password": "Пароль",
|
||||
"showPassword": "Показать",
|
||||
"hidePassword": "Скрыть"
|
||||
},
|
||||
"register": {
|
||||
"title": "Создать аккаунт",
|
||||
@@ -852,7 +856,7 @@
|
||||
"confirmPassword": "Повторите пароль",
|
||||
"usernamePlaceholder": "Имя пользователя",
|
||||
"emailPlaceholder": "Электронная почта",
|
||||
"passwordPlaceholder": "Пароль (мин. 6 символов)",
|
||||
"passwordPlaceholder": "Пароль (мин. 12 символов)",
|
||||
"confirmPasswordPlaceholder": "Повторите пароль",
|
||||
"selectOutfit": "Выберите свой наряд",
|
||||
"termsAccept": "Мне 18+ и я принимаю условия и правила {hotel}.",
|
||||
@@ -864,7 +868,7 @@
|
||||
"termsError": "Чтобы зарегистрироваться, вы должны принять условия и правила.",
|
||||
"usernameError": "Требуется имя пользователя.",
|
||||
"emailError": "Требуется действительный адрес электронной почты.",
|
||||
"passwordError": "Пароль должен содержать не менее 6 символов.",
|
||||
"passwordError": "Пароль должен содержать не менее 12 символов",
|
||||
"confirmPasswordError": "Пароли не совпадают.",
|
||||
"termsRequired": "Вы должны принять условия и правила.",
|
||||
"usernameRequired": "Требуется имя пользователя.",
|
||||
@@ -873,16 +877,41 @@
|
||||
"passwordsDontMatch": "Пароли не совпадают.",
|
||||
"alreadyHaveAccountPre": "Уже есть аккаунт?",
|
||||
"alreadyHaveAccountLink": "Войти",
|
||||
"whoIsOnline": "Кто онлайн",
|
||||
"usersOnline": "{count} онлайн",
|
||||
"accepted": "Accepted & agreed",
|
||||
"showPassword": "Show",
|
||||
"hidePassword": "Hide",
|
||||
"accountDetails": "Account details",
|
||||
"credentials": "Credentials & security",
|
||||
"newestCitizens": "Newest citizens",
|
||||
"whoIsOnline": "Кто в сети",
|
||||
"usersOnline": "{count} в сети",
|
||||
"accepted": "Принято и согласен",
|
||||
"showPassword": "Показать",
|
||||
"hidePassword": "Скрыть",
|
||||
"accountDetails": "Данные аккаунта",
|
||||
"credentials": "Учётные данные и безопасность",
|
||||
"newestCitizens": "Новые жители",
|
||||
"ageVerified": "Мне 18+ и я согласен с возрастным требованием.",
|
||||
"invitedBy": "Приглашён пользователем {username}"
|
||||
"invitedBy": "Приглашён пользователем {username}",
|
||||
"strengthWeak": "Слабый",
|
||||
"strengthFair": "Средний",
|
||||
"strengthGood": "Хороший",
|
||||
"strengthStrong": "Надёжный",
|
||||
"passwordMinLength": "Пароль должен содержать не менее 12 символов",
|
||||
"passwordUpper": "Пароль должен содержать хотя бы одну заглавную букву",
|
||||
"passwordLower": "Пароль должен содержать хотя бы одну строчную букву",
|
||||
"passwordDigit": "Пароль должен содержать хотя бы одну цифру",
|
||||
"passwordSpecial": "Пароль должен содержать хотя бы один специальный символ",
|
||||
"passwordMaxLength": "Пароль слишком длинный",
|
||||
"usernameMinLength": "Имя пользователя должно содержать не менее 3 символов",
|
||||
"usernameMaxLength": "Имя пользователя может содержать не более 25 символов",
|
||||
"usernamePattern": "Имя пользователя может содержать только буквы, цифры, подчёркивание и дефис",
|
||||
"usernameReserved": "Это имя пользователя зарезервировано",
|
||||
"emailValid": "Введите корректный адрес электронной почты",
|
||||
"emailDisposable": "Временные домены электронной почты запрещены",
|
||||
"passwordsMatch": "Пароли не совпадают.",
|
||||
"captchaFailed": "Проверка captcha не пройдена. Попробуйте ещё раз.",
|
||||
"usernameTaken": "Это имя пользователя уже занято",
|
||||
"rateLimited": "Слишком много попыток регистрации. Подождите несколько минут и повторите попытку.",
|
||||
"vpnBlocked": "Регистрация через VPN/прокси-соединения запрещена.",
|
||||
"maxAccountsPerIp": "Вы достигли максимального числа аккаунтов для вашего подключения.",
|
||||
"unavailable": "Регистрация временно недоступна.",
|
||||
"createFailed": "Не удалось создать аккаунт. Повторите попытку или обратитесь к сотрудникам.",
|
||||
"invalidInput": "Проверьте выделенные поля и повторите попытку."
|
||||
},
|
||||
"forgot": {
|
||||
"title": "Сбросить пароль",
|
||||
@@ -896,9 +925,11 @@
|
||||
"reset": {
|
||||
"title": "Установить новый пароль",
|
||||
"subtitle": "Выберите надежный пароль, который вы больше не используете.",
|
||||
"passwordPlaceholder": "Новый пароль (мин. 6 символов)",
|
||||
"passwordPlaceholder": "Новый пароль (мин. 12 символов)",
|
||||
"resetPassword": "Сбросить пароль",
|
||||
"backToLogin": "Назад к входу"
|
||||
"backToLogin": "Назад к входу",
|
||||
"passwordMinLength": "Пароль должен содержать не менее 12 символов",
|
||||
"tooManyAttempts": "Слишком много попыток — повторите позже"
|
||||
},
|
||||
"verify": {
|
||||
"verifiedTitle": "Всё готово",
|
||||
|
||||
Reference in new issue
Block a user