feat: distinct error for unverified email login (#11647)

<!--

Thank you for the PR! Please go through the checklist below and make
sure you've completed all the steps.

Please review the
[CONTRIBUTING.md](https://github.com/payloadcms/payload/blob/main/CONTRIBUTING.md)
document in this repository if you haven't already.

The following items will ensure that your PR is handled as smoothly as
possible:

- PR Title must follow conventional commits format. For example, `feat:
my new feature`, `fix(plugin-seo): my fix`.
- Minimal description explained as if explained to someone not
immediately familiar with the code.
- Provide before/after screenshots or code diffs if applicable.
- Link any related issues/discussions from GitHub or Discord.
- Add review comments if necessary to explain to the reviewer the logic
behind a change

### What?

### Why?

### How?

Fixes #

-->
### What?
This PR adds a new error to be thrown when logging in while having
`verify: true` set but no email has been verified for the user yet.

### Why?
To have a more descriptive, actionable error thrown in this case as
opposed to the generic "Invalid email or password." This gives users
more insight into why the login failed.

### How?
Introducing a new error: `UnverifiedEmail` and adjusting the check to be
separate from `if (!user) { ... }`.

Fixes #11358

Notes:
- In terms of account enumeration: this should not be a concern here as
the check for throwing this error comes _after_ the check for valid args
as well as the find for the user. This means that credentials must be on
hand, both an email and password, before seeing this error.
- I have an int test written in `/test/auth/int.spec.ts` for this,
however whenever I try to commit it I get an error stating that the
`eslint@9.14.0` module was not found during `lint-staged`.

<details>
  <summary>Int test</summary>
  
  ```ts
it('should respond with unverifiedEmail if email is unverified on
login', async () => {
    await payload.create({
      collection: publicUsersSlug,
      data: {
        email: 'user@example.com',
        password: 'test',
      },
    })

const response = await restClient.POST(`/${publicUsersSlug}/login`, {
      body: JSON.stringify({
        email: 'user@example.com',
        password: 'test',
      }),
    })

    expect(response.status).toBe(403)

    const responseData = await response.json()
expect(responseData.errors[0].message).toBe('Please verify your email
before logging in.')
  })
  ```
  
</details>

Demo of toast:

![Login-Payload-03-11-2025_11_52_PM-unverified-after](https://github.com/user-attachments/assets/55112f61-1d1f-41b9-93e6-8a4d66365b81)
This commit is contained in:
Said Akhrarov
2025-03-18 14:52:51 -04:00
committed by GitHub
parent a44a252f31
commit fd99a30bb6
42 changed files with 66 additions and 2 deletions

View File

@@ -9,7 +9,12 @@ import type { PayloadRequest, Where } from '../../types/index.js'
import type { User } from '../types.js'
import { buildAfterOperation } from '../../collections/operations/utils.js'
import { AuthenticationError, LockedAuth, ValidationError } from '../../errors/index.js'
import {
AuthenticationError,
LockedAuth,
UnverifiedEmail,
ValidationError,
} from '../../errors/index.js'
import { afterRead } from '../../fields/hooks/afterRead/index.js'
import { Forbidden } from '../../index.js'
import { killTransaction } from '../../utilities/killTransaction.js'
@@ -179,10 +184,14 @@ export const loginOperation = async <TSlug extends CollectionSlug>(
where: whereConstraint,
})
if (!user || (args.collection.config.auth.verify && user._verified === false)) {
if (!user) {
throw new AuthenticationError(req.t, Boolean(canLoginWithUsername && sanitizedUsername))
}
if (args.collection.config.auth.verify && user._verified === false) {
throw new UnverifiedEmail({ t: req.t })
}
user.collection = collectionConfig.slug
user._strategy = 'local-jwt'

View File

@@ -0,0 +1,15 @@
import type { TFunction } from '@payloadcms/translations'
import { en } from '@payloadcms/translations/languages/en'
import { status as httpStatus } from 'http-status'
import { APIError } from './APIError.js'
export class UnverifiedEmail extends APIError {
constructor({ t }: { t?: TFunction }) {
super(
t ? t('error:unverifiedEmail') : en.translations.error.unverifiedEmail,
httpStatus.FORBIDDEN,
)
}
}

View File

@@ -20,5 +20,6 @@ export { MissingFile } from './MissingFile.js'
export { NotFound } from './NotFound.js'
export { QueryError } from './QueryError.js'
export { ReservedFieldName } from './ReservedFieldName.js'
export { UnverifiedEmail } from './UnverifiedEmail.js'
export { ValidationError, ValidationErrorName } from './ValidationError.js'
export type { ValidationFieldError } from './ValidationError.js'

View File

@@ -15,4 +15,5 @@ export type ErrorName =
| 'MissingFile'
| 'NotFound'
| 'QueryError'
| 'UnverifiedEmail'
| 'ValidationError'

View File

@@ -81,6 +81,7 @@ export const clientTranslationKeys = createClientTranslationKeys([
'error:unauthorizedAdmin',
'error:unknown',
'error:unspecific',
'error:unverifiedEmail',
'error:userEmailAlreadyRegistered',
'error:usernameAlreadyRegistered',
'error:tokenNotProvided',

View File

@@ -119,6 +119,7 @@ export const arTranslations: DefaultTranslationsObject = {
unknown: 'حدث خطأ غير معروف.',
unPublishingDocument: 'حدث خطأ أثناء إلغاء نشر هذا المستند.',
unspecific: 'حدث خطأ.',
unverifiedEmail: 'يرجى التحقق من بريدك الإلكتروني قبل تسجيل الدخول.',
userEmailAlreadyRegistered: 'يوجد مستخدم مسجل بالفعل بهذا البريد الإلكتروني.',
userLocked: 'تمّ قفل هذا المستخدم نظرًا لوجود عدد كبير من محاولات تسجيل الدّخول الغير ناجحة.',
usernameAlreadyRegistered: 'المستخدم بالاسم المعطى مسجل بالفعل.',

View File

@@ -120,6 +120,7 @@ export const azTranslations: DefaultTranslationsObject = {
unknown: 'Naməlum bir xəta baş verdi.',
unPublishingDocument: 'Bu sənədin nəşrini ləğv etmək zamanı problem baş verdi.',
unspecific: 'Xəta baş verdi.',
unverifiedEmail: 'Zəhmət olmasa, daxil olmadan əvvəl e-poçtunuzu təsdiqləyin.',
userEmailAlreadyRegistered: 'Verilən e-poçt ünvanı ilə artıq istifadəçi qeydiyyatdan keçib.',
userLocked: 'Bu istifadəçi çoxsaylı uğursuz giriş cəhdləri səbəbindən kilidlənib.',
usernameAlreadyRegistered: 'Verilən istifadəçi adı ilə artıq qeydiyyatdan keçmişdir.',

View File

@@ -120,6 +120,7 @@ export const bgTranslations: DefaultTranslationsObject = {
unknown: 'Неизвестна грешка.',
unPublishingDocument: 'Имаше проблем при скриването на този документ.',
unspecific: 'Грешка.',
unverifiedEmail: 'Моля, потвърдете своя имейл, преди да влезете.',
userEmailAlreadyRegistered: 'Потребител с дадения имейл вече е регистриран.',
userLocked: 'Този потребител има прекалено много невалидни опити за влизане и е заключен.',
usernameAlreadyRegistered: 'Потребител със зададеното потребителско име вече е регистриран.',

View File

@@ -121,6 +121,7 @@ export const caTranslations: DefaultTranslationsObject = {
unknown: "S'ha produït un error desconegut.",
unPublishingDocument: 'Hi ha hagut un problema mentre es despublicava aquest document.',
unspecific: "S'ha produït un error.",
unverifiedEmail: 'Si us plau, verifica el teu correu electrònic abans diniciar sessió.',
userEmailAlreadyRegistered: 'Ja hi ha un usuari registrat amb aquest correu electrònic.',
userLocked: "Aquest usuari està bloquejat per massa intents fallits d'inici de sessió.",
usernameAlreadyRegistered: "Ja hi ha un usuari registrat amb aquest nom d'usuari.",

View File

@@ -120,6 +120,7 @@ export const csTranslations: DefaultTranslationsObject = {
unknown: 'Došlo k neznámé chybě.',
unPublishingDocument: 'Při zrušení publikování tohoto dokumentu došlo k chybě.',
unspecific: 'Došlo k chybě.',
unverifiedEmail: 'Před přihlášením ověřte svůj e-mail.',
userEmailAlreadyRegistered: 'Uživatel s daným e-mailem je již zaregistrován.',
userLocked: 'Tento uživatel je uzamčen kvůli příliš mnoha neúspěšným pokusům o přihlášení.',
usernameAlreadyRegistered: 'Uživatel se zadaným uživatelským jménem je již zaregistrován.',

View File

@@ -119,6 +119,7 @@ export const daTranslations: DefaultTranslationsObject = {
unknown: 'En ukendt fejl er opstået.',
unPublishingDocument: 'Der opstod et problem med at ophæve udgivelsen af dette dokument.',
unspecific: 'En fejl er opstået.',
unverifiedEmail: 'Bekræft venligst din e-mail, før du logger ind.',
userEmailAlreadyRegistered: 'Email allerede registreret.',
userLocked: 'Denne bruger er låst på grund af for mange fejlede loginforsøg',
usernameAlreadyRegistered: 'Brugernavn allerede registeret.',

View File

@@ -122,6 +122,7 @@ export const deTranslations: DefaultTranslationsObject = {
unknown: 'Ein unbekannter Fehler ist aufgetreten.',
unPublishingDocument: 'Es gab ein Problem, dieses Dokument auf Entwurf zu setzen.',
unspecific: 'Ein Fehler ist aufgetreten.',
unverifiedEmail: 'Bitte verifizieren Sie Ihre E-Mail, bevor Sie sich anmelden.',
userEmailAlreadyRegistered: 'Ein Benutzer mit der angegebenen E-Mail ist bereits registriert.',
userLocked:
'Dieser Benutzer ist auf Grund zu vieler unerfolgreicher Anmelde-Versuche gesperrt.',

View File

@@ -120,6 +120,7 @@ export const enTranslations = {
unknown: 'An unknown error has occurred.',
unPublishingDocument: 'There was a problem while un-publishing this document.',
unspecific: 'An error has occurred.',
unverifiedEmail: 'Please verify your email before logging in.',
userEmailAlreadyRegistered: 'A user with the given email is already registered.',
userLocked: 'This user is locked due to having too many failed login attempts.',
usernameAlreadyRegistered: 'A user with the given username is already registered.',

View File

@@ -120,6 +120,7 @@ export const esTranslations: DefaultTranslationsObject = {
unknown: 'Ocurrió un error desconocido.',
unPublishingDocument: 'Ocurrió un error al despublicar este documento.',
unspecific: 'Ocurrió un error.',
unverifiedEmail: 'Por favor, verifica tu correo electrónico antes de iniciar sesión.',
userEmailAlreadyRegistered:
'Ya hay un usuario registrado con el correo electrónico proporcionado.',
userLocked:

View File

@@ -119,6 +119,7 @@ export const etTranslations: DefaultTranslationsObject = {
unknown: 'Tekkis tundmatu viga.',
unPublishingDocument: 'Selle dokumendi avaldamise tühistamisel tekkis probleem.',
unspecific: 'Tekkis viga.',
unverifiedEmail: 'Palun kinnitage oma e-posti aadress enne sisselogimist.',
userEmailAlreadyRegistered: 'Selle e-posti aadressiga kasutaja on juba registreeritud.',
userLocked: 'See kasutaja on lukustatud liiga paljude ebaõnnestunud sisselogimiskatsete tõttu.',
usernameAlreadyRegistered: 'Selle kasutajanimega kasutaja on juba registreeritud.',

View File

@@ -118,6 +118,7 @@ export const faTranslations: DefaultTranslationsObject = {
unknown: 'یک خطای ناشناخته رخ داد.',
unPublishingDocument: 'هنگام لغو انتشار این سند خطایی رخ داد.',
unspecific: 'خطایی رخ داد.',
unverifiedEmail: 'لطفاً قبل از ورود، ایمیل خود را تأیید کنید.',
userEmailAlreadyRegistered: 'کاربری با ایمیل داده شده قبلاً ثبت نام کرده است.',
userLocked: 'این کاربر به دلیل تلاش های زیاد برای ورود ناموفق قفل شده است.',
usernameAlreadyRegistered: 'کاربری با نام کاربری داده شده قبلا ثبت نام کرده است.',

View File

@@ -124,6 +124,7 @@ export const frTranslations: DefaultTranslationsObject = {
unPublishingDocument:
'Un problème est survenu lors de lannulation de la publication de ce document.',
unspecific: 'Une erreur est survenue.',
unverifiedEmail: 'Veuillez vérifier votre e-mail avant de vous connecter.',
userEmailAlreadyRegistered: "Un utilisateur avec l'email donné est déjà enregistré.",
userLocked:
'Cet utilisateur est verrouillé en raison dun trop grand nombre de tentatives de connexion infructueuses.',

View File

@@ -117,6 +117,7 @@ export const heTranslations: DefaultTranslationsObject = {
unknown: 'אירעה שגיאה לא ידועה.',
unPublishingDocument: 'אירעה בעיה בביטול הפרסום של מסמך זה.',
unspecific: 'אירעה שגיאה.',
unverifiedEmail: 'אנא אמת את כתובת האימייל שלך לפני ההתחברות.',
userEmailAlreadyRegistered: 'משתמש עם האימייל הנתון כבר רשום.',
userLocked: 'המשתמש נעול עקב מספר נסיונות התחברות כושלים.',
usernameAlreadyRegistered: 'משתמש עם שם המשתמש שניתן כבר רשום.',

View File

@@ -121,6 +121,7 @@ export const hrTranslations: DefaultTranslationsObject = {
unknown: 'Došlo je do nepoznate pogreške.',
unPublishingDocument: 'Došlo je do problema pri poništavanju objave ovog dokumenta.',
unspecific: 'Došlo je do pogreške.',
unverifiedEmail: 'Molimo potvrdite svoju e-mail adresu prije prijave.',
userEmailAlreadyRegistered: 'Korisnik s navedenom e-mail adresom je već registriran.',
userLocked: 'Ovaj korisnik je zaključan zbog previše neuspješnih pokušaja prijave.',
usernameAlreadyRegistered: 'Korisnik s navedenim korisničkim imenom već je registriran.',

View File

@@ -122,6 +122,7 @@ export const huTranslations: DefaultTranslationsObject = {
unknown: 'Ismeretlen hiba történt.',
unPublishingDocument: 'Hiba történt a dokumentum közzétételének visszavonása közben.',
unspecific: 'Hiba történt.',
unverifiedEmail: 'Kérjük, erősítse meg e-mail címét, mielőtt bejelentkezik.',
userEmailAlreadyRegistered: 'A megadott email címmel már regisztráltak egy felhasználót.',
userLocked: 'Ez a felhasználó túl sok sikertelen bejelentkezési kísérlet miatt zárolva van.',
usernameAlreadyRegistered: 'Egy felhasználó a megadott felhasználónévvel már regisztrált.',

View File

@@ -124,6 +124,7 @@ export const itTranslations: DefaultTranslationsObject = {
unPublishingDocument:
"Si è verificato un problema durante l'annullamento della pubblicazione di questo documento.",
unspecific: 'Si è verificato un errore.',
unverifiedEmail: 'Verifica la tua email prima di accedere.',
userEmailAlreadyRegistered: "Un utente con l'email fornita è già registrato.",
userLocked: 'Questo utente è bloccato a causa di troppi tentativi di accesso non riusciti.',
usernameAlreadyRegistered: 'Un utente con il nome utente fornito è già registrato.',

View File

@@ -121,6 +121,7 @@ export const jaTranslations: DefaultTranslationsObject = {
unknown: '不明なエラーが発生しました。',
unPublishingDocument: 'このデータを非公開する際に問題が発生しました。',
unspecific: 'エラーが発生しました。',
unverifiedEmail: 'ログインする前にメールを確認してください。',
userEmailAlreadyRegistered: '指定されたメールのユーザーはすでに登録されています。',
userLocked: 'このユーザーは、ログイン試行回数が多すぎるため、ロックされています。',
usernameAlreadyRegistered: '指定されたユーザーネームのユーザーはすでに登録されています。',

View File

@@ -120,6 +120,7 @@ export const koTranslations: DefaultTranslationsObject = {
unknown: '알 수 없는 오류가 발생했습니다.',
unPublishingDocument: '이 문서의 게시 취소 중에 문제가 발생했습니다.',
unspecific: '오류가 발생했습니다.',
unverifiedEmail: '로그인하기 전에 이메일을 확인하세요.',
userEmailAlreadyRegistered: '주어진 이메일로 이미 등록된 사용자가 있습니다.',
userLocked: '이 사용자는 로그인 실패 횟수가 너무 많아 잠겼습니다.',
usernameAlreadyRegistered: '주어진 사용자 이름을 가진 사용자가 이미 등록되어 있습니다.',

View File

@@ -122,6 +122,7 @@ export const ltTranslations: DefaultTranslationsObject = {
unknown: 'Įvyko nežinoma klaida.',
unPublishingDocument: 'Šio dokumento nepublikuojant kildavo problema.',
unspecific: 'Įvyko klaida.',
unverifiedEmail: 'Prieš prisijungdami patvirtinkite savo el. paštą.',
userEmailAlreadyRegistered: 'Vartotojas su nurodytu el. paštu jau yra užregistruotas.',
userLocked: 'Šis vartotojas užrakintas dėl per daug nepavykusių prisijungimo bandymų.',
usernameAlreadyRegistered: 'Vartotojas su nurodytu vartotojo vardu jau užregistruotas.',

View File

@@ -120,6 +120,7 @@ export const myTranslations: DefaultTranslationsObject = {
unknown: 'ဘာမှန်းမသိသော error တက်သွားပါသည်။',
unPublishingDocument: 'ဖိုင်ကို ပြန်လည့် သိမ်းဆည်းခြင်းမှာ ပြဿနာရှိနေသည်။',
unspecific: 'Error တက်နေပါသည်။',
unverifiedEmail: 'ထည့်သွင်းမည်မဆိုမီ သင့်အီးမေးလ်ကို အတည်ပြုပါ။',
userEmailAlreadyRegistered: 'ပေးထားသော အီးမေးလ်ဖြင့် အသုံးပြုသူ တစ်ဦး ရှိပြီးဖြစ်သည်။',
userLocked:
'အကောင့်ထဲကို ဝင်ရန် အရမ်းအရမ်းကို ကြိုးပမ်းနေသောကြောင့် အကောင့်အား လော့ခ်ချလိုက်ပါသည်။',

View File

@@ -120,6 +120,7 @@ export const nbTranslations: DefaultTranslationsObject = {
unknown: 'En ukjent feil har oppstått.',
unPublishingDocument: 'Det oppstod et problem under avpublisering av dokumentet.',
unspecific: 'En feil har oppstått.',
unverifiedEmail: 'Vennligst bekreft e-posten din før du logger inn.',
userEmailAlreadyRegistered: 'En bruker med den oppgitte e-posten er allerede registrert.',
userLocked: 'Denne brukeren er låst på grunn av for mange mislykkede innloggingsforsøk.',
usernameAlreadyRegistered: 'En bruker med det gitte brukernavnet er allerede registrert.',

View File

@@ -122,6 +122,7 @@ export const nlTranslations: DefaultTranslationsObject = {
unknown: 'Er is een onbekende fout opgetreden.',
unPublishingDocument: 'Er was een probleem met het depubliceren van dit document.',
unspecific: 'Er is een fout opgetreden.',
unverifiedEmail: 'Verifieer uw e-mail voordat u inlogt.',
userEmailAlreadyRegistered: 'Een gebruiker met het opgegeven e-mailadres is al geregistreerd.',
userLocked: 'Deze gebruiker is vergrendeld wegens te veel mislukte inlogpogingen.',
usernameAlreadyRegistered: 'Een gebruiker met de opgegeven gebruikersnaam is al geregistreerd.',

View File

@@ -120,6 +120,7 @@ export const plTranslations: DefaultTranslationsObject = {
unknown: 'Wystąpił nieznany błąd.',
unPublishingDocument: 'Wystąpił problem podczas cofania publikacji tego dokumentu.',
unspecific: 'Wystąpił błąd',
unverifiedEmail: 'Proszę zweryfikować swój e-mail przed zalogowaniem się.',
userEmailAlreadyRegistered: 'Użytkownik o podanym adresie e-mail jest już zarejestrowany.',
userLocked: 'Ten użytkownik został zablokowany z powodu zbyt wielu nieudanych prób logowania.',
usernameAlreadyRegistered: 'Użytkownik o podanej nazwie użytkownika jest już zarejestrowany.',

View File

@@ -120,6 +120,7 @@ export const ptTranslations: DefaultTranslationsObject = {
unknown: 'Ocorreu um erro desconhecido.',
unPublishingDocument: 'Ocorreu um problema ao despublicar esse documento',
unspecific: 'Ocorreu um erro.',
unverifiedEmail: 'Por favor, verifique seu e-mail antes de fazer login.',
userEmailAlreadyRegistered: 'Um usuário com o email fornecido já está registrado.',
userLocked: 'Esse usuário está bloqueado devido a muitas tentativas de login malsucedidas.',
usernameAlreadyRegistered: 'Um usuário com o nome de usuário fornecido já está registrado.',

View File

@@ -122,6 +122,7 @@ export const roTranslations: DefaultTranslationsObject = {
unknown: 'S-a produs o eroare necunoscută.',
unPublishingDocument: 'A existat o problemă în timpul nepublicării acestui document.',
unspecific: 'S-a produs o eroare.',
unverifiedEmail: 'Vă rugăm să vă verificați e-mailul înainte de a vă autentifica.',
userEmailAlreadyRegistered: 'Un utilizator cu emailul dat este deja înregistrat.',
userLocked:
'Acest utilizator este blocat din cauza unui număr prea mare de încercări de autentificare eșuate.',

View File

@@ -121,6 +121,7 @@ export const rsTranslations: DefaultTranslationsObject = {
unknown: 'Дошло је до непознате грешке.',
unPublishingDocument: 'Постоји проблем при поништавању објаве овог документа.',
unspecific: 'Дошло је до грешке.',
unverifiedEmail: 'Молимо вас да верификујете своју е-пошту пре пријаве.',
userEmailAlreadyRegistered: 'Корисник са датом имејл адресом је већ регистрован.',
userLocked: 'Овај корисник је закључан због превеликог броја неуспешних покушаја пријаве.',
usernameAlreadyRegistered: 'Korisnik sa datim korisničkim imenom je već registrovan.',

View File

@@ -121,6 +121,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = {
unknown: 'Došlo je do nepoznate greške.',
unPublishingDocument: 'Postoji problem pri poništavanju objave ovog dokumenta.',
unspecific: 'Došlo je do greške.',
unverifiedEmail: 'Molimo vas da verifikujete svoju e-poštu pre prijave.',
userEmailAlreadyRegistered: 'Korisnik sa datom imejl adresom je već registrovan.',
userLocked: 'Ovaj korisnik je zaključan zbog prevelikog broja neuspešnih pokušaja prijave.',
usernameAlreadyRegistered: 'Korisnik sa datim korisničkim imenom je već registrovan.',

View File

@@ -121,6 +121,7 @@ export const ruTranslations: DefaultTranslationsObject = {
unknown: 'Произошла неизвестная ошибка.',
unPublishingDocument: 'При отмене публикации этого документа возникла проблема.',
unspecific: 'Произошла ошибка.',
unverifiedEmail: 'Пожалуйста, подтвердите свою электронную почту перед входом.',
userEmailAlreadyRegistered: 'Пользователь с указанным email уже зарегистрирован.',
userLocked:
'Этот пользователь заблокирован из-за слишком большого количества неудачных попыток входа.',

View File

@@ -122,6 +122,7 @@ export const skTranslations: DefaultTranslationsObject = {
unknown: 'Došlo k neznámej chybe.',
unPublishingDocument: 'Pri zrušení publikovania tohto dokumentu došlo k chybe.',
unspecific: 'Došlo k chybe.',
unverifiedEmail: 'Pred prihlásením si overte svoj e-mail.',
userEmailAlreadyRegistered: 'Používateľ s daným e-mailom je už zaregistrovaný.',
userLocked:
'Tento používateľ je uzamknutý kvôli príliš mnohým neúspešným pokusom o prihlásenie.',

View File

@@ -120,6 +120,7 @@ export const slTranslations: DefaultTranslationsObject = {
unknown: 'Prišlo je do neznane napake.',
unPublishingDocument: 'Pri umiku objave tega dokumenta je prišlo do težave.',
unspecific: 'Prišlo je do napake.',
unverifiedEmail: 'Pred prijavo preverite svoj e-poštni naslov.',
userEmailAlreadyRegistered: 'Uporabnik s tem e-poštnim naslovom je že registriran.',
userLocked: 'Ta uporabnik je zaklenjen zaradi prevelikega števila neuspešnih poskusov prijave.',
usernameAlreadyRegistered: 'Uporabnik s tem uporabniškim imenom je že registriran.',

View File

@@ -120,6 +120,7 @@ export const svTranslations: DefaultTranslationsObject = {
unknown: 'Ett okänt fel har uppstått.',
unPublishingDocument: 'Det uppstod ett problem när det här dokumentet skulle avpubliceras.',
unspecific: 'Ett fel har uppstått.',
unverifiedEmail: 'Vänligen verifiera din e-post innan du loggar in.',
userEmailAlreadyRegistered: 'En användare med den angivna e-postadressen är redan registrerad.',
userLocked: 'Den här användaren är låst på grund av för många misslyckade inloggningsförsök.',
usernameAlreadyRegistered: 'En användare med det angivna användarnamnet är redan registrerad.',

View File

@@ -118,6 +118,7 @@ export const thTranslations: DefaultTranslationsObject = {
unknown: 'เกิดปัญหาบางอย่างที่ไม่ทราบสาเหตุ',
unPublishingDocument: 'เกิดปัญหาระหว่างการยกเลิกการเผยแพร่เอกสารนี้',
unspecific: 'เกิดปัญหาบางอย่าง',
unverifiedEmail: 'กรุณายืนยันอีเมลของคุณก่อนเข้าสู่ระบบ',
userEmailAlreadyRegistered: 'ผู้ใช้ที่มีอีเมลดังกล่าวได้ลงทะเบียนแล้ว',
userLocked: 'บัญชีนี้ถูกล็อกเนื่องจากมีการพยายามเข้าสู่ระบบมากเกินไป',
usernameAlreadyRegistered: 'ผู้ใช้ที่มีชื่อผู้ใช้ที่ระบุไว้แล้วถูกลงทะเบียนเอาไว้แล้ว',

View File

@@ -121,6 +121,7 @@ export const trTranslations: DefaultTranslationsObject = {
unknown: 'Bilinmeyen bir hata oluştu.',
unPublishingDocument: 'Geçerli döküman yayından kaldırılırken bir sorun oluştu.',
unspecific: 'Bir hata oluştu.',
unverifiedEmail: 'Giriş yapmadan önce e-posta adresinizi doğrulayın.',
userEmailAlreadyRegistered: 'Verilen e-posta ile zaten kayıtlı bir kullanıcı var.',
userLocked:
'Hesabınız hatalı giriş denemeleri yüzünden geçici olarak kilitlendi. Lütfen daha sonra tekrar deneyin.',

View File

@@ -121,6 +121,7 @@ export const ukTranslations: DefaultTranslationsObject = {
unknown: 'Виникла невідома помилка.',
unPublishingDocument: 'Під час скасування публікації даного документа виникла помилка.',
unspecific: 'Виникла помилка.',
unverifiedEmail: 'Будь ласка, підтвердьте свою електронну пошту перед входом.',
userEmailAlreadyRegistered: 'Користувач із вказаною електронною поштою вже зареєстрований.',
userLocked: 'Цей користувач заблокований через велику кількість невдалих спроб входу.',
usernameAlreadyRegistered: 'Користувач з вказаним іменем користувача вже зареєстрований.',

View File

@@ -120,6 +120,7 @@ export const viTranslations: DefaultTranslationsObject = {
unknown: 'Lỗi - Không xác định (unknown error).',
unPublishingDocument: 'Lỗi - Đã xảy ra vấn để khi ẩn bản tài liệu.',
unspecific: 'Lỗi - Đã xảy ra (unspecific error).',
unverifiedEmail: 'Vui lòng xác minh email trước khi đăng nhập.',
userEmailAlreadyRegistered: 'Người dùng với email đã cho đã được đăng ký.',
userLocked: 'Lỗi- Tài khoản đã bị khóa do đăng nhập thất bại nhiều lần.',
usernameAlreadyRegistered: 'Một người dùng với tên đăng nhập đã cho đã được đăng ký.',

View File

@@ -115,6 +115,7 @@ export const zhTranslations: DefaultTranslationsObject = {
unknown: '发生了一个未知的错误。',
unPublishingDocument: '取消发布此文件时出现了问题。',
unspecific: '发生了一个错误。',
unverifiedEmail: '请在登录前验证您的电子邮件。',
userEmailAlreadyRegistered: '给定电子邮件的用户已经注册。',
userLocked: '该用户由于有太多次失败的登录尝试而被锁定。',
usernameAlreadyRegistered: '已有用户使用了该用户名进行注册。',

View File

@@ -115,6 +115,7 @@ export const zhTwTranslations: DefaultTranslationsObject = {
unknown: '發生了一個未知的錯誤。',
unPublishingDocument: '取消發布此文件時出現了問題。',
unspecific: '發生了一個錯誤。',
unverifiedEmail: '請在登入前驗證您的電子郵件。',
userEmailAlreadyRegistered: '給定電子郵件的用戶已經註冊。',
userLocked: '該使用者由於有太多次失敗的登錄嘗試而被鎖定。',
usernameAlreadyRegistered: '已有使用者使用所提供的用戶名註冊。',