Files
Matías RacedoandGitHub 78be618357 fix(login): translate authentication and OTP strings (#12668)
Closes #12481
Closes #12226

# Which Problems Are Solved

Login V2 still contained several hardcoded authentication-method and OTP
strings, preventing them from following the selected locale or being
overridden through custom Login translations.

Additionally, the password-reset flow already referenced
`password.errors.passwordResetNotAllowed`, but the key was missing from
the Login V2 translations, causing the raw translation key to be
displayed when password reset is disabled.

# How the Problems Are Solved

* Replaced the hardcoded authentication-method labels with Login V2
translation keys.
* Replaced the OTP challenge and verification fallback messages with
translated values.
* Reused the existing `otp.verify.resendCode` translation for the resend
button's accessible label.
* Added `password.errors.passwordResetNotAllowed`.
* Added the new keys to all supported Login V2 locales and mirrored them
in `internal/query/v2-default.json` so frontend and API-provided default
translations remain consistent.
* Added unit coverage for the translated authentication labels and OTP
failure paths.

# How the Changes Are Tested

* `pnpm nx run @zitadel/login:test-unit`
* `pnpm nx run @zitadel/login:lint`
* `pnpm nx run @zitadel/login:build`
* `pnpm nx run-many --projects @zitadel/login @zitadel/client
@zitadel/proto --targets lint build test`
* Manually verified Login V2 with multiple locales, including
authentication-method labels, OTP failure fallbacks, and the disabled
password-reset flow.
2026-09-03 06:01:34 +02:00

477 lines
28 KiB
JSON

{
"common": {
"back": "Назад",
"title": "Вхід через Zitadel"
},
"accounts": {
"title": "Облікові записи",
"description": "Виберіть обліковий запис, який хочете використовувати.",
"addAnother": "Додати інший обліковий запис",
"noResults": "Облікові записи не знайдено",
"verified": "підтверджено",
"expired": "закінчився"
},
"logout": {
"title": "Вихід",
"description": "Натисніть на обліковий запис, щоб завершити сеанс",
"noResults": "Облікові записи не знайдено",
"clear": "Завершити сеанс",
"verifiedAt": "Остання активність: {time}",
"success": {
"title": "Вихід успішний",
"description": "Ви успішно вийшли з системи."
}
},
"loginname": {
"title": "З поверненням!",
"description": "Введіть свої дані для входу.",
"register": "Зареєструвати нового користувача",
"submit": "Продовжити",
"labels": {
"loginname": "Ім'я для входу",
"username": "Ім'я користувача",
"usernameOrPhoneNumber": "Ім'я користувача або номер телефону",
"usernameOrEmail": "Ім'я користувача або електронна пошта"
},
"required": {
"loginName": "Це поле обов'язкове"
},
"errors": {
"internalError": "Сталася внутрішня помилка",
"couldNotGetLoginSettings": "Не вдалося отримати налаштування входу",
"couldNotSearchUsers": "Не вдалося знайти користувачів",
"couldNotGetDomain": "Не вдалося отримати домен",
"couldNotGetHost": "Не вдалося отримати хост",
"couldNotStartIDPFlow": "Не вдалося запустити потік IDP",
"moreThanOneUserFound": "Знайдено більше одного користувача. Вкажіть унікальний ідентифікатор.",
"userNotFound": "Користувача не знайдено в системі",
"couldNotCreateSession": "Не вдалося створити сеанс для користувача",
"initialUserNotSupported": "Початковий користувач не підтримується",
"localAuthenticationNotAllowed": "Локальна аутентифікація заборонена! Зверніться до адміністратора за додатковою інформацією.",
"passkeysNotAllowed": "Ключі доступу не дозволені! Зверніться до адміністратора для отримання додаткової інформації.",
"couldNotFindIdentityProvider": "Не вдалося знайти постачальника ідентичності.",
"userNotActive": "Користувач неактивний. Зверніться до адміністратора для отримання додаткової інформації."
}
},
"zitadel": {
"errors": {
"errorOccured": "Сталася помилка",
"multipleUsersFound": "Знайдено кількох користувачів",
"userNotFound": "Користувача не знайдено в системі"
}
},
"password": {
"verify": {
"title": "Пароль",
"description": "Введіть свій пароль.",
"resetPassword": "Скинути пароль",
"submit": "Продовжити",
"labels": {
"password": "Пароль"
},
"required": {
"password": "Це поле обов'язкове"
},
"errors": {
"couldNotVerifyPassword": "Не вдалося перевірити пароль",
"couldNotResetPassword": "Не вдалося скинути пароль"
},
"info": {
"passwordResetSent": "Пароль було скинуто. Будь ласка, перевірте свою електронну пошту"
}
},
"set": {
"title": "Встановити пароль",
"description": "Встановіть пароль для свого облікового запису",
"codeSent": "Новий код надіслано на вашу електронну адресу.",
"noCodeReceived": "Не отримали код?",
"resend": "Надіслати код повторно",
"submit": "Продовжити",
"labels": {
"code": "Код",
"newPassword": "Новий пароль",
"confirmPassword": "Підтвердити пароль"
},
"required": {
"code": "Це поле обов'язкове",
"newPassword": "Ви повинні вказати пароль!",
"confirmPassword": "Це поле обов'язкове"
},
"errors": {
"couldNotSetPassword": "Не вдалося встановити пароль",
"couldNotResetPassword": "Не вдалося скинути пароль",
"couldNotVerifyPassword": "Не вдалося перевірити пароль"
}
},
"change": {
"title": "Змінити пароль",
"description": "Встановіть пароль для свого облікового запису",
"submit": "Продовжити",
"labels": {
"currentPassword": "Поточний пароль",
"newPassword": "Новий пароль",
"confirmPassword": "Підтвердити пароль"
},
"required": {
"currentPassword": "Ви повинні вказати поточний пароль!",
"newPassword": "Ви повинні вказати новий пароль!",
"confirmPassword": "Це поле обов'язкове"
},
"errors": {
"currentPasswordInvalid": "Поточний пароль невірний.",
"couldNotChangePassword": "Не вдалося змінити пароль",
"couldNotVerifyPassword": "Не вдалося перевірити пароль",
"unknownError": "Невідома помилка"
}
},
"complexity": {
"length": "Повинен містити щонайменше {minLength} символів.",
"hasSymbol": "Повинен містити символ.",
"hasNumber": "Повинен містити цифру.",
"hasUppercase": "Повинен містити велику літеру.",
"hasLowercase": "Повинен містити малу літеру.",
"equals": "Підтвердження пароля збігається.",
"matches": "Збігається",
"doesNotMatch": "Не збігається"
},
"errors": {
"noHostFound": "Хост не знайдено",
"couldNotSendResetLink": "Не вдалося надіслати посилання для скидання пароля",
"couldNotCreateSessionForUser": "Не вдалося створити сеанс для користувача",
"couldNotVerifyPassword": "Не вдалося перевірити пароль",
"failedToAuthenticate": "Не вдалося автентифікуватися. Ви використали {failedAttempts} з {maxPasswordAttempts} спроб введення пароля.{lockoutMessage}",
"failedToAuthenticateNoLimit": "Не вдалося автентифікуватися.",
"accountLockedContactAdmin": " Зверніться до адміністратора, щоб розблокувати свій обліковий запис",
"userNotFound": "Користувача не знайдено в системі",
"initialUserNotSupported": "Початковий користувач не підтримується",
"userInitialStateNotSupported": "Початковий стан користувача не підтримується",
"codeOrVerificationRequired": "Ви повинні надати код або мати дійсну перевірку користувача",
"verificationRequired": "Необхідно виконати перевірку користувача",
"couldNotLoadSession": "Не вдалося завантажити сеанс",
"couldNotLoadAuthMethods": "Не вдалося завантажити методи автентифікації",
"failedPrecondition": "Не виконано передумову",
"sessionNotValid": "Сеанс недійсний",
"passwordVerificationMissing": "Відсутня перевірка пароля.",
"passwordVerificationTooOld": "Перевірка пароля застаріла. Будь ласка, перевірте пароль ще раз.",
"passwordResetNotAllowed": "Скидання пароля заборонено. Зверніться до адміністратора за додатковою інформацією."
}
},
"idp": {
"title": "Увійти через SSO",
"description": "Виберіть одного з наступних постачальників для входу",
"orSignInWith": "або увійти через",
"signInWithApple": "Увійти через Apple",
"signInWithGoogle": "Увійти через Google",
"signInWithAzureAD": "Увійти через AzureAD",
"signInWithGithub": "Увійти через GitHub",
"signInWithGitlab": "Увійти через GitLab",
"signInWithZitadel": "Увійти через Zitadel",
"loginError": {
"title": "Помилка входу",
"description": "Сталася помилка під час спроби входу."
},
"linkingError": {
"title": "Помилка прив'язки облікового запису",
"description": "Сталася помилка під час спроби прив'язати ваш обліковий запис."
},
"completeRegister": {
"title": "Заповніть свої дані",
"description": "Вам потрібно завершити реєстрацію, вказавши свою електронну адресу та ім'я."
},
"accountNotFound": {
"title": "Обліковий запис не знайдено",
"description": "Ми не змогли знайти обліковий запис, пов'язаний з вашими обліковими даними постачальника ідентичності.",
"info": "Існуючий обліковий запис не знайдено. Будь ласка, увійдіть за допомогою існуючого облікового запису або зверніться до адміністратора за допомогою.",
"backToLogin": "Повернутися до входу"
},
"registrationFailed": {
"title": "Реєстрація недоступна",
"description": "Ми не змогли завершити процес реєстрації.",
"info": "Не вдалося визначити організацію для реєстрації. Будь ласка, зверніться до адміністратора за допомогою.",
"backToLogin": "Повернутися до входу"
},
"processing": {
"message": "Обробка автентифікації...",
"noRedirect": "Сервер не повернув перенаправлення або помилку",
"unexpectedError": "Сталася неочікувана помилка"
},
"errors": {
"missingParameters": "Відсутні обов'язкові параметри",
"missingIdpInfo": "Відсутня інформація IDP",
"idpNotFound": "Постачальника ідентичності не знайдено",
"linkingNotAllowed": "Прив'язка не дозволена для цього постачальника ідентичності",
"linkingFailed": "Не вдалося прив'язати постачальника ідентичності до облікового запису",
"autoLinkingFailed": "Не вдалося автоматично прив'язати обліковий запис",
"userCreationFailed": "Не вдалося створити обліковий запис користувача",
"orgResolutionFailed": "Не вдалося визначити організацію для реєстрації",
"sessionCreationFailed": "Не вдалося створити сеанс або визначити перенаправлення",
"unknownError": "Сталася невідома помилка"
}
},
"ldap": {
"title": "Вхід LDAP",
"description": "Введіть свої облікові дані LDAP.",
"submit": "Продовжити",
"labels": {
"username": "Ім'я користувача",
"password": "Пароль"
},
"required": {
"username": "Це поле обов'язкове",
"password": "Це поле обов'язкове"
}
},
"mfa": {
"verify": {
"title": "Підтвердіть свою особу",
"description": "Виберіть один з наступних факторів.",
"noResults": "Немає доступних других факторів для налаштування."
},
"set": {
"title": "Налаштувати 2-факторну автентифікацію",
"description": "Виберіть один з наступних других факторів.",
"skip": "Пропустити"
}
},
"otp": {
"verify": {
"title": "Перевірити 2-факторну автентифікацію",
"totpDescription": "Введіть код з вашого додатку автентифікації.",
"smsDescription": "Введіть код, отриманий через SMS.",
"emailDescription": "Введіть код, отриманий на електронну пошту.",
"noCodeReceived": "Не отримали код?",
"resendCode": "Надіслати код повторно",
"submit": "Продовжити",
"labels": {
"code": "Код"
},
"required": {
"code": "Це поле обов'язкове"
}
},
"set": {
"title": "Налаштувати 2-факторну автентифікацію",
"totpDescription": "Відскануйте QR-код вашим додатком автентифікації.",
"smsDescription": "Введіть номер телефону для отримання коду через SMS.",
"emailDescription": "Введіть електронну адресу для отримання коду на пошту.",
"totpRegisterDescription": "Відскануйте QR-код або перейдіть за URL вручну.",
"submit": "Продовжити",
"labels": {
"code": "Код"
},
"required": {
"code": "Це поле обов'язкове"
}
},
"errors": {
"couldNotRequestChallenge": "Не вдалося запросити OTP-виклик",
"couldNotVerifyCode": "Не вдалося перевірити OTP-код"
}
},
"passkey": {
"verify": {
"title": "Автентифікація за допомогою ключа доступу",
"description": "Ваш пристрій запитає відбиток пальця, обличчя або блокування екрана",
"usePassword": "Використати пароль",
"submit": "Продовжити",
"errors": {
"couldNotRequestChallenge": "Не вдалося запросити виклик ключа доступу",
"couldNotVerifyPasskey": "Не вдалося перевірити ключ доступу",
"noResponseReceived": "Перевірка ключа доступу не вдалася - відповідь не отримано",
"noRedirectProvided": "Перевірка ключа доступу завершена, але перенаправлення не надано",
"couldNotRetrievePasskey": "Сталася помилка під час отримання ключа доступу",
"verificationCancelled": "Перевірку ключа доступу скасовано",
"verificationFailed": "Сталася помилка під час перевірки ключа доступу",
"couldNotFindSession": "Не вдалося знайти сеанс",
"couldNotUpdateSession": "Не вдалося оновити сеанс",
"userNotFound": "Користувача не знайдено в системі",
"couldNotDetermineRedirect": "Не вдалося визначити URL перенаправлення після перевірки ключа доступу"
}
},
"set": {
"title": "Налаштувати ключ доступу",
"description": "Ваш пристрій запитає відбиток пальця, обличчя або блокування екрана",
"info": {
"description": "Ключ доступу - це метод автентифікації на пристрої, такий як відбиток пальця, Apple FaceID або подібний. ",
"link": "Автентифікація за допомогою ключа доступу"
},
"skip": "Пропустити",
"submit": "Продовжити"
}
},
"u2f": {
"verify": {
"title": "Перевірити 2-факторну автентифікацію",
"description": "Підтвердіть свій обліковий запис за допомогою пристрою."
},
"set": {
"title": "Налаштувати 2-факторну автентифікацію",
"description": "Налаштуйте пристрій як другий фактор.",
"submit": "Продовжити"
}
},
"register": {
"methods": {
"passkey": "Ключ доступу",
"password": "Пароль"
},
"disabled": {
"title": "Реєстрацію вимкнено",
"description": "Реєстрацію вимкнено. Будь ласка, зверніться до адміністратора."
},
"missingdata": {
"title": "Відсутні дані",
"description": "Вкажіть електронну пошту, ім'я та прізвище для реєстрації."
},
"title": "Реєстрація",
"description": "Створіть свій обліковий запис Zitadel.",
"noMethodAvailableWarning": "Немає доступного методу автентифікації. Будь ласка, зверніться до адміністратора.",
"selectMethod": "Виберіть метод автентифікації",
"agreeTo": "Для реєстрації ви повинні погодитися з умовами та положеннями",
"termsOfService": "Умови надання послуг",
"privacyPolicy": "Політика конфіденційності",
"submit": "Продовжити",
"password": {
"title": "Встановити пароль",
"description": "Встановіть пароль для свого облікового запису",
"submit": "Продовжити",
"labels": {
"password": "Пароль",
"confirmPassword": "Підтвердити пароль"
},
"required": {
"password": "Ви повинні вказати пароль!",
"confirmPassword": "Це поле обов'язкове"
}
},
"labels": {
"firstname": "Ім'я",
"lastname": "Прізвище",
"email": "Електронна пошта"
},
"required": {
"firstname": "Це поле обов'язкове",
"lastname": "Це поле обов'язкове",
"email": "Це поле обов'язкове"
},
"errors": {
"couldNotCreateUser": "Не вдалося створити користувача",
"couldNotCreateSession": "Не вдалося створити сеанс",
"userNotFound": "Користувача не знайдено в системі",
"couldNotLinkIDP": "Не вдалося прив'язати IDP до користувача",
"couldNotRegisterUser": "Не вдалося зареєструвати користувача"
}
},
"invite": {
"title": "Запросити користувача",
"description": "Вкажіть електронну адресу та ім'я користувача, якого хочете запросити.",
"info": "Користувач отримає електронний лист з подальшими інструкціями.",
"notAllowed": "Ваші налаштування не дозволяють запрошувати користувачів.",
"submit": "Продовжити",
"success": {
"title": "Користувача запрошено",
"description": "Електронний лист успішно надіслано.",
"verified": "Користувача запрошено, і він вже підтвердив свою електронну пошту.",
"notVerifiedYet": "Користувача запрошено. Він отримає електронний лист з подальшими інструкціями.",
"submit": "Запросити іншого користувача"
}
},
"signedin": {
"title": "Ласкаво просимо, {user}!",
"description": "Ви увійшли в систему.",
"continue": "Продовжити",
"error": {
"title": "Помилка",
"description": "Сталася помилка під час спроби входу."
}
},
"verify": {
"userIdMissing": "userId не надано!",
"successTitle": "Користувача підтверджено",
"successDescription": "Користувача успішно підтверджено.",
"successContinue": "Продовжити",
"setupAuthenticator": "Налаштувати автентифікатор",
"verify": {
"title": "Підтвердити користувача",
"description": "Введіть код, наданий у листі підтвердження.",
"noCodeReceived": "Не отримали код?",
"resendCode": "Надіслати код повторно",
"codeSent": "Код щойно надіслано на вашу електронну адресу.",
"submit": "Продовжити",
"labels": {
"code": "Код"
},
"required": {
"code": "Це поле обов'язкове"
}
},
"errors": {
"couldNotResendEmail": "Не вдалося повторно надіслати електронний лист",
"couldNotVerifyUser": "Не вдалося підтвердити користувача",
"couldNotVerifyInvite": "Не вдалося підтвердити запрошення",
"couldNotVerifyEmail": "Не вдалося підтвердити електронну пошту",
"couldNotVerify": "Не вдалося підтвердити",
"couldNotLoadUser": "Не вдалося завантажити користувача",
"couldNotLoadAuthenticators": "Не вдалося завантажити можливі автентифікатори",
"couldNotCreateSession": "Не вдалося створити сеанс",
"noHostFound": "Хост не знайдено",
"userAlreadyVerified": "Користувача вже підтверджено!",
"couldNotResendInvite": "Не вдалося повторно надіслати запрошення",
"inviteSendFailed": "Не вдалося надіслати лист-запрошення",
"emailSendFailed": "Не вдалося надіслати лист підтвердження",
"contextMissing": "Сталася помилка. Будь ласка, спробуйте ще раз."
}
},
"authenticator": {
"title": "Виберіть метод автентифікації",
"description": "Виберіть метод автентифікації",
"noMethodsAvailable": "Немає доступних методів автентифікації",
"allSetup": "Ви вже налаштували автентифікатор!",
"linkWithIDP": "або прив'яжіть до постачальника ідентичності",
"methods": {
"totp": "Додаток автентифікації",
"u2f": "Універсальний другий фактор",
"otpEmail": "Код через електронну пошту",
"otpSms": "Код через SMS",
"passkey": "Ключ доступу",
"password": "Пароль"
}
},
"device": {
"usercode": {
"title": "Код пристрою",
"description": "Введіть код, показаний у вашому додатку або на пристрої.",
"submit": "Продовжити",
"labels": {
"code": "Код"
},
"required": {
"code": "Це поле обов'язкове"
}
},
"request": {
"title": "{appName} хоче підключитися",
"description": "{appName} матиме доступ до:",
"disclaimer": "Натискаючи Дозволити, ви дозволяєте {appName} та Zitadel використовувати вашу інформацію відповідно до їхніх умов надання послуг та політик конфіденційності. Ви можете скасувати цей доступ у будь-який час.",
"submit": "Дозволити",
"deny": "Відхилити"
},
"scope": {
"openid": "Підтвердити вашу особу.",
"email": "Переглянути вашу електронну адресу.",
"profile": "Переглянути повну інформацію вашого профілю.",
"offline_access": "Дозволити офлайн-доступ до вашого облікового запису."
}
},
"error": {
"noUserCode": "Код користувача не надано!",
"noDeviceRequest": "Запит пристрою не знайдено.",
"unknownContext": "Не вдалося отримати контекст користувача. Переконайтеся, що спочатку ввели ім'я користувача або вкажіть loginName як параметр пошуку.",
"sessionExpired": "Ваш поточний сеанс закінчився. Будь ласка, увійдіть знову.",
"failedLoading": "Не вдалося завантажити дані. Будь ласка, спробуйте ще раз.",
"tryagain": "Спробувати ще раз",
"couldNotContinueSession": "Не вдалося продовжити сеанс - відсутня інформація про користувача",
"couldNotClearSession": "Не вдалося завершити сеанс. Будь ласка, спробуйте ще раз."
}
}