feat: adds loginWithUsername option to auth config (#7000)

## Description

Adds `loginWithUsername` option to auth config. When set to true, it
will inject an `username` field into the collection config which
replaces the `email` field in the UI. The `email` field is still
required but not unique.

The `username` field can be extended by passing a field named `username`
to your auth collection. Anything added to this field will be combined
with the initial field.

- [X] I have read and understand the
[CONTRIBUTING.md](https://github.com/payloadcms/payload/blob/main/CONTRIBUTING.md)
document in this repository.

## Type of change

- [X] New feature (non-breaking change which adds functionality)

## Checklist:

- [X] Existing test suite passes locally with my changes

---------

Co-authored-by: Jarrod Flesch <jarrodmflesch@gmail.com>
This commit is contained in:
Jessica Chowdhury
2024-07-02 12:00:45 -04:00
committed by GitHub
parent 25d368a7db
commit 955b845725
64 changed files with 714 additions and 128 deletions

View File

@@ -10,6 +10,7 @@ function forgotPasswordResolver(collection: Collection): any {
collection,
data: {
email: args.email,
username: args.username,
},
disableEmail: args.disableEmail,
expiration: args.expiration,

View File

@@ -11,6 +11,7 @@ function loginResolver(collection: Collection): any {
data: {
email: args.email,
password: args.password,
username: args.username,
},
depth: 0,
req: isolateObjectProperty(context.req, 'transactionID'),

View File

@@ -453,6 +453,7 @@ function initCollectionsGraphQL({ config, graphqlResult }: InitCollectionsGraphQ
args: {
email: { type: GraphQLString },
password: { type: GraphQLString },
username: { type: GraphQLString },
},
resolve: login(collection),
}

View File

@@ -7,11 +7,18 @@ import { headersWithCors } from '../../../utilities/headersWithCors.js'
export const forgotPassword: CollectionRouteHandler = async ({ collection, req }) => {
const { t } = req
const authData = collection.config.auth?.loginWithUsername
? {
email: typeof req.data?.email === 'string' ? req.data.email : '',
username: typeof req.data?.username === 'string' ? req.data.username : '',
}
: {
email: typeof req.data?.email === 'string' ? req.data.email : '',
}
await forgotPasswordOperation({
collection,
data: {
email: req.data.email as string,
},
data: authData,
disableEmail: Boolean(req.data?.disableEmail),
expiration: typeof req.data.expiration === 'number' ? req.data.expiration : undefined,
req,

View File

@@ -9,13 +9,20 @@ import { headersWithCors } from '../../../utilities/headersWithCors.js'
export const login: CollectionRouteHandler = async ({ collection, req }) => {
const { searchParams, t } = req
const depth = searchParams.get('depth')
const authData = collection.config.auth?.loginWithUsername
? {
email: typeof req.data?.email === 'string' ? req.data.email : '',
password: typeof req.data?.password === 'string' ? req.data.password : '',
username: typeof req.data?.username === 'string' ? req.data.username : '',
}
: {
email: typeof req.data?.email === 'string' ? req.data.email : '',
password: typeof req.data?.password === 'string' ? req.data.password : '',
}
const result = await loginOperation({
collection,
data: {
email: typeof req.data?.email === 'string' ? req.data.email : '',
password: typeof req.data?.password === 'string' ? req.data.password : '',
},
data: authData,
depth: isNumber(depth) ? Number(depth) : undefined,
req,
})

View File

@@ -7,13 +7,22 @@ import { headersWithCors } from '../../../utilities/headersWithCors.js'
export const registerFirstUser: CollectionRouteHandler = async ({ collection, req }) => {
const { data, t } = req
const authData = collection.config.auth?.loginWithUsername
? {
email: typeof req.data?.email === 'string' ? req.data.email : '',
password: typeof req.data?.password === 'string' ? req.data.password : '',
username: typeof req.data?.username === 'string' ? req.data.username : '',
}
: {
email: typeof req.data?.email === 'string' ? req.data.email : '',
password: typeof req.data?.password === 'string' ? req.data.password : '',
}
const result = await registerFirstUserOperation({
collection,
data: {
...data,
email: typeof data?.email === 'string' ? data.email : '',
password: typeof data?.password === 'string' ? data.password : '',
...authData,
},
req,
})

View File

@@ -15,7 +15,7 @@ export const verifyEmail: CollectionRouteHandlerWithID = async ({ id, collection
return Response.json(
{
message: t('authentication:emailVerified'),
message: t('authentication:accountVerified'),
},
{
headers: headersWithCors({

View File

@@ -6,6 +6,7 @@ import {
ConfirmPasswordField,
EmailField,
PasswordField,
TextField,
useConfig,
useDocumentInfo,
useFormFields,
@@ -28,6 +29,7 @@ export const Auth: React.FC<Props> = (props) => {
collectionSlug,
disableLocalStrategy,
email,
loginWithUsername,
operation,
readOnly,
requirePassword,
@@ -96,14 +98,25 @@ export const Auth: React.FC<Props> = (props) => {
<div className={[baseClass, className].filter(Boolean).join(' ')}>
{!disableLocalStrategy && (
<React.Fragment>
<EmailField
autoComplete="email"
disabled={disabled}
label={t('general:email')}
name="email"
readOnly={readOnly}
required
/>
{!loginWithUsername && (
<EmailField
autoComplete="email"
disabled={disabled}
label={t('general:email')}
name="email"
readOnly={readOnly}
required
/>
)}
{loginWithUsername && (
<TextField
disabled={disabled}
label={t('authentication:username')}
name="username"
readOnly={readOnly}
required
/>
)}
{(changingPassword || requirePassword) && (
<div className={`${baseClass}__changing-password`}>
<PasswordField

View File

@@ -5,6 +5,7 @@ export type Props = {
collectionSlug: SanitizedCollectionConfig['slug']
disableLocalStrategy?: boolean
email: string
loginWithUsername: boolean
operation: 'create' | 'update'
readOnly: boolean
requirePassword?: boolean

View File

@@ -229,6 +229,7 @@ export const DefaultEditView: React.FC = () => {
collectionSlug={collectionConfig.slug}
disableLocalStrategy={collectionConfig.auth?.disableLocalStrategy}
email={data?.email}
loginWithUsername={auth?.loginWithUsername}
operation={operation}
readOnly={!hasSavePermission}
requirePassword={!id}

View File

@@ -3,8 +3,8 @@
import type { FormProps } from '@payloadcms/ui'
import type { FormState, PayloadRequest } from 'payload'
import { EmailField, Form, FormSubmit, useConfig, useTranslation } from '@payloadcms/ui'
import { email } from 'payload/shared'
import { EmailField, Form, FormSubmit, TextField, useConfig, useTranslation } from '@payloadcms/ui'
import { email, text } from 'payload/shared'
import React, { Fragment, useState } from 'react'
export const ForgotPasswordForm: React.FC = () => {
@@ -17,6 +17,8 @@ export const ForgotPasswordForm: React.FC = () => {
const { t } = useTranslation()
const [hasSubmitted, setHasSubmitted] = useState(false)
const collectionConfig = config.collections?.find((collection) => collection?.slug === userSlug)
const loginWithUsername = collectionConfig?.auth?.loginWithUsername
const handleResponse: FormProps['handleResponse'] = (res, successToast, errorToast) => {
res
@@ -26,17 +28,29 @@ export const ForgotPasswordForm: React.FC = () => {
successToast(t('general:submissionSuccessful'))
})
.catch(() => {
errorToast(t('authentication:emailNotValid'))
errorToast(
loginWithUsername
? t('authentication:usernameNotValid')
: t('authentication:emailNotValid'),
)
})
}
const initialState: FormState = {
email: {
initialValue: '',
valid: true,
value: undefined,
},
}
const initialState: FormState = loginWithUsername
? {
username: {
initialValue: '',
valid: true,
value: undefined,
},
}
: {
email: {
initialValue: '',
valid: true,
value: undefined,
},
}
if (hasSubmitted) {
return (
@@ -55,24 +69,53 @@ export const ForgotPasswordForm: React.FC = () => {
method="POST"
>
<h1>{t('authentication:forgotPassword')}</h1>
<p>{t('authentication:forgotPasswordEmailInstructions')}</p>
<EmailField
autoComplete="email"
label={t('general:email')}
name="email"
required
validate={(value) =>
email(value, {
name: 'email',
type: 'email',
data: {},
preferences: { fields: {} },
req: { t } as PayloadRequest,
required: true,
siblingData: {},
})
}
/>
<p>
{loginWithUsername
? t('authentication:forgotPasswordUsernameInstructions')
: t('authentication:forgotPasswordEmailInstructions')}
</p>
{loginWithUsername ? (
<TextField
label={t('authentication:username')}
name="username"
required
validate={(value) =>
text(value, {
name: 'username',
type: 'text',
data: {},
preferences: { fields: {} },
req: {
payload: {
config,
},
t,
} as PayloadRequest,
required: true,
siblingData: {},
})
}
/>
) : (
<EmailField
autoComplete="email"
label={t('general:email')}
name="email"
required
validate={(value) =>
email(value, {
name: 'email',
type: 'email',
data: {},
preferences: { fields: {} },
req: { t } as PayloadRequest,
required: true,
siblingData: {},
})
}
/>
)}
<FormSubmit>{t('general:submit')}</FormSubmit>
</Form>
)

View File

@@ -13,10 +13,11 @@ import {
Form,
FormSubmit,
PasswordField,
TextField,
useConfig,
useTranslation,
} from '@payloadcms/ui'
import { email, password } from 'payload/shared'
import { email, password, text } from 'payload/shared'
import './index.scss'
@@ -34,16 +35,14 @@ export const LoginForm: React.FC<{
routes: { admin, api },
} = config
const collectionConfig = config.collections?.find((collection) => collection?.slug === userSlug)
const loginWithUsername = collectionConfig?.auth?.loginWithUsername
const { t } = useTranslation()
const prefillForm = autoLogin && autoLogin.prefillOnly
const initialState: FormState = {
email: {
initialValue: prefillForm ? autoLogin.email : undefined,
valid: true,
value: prefillForm ? autoLogin.email : undefined,
},
password: {
initialValue: prefillForm ? autoLogin.password : undefined,
valid: true,
@@ -51,6 +50,20 @@ export const LoginForm: React.FC<{
},
}
if (loginWithUsername) {
initialState.username = {
initialValue: prefillForm ? autoLogin.username : undefined,
valid: true,
value: prefillForm ? autoLogin.username : undefined,
}
} else {
initialState.email = {
initialValue: prefillForm ? autoLogin.email : undefined,
valid: true,
value: prefillForm ? autoLogin.email : undefined,
}
}
return (
<Form
action={`${api}/${userSlug}/login`}
@@ -62,23 +75,47 @@ export const LoginForm: React.FC<{
waitForAutocomplete
>
<div className={`${baseClass}__inputWrap`}>
<EmailField
autoComplete="email"
label={t('general:email')}
name="email"
required
validate={(value) =>
email(value, {
name: 'email',
type: 'email',
data: {},
preferences: { fields: {} },
req: { t } as PayloadRequest,
required: true,
siblingData: {},
})
}
/>
{loginWithUsername ? (
<TextField
label={t('authentication:username')}
name="username"
required
validate={(value) =>
text(value, {
name: 'username',
type: 'text',
data: {},
preferences: { fields: {} },
req: {
payload: {
config,
},
t,
} as PayloadRequest,
required: true,
siblingData: {},
})
}
/>
) : (
<EmailField
autoComplete="email"
label={t('general:email')}
name="email"
required
validate={(value) =>
email(value, {
name: 'email',
type: 'email',
data: {},
preferences: { fields: {} },
req: { t } as PayloadRequest,
required: true,
siblingData: {},
})
}
/>
)}
<PasswordField
autoComplete="off"
label={t('general:password')}

View File

@@ -1,21 +1,6 @@
import type { Field } from '../../fields/config/types.js'
import { email } from '../../fields/validations.js'
const baseAuthFields: Field[] = [
{
name: 'email',
type: 'email',
admin: {
components: {
Field: () => null,
},
},
label: ({ t }) => t('general:email'),
required: true,
unique: true,
validate: email,
},
{
name: 'resetPasswordToken',
type: 'text',

View File

@@ -0,0 +1,38 @@
import type { Field } from '../../fields/config/types.js'
import { email } from '../../fields/validations.js'
export default (field: string): Field[] => {
const formattedFields = [
{
name: 'email',
type: 'email',
admin: {
components: {
Field: field === 'username' ? undefined : () => null,
},
},
label: ({ t }) => t('general:email'),
required: true,
unique: field === 'email' ? true : false,
validate: email,
},
] as Field[]
if (field === 'username') {
formattedFields.push({
name: 'username',
type: 'text',
admin: {
components: {
Field: () => null,
},
},
label: ({ t }) => t('authentication:username'),
required: true,
unique: true,
} as Field)
}
return formattedFields
}

View File

@@ -2,7 +2,11 @@ import crypto from 'crypto'
import httpStatus from 'http-status'
import { URL } from 'url'
import type { Collection } from '../../collections/config/types.js'
import type {
AuthOperationsFromCollectionSlug,
Collection,
} from '../../collections/config/types.js'
import type { CollectionSlug } from '../../index.js'
import type { PayloadRequest } from '../../types/index.js'
import { buildAfterOperation } from '../../collections/operations/utils.js'
@@ -11,12 +15,11 @@ import { commitTransaction } from '../../utilities/commitTransaction.js'
import { initTransaction } from '../../utilities/initTransaction.js'
import { killTransaction } from '../../utilities/killTransaction.js'
export type Arguments = {
export type Arguments<TSlug extends CollectionSlug> = {
collection: Collection
data: {
[key: string]: unknown
email: string
}
} & AuthOperationsFromCollectionSlug<TSlug>['forgotPassword']
disableEmail?: boolean
expiration?: number
req: PayloadRequest
@@ -24,9 +27,16 @@ export type Arguments = {
export type Result = string
export const forgotPasswordOperation = async (incomingArgs: Arguments): Promise<null | string> => {
if (!Object.prototype.hasOwnProperty.call(incomingArgs.data, 'email')) {
throw new APIError('Missing email.', httpStatus.BAD_REQUEST)
export const forgotPasswordOperation = async <TSlug extends CollectionSlug>(
incomingArgs: Arguments<TSlug>,
): Promise<null | string> => {
const loginWithUsername = incomingArgs.collection?.config?.auth?.loginWithUsername
if (!incomingArgs.data.email && !incomingArgs.data.username) {
throw new APIError(
`Missing ${loginWithUsername ? 'username' : 'email'}.`,
httpStatus.BAD_REQUEST,
)
}
let args = incomingArgs
@@ -68,21 +78,27 @@ export const forgotPasswordOperation = async (incomingArgs: Arguments): Promise<
// /////////////////////////////////////
let token: string = crypto.randomBytes(20).toString('hex')
type UserDoc = {
email?: string
id: number | string
resetPasswordExpiration?: string
resetPasswordToken?: string
}
if (!data.email) {
throw new APIError('Missing email.', httpStatus.BAD_REQUEST)
if (!data.email && !data.username) {
throw new APIError(
`Missing ${loginWithUsername ? 'username' : 'email'}.`,
httpStatus.BAD_REQUEST,
)
}
let user = await payload.db.findOne<UserDoc>({
collection: collectionConfig.slug,
req,
where: { email: { equals: data.email.toLowerCase() } },
where:
loginWithUsername && data?.username
? { username: { equals: data.username } }
: { email: { equals: data.email.toLowerCase() } },
})
// We don't want to indicate specifically that an email was not found,
@@ -133,7 +149,7 @@ export const forgotPasswordOperation = async (incomingArgs: Arguments): Promise<
from: `"${email.defaultFromName}" <${email.defaultFromAddress}>`,
html,
subject,
to: data.email,
to: loginWithUsername ? user.email : data.email,
})
}

View File

@@ -1,4 +1,5 @@
import type {
AuthOperationsFromCollectionSlug,
CollectionSlug,
DataFromCollectionSlug,
Payload,
@@ -14,10 +15,7 @@ import { loginOperation } from '../login.js'
export type Options<TSlug extends CollectionSlug> = {
collection: TSlug
context?: RequestContext
data: {
email: string
password: string
}
data: AuthOperationsFromCollectionSlug<TSlug>['login']
depth?: number
fallbackLocale?: string
locale?: string

View File

@@ -1,6 +1,10 @@
import jwt from 'jsonwebtoken'
import type { Collection, DataFromCollectionSlug } from '../../collections/config/types.js'
import type {
AuthOperationsFromCollectionSlug,
Collection,
DataFromCollectionSlug,
} from '../../collections/config/types.js'
import type { CollectionSlug } from '../../index.js'
import type { PayloadRequest } from '../../types/index.js'
import type { User } from '../types.js'
@@ -24,12 +28,9 @@ export type Result = {
user?: User
}
export type Arguments = {
export type Arguments<TSlug extends CollectionSlug> = {
collection: Collection
data: {
email: string
password: string
}
data: AuthOperationsFromCollectionSlug<TSlug>['login']
depth?: number
overrideAccess?: boolean
req: PayloadRequest
@@ -37,7 +38,7 @@ export type Arguments = {
}
export const loginOperation = async <TSlug extends CollectionSlug>(
incomingArgs: Arguments,
incomingArgs: Arguments<TSlug>,
): Promise<Result & { user: DataFromCollectionSlug<TSlug> }> => {
let args = incomingArgs
@@ -80,9 +81,22 @@ export const loginOperation = async <TSlug extends CollectionSlug>(
// Login
// /////////////////////////////////////
let user
const loginWithUsername = collectionConfig?.auth?.loginWithUsername
const { email: unsanitizedEmail, password } = data
const username = 'username' in data && data.username
if (typeof unsanitizedEmail !== 'string' || unsanitizedEmail.trim() === '') {
if (loginWithUsername && !username) {
throw new ValidationError({
collection: collectionConfig.slug,
errors: [{ field: 'username', message: req.i18n.t('validation:required') }],
})
}
if (
!loginWithUsername &&
(typeof unsanitizedEmail !== 'string' || unsanitizedEmail.trim() === '')
) {
throw new ValidationError({
collection: collectionConfig.slug,
errors: [{ field: 'email', message: req.i18n.t('validation:required') }],
@@ -97,14 +111,17 @@ export const loginOperation = async <TSlug extends CollectionSlug>(
const email = unsanitizedEmail ? unsanitizedEmail.toLowerCase().trim() : null
let user = await payload.db.findOne<any>({
user = await payload.db.findOne<any>({
collection: collectionConfig.slug,
req,
where: { email: { equals: email.toLowerCase() } },
where:
loginWithUsername && username
? { username: { equals: username } }
: { email: { equals: unsanitizedEmail.toLowerCase() } },
})
if (!user || (args.collection.config.auth.verify && user._verified === false)) {
throw new AuthenticationError(req.t)
throw new AuthenticationError(req.t, loginWithUsername)
}
if (user && isLocked(user.lockUntil)) {

View File

@@ -1,4 +1,5 @@
import type {
AuthOperationsFromCollectionSlug,
Collection,
DataFromCollectionSlug,
RequiredDataFromCollectionSlug,
@@ -13,10 +14,8 @@ import { killTransaction } from '../../utilities/killTransaction.js'
export type Arguments<TSlug extends CollectionSlug> = {
collection: Collection
data: RequiredDataFromCollectionSlug<TSlug> & {
email: string
password: string
}
data: RequiredDataFromCollectionSlug<TSlug> &
AuthOperationsFromCollectionSlug<TSlug>['registerFirstUser']
req: PayloadRequest
}

View File

@@ -20,23 +20,38 @@ export const registerLocalStrategy = async ({
payload,
req,
}: Args): Promise<Record<string, unknown>> => {
const loginWithUsername = collection?.auth?.loginWithUsername
const existingUser = await payload.find({
collection: collection.slug,
depth: 0,
limit: 1,
pagination: false,
req,
where: {
email: {
equals: doc.email,
},
},
where: loginWithUsername
? {
username: {
equals: doc.username,
},
}
: {
email: {
equals: doc.email,
},
},
})
if (existingUser.docs.length > 0) {
throw new ValidationError({
collection: collection.slug,
errors: [{ field: 'email', message: req.t('error:userEmailAlreadyRegistered') }],
errors: [
loginWithUsername
? {
field: 'username',
message: req.t('error:usernameAlreadyRegistered'),
}
: { field: 'email', message: req.t('error:userEmailAlreadyRegistered') },
],
})
}

View File

@@ -64,8 +64,9 @@ export type Permissions = {
export type User = {
[key: string]: any // This NEEDS to be an any, otherwise it breaks the Omit for ClientUser below
collection: string
email: string
email?: string
id: number | string
username?: string
}
/**
@@ -130,6 +131,7 @@ export interface IncomingAuthType {
generateEmailSubject?: GenerateForgotPasswordEmailSubject
}
lockTime?: number
loginWithUsername?: boolean
maxLoginAttempts?: number
removeTokenFromResponses?: true
strategies?: AuthStrategy[]

View File

@@ -54,6 +54,7 @@ export const authDefaults = {
},
forgotPassword: {},
lockTime: 600000, // 10 minutes
loginWithUsername: false,
maxLoginAttempts: 5,
tokenExpiration: 7200,
verify: false,

View File

@@ -6,6 +6,7 @@ import type { CollectionConfig, SanitizedCollectionConfig } from './types.js'
import baseAccountLockFields from '../../auth/baseFields/accountLock.js'
import baseAPIKeyFields from '../../auth/baseFields/apiKey.js'
import baseAuthFields from '../../auth/baseFields/auth.js'
import baseLoginField from '../../auth/baseFields/loginField.js'
import baseVerificationFields from '../../auth/baseFields/verification.js'
import { TimestampsRequired } from '../../errors/TimestampsRequired.js'
import { sanitizeFields } from '../../fields/config/sanitize.js'
@@ -135,6 +136,10 @@ export const sanitizeCollection = async (
}
if (!sanitized.auth.disableLocalStrategy) {
const loginField = sanitized.auth.loginWithUsername ? 'username' : 'email'
authFields = authFields.concat(baseLoginField(loginField))
authFields = authFields.concat(baseAuthFields)
if (sanitized.auth.verify) {

View File

@@ -92,6 +92,7 @@ const collectionSchema = joi.object().keys({
generateEmailSubject: joi.func(),
}),
lockTime: joi.number(),
loginWithUsername: joi.boolean(),
maxLoginAttempts: joi.number(),
removeTokenFromResponses: joi.boolean().valid(true),
strategies: joi.array().items(

View File

@@ -28,7 +28,7 @@ import type {
} from '../../config/types.js'
import type { DBIdentifierName } from '../../database/types.js'
import type { Field } from '../../fields/config/types.js'
import type { CollectionSlug, TypedCollection } from '../../index.js'
import type { CollectionSlug, TypedAuthOperations, TypedCollection } from '../../index.js'
import type { PayloadRequest, RequestContext } from '../../types/index.js'
import type { SanitizedUploadConfig, UploadConfig } from '../../uploads/types.js'
import type {
@@ -38,6 +38,8 @@ import type {
import type { AfterOperationArg, AfterOperationMap } from '../operations/utils.js'
export type DataFromCollectionSlug<TSlug extends CollectionSlug> = TypedCollection[TSlug]
export type AuthOperationsFromCollectionSlug<TSlug extends CollectionSlug> =
TypedAuthOperations[TSlug]
export type RequiredDataFromCollection<TData extends Record<string, any>> = MarkOptional<
TData,

View File

@@ -28,6 +28,7 @@ export default joi.object({
email: joi.string(),
password: joi.string(),
prefillOnly: joi.boolean(),
username: joi.string(),
}),
joi.boolean(),
),

View File

@@ -455,7 +455,7 @@ export type Config = {
* The email address of the user to login as
*
*/
email: string
email?: string
/** The password of the user to login as */
password: string
/**
@@ -464,6 +464,8 @@ export type Config = {
* @default false
*/
prefillOnly?: boolean
/** The username of the user to login as */
username?: string
}
| false
/** Set account profile picture. Options: gravatar, default or a custom React component. */

View File

@@ -6,9 +6,11 @@ import httpStatus from 'http-status'
import { APIError } from './APIError.js'
export class AuthenticationError extends APIError {
constructor(t?: TFunction) {
constructor(t?: TFunction, loginWithUsername?: boolean) {
super(
t ? t('error:emailOrPasswordIncorrect') : en.translations.error.emailOrPasswordIncorrect,
t
? `${loginWithUsername ? t('error:usernameOrPasswordIncorrect') : t('error:emailOrPasswordIncorrect')}`
: en.translations.error.emailOrPasswordIncorrect,
httpStatus.UNAUTHORIZED,
)
}

View File

@@ -66,6 +66,22 @@ import Logger from './utilities/logger.js'
import { serverInit as serverInitTelemetry } from './utilities/telemetry/events/serverInit.js'
export interface GeneratedTypes {
authUntyped: {
[slug: string]: {
forgotPassword: {
email: string
}
login: {
email: string
password: string
username?: string
}
registerFirstUser: {
email: string
password: string
}
}
}
collectionsUntyped: {
[slug: string]: TypeWithID & Record<string, unknown>
}
@@ -105,6 +121,10 @@ type ResolveUserType<T> = 'user' extends keyof T ? T['user'] : T['userUntyped']
export type TypedLocale = ResolveLocaleType<GeneratedTypes>
export type TypedUser = ResolveUserType<GeneratedTypes>
// @ts-expect-error
type ResolveAuthOperationsType<T> = 'auth' extends keyof T ? T['auth'] : T['authUntyped']
export type TypedAuthOperations = ResolveAuthOperationsType<GeneratedTypes>
const filename = fileURLToPath(import.meta.url)
const dirname = path.dirname(filename)
@@ -669,6 +689,7 @@ export type {
AfterReadHook as CollectionAfterReadHook,
AfterRefreshHook,
AuthCollection,
AuthOperationsFromCollectionSlug,
BeforeChangeHook as CollectionBeforeChangeHook,
BeforeDeleteHook as CollectionBeforeDeleteHook,
BeforeLoginHook as CollectionBeforeLoginHook,

View File

@@ -581,6 +581,89 @@ export function entityToJSONSchema(
}
}
function generateOperationJSONSchema(
config: SanitizedCollectionConfig,
operation: 'forgotPassword' | 'login' | 'registerFirstUser',
): JSONSchema4 {
const usernameLogin = config.auth?.loginWithUsername
const fieldType: JSONSchema4 = {
type: 'string',
}
let properties: JSONSchema4['properties'] = {}
switch (operation) {
case 'login': {
properties = {
password: fieldType,
[usernameLogin ? 'username' : 'email']: fieldType,
}
break
}
case 'forgotPassword': {
properties = {
[usernameLogin ? 'username' : 'email']: fieldType,
}
break
}
case 'registerFirstUser': {
properties = {
email: fieldType,
password: fieldType,
}
if (usernameLogin) properties.username = fieldType
break
}
}
return {
additionalProperties: false,
properties,
required: Object.keys(properties),
}
}
export function authCollectionToOperationsJSONSchema(
config: SanitizedCollectionConfig,
): JSONSchema4 {
const properties = {
forgotPassword: {
...generateOperationJSONSchema(config, 'forgotPassword'),
},
login: {
...generateOperationJSONSchema(config, 'login'),
},
registerFirstUser: {
...generateOperationJSONSchema(config, 'registerFirstUser'),
},
}
return {
type: 'object',
additionalProperties: false,
properties,
required: Object.keys(properties),
title: `${singular(toWords(`${config.slug}`, true))}AuthOperations`,
}
}
function generateAuthOperationSchemas(collections: SanitizedCollectionConfig[]): JSONSchema4 {
const properties = collections.reduce((acc, collection) => {
if (collection.auth) {
acc[collection.slug] = {
$ref: `#/definitions/auth/${collection.slug}`,
}
}
return acc
}, {})
return {
type: 'object',
additionalProperties: false,
properties,
required: Object.keys(properties),
}
}
/**
* This is used for generating the TypeScript types (payload-types.ts) with the payload generate:types command.
*/
@@ -601,18 +684,33 @@ export function configToJSONSchema(
return acc
}, {})
const authOperationDefinitions = [...config.collections]
.filter(({ auth }) => Boolean(auth))
.reduce(
(acc, authCollection) => {
acc.auth[authCollection.slug] = authCollectionToOperationsJSONSchema(authCollection)
return acc
},
{ auth: {} },
)
return {
additionalProperties: false,
definitions: { ...entityDefinitions, ...Object.fromEntries(interfaceNameDefinitions) },
definitions: {
...entityDefinitions,
...Object.fromEntries(interfaceNameDefinitions),
...authOperationDefinitions,
},
// These properties here will be very simple, as all the complexity is in the definitions. These are just the properties for the top-level `Config` type
type: 'object',
properties: {
auth: generateAuthOperationSchemas(config.collections),
collections: generateEntitySchemas(config.collections || []),
globals: generateEntitySchemas(config.globals || []),
locale: generateLocaleEntitySchemas(config.localization),
user: generateAuthEntitySchemas(config.collections),
},
required: ['user', 'locale', 'collections', 'globals'],
required: ['user', 'locale', 'collections', 'globals', 'auth'],
title: 'Config',
}
}

View File

@@ -7,6 +7,7 @@ function createClientTranslationKeys<T extends DefaultTranslationKeys[]>(keys: T
export const clientTranslationKeys = createClientTranslationKeys([
'authentication:account',
'authentication:accountOfCurrentUser',
'authentication:accountVerified',
'authentication:alreadyActivated',
'authentication:alreadyLoggedIn',
'authentication:apiKey',
@@ -19,6 +20,7 @@ export const clientTranslationKeys = createClientTranslationKeys([
'authentication:confirmPassword',
'authentication:createFirstUser',
'authentication:emailNotValid',
'authentication:usernameNotValid',
'authentication:emailSent',
'authentication:emailVerified',
'authentication:enableAPIKey',
@@ -26,6 +28,7 @@ export const clientTranslationKeys = createClientTranslationKeys([
'authentication:forceUnlock',
'authentication:forgotPassword',
'authentication:forgotPasswordEmailInstructions',
'authentication:forgotPasswordUsernameInstructions',
'authentication:forgotPasswordQuestion',
'authentication:generate',
'authentication:generateNewAPIKey',
@@ -49,6 +52,7 @@ export const clientTranslationKeys = createClientTranslationKeys([
'authentication:stayLoggedIn',
'authentication:successfullyRegisteredFirstUser',
'authentication:successfullyUnlocked',
'authentication:username',
'authentication:unableToVerify',
'authentication:tokenRefreshSuccessful',
'authentication:verified',
@@ -60,6 +64,8 @@ export const clientTranslationKeys = createClientTranslationKeys([
'error:autosaving',
'error:correctInvalidFields',
'error:deletingTitle',
'error:emailOrPasswordIncorrect',
'error:usernameOrPasswordIncorrect',
'error:loadingDocument',
'error:logoutFailed',
'error:noMatchedField',
@@ -71,6 +77,7 @@ export const clientTranslationKeys = createClientTranslationKeys([
'error:unknown',
'error:unspecific',
'error:userEmailAlreadyRegistered',
'error:usernameAlreadyRegistered',
'error:tokenNotProvided',
'error:unPublishingDocument',

View File

@@ -4,6 +4,7 @@ export const arTranslations: DefaultTranslationsObject = {
authentication: {
account: 'الحساب',
accountOfCurrentUser: 'حساب المستخدم الحالي',
accountVerified: 'تم التحقق من الحساب بنجاح.',
alreadyActivated: 'تمّ التّفعيل بالفعل',
alreadyLoggedIn: 'تمّ تسجيل الدّخول بالفعل',
apiKey: 'مفتاح API',
@@ -26,6 +27,8 @@ export const arTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'يرجى إدخال البريد الالكتروني أدناه. ستتلقّى رسالة بريد إلكتروني تحتوي على إرشادات حول كيفيّة إعادة تعيين كلمة المرور الخاصّة بك.',
forgotPasswordQuestion: 'هل نسيت كلمة المرور؟',
forgotPasswordUsernameInstructions:
'يرجى إدخال اسم المستخدم الخاص بك أدناه. سيتم إرسال تعليمات حول كيفية إعادة تعيين كلمة المرور الخاصة بك إلى عنوان البريد الإلكتروني المرتبط باسم المستخدم الخاص بك.',
generate: 'توليد',
generateNewAPIKey: 'توليد مفتاح API جديد',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const arTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'تمّ فتح القفل بنجاح',
tokenRefreshSuccessful: 'تم تجديد الرمز بنجاح.',
unableToVerify: 'غير قادر على التحقق من',
username: 'اسم المستخدم',
usernameNotValid: 'اسم المستخدم المقدم غير صالح',
verified: 'تمّ التحقّق',
verifiedSuccessfully: 'تمّ التحقّق بنجاح',
verify: 'قم بالتّحقّق',
@@ -112,6 +117,8 @@ export const arTranslations: DefaultTranslationsObject = {
unspecific: 'حدث خطأ.',
userEmailAlreadyRegistered: 'يوجد مستخدم مسجل بالفعل بهذا البريد الإلكتروني.',
userLocked: 'تمّ قفل هذا المستخدم نظرًا لوجود عدد كبير من محاولات تسجيل الدّخول الغير ناجحة.',
usernameAlreadyRegistered: 'المستخدم بالاسم المعطى مسجل بالفعل.',
usernameOrPasswordIncorrect: 'اسم المستخدم أو كلمة المرور التي تم تقديمها غير صحيحة.',
valueMustBeUnique: 'على القيمة أن تكون فريدة',
verificationTokenInvalid: 'رمز التحقّق غير صالح.',
},

View File

@@ -4,6 +4,7 @@ export const azTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Hesab',
accountOfCurrentUser: 'Cari istifadəçinin hesabı',
accountVerified: 'Hesab uğurla doğrulandı.',
alreadyActivated: 'Artıq Aktivləşdirilib',
alreadyLoggedIn: 'Artıq daxil olunub',
apiKey: 'API Açarı',
@@ -26,6 +27,8 @@ export const azTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Zəhmət olmasa, e-poçt ünvanınızı aşağıda daxil edin. Siz parolunuzu necə sıfırlamaq barədə təlimatları olan e-poçt mesajı alacaqsınız.',
forgotPasswordQuestion: 'Şifrəni unutmusan?',
forgotPasswordUsernameInstructions:
'Zəhmət olmasa, aşağıda istifadəçi adınızı daxil edin. İstifadəçi adınıza uyğun e-poçt ünvanınıza əlavə proqramın sıfırlanması ilə əlaqəli təlimatlar göndəriləcək.',
generate: 'Yarad',
generateNewAPIKey: 'Yeni API açarı yarad',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const azTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Uğurla kilidi açıldı',
tokenRefreshSuccessful: 'Tokenin yenilənməsi uğurlu oldu.',
unableToVerify: 'Doğrulamaq mümkün deyil',
username: 'İstifadəçi adı',
usernameNotValid: 'Təqdim edilən istifadəçi adı düzgün deyil',
verified: 'Doğrulanmış',
verifiedSuccessfully: 'Uğurla doğrulandı',
verify: 'Doğrula',
@@ -112,6 +117,8 @@ export const azTranslations: DefaultTranslationsObject = {
unspecific: 'Xəta baş verdi.',
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.',
usernameOrPasswordIncorrect: 'Təqdim edilən istifadəçi adı və ya şifrə yanlışdır.',
valueMustBeUnique: 'Dəyər təkrar olmamalıdır',
verificationTokenInvalid: 'Doğrulama tokenı yanlışdır.',
},

View File

@@ -4,6 +4,7 @@ export const bgTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Профил',
accountOfCurrentUser: 'Профил на текущия потребител',
accountVerified: 'Профилът е верифициран успешно.',
alreadyActivated: 'Вече активиран',
alreadyLoggedIn: 'Вече влязъл',
apiKey: 'API ключ',
@@ -26,6 +27,8 @@ export const bgTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Моля, въведи имейла си по-долу. Ще получиш съобщение с насоки как да промениш паролата си.',
forgotPasswordQuestion: 'Забравена парола?',
forgotPasswordUsernameInstructions:
'Моля, въведете вашето потребителско име по-долу. Инструкции как да възстановите паролата си ще бъдат изпратени на имейл адреса, асоцииран с вашето потребителско име.',
generate: 'Генерирай',
generateNewAPIKey: 'Генерирай нов API ключ',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const bgTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Успешно отключен',
tokenRefreshSuccessful: 'Освежаването на токена беше успешно.',
unableToVerify: 'Неуспешно потвърждение',
username: 'Потребителско име',
usernameNotValid: 'Предоставеното потребителско име не е валидно.',
verified: 'Потвърден',
verifiedSuccessfully: 'Потвърден успешно',
verify: 'Потвърди',
@@ -112,6 +117,8 @@ export const bgTranslations: DefaultTranslationsObject = {
unspecific: 'Грешка.',
userEmailAlreadyRegistered: 'Потребител с дадения имейл вече е регистриран.',
userLocked: 'Този потребител има прекалено много невалидни опити за влизане и е заключен.',
usernameAlreadyRegistered: 'Потребител със зададеното потребителско име вече е регистриран.',
usernameOrPasswordIncorrect: 'Предоставеното потребителско име или парола са неправилни.',
valueMustBeUnique: 'Стойността трябва да е уникална',
verificationTokenInvalid: 'Ключът за верификация е невалиден.',
},

View File

@@ -4,6 +4,7 @@ export const csTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Účet',
accountOfCurrentUser: 'Účet současného uživatele',
accountVerified: 'Účet byl úspěšně ověřen.',
alreadyActivated: 'Již aktivováno',
alreadyLoggedIn: 'Již přihlášen',
apiKey: 'API klíč',
@@ -26,6 +27,8 @@ export const csTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Zadejte svůj email níže. Obdržíte email s instrukcemi, jak resetovat vaše heslo.',
forgotPasswordQuestion: 'Zapomněli jste heslo?',
forgotPasswordUsernameInstructions:
'Zadejte níže své uživatelské jméno. Instrukce, jak obnovit vaše heslo, budou odeslány na e-mailovou adresu spojenou s vaším uživatelským jménem.',
generate: 'Generovat',
generateNewAPIKey: 'Generovat nový API klíč',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const csTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Úspěšně odemčeno',
tokenRefreshSuccessful: 'Obnovení tokenu úspěšné.',
unableToVerify: 'Nepodařilo se ověřit',
username: 'Uživatelské jméno',
usernameNotValid: 'Poskytnuté uživatelské jméno není platné.',
verified: 'Ověřeno',
verifiedSuccessfully: 'Úspěšně ověřeno',
verify: 'Ověřit',
@@ -112,6 +117,8 @@ export const csTranslations: DefaultTranslationsObject = {
unspecific: 'Došlo k chybě.',
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.',
usernameOrPasswordIncorrect: 'Zadané uživatelské jméno nebo heslo je nesprávné.',
valueMustBeUnique: 'Hodnota musí být jedinečná',
verificationTokenInvalid: 'Ověřovací token je neplatný.',
},

View File

@@ -4,6 +4,7 @@ export const deTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Konto',
accountOfCurrentUser: 'Aktuelles Benutzerkonto',
accountVerified: 'Konto erfolgreich verifiziert.',
alreadyActivated: 'Bereits aktiviert',
alreadyLoggedIn: 'Bereits angemeldet',
apiKey: 'API-Key',
@@ -26,6 +27,8 @@ export const deTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Bitte gib deine E-Mail-Adresse an. Du wirst eine E-Mail mit Instruktionen zum Zurücksetzen deines Passworts erhalten.',
forgotPasswordQuestion: 'Passwort vergessen?',
forgotPasswordUsernameInstructions:
'Bitte geben Sie unten Ihren Benutzernamen ein. Anweisungen zum Zurücksetzen Ihres Passworts werden an die mit Ihrem Benutzernamen verknüpfte E-Mail-Adresse gesendet.',
generate: 'Generieren',
generateNewAPIKey: 'Neuen API-Key generieren',
generatingNewAPIKeyWillInvalidate:
@@ -63,6 +66,8 @@ export const deTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Erfolgreich entsperrt',
tokenRefreshSuccessful: 'Token-Aktualisierung erfolgreich.',
unableToVerify: 'Konnte nicht verifiziert werden',
username: 'Benutzername',
usernameNotValid: 'Der angegebene Benutzername ist nicht gültig.',
verified: 'Verifiziert',
verifiedSuccessfully: 'Erfolgreich verifiziert',
verify: 'Verifizieren',
@@ -115,6 +120,9 @@ export const deTranslations: DefaultTranslationsObject = {
userEmailAlreadyRegistered: 'Ein Benutzer mit der angegebenen E-Mail ist bereits registriert.',
userLocked:
'Dieser Benutzer ist auf Grund zu vieler unerfolgreicher Anmelde-Versuche gesperrt.',
usernameAlreadyRegistered:
'Ein Benutzer mit dem angegebenen Benutzernamen ist bereits registriert.',
usernameOrPasswordIncorrect: 'Der angegebene Benutzername oder das Passwort ist falsch.',
valueMustBeUnique: 'Wert muss einzigartig sein',
verificationTokenInvalid: 'Verifizierungs-Token ist nicht korrekt.',
},

View File

@@ -4,6 +4,7 @@ export const enTranslations = {
authentication: {
account: 'Account',
accountOfCurrentUser: 'Account of current user',
accountVerified: 'Account verified successfully.',
alreadyActivated: 'Already Activated',
alreadyLoggedIn: 'Already logged in',
apiKey: 'API Key',
@@ -25,6 +26,10 @@ export const enTranslations = {
forgotPassword: 'Forgot Password',
forgotPasswordEmailInstructions:
'Please enter your email below. You will receive an email message with instructions on how to reset your password.',
forgotPasswordUsernameInstructions:
'Please enter your username below. Instructions on how to reset your password will be sent to email address associated with your username.',
usernameNotValid: 'The username provided is not valid',
forgotPasswordQuestion: 'Forgot password?',
generate: 'Generate',
generateNewAPIKey: 'Generate new API key',
@@ -60,6 +65,8 @@ export const enTranslations = {
successfullyRegisteredFirstUser: 'Successfully registered first user.',
successfullyUnlocked: 'Successfully unlocked',
tokenRefreshSuccessful: 'Token refresh successful.',
username: 'Username',
unableToVerify: 'Unable to Verify',
verified: 'Verified',
verifiedSuccessfully: 'Verified Successfully',
@@ -112,6 +119,8 @@ export const enTranslations = {
unspecific: 'An error has occurred.',
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.',
usernameOrPasswordIncorrect: 'The username or password provided is incorrect.',
valueMustBeUnique: 'Value must be unique',
verificationTokenInvalid: 'Verification token is invalid.',
},

View File

@@ -4,6 +4,7 @@ export const esTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Cuenta',
accountOfCurrentUser: 'Cuenta del usuario actual',
accountVerified: 'Cuenta verificada con éxito.',
alreadyActivated: 'Ya Activado',
alreadyLoggedIn: 'Sesión iniciada',
apiKey: 'Clave API',
@@ -26,6 +27,8 @@ export const esTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Por favor introduce tu correo electrónico. Recibirás un mensaje con las instrucciones para restablecer tu contraseña.',
forgotPasswordQuestion: '¿Olvidaste tu contraseña?',
forgotPasswordUsernameInstructions:
'Por favor, ingrese su nombre de usuario a continuación. Se enviarán instrucciones sobre cómo restablecer su contraseña a la dirección de correo electrónico asociada con su nombre de usuario.',
generate: 'Generar',
generateNewAPIKey: 'Generar Nueva Clave de API',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const esTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Desbloqueado correctamente',
tokenRefreshSuccessful: 'Actualización de token exitosa.',
unableToVerify: 'No se pudo Verificar',
username: 'Nombre de usuario',
usernameNotValid: 'El nombre de usuario proporcionado no es válido.',
verified: 'Verificado',
verifiedSuccessfully: 'Verificación Correcta',
verify: 'Verificar',
@@ -114,6 +119,10 @@ export const esTranslations: DefaultTranslationsObject = {
'Ya hay un usuario registrado con el correo electrónico proporcionado.',
userLocked:
'Este usuario ha sido bloqueado debido a que tiene muchos intentos fallidos para iniciar sesión.',
usernameAlreadyRegistered:
'Un usuario con el nombre de usuario proporcionado ya está registrado.',
usernameOrPasswordIncorrect:
'El nombre de usuario o la contraseña proporcionados son incorrectos.',
valueMustBeUnique: 'El valor debe ser único',
verificationTokenInvalid: 'Token de verificación inválido.',
},

View File

@@ -4,6 +4,7 @@ export const faTranslations: DefaultTranslationsObject = {
authentication: {
account: 'نمایه',
accountOfCurrentUser: 'نمایه کاربر فعلی',
accountVerified: 'حساب با موفقیت تایید شد.',
alreadyActivated: 'قبلاً فعال شده است',
alreadyLoggedIn: 'قبلاً وارد شده‌اید',
apiKey: 'کلید اِی‌پی‌آی',
@@ -26,6 +27,8 @@ export const faTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'لطفا نام کاربری یا نشانی رایانامه خود را وارد نمایید. شما یک پیام با دستورالعمل راه‌اندازی مجدد گذرواژه خود دریافت خواهید کرد.',
forgotPasswordQuestion: 'بازیابی گذرواژه؟',
forgotPasswordUsernameInstructions:
'لطفاً نام کاربری خود را در زیر وارد کنید. دستورالعمل هایی در خصوص تغییر رمز عبور به آدرس ایمیل مرتبط با نام کاربری شما ارسال خواهد شد.',
generate: 'ساخت',
generateNewAPIKey: 'ساخت کلید اِی‌پی‌آی تازه',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const faTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'با موفقیت باز شد',
tokenRefreshSuccessful: 'تازه سازی توکن موفق بود.',
unableToVerify: 'امکان تأیید نیست',
username: 'نام کاربری',
usernameNotValid: 'نام کاربری ارائه شده معتبر نیست',
verified: 'تأیید شده',
verifiedSuccessfully: 'با موفقیت تأیید شد',
verify: 'تأیید',
@@ -111,6 +116,8 @@ export const faTranslations: DefaultTranslationsObject = {
unspecific: 'خطایی رخ داد.',
userEmailAlreadyRegistered: 'کاربری با ایمیل داده شده قبلاً ثبت نام کرده است.',
userLocked: 'این کاربر به دلیل تلاش های زیاد برای ورود ناموفق قفل شده است.',
usernameAlreadyRegistered: 'کاربری با نام کاربری داده شده قبلا ثبت نام کرده است.',
usernameOrPasswordIncorrect: 'نام کاربری یا گذرواژه ارائه شده صحیح نیست.',
valueMustBeUnique: 'مقدار باید منحصر به فرد باشد',
verificationTokenInvalid: 'ژتون تأیید نامعتبر است.',
},

View File

@@ -4,6 +4,7 @@ export const frTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Compte',
accountOfCurrentUser: 'Compte de lutilisateur actuel',
accountVerified: 'Compte vérifié avec succès.',
alreadyActivated: 'Déjà activé',
alreadyLoggedIn: 'Déjà connecté',
apiKey: 'Clé API',
@@ -26,6 +27,8 @@ export const frTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Veuillez saisir votre e-mail ci-dessous. Vous recevrez un e-mail avec des instructions concernant comment réinitialiser votre mot de passe.',
forgotPasswordQuestion: 'Mot de passe oublié ?',
forgotPasswordUsernameInstructions:
"Veuillez entrer votre nom d'utilisateur ci-dessous. Les instructions sur comment réinitialiser votre mot de passe seront envoyées à l'adresse e-mail associée à votre nom d'utilisateur.",
generate: 'Générer',
generateNewAPIKey: 'Générer une nouvelle clé API',
generatingNewAPIKeyWillInvalidate:
@@ -63,6 +66,8 @@ export const frTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Déverrouillé avec succès',
tokenRefreshSuccessful: 'Actualisation du jeton réussie.',
unableToVerify: 'Vérification échouée',
username: "Nom d'utilisateur",
usernameNotValid: "Le nom d'utilisateur fourni n'est pas valide",
verified: 'Vérifié',
verifiedSuccessfully: 'Vérifié avec succès',
verify: 'Vérifier',
@@ -117,6 +122,9 @@ export const frTranslations: DefaultTranslationsObject = {
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.',
usernameAlreadyRegistered:
"Un utilisateur avec le nom d'utilisateur donné est déjà enregistré.",
usernameOrPasswordIncorrect: "Le nom d'utilisateur ou le mot de passe fourni est incorrect.",
valueMustBeUnique: 'La valeur doit être unique',
verificationTokenInvalid: 'Le jeton de vérification nest pas valide.',
},

View File

@@ -4,6 +4,7 @@ export const heTranslations: DefaultTranslationsObject = {
authentication: {
account: 'חשבון',
accountOfCurrentUser: 'חשבון המשתמש הנוכחי',
accountVerified: 'החשבון אומת בהצלחה.',
alreadyActivated: 'כבר הופעל',
alreadyLoggedIn: 'כבר מחובר',
apiKey: 'מפתח API',
@@ -25,6 +26,8 @@ export const heTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'אנא הזן את כתובת הדוא"ל שלך למטה. תקבל הודעה עם הוראות לאיפוס הסיסמה שלך.',
forgotPasswordQuestion: 'שכחת סיסמה?',
forgotPasswordUsernameInstructions:
'אנא הזן את שם המשתמש שלך למטה. הוראות על איך לאפס את הסיסמה שלך ישלחו לכתובת הדוא"ל המשויכת לשם המשתמש שלך.',
generate: 'יצירה',
generateNewAPIKey: 'יצירת מפתח API חדש',
generatingNewAPIKeyWillInvalidate:
@@ -60,6 +63,8 @@ export const heTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'נעילה בוטלה בהצלחה.',
tokenRefreshSuccessful: 'רענון הטוקן הצליח.',
unableToVerify: 'לא ניתן לאמת',
username: 'שם משתמש',
usernameNotValid: 'שם המשתמש שסופק אינו חוקי',
verified: 'אומת',
verifiedSuccessfully: 'אומת בהצלחה',
verify: 'אמת',
@@ -109,6 +114,8 @@ export const heTranslations: DefaultTranslationsObject = {
unspecific: 'אירעה שגיאה.',
userEmailAlreadyRegistered: 'משתמש עם האימייל הנתון כבר רשום.',
userLocked: 'המשתמש נעול עקב מספר נסיונות התחברות כושלים.',
usernameAlreadyRegistered: 'משתמש עם שם המשתמש שניתן כבר רשום.',
usernameOrPasswordIncorrect: 'שם המשתמש או הסיסמה שסופקו אינם נכונים.',
valueMustBeUnique: 'הערך חייב להיות ייחודי',
verificationTokenInvalid: 'טוקן אימות אינו תקין.',
},

View File

@@ -4,6 +4,7 @@ export const hrTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Račun',
accountOfCurrentUser: 'Račun od trenutnog korisnika',
accountVerified: 'Račun je uspješno verificiran.',
alreadyActivated: 'Već aktivirano',
alreadyLoggedIn: 'Već prijavljen',
apiKey: 'API ključ',
@@ -26,6 +27,8 @@ export const hrTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Molim unesite svoj email. Primit ćete poruku s uputama za ponovno postavljanje lozinke.',
forgotPasswordQuestion: 'Zaboravljena lozinka?',
forgotPasswordUsernameInstructions:
'Molimo unesite vaše korisničko ime ispod. Upute o tome kako resetirati vašu lozinku bit će poslane na e-adresu povezanu s vašim korisničkim imenom.',
generate: 'Generiraj',
generateNewAPIKey: 'Generiraj novi API ključ',
generatingNewAPIKeyWillInvalidate:
@@ -62,6 +65,8 @@ export const hrTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Uspješno otključano',
tokenRefreshSuccessful: 'Osvježavanje tokena uspješno.',
unableToVerify: 'Nije moguće potvrditi',
username: 'Korisničko ime',
usernameNotValid: 'Uneseno korisničko ime nije valjano.',
verified: 'Potvrđeno',
verifiedSuccessfully: 'Uspješno potvrđeno',
verify: 'Potvrdi',
@@ -113,6 +118,8 @@ export const hrTranslations: DefaultTranslationsObject = {
unspecific: 'Došlo je do pogreške.',
userEmailAlreadyRegistered: 'Korisnik s navedenom e-poštom 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.',
usernameOrPasswordIncorrect: 'Korisničko ime ili lozinka koju ste unijeli su netočni.',
valueMustBeUnique: 'Vrijednost mora biti jedinstvena.',
verificationTokenInvalid: 'Verifikacijski token je nevaljan.',
},

View File

@@ -4,6 +4,7 @@ export const huTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Fiók',
accountOfCurrentUser: 'Az aktuális felhasználó fiókja',
accountVerified: 'A fiók sikeresen hitelesítve.',
alreadyActivated: 'Már aktiválva van',
alreadyLoggedIn: 'Már bejelentkezett',
apiKey: 'API-kulcs',
@@ -26,6 +27,8 @@ export const huTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Kérjük, adja meg e-mail címét alább. Kapni fog egy e-mail üzenetet a jelszó visszaállításához szükséges utasításokkal.',
forgotPasswordQuestion: 'Elfelejtette jelszavát?',
forgotPasswordUsernameInstructions:
'Kérjük, adja meg felhasználónevét lentebb. A jelszó visszaállításáról szóló utasításokat a felhasználónevéhez tartozó e-mail címre küldjük.',
generate: 'Generálás',
generateNewAPIKey: 'Új API-kulcs generálása',
generatingNewAPIKeyWillInvalidate:
@@ -63,6 +66,8 @@ export const huTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Sikeresen feloldva',
tokenRefreshSuccessful: 'A token frissítése sikeres.',
unableToVerify: 'Sikertelen megerősítés',
username: 'Felhasználónév',
usernameNotValid: 'A megadott felhasználónév nem érvényes.',
verified: 'Megerősítve',
verifiedSuccessfully: 'Sikeresen megerősítve',
verify: 'Megerősítés',
@@ -114,6 +119,8 @@ export const huTranslations: DefaultTranslationsObject = {
unspecific: 'Hiba történt.',
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.',
usernameOrPasswordIncorrect: 'A megadott felhasználónév vagy jelszó helytelen.',
valueMustBeUnique: 'Az értéknek egyedinek kell lennie',
verificationTokenInvalid: 'Az ellenőrző token érvénytelen.',
},

View File

@@ -4,6 +4,7 @@ export const itTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Account',
accountOfCurrentUser: "Account dell'utente corrente",
accountVerified: 'Account verificato con successo.',
alreadyActivated: 'Già Attivato',
alreadyLoggedIn: 'Sei già loggato',
apiKey: 'Chiave API',
@@ -26,6 +27,8 @@ export const itTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Inserisci la tua mail qui sotto. Riceverai un messaggio email con le istruzioni su come cambiare la tua password.',
forgotPasswordQuestion: 'Password dimenticata?',
forgotPasswordUsernameInstructions:
"Inserisci il tuo nome utente qui sotto. Le istruzioni su come reimpostare la tua password verranno inviate all'indirizzo email associato al tuo nome utente.",
generate: 'Genera',
generateNewAPIKey: 'Genera una nuova Chiave API',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const itTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Sbloccato con successo',
tokenRefreshSuccessful: 'Aggiornamento del token riuscito.',
unableToVerify: 'Impossibile verificare',
username: 'Nome utente',
usernameNotValid: 'Il nome utente fornito non è valido',
verified: 'Verificato',
verifiedSuccessfully: 'Verificato con successo',
verify: 'Verifica',
@@ -115,6 +120,8 @@ export const itTranslations: DefaultTranslationsObject = {
unspecific: 'Si è verificato un errore.',
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.',
usernameOrPasswordIncorrect: 'Il nome utente o la password forniti sono incorretti.',
valueMustBeUnique: 'Il valore deve essere univoco',
verificationTokenInvalid: 'Il token di verifica non è valido.',
},

View File

@@ -4,6 +4,7 @@ export const jaTranslations: DefaultTranslationsObject = {
authentication: {
account: 'アカウント',
accountOfCurrentUser: '現在のユーザーアカウント',
accountVerified: 'アカウントが正常に確認されました。',
alreadyActivated: 'すでに有効です',
alreadyLoggedIn: 'すでにログインしています',
apiKey: 'API Key',
@@ -26,6 +27,8 @@ export const jaTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'アカウントのメールアドレスを以下に入力してください。パスワードの再設定方法が記載されたメールが届きます。',
forgotPasswordQuestion: 'パスワードをお忘れですか?',
forgotPasswordUsernameInstructions:
'以下にユーザー名を入力してください。パスワードのリセット方法については、ユーザー名に関連付けられたメールアドレスに送信されます。',
generate: '生成',
generateNewAPIKey: '新しいAPI Keyを生成',
generatingNewAPIKeyWillInvalidate:
@@ -62,6 +65,8 @@ export const jaTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'ロックの解除に成功しました。',
tokenRefreshSuccessful: 'トークンの更新が成功しました。',
unableToVerify: '検証ができません',
username: 'ユーザー名',
usernameNotValid: '提供されたユーザーネームは無効です',
verified: '検証済み',
verifiedSuccessfully: '検証が成功しました',
verify: '検証',
@@ -113,6 +118,8 @@ export const jaTranslations: DefaultTranslationsObject = {
unspecific: 'エラーが発生しました。',
userEmailAlreadyRegistered: '指定されたメールのユーザーはすでに登録されています。',
userLocked: 'このユーザーは、ログイン試行回数が多すぎるため、ロックされています。',
usernameAlreadyRegistered: '指定されたユーザーネームのユーザーはすでに登録されています。',
usernameOrPasswordIncorrect: '提供されたユーザー名またはパスワードが間違っています。',
valueMustBeUnique: 'ユニークな値である必要があります。',
verificationTokenInvalid: '認証トークンが無効です。',
},

View File

@@ -4,6 +4,7 @@ export const koTranslations: DefaultTranslationsObject = {
authentication: {
account: '계정',
accountOfCurrentUser: '현재 사용자의 계정',
accountVerified: '계정이 성공적으로 인증되었습니다.',
alreadyActivated: '이미 활성화됨',
alreadyLoggedIn: '이미 로그인됨',
apiKey: 'API 키',
@@ -26,6 +27,8 @@ export const koTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'아래에 이메일을 입력하세요. 비밀번호를 재설정하는 방법에 대한 안내가 포함된 이메일 메시지를 받게 될 것입니다.',
forgotPasswordQuestion: '비밀번호를 잊으셨나요?',
forgotPasswordUsernameInstructions:
'아래에 사용자 이름을 입력해 주세요. 암호를 재설정하는 방법에 대한 지침은 사용자 이름과 관련된 이메일 주소로 발송됩니다.',
generate: '생성',
generateNewAPIKey: '새로운 API 키 생성',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const koTranslations: DefaultTranslationsObject = {
successfullyUnlocked: '잠금 해제 성공',
tokenRefreshSuccessful: '토큰 새로 고침이 성공했습니다.',
unableToVerify: '확인할 수 없음',
username: '사용자 이름',
usernameNotValid: '제공된 사용자 이름이 유효하지 않습니다.',
verified: '확인됨',
verifiedSuccessfully: '성공적으로 확인됨',
verify: '확인',
@@ -112,6 +117,8 @@ export const koTranslations: DefaultTranslationsObject = {
unspecific: '오류가 발생했습니다.',
userEmailAlreadyRegistered: '주어진 이메일로 이미 등록된 사용자가 있습니다.',
userLocked: '이 사용자는 로그인 실패 횟수가 너무 많아 잠겼습니다.',
usernameAlreadyRegistered: '주어진 사용자 이름을 가진 사용자가 이미 등록되어 있습니다.',
usernameOrPasswordIncorrect: '제공된 사용자 이름 또는 비밀번호가 잘못되었습니다.',
valueMustBeUnique: '값은 고유해야 합니다.',
verificationTokenInvalid: '확인 토큰이 유효하지 않습니다.',
},

View File

@@ -4,6 +4,7 @@ export const myTranslations: DefaultTranslationsObject = {
authentication: {
account: 'အကောင့်',
accountOfCurrentUser: 'သင့် အကောင့်',
accountVerified: 'Akaun telah disahkan dengan jayanya.',
alreadyActivated: 'အတည်ပြုပြီး',
alreadyLoggedIn: 'ဝင်ရောက်ပြီးသား',
apiKey: 'API Key',
@@ -26,6 +27,8 @@ export const myTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'ကျေးဇူးပြု၍ သင့်အီးမေးလ်ကို ထည့်သွင်းပါ။ သင့်စကားဝှက်ကို ပြန်လည်သတ်မှတ်နိုင်ရန် အီးမေးလ်စာတစ်စောင်ကို သင်လက်ခံရရှိမည်ဖြစ်သည်။',
forgotPasswordQuestion: 'စကားဝှက် မေ့နေပါသလား။',
forgotPasswordUsernameInstructions:
'Sila masukkan nama pengguna anda di bawah. Arahan mengenai bagaimana untuk menetapkan semula kata laluan anda akan dihantar ke alamat emel yang dikaitkan dengan nama pengguna anda.',
generate: 'Generate',
generateNewAPIKey: 'API key အသစ်ဖန်တီးရန်',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const myTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'အောင်မြင်စွာသော့ဖွင့်ခဲ့သည်။',
tokenRefreshSuccessful: 'Token refresh berhasil.',
unableToVerify: 'စိစစ်၍မရပါ။',
username: 'Nama pengguna',
usernameNotValid: 'ပေးထားသော အသုံးပြုသူအမည်မှာ တရားဝင်မှု မရှိပါ။',
verified: 'စိစစ်ပြီး',
verifiedSuccessfully: 'အတည်ပြုပြီးပါပြီ။',
verify: 'စိစစ်ခြင်း',
@@ -113,6 +118,8 @@ export const myTranslations: DefaultTranslationsObject = {
userEmailAlreadyRegistered: 'ပေးထားသော အီးမေးလ်ဖြင့် အသုံးပြုသူ တစ်ဦး ရှိပြီးဖြစ်သည်။',
userLocked:
'အကောင့်ထဲကို ဝင်ရန် အရမ်းအရမ်းကို ကြိုးပမ်းနေသောကြောင့် အကောင့်အား လော့ခ်ချလိုက်ပါသည်။',
usernameAlreadyRegistered: 'Pengguna dengan nama pengguna yang diberikan sudah mendaftar.',
usernameOrPasswordIncorrect: 'Nama pengguna atau kata laluan yang diberikan tidak betul.',
valueMustBeUnique: 'value သည် အဓိပ္ပာယ်ရှိရပါမည်။',
verificationTokenInvalid: 'အတည်ပြုခြင်းတိုကင်သည် မမှန်ကန်ပါ။',
},

View File

@@ -4,6 +4,7 @@ export const nbTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Konto',
accountOfCurrentUser: 'Konto til nåværende bruker',
accountVerified: 'Konto bekreftet vellykket.',
alreadyActivated: 'Allerede aktivert',
alreadyLoggedIn: 'Allerede logget inn',
apiKey: 'API-nøkkel',
@@ -26,6 +27,8 @@ export const nbTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Skriv inn e-postadressen din nedenfor, og vi vil sende deg en e-post med instruksjoner om hvordan du tilbakestiller passordet ditt.',
forgotPasswordQuestion: 'Glemt passord?',
forgotPasswordUsernameInstructions:
'Vennligst skriv inn brukernavnet ditt nedenfor. Instruksjoner om hvordan du tilbakestiller passordet ditt vil bli sendt til e-postadressen som er knyttet til brukernavnet ditt.',
generate: 'Generer',
generateNewAPIKey: 'Generer ny API-nøkkel',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const nbTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Låst opp',
tokenRefreshSuccessful: 'Token-oppdatering vellykket.',
unableToVerify: 'Kunne ikke bekrefte',
username: 'Brukernavn',
usernameNotValid: 'Brukernavnet som er oppgitt er ikke gyldig.',
verified: 'Bekreftet',
verifiedSuccessfully: 'Bekreftet',
verify: 'Bekreft',
@@ -112,6 +117,8 @@ export const nbTranslations: DefaultTranslationsObject = {
unspecific: 'En feil har oppstått.',
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.',
usernameOrPasswordIncorrect: 'Brukernavnet eller passordet som ble oppgitt er feil.',
valueMustBeUnique: 'Verdien må være unik',
verificationTokenInvalid: 'Verifiseringskoden er ugyldig.',
},

View File

@@ -4,6 +4,7 @@ export const nlTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Account',
accountOfCurrentUser: 'Account van huidige gebruiker',
accountVerified: 'Account succesvol geverifieerd.',
alreadyActivated: 'Al geactiveerd',
alreadyLoggedIn: 'Al ingelogd',
apiKey: 'API-sleutel',
@@ -26,6 +27,8 @@ export const nlTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Vul hieronder uw e-mailadres in. U ontvangt een e-mailbericht met instructies om uw wachtwoord opnieuw in te stellen.',
forgotPasswordQuestion: 'Wachtwoord vergeten?',
forgotPasswordUsernameInstructions:
'Voer hieronder uw gebruikersnaam in. Instructies over hoe u uw wachtwoord kunt resetten, worden naar het e-mailadres gestuurd dat aan uw gebruikersnaam is gekoppeld.',
generate: 'Genereren',
generateNewAPIKey: 'Genereer nieuwe API-sleutel',
generatingNewAPIKeyWillInvalidate:
@@ -62,6 +65,8 @@ export const nlTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Succesvol ontgrendeld',
tokenRefreshSuccessful: 'Token vernieuwing succesvol.',
unableToVerify: 'Verificatie niet mogelijk',
username: 'Gebruikersnaam',
usernameNotValid: 'De opgegeven gebruikersnaam is niet geldig',
verified: 'Geverifieerd',
verifiedSuccessfully: 'Succesvol geverifieerd',
verify: 'Verifiëren',
@@ -113,6 +118,8 @@ export const nlTranslations: DefaultTranslationsObject = {
unspecific: 'Er is een fout opgetreden.',
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.',
usernameOrPasswordIncorrect: 'De opgegeven gebruikersnaam of wachtwoord is onjuist.',
valueMustBeUnique: 'De waarde moet uniek zijn',
verificationTokenInvalid: 'Verificatietoken is ongeldig.',
},

View File

@@ -4,6 +4,7 @@ export const plTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Konto',
accountOfCurrentUser: 'Konto bieżącego użytkownika',
accountVerified: 'Konto zweryfikowane pomyślnie.',
alreadyActivated: 'Już aktywowano',
alreadyLoggedIn: 'Już zalogowano',
apiKey: 'Klucz API',
@@ -26,6 +27,8 @@ export const plTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Proszę podaj swój email. Otrzymasz wiadomość z instrukcjami, jak zresetować hasło.',
forgotPasswordQuestion: 'Nie pamiętasz hasła?',
forgotPasswordUsernameInstructions:
'Proszę wpisać poniżej swoją nazwę użytkownika. Instrukcje dotyczące resetowania hasła zostaną wysłane na adres e-mail powiązany z Twoją nazwą użytkownika.',
generate: 'Wygeneruj',
generateNewAPIKey: 'Wygeneruj nowy klucz API',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const plTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Pomyślnie odblokowano',
tokenRefreshSuccessful: 'Odświeżenie tokenu powiodło się.',
unableToVerify: 'Nie można zweryfikować',
username: 'Nazwa użytkownika',
usernameNotValid: 'Podana nazwa użytkownika nie jest prawidłowa.',
verified: 'Zweryfikowano',
verifiedSuccessfully: 'Pomyślnie zweryfikowany',
verify: 'Zweryfikuj',
@@ -112,6 +117,8 @@ export const plTranslations: DefaultTranslationsObject = {
unspecific: 'Wystąpił błąd',
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.',
usernameOrPasswordIncorrect: 'Podana nazwa użytkownika lub hasło jest nieprawidłowe.',
valueMustBeUnique: 'Wartość musi być unikalna',
verificationTokenInvalid: 'Token weryfikacyjny jest nieprawidłowy.',
},

View File

@@ -4,6 +4,7 @@ export const ptTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Conta',
accountOfCurrentUser: 'Conta do usuário ativo',
accountVerified: 'Conta verificada com sucesso.',
alreadyActivated: 'Conta já ativada',
alreadyLoggedIn: 'Login já realizado',
apiKey: 'Chave da API',
@@ -26,6 +27,8 @@ export const ptTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Por favor, preencha seu email abaixo. Você receberá um email com instruções para gerar uma nova senha',
forgotPasswordQuestion: 'Esqueceu a senha?',
forgotPasswordUsernameInstructions:
'Digite seu nome de usuário abaixo. Instruções sobre como redefinir sua senha serão enviadas para o endereço de e-mail associado ao seu nome de usuário.',
generate: 'Gerar',
generateNewAPIKey: 'Gerar nova chave API',
generatingNewAPIKeyWillInvalidate:
@@ -62,6 +65,8 @@ export const ptTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Desbloqueado com sucesso',
tokenRefreshSuccessful: 'Atualização do token bem-sucedida.',
unableToVerify: 'Não foi possível verificar',
username: 'Nome de usuário',
usernameNotValid: 'O nome de usuário fornecido não é válido',
verified: 'Verificado',
verifiedSuccessfully: 'Verificado com Sucesso',
verify: 'Verificar',
@@ -113,6 +118,8 @@ export const ptTranslations: DefaultTranslationsObject = {
unspecific: 'Ocorreu um erro.',
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.',
usernameOrPasswordIncorrect: 'O nome de usuário ou senha fornecidos estão incorretos.',
valueMustBeUnique: 'Valor deve ser único',
verificationTokenInvalid: 'Token de verificação inválido.',
},

View File

@@ -4,6 +4,7 @@ export const roTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Cont',
accountOfCurrentUser: 'Contul utilizatorului curent',
accountVerified: 'Contul a fost verificat cu succes.',
alreadyActivated: 'Deja activat',
alreadyLoggedIn: 'Deja autorizat',
apiKey: 'Cheia API',
@@ -26,6 +27,8 @@ export const roTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Vă rugăm să introduceți emailul dumneavoastră mai jos. Veți primi un mesaj de email cu instrucțiuni despre cum să vă resetați parola.',
forgotPasswordQuestion: 'Ați uitat parola?',
forgotPasswordUsernameInstructions:
'Vă rugăm să introduceți numele de utilizator mai jos. Instrucțiunile despre cum să vă resetați parola vor fi trimise la adresa de e-mail asociată cu numele dvs. de utilizator.',
generate: 'Generează',
generateNewAPIKey: 'Generează o nouă cheie API',
generatingNewAPIKeyWillInvalidate:
@@ -63,6 +66,8 @@ export const roTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Deblocat cu succes',
tokenRefreshSuccessful: 'Reîmprospătarea tokenului a fost efectuată cu succes.',
unableToVerify: 'Nu se poate verifica',
username: 'Nume de utilizator',
usernameNotValid: 'Numele de utilizator furnizat nu este valid.',
verified: 'Verificat',
verifiedSuccessfully: 'Verificat cu succes',
verify: 'Verifică',
@@ -115,6 +120,9 @@ export const roTranslations: DefaultTranslationsObject = {
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.',
usernameAlreadyRegistered:
'Un utilizator cu numele de utilizator furnizat este deja înregistrat.',
usernameOrPasswordIncorrect: 'Numele de utilizator sau parola furnizate sunt incorecte.',
valueMustBeUnique: 'Valoarea trebuie să fie unică',
verificationTokenInvalid: 'Tokenul de verificare este invalid.',
},

View File

@@ -4,6 +4,7 @@ export const rsTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Налог',
accountOfCurrentUser: 'Налог тренутног корисника',
accountVerified: 'Nalog je uspešno verifikovan.',
alreadyActivated: 'Већ активирано',
alreadyLoggedIn: 'Већ пријављен',
apiKey: 'АПИ кључ',
@@ -25,6 +26,8 @@ export const rsTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Молимо Вас да унесете својy адресy е-поште. Примићете поруку са упутством за поновно постављање лозинке.',
forgotPasswordQuestion: 'Заборављена лозинка?',
forgotPasswordUsernameInstructions:
'Unesite svoje korisničko ime ispod. Uputstva o tome kako da resetujete svoju lozinku biće poslata na e-mail adresu koja je povezana sa vašim korisničkim imenom.',
generate: 'Генериши',
generateNewAPIKey: 'Генериши нови АПИ кључ',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const rsTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Успешно откључано',
tokenRefreshSuccessful: 'Osvežavanje tokena je uspešno.',
unableToVerify: 'Није могуће потврдити',
username: 'Korisničko ime',
usernameNotValid: 'Korisničko ime koje ste uneli nije važeće.',
verified: 'Потврђено',
verifiedSuccessfully: 'Успешно потврђено',
verify: 'Потврди',
@@ -112,6 +117,8 @@ export const rsTranslations: DefaultTranslationsObject = {
unspecific: 'Дошло је до грешке.',
userEmailAlreadyRegistered: 'Корисник са датом имејл адресом је већ регистрован.',
userLocked: 'Овај корисник је закључан због превеликог броја неуспешних покушаја пријаве.',
usernameAlreadyRegistered: 'Korisnik sa datim korisničkim imenom je već registrovan.',
usernameOrPasswordIncorrect: 'Korisničko ime ili lozinka koje ste uneli su netačni.',
valueMustBeUnique: 'Вредност мора бити јединствена.',
verificationTokenInvalid: 'Верификациони токен је невалидан.',
},

View File

@@ -4,6 +4,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Nalog',
accountOfCurrentUser: 'Nalog trenutnog korisnika',
accountVerified: 'Nalog je uspešno verifikovan.',
alreadyActivated: 'Već aktivirano',
alreadyLoggedIn: 'Već prijavljen',
apiKey: 'API ključ',
@@ -25,6 +26,8 @@ export const rsLatinTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Molimo Vas da unesete svoj adresu e-pošte. Primićete poruku sa uputstvom za ponovno postavljanje lozinke.',
forgotPasswordQuestion: 'Zaboravljena lozinka?',
forgotPasswordUsernameInstructions:
'Molimo unesite vaše korisničko ime ispod. Instrukcije za resetovanje vaše lozinke biće poslate na email adresu povezanu sa vašim korisničkim imenom.',
generate: 'Generiši',
generateNewAPIKey: 'Generiši novi API ključ',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const rsLatinTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Uspešno otključano',
tokenRefreshSuccessful: 'Osvežavanje tokena je uspelo.',
unableToVerify: 'Nije moguće potvrditi',
username: 'Korisničko ime',
usernameNotValid: 'Uneseno korisničko ime nije validno.',
verified: 'Potvrđeno',
verifiedSuccessfully: 'Uspešno potvrđeno',
verify: 'Potvrdi',
@@ -112,6 +117,8 @@ export const rsLatinTranslations: DefaultTranslationsObject = {
unspecific: 'Došlo je do greške.',
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.',
usernameOrPasswordIncorrect: 'Korisničko ime ili lozinka koju ste uneli su netačni.',
valueMustBeUnique: 'Vrednost mora biti jedinstvena.',
verificationTokenInvalid: 'Verifikacioni token je nevalidan.',
},

View File

@@ -4,6 +4,7 @@ export const ruTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Аккаунт',
accountOfCurrentUser: 'Аккаунт текущего пользователя',
accountVerified: 'Учетная запись успешно подтверждена.',
alreadyActivated: 'Уже активирован',
alreadyLoggedIn: 'Уже вошли в систему',
apiKey: 'API ключ',
@@ -26,6 +27,8 @@ export const ruTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Пожалуйста, введите ваш email. Вы получите письмо с инструкцией по восстановлению пароля.',
forgotPasswordQuestion: 'Забыли пароль?',
forgotPasswordUsernameInstructions:
'Пожалуйста, введите ваше имя пользователя ниже. Инструкции по сбросу вашего пароля будут отправлены на адрес электронной почты, связанный с вашим именем пользователя.',
generate: 'Сгенерировать',
generateNewAPIKey: 'Сгенерировать новый API ключ',
generatingNewAPIKeyWillInvalidate:
@@ -62,6 +65,8 @@ export const ruTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Успешно разблокирован',
tokenRefreshSuccessful: 'Обновление токена прошло успешно.',
unableToVerify: 'Невозможно подтвердить',
username: 'Имя пользователя',
usernameNotValid: 'Предоставленное имя пользователя недействительно.',
verified: 'Подтверждено',
verifiedSuccessfully: 'Успешно подтверждено',
verify: 'Подтвердить',
@@ -114,6 +119,8 @@ export const ruTranslations: DefaultTranslationsObject = {
userEmailAlreadyRegistered: 'Пользователь с указанным email уже зарегистрирован.',
userLocked:
'Этот пользователь заблокирован из-за слишком большого количества неудачных попыток входа.',
usernameAlreadyRegistered: 'Пользователь с данным именем пользователя уже зарегистрирован.',
usernameOrPasswordIncorrect: 'Указанное имя пользователя или пароль неверны.',
valueMustBeUnique: 'Значение должно быть уникальным',
verificationTokenInvalid: 'Проверочный токен недействителен.',
},

View File

@@ -4,6 +4,7 @@ export const skTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Účet',
accountOfCurrentUser: 'Aktuálny používateľský účet',
accountVerified: 'Účet úspešne overený.',
alreadyActivated: 'Už aktivované',
alreadyLoggedIn: 'Už prihlásený',
apiKey: 'API kľúč',
@@ -26,6 +27,8 @@ export const skTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Zadajte svoj e-mail nižšie. Dostanete e-mail s pokynmi na obnovenie hesla.',
forgotPasswordQuestion: 'Zabudli ste heslo?',
forgotPasswordUsernameInstructions:
'Prosím, zadajte nižšie svoje používateľské meno. Inštrukcie na obnovenie vášho hesla budú odoslané na e-mailovú adresu spojenú s vaším používateľským menom.',
generate: 'Generovať',
generateNewAPIKey: 'Vygenerovať nový API kľúč',
generatingNewAPIKeyWillInvalidate:
@@ -62,6 +65,8 @@ export const skTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Úspešne odomknuté',
tokenRefreshSuccessful: 'Obnovenie tokenu bolo úspešné.',
unableToVerify: 'Nemožno overiť',
username: 'Používateľské meno',
usernameNotValid: 'Zadané užívateľské meno nie je platné.',
verified: 'Overené',
verifiedSuccessfully: 'Úspešne overené',
verify: 'Overiť',
@@ -114,6 +119,8 @@ export const skTranslations: DefaultTranslationsObject = {
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.',
usernameAlreadyRegistered: 'Používateľ s daným používateľským menom je už zaregistrovaný.',
usernameOrPasswordIncorrect: 'Zadané meno alebo heslo je nesprávne.',
valueMustBeUnique: 'Hodnota musí byť jedinečná',
verificationTokenInvalid: 'Overovací token je neplatný.',
},

View File

@@ -4,6 +4,7 @@ export const svTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Konto',
accountOfCurrentUser: 'Konto för nuvarande användare',
accountVerified: 'Kontot har verifierats framgångsrikt.',
alreadyActivated: 'Redan aktiverad',
alreadyLoggedIn: 'Redan inloggad',
apiKey: 'API Nyckel',
@@ -26,6 +27,8 @@ export const svTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Vänligen ange din e-postadress nedan. Du kommer att få ett e-postmeddelande med instruktioner om hur du återställer ditt lösenord.',
forgotPasswordQuestion: 'Glömt lösenordet?',
forgotPasswordUsernameInstructions:
'Ange ditt användarnamn nedan. Instruktioner om hur du återställer ditt lösenord kommer att skickas till mejladressen kopplad till ditt användarnamn.',
generate: 'Generera',
generateNewAPIKey: 'Generera ny API nyckel',
generatingNewAPIKeyWillInvalidate:
@@ -61,6 +64,8 @@ export const svTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Låst upp framgångsrikt',
tokenRefreshSuccessful: 'Tokenuppdatering lyckades.',
unableToVerify: 'Det går inte att Verifiera',
username: 'Användarnamn',
usernameNotValid: 'Det angivna användarnamnet är inte giltigt',
verified: 'Verifierad',
verifiedSuccessfully: 'Framgångsrikt Verifierad',
verify: 'Verifiera',
@@ -112,6 +117,8 @@ export const svTranslations: DefaultTranslationsObject = {
unspecific: 'Ett fel har uppstått.',
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.',
usernameOrPasswordIncorrect: 'Användarnamnet eller lösenordet som angavs är felaktigt.',
valueMustBeUnique: 'Värdet måste vara unikt',
verificationTokenInvalid: 'Verifieringstoken är ogiltig.',
},

View File

@@ -4,6 +4,7 @@ export const thTranslations: DefaultTranslationsObject = {
authentication: {
account: 'บัญชี',
accountOfCurrentUser: 'บัญชีปัจจุบัน',
accountVerified: 'ยืนยันบัญชีสำเร็จแล้ว',
alreadyActivated: 'เปิดใช้งานแล้ว',
alreadyLoggedIn: 'ลงชื่อเข้าใช้แล้ว',
apiKey: 'API Key',
@@ -26,6 +27,8 @@ export const thTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'กรุณาใส่อีเมลของคุณ ระบบจะส่งวิธีการเปลี่ยนรหัสผ่านไปให้คุณทางอีเมล',
forgotPasswordQuestion: 'ลืมรหัสผ่าน?',
forgotPasswordUsernameInstructions:
'กรุณากรอกชื่อผู้ใช้ของคุณที่ด้านล่าง คำแนะนำเกี่ยวกับวิธีการรีเซ็ตรหัสผ่านของคุณจะถูกส่งไปยังที่อยู่อีเมลที่เชื่อมโยงกับชื่อผู้ใช้ของคุณ',
generate: 'สร้าง',
generateNewAPIKey: 'สร้าง API Key',
generatingNewAPIKeyWillInvalidate:
@@ -60,6 +63,8 @@ export const thTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'ปลดล็อกบัญชีสำเร็จ',
tokenRefreshSuccessful: 'การรีเฟรชโทเค็นสำเร็จ',
unableToVerify: 'ไม่สามารถยืนยันบัญชีได้',
username: 'ชื่อผู้ใช้',
usernameNotValid: 'ชื่อผู้ใช้ที่ให้มาไม่ถูกต้อง',
verified: 'ยืนยันบััญชีแล้ว',
verifiedSuccessfully: 'ยืนยันบัญชีสำเร็จ',
verify: 'ยืนยันบัญชี',
@@ -110,6 +115,8 @@ export const thTranslations: DefaultTranslationsObject = {
unspecific: 'เกิดปัญหาบางอย่าง',
userEmailAlreadyRegistered: 'ผู้ใช้ที่มีอีเมลดังกล่าวได้ลงทะเบียนแล้ว',
userLocked: 'บัญชีนี้ถูกล็อกเนื่องจากมีการพยายามเข้าสู่ระบบมากเกินไป',
usernameAlreadyRegistered: 'ผู้ใช้ที่มีชื่อผู้ใช้ที่ระบุไว้แล้วถูกลงทะเบียนเอาไว้แล้ว',
usernameOrPasswordIncorrect: 'ชื่อผู้ใช้หรือรหัสผ่านที่คุณให้มาไม่ถูกต้อง',
valueMustBeUnique: 'ค่าต้องไม่ซ้ำกับเอกสารอื่น',
verificationTokenInvalid: 'Token ยืนยันตัวตนไม่ถูกต้อง',
},

View File

@@ -4,6 +4,7 @@ export const trTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Hesap',
accountOfCurrentUser: 'Şu anki kullanıcının hesabı',
accountVerified: 'Hesap başarıyla doğrulandı.',
alreadyActivated: 'Hesap zaten etkinleştirildi',
alreadyLoggedIn: 'Hesaba zaten giriş yapıldı',
apiKey: 'API Anahtarı',
@@ -26,6 +27,8 @@ export const trTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Lütfen e-posta adresinizi aşağıdaki alana girin. Parolanızı nasıl sıfırlayacağınızı gösteren bir e-posta adresi alacaksınız.',
forgotPasswordQuestion: 'Parolanızı mı unuttunuz?',
forgotPasswordUsernameInstructions:
'Lütfen kullanıcı adınızı aşağıya girin. Şifrenizi nasıl sıfırlayacağınıza dair talimatlar, kullanıcı adınızla ilişkilendirilmiş e-posta adresine gönderilecektir.',
generate: 'Oluştur',
generateNewAPIKey: 'Yeni bir API anahtarı oluştur',
generatingNewAPIKeyWillInvalidate:
@@ -62,6 +65,8 @@ export const trTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Hesabın kilidi başarıyla açıldı',
tokenRefreshSuccessful: 'Token yenileme başarılı.',
unableToVerify: 'Doğrulama başarısız',
username: 'Kullanıcı Adı',
usernameNotValid: 'Sağlanan kullanıcı adı geçerli değil.',
verified: 'Doğrulandı',
verifiedSuccessfully: 'Hesap başarıyla doğrulandı',
verify: 'Doğrula',
@@ -114,6 +119,8 @@ export const trTranslations: DefaultTranslationsObject = {
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.',
usernameAlreadyRegistered: 'Verilen kullanıcı adına sahip bir kullanıcı zaten kayıtlı.',
usernameOrPasswordIncorrect: 'Sağlanan kullanıcı adı veya şifre yanlış.',
valueMustBeUnique: 'Değer benzersiz olmalıdır',
verificationTokenInvalid: 'Doğrulama tokeni geçersiz.',
},

View File

@@ -4,6 +4,7 @@ export const ukTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Обліковий запис',
accountOfCurrentUser: 'Обліковий запис поточного користувача',
accountVerified: 'Рахунок успішно перевірено.',
alreadyActivated: 'Вже активований',
alreadyLoggedIn: 'Вже увійшли в систему',
apiKey: 'API ключ',
@@ -26,6 +27,8 @@ export const ukTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'Будь ласка, вкажіть адресу вашої електронної пошти нижче. Ви отримаєте лист на вашу електронну пошту з інструкціями щодо скидання пароля.',
forgotPasswordQuestion: 'Забули пароль?',
forgotPasswordUsernameInstructions:
"Будь ласка, введіть нижче своє ім'я користувача. Інструкції щодо скидання пароля буде відправлено на адресу електронної пошти, пов'язану з вашим ім'ям користувача.",
generate: 'Згенерувати',
generateNewAPIKey: 'Згенерувати новий API ключ',
generatingNewAPIKeyWillInvalidate:
@@ -62,6 +65,8 @@ export const ukTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Успішно розблоковано',
tokenRefreshSuccessful: 'Оновлення токену успішне.',
unableToVerify: 'Неможливо підтвердити',
username: "Ім'я користувача",
usernameNotValid: "Вказане ім'я користувача недійсне",
verified: 'Підтверджено',
verifiedSuccessfully: 'Успішно підтверджено',
verify: 'Підтвердити',
@@ -113,6 +118,8 @@ export const ukTranslations: DefaultTranslationsObject = {
unspecific: 'Виникла помилка.',
userEmailAlreadyRegistered: 'Користувач із вказаною електронною поштою вже зареєстрований.',
userLocked: 'Цей користувач заблокований через велику кількість невдалих спроб входу.',
usernameAlreadyRegistered: 'Користувач з вказаним іменем користувача вже зареєстрований.',
usernameOrPasswordIncorrect: "Введене ім'я користувача або пароль неправильні.",
valueMustBeUnique: 'Значення має бути унікальним.',
verificationTokenInvalid: 'Токен верифікації недійсний.',
},

View File

@@ -4,6 +4,7 @@ export const viTranslations: DefaultTranslationsObject = {
authentication: {
account: 'Tài khoản',
accountOfCurrentUser: 'Tài khoản của người dùng hiện tại',
accountVerified: 'Tài khoản đã được xác minh thành công.',
alreadyActivated: 'Đã được kích hoạt',
alreadyLoggedIn: 'Đã đăng nhập',
apiKey: 'API Key',
@@ -24,6 +25,8 @@ export const viTranslations: DefaultTranslationsObject = {
forgotPassword: 'Quên mật khẩu',
forgotPasswordEmailInstructions: 'Nhập email của bạn để nhận hướng dẫn tạo lại mật khẩu.',
forgotPasswordQuestion: 'Quên mật khẩu?',
forgotPasswordUsernameInstructions:
'Vui lòng nhập tên người dùng của bạn bên dưới. Hướng dẫn về cách đặt lại mật khẩu của bạn sẽ được gửi đến địa chỉ email liên kết với tên người dùng của bạn.',
generate: 'Tạo',
generateNewAPIKey: 'Tạo API Key mới',
generatingNewAPIKeyWillInvalidate:
@@ -60,6 +63,8 @@ export const viTranslations: DefaultTranslationsObject = {
successfullyUnlocked: 'Mở khóa thành công',
tokenRefreshSuccessful: 'Làm mới token thành công.',
unableToVerify: 'Không thể xác thực',
username: 'Tên đăng nhập',
usernameNotValid: 'Tên người dùng được cung cấp không hợp lệ',
verified: 'Đã xác thực',
verifiedSuccessfully: 'Đã xác thực thành công',
verify: 'Tiến hành xác thực',
@@ -111,6 +116,8 @@ export const viTranslations: DefaultTranslationsObject = {
unspecific: 'Lỗi - Đã xảy ra (unspecific error).',
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ý.',
usernameOrPasswordIncorrect: 'Tên người dùng hoặc mật khẩu được cung cấp không chính xác.',
valueMustBeUnique: 'Lỗi - Giá trị không được trùng lặp.',
verificationTokenInvalid: 'Lỗi - Token dùng để xác thực không hợp lệ.',
},

View File

@@ -4,6 +4,7 @@ export const zhTranslations: DefaultTranslationsObject = {
authentication: {
account: '帐户',
accountOfCurrentUser: '当前用户的帐户',
accountVerified: '帐户验证成功。',
alreadyActivated: '已经激活了',
alreadyLoggedIn: '已经登入了',
apiKey: 'API密钥',
@@ -25,6 +26,8 @@ export const zhTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'请在下方输入您的电子邮件。您将会收到一封有关如何重置密码说明的电子邮件。',
forgotPasswordQuestion: '忘记密码?',
forgotPasswordUsernameInstructions:
'请在下方输入您的用户名。密码重置的说明将发送到与您的用户名相关联的电子邮箱。',
generate: '生成',
generateNewAPIKey: '生成新的API密钥',
generatingNewAPIKeyWillInvalidate: '生成新的API密钥将使之前的密钥<1>失效</1>。您确定要继续吗?',
@@ -58,6 +61,8 @@ export const zhTranslations: DefaultTranslationsObject = {
successfullyUnlocked: '已成功解锁',
tokenRefreshSuccessful: '令牌刷新成功。',
unableToVerify: '无法验证',
username: '用户名',
usernameNotValid: '提供的用户名无效',
verified: '已验证',
verifiedSuccessfully: '成功验证',
verify: '验证',
@@ -107,6 +112,8 @@ export const zhTranslations: DefaultTranslationsObject = {
unspecific: '发生了一个错误。',
userEmailAlreadyRegistered: '给定电子邮件的用户已经注册。',
userLocked: '该用户由于有太多次失败的登录尝试而被锁定。',
usernameAlreadyRegistered: '已有用户使用了该用户名进行注册。',
usernameOrPasswordIncorrect: '提供的用户名或密码不正确。',
valueMustBeUnique: '值必须是唯一的',
verificationTokenInvalid: '验证令牌无效。',
},

View File

@@ -4,6 +4,7 @@ export const zhTwTranslations: DefaultTranslationsObject = {
authentication: {
account: '帳戶',
accountOfCurrentUser: '目前使用者的帳戶',
accountVerified: '帳戶驗證成功。',
alreadyActivated: '已經啟用了',
alreadyLoggedIn: '已經登入了',
apiKey: 'API金鑰',
@@ -25,6 +26,8 @@ export const zhTwTranslations: DefaultTranslationsObject = {
forgotPasswordEmailInstructions:
'請在下方輸入您的電子郵件。您將收到一封有關如何重設密碼的說明電子郵件。',
forgotPasswordQuestion: '忘記密碼?',
forgotPasswordUsernameInstructions:
'請在下方輸入您的使用者名稱。關於如何重設密碼的指示將會發送到與您的使用者名稱相關的電子郵件地址。',
generate: '生成',
generateNewAPIKey: '生成新的API金鑰',
generatingNewAPIKeyWillInvalidate: '生成新的API金鑰將使之前的金鑰<1>失效</1>。您確定要繼續嗎?',
@@ -58,6 +61,8 @@ export const zhTwTranslations: DefaultTranslationsObject = {
successfullyUnlocked: '已成功解鎖',
tokenRefreshSuccessful: '令牌刷新成功。',
unableToVerify: '無法驗證',
username: '使用者名稱',
usernameNotValid: '提供的使用者名稱無效',
verified: '已驗證',
verifiedSuccessfully: '成功驗證',
verify: '驗證',
@@ -107,6 +112,8 @@ export const zhTwTranslations: DefaultTranslationsObject = {
unspecific: '發生了一個錯誤。',
userEmailAlreadyRegistered: '給定電子郵件的用戶已經註冊。',
userLocked: '該使用者由於有太多次失敗的登錄嘗試而被鎖定。',
usernameAlreadyRegistered: '已有使用者使用所提供的用戶名註冊。',
usernameOrPasswordIncorrect: '提供的使用者名稱或密碼不正確。',
valueMustBeUnique: '數值必須是唯一的',
verificationTokenInvalid: '驗證令牌無效。',
},

View File

@@ -224,6 +224,7 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
body: JSON.stringify({
email: autoLogin.email,
password: autoLogin.password,
username: autoLogin.username,
}),
headers: {
'Accept-Language': i18n.language,

View File

@@ -7,6 +7,9 @@
*/
export interface Config {
auth: {
users: UserAuthOperations;
};
collections: {
posts: Post;
users: User;
@@ -21,6 +24,19 @@ export interface Config {
collection: 'users';
};
}
export interface UserAuthOperations {
forgotPassword: {
email: string;
};
login: {
password: string;
email: string;
};
registerFirstUser: {
email: string;
password: string;
};
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "posts".
@@ -123,6 +139,13 @@ export interface Menu {
updatedAt?: string | null;
createdAt?: string | null;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "auth".
*/
export interface Auth {
[k: string]: unknown;
}
declare module 'payload' {